Laravel 미드레벨 시스템 설계 면접

Laravel 미드레벨 (3~7년) 시스템 설계 5문항 조회수 90 · 2026-08-01 (토) 19:11:03
1 Database Sharding & Partitioning
Hard

Q. Laravel 애플리케이션에서 사용자 테이블이 1억 건 이상으로 증가하여 단일 데이터베이스로 처리하기 어려운 상황입니다. Horizontal Sharding과 Vertical Partitioning의 차이점을 설명하고, Laravel에서 다중 데이터베이스 연결을 활용한 Sharding 전략을 구현하는 방법을 제시해주세요. 특히 Shard Key 선택 기준, 크로스 샤드 쿼리 처리 방법, 그리고 샤드 리밸런싱 시 고려사항을 포함하여 설명해주세요.

A. 모범답안

Horizontal Sharding은 동일한 스키마의 데이터를 여러 서버에 행 단위로 분산하는 것이고, Vertical Partitioning은 테이블의 컬럼을 기준으로 분리하는 것입니다. Laravel에서는 config/database.php에 여러 연결을 정의하고, Shard Key(예: user_id % shard_count)를 기반으로 동적으로 연결을 선택합니다. 크로스 샤드 쿼리는 애플리케이션 레벨에서 병렬 처리 후 머지하거나, 글로벌 테이블을 별도로 유지합니다. Shard Key는 균등 분산과 쿼리 패턴을 고려하여 선택하며, 리밸런싱 시에는 일관성 있는 해싱(Consistent Hashing)을 사용하거나 더블 라이팅 전략을 통해 무중단 마이그레이션을 수행합니다.

핵심 포인트
  • • Horizontal Sharding은 행 단위 분산, Vertical Partitioning은 컬럼 단위 분리
  • • Laravel 다중 DB 연결과 Shard Key 기반 동적 연결 선택 구현
  • • 크로스 샤드 쿼리는 애플리케이션 레벨 병렬 처리 또는 글로벌 테이블 활용
  • • Consistent Hashing과 더블 라이팅을 통한 무중단 리밸런싱
Follow-up 질문

샤딩된 환경에서 AUTO_INCREMENT ID 대신 분산 ID 생성 전략(Snowflake, UUID, ULID)이 필요한 이유와 각각의 장단점을 비교해주세요.

2 Message Queue & Event-Driven Architecture
Hard

Q. Laravel 애플리케이션에서 주문 처리 시스템을 Event-Driven Architecture로 전환하려고 합니다. Laravel Queue와 RabbitMQ/Kafka 같은 메시지 브로커의 차이점을 설명하고, 각각의 적합한 사용 사례를 제시해주세요. 또한 At-least-once, At-most-once, Exactly-once 전달 보장의 차이점과, Laravel에서 멱등성(Idempotency)을 보장하는 Job 설계 방법을 설명해주세요.

A. 모범답안

Laravel Queue는 간단한 비동기 작업 처리에 적합하며 Redis/Database 기반으로 동작하지만, RabbitMQ/Kafka는 메시지 라우팅, 파티셔닝, 영속성 보장이 강력한 전문 메시지 브로커입니다. At-least-once는 재시도로 인한 중복 가능, At-most-once는 전달 실패 가능, Exactly-once는 정확히 한 번 처리를 보장합니다. Laravel에서 멱등성은 고유 식별자(UUID)를 사용한 중복 처리 검증, 데이터베이스 유니크 제약조건 활용, 또는 Redis를 이용한 처리 이력 추적으로 구현합니다. Job 내에서 상태를 확인하고 이미 처리된 작업은 스킵하도록 설계합니다.

핵심 포인트
  • • Laravel Queue는 간단한 비동기 처리, 메시지 브로커는 복잡한 이벤트 스트리밍과 분산 시스템에 적합
  • • At-least-once는 중복 가능, At-most-once는 유실 가능, Exactly-once는 정확한 처리 보장
  • • 멱등성은 UUID 기반 중복 검증, DB 제약조건, Redis 처리 이력으로 구현
  • • Job 설계 시 상태 확인 로직을 포함하여 재시도에도 안전하게 동작하도록 구성
Follow-up 질문

Saga 패턴을 사용한 분산 트랜잭션 관리에서 보상 트랜잭션(Compensating Transaction)의 개념과 Laravel에서의 구현 방법을 설명해주세요.

3 API Gateway & BFF Pattern
Medium

Q. 마이크로서비스 아키텍처 환경에서 Laravel로 API Gateway 또는 BFF(Backend For Frontend) 패턴을 구현해야 합니다. 두 패턴의 차이점과 각각의 목적을 설명하고, Laravel에서 HTTP Client를 활용하여 여러 마이크로서비스를 조합하는 구현 방법을 제시해주세요. 특히 서비스 간 통신 실패 처리, Circuit Breaker 패턴, 그리고 응답 시간 최적화를 위한 병렬 요청 처리 전략을 포함해주세요.

A. 모범답안

API Gateway는 모든 클라이언트의 단일 진입점으로 라우팅, 인증, Rate Limiting 등을 담당하고, BFF는 클라이언트 유형별(웹, 모바일)로 최적화된 API를 제공하는 패턴입니다. Laravel에서는 HTTP Client의 pool() 메서드로 병렬 요청을 처리하고, timeout과 retry 옵션으로 장애 대응을 설정합니다. Circuit Breaker는 Redis를 이용해 실패 카운트를 추적하고 임계값 초과 시 빠른 실패(Fail Fast)를 반환하도록 구현합니다. 응답 시간 최적화는 필요한 서비스만 호출하고, 캐싱을 적극 활용하며, 타임아웃을 짧게 설정하여 전체 시스템의 응답성을 보장합니다.

핵심 포인트
  • • API Gateway는 단일 진입점, BFF는 클라이언트별 최적화 API 제공
  • • Laravel HTTP Client의 pool()로 병렬 요청, timeout/retry로 장애 대응
  • • Circuit Breaker는 Redis 기반 실패 추적과 Fail Fast 구현
  • • 캐싱과 선택적 서비스 호출로 응답 시간 최적화
Follow-up 질문

Service Mesh(Istio, Linkerd)를 도입하면 애플리케이션 레벨의 Circuit Breaker나 Retry 로직이 불필요해지는 이유와 트레이드오프를 설명해주세요.

4 Database Read Replica & Query Routing
Medium

Q. Laravel 애플리케이션에서 읽기 부하가 증가하여 MySQL Read Replica를 도입하려고 합니다. Laravel의 read/write 연결 설정 방법과 동작 원리를 설명하고, Replication Lag로 인한 데이터 불일치 문제를 해결하기 위한 전략을 제시해주세요. 또한 트랜잭션 내에서는 항상 Master DB를 사용해야 하는 이유와, 특정 쿼리를 강제로 Master로 라우팅해야 하는 상황을 설명해주세요.

A. 모범답안

Laravel에서는 config/database.php에서 read와 write 배열을 분리하여 설정하면, SELECT 쿼리는 자동으로 Read Replica로, INSERT/UPDATE/DELETE는 Master로 라우팅됩니다. Replication Lag 문제는 쓰기 직후 읽기가 필요한 경우 DB::connection()->useWriteConnection()으로 Master를 명시하거나, Sticky Session을 구현하여 일정 시간 동안 같은 연결을 유지합니다. 트랜잭션 내에서는 일관성 보장을 위해 모든 쿼리가 Master로 전송되며, 이는 Laravel이 자동으로 처리합니다. 중요한 정합성이 필요한 쿼리(결제, 재고 확인 등)는 명시적으로 Master를 사용하도록 설정해야 합니다.

핵심 포인트
  • • read/write 배열 분리 설정으로 자동 쿼리 라우팅
  • • Replication Lag는 useWriteConnection()이나 Sticky Session으로 해결
  • • 트랜잭션 내에서는 일관성 보장을 위해 자동으로 Master 사용
  • • 정합성이 중요한 쿼리는 명시적으로 Master 라우팅
Follow-up 질문

Multi-Master Replication과 Master-Slave Replication의 차이점, 그리고 각각에서 발생할 수 있는 Write Conflict 해결 방법을 설명해주세요.

5 GraphQL API Design
Medium

Q. Laravel 프로젝트에서 REST API 대신 GraphQL API를 도입하려고 합니다. GraphQL의 주요 장점인 Over-fetching과 Under-fetching 해결 방법을 설명하고, Laravel에서 Lighthouse 또는 Rebing GraphQL 패키지를 사용할 때 N+1 쿼리 문제를 해결하는 방법을 제시해주세요. 또한 GraphQL의 단점인 캐싱 복잡도와 쿼리 복잡도 제어(Query Complexity, Depth Limiting) 전략도 함께 설명해주세요.

A. 모범답안

GraphQL은 클라이언트가 필요한 필드만 요청하여 Over-fetching(불필요한 데이터 전송)과 Under-fetching(여러 요청 필요)을 해결합니다. Laravel Lighthouse에서는 @with 디렉티브나 BatchLoader를 사용하여 Eager Loading을 자동화하고 N+1 문제를 방지합니다. 캐싱은 쿼리 결과가 동적이므로 복잡하며, Persisted Queries나 필드 레벨 캐싱을 사용합니다. 쿼리 복잡도는 Query Complexity 점수 계산으로 제한하고, Max Depth 설정으로 중첩 깊이를 제어하며, Timeout을 설정하여 과도한 쿼리를 차단합니다.

핵심 포인트
  • • GraphQL은 클라이언트 맞춤 데이터 요청으로 Over/Under-fetching 해결
  • • Lighthouse의 @with 디렉티브와 BatchLoader로 N+1 방지
  • • Persisted Queries와 필드 레벨 캐싱으로 캐싱 복잡도 해결
  • • Query Complexity, Max Depth, Timeout으로 쿼리 복잡도 제어
Follow-up 질문

GraphQL Subscription을 사용한 실시간 데이터 푸시 구현 시 Laravel WebSocket이나 Pusher와의 통합 방법과 확장성 고려사항을 설명해주세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!