Spring에서 의존이란 객체 간의 의존을 의미합니다. 즉 변경에 의해 객체들끼리 영향을 받는 관계를 의미할 수 있습니다.
의존하는 대상이 존재한다면 그 대상을 구하는 방법이 필요합니다.
1. 의존 객체를 직접 생성
public class MemberService {
private MemberDao memberDao = new MemberDao();
public void regist(....) {
.....
}
}
MemberService에서 MemberDao를 직접 생성하므로 MemberService 객체를 생성하는 순간에 MemberDao 객체도 함께 생성됩니다. 의존 객체를 직접 생성한다는 점에서 쉽고 간편하지만 유지보수 관점에서 문제가 발생합니다.
2.DI를 통한 의존 처리
의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식을 사용합니다.
public class MemberService {
private MemberDao;
public MemberService(MemberDao memberDao){
this.MemberDao = memberDao;
}
public void regist(....) {
.....
}
}
직접 의존 객체를 생성했던 코드와는 달리 생성자를 통해서 의존 객체를 주입받습니다.
직접 객체를 생성하는 것과 주입받는 코드를 보면 의존 객체를 생성자로 주입받는 코드가 좀 더 길어 보입니다.
하지만 변경에 유연함을 위해 우리는 DI를 사용합니다
간단히 예를 들면 만약 생성해야 하는 memberDao를 캐시를 적용해야 하는 상황이 온다면 MemberDao를 상속받은 새로운 CachedMemberDao의 객체를 생성해주어야 합니다.
그럼 직접 객체를 생성했던 코드는 변경을 해주어야 합니다.
public class MemberService {
private MemberDao memberDao = new CachedMemberDao();
public void regist(....) {
.....
}
}
물론 서비스는 한 개 가아니라 여러 개일 것입니다. 코드를 찾아 일일이 바꾸어야 합니다.
만약 의존 객체를 사용해 생성자를 통해 의존 주입을 해준 경우라면
MemberDao memberDao = new CachedMemberDao(); //생성되는 객체만 변경
MmeberDaoService service = new MemberDaoService(memberDao);
서비스가 여러 개라도 하나 줄의 코드 변경만 생깁니다. 코드를 집중화시킨 것을 확인할 수 있습니다.
그렇다면 주입을 해주는 코드는 어디에 작성하는 것이 좋을까요? 각 클래스마다 조립하는 것이 흩어져있다면 의존하는 의미가 없을 것입니다. 따라서 하나의 클래스 즉 조립기 클래스를 만들어 의존 주입하는 코드를 만듭니다.
public class Assembler{
private MemberDao memberDao;
private MemberService service;
public Assembler(){
memberDao = new MemberDao();
service = new MemberService(memberDao);
}
public MemberDao getMemberDao(){
return memberDao;
}
public MemberService getMemberService(){
return service
}
}
'Spring|Spring-boot' 카테고리의 다른 글
[Spring] 값 형식 DI (0) | 2020.06.17 |
---|---|
[Spring] DI 설정 (0) | 2020.06.17 |
[spring] @Configuration (0) | 2020.06.17 |
[Spring] Dependency Injection (xml) (0) | 2020.06.16 |
[Spring] IoC 컨테이너 (0) | 2020.06.15 |
댓글