Spring 시니어 프레임워크 심화 면접
새 면접Q. Spring ApplicationContext의 계층 구조(Hierarchical Context)를 설계할 때 고려해야 할 사항들을 설명해주세요. 특히 부모-자식 컨텍스트 간 빈 참조 규칙, 이벤트 전파 방식, 그리고 멀티 모듈 프로젝트에서 컨텍스트 격리가 필요한 시나리오를 포함해 설명해주세요.
ApplicationContext 계층 구조에서 자식 컨텍스트는 부모의 빈을 참조할 수 있지만 반대는 불가능합니다. 이벤트는 기본적으로 현재 컨텍스트에만 발행되지만, ApplicationEvent를 사용하면 부모로 전파시킬 수 있습니다. 멀티 테넌트 환경이나 플러그인 아키텍처에서는 각 테넌트나 플러그인마다 독립적인 자식 컨텍스트를 생성하여 빈 격리와 독립적인 라이프사이클 관리를 구현할 수 있습니다. 공통 인프라 빈은 부모 컨텍스트에, 테넌트 특화 빈은 자식 컨텍스트에 배치하여 메모리 효율성과 격리를 동시에 달성합니다.
- • 자식은 부모 빈 참조 가능, 역방향 불가
- • 이벤트 전파 메커니즘과 제어 방법
- • 멀티 테넌트/플러그인 아키텍처에서 컨텍스트 격리 전략
- • 공통 빈과 특화 빈의 배치 전략
Spring Cloud에서 Refresh Scope를 사용할 때 컨텍스트 계층 구조가 어떻게 영향을 미치는지, 그리고 동적으로 자식 컨텍스트를 생성/제거할 때 메모리 누수를 방지하는 방법을 설명해주세요.
Q. Spring AOP에서 AspectJ 위빙 방식(CTW, LTW, Compile-time)과 Spring Proxy 기반 AOP의 차이점을 설명하고, 각각의 성능 특성과 제약사항을 비교해주세요. 또한 대규모 시스템에서 AOP 성능 최적화를 위해 적용했던 전략이 있다면 설명해주세요.
Spring Proxy 기반 AOP는 런타임에 JDK Dynamic Proxy나 CGLIB을 사용하여 프록시 객체를 생성하므로 인터페이스 또는 클래스 기반 프록시만 가능하고 private 메서드나 final 클래스는 적용할 수 없습니다. AspectJ CTW는 컴파일 시점에, LTW는 클래스 로딩 시점에 바이트코드를 직접 조작하므로 모든 메서드에 적용 가능하며 성능 오버헤드가 적습니다. 대규모 시스템에서는 핫스팟 메서드에만 선택적으로 Aspect를 적용하고, pointcut 표현식을 최적화하며, @Around 대신 @Before나 @After를 사용하여 프록시 체인을 단순화하는 전략을 사용합니다. 또한 AspectJ LTW를 도입하여 프록시 생성 비용을 줄이고 메서드 호출 성능을 개선할 수 있습니다.
- • Proxy 기반 AOP의 제약사항(인터페이스, self-invocation)
- • AspectJ 위빙 방식별 특징과 성능
- • pointcut 표현식 최적화 전략
- • Advice 타입 선택에 따른 성능 차이
Spring AOP에서 @Around Advice를 사용할 때 ProceedingJoinPoint.proceed()를 여러 번 호출하는 시나리오와 주의사항을 설명하고, 이를 활용한 재시도 로직 구현 시 고려해야 할 트랜잭션 처리 방안을 말씀해주세요.
Q. Spring Data JPA에서 N+1 문제를 해결하기 위한 여러 전략(Fetch Join, Entity Graph, Batch Size, Query Projection)의 차이점과 각각의 적용 시나리오를 설명해주세요. 특히 복잡한 연관 관계에서 카테시안 곱 문제와 MultipleBagFetchException을 어떻게 해결하는지 포함해주세요.
Fetch Join은 JPQL로 명시적으로 연관 엔티티를 조인하여 한 번에 가져오지만 페이징 시 메모리에서 처리되고 여러 컬렉션 조인 시 카테시안 곱이 발생합니다. Entity Graph는 동적으로 페치 전략을 변경할 수 있지만 역시 MultipleBagFetchException 문제가 있습니다. Batch Size는 IN 절을 사용해 N+1을 N/batch_size+1로 줄이며 카테시안 곱 없이 안전하게 사용 가능합니다. DTO Projection은 필요한 컬럼만 조회하여 성능이 가장 좋지만 엔티티 기능을 사용할 수 없습니다. MultipleBagFetchException은 여러 컬렉션을 동시에 Fetch Join할 때 발생하므로, 하나는 Fetch Join하고 나머지는 Batch Size로 처리하거나, 쿼리를 분리하거나, Set을 사용하여 해결합니다.
- • 각 전략의 동작 원리와 장단점
- • 카테시안 곱 발생 조건과 회피 방법
- • MultipleBagFetchException 해결 전략
- • 페이징과 Fetch Join의 호환성 문제
QueryDSL과 Blaze-Persistence를 사용하여 복잡한 동적 쿼리와 페이징을 구현할 때, Entity Graph를 대체할 수 있는 고급 페칭 전략을 설명하고, 읽기 전용 쿼리 최적화를 위한 @QueryHints 활용 방안을 말씀해주세요.
Q. Spring Batch에서 대용량 데이터 처리 시 청크 지향 처리(Chunk-Oriented Processing)와 파티셔닝(Partitioning), 그리고 멀티 스레드 Step의 차이점을 설명하고, 각각의 트랜잭션 경계와 실패 복구 전략을 비교해주세요. 특히 ItemReader의 Thread-Safety 보장 방법도 포함해주세요.
청크 지향 처리는 설정된 commit-interval마다 트랜잭션을 커밋하여 메모리 효율적이며 실패 시 마지막 청크부터 재시작 가능합니다. 멀티 스레드 Step은 여러 스레드가 동일한 Step을 병렬 실행하여 처리 속도를 높이지만 ItemReader가 Thread-Safe해야 하며, 일반적으로 SynchronizedItemStreamReader로 래핑하거나 파티셔닝을 사용합니다. 파티셔닝은 데이터를 논리적으로 분할하여 각 파티션을 독립적인 Step으로 실행하므로 Thread-Safety 문제가 없고 실패한 파티션만 재실행 가능합니다. 트랜잭션 경계는 청크와 멀티 스레드는 청크 단위, 파티셔닝은 각 파티션의 청크 단위로 관리됩니다. 대용량 데이터는 파티셔닝과 청크 처리를 조합하여 확장성과 안정성을 동시에 확보하는 것이 효과적입니다.
- • 청크 처리의 트랜잭션 경계와 재시작 메커니즘
- • 멀티 스레드 Step의 Thread-Safety 문제
- • 파티셔닝의 독립적 실행과 실패 복구
- • 각 방식의 성능 특성과 적용 시나리오
Spring Batch에서 Skip Policy와 Retry Policy를 조합하여 일시적 오류와 영구적 오류를 구분 처리하는 전략을 설명하고, JobRepository의 메타데이터 테이블이 병목이 될 때 적용할 수 있는 최적화 방안을 말씀해주세요.
Q. Spring Integration의 메시징 채널 타입(Direct, Queue, Publish-Subscribe, Priority)과 각각의 특징을 설명하고, 비동기 메시지 처리 시 발생할 수 있는 메시지 순서 보장 문제와 에러 핸들링 전략을 설명해주세요. 특히 트랜잭션 경계와 메시지 재처리 메커니즘을 포함해주세요.
DirectChannel은 호출 스레드에서 동기적으로 메시지를 전달하여 순서가 보장되고 트랜잭션이 유지되지만 확장성이 제한됩니다. QueueChannel은 비동기로 메시지를 큐에 저장하고 별도 스레드가 처리하여 확장성이 좋지만 순서 보장이 어렵고 트랜잭션이 분리됩니다. PublishSubscribeChannel은 여러 구독자에게 동시에 메시지를 전달하며, PriorityChannel은 우선순위에 따라 메시지를 처리합니다. 비동기 채널에서 순서를 보장하려면 단일 컨슈머를 사용하거나 파티셔닝 키로 메시지를 분산해야 합니다. 에러 핸들링은 ErrorChannel과 RetryTemplate을 조합하고, 실패한 메시지는 Dead Letter Channel로 라우팅하여 별도 처리합니다. 트랜잭션 경계는 채널 앞뒤로 TransactionInterceptor를 배치하여 관리하며, 메시지 재처리는 MessageStore를 사용해 멱등성을 보장합니다.
- • 각 채널 타입의 동기/비동기 특성과 트랜잭션 경계
- • 비동기 환경에서 메시지 순서 보장 전략
- • ErrorChannel과 Dead Letter Channel 패턴
- • 멱등성 보장을 위한 MessageStore 활용
Spring Integration과 Apache Kafka를 통합할 때, Kafka의 파티션과 Spring Integration의 채널을 매핑하는 전략을 설명하고, Exactly-Once Semantics를 보장하기 위한 트랜잭션 아웃박스 패턴 구현 방안을 말씀해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!