상세 컨텐츠

본문 제목

[1.4] 제어의 역전

토비의스프링

by kwanghyup 2020. 10. 27. 16:57

본문

1. 오브젝트 팩토리 

 

UserDaoTest는  UserDao가 잘 동작하는지 확인하기 위한 테스트 클래스이다.

그런데  ConnectionMaker 구현클래스를 결정하고 

UserDao에 이를 전달하여 생성하는 책임을 맡고 있다.

이는 분명히 문제가 있다.

 

팩토리 클래스를 통하여 이 기능을 분리시켜보자. 

팩토리 역할을 맡은 클래스의 이름을 DaoFactory라 한다. 

그 안에 userDao()메소드를 만들고

ConnectionMaker 구현클래스를 결정하고

UserDao에 이를 전달하여 생성하는 코드를 작성한다. 

public class DaoFactory {
	
	public UserDao userDao() {
		ConnectionMaker connectionMaker = new DConnectionMaker();
		UserDao userDao = new UserDao(connectionMaker);
		return userDao;
	}
}

 

이제 UserDaoTest는 DaoFactory로부터 UserDao를 돌려받아 사용하면된다.

테스트를 하기전에 DB를 초기화하자. 

package springbook.user.dao;

import java.sql.SQLException;

import springbook.user.domain.User;

public class UserDaoTest {
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		 
		// 기존에 ConnectionMaker구현 클래스를 결정하고 UserDao를 생성하는 코드를 제거했다.
		// 팩토리 클래스로부터 UserDao를 돌려받아 사용한다. 
		UserDao dao = new DaoFactory().userDao();
		
		User user = new User();
		user.setId("whiteship");
		user.setName("백기선");
		user.setPassword("married");
		
		dao.add(user);
		
		System.out.println(user.getId() + " 등록성공");
	}
	
}

 

2. 오브젝트 팩토리의 활용

 

DaoFactory에 UserDao가 아닌 다른 DAO생성 기능이 추가 되었다고 하자. 

 

springbook.user.otherdoa패키지를 만들고 그 아래 

다음과 같이 AccountDao, MessageDao클래스를 추가하자. 

package springbook.user.otherdao;

import springbook.user.dao.ConnectionMaker;

public class MessageDao {
	
	private ConnectionMaker connectionMaker; 
	
	public MessageDao(ConnectionMaker connectionMaker) {
		this.connectionMaker = connectionMaker;
	}
	
}
package springbook.user.otherdao;

import springbook.user.dao.ConnectionMaker;

public class AccountDao {
	private ConnectionMaker connectionMaker;
	  
	public AccountDao(ConnectionMaker connectionMaker) {
		this.connectionMaker = connectionMaker;
	}
}

 

그렇다면 DaoFacoty 클래스는 다음의 코드가 추가되어야 할 것이다. 

package springbook.user.dao;

import springbook.user.otherdao.AccountDao;
import springbook.user.otherdao.MessageDao;

public class DaoFactory {
	
	public UserDao userDao() {
		// 기존의 코드 간단히 변경 
		return new UserDao(new DConnectionMaker());
	}
	
	public AccountDao accountDao() {
		return new AccountDao(new DConnectionMaker());
	}
	
	public MessageDao messageDao() {
		return new MessageDao(new DConnectionMaker());
	}
}

 

위 코드는 new DConnectionMaker라는 코드가 반복되어서 나타난다. 

이렇게 되면 ConnectionMaker의 구현 클래스를 바꿀때마다 

모든 메소드를 일일이 수정해야 한다. 

 

현재 사용하고 있는 DConnectionMaker 클래스를 NConnectionMaker클래스로 변경한다면

팩토리 내의 모든 메소드의 코드를 수정해 줘야 한다. 

 

따라서 DConnectionMaker클래스를 생성하는 코드를 

메소드를 만들어 따로 분리하자. 

package springbook.user.dao;

import springbook.user.otherdao.AccountDao;
import springbook.user.otherdao.MessageDao;

public class DaoFactory {
	
	public ConnectionMaker connectionMaker() {
		return new DConnectionMaker(); 
	}
	
	public UserDao userDao() {
		// 기존의 코드 간단히 변경 
		return new UserDao(connectionMaker());
	}
	
	public AccountDao accountDao() {
		return new AccountDao(connectionMaker());
	}
	
	public MessageDao messageDao() {
		return new MessageDao(connectionMaker());
	}
}

 

 

이제 구현클래스를 변경하고 싶다면 connectionMaker() 메소드만 변경하면된다.  

 

DB를 초기화하고 테스트를 수행해본다.

 

 

 

'토비의스프링' 카테고리의 다른 글

[1.6] 싱글톤 레지스트리와 오브젝트 스코프  (0) 2020.10.27
[1.5]Spring IoC  (0) 2020.10.27
[1.3] DAO의 확장  (0) 2020.10.27
[1.2] DAO의 분리  (0) 2020.07.30
[1.1] 초난감DAO  (0) 2020.07.30

관련글 더보기

댓글 영역