반응형
1.7 의존관계 주입(DI)
DI(Dependency Injection): 오브젝트 레퍼런스를 외부로부터 주입받고 이를 통해 오브젝트와 다이내믹하게 의존관계가 만들어지는 것
- DaoFactory처럼 객체를 생성하고 관계를 맺어주는 등의 작업을 담당하는 기능을 일반화한 것이 스프링의 IoC 컨테이너
의존관계 주입
- 일어나는 방법에 초점을 맞춘 것
런타임 의존관계 설정
의존관계
- 누가 누구에게 의존하는 관계
- 의존관계는 방향성이 존재함
UserDao
의 의존관계UserDao
가ConnectionMaker
에 의존하는 형태ConnectionMaker
의 변화는UserDao
에도 영향을 줌ConnectionMaker
인터페이스를 구현한 클래스의 변화는UserDao
에 영향을 주지 않음- 인터페이스에 대해서만 의존관계 형성 - 서로의 관계를 느슨하게 = 낮은 결합도
- 의존 오브젝트(Dependent Object): 실제 사용대상 ex) NConnectionMaker, DConnectionMaker
- 의존관계 주입의 세가지 조건
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않음. 그러기 위해서는 인터페이스에만 의존하고 있어야 함
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정
- 의존관계는 사용할 오브젝트에 대한 레퍼펀스를 외부에서 주입해줌으로써 만들어
의존관계 검색과 주입
Dependency Lookup(의존관계 검색)
- 외부로부터 주입이 아닌 스스로 검색
- 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾음
- 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지 않음
- 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성 작업은 외부 컨테이너에 IoC로 맡김
DaoFactory를 이용하는 생성자
public UserDao() { DaoFactory daoFactory = new DaoFactory(); this.connectionMaker = daoFactory.connectionMaker(); }
의존관계 검색을 이용하는 UserDao 생성자
public UserDao() { AnnotationConfigApplicationContext context = new AnnotationConfigApplication(DaoFactory.class); this.connectionMaker = context.getBean("connectionMaker", ConnectionMaker.class); }
의존관계 검색 vs 의존관계 주입
- 의존관계 검색에서는 검색하는 오브젝트는 자신이 스프링 빈일 필요가 없음
- 의존관계 주입에서는 UserDao와 ConnectionMaker 사이에 DI가 적용되려면 UserDao도 반드시 컨테이너가 만드는 빈 오브젝트여야함
의존관계 주입의 응용
기능 구현의 교환
- DI의 설정정보에 해당하는 DaoFactory만 다르게 만들어두면 개발, 운영 시에 각각 다른 런타임 오브젝트에 의존관계를 갖게함
부가 기능 추가
- DAO가 DB를 얼마나 많이 사용하는지 확인하는 방법
- DAO와 DB커넥션을 만드는 오브젝트 사이에 연결횟수를 카운팅하는 오브젝트 하나 더 추가
- DAO가 DB를 얼마나 많이 사용하는지 확인하는 방법
메소드를 이용한 의존관계 주입
- 생성자 이용 방법
- 수정자(setter) 메소드를 이용한 주입
- 외부에서 오브젝트 내부 속성 값을 변경하려는 용도로 사용
- 파라미터로 전달된 값을 내부 인스턴스 변수에 저장
- 일반 메서드를 이용한 주입
- 수정자의 경우 한 번에 한 개의 파라미터만 가질 수 있음
- 여러개의 파라미터로 의존관계 주입을 하기 위해서는 일반 메서드 활용
반응형
'개인 공부 > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링] 2.1 UserDaoTest 다시 보기 (0) | 2021.07.26 |
---|---|
[토비의 스프링] 1.8 XML을 이용한 설정 (0) | 2021.07.25 |
[토비의 스프링] 1.6 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2021.07.21 |
[토비의 스프링] 1.5 스프링의 IoC (0) | 2021.07.20 |
[토비의 스프링] 1.4 제어의 역전(IoC) (0) | 2021.07.19 |