PHP 시니어 기술면접
새 면접Q. PHP 애플리케이션에서 동시에 여러 사용자가 동일한 재고를 차감하는 상황에서 Race Condition이 발생할 수 있습니다. Optimistic Locking과 Pessimistic Locking의 차이점을 설명하고, 각각을 MySQL과 PHP에서 구현하는 방법과 트레이드오프를 실무 관점에서 설명해주세요. 또한 대규모 이커머스 시스템에서 어떤 방식을 선택할지 판단 기준을 제시해주세요.
Optimistic Locking은 버전 컬럼을 사용해 UPDATE 시점에 충돌을 감지하며, 충돌이 적을 때 유리하고 재시도 로직이 필요합니다. Pessimistic Locking은 SELECT FOR UPDATE로 행을 잠그며, 충돌이 많을 때 유리하지만 데드락 위험이 있습니다. 대규모 시스템에서는 재고 차감처럼 높은 동시성이 예상되는 경우 Pessimistic Locking을, 주문 상태 변경처럼 충돌이 적은 경우 Optimistic Locking을 선택합니다. 또한 Redis의 DECR 같은 원자적 연산을 활용하거나 메시지 큐로 순차 처리하는 방법도 고려할 수 있습니다.
- • Optimistic Locking: 버전 컬럼 사용, 충돌 시 재시도, 낮은 충돌률에 적합
- • Pessimistic Locking: SELECT FOR UPDATE, 트랜잭션 격리, 높은 충돌률에 적합
- • 트레이드오프: 성능 vs 일관성, 데드락 위험, 재시도 복잡도
- • 대안: Redis 원자적 연산, 메시지 큐 순차 처리, 이벤트 소싱
SELECT FOR UPDATE를 사용할 때 인덱스가 없는 컬럼으로 조회하면 어떤 문제가 발생하며, Gap Lock과 Next-Key Lock이 동시성에 미치는 영향은 무엇인가요?
Q. 대규모 PHP 애플리케이션에서 Cache Stampede(캐시 스탬피드) 문제가 발생하는 원인과 시스템에 미치는 영향을 설명하고, Probabilistic Early Expiration, Lock-based 방식, Stale-While-Revalidate 패턴 등 해결 방법을 비교해주세요. 또한 Redis를 사용하는 환경에서 각 방법을 구현하는 전략과 모니터링 방법을 설명해주세요.
Cache Stampede는 인기 있는 캐시가 만료될 때 동시에 여러 요청이 DB를 조회해 시스템 과부하를 일으키는 현상입니다. Probabilistic Early Expiration은 TTL 만료 전 확률적으로 미리 갱신하며 구현이 간단하지만 정확도가 떨어집니다. Lock-based 방식은 첫 요청만 DB 조회하고 나머지는 대기하며 정확하지만 대기 시간이 발생합니다. Stale-While-Revalidate는 만료된 캐시를 반환하면서 백그라운드로 갱신해 응답 속도가 빠르지만 일시적으로 오래된 데이터를 제공합니다. Redis의 SET NX로 락을 구현하거나, 별도 워커로 비동기 갱신을 처리하며, 캐시 히트율과 DB 쿼리 수를 모니터링합니다.
- • Cache Stampede: 동시 다발적 DB 조회로 인한 과부하
- • Probabilistic Early Expiration: TTL 기반 확률적 갱신
- • Lock-based: Redis SETNX로 첫 요청만 갱신, 나머지 대기
- • Stale-While-Revalidate: 만료 데이터 반환 + 백그라운드 갱신
- • 모니터링: 캐시 히트율, DB 쿼리 스파이크, 락 대기 시간
Redis Cluster 환경에서 캐시 워밍업 전략을 구현할 때 고려해야 할 사항과 슬롯 기반 샤딩이 캐시 분산에 미치는 영향은 무엇인가요?
Q. MySQL의 Master-Slave 복제 구조에서 Replication Lag이 발생하는 원인과 이것이 PHP 애플리케이션에 미치는 영향을 설명해주세요. 또한 Read-After-Write Consistency를 보장하기 위한 전략(세션 기반 라우팅, GTID 활용, 임계 쿼리 마스터 라우팅)과 각 방법의 장단점을 실무 관점에서 설명해주세요.
Replication Lag은 마스터의 변경사항이 슬레이브에 반영되는 시간 차이로, 대용량 트랜잭션이나 네트워크 지연이 원인입니다. PHP 애플리케이션에서 사용자가 데이터를 등록한 직후 조회 시 슬레이브에서 읽으면 데이터가 보이지 않는 문제가 발생합니다. 세션 기반 라우팅은 쓰기 후 일정 시간 마스터에서 읽어 간단하지만 마스터 부하가 증가합니다. GTID를 활용하면 슬레이브가 특정 트랜잭션까지 복제됐는지 확인 후 읽어 정확하지만 구현이 복잡합니다. 임계 쿼리만 마스터로 라우팅하면 균형적이지만 쿼리 분류 로직이 필요합니다. 실무에서는 미들웨어나 프록시(ProxySQL)를 활용해 자동 라우팅을 구현합니다.
- • Replication Lag: 마스터-슬레이브 간 데이터 동기화 지연
- • Read-After-Write 문제: 쓰기 직후 읽기 시 데이터 미반영
- • 세션 기반 라우팅: 쓰기 후 N초간 마스터 읽기, 구현 간단
- • GTID 활용: 슬레이브 복제 위치 확인 후 읽기, 정확하지만 복잡
- • 임계 쿼리 라우팅: 중요 쿼리만 마스터, 균형적 접근
- • ProxySQL 같은 프록시로 자동화
Semi-Synchronous Replication과 Asynchronous Replication의 차이점과 각각이 성능과 데이터 일관성에 미치는 영향, 그리고 Group Replication의 장점은 무엇인가요?
Q. PHP 기반 모놀리식 애플리케이션을 마이크로서비스로 전환할 때 서비스 경계를 나누는 기준(Domain-Driven Design의 Bounded Context, 데이터 독립성, 팀 구조)을 설명하고, 전환 과정에서 발생하는 분산 트랜잭션 문제를 Saga 패턴으로 해결하는 방법을 설명해주세요. 또한 Choreography 방식과 Orchestration 방식의 차이점과 선택 기준을 제시해주세요.
서비스 경계는 DDD의 Bounded Context를 기준으로 비즈니스 도메인별로 나누며, 각 서비스가 독립적인 데이터베이스를 가져야 합니다. 팀 구조도 고려해 Conway's Law에 따라 조직 구조와 일치시킵니다. 분산 트랜잭션은 Saga 패턴으로 해결하는데, Choreography 방식은 각 서비스가 이벤트를 발행하고 구독해 자율적으로 동작하며 결합도가 낮지만 흐름 파악이 어렵습니다. Orchestration 방식은 중앙 조정자가 순서를 제어해 흐름이 명확하지만 조정자가 단일 장애점이 됩니다. 비즈니스 로직이 단순하면 Choreography, 복잡한 보상 트랜잭션이 필요하면 Orchestration을 선택합니다.
- • 서비스 경계: Bounded Context, 데이터 독립성, 팀 구조 기준
- • Saga 패턴: 분산 트랜잭션을 여러 로컬 트랜잭션으로 분할
- • Choreography: 이벤트 기반 자율 동작, 낮은 결합도, 흐름 파악 어려움
- • Orchestration: 중앙 조정자, 명확한 흐름, 단일 장애점
- • 선택 기준: 복잡도, 보상 트랜잭션 필요성, 팀 역량
마이크로서비스 환경에서 API Gateway와 Service Mesh의 역할 차이는 무엇이며, Circuit Breaker 패턴을 PHP에서 구현할 때 고려해야 할 사항은 무엇인가요?
Q. PHP 애플리케이션에서 Full-Text Search를 구현할 때 MySQL의 Full-Text Index와 Elasticsearch의 차이점을 비교하고, 각각의 적합한 사용 사례를 설명해주세요. 또한 Elasticsearch를 도입할 때 데이터 동기화 전략(Change Data Capture, Dual Write, Event-Driven)과 검색 결과의 Relevance Scoring을 개선하는 방법을 실무 관점에서 설명해주세요.
MySQL Full-Text Index는 간단한 키워드 검색에 적합하며 별도 인프라가 불필요하지만, 한글 형태소 분석이 약하고 복잡한 쿼리 성능이 제한적입니다. Elasticsearch는 강력한 분석기와 스코어링을 제공하며 대용량 검색에 최적화되어 있지만 운영 복잡도가 높고 데이터 동기화가 필요합니다. 동기화는 CDC(Debezium)로 DB 변경을 캡처하거나, 애플리케이션에서 Dual Write하거나, 이벤트 기반으로 비동기 처리합니다. Relevance Scoring은 필드별 가중치 조정, 사용자 행동 기반 부스팅, 동의어 사전 구축으로 개선합니다. 수백만 건 이하는 MySQL, 그 이상이거나 복잡한 분석이 필요하면 Elasticsearch를 선택합니다.
- • MySQL Full-Text: 간단한 검색, 인프라 불필요, 한글 분석 약함
- • Elasticsearch: 강력한 분석, 대용량 처리, 운영 복잡
- • 동기화: CDC(Debezium), Dual Write, Event-Driven
- • Relevance 개선: 필드 가중치, 사용자 행동 부스팅, 동의어
- • 선택 기준: 데이터 규모, 검색 복잡도, 운영 역량
Elasticsearch에서 인덱스 샤드 개수를 결정하는 기준과 Rebalancing 전략, 그리고 검색 성능 저하 시 프로파일링하는 방법은 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!