Java 미드레벨 종합 기술면접

Java 미드레벨 (3~7년) 종합 5문항 조회수 113 · 2026-05-05 (화) 11:10:56
1 동시성 제어
Medium

Q. Java의 synchronized 키워드와 ReentrantLock의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한가요? 또한 락을 획득하려고 대기 중인 스레드가 많을 때 성능에 미치는 영향도 함께 설명해주세요.

A. 모범답안

synchronized는 JVM 레벨에서 제공되는 암묵적 락으로 메서드나 블록 단위로 자동으로 락을 획득하고 해제하며, ReentrantLock은 명시적으로 lock()과 unlock()을 호출해야 하는 java.util.concurrent 패키지의 락입니다. ReentrantLock은 타임아웃 설정(tryLock), 인터럽트 가능한 락 획득(lockInterruptibly), 공정성 정책 설정(fair lock), 조건 변수(Condition) 등 더 많은 기능을 제공합니다. 단순한 동기화는 synchronized를 사용하고, 복잡한 동시성 제어나 타임아웃이 필요한 경우 ReentrantLock을 사용하는 것이 적절합니다. 락 경합이 심한 상황에서는 ReentrantLock의 공정성 정책이나 tryLock을 활용해 데드락을 방지하고 성능을 개선할 수 있습니다.

핵심 포인트
  • • synchronized는 암묵적 락, ReentrantLock은 명시적 락으로 lock()/unlock() 필요
  • • ReentrantLock은 타임아웃, 인터럽트, 공정성 정책, Condition 등 고급 기능 제공
  • • 단순 동기화는 synchronized, 복잡한 제어는 ReentrantLock 사용
  • • 락 경합 시 ReentrantLock의 tryLock이나 공정성 정책으로 성능 개선 가능
Follow-up 질문

StampedLock과 ReentrantReadWriteLock의 차이점은 무엇이며, 읽기 작업이 많은 시스템에서 어떤 락을 선택하는 것이 유리한가요?

2 JVM 메모리 관리
Hard

Q. Java의 Garbage Collection에서 Young Generation과 Old Generation의 역할을 설명하고, Minor GC와 Full GC가 발생하는 시점과 각각이 애플리케이션 성능에 미치는 영향을 설명해주세요. 실무에서 Full GC 빈도를 줄이기 위한 튜닝 방법도 함께 제시해주세요.

A. 모범답안

Young Generation은 새로 생성된 객체가 할당되는 영역으로 Eden과 두 개의 Survivor 영역으로 구성되며, 대부분의 객체가 금방 죽는다는 가정 하에 빠른 Minor GC가 발생합니다. Old Generation은 Young Generation에서 여러 번의 GC를 살아남은 오래된 객체가 승격되는 영역으로, Full GC가 발생하면 애플리케이션이 멈추는 Stop-The-World 시간이 길어져 성능에 큰 영향을 줍니다. Full GC 빈도를 줄이려면 Young Generation 크기를 적절히 늘려 객체가 Old Generation으로 조기 승격되는 것을 방지하고, 불필요한 대용량 객체 생성을 줄이며, G1GC나 ZGC 같은 최신 GC 알고리즘을 사용하거나, 객체 풀링을 통해 객체 생성을 최소화하는 방법을 사용할 수 있습니다.

핵심 포인트
  • • Young Generation은 새 객체 할당 영역으로 Minor GC 발생, Old Generation은 오래된 객체 저장
  • • Full GC는 Stop-The-World 시간이 길어 애플리케이션 성능에 큰 영향
  • • Young Generation 크기 증가로 조기 승격 방지
  • • G1GC, ZGC 같은 최신 GC 알고리즘 사용 또는 객체 풀링으로 객체 생성 최소화
Follow-up 질문

G1GC의 동작 원리와 Region 기반 메모리 관리 방식이 기존 CMS GC와 어떻게 다른지 설명해주세요.

3 디자인 패턴
Medium

Q. Strategy 패턴과 Template Method 패턴의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 실무 예시와 함께 설명해주세요. 또한 두 패턴의 확장성과 유지보수성 측면에서의 차이도 함께 설명해주세요.

A. 모범답안

Strategy 패턴은 알고리즘을 인터페이스로 캡슐화하여 런타임에 동적으로 교체할 수 있도록 하는 행위 패턴으로, 결제 수단 선택이나 정렬 알고리즘 변경 같은 경우에 사용합니다. Template Method 패턴은 상위 클래스에서 알고리즘의 골격을 정의하고 하위 클래스에서 구체적인 단계를 구현하는 패턴으로, 데이터 처리 파이프라인이나 프레임워크의 라이프사이클 훅 같은 경우에 사용합니다. Strategy 패턴은 컴포지션을 사용해 유연하고 테스트가 쉬우며 새로운 전략 추가 시 기존 코드 수정이 없지만, Template Method 패턴은 상속을 사용해 전체 흐름을 강제할 수 있으나 상속 계층이 복잡해지고 유연성이 떨어질 수 있습니다.

핵심 포인트
  • • Strategy 패턴은 알고리즘을 인터페이스로 캡슐화하여 런타임에 동적 교체 가능
  • • Template Method 패턴은 상위 클래스에서 알고리즘 골격 정의, 하위 클래스에서 구현
  • • Strategy는 컴포지션 기반으로 유연하고 확장에 유리
  • • Template Method는 상속 기반으로 전체 흐름 강제 가능하나 유연성 떨어짐
Follow-up 질문

Spring Framework에서 Strategy 패턴이 적용된 실제 사례를 찾아 설명해주세요.

4 성능 최적화
Hard

Q. 대용량 트래픽 환경에서 데이터베이스 커넥션 풀 설정 시 고려해야 할 요소들을 설명하고, HikariCP의 maximumPoolSize와 minimumIdle 설정을 어떻게 튜닝해야 하는지 설명해주세요. 또한 커넥션 풀이 부족할 때 발생하는 문제와 해결 방법도 함께 제시해주세요.

A. 모범답안

커넥션 풀 설정 시 동시 사용자 수, 데이터베이스 최대 연결 수, 애플리케이션 서버 수, 쿼리 응답 시간을 고려해야 합니다. HikariCP의 maximumPoolSize는 공식 connections = ((core_count * 2) + effective_spindle_count)를 기준으로 설정하되, 실제 부하 테스트를 통해 조정하며, minimumIdle은 일반적으로 maximumPoolSize와 동일하게 설정해 커넥션 생성 오버헤드를 줄입니다. 커넥션 풀 부족 시 타임아웃 에러가 발생하며, 이는 connectionTimeout과 maxLifetime 설정 조정, 쿼리 성능 개선, 트랜잭션 범위 최소화, 읽기 전용 쿼리는 읽기 전용 DB로 분리, 또는 커넥션 풀 크기 증가로 해결할 수 있습니다.

핵심 포인트
  • • 동시 사용자 수, DB 최대 연결 수, 서버 수, 쿼리 응답 시간 고려
  • • maximumPoolSize는 CPU 코어 기반 공식 사용 후 부하 테스트로 조정
  • • minimumIdle은 maximumPoolSize와 동일하게 설정해 오버헤드 감소
  • • 커넥션 부족 시 타임아웃 설정 조정, 쿼리 최적화, 트랜잭션 범위 최소화, 읽기 DB 분리
Follow-up 질문

커넥션 풀에서 커넥션 누수(Connection Leak)가 발생하는 원인과 이를 모니터링하고 해결하는 방법을 설명해주세요.

5 트러블슈팅
Hard

Q. 프로덕션 환경에서 애플리케이션의 응답 속도가 점진적으로 느려지는 현상이 발생했습니다. 메모리 누수를 의심하고 있을 때, 어떤 순서로 원인을 파악하고 해결하시겠습니까? 사용할 도구와 분석 방법을 구체적으로 설명해주세요.

A. 모범답안

먼저 jstat이나 모니터링 도구로 힙 메모리 사용량과 GC 빈도를 확인하여 메모리 누수 여부를 판단합니다. 메모리 누수가 의심되면 jmap을 사용해 힙 덤프를 생성하고, Eclipse MAT나 VisualVM으로 힙 덤프를 분석하여 메모리를 많이 점유하는 객체와 그 참조 체인을 확인합니다. Dominator Tree와 Leak Suspects 리포트를 통해 메모리 누수의 원인이 되는 객체를 식별하고, 일반적으로 static 컬렉션, ThreadLocal 미정리, 리스너 미해제, 캐시 무한 증가 등의 패턴을 찾습니다. 원인을 파악한 후 해당 코드를 수정하고, WeakReference나 SoftReference 사용, 적절한 리소스 해제, 캐시 크기 제한 등의 방법으로 해결하며, 수정 후 다시 부하 테스트를 통해 검증합니다.

핵심 포인트
  • • jstat, 모니터링 도구로 힙 메모리와 GC 빈도 확인
  • • jmap으로 힙 덤프 생성, Eclipse MAT나 VisualVM으로 분석
  • • Dominator Tree와 Leak Suspects로 메모리 점유 객체와 참조 체인 식별
  • • static 컬렉션, ThreadLocal 미정리, 리스너 미해제, 캐시 무한 증가 등 패턴 확인 후 수정
Follow-up 질문

힙 덤프 분석 시 Shallow Heap과 Retained Heap의 차이는 무엇이며, 메모리 누수 분석에서 어떤 지표가 더 중요한가요?

댓글 0

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

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