JPA 생성자 주입

pepe·2025년 11월 17일

JPA는 왜 기본생성자가 필요할까

  1. JPA구현체에서(Hibernate) 엔티티를 다룰 때
    1. DB에서 row 읽기
    2. 1의 결과를 자바 객체로 만들기
    3. 그런데 그 객체를 만들 때 내가 작성한 생성자를 직접 호출하는 게 아니고, 프레임워크가 리플렉션을 사용해서 new를 대신 해준다.
    이 때 기본 생성자가 필요한 것이다.

  2. 프록시(proxy)


그럼 리플렉션이 무엇인가

개발자는 코드를 작성할 때 타입이 다 정해진 상태에서 코딩한다. 하지만 프레임워크는 어떤 클래스를 다뤄야 할지 미리 모르는 경우가 많다.
문자열이나 메타데이터로 클래스 이름만 알고 있는 경우가 많다.
그 클래스 안에 어떤 필드, 메서드가 있는지 runtime에 확인해야 한다. 이걸 가능하게 해주는 게 바로 리플렉션이다.

  • 코드가 자기 자신의 구조(클래스, 메서드, 필드)를 runtime에 조사하고 조작하는 기능
Class<?> clazz = Class.forName("com.example.Member");

// 기본 생성자 가져오기
Object obj = clazz.getDeclaredConstructor().newInstance();
System.out.println(obj);

필드 주입은 안쓰는 추세이다.

@Configuration
public class BaseInitData {

	@Autowired
    private PostService postService;
    //             ↓ 
    ...

생성자 주입으로 바꾸기

@Configuration
public class BaseInitData {

    private final PostService postService;
    
    @Autowired //생성자 주입의 경우 생략 가능하다.
    public BaseInitData(PostService postService) {
        this.postService = postService;
    }
    ...
    //             ↓ 

lombok과 함께 더 깔끔하게 쓸 수 있다.

@Configuration
@RequiredArgsConstructor
public class BaseInitData {

    private final PostService postService;
    ...

필드 주입에서 생성자 주입으로 바뀐 이유

  1. 테스트하기 더 쉽다
  2. 불변성 보장
  3. 필수 의존성을 생성자에서 강제할 수 있다 (없으면 객체 생성 자체가 안 됨)
profile
pepe

0개의 댓글