Java 백엔드 개발자 면접 질문: Spring Boot, JPA, API

Milad Bonakdar
작성자
Spring Boot, REST API, 마이크로서비스, JPA/Hibernate, 보안, 테스트, 아키텍처 판단을 실무형 질문으로 준비하세요.
소개
Java 백엔드 면접은 프레임워크 이름을 외웠는지보다 안정적인 API를 만들고 운영할 수 있는지를 봅니다. Spring Boot, REST 설계, 영속성, 트랜잭션, 테스트, 보안, 관측성, 마이크로서비스 아키텍처의 선택 기준을 자주 묻습니다.
이 가이드는 개념을 실무 답변으로 연결하도록 돕습니다. 기능이 무엇을 하는지, 언제 쓰는지, 어떤 문제가 생길 수 있는지, 어떻게 테스트하거나 디버깅할지까지 준비하세요. 2026년 기준으로 Java 17+ 환경, Java 21/25 논의, Spring Boot 3/4 프로젝트, OAuth2/JWT 기반 API 보안도 익숙해야 합니다.
이 가이드 활용법
- 쉬운 Spring Boot와 Java 기본기부터 시작한 뒤, 중간 및 어려운 질문은 소리 내어 연습합니다.
- 각 답변에 이력서나 포트폴리오의 실제 프로젝트 예시를 하나씩 붙입니다.
- 선택지가 갈리는 질문에서는 기본으로 고를 방식과 바꿀 신호를 함께 설명합니다.
- 이력서에 마이크로서비스, JPA, Kafka, Docker, 클라우드 배포를 적었다면 구체적인 장애 대응이나 디버깅 사례를 준비합니다.
Spring Boot 핵심 개념
1. Spring Boot는 무엇이며, 기존 Spring Framework와 어떻게 다른가요?
답변:
- Spring Framework: 엔터프라이즈 Java 개발을 위한 포괄적인 프레임워크입니다. 설정하려면 상당한 수동 구성(XML 또는 Java 기반)이 필요합니다.
- Spring Boot: 새로운 Spring 애플리케이션의 설정 및 개발을 간소화하는 Spring Framework의 확장입니다.
- 자동 구성(Auto-Configuration): 클래스 경로 의존성을 기반으로 Bean을 자동으로 구성합니다.
- 내장 서버(Embedded Servers): Tomcat, Jetty 또는 Undertow를 포함하므로 WAR 파일을 배포할 필요가 없습니다.
- 스타터(Starters): 빌드 구성을 단순화하기 위해 선별된 의존성 모음입니다.
- 규칙에 따른 기본값(Opinionated Defaults): "설정보다 규칙" 접근 방식입니다.
희소성: 일반적 난이도: 쉬움
2. @SpringBootApplication 어노테이션에 대해 설명해주세요.
답변: 이 어노테이션은 세 가지 다른 어노테이션을 결합한 편리한 어노테이션입니다.
@Configuration: 해당 클래스를 Bean 정의의 소스로 표시합니다.@EnableAutoConfiguration: Spring Boot에게 클래스 경로 설정, 기타 Bean 및 다양한 속성 설정을 기반으로 Bean을 추가하기 시작하도록 지시합니다.@ComponentScan: Spring에게 현재 패키지 및 하위 패키지에서 다른 컴포넌트, 구성 및 서비스를 찾도록 지시합니다.
희소성: 일반적 난이도: 쉬움
3. 의존성 주입(DI)과 제어 역전(IoC)은 무엇인가요?
답변:
- IoC: 객체 생성 및 관리 제어가 프로그래머에서 컨테이너(Spring IoC 컨테이너)로 이전되는 원칙입니다.
- DI: IoC를 구현하는 데 사용되는 디자인 패턴입니다. 객체가 자체 의존성을 생성하는 대신 생성자, Setter 또는 필드를 통해 의존성이 "주입"됩니다.
- 장점: 결합도 감소, 더 쉬운 테스팅(의존성 모의 객체 사용), 더 나은 유지보수성.
희소성: 매우 일반적 난이도: 중간
4. Spring Boot 스타터는 무엇인가요? 예를 들어주세요.
답변: 스타터는 애플리케이션에 포함할 수 있는 편리한 의존성 설명자 세트입니다. 프로젝트를 일관되고 지원되는 관리되는 전이적 의존성 세트로 빠르게 시작하고 실행하는 데 필요한 모든 의존성을 포함합니다.
- 예시:
spring-boot-starter-web: 웹 애플리케이션 구축용 (Tomcat 및 Spring MVC 포함).spring-boot-starter-data-jpa: Hibernate와 함께 Spring Data JPA 사용용.spring-boot-starter-test: 테스팅용 (JUnit, Mockito 포함).spring-boot-starter-security: Spring Security용.
희소성: 일반적 난이도: 쉬움
5. Spring Actuator는 무엇인가요?
답변: Spring Boot Actuator는 애플리케이션을 모니터링하고 관리하는 데 도움이 되는 프로덕션 지원 기능을 제공합니다.
- 엔드포인트:
/health(앱 상태),/metrics(메모리, CPU 사용량),/info(앱 정보),/env(환경 속성)와 같은 엔드포인트를 노출합니다. - 용도: 운영팀이 프로덕션 환경에서 마이크로서비스의 상태를 확인하는 데 매우 중요합니다.
희소성: 일반적 난이도: 중간
마이크로서비스 및 아키텍처
6. 모놀리식 아키텍처에 비해 마이크로서비스의 장점은 무엇인가요?
답변:
- 확장성: 개별 서비스는 수요에 따라 독립적으로 확장될 수 있습니다.
- 기술 독립성: 서로 다른 서비스는 작업에 가장 적합한 서로 다른 기술(Java, Go, Python)을 사용할 수 있습니다.
- 결함 격리: 한 서비스의 실패가 전체 시스템을 중단시키지 않습니다.
- 독립적인 배포: 팀은 서비스를 독립적으로 배포하여 더 빠른 릴리스 주기(CI/CD)를 가능하게 합니다.
희소성: 일반적 난이도: 중간
7. API 게이트웨이는 무엇인가요? 왜 사용해야 하나요?
답변: API 게이트웨이는 시스템에 대한 단일 진입점 역할을 하는 서버입니다. 클라이언트로부터 모든 API 호출을 받은 다음 해당 마이크로서비스로 라우팅합니다.
- 기능: 요청 라우팅, 구성 및 프로토콜 변환.
- 공통 관심사: 인증, SSL 종료, 속도 제한, 캐싱, 로깅.
- 예시: Spring Cloud Gateway, Netflix Zuul, Kong.
희소성: 매우 일반적 난이도: 중간
8. 서비스 디스커버리(Eureka)에 대해 설명해주세요.
답변: 마이크로서비스 환경에서 서비스 인스턴스는 동적 IP 주소를 갖습니다. 서비스 디스커버리는 서비스가 서로를 찾기 위한 메커니즘입니다.
- Eureka 서버: 서비스 레지스트리 역할을 합니다.
- Eureka 클라이언트: 마이크로서비스는 시작 시 Eureka 서버에 자체 등록하고 하트비트를 보냅니다.
- 디스커버리: 서비스 A가 서비스 B를 호출해야 할 때 Eureka에 서비스 B의 주소를 요청합니다.
희소성: 일반적 난이도: 중간
9. 서킷 브레이커 패턴은 무엇인가요?
답변: 서킷 브레이커 패턴은 애플리케이션이 실패할 가능성이 높은 작업을 반복적으로 실행하려고 시도하는 것을 방지합니다(예: 다운된 서비스 호출).
- 상태:
- 닫힘(Closed): 요청이 정상적으로 흐릅니다.
- 열림(Open): 실패한 서비스가 복구될 수 있도록 요청이 즉시 차단됩니다(빠른 실패).
- 반열림(Half-Open): 서비스가 복구되었는지 테스트하기 위해 제한된 수의 요청만 허용됩니다.
- 도구: Resilience4j (권장), Hystrix (더 이상 사용되지 않음).
희소성: 매우 일반적 난이도: 어려움
데이터베이스 및 JPA
10. JPA와 Hibernate는 무엇인가요?
답변:
- JPA (Java Persistence API): Java 객체와 관계형 데이터베이스 간의 데이터 액세스, 지속성 및 관리를 위한 사양입니다. 인터페이스일 뿐입니다.
- Hibernate: JPA 사양의 가장 인기 있는 구현입니다. ORM (Object-Relational Mapping) 도구입니다.
희소성: 일반적 난이도: 쉬움
11. Hibernate에서 N+1 Select 문제에 대해 설명해주세요.
답변: N+1 문제는 데이터 액세스 프레임워크가 기본 SQL 쿼리를 실행할 때 검색할 수 있었던 동일한 데이터를 가져오기 위해 N개의 추가 SQL 문을 실행할 때 발생합니다.
- 시나리오:
Author목록 가져오기(1개의 쿼리). 반복하고author.getBooks()에 액세스(각 작성자당 1개의 쿼리, N개의 쿼리). - 해결 방법: JPQL에서 Join Fetch 사용 (
SELECT a FROM Author a JOIN FETCH a.books) 또는 엔티티 그래프를 사용하여 관련 엔티티를 단일 쿼리에서 즉시 로드합니다.
희소성: 매우 일반적 난이도: 중간
12. @Entity, @Table 및 @Column의 차이점은 무엇인가요?
답변:
@Entity: 클래스가 엔티티이고 데이터베이스 테이블에 매핑됨을 지정합니다.@Table: 선택 사항입니다. 매핑에 사용할 데이터베이스 테이블의 이름을 지정합니다. 생략하면 클래스 이름이 사용됩니다.@Column: 선택 사항입니다. 필드 또는 속성이 매핑될 열의 세부 정보를 지정합니다. 생략하면 필드 이름이 사용됩니다.
희소성: 일반적 난이도: 쉬움
보안 및 테스팅
13. Spring Boot 애플리케이션을 어떻게 보호하나요?
답변: 기본은 Spring Security이고, 애플리케이션 유형에 맞는 보안 모델을 설명해야 합니다. 좋은 답변은 인증, 권한 부여, 토큰 검증, 운영상 보호 장치를 분리해서 말합니다.
- 인증(Authentication): OAuth2/OIDC, 세션 로그인, 서비스 간 자격 증명 등으로 API 호출자가 누구인지 확인합니다.
- 권한 부여(Authorization): 역할, scope,
@PreAuthorize같은 메서드 보안,SecurityFilterChain규칙으로 허용된 작업을 제한합니다. - JWT/OAuth2 리소스 서버: 상태 비저장 API에서는 토큰 내용을 그대로 믿지 말고 bearer token의 issuer, 만료, 서명, scope를 검증합니다.
- API 하드닝: HTTPS, 명확한 CORS 설정, 브라우저 세션의 CSRF 보호, 안전한 에러 응답, rate limit, 민감 작업 감사 로그를 적용합니다.
희소성: 일반적 난이도: 중간
14. Mockito에서 @Mock과 @InjectMocks의 차이점은 무엇인가요?
답변:
@Mock: 클래스/인터페이스의 모의 객체를 생성합니다. 실제 동작은 없으며when(...).thenReturn(...)을 사용하여 동작을 정의합니다.@InjectMocks: 클래스의 인스턴스를 생성하고@Mock(또는@Spy) 어노테이션으로 생성된 모의 객체를 이 인스턴스에 주입합니다. 테스트 중인 클래스에 사용됩니다.
희소성: 일반적 난이도: 중간
15. Spring Boot에서 트랜잭션을 어떻게 처리하나요?
답변:
@Transactional 어노테이션을 사용합니다.
- 메커니즘: Spring은 클래스/메서드 주위에 프록시를 만듭니다. 메서드 실행 전에 트랜잭션을 시작하고 메서드가 반환된 후 커밋합니다.
RuntimeException이 발생하면 트랜잭션을 롤백합니다. - 전파(Propagation): 트랜잭션이 기존 트랜잭션과 관련되는 방식을 구성할 수 있습니다 (예:
REQUIRED,REQUIRES_NEW).
희소성: 일반적 난이도: 중간
고급 주제
16. Spring Cloud Config는 무엇인가요?
답변: Spring Cloud Config는 분산 시스템에서 외부화된 구성에 대한 서버 측 및 클라이언트 측 지원을 제공합니다.
- Config 서버: 모든 환경에서 애플리케이션에 대한 외부 속성을 관리하는 중앙 위치입니다. Git, SVN 또는 Vault로 지원할 수 있습니다.
- 장점: 애플리케이션을 재배포하지 않고도 구성을 변경할 수 있습니다 (
@RefreshScope사용).
희소성: 흔하지 않음 난이도: 중간
17. Spring Bean에서 Singleton과 Prototype 스코프의 차이점을 설명해주세요.
답변:
- Singleton (기본값): Spring IoC 컨테이너당 Bean의 인스턴스가 하나만 생성됩니다. 캐시되어 재사용됩니다.
- Prototype: Bean이 요청될 때마다 새 인스턴스가 생성됩니다.
- 기타: Request, Session (웹 인식 스코프).
희소성: 일반적 난이도: 쉬움
18. Java에서 Checked 예외와 Unchecked 예외의 차이점은 무엇인가요?
답변:
- Checked 예외:
Exception에서 상속받습니다 (RuntimeException제외). 컴파일러는 예외를 처리(try-catch)하거나 선언(throws)하도록 강제합니다. 예시:IOException,SQLException. 복구 가능한 조건을 나타냅니다. - Unchecked 예외:
RuntimeException에서 상속받습니다. 컴파일러는 예외를 처리하도록 강제하지 않습니다. 예시:NullPointerException,IllegalArgumentException. 프로그래밍 오류를 나타냅니다. Spring의@Transactional은 기본적으로 unchecked 예외에 대해서만 롤백합니다.
희소성: 일반적 난이도: 쉬움
19. Java에서 가비지 컬렉션은 어떻게 작동하나요?
답변: 가비지 컬렉션(GC)은 더 이상 도달할 수 없는 객체가 차지하는 메모리를 자동으로 회수하는 프로세스입니다.
- 세대별 가설: 대부분의 객체는 빨리 사라집니다.
- 힙 구조: Young Generation (Eden, Survivor 공간) 및 Old Generation.
- Minor GC: Young Gen을 정리합니다. 빠릅니다.
- Major/Full GC: Old Gen을 정리합니다. 느리고 "Stop-the-world" 일시 중지를 유발할 수 있습니다.
- 알고리즘: G1GC (최신 Java의 기본값), ZGC, Shenandoah (낮은 지연 시간).
희소성: 일반적 난이도: 어려움
20. Java 스트림은 무엇인가요?
답변: Java 8에 도입된 스트림은 객체 컬렉션을 처리하는 기능적 접근 방식을 제공합니다.
- 기능: 선언적, 파이프라이닝, 내부 반복.
- 작업:
- 중간(Intermediate):
filter,map,sorted(지연). - 종료(Terminal):
collect,forEach,reduce(처리를 트리거).
- 중간(Intermediate):
- 병렬 스트림(Parallel Streams): 여러 스레드를 사용하여 데이터를 병렬로 처리할 수 있습니다 (
.parallelStream()).
희소성: 일반적 난이도: 중간


