DI(Dependency Injection)
- 클래스들간에 직접적인 의존 관계를 맺는 것보단 느슨하게 인터페이스를 통해 의존관계를 맺어, 결합도를 낮추는 것이 중요
- 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
- 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입
- DI컨테이너를 통해 서로 강하게 결합된 두클래스를 분리 및 두 객체간의 관계를 결정하여 결합도를 낮추고 유연성을 확보
장점
- 의존관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈들간의 결합도를 낮출 수 있다.
- 코드 재사용성이 높음
- 모의 객체 등을 이용한 단위 테스트의 편의성을 높여준다.
의존성 주입의 종류
생성자 주입, 필드 주입, Setter 주입
생성자 주입
생성자에 @Autowired Annotation(어노테이션)을 붙인다.
장점
- 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함
- 테스트 코드 작성시 생성자를 통해 의존성 주입이 용이
- 의존성 주입 대상 필드를 final로 불변 객체 선언할 수 있음
단점
- 순환참조는 생성자 주입으로 해결하기 어려움리커시브 형태
- primary 어노테이션 조사해보기
필드 주입
변수 선언부에 @Autowired 어노테이션을 붙인다.
장점
- 가장 간단한 방식
단점
- 의존관계가 추상적이고, 의존관계가 복잡해질 수 있음
- DI Container와 강한 결합을 가져 외부 사용이 용이하지 않음
- 단위 테스트시 의존성 주입이 용이 하지 않음
- 의존성 주입 대상 필드가 final선언 불가
Setter 주입
Setter 메소드에 @Autowired 어노테이션을 붙인다.
장점
- 생성자에 선택적으로 나눠 주입할수 있어 부담을 덜어줌
- 생성자 주입 방법과 Setter 주입 방법을 적절하게 상황에 맞게 분배하여 사용
단점
- 의존성 주입 대상 필드가 final선언 불가
참고
'JAVA & Spring > Spring' 카테고리의 다른 글
JPA EntityManager의 Thread-safe 이해하기 (0) | 2024.06.02 |
---|---|
JPA의 동작 원리 (0) | 2024.05.20 |
JPA 구성요소와 기본 이해 (0) | 2023.09.18 |