public class UserDao{
private ConnectionMaker connectionMaker;
public UserDao(ConnectionMaker connectionMaker){
this.connectionMaker = connectionMaker;
}
...
}
DI컨테이너는 자신이 결정한 의존관계를 맺어줄 클래스의 오브젝트를 만들고 이 생성자의 파라미터로 오브젝트 레퍼런스를 전달. 바로 위의 코드가 이 과정의 작업을 위해 필요한 전형적인 코드. 이렇게 생성자 파라미터를 통해 전달받은 런타임 의존관계를 갖는 오브젝트는 인스턴스 변수에 저장해둔다.
※ DI를 받는다?
DI의 동작방식은 이름 그대로 외부로부터의 주입. 하지만 단지 외부에서 파라미터로 오브젝트를 넘겨줬다고해서, 즉 주입해줬다고해서 모두가 DI가 아니라는점을 주의할 것. 주입받는 메소드 파라미터가 이미 특정 클래스 타입으로 고정되어 있다면 DI가 일어날 수 없다. DI서 말하는 주입은 다이나믹하게 구현 클래스를 결정해서 제공받을 수 있도록 인터페이스 타입의 파라미터를 통해 이루어져야함.
[메소드를 이용한 의존관계 주입]
생성자가 아닌 일반 메소드를 이용해 의존 오브젝트와의 관계를 주입해주는 데는 2가지 방법이 있음.
1) 수정자 메소드를 이용한 주입
수정자(Setter) 메소드는 외부에서 오브젝트 내부의 애트리뷰트 값을 변경하려는 용도로 주로 사용. 메소드는 항상 Set으로 시작. Setter 메소드의 핵심기능은 파라미터로 전달된 값을 보통 내부의 인스턴스 변수에 저장하는 것.
2) 일반 메소드를 이용한 주입
Setter처럼 set으로 시작해야하고 한 번에 한 개의 파라미터만 가질 수 있다는 제약이 싫을때 여러 개의 파라미터를 갖는 일반 메소드를 DI용으로 사용 할 수 있음. 생성자가 수정자 메소드보다 나은 점은 한 번에 여러 개의 파라미터를 받을 수 있다는 점.
public class UserDao{
private ConnectionMaker connectionMaker;
public void setConnectionMaker(ConnectionMaker connectionMaker){
this.connectionMaker = connectionMaker;
//수정 메소드 DI의 전형적인 코드.
}
...
}
//수정자 메소드 DI를 사용하는 팩토리 메소드
@Bean
public User userDao(){
UserDao userDao = new UserDao();
userDao.setConnectionMaker(connectionMaker());
return userDao;
}
//수정자 메소드 DI를 사용해 UserDao 타입의 빈을 만드는 DaoFactory의 userDao() 메소드
수정자 메소드 DI 방식을 사용한 UserDao. 확실하게 기억해둘것. 보통은 IDE의 자동생성 기능을 이용하는편.
@Bean 메소드를 통해 얻을 수 있는 빈의 DI 정보 3가지
1) 빈의 이름 : @Bean 메소드 이름이 빈의 이름. 이 이름은 getBean()에서 사용
2) 빈의 클래스 : 빈 오브젝트를 어떤 클래스를 이용해서 만들지 정의
3) 빈의 의존 오브젝트 : 빈의 생성자나 수정자 메소드를 통해 의존 오브젝트를 넣어줌. 의존 오브젝트도 하나의 빈이므로 이름이 있을 것이고, 그 이름에 해당하는 메소드를 호출해서 의존 오브젝트를 가져온다. 의존 오브젝트는 하나 이상일수도 있음.
<클래스 설정과 XML 설정의 대응 항목>
Java 설정정보 | XML 설정정보 | |
빈 설정파일 | @Configuration | <beans> |
빈의 이름 | @Bean methodName() | <bean id="methodName" |
빈의 클래스 | return new BeanClass(); | class="a.b.c... BeanClass"> |
[DataSource 인터페이스로 전환]
DataSource는 DB커넥션을 가져오는 오브젝트의 기능을 추상화해서 비슷한 용도로 사용 할 수 있게 해주는 존재.
출처 : 토비의 스프링 Vol. 1
'JAVA' 카테고리의 다른 글
[Spring] 3장 템플릿 (0) | 2021.06.24 |
---|---|
[Spring] 2장 테스트 (0) | 2021.06.14 |
[Spring] 1장 오브젝트와 의존관계(3) (0) | 2021.06.09 |
[Spring] 1장 오브젝트와 의존관계(2) (0) | 2021.06.08 |
[Spring] 1장 오브젝트와 의존관계(1) (0) | 2021.06.07 |