이전에 UserDAO와 ConnectionMaker라는 두 개의 관심을 인터페이스를 통해 완벽하게 분리했음에도, 왜 UserDAO가 인터페이스뿐아니라 구체적인 클래스까지 알아야하는가라는 의문을 가졌다.
그 이유는 여전히 UserDAO에는 ConnectionMaker 구현 클래스를 사용할지를 결정하는 코드가 남아있기 때문이다.
인터페이스를 통한 분리에도 불구하고 여전히 UserDAO 변경 없이는 DB Connection 기능의 확장이 자유롭지 못한데, 그 이유는 UserDAO안에 분리되지 않은 또 다른 관심사항이 존재하고 있기 때문이다.
[오브젝트와 의존관계] - DAO의 확장
이전는 데이터 엑세스 로직을 어떻게 만들 것인가와 DB 연결을 어떤 방법으로 할 것인가라는 두 개의 관심을 상하위 클래스로 분리하여 학습을 진행하였다. 이 두 개의 관심은 변화의 성격이 다
lifeisstudy-hong.tistory.com
관계 설정 책임의 분리
new DConnectionMaker() 라는 코드는 매우 짧고 간단하지만 그 자체로 충분히 독립적인 관심사를 가지고 있다.
그 관심사는 바로 UserDAO가 어떤 ConnectionMaker 구현 클래스의 오브젝트를 이용하게 할 지를 결장하는 것이다.
이를 분리하지 않으면 독립적으로 확장 가능한 클래스가 될 수 없다.
UserDAO를 사용하는 클라이언트가 적어도 하나는 존재한다. 여기서 말하는 클라이언트는 장비나 PC가 아닌, 두 개의 오브젝트가 있고 한 오브젝트가 다른 오브젝트의 기능을 사용한다면, 사용되는 쪽이 사용하는 쪽에게 서비스를 제공하는 것이다.
따라서 사용되는 오브젝트를 서비스, 사용하는 오브젝트를 클라이언트라고 부른다.
여기서 클라이언트 오브젝트가 바로 제 3의 관심사항인 UserDAO와 ConnectionMaker 구현 클래스의 관계를 결정해주는 기능을 분리해서 두기에 적절한 곳이다.
UserDAO의 클라이언트에서 UserDAO를 사용하기 전에, 먼저 UserDAO가 어떤 ConnectionMaker의 구현 클래슬를 사용할지를 결정하도록 만든다. 즉, UserDAO 오브젝트와 특정 클래스로 부터 만들어진 ConnectionMaker 오브젝트 사이에 관계를 설정해주는 것이다.
위 사진을 참고하면 UserDAO와 DConnectionMaker 클래스 사이에 불필요한 의존관계가 존재한다.
이를 해결하기 위해서는 관계에 대한 개념에 대해서 잘 이해해야한다.
UserDAO 오브젝트가 동작하기 위해서는 특정 클래스의 오브젝트와 관계를 맺어야한다.
결국 특정 클래스의 오브젝트와 관계를 맺게 되는 것이지만, 클래스 사이에 관계가 만들어진 것은 아니고 단지 오브젝트 사이에 다이나믹한 관계가 만들어지는 것이다.
UserDAO가 특정 클래스의 오브젝트를 사용하게 하려면 두 클래스의 오브젝트 사이에 런타임 사용관계 또는 링크 또는 의존관계라고 불리는 관계를 맺어주면 된다.
아래는 DCnnectionMaker를 없앤 UserDAO 클래스이다.
public class UserDAO {
private SimpleConnectionMaker simpleConnectionMaker;
private ConnectionMaker connectionMaker;
/*
* public UserDAO() { simpleConnectionMaker = new SimpleConnectionMaker(); }
*/
/*
* public UserDAO() { connectionMaker = new DConnectionMaker(); }
*/
public UserDAO(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
그 이유는 관계를 맺은 책임을 UserDAO의 클라이언트에게 넘겨버렸기 때문이다.
아래는 런타임 오브젝트 의존 관계 설정 책임을 받은 메인 클래스이다.
public class UserDAOTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDAO dao = new UserDAO(connectionMaker);
}
}
이렇게 되면 UserDAO에 있으면 안되는 다른 관심사항, 즉 책임을 클라이언트로 떠넘기는 작업이 끝났다.
'Programming > Spring' 카테고리의 다른 글
[오브젝트와 의존관계] - 제어의 역전(IoC) (0) | 2025.05.04 |
---|---|
[오브젝트와 의존관계] - DAO의 확장 (1) | 2025.05.03 |
[오브젝트와 의존관계] - 관심사의 분리 (0) | 2025.05.03 |
[오브젝트와의존관계] - DAO (0) | 2025.05.03 |
[Spring] 파일 업로드 (0) | 2024.05.26 |