Spring/스프링의 이해와 원리

오브젝트와 의존관계 - 3. DB 커넥션 독립 / 디자인 패턴

JWonK 2022. 7. 13. 22:17
728x90
반응형

UserDao의 커넥션 만들기를 관심사의 분리를 통해 변화에 좀 더 유연하게 대처할 수 있는 코드를 만들었다.

근데 만약 다른 환경에서 위 코드를 사용하고 싶은데 각 환경마다 DB가 달라 매 번 커넥션을 가져올 때마다 변경될 가능성이 존재하면 어떻게 해야할까?

 

상속을 통한 확장

기존 UserDao 코드에서 한 단계 더 분리해보자.

getConnection()을 추상 메소드로 만들어놓는다. 추상 메소드라서 메소드 코드는 없지만 메소드 자체는 존재한다.

public abstract Connection getConnection() throws ClassNotFoundException, SQLException;

 

위와 같은 추상 메소드를 만들어놓고

public class AUserDao extends UserDao{
    public Connection getConnection() throws ClassNotFoundException, SQLException{
        // A의 DB 커넥션 생성 코드
    }
}

public class BUserDao extends UserDao{
    public Connection getConnection() throws ClassNotFoundException, SQLException{
        // B의 DB 커넥션 생성 코드
    }
}

위 처럼 구현 메서드를 만드는 것이다.

 

 

클래스 계층구조를 통해 두 개의 관심이 독립적으로 분리되면서 변경 작업은 한층 용이해졌다.

이제 UserDao는 변경이 용이하다 수준을 넘어 확장이 가능해진 것이다.

 

이렇게 슈퍼클래스에 기본적인 로직의 흐름을 만들어 놓고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메서드 등으로 만든 뒤 서브클래스에서 이런 메서드를 필요에 맞게 구현해서 사용하도록 하는 방법을 디자인 패턴에서 템플릿 메서드 패턴이라고 한다.

 

UserDao의 getConnection() 메서드는 Connection 타입 오브젝트를 생성한다는 기능을 정의해놓은 추상 메서드이다.

그리고 UserDao의 서브 클래스의 getConnection() 메서드는 어떤 Connection클래스의 오브젝트를 어떻게 생성할 것인지 결정하는 방법이라고도 볼 수 있다. 

 

이렇게 서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것을 팩토리 메서드 패턴이라고 부르기도 한다.

 

 


 

템플릿 메서드 패턴

상속을 통해 슈퍼 클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법이다.

변하지 않는 기능은 슈퍼클래스에서 만들어두고 자주 변경되며 확장할 기능은 서브클래스에서 만든다.

슈퍼클래스에서는 미리 추상 메서드 또는 오버라이드 가능한 메서드를 정의해두고 이를 활용해 코드의 기본 알고리즘을 담고 있는 템플릿 메서드를 만든다. 슈퍼클래스에서 디폴트 기능을 정의해두거나 비워뒀다가 서브 클래스에서 선택적으로 오버라이드 할 수 있도록 만들어준 메서드를 훅(hook) 메서드라고 한다.

서브 클래스에서는 추상 메서드를 구현하거나, 훅 메서드를 오버라이드하는 방법을 이용해 기능의 일부를 확장한다.

 

 

 

팩토리 메서드 패턴

팩토리 메서드 패턴도 템플릿 메서드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴이다. 그래서 구조도 비슷하다. 슈퍼 클래스 코드에서는 서브 클래스에서 구현할 메서드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 이 메서드는 주로 인터페이스 타입으로 오브젝트를 리턴하므로 서브클래스에서 정확히 어떤 클래스의 오브젝트를 만들어 리턴할지는 슈퍼클래스에서는 알지 못한다. 사실 관심도 없다. 서브 클래스는 다양한 방법으로 오브젝트를 생성하는 메서드를 재정의할 수 있다. 이렇게 서브 클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메서드를 팩토리 메서드라고 하고, 이 방식을 통해 오브젝트 생성 방법을 나머지 로직, 즉 슈퍼클래스의 기본 코드에서 독립시키는 방법을 팩토리 메소드 패턴이라고한다.

728x90
반응형