본문 바로가기

Web/기초

[WEB기초] Spring 생성자 주입을 써야하는 이유

생성자 주입을 사용해야하는 이유

  • 객체의 불변성 확보
    • 수정자 주입이나 일반 메소드 주입을 사용하면, 불필요하게 수정의 가능성을 열어두게 된다.
    • SOLID 5원칙 중 OCP 원칙을 지키며 객체의 불변성을 확보할 수 있다.
  • 테스트 코드의 작성
    • 테스트 코드를 순수 자바코드로 작성할 수 있다.
    • 컴파일 시점에 객체를 주입받아 테스트 코드를 작성할수 있으며, 주입하는 객체가 누락된 경우 컴파일 시점에 오류를 발경할 수 있다.
    • 필드 주입의 경우 순수 자바코드로 단위테스트를 작성하는 것이 불가능하다
  • final 키워드 작성 및 Lombok과의 결합
    • final 키워드를 사용할 수 있고, Lombok과의 결합을 통해 코드를 간결하게 작성할 수 있다.
  • 순환 참조 에러 방지
    • 순환 참조 문제를 애플리케이션 구동( 객체의 생성 ) 시점에 파악하여 방지할 수 있다.

의존성 주입 방법

Spring Framework의 핵심 기술중 하나인 DI( Dependency Injection, 의존성 주입)는 3가지 방법이 있다.

1. 생성자 주입( Constreuctor Injection )

생성자 주입은 생성자의 호출 시점에 1회 호출 되는 것이 보장된다. 그렇기 때문에 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용할 수 있다. 또한 Spring framework에서 생성자 주입을 권장하고 있다. 생성자가 1개만 있을 경우에 @Autowired를 생략해도 주입이 가능하도록 편의성을 제공하고 있다.

2. 수정자 주입( Setter Injectoin )

필드 값을 변경하는 Setter를 통해서 의존 관계를 주입하는 방법이다. Setter 주입은 생성자 주입과 다르게 주입받는 객체가 변경될 가능성이 있다.

@Autowired로 주입할 대상이 없는 경우에는 오류가 발생한다. 주입할 대상이 없어도 동작하려면 'required=false'옵션을 통해서 가능하다

3. 필드 주입( Field Injection, @Autowired )

필드 주입을 이용하면 코드가 간결해져서 과거에 상당히 많이 이용되었다. 하지만 필드 주입은 외부에서 변경이 불가능하다는 단점이 존재한다. 테스트 코드의 중요성이 부각됨에 따라 필드의 객체를 수정할 수 없는 필드 주입은 거의 사용되지 않게 되었다. 필드 주입은 반드시 DI 프레임워크가 존재해야 한다.