Java 미드레벨 기술면접

Java 미드레벨 (3~7년) 종합 5문항 조회수 37 · 2026-07-19 (일) 11:10:50
1 동시성 프로그래밍
Medium

Q. Java의 ConcurrentHashMap과 일반 HashMap의 동작 원리 차이를 설명하고, ConcurrentHashMap이 어떻게 멀티스레드 환경에서 동시성을 보장하는지 설명해주세요. 또한 Collections.synchronizedMap()과 ConcurrentHashMap의 성능 차이가 발생하는 이유도 함께 설명해주세요.

A. 모범답안

ConcurrentHashMap은 내부적으로 버킷 단위로 락을 분산하여(Java 8 이후 CAS와 synchronized 조합) 여러 스레드가 서로 다른 버킷에 동시에 접근할 수 있도록 합니다. 반면 Collections.synchronizedMap()은 전체 맵에 대해 하나의 락을 사용하여 동시에 하나의 스레드만 접근 가능합니다. ConcurrentHashMap은 읽기 작업 시 락이 필요 없고(volatile 변수 사용), 쓰기 작업도 해당 버킷에만 락을 걸어 동시성이 높습니다. 따라서 멀티스레드 환경에서 ConcurrentHashMap이 훨씬 높은 처리량을 보입니다.

핵심 포인트
  • • 버킷 단위 락 분산으로 동시성 향상
  • • 읽기 작업 시 락 불필요 (volatile)
  • • synchronizedMap은 전체 락으로 성능 저하
  • • Java 8 이후 CAS + synchronized 조합 사용
Follow-up 질문

ConcurrentHashMap에서 size()나 isEmpty() 메서드를 호출할 때 정확한 값을 보장하지 못하는 이유는 무엇이며, 실무에서 이를 어떻게 다뤄야 할까요?

2 설계 패턴
Medium

Q. Singleton 패턴을 구현하는 여러 방법(Eager Initialization, Lazy Initialization, Double-Checked Locking, Enum)의 차이점을 설명하고, 각 방식의 장단점과 멀티스레드 환경에서의 안전성을 비교해주세요. 실무에서 권장하는 방식은 무엇인가요?

A. 모범답안

Eager Initialization은 클래스 로딩 시점에 인스턴스를 생성하여 스레드 안전하지만 사용하지 않아도 메모리를 차지합니다. Lazy Initialization은 필요 시점에 생성하지만 동기화 처리가 없으면 스레드 안전하지 않습니다. Double-Checked Locking은 volatile 키워드와 함께 사용하여 성능과 안전성을 모두 확보하지만 구현이 복잡합니다. Enum 방식은 JVM 레벨에서 스레드 안전성과 직렬화를 보장하며 리플렉션 공격도 방어할 수 있어 가장 권장됩니다. 실무에서는 Enum 방식이나 Lazy Holder 패턴을 주로 사용합니다.

핵심 포인트
  • • Enum 방식이 가장 안전하고 간결함
  • • Double-Checked Locking은 volatile 필수
  • • Lazy Holder 패턴은 지연 초기화와 스레드 안전성 모두 확보
  • • 리플렉션과 직렬화 공격 대응 고려 필요
Follow-up 질문

Spring Framework에서는 Bean을 기본적으로 Singleton으로 관리하는데, 직접 Singleton 패턴을 구현하는 것과 어떤 차이가 있나요?

3 JVM 성능 최적화
Hard

Q. Java 애플리케이션에서 OutOfMemoryError가 발생하는 여러 원인(Heap, Metaspace, Direct Memory 등)을 구분하여 설명하고, 각 영역별로 발생했을 때 어떻게 진단하고 해결할 수 있는지 설명해주세요. 실제 프로덕션 환경에서 사용할 수 있는 JVM 옵션과 모니터링 도구도 함께 제시해주세요.

A. 모범답안

Heap OOM은 객체 생성이 과도하거나 메모리 누수로 발생하며 -XX:+HeapDumpOnOutOfMemoryError로 힙 덤프를 생성하여 MAT나 VisualVM으로 분석합니다. Metaspace OOM은 클래스 로딩이 과도할 때 발생하며 -XX:MaxMetaspaceSize를 조정하고 클래스로더 누수를 확인합니다. Direct Memory OOM은 NIO ByteBuffer 사용 시 발생하며 -XX:MaxDirectMemorySize로 제한할 수 있습니다. 프로덕션에서는 -Xms, -Xmx를 동일하게 설정하고, G1GC나 ZGC를 사용하며, JMX, Prometheus, APM 도구로 모니터링합니다.

핵심 포인트
  • • Heap, Metaspace, Direct Memory 영역별 원인 구분
  • • HeapDump 분석으로 메모리 누수 지점 파악
  • • JVM 옵션으로 각 영역 크기 조정
  • • APM과 모니터링 도구 활용한 사전 예방
Follow-up 질문

G1GC와 ZGC의 동작 원리 차이를 설명하고, 각각 어떤 애플리케이션 특성에 적합한지 설명해주세요.

4 데이터베이스 트랜잭션
Hard

Q. 데이터베이스의 격리 수준(Isolation Level) 4단계를 설명하고, 각 수준에서 발생할 수 있는 문제(Dirty Read, Non-Repeatable Read, Phantom Read)를 구체적으로 설명해주세요. 실무에서 격리 수준을 선택할 때 고려해야 할 트레이드오프는 무엇인가요?

A. 모범답안

Read Uncommitted는 커밋되지 않은 데이터를 읽어 Dirty Read가 발생합니다. Read Committed는 커밋된 데이터만 읽지만 같은 쿼리를 반복 실행 시 결과가 달라지는 Non-Repeatable Read가 발생합니다. Repeatable Read는 같은 행의 반복 읽기를 보장하지만 범위 쿼리 시 새로운 행이 추가되는 Phantom Read가 발생할 수 있습니다. Serializable은 모든 문제를 방지하지만 동시성이 크게 떨어집니다. 실무에서는 Read Committed를 기본으로 사용하며, 데이터 정합성이 중요한 금융 거래는 Repeatable Read나 낙관적 락을 함께 사용합니다.

핵심 포인트
  • • 격리 수준이 높을수록 동시성은 낮아짐
  • • Read Committed가 가장 일반적인 기본값
  • • 비즈니스 요구사항에 따른 격리 수준 선택
  • • 낙관적/비관적 락과 조합하여 사용
Follow-up 질문

MySQL의 InnoDB 엔진에서 Repeatable Read 수준에서 Phantom Read를 방지하는 방법은 무엇이며, 이것이 표준 SQL과 어떻게 다른가요?

5 시스템 설계
Hard

Q. 대규모 이벤트(예: 선착순 쿠폰 발급)에서 동시에 수만 건의 요청이 들어올 때 발생할 수 있는 문제점들을 설명하고, 이를 해결하기 위한 아키텍처 설계 방안을 제시해주세요. 데이터베이스 락, 메시지 큐, Redis 등을 활용한 여러 접근 방법과 각각의 장단점을 비교해주세요.

A. 모범답안

데이터베이스에 직접 접근하면 비관적 락으로 인한 성능 저하와 데드락 위험이 있습니다. Redis의 INCR이나 Lua 스크립트를 사용하면 원자적 연산으로 빠르게 처리할 수 있지만 Redis 장애 시 데이터 손실 위험이 있습니다. 메시지 큐(Kafka, RabbitMQ)를 사용하면 요청을 비동기로 처리하여 시스템 부하를 분산할 수 있지만 즉시 응답이 어렵습니다. 실무에서는 Redis로 1차 검증 후 메시지 큐로 비동기 처리하고 DB에 최종 저장하는 하이브리드 방식을 사용하며, Rate Limiting과 Circuit Breaker로 시스템을 보호합니다.

핵심 포인트
  • • Redis 원자적 연산으로 빠른 재고 차감
  • • 메시지 큐로 비동기 처리 및 부하 분산
  • • 하이브리드 방식으로 성능과 안정성 확보
  • • Rate Limiting, Circuit Breaker로 시스템 보호
Follow-up 질문

Redis를 사용한 분산 락(Redlock) 구현 시 주의할 점과 한계는 무엇이며, 이를 보완하기 위한 방법은 무엇인가요?

댓글 0

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

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