IoC는 Inversion of Conrol (제어의 역전)의 약자이다.
현재 UserDao의 클라이언트 오브젝트인 main은 2개의 관심사를 갖고 있다.
위 2개의 관심사 까지 분리해보도록 하겠다.
정의
디자인 패턴에서의 팩토리 메소드 패턴이나 추상 팩토리 패턴과는 다른 개념이다.
사용 목적
UserDao의 생성 책임을 맡은 팩토리 클래스
public class DaoFactory {
public UserDao userDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao userDao = new UserDao(connectionMaker);
return userDao;
}
}
팩토리를 사용하도록 수정한 main
public class main {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
UserDao userDao = new DaoFactory().userDao();
...
}
}
DaoFactory에 UserDao가 아닌 다른 DAO의 생성 기능을 넣으면 어떻게 될까?
DaoFactory에 AccountDao, MessageDao 등을 만듦
public class DaoFactory {
public UserDao userDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao userDao = new UserDao(connectionMaker);
return userDao;
}
public AccountDao accountDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
AccountDao accountDao = new AccountDao(connectionMaker);
return accountDao;
}
public MessageDao messageDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
MessageDao messageDao = new MessageDao(connectionMaker);
return messageDao;
}
}
문제점
3개의 메소드에 ConnectionMaker 구현 클래스를 선정하고 생성하는 코드의 중복이 발생한다.
해결법
중복이 발생하는 ConnectionMaker 구현 클래스를 선정하고 생성하는 코드를 별도의 메소드로 뽑아낸다.
public class DaoFactory {
public UserDao userDao() {
UserDao userDao = new UserDao(connectionMaker());
return userDao;
}
public AccountDao accountDao() {
AccountDao accountDao = new AccountDao(connectionMaker());
return accountDao;
}
public MessageDao messageDao() {
MessageDao messageDao = new MessageDao(connectionMaker());
return messageDao;
}
public ConnectionMaker connectionMaker() {
// 분리해서 중복을 제거한 ConnectionMaker 타입 오브젝트 생성 코드
return new DConnectionMaker();
}
}
효과
오브젝트(Client)는 자신이 사용할 오브젝트를 스스로 선택하지도, 생성하지도 않는다.
모든 제어 권한은 다른 특별한 오브젝트(설계도)에게 위임되어 있다.
UserDao가 어떤 ConnectionMaker의 구현 클래스를 사용할지는 DaoFactory에 의해 정해진다.
main은 DaoFactory가 만들고 초기화하여 리턴해주는 dao만 사용할 수 있다.
IoC활용의 장점
IoC는 프레임워크 없이도 단순 코드 설계만으로도 사용가능하다.
스프링 프레임워크는 이러한 IoC를 극한까지 적용하는 프레임워크이다.
소스코드 : github