
DI(Dependency Injection, 의존성 주입)
- 객체 지향 프로그래밍에서 객체 간의 의존 관계를 관리하는 중요한 개념
- 단순히 객체 간의 연결 설정 X
⇒ 코드 구조 유연성 ⬆️ 및 테스트 용이성 ⬆️을 위함 - IoC의 구제적인 구현 방식 중 하나
DI 기본 원리
: 객체가 다른 객체를 직접 생성 및 관리 X
⇒ 외부에서 주입 받음
⇒ 객체 간 결합도 ⬇︎, 응집도 ⬆︎
1. 과거 프로그래밍 - 객체 간 의존성 직접 관리
public class A { private B b; public A() { this.b = new B(); // A는 B에 직접 의존 } public void doSomething() { b.performTask(); } }
2. 현대 프로그래밍 - IoC를 통한 DI
public class A { private B b; public A(B b) { // B는 외부에서 주입됨 this.b = b; } public void doSomething() { b.performTask(); } }
DI의 3가지 방식
1. 생성자 주입(Constructor Injection) : 의존성을 생성자 파라미터로 주입받는 방식
- 예시 -
public class A { private final B b; public A(B b) { this.b = b; // 생성자를 통해 B가 주입됨 } public void doSomething() { b.performTask(); } }
- 장점
1. 클래스 초기화될 때, 모든 의존성이 주입됨
⇒ 클래스가 불완전한 상태로 존재할 가능성 ⬇︎
2. 의존성이 변경되지 않게 강제함
- 단점
1. 의존성 개수 증가 ⇒ 파라미터 목록 증가
2. 순환 의존성 존재 시 해결 어려움
2. Setter 주입(Setter Injection) : 객체가 초기화된 후, 별도 Setter 메서드를 통해 의존성을 주입받는 방식
- 예시 -public class A { private B b; public void setB(B b) { this.b = b; // 세터를 통해 B가 주입됨 } public void doSomething() { b.performTask(); } }
- 장점
1. 선택적 의존성 주입에 유용 ⇒ 유연성 ⬆︎
2. 순환 의존성 쉽게 해결 가능
- 단점
1. 클래스가 불완전한 상태로 존재 가능
2. 의존성 불변 X
3. 필드 주입(Field Injection) : 의존성을 클래스의 필드에 직접 주입하는 방식
- 예시 -public class A { @Autowired private B b; // 필드에 직접 B가 주입됨 public void doSomething() { b.performTask(); } }
- 장점
1. 주입 관련 코드 최소화
2. 테스트 코드에서 주로 사용되고, 간단한 테스트 객체 생성에 유리
- 단점
1. 클래스 외부에서 의존성 주입 불가 ⇒ Test 어려움!
2. Spring Container 외부에서 객체 생성 시, Injection 작동 X
3. 순환 의존성 발생 가능 및 코드 유연성 ⬇︎
출처는 필기하며 참고한 블로그 찾으면 바로 업데이트 하겠습니다.
'Framework > Spring' 카테고리의 다른 글
IoC(Inversion of Control)/ IoC Container (2) | 2024.10.08 |
---|---|
Servlet, Servlet Container, DispatcherServlet (0) | 2024.09.30 |
안녕하세요. 성장하고 싶은 개발자 orElse입니다. 지켜봐주세요.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!