Spring 기술면접 Q&A

Jihye Gim·2026년 5월 20일

Codeit SB11

목록 보기
19/22

Q1. Spring Framework이란 무엇이며, 왜 사용하나요?
Spring은 Java 엔터프라이즈 애플리케이션 개발을 위한 오픈소스 프레임워크입니다. 핵심 가치는 세 가지입니다.

IoC / DI — 객체 생성·의존성 관리를 컨테이너가 담당해 개발자가 비즈니스 로직에 집중할 수 있습니다.
AOP — 로깅, 트랜잭션 등 횡단 관심사를 핵심 로직과 분리합니다.
PSA(Portable Service Abstraction) — JDBC, JPA, JMS 등 기술에 일관된 추상화 계층을 제공합니다.
결과적으로 POJO 기반 개발로 테스트 용이성과 유지보수성이 높아집니다.


Q2. IoC와 DI의 차이를 설명해주세요.
IoC(Inversion of Control)는 "제어의 역전" — 객체의 생성·생명주기 관리 제어권을 개발자가 아닌 컨테이너(Spring)에 넘기는 설계 원칙입니다.

DI(Dependency Injection)는 IoC를 구현하는 구체적인 패턴입니다. 외부에서 의존 객체를 주입받는 방식으로, Spring에서는 세 가지 방법이 있습니다.

생성자 주입 (권장) — 불변성 보장, 순환 참조 감지
수정자(setter) 주입 — 선택적 의존성에 적합
필드 주입 (@Autowired) — 테스트 어려움, 지양


Q3.생성자 주입을 권장하는 이유는 무엇인가요?
생성자 주입이 권장되는 이유는 네 가지입니다.

불변성 — final 선언으로 객체 생성 후 의존성 변경 불가
순환 참조 감지 — 애플리케이션 구동 시점에 순환 참조를 바로 감지 (필드 주입은 런타임 오류)
테스트 용이성 — 컨테이너 없이 new로 직접 객체 생성 후 테스트 가능
명시성 — 필수 의존성이 명확히 드러나 코드 가독성이 높음


Q4.Spring Bean의 스코프 종류와 각각의 특징을 설명해주세요.
Spring Bean 스코프의 주요 종류는 다음과 같습니다.

singleton (기본) — 컨테이너당 1개 인스턴스, 공유 상태 주의
prototype — 요청할 때마다 새 인스턴스 생성, Spring이 소멸 관리 안 함
request — HTTP 요청 1개당 1개 (웹 전용)
session — HTTP 세션당 1개 (웹 전용)
application — ServletContext 수명과 동일
singleton Bean에서 prototype Bean을 주입받을 때는 Provider 또는 ObjectFactory를 사용해야 합니다.


Q5.@Component, @Service, @Repository, @Controller의 차이를 설명해주세요.
네 가지 모두 @Component의 특수화(specialization)로, 컴포넌트 스캔 대상이 됩니다.

@Component — 일반적인 Spring 관리 컴포넌트
@Service — 비즈니스 로직 계층. 추가 기능은 없지만 의미적 구분
@Repository — 데이터 접근 계층. 예외 변환(SQLException → DataAccessException) AOP 적용
@Controller — 웹 MVC 컨트롤러. @RequestMapping과 함께 사용
의미적 구분을 통해 계층 아키텍처를 명확하게 표현하는 것이 핵심입니다.


Q6.Spring MVC의 동작 흐름을 설명해주세요.
HTTP 요청이 들어오면 다음 순서로 처리됩니다.

① DispatcherServlet이 모든 요청을 받음 (Front Controller)
② HandlerMapping이 URL에 맞는 컨트롤러를 찾음
③ HandlerAdapter가 해당 컨트롤러 메서드를 실행
④ 컨트롤러가 ModelAndView 반환 (REST면 @ResponseBody로 직접 응답)
⑤ ViewResolver가 뷰 이름을 실제 뷰로 변환
⑥ View가 HTML 렌더링 후 응답


Q7.@RestController와 @Controller의 차이를 설명해주세요.
@Controller는 View를 반환하는 MVC 컨트롤러입니다. @ResponseBody를 메서드마다 붙여야 JSON 응답이 가능합니다.

@RestController는 @Controller + @ResponseBody를 합친 것으로, 모든 메서드에 자동으로 @ResponseBody가 적용됩니다. REST API 서버를 만들 때 주로 사용합니다.

응답 과정에서 HttpMessageConverter(Jackson 등)가 객체를 JSON/XML로 직렬화합니다.


Q8.pring Filter와 Interceptor의 차이를 설명해주세요.
Filter — Servlet 스펙. DispatcherServlet 앞단에서 동작. 인코딩, CORS, XSS 방어 등에 사용. Spring 컨테이너 외부
Interceptor — Spring MVC. DispatcherServlet과 컨트롤러 사이. 인증/권한 체크, 로그인 확인에 적합. Spring Bean 주입 가능
Interceptor는 preHandle / postHandle / afterCompletion 세 시점에 개입합니다. Spring Security는 Filter 기반으로 동작합니다.


Q9.JPA의 영속성 컨텍스트(Persistence Context)를 설명해주세요.
영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로, EntityManager가 관리합니다. 핵심 기능은 다음과 같습니다.

1차 캐시 — 같은 트랜잭션 내 동일 PK 조회 시 DB 접근 없이 캐시 반환
동일성 보장 — 같은 PK 엔티티는 == 비교 시 true
쓰기 지연 — 트랜잭션 커밋 시점에 INSERT/UPDATE SQL 일괄 전송
변경 감지(Dirty Checking) — 스냅샷과 비교해 자동으로 UPDATE
지연 로딩 — 실제 사용 시점에 SQL 실행


Q10
N+1 문제란 무엇이며 어떻게 해결하나요?
N+1 문제는 1개의 메인 쿼리 실행 후, 연관 엔티티를 가져오기 위해 N개의 추가 쿼리가 발생하는 성능 문제입니다.

해결 방법

Fetch Join — JOIN FETCH로 한 번에 조회 (컬렉션 join 시 페이징 불가에 주의)
@EntityGraph — 어노테이션으로 fetch 전략 지정
Batch Size — @BatchSize 또는 hibernate.default_batch_fetch_size로 IN 절 활용
DTO 직접 조회 — 필요한 데이터만 JPQL로 프로젝션


Q11.@Transactional의 동작 원리와 주의사항을 설명해주세요.
@Transactional은 AOP 프록시를 통해 동작합니다. Spring이 프록시 객체를 생성하고, 메서드 호출 전에 트랜잭션을 시작, 정상 종료 시 커밋, 예외 발생 시 롤백합니다.

주의사항

self-invocation 문제 — 같은 클래스 내부에서 호출하면 프록시를 거치지 않아 트랜잭션 미적용
rollbackFor — 기본적으로 RuntimeException만 롤백. CheckedException은 명시 필요
propagation — REQUIRED(기본), REQUIRES_NEW, NESTED 등 전파 레벨 이해
private 메서드에는 적용 불가


Q12.Spring Security의 인증(Authentication) 처리 흐름을 설명해주세요.
Spring Security의 인증 흐름은 다음과 같습니다.

① UsernamePasswordAuthenticationFilter가 요청에서 인증 정보 추출
② AuthenticationManager(ProviderManager)에 위임
③ AuthenticationProvider가 실제 인증 처리
④ UserDetailsService를 통해 DB에서 사용자 정보 로드
⑤ 인증 성공 시 SecurityContextHolder에 Authentication 저장
JWT 방식에서는 OncePerRequestFilter를 구현해 토큰 검증 필터를 추가합니다.


Q13.AOP(Aspect-Oriented Programming)란 무엇이고 Spring에서 어떻게 구현되나요?
AOP는 핵심 비즈니스 로직과 횡단 관심사(cross-cutting concerns)를 분리하는 프로그래밍 패러다임입니다. 로깅, 트랜잭션, 보안 등이 대표적입니다.

Spring AOP는 프록시 기반으로 동작합니다. (JDK Dynamic Proxy 또는 CGLIB)

@Aspect — Aspect 클래스 선언
@Pointcut — 적용 시점(위치) 지정
@Before / @After / @Around / @AfterReturning / @AfterThrowing — 어드바이스 종류


Q14.JPQL과 QueryDSL의 차이를 설명해주세요.
JPQL은 JPA의 객체 지향 쿼리 언어입니다. SQL과 유사하지만 테이블이 아닌 엔티티와 필드명을 사용합니다. 문자열이므로 컴파일 타임에 오류를 잡지 못합니다.

QueryDSL은 타입 세이프한 쿼리 빌더 라이브러리입니다.

Q-class를 통해 컴파일 타임 오류 감지
IDE 자동완성 지원
동적 쿼리 작성이 용이
복잡한 조건/페이징 처리에 적합
실무에서는 JPQL 기본 + 복잡한 쿼리는 QueryDSL 조합을 많이 사용합니다.


Q15.RESTful API 설계 원칙에 대해 설명해주세요.
REST(Representational State Transfer)의 주요 설계 원칙입니다.

자원 기반 URI — 동사 대신 명사 사용 (/users/1)
HTTP 메서드 활용 — GET(조회), POST(생성), PUT/PATCH(수정), DELETE(삭제)
무상태(Stateless) — 서버가 클라이언트 상태를 저장하지 않음
적절한 상태코드 — 200, 201, 400, 401, 403, 404, 500 등
일관된 인터페이스 — 응답 형식 통일(JSON)
PATCH는 일부 수정, PUT은 전체 교체라는 의미 차이가 있습니다.


Q16 .@SpringBootTest와 @WebMvcTest의 차이를 설명해주세요.
@SpringBootTest는 전체 애플리케이션 컨텍스트를 로드하는 통합 테스트용 어노테이션입니다. 실제 환경과 동일하게 테스트하지만 속도가 느립니다.

@WebMvcTest는 Web MVC 레이어만 로드하는 슬라이스 테스트입니다.

Controller, Filter, Interceptor 등만 로드
Service, Repository는 @MockBean으로 모킹
빠르고 단위 테스트에 가까움
MockMvc를 주입받아 HTTP 요청을 시뮬레이션


Q17.Mockito의 @Mock, @MockBean, @Spy의 차이를 설명해주세요.

@Mock — Mockito가 만드는 Mock 객체. Spring 컨텍스트와 무관. 순수 단위 테스트에 사용. @ExtendWith(MockitoExtension.class) 필요
@MockBean — Spring 컨텍스트에 Mock Bean을 등록. @SpringBootTest나 @WebMvcTest에서 사용
@Spy — 실제 객체를 감싸며 일부 메서드만 모킹. 나머지는 실제 구현 호출
단위 테스트 → @Mock, 통합 테스트에서 일부 대체 → @MockBean 으로 구분하면 됩니다.


Q18.낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)의 차이를 설명해주세요.

낙관적 락은 충돌이 드물다고 가정합니다. DB 락을 걸지 않고 @Version 필드로 충돌을 감지합니다. 업데이트 시 버전이 다르면 OptimisticLockException을 던집니다. 성능이 좋고 읽기가 많은 시스템에 적합합니다.

비관적 락은 충돌이 자주 발생한다고 가정합니다. 데이터 조회 시 DB 레벨 락(SELECT FOR UPDATE)을 겁니다. 데이터 정합성이 중요하고 동시 수정이 잦은 경우(재고, 잔액 등)에 적합합니다.


Q19.트랜잭션 격리 수준(Isolation Level) 4가지를 설명해주세요.
READ UNCOMMITTED — Dirty Read 허용. 다른 트랜잭션의 커밋 안 된 데이터 읽기 가능. 거의 사용 안 함
READ COMMITTED — 커밋된 데이터만 읽음. Non-Repeatable Read 발생. Oracle 기본값
REPEATABLE READ — 같은 트랜잭션 내 같은 행은 항상 동일. Phantom Read 발생 가능. MySQL InnoDB 기본값
SERIALIZABLE — 완전한 격리. 성능 저하 심함. 모든 이상 현상 방지
격리 수준이 높을수록 정합성은 높고 성능은 낮아집니다.


Q20.Spring Boot와 Spring Framework의 차이를 설명해주세요.
Spring Framework는 강력하지만 설정이 복잡합니다(XML, Java Config 등 대량 설정 필요).

Spring Boot는 이 복잡함을 해결하기 위해 만들어졌습니다. 핵심 차이는 다음과 같습니다.

Auto Configuration — 클래스패스의 라이브러리를 감지해 자동으로 Bean 설정
Starter 의존성 — spring-boot-starter-web 하나로 관련 의존성 일괄 포함
내장 서버 — Tomcat/Netty가 내장되어 jar 파일 하나로 실행 가능
Actuator — 모니터링, 헬스체크 엔드포인트 기본 제공
"Spring Boot는 Spring을 쉽게 사용하기 위한 도구이지, 완전히 다른 프레임워크가 아닙니다."

profile
Rookie

0개의 댓글