프로그램/pattern
Factory Pattern 을 이용한 비지니스 - DAO 연결
이승구
2009. 7. 9. 15:48
반응형
Spring 관련 책을 보다가 EJB나 Spring 같은 Container 을 사용하지 않고 개발하던 시절에
쓰던 방법이라고 하면서 소개되어 있었음.
이를 옮김.
DAO 부분에 UserDAOFactory 클래스가 존재하며 이 클래스는
UserDAO 형태의 Interface 로 결과값을 넘김.
결국 UserDAO 를 상속받은 클래스들을 작성하며 DAO 반환시 매개변수로 넘어온 값에 따라
OracleUserDAO 나 MySqlUserDAO 를 넘겨주게 됨.
Service.UserService.java : 서비스 객체로 DAO 객체를 얻어와 DAO 메서드를 실행하게 된다.
package factorypattern.service;
import factorypattern.dao.UserDAO;
import factorypattern.dao.UserDAOFactory;
import factorypattern.model.User;
/**
* 싱글턴 패턴을 이용하여 Service 를 구현함.
* 실제 JSP페이지에서 호출하는 클래스가 됨
*
* @author lsk
* @since 2009.06.21
*
*/
public class UserService {
private static UserService userService = null;
static {
userService = new UserService();
}
// Single Pattern 구현을 위해 생성자는 private 처리 한다.
private void userser() {
}
public UserService getInstance() {
return userService;
}
private UserDAO getUserDAO() {
return UserDAOFactory.getUserDAO(UserDAOFactory.ORACLE_DB);
}
/*
* 메서드 내에서는 DB접근을 getUserDAO 메서드를 이용하여 접근한다.
* 이를 통해서 UserService 와 UserDao 와의 관계가 느슨해짐을 알수 있다.
*/
public int addUser(User user) throws Exception {
return 0;
}
}
model.User.java : 모델클래스
package factorypattern.model;
/**
* 팩토리 패턴에서 사용할 모델을 생성한다.
* BaseObject를 상속받아 사용한다.
*
* @author lsk
* @since 2009.06.21
*
*/
public class User extends BaseObject {
private String userId = null;
private String password = null;
private String name = null;
private String email = null;
// public User() {
// // TODO Auto-generated constructor stub
// }
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package factorypattern.model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* commons-lang 를 이용한 기본 객체 만들기
* 자바지기 Spring 프레임워크 워크북 참조
*
* @author lsk
* @since 2009.06.21
*
*/
public class BaseObject implements Serializable {
public String toString() {
// ToStringBuilder.relfectionToString 을 통해 내부 멤버변수의 값을 모두 찍어준다.
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, 0);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
dao.UserDAO.class : 넘겨지는 interface이며 이 안에 구현해야 할 메서드가 작성되어 있어야 하고 이를 구현하는 클래스들에는 실제 코딩이 이루어진다.
package factorypattern.dao;
import factorypattern.model.User;
/**
* DAO의 베이스가 될 interface
* Factory Pattern 에 대한 샘플이므로 각 메서드에 대한 Exception 은 Exception 객체로 통일한다.
*
* @author lsk
* @since 2009.06.21
*
*/
public interface UserDAO {
public int insert(User user) throws Exception;
public int update(User user) throws Exception;
public int delete(String userId) throws Exception;
public int findUser(String userId) throws Exception;
public int findUserList() throws Exception;
public boolean existedUser(String userId) throws Exception;
}
package factorypattern.dao;
import factorypattern.model.User;
public class OracleUserDAO implements UserDAO {
public int delete(String userId) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public boolean existedUser(String userId) throws Exception {
// TODO Auto-generated method stub
return false;
}
public int findUser(String userId) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int findUserList() throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int insert(User user) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int update(User user) throws Exception {
// TODO Auto-generated method stub
return 0;
}
}
dao.UserDaoFactory.java : DAO르 서비스객체로 반환하는 클래스
package factorypattern.dao;
public class UserDAOFactory {
public static int MYSQL_DB = 0;
public static int ORACLE_DB = 1;
// 객체생성을 막기 위해 기본생성자를 private로 선언한다.
private UserDAOFactory() {
}
public static UserDAO getUserDAO(int userDB) {
if(userDB == MYSQL_DB) {
return new OracleUserDAO();
}
else if(userDB == ORACLE_DB) {
return new OracleUserDAO();
} else {
return null;
}
}
}
쓰던 방법이라고 하면서 소개되어 있었음.
이를 옮김.
DAO 부분에 UserDAOFactory 클래스가 존재하며 이 클래스는
UserDAO 형태의 Interface 로 결과값을 넘김.
결국 UserDAO 를 상속받은 클래스들을 작성하며 DAO 반환시 매개변수로 넘어온 값에 따라
OracleUserDAO 나 MySqlUserDAO 를 넘겨주게 됨.
Service.UserService.java : 서비스 객체로 DAO 객체를 얻어와 DAO 메서드를 실행하게 된다.
package factorypattern.service;
import factorypattern.dao.UserDAO;
import factorypattern.dao.UserDAOFactory;
import factorypattern.model.User;
/**
* 싱글턴 패턴을 이용하여 Service 를 구현함.
* 실제 JSP페이지에서 호출하는 클래스가 됨
*
* @author lsk
* @since 2009.06.21
*
*/
public class UserService {
private static UserService userService = null;
static {
userService = new UserService();
}
// Single Pattern 구현을 위해 생성자는 private 처리 한다.
private void userser() {
}
public UserService getInstance() {
return userService;
}
private UserDAO getUserDAO() {
return UserDAOFactory.getUserDAO(UserDAOFactory.ORACLE_DB);
}
/*
* 메서드 내에서는 DB접근을 getUserDAO 메서드를 이용하여 접근한다.
* 이를 통해서 UserService 와 UserDao 와의 관계가 느슨해짐을 알수 있다.
*/
public int addUser(User user) throws Exception {
return 0;
}
}
model.User.java : 모델클래스
package factorypattern.model;
/**
* 팩토리 패턴에서 사용할 모델을 생성한다.
* BaseObject를 상속받아 사용한다.
*
* @author lsk
* @since 2009.06.21
*
*/
public class User extends BaseObject {
private String userId = null;
private String password = null;
private String name = null;
private String email = null;
// public User() {
// // TODO Auto-generated constructor stub
// }
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package factorypattern.model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* commons-lang 를 이용한 기본 객체 만들기
* 자바지기 Spring 프레임워크 워크북 참조
*
* @author lsk
* @since 2009.06.21
*
*/
public class BaseObject implements Serializable {
public String toString() {
// ToStringBuilder.relfectionToString 을 통해 내부 멤버변수의 값을 모두 찍어준다.
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, 0);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
dao.UserDAO.class : 넘겨지는 interface이며 이 안에 구현해야 할 메서드가 작성되어 있어야 하고 이를 구현하는 클래스들에는 실제 코딩이 이루어진다.
package factorypattern.dao;
import factorypattern.model.User;
/**
* DAO의 베이스가 될 interface
* Factory Pattern 에 대한 샘플이므로 각 메서드에 대한 Exception 은 Exception 객체로 통일한다.
*
* @author lsk
* @since 2009.06.21
*
*/
public interface UserDAO {
public int insert(User user) throws Exception;
public int update(User user) throws Exception;
public int delete(String userId) throws Exception;
public int findUser(String userId) throws Exception;
public int findUserList() throws Exception;
public boolean existedUser(String userId) throws Exception;
}
package factorypattern.dao;
import factorypattern.model.User;
public class OracleUserDAO implements UserDAO {
public int delete(String userId) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public boolean existedUser(String userId) throws Exception {
// TODO Auto-generated method stub
return false;
}
public int findUser(String userId) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int findUserList() throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int insert(User user) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public int update(User user) throws Exception {
// TODO Auto-generated method stub
return 0;
}
}
dao.UserDaoFactory.java : DAO르 서비스객체로 반환하는 클래스
package factorypattern.dao;
public class UserDAOFactory {
public static int MYSQL_DB = 0;
public static int ORACLE_DB = 1;
// 객체생성을 막기 위해 기본생성자를 private로 선언한다.
private UserDAOFactory() {
}
public static UserDAO getUserDAO(int userDB) {
if(userDB == MYSQL_DB) {
return new OracleUserDAO();
}
else if(userDB == ORACLE_DB) {
return new OracleUserDAO();
} else {
return null;
}
}
}