public class MemberRegisterService{
//의존 객체를 직접 생성
private MemberDao memberDao = new MemberDao();
public void regist(RegisterRequest req){
Member member = memberDao.selectByEmail(req.getEmail());
//이메일이 DB에 이미 존재할 때 예외 처리
if (member!=null){
throw new DuplicateMemberException("duplicated email "+req.getEmail());
}
//신규 가입이 가능할 때 DB에 insert()
Member newMember=new Member(
req.getEmail(), req.getPassword(), req.getName(), LocalDateTime.now()
);
memberDao.insert(newMember);
}
}
//의존하는 MemberDao 객체도 함께 생성
MemberRegisterService svc = new MemberRegisterService();
💡 Dependency Injection은 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식을 사용한다.
public class MemberRegisterService{
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao){
this.memeberDao=memberDao;
}
}
MemberDao dao = new MemberDao();
//의존 객체를 생성자를 통해 주입한다.
MemberRegisterServcie svc = new MemberRegisterService(dao);
회원 데이터의 빠른 조회를 위해 캐시를 적용해야 하는 상황이 발생했다고 가정하자. MemberDao 클래스를 상속받은 CachedMemberDao 클래스를 생성한다.
public class CachedMemberDao extends MemberDao{
...
}
//변경전
public class MemberRegisterService{
private MemberDao memberDao = new MemberDao();
}
//변경후
public class MemberRegisterService{
private MemberDao memberDao = new ChachedMemberDao();
}
//변경전
MemberDao memberDao = new MemberDao();
MemberRegisterService regSvc = new MeberRegisterService(MemberDao);
//변경후
MemberDao memberDao = new CachedMemberDao();
MemberRegisterService regSvc = new MeberRegisterService(MemberDao);
💡 DI를 사용하면 MemberDao 객체를 사용하는 클래스가 여러 개여도 변경할 곳은 의존 주입 대상이 되는 객체를 생성하는 코드 한 곳 뿐이다.