생성자 주입을 사용해야하는 이유
- 객체의 불변성 확보
- 수정자 주입이나 일반 메소드 주입을 사용하면, 불필요하게 수정의 가능성을 열어두게 된다.
- 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 프레임워크가 존재해야 한다.
'Web > 기초' 카테고리의 다른 글
[WEB기초] REST API vs GraphQL 차이점 (0) | 2021.08.20 |
---|---|
[WEB기초] 싱글톤 패턴(Singleton Pattern) (0) | 2021.08.06 |
[WEB기초] DI(Dependency Injection) - 의존성 주입 (0) | 2021.01.18 |
[WEB기초] web.xml (0) | 2021.01.10 |
[WEB기초] Servlet이란 (0) | 2021.01.10 |