1.4.1 오브젝트 팩토리

  • UserDaoTest는 기존에 UserDao가 직접 담당하던 기능, 즉 어떤 ConnectionMaker 구현 클래스를 사용할지를 결정하는 기능을 엉겁결에 떠맡았다. UserDao가 ConnectionMaker 인터페이스를 구현한 특정 클래스로부터 완벽하게 독립할 수 있도록 UserDao의 클라이언트인 UserDaoTest가 그 수고를 담당하게 된 것이다.
  • 그런데 원래 UserDaoTest는 UserDao의 기능이 잘 동작하는지를 테스트하려고 만든 것이 아닌가? 그런데 지금은 또 다른 책임까지 떠맡고 있으니 뭔가 문제가 있다. 성격이 다른 책임이나 관심사는 분리해버리는 것이 지금까지 해왔던 주요한 작업이다. 그러니 이것도 분리하자.
  • 이렇게 분리될 기능은 UserDao와 ConnectionMaeker 구현 클래스의 오브젝트를 만드는 과, 그렇게 만들어진 두 개의 오브젝트가 연결돼서 사용될 수 있도록 관계를 맺어주는 것이다.

팩토리

  • 분리시킬 기능을 담당할 클래스를 하나 만들어보겠다. 이 클래스의 역할은 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것인데, 이런 일을 하는 오브젝트를 흔히 팩토리(factory)라고 한다.
  • 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용하는 것이다. 어떻게 만들지와 어떻게 사용할지는 분명 다른 관심이다.
  • 팩토리 역할을 맡을 클래스는 DaoFactory라고 하자. 그리고 UserDaoTest에 담겨 있던 UserDao, ConnectionMaker 관련 생성 작업을 DaoFactory로 옮기고, UserDaoTest에서는 DaoFatory에 요청해서 미리 만들어진 UserDao 오브젝트를 가져와 사용하게 만든다.
package springbook.uer.dao;

...

public class DaoFactory {
	public UserDao userDao() {
    	// 팩토리의 메소드는 UserDao 타입의 오브젝트를 어떻게 만들고, 어떻게 준비시킬지를 결정한다.
        ConnectionMaker connectionMaker = new DConnectionMaker();
        UserDao userDao = new UserDao(connectionMaker);
        return userDao;
    }
}

[리스트 1-14 UserDao의 생성 책임을 맡은 팩토리 클래스]

  • DaoFactory의 UserDao 메소드를 호출하면 DConnectionMaker를 사용해 DB 커넥션을 가져오도록 이미 설정된 UserDao 오브젝트를 돌려준다.
  • UserDaoTest는 이제 UserDao가 어떻게 만들어지는지 어떻게 초기화되어 있는지에 신경 쓰지 않고 팩토리로부터 UserDao 오브젝트를 받아다가, 자신의 관심사인 테스트를 위해 활용하기만 하면 된다. 이렇게해서 각각이 자신의 책임에만 충실하도록 역할에 따라 분리하는 작업을 마쳤다.
  • 이렇게 수정된 UserDaoTest의 코드는 리스트 1-15와 같다.
public class UserDaoTest {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
      UserDao dao = new DaoFactory().userDao();
      ...
    }

}

[리스트 1-15 팩토리를 사용하도록 수정한 UserDaoTest]

'Review > Spring' 카테고리의 다른 글

토비의 스프링 1장. 1.4 제어의 역전(IoC) part2  (0) 2022.10.09

+ Recent posts