Spring 미드레벨 시스템 설계 면접
새 면접Q. 대용량 트래픽을 처리하는 전자상거래 시스템에서 주문 API를 설계한다고 가정합니다. 동시에 여러 사용자가 같은 상품을 주문할 때 재고 차감의 정합성을 보장하기 위한 방법들을 비교 설명하고, 각 방법의 트레이드오프를 실무 관점에서 설명해주세요.
재고 정합성 보장 방법으로는 비관적 락(Pessimistic Lock), 낙관적 락(Optimistic Lock), 분산 락(Redis/Zookeeper), DB 제약조건 활용이 있습니다. 비관적 락은 데드락 위험이 있지만 정합성이 강력하고, 낙관적 락은 충돌 시 재시도 로직이 필요하지만 성능이 우수합니다. 분산 락은 다중 서버 환경에서 효과적이지만 별도 인프라가 필요하며, DB 제약조건은 가장 단순하지만 유연성이 떨어집니다. 실무에서는 트래픽 규모, 충돌 빈도, 인프라 환경을 고려하여 낙관적 락과 재시도 로직을 우선 적용하고, 필요시 Redis 분산 락으로 전환하는 것을 권장합니다.
- • 비관적 락, 낙관적 락, 분산 락의 동작 원리와 차이점
- • 각 방법의 성능과 정합성 트레이드오프
- • 실무에서의 선택 기준과 하이브리드 접근법
- • 동시성 제어와 데드락 회피 전략
낙관적 락 사용 시 충돌이 빈번하게 발생한다면 어떤 방식으로 시스템을 개선하시겠습니까? 재시도 횟수 제한, 백오프 전략, 락 방식 전환 등의 관점에서 설명해주세요.
Q. 소셜 미디어 서비스에서 사용자 간 팔로우/팔로워 관계를 관리하는 시스템을 설계할 때, 단방향 테이블 설계와 양방향 테이블 설계의 장단점을 비교하고, 팔로워 수가 수백만 명인 인플루언서 계정의 타임라인 조회 성능을 최적화하기 위한 DB 모델링 및 캐싱 전략을 설명해주세요.
단방향 테이블(follower_id, following_id)은 저장 공간이 효율적이지만 양방향 조회 시 인덱스가 2개 필요하고, 양방향 테이블은 팔로우/팔로워를 각각 저장해 조회는 빠르지만 데이터 중복과 정합성 관리가 필요합니다. 인플루언서의 경우 Fan-out on Write 방식으로 게시물 작성 시 모든 팔로워 타임라인에 미리 쓰기하면 읽기 성능은 좋지만 쓰기 부하가 크므로, Fan-out on Read 방식으로 조회 시점에 병합하거나, 하이브리드 방식으로 일반 사용자는 Write, 인플루언서는 Read 방식을 적용합니다. Redis Sorted Set으로 타임라인을 캐싱하고 TTL을 설정하며, 팔로워 수 임계값 기준으로 전략을 분기하는 것이 효과적입니다.
- • 단방향/양방향 테이블 설계의 트레이드오프
- • Fan-out on Write vs Read 패턴의 차이와 적용 시나리오
- • 인플루언서와 일반 사용자를 구분한 하이브리드 전략
- • Redis Sorted Set 활용 캐싱 및 TTL 관리
팔로워가 1000만 명인 계정이 게시물을 작성했을 때, Fan-out on Write 방식을 사용한다면 어떤 문제가 발생할 수 있으며, 이를 해결하기 위한 비동기 처리 및 배치 전략을 구체적으로 설명해주세요.
Q. Spring 애플리케이션에서 Redis를 캐시로 사용할 때 발생할 수 있는 Cache Stampede(캐시 스탬피드) 문제가 무엇인지 설명하고, 이를 해결하기 위한 방법들(Lock 기반, 확률적 조기 만료, 캐시 워밍 등)을 비교하여 설명해주세요.
Cache Stampede는 인기 있는 캐시 키가 만료되는 순간 동시에 대량의 요청이 DB로 몰려 부하가 급증하는 현상입니다. 해결 방법으로는 첫째, 분산 락(Redis SETNX)으로 첫 요청만 DB 조회하고 나머지는 대기시키는 방법이 있으며 응답 지연이 발생할 수 있습니다. 둘째, 확률적 조기 만료(Probabilistic Early Expiration)는 TTL이 임박하면 일정 확률로 미리 갱신해 만료 시점을 분산시킵니다. 셋째, 캐시 워밍은 서버 시작 시나 배치로 미리 캐시를 적재하며, 넷째, 스태일 캐시 허용은 만료된 캐시를 일시적으로 제공하면서 백그라운드에서 갱신합니다. 실무에서는 분산 락과 확률적 조기 만료를 조합하여 사용하는 것이 효과적입니다.
- • Cache Stampede 발생 원인과 시스템 영향
- • 분산 락 기반 해결법과 응답 지연 트레이드오프
- • 확률적 조기 만료와 캐시 워밍 전략
- • 스태일 캐시 허용 및 백그라운드 갱신 패턴
Spring Cache Abstraction(@Cacheable)을 사용할 때 Cache Stampede를 방지하기 위해 sync 속성을 true로 설정하는 방법이 있습니다. 이 방식의 동작 원리와 제약사항, 그리고 다중 서버 환경에서의 한계를 설명해주세요.
Q. MSA 환경에서 여러 마이크로서비스를 조합하여 응답해야 하는 BFF(Backend For Frontend) 패턴의 API를 설계할 때, 각 서비스 호출의 실패 처리 전략(Circuit Breaker, Fallback, Timeout)과 부분 실패 시 응답 정책을 설명하고, Spring Cloud의 Resilience4j를 활용한 구현 방안을 설명해주세요.
BFF 패턴에서는 여러 서비스 호출 중 일부가 실패해도 전체 응답을 제공해야 하므로, Circuit Breaker로 연속 실패 시 즉시 차단하여 연쇄 장애를 방지하고, Fallback으로 기본값이나 캐시된 데이터를 반환하며, Timeout으로 응답 지연을 제한합니다. 부분 실패 시에는 필수 데이터와 선택 데이터를 구분하여 필수 실패 시 에러, 선택 실패 시 null 또는 기본값으로 응답하는 정책이 필요합니다. Resilience4j의 @CircuitBreaker, @Retry, @TimeLimiter 애노테이션을 조합하고, CompletableFuture로 병렬 호출하며, 각 서비스별 Circuit Breaker를 독립적으로 설정하여 격리합니다. 모니터링을 위해 Actuator와 Prometheus 메트릭을 통합하여 Circuit 상태를 추적합니다.
- • Circuit Breaker, Fallback, Timeout의 역할과 조합
- • 필수/선택 데이터 구분을 통한 부분 실패 처리
- • Resilience4j 애노테이션 기반 구현 및 병렬 처리
- • 서비스별 Circuit 격리 및 모니터링 전략
Circuit Breaker의 Half-Open 상태에서 요청을 점진적으로 허용하는 전략과, 서비스 복구 시 트래픽을 안전하게 증가시키기 위한 Rate Limiter 연동 방안을 설명해주세요.
Q. JWT 기반 인증 시스템에서 Access Token과 Refresh Token을 사용하는 이유와 각각의 적절한 만료 시간 설정 기준을 설명하고, Refresh Token Rotation 전략과 탈취 시 보안 위험을 최소화하기 위한 방법들을 실무 관점에서 설명해주세요.
Access Token은 짧은 만료 시간(15~30분)으로 탈취 위험을 최소화하고, Refresh Token은 긴 만료 시간(2주~1개월)으로 사용자 편의성을 제공하며 DB나 Redis에 저장하여 무효화 가능하게 합니다. Refresh Token Rotation은 토큰 갱신 시마다 새로운 Refresh Token을 발급하고 이전 것을 무효화하여, 재사용 탐지 시 모든 토큰을 폐기하는 방식으로 탈취를 방어합니다. 추가 보안 방법으로는 Refresh Token을 HttpOnly, Secure, SameSite 쿠키로 저장하고, IP 주소나 User-Agent를 바인딩하며, 이상 패턴 감지 시 재인증을 요구하고, Redis에 블랙리스트를 관리하여 즉시 무효화합니다.
- • Access Token과 Refresh Token의 역할 분리 및 만료 시간 전략
- • Refresh Token Rotation과 재사용 탐지 메커니즘
- • HttpOnly 쿠키 저장 및 추가 바인딩 정보 활용
- • 블랙리스트 관리 및 이상 패턴 감지를 통한 보안 강화
Refresh Token을 Redis에 저장할 때 Key-Value 구조 설계 방안과, 사용자가 여러 디바이스에서 로그인한 경우 각 디바이스별 토큰을 관리하는 전략을 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!