본문 바로가기
Spring

DAO 확장

by 코리늬 2018. 8. 2.

1.3 DAO의 확장

1.3.1. 클래스의 분리

이번에는 아예 상속 관계가 아닌 독립적인 클래스로 만들어보려한다.

DB 커넥션 부분을 별도의 클래스에 작성하고, 별도 클래스를 UserDao가 이용하게 하려한다.

위와 같이 SimpleConnectionMaker() 클래스를 작성해 UserDao가 이용하게 하는식으로 작성을 했지만,

상속을 이용한 경우와 마찬가지로 두 가지 문제가 생겼다.

1. SimpleConnectionMaker 메소드를 사용해 DB커넥션을 가져오는데 만약 다른 곳에서는 메소드이름을 다르게 사용한다면 커넥션을 가져오는 메소드 이름을 모조리 바꿔줘야하는 문제가 생긴다.

2. SimpleConnectionMaker라는 클래스 타입의 인스턴스 변수를 정의해놓고 있으므로, 다른 클래스를 구현할 시 UserDao 자체를 수정해야 한다.

이와 같은 방법으로는 상속보다 못한 방법이 되어버릴 수 있다.


1.3.2 인터페이스의 도입

가장 좋은 방법은 두 클래스가 서로 긴밀하게 연결되어 있지 않도록 중간에 추상적 연결고리를 만들어주는 것이다.

 - 추상화 : 공통적인 성격을 뽑아내어 이를 따로 분리하는 작업

자바가 추상화를 위해 제공하는 가장 유용한 도구 인터페이스를 사용하는 것이다.

 - 인터페이스 : 자신을 구현한 클래스에 대한 구체적인 정보는 감춘다. 접근하는 쪽에서는 오브젝트를 만들 때 사용할 클래스가 무엇인지 몰라도 된다. 

 > 실제 구현 클래스를 바꿔도 신경 쓸 일이 없다.

하지만 결국 UserDao에서 연결할 클래스의 생성사를 호출해 오브젝트를 생성해야하기 때문에 완전히 독립되었다고 할 수 없다.


1.3.3 관계설정 책임의 분리

ConnectionMaker = new DConnectionMaer(); 라는 코드가 있을 때 이 코드는

DConnectionMaker의 오브젝트의 레퍼런스를 UserDao의 ConnectionMaker 변수에 넣어서 사용하게 해서, 두 오브젝트가 관계를 맺게 해준다.

오브젝트 사이의 관계가 만들어지려면 이처럼 직접 생성자를 호출해서 직접 오브젝트를 만드는 방법도 있지만 외부에서 만들어 

준 것을 가져오는 방법도 있다. 

UserDao 오브젝트가 다른 오브젝트와 관계를 맺으려면 관계를 맺을 오브젝트가 있어야 하는데 이 오브젝트를 꼭 UserDao 코드

내에서 만들 필요는 없다. 얼마든지 메소드 파라미터 등을 이용해 외부에서 만든 걸 가져올 수 있다.

외부에서 만든 오브젝트를 전달받으려면 메소드 파라미터나 생성자 파라미터를 이용하면 된다. 

물론 UserDao 오브젝트가 동작하려면 특정 클래스의 오브젝트와 관계를 맺어야한다. 그래야 DB커넥션을 제공하는 기능을 가진

오브젝트를 사용할 수 있기 때문이다.

- 하지만 이는 클래스 사이의 관계가 아니고 오브젝트 사이의 관계라는 것이다 (중요)

특정 클래스를 전혀 알지 못해도 해당 클래스가 구현한 인터페이스를 사용했으면 , 그 클래스의 오브젝트를 인터페이스 타입으로 

받아서 사용할 수 있다.  >> 다형성


위의 내용을 토대로 코드를 새로 짜보도록 하겠다.

1. UserDao


2. UserDaoTest


3. ConnectionMaker + DConnectionMaker

1. 먼저 UserDaoTest에서 UserDao가 실제로 사용할 DConnectionMaker 오브젝트를 생성.

2. UserDao 오브젝트를 생성하면서 생성자를 통해 DConnectionMaker 오브젝트 전달.

(UserDao의 생성자는 ConnectionMaker 인터페이스 타입으로 전달받기 때문에 어떤 클래스로 만든 오브젝트라도 상관없다)

 >> 다형성 

3. UserDaoTest는 필요한 오브젝트를 생성하고 관계를 맺어주는 과정을 마쳤으니 UserDao의 add, get 메소드를 사용

4. UserDao는 생성자를 통해 전달받아 인스턴스 변수에 저장해둔 DConnectionMaker 오브젝트의 makeConnection 메소드를

호출해서 DB커넥션 생성

댓글