Spring 주니어 프레임워크 면접
새 면접Q. @Autowired의 주입 방식 3가지(필드 주입, 생성자 주입, 세터 주입)를 설명하고, 생성자 주입이 권장되는 이유는 무엇인가요?
필드 주입은 필드에 직접 @Autowired를 붙이는 방식이고, 생성자 주입은 생성자 파라미터로 의존성을 주입받으며, 세터 주입은 setter 메서드를 통해 주입받습니다. 생성자 주입이 권장되는 이유는 불변성을 보장하여 final 키워드를 사용할 수 있고, 순환 참조를 컴파일 시점에 발견할 수 있으며, 테스트 시 의존성을 명시적으로 주입하기 쉽기 때문입니다. 또한 필수 의존성을 명확히 표현할 수 있어 NPE를 방지할 수 있습니다.
- • 필드 주입, 생성자 주입, 세터 주입의 차이점 이해
- • 생성자 주입의 불변성 보장과 final 키워드 사용 가능
- • 순환 참조 조기 발견 및 테스트 용이성
@Autowired(required = false) 옵션은 언제 사용하며, 생성자 주입에서는 어떻게 선택적 의존성을 처리할 수 있나요?
Q. @SpringBootApplication 어노테이션이 내부적으로 포함하고 있는 3개의 주요 어노테이션과 각각의 역할을 설명해주세요.
@SpringBootApplication은 @Configuration, @EnableAutoConfiguration, @ComponentScan 세 가지를 포함합니다. @Configuration은 해당 클래스가 Bean 설정 클래스임을 나타내고, @EnableAutoConfiguration은 Spring Boot의 자동 설정 기능을 활성화하여 classpath의 라이브러리를 기반으로 자동으로 Bean을 등록합니다. @ComponentScan은 해당 패키지와 하위 패키지에서 @Component, @Service, @Repository 등의 어노테이션이 붙은 클래스를 스캔하여 Bean으로 등록합니다.
- • @Configuration: Bean 설정 클래스 지정
- • @EnableAutoConfiguration: 자동 설정 활성화
- • @ComponentScan: 컴포넌트 자동 스캔 및 Bean 등록
특정 패키지를 ComponentScan 대상에서 제외하거나, 특정 자동 설정을 비활성화하려면 어떻게 해야 하나요?
Q. @ModelAttribute와 @RequestBody의 차이점을 설명하고, 각각 어떤 Content-Type의 요청을 처리하는 데 사용되나요?
@ModelAttribute는 HTML Form 데이터나 쿼리 파라미터를 객체로 바인딩할 때 사용하며, application/x-www-form-urlencoded 타입의 요청을 처리합니다. @RequestBody는 HTTP 요청의 Body에 담긴 JSON, XML 등의 데이터를 객체로 역직렬화할 때 사용하며, 주로 application/json 타입의 요청을 처리합니다. @ModelAttribute는 setter를 통해 바인딩되고, @RequestBody는 HttpMessageConverter를 통해 변환됩니다.
- • @ModelAttribute: Form 데이터 바인딩, application/x-www-form-urlencoded
- • @RequestBody: JSON/XML 역직렬화, application/json
- • 바인딩 방식의 차이: setter vs HttpMessageConverter
@ModelAttribute를 사용할 때 기본 생성자가 필요한 이유는 무엇이며, 바인딩 실패 시 어떻게 처리할 수 있나요?
Q. JPA의 즉시 로딩(EAGER)과 지연 로딩(LAZY)의 차이점을 설명하고, 연관관계 매핑 시 기본 fetch 전략은 어떻게 되나요?
즉시 로딩은 엔티티를 조회할 때 연관된 엔티티도 함께 조회하는 방식이고, 지연 로딩은 실제로 연관 엔티티를 사용하는 시점에 조회하는 방식입니다. @ManyToOne과 @OneToOne은 기본이 EAGER이고, @OneToMany와 @ManyToMany는 기본이 LAZY입니다. 실무에서는 N+1 문제를 방지하기 위해 모든 연관관계를 LAZY로 설정하고, 필요시 fetch join을 사용하는 것이 권장됩니다.
- • 즉시 로딩: 즉시 조회, 지연 로딩: 사용 시점 조회
- • ToOne 관계는 기본 EAGER, ToMany 관계는 기본 LAZY
- • 실무에서는 모두 LAZY로 설정하고 fetch join 활용 권장
지연 로딩 사용 시 프록시 객체가 초기화되지 않은 상태에서 발생하는 LazyInitializationException은 언제 발생하며, 어떻게 해결할 수 있나요?
Q. JPA에서 save() 메서드를 호출할 때 insert와 update가 결정되는 기준은 무엇이며, @GeneratedValue 전략과는 어떤 관련이 있나요?
save() 메서드는 엔티티의 @Id 필드 값이 null이거나 기본값(0, false 등)이면 새로운 엔티티로 판단하여 insert를 수행하고, 값이 존재하면 기존 엔티티로 판단하여 update를 수행합니다. @GeneratedValue를 사용하면 ID가 자동 생성되므로 save() 호출 시점에는 null이어서 insert가 수행되고, 이후 영속성 컨텍스트에서 관리되는 엔티티를 다시 save()하면 ID가 존재하여 update로 동작합니다. Persistable 인터페이스를 구현하여 isNew() 메서드를 재정의하면 이 판단 로직을 커스터마이징할 수 있습니다.
- • ID 값의 존재 여부로 insert/update 결정
- • @GeneratedValue 사용 시 자동 생성으로 insert 수행
- • Persistable 인터페이스로 판단 로직 커스터마이징 가능
UUID를 ID로 사용하는 경우 save() 메서드가 항상 select 쿼리를 먼저 실행하는 문제가 발생하는데, 이를 어떻게 해결할 수 있나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!