본문 바로가기

Spring

템플릿 메소드 패턴 / 팩토리 메소드 패턴

UserDAO 의 작성 예시를 보여주겠다.

 

userDAO를 작성할떄 , 관심사가 같은것끼리 객체 안으로 모이게하고,

                             관심사가 다른것은 따로 떨어져서 서로 영향을 주지 않도록 분리한다.

[1-1]  UserDAO 의 관심사항은 

  - 유저를 추가하는것, 유저를 검색하는것 ( 데이터 access 로직 구현 )

    이외에도

  - DB연결 (  DB, DB드라이버 등 ) 이 있다.

 

이때 , 연결및 DB에 대한 정보는 다를수 있으므로 protected 또는 abstract 매소드 로 지정해놓게 된다.

 

예시를 들겠다.

 

public abstract class UserDao {
    public void add(User user) throws Exception {
        Connection c = getConnection();
        ...
    }   
    public void get(String id) throws Exception {
        Connection c = getConnection();
        ...
    }
    protected SpecialGetPasswordById() throws Exception{
    	Exception;
    }  //protected함수는 override를 선택적으로 할 수 있다.( 템플릿메소드패턴)
    public abstract Connection getConnection() throws Exception {
        SQLException;
    } //abstract를 사용했으므로 ,  필히 override해주어야한다. ( 팩토리메소드패턴)
}

[1-2[  상속을 사용한 확장의 한계

 자바는 다중 상속이 불가능하므로, (상속을 사용한 클래스는 다른 클래스의 상속을 허용치않음)  이를 더 확장하는 방법은 없을까 ? 알아보도록 하겟다.

 

 

interface를 이용하여 DB connection 을 회사별로 관리해줄것이다.

public interface Connection{
	Connecction newConnection();
}

public class EConnection implement Connection{
	public Connection newConnection();
}

public abstract class UserDao{
	Connection conn;
    //DB접근 관련 관심  ( interface사용 with 매개변수를 통한 회사주입을 클라이언트가 할수 있도록 완벽한 관심 분리) 
    public UserDao(Connection connection){//생성자 에 connection을 매개변수로 넣어줘서 클라이언트가 원하는 회사를 입력할수 있게함.
      this.conn = connection.newConnection();
    }
   //이아래부터는 유저관련 관심
    public void add(User user){
    	Connection c =conn.newConnection();
    }

    public void delete(User user){
    	Connection c =conn.newConnection();
    }
}

 

  • 개방 폐쇄 원칙(OCP): 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다. 즉, UserDao는 DB 연결 방법에는 얼마든지 열려있지만 핵심 기능을 구현한 코드는 그런 변화에 영향을 받지 않는다.

 

  • 낮은 결합도: 책임과 관심사가 다른 오브젝트 또는 모듈과는 낮은 결합도. 즉, 느슨하게 연결된 형태를 유지하는 것이 중요하다.
    • ConnectionMaker 인터페이스의 도입으로 DB 연결 기능이 바뀌더라도 DAO의 코드는 변경될 필요가 없어졌다.  결합도가 낮아진 것.