Spring 주니어 코딩 문제 면접

Spring 주니어 (1~3년) 코딩 · 알고리즘 5문항 조회수 122 · 2026-05-02 (토) 11:10:42
1 Spring Bean Scope
Medium

Q. Spring에서 @Scope 어노테이션을 사용하여 Bean의 생명주기를 제어할 수 있습니다. singleton, prototype, request, session 스코프의 차이점을 설명하고, 각각 어떤 상황에서 사용해야 하는지 설명해주세요.

A. 모범답안

singleton은 스프링 컨테이너당 하나의 인스턴스만 생성되며 기본 스코프입니다. prototype은 요청할 때마다 새로운 인스턴스를 생성합니다. request는 HTTP 요청마다 새로운 인스턴스를 생성하고 요청이 끝나면 소멸되며, session은 HTTP 세션마다 인스턴스를 생성합니다. singleton은 상태가 없는 서비스 계층에, prototype은 상태를 가진 객체나 매번 새로운 인스턴스가 필요한 경우에, request/session은 웹 애플리케이션에서 사용자별 데이터를 관리할 때 사용합니다.

핵심 포인트
  • • singleton은 컨테이너당 하나의 인스턴스, prototype은 요청마다 새 인스턴스 생성
  • • request는 HTTP 요청마다, session은 HTTP 세션마다 생성
  • • 상태가 없는 객체는 singleton, 상태를 가진 객체는 prototype 사용
Follow-up 질문

singleton 스코프 Bean에서 prototype 스코프 Bean을 주입받으면 어떤 문제가 발생하고, 이를 어떻게 해결할 수 있나요?

2 Spring Data JPA
Medium

Q. JPA에서 영속성 컨텍스트(Persistence Context)가 무엇인지 설명하고, 엔티티의 생명주기 상태인 비영속(transient), 영속(persistent), 준영속(detached), 삭제(removed) 상태에 대해 설명해주세요.

A. 모범답안

영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로, 1차 캐시와 쓰기 지연 등의 기능을 제공합니다. 비영속 상태는 new 키워드로 생성만 한 상태로 영속성 컨텍스트와 무관합니다. 영속 상태는 persist() 메서드나 find()로 조회하여 영속성 컨텍스트에서 관리되는 상태입니다. 준영속 상태는 detach()나 clear()로 영속성 컨텍스트에서 분리된 상태이며, 삭제 상태는 remove()로 삭제를 요청한 상태입니다. 영속 상태에서만 변경 감지(Dirty Checking)와 지연 로딩이 동작합니다.

핵심 포인트
  • • 영속성 컨텍스트는 엔티티를 관리하는 환경으로 1차 캐시와 쓰기 지연 제공
  • • 비영속은 새로 생성, 영속은 컨텍스트 관리 중, 준영속은 분리, 삭제는 제거 예정
  • • 영속 상태에서만 변경 감지와 지연 로딩이 동작
Follow-up 질문

영속성 컨텍스트의 1차 캐시가 성능에 미치는 영향과, flush()와 clear()의 차이점을 설명해주세요.

3 Spring Validation
Easy

Q. Spring에서 DTO(Data Transfer Object)에 유효성 검증을 적용하는 방법을 설명하고, @NotNull, @NotEmpty, @NotBlank의 차이점을 설명해주세요.

A. 모범답안

@NotNull은 null 값만 허용하지 않으며, 빈 문자열이나 공백은 허용됩니다. @NotEmpty는 null과 빈 문자열을 허용하지 않지만, 공백만 있는 문자열은 허용합니다. @NotBlank는 null, 빈 문자열, 공백만 있는 문자열 모두 허용하지 않습니다. 유효성 검증을 적용하려면 DTO 필드에 검증 어노테이션을 추가하고, 컨트롤러 메서드의 파라미터에 @Valid 또는 @Validated를 붙여야 합니다. 검증 실패 시 MethodArgumentNotValidException이 발생합니다.

핵심 포인트
  • • @NotNull은 null만, @NotEmpty는 null과 빈 문자열, @NotBlank는 null과 공백까지 검증
  • • DTO에 검증 어노테이션을 추가하고 컨트롤러에서 @Valid 사용
  • • 검증 실패 시 예외가 발생하므로 전역 예외 처리 필요
Follow-up 질문

BindingResult를 사용하여 검증 오류를 직접 처리하는 방법과, 커스텀 Validator를 만드는 방법을 설명해주세요.

4 Spring Transaction
Hard

Q. @Transactional 어노테이션의 propagation 속성 중 REQUIRED, REQUIRES_NEW, NESTED의 차이점을 설명하고, 각각 어떤 상황에서 사용해야 하는지 설명해주세요.

A. 모범답안

REQUIRED는 기존 트랜잭션이 있으면 참여하고 없으면 새로 시작하는 기본 전파 속성입니다. REQUIRES_NEW는 항상 새로운 트랜잭션을 시작하며, 기존 트랜잭션이 있으면 보류시킵니다. NESTED는 기존 트랜잭션 내에 중첩 트랜잭션을 만들어 부분 롤백이 가능합니다. REQUIRED는 일반적인 트랜잭션 처리에, REQUIRES_NEW는 로깅이나 알림처럼 독립적으로 커밋되어야 하는 작업에, NESTED는 부분 실패를 허용하는 배치 작업 등에 사용합니다. NESTED는 JDBC SavePoint를 사용하므로 DataSource가 이를 지원해야 합니다.

핵심 포인트
  • • REQUIRED는 기존 트랜잭션 참여, REQUIRES_NEW는 새 트랜잭션 생성, NESTED는 중첩 트랜잭션
  • • REQUIRES_NEW는 독립적 커밋, NESTED는 부분 롤백 가능
  • • 각 전파 속성은 비즈니스 요구사항에 따라 선택
Follow-up 질문

같은 클래스 내에서 @Transactional 메서드를 호출할 때 트랜잭션이 동작하지 않는 이유와 해결 방법을 설명해주세요.

5 Spring REST API
Medium

Q. RESTful API를 설계할 때 @RequestBody와 @ResponseBody의 역할을 설명하고, Jackson 라이브러리가 JSON 직렬화/역직렬화를 수행하는 과정에서 주의해야 할 점을 설명해주세요.

A. 모범답안

@RequestBody는 HTTP 요청 본문의 JSON 데이터를 Java 객체로 변환(역직렬화)하고, @ResponseBody는 Java 객체를 JSON으로 변환(직렬화)하여 응답 본문에 포함시킵니다. Jackson은 기본적으로 getter/setter를 사용하여 직렬화/역직렬화를 수행하므로, DTO에는 기본 생성자와 getter/setter가 필요합니다. 날짜 형식이나 null 필드 처리는 @JsonFormat, @JsonIgnore 등의 어노테이션으로 제어할 수 있습니다. 순환 참조 문제가 발생할 수 있으므로 엔티티를 직접 반환하지 않고 DTO를 사용해야 합니다. @RestController는 @ResponseBody를 포함하므로 별도로 붙이지 않아도 됩니다.

핵심 포인트
  • • @RequestBody는 JSON을 객체로, @ResponseBody는 객체를 JSON으로 변환
  • • Jackson은 기본 생성자와 getter/setter 필요
  • • 순환 참조 방지를 위해 엔티티 대신 DTO 사용
Follow-up 질문

LocalDateTime이나 LocalDate를 JSON으로 직렬화할 때 발생하는 문제와 이를 해결하기 위한 설정 방법을 설명해주세요.

댓글 0

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

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