본문 바로가기
Lecture/Spring

[스크랩] DAO(Data Access Object), 디자인 패턴

by cusmaker 2012. 6. 23.
반응형

DAO가 처리하는 내용

- DB와 연결을 위한 커넥션을 어떻게 가져올까?

- 어떤 DB를 사용할 것이며, 어떤 드라이브와 로그인 정보를 사용할 것인가..

- 사용자 등록을 위해 DB에 보낼 SQL 문장을 담을 Statement를 만들고 실행.

   : 파라미터로 넘어온 사용자 정보를 Statement에 바인딩 시키고, Statement에 담긴 SQL을 DB를 통해 실행시킨다.

- 작업이 끝나면 사용한 리소스인 Statement와 Connection오브젝트를 닫아줘서 공유리소스를 시스템에 돌려준다.


기능에 따라 코드를 분리해 놓으면 한 가지 관심에 대해 변경이 일어날 경우 그 관심이 집중되는 부분의 코드만 수정하면 된다. 관심이 다른 코드가 있는 method에는 영향을 주지 않을 뿐더러, 관심 내용이 독립적으로 존재하므로 수정도 간단해진다.


리팩토링(Refactoring)

기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 의미한다.

리팩토링을 하면 코드 내부의 설계가 개선되어 코드를 이해하기가 더 편해지고, 변화에 효율적으로 대응할 수 있다. 


슈퍼 클래스에 기본적인 로직의 흐름(커넥션 가져오기, SQL 생성, 실행, 반환) 을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected method 등으로 만든 뒤 서브클래스에서 이런 method를 필요에 맞게 구현해서 사용하도록 하는 방법을 디자인 패턴에서 template method pattern 이라고 하고 스프링에서 애용되는 디자인 패턴이다.


getConnection()

- Connection 타입 오브젝트를 생성한다는 기능을 정의해놓은 abstract method.

- 어떤 connection 클래스의 오브젝트를 어떻게 생성할 것인지를 결정하는 방법.

- 서브 클래스에서 상속받아 구체적인 오브젝트 생성 방법을 결정하게 하는 것을 factory method pattern 이라 한다.


class UserDao{

add();

get();

getConnection();

}


class NUserDao extends UserDao{

getConnection();

}


class DUserDao extends UserDao{

getConnection();

}


NUserDao와 DUserDao 와 같은 서브클래스에서 구현하는 getConnection() 은 JDBC가 정의한 Connection 인터페이스를 구현한Connection 오브젝트를 각장의 생성 알고리즘을 이용해 만들어 낸다. getConnection() 에서 생성하는 Connection 오브젝트의 구혀 ㄴ클래스는 제각각이겠지만 UserDao는 Connection 인터페이스 타입의 오브젝트라는 것 외에는 관심을 두지 않는다. 그저 Connection 인터페이스에 정의된 메소드를 사용할 뿐이다.

UserDao는 어떤 기능을 사용한다는 데에만 관심이 있고, NUserDao, DUserDao와 같은 서브클래스에서는 어떤 식으로 Connection 기능을 제공하는지에 관심을 두고 있는 것이다. 그에 반에 UserDao는 Connection 오브젝트가 만들어지는 방법과 내부 동작 방식에는 상관없이 자신이 필요한 기능을 Connection 인터페이스를 통해 사용하기만 할 뿐이다. 관심사항을 서로 분리해 상하위 클래스에 나눠 담도록 만든 것이다.


디자인패턴

소트프웨어 설계 시 특정 상황에서 자주 만나는 문제를 해결하기 위해 사용할 수 있는 재사용 가능한 솔루션.

디자인 패턴은 주로 객체지향 설계에 관한 것이고, 대부분 객체 지향적 설계 원칙을 이용해 문제를 해결한다.

패턴의 설계 구조를 보면 대부분 비슷한데, 그 이유는 객체지향적인 설계로부터 문제를 해결하기 위해 적용할 수 있는 확장성 추구 방법이 대부분 두 가지 구조로 정리되기 때문이다.

 - 클래스 상속

 - 오브젝트 합성


템플릿 메소드 패턴

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

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

슈퍼클래스에서는 미리 추상 메서드 or 오버라이드 가능한 method를 정의해두고 이를 활용해 코드의 기본 알고리즘을 담고 있는 템플릿 method를 만든다. 


protected void hookMethod(){}   //선택적으로 오버라이드 가능한 hook method.

public abstract void abstractMethod();   //서브클래스에서 반드시 구현해야 하는 추상메서드.


팩토리 메서드 패턴

템플릿 메서드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴이다. 

슈퍼클래스 코드에서는 서브클래스에서 구현할 메서드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다.


디자인 패턴의 한계 

상속 자체는 간단해 보이고 사용하기 편리하게 느껴지지만 한계점 존재한다.

UserDao가 다른 목적을 위해 상속을 사용하고 있으면 자바는 다중상속을 허용하지 않기 때문에 상속해서 사용할 수가 없다.

예를 들어 connection 객체를 가죠오는 방법을 분리하기 위해 상속구조로 만들어 버리면, 후에 다른 목적으로 UserDao를 상속해서 사용할 수 없다.


추상클래스를 만들고 이를 상속한 서브클래스에서 변화가 필요한 부분을 바꿔서 쓸 수 있게 만든 이유는 변화의 성격이 다른 것을 분리해서, 서로 영향을 주지 않은 채로 각각 필요한 시점에 독립적으로 변경할 수 있게 하기 위해서다. 그러나 여러가지 단점이 많은 상속을 이용한다는 점에 있어 어느 정도 한계가 있다.


http://www.ibm.com/developerworks/kr/library/j-dao/index.html << DAO사용시 Logging의 중요성

[출처] 스프링 : DAO(Data Access Object), 디자인 패턴|작성자 withpd