본문 바로가기

Spring

[Spring] Spring의 DI: 생성자 주입 vs 필드 주입

결론부터 말하면 생성자 주입이 더 좋다.

스프링 공식 문서에서도 생성자 주입 사용하는 것을 권고하고 있다.

생성자 주입

@RestController
@RequiredArgsConstructor
public class Example {
    private final HelloService helloService;
}

필드 주입

@RestController
public class Example {

    @Autowired
    private HelloService helloService;
}

 

 

생성자 주입이 더 좋은 이유

1. 순환 참조 방지

순환 참조가 발생할 경우 애플리케이션 자체가 구동되지 않아서 사전에 오류를 방지할 수 있다.

필드 주입같은 경우는 순환 참조가 발생해도 구동한다. (메소드 실행 시점까지 되어야 서버 꺼짐.)

순환 참조: 객체 A가 객체 B를 참조하고, 다시 객체 B가 객체 A를 참조하면서 발생하는 문제

2. 객체의 불변성

생성자 주입은 final이 사용 가능하기 때문에 실행 중에 객체가 변하는 것을 막을 수 있다.

3. 테스트 코드 용이

필드 주입같은 경우는 Mockito를 사용하는 등 해야하지만, 생성자 주입같은 경우는 단순히 원하는 객체 생성한 후에, 생성자에 넣어주면 됨.