프로그램/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;
        }
    }
}