본문 바로가기

Spring/Spring

(SPRING) 오브젝트와 의존관계 (일반적인 IOC version01)

관심사의 분리

항상 변경이 일어날 것을 염두해 두고 설계를 진행

관심이 같은 것들 끼리 한곳에 모으면 변화가 일어났을시 변화한 관심만을 수정할 수 있다.(관심의 분리)

  • 중복 코드의 메소드 추출

  • 상속을 통한 확장

  • 클래스의 분리

  • 인터페이스의 도입

  • 관계설정 책임의 분리

중복 코드의 메소드 추출 : 중복된 코드를 분리하는 과정

 

public class UserDao{
    
    public void add(User user){
        Connection c = getConnection();
        ....
    }
    public User get(String id){
        Connection c = getConnection();
    }
    public Connection getConnection(){
        //DB 연결 코드 작성
        
        return //Connection 타입
    }
}

DB 연결 부분의 중복된 코드를 메소드로 묶어서 한데 작성

 


상속을 통한 확장 : 기존의 코드를 한단계 더 분리

- 추상클래스, 추상메소드 로의 변경

 

 

UserDao에 있던 메소드를 추상클래스로 변경하여 실질적인 구현을 하위 클래스인 NUsereDao, DUserDao에서 구현

public abstract class UserDao{
     public void add(User user){
        Connection c = getConnection();
        ....
    }
    public User get(String id){
        Connection c = getConnection();
    }
    public abstract Connection getConnection();
    
}

public class NUserDao extends UserDao{
    public Connection getConnection(){
        //구현
    }
}
public class DUserDao extends UserDao{
    public Connection getConnection(){
        //구현
    }
}

 

템플릿 메서드 패턴

: 기능의 일부를 추상메소드, protected 로 설정하여 해당 기능을 하위 클래스에서 구현하는 방법

팩토리 메서드 패턴

: 하위 클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 방법

하위클래스에서 어떤 클래스의 오브젝트를 사용할 것인가를 결정한다.

 

 

NUserDao, DuserDao에서 어떤 Connection 클래스의 오브젝트를 어떻게 생성할 것인가를 결정한다.

*단점 : 자바는 클래스의 다중상속을 지원하지 않기 때문에 상속할 것이 정해지면

​ 다른목적의 상속을 사용할수가 없다.

 


클래스의 분리: 완전히 독립된 클래스로(서브 클래스가 아닌) 만듬

 

public class UserDao{
   private SimpleConnectionMaker simpleConnectionMaker;
   
   public UserDao(){
       simpleConnectionMaker = new simpleConnectionMaker();
   }
   public void add(User user){
       Connection c = simpleConnectionMaker.MakeNewConnection();
       ....
   }
   public User get(String id){
       Connection c = simpleConnectionMaker.MakeNewConnection();
   }
   
}

public class SimpleConnectionMaker {
   public Connection makNewConnection(){
       //DB 연결 코드 작성
   }
}

 

SimpleConnectionMaker이라는 클래스를 따로 만들어서 완전하게 분리

단점 : UserDao 가 SimpleConnectionMaker라는 클래스에 종속적이게 되므로 향상된 방법이 아님

 


인터페이스의 도입 : 서로 긴말하게 연결할 수 있는 연결고리를 생성 (연결고리 : 인터페이스)

 

 

인터페이스를 사용한다면 UserDao는 connectionMaker 인터페이스가 makeConnection()이라는 기능을 가지고 있다는 것에만 관심을 갖지 해당 기능이 어떻게 구현되는지는 관심을 갖지않는다.

 

 

public interface ConnectionMaker{
    public Connection makeConnection();
}

public class DConnectionMaker implements ConnectionMaker{
    public Connection makeConnection(){
        //DConnectionMaker가 독자적인 방법으로 makeConnection 생성
    }
}

public class UserDao{
    private ConnectionMaker connectionMaker;
    //인터페이스를 통해서 필요한 오브젝트에 접근
    public UserDao(){
        connectionMaker = new DConnectionMaker();
        //이부분이 단점! 클래스 이름이 나오므로 완전히 분리되지는 않음을 알 수 있다.
    }
    public void add(User user){
        Connection c = connectionMaker.makeConnection();
        ....
    }
    public User get(String id){
        Connection c = connectionMaker.makeConnection();
    }
}

 

단점 : connectionMaker = new DConnectionMaker();

​ 여전히 구현 클래스를 사용할지를 결정하는 코드가 남아있다.

 


관계설정 책임의 분리 : 클라이언트 오브젝트를 만들어서 인터페이스와 클래스와의 관계를 엮어준다.

 

런타인 오브젝트 관계 만들기 :외부에서 만든 오브젝트를 전달받아서 메소드의 파라미터로 전달받는다.

 

public UserDao {
    public UserDao(ConnectionMaker connectionMaker){
        this.connectionMaker = connectionMaker;
    }
}

public class UserDaoTest {
    
    public static void main(String[] args){
        ConnectionMaker connectionMaker = new DConnectionMaker();
        ConnectionMaker connectionMaker = new NConnectionMaker();
        
        UserDao dao = new UserDao(connectionMaker);
    }
}

UserDaoTest는 UsesrDao와 런타임 오브젝트관계를 유지시켜준다.

 

 

하지만 ! UserDaoTest가 책임이 생겨버렸다. 이것 또한 분리해야한다.

 


팩토리의 등장 : Factory - 객체를 생성 후 돌려준다.

 

public class UserDaoFactory {
    UserDao UserDao() {
        ConnectionMaker connection = new DConnectionMaker();
        UserDao userdao = new UserDao(connection);
        return userdao;
    }
}

public class UserDaoTest {
    public static void main(String args[]){
        UserDao userdao = new UserDaoFactory().UserDao();
    }
}


토비의 스프링 3.1 - Vol.1 스프링의 이해와 원리
국내도서
저자 : 이일민
출판 : 에이콘출판사 2012.09.21
상세보기