관리 메뉴

HAMA 블로그

JDBC 와 디자인패턴 - 5. Adapter 패턴 본문

디자인패턴

JDBC 와 디자인패턴 - 5. Adapter 패턴

[하마] 이승현 (wowlsh93@gmail.com) 2015. 8. 16. 12:04

순서


1. 소개 

2. Abstract Factory 패턴 

3. State 패턴

4. chain of Responsibility 패턴 

5. Adapter 패턴

6. Bridge 패턴 

 

디자인 패턴을 공부할때 가장 유념해야할 단어는 "의도" 이다.  절대 모양 (구조) 가 아니다.  그리고 구현함에 있어서 책 등에 나와 있는 모양 그대로 구현하려고 할 필요도 없다. 너무 잘 하려고 하다보면 아예 하지도 못할지도 모른다.  "의도" 만 확실히 이해한 다음에 구현을 이것저것 거침없이 하다보면.... 코딩에 대한 재미는 생겨날 것이다. 재미는 실력향상을 의미하기도 하고 ~  


JDBC 는 자바에서 정한 DB 와의 관계에 대한  행동 지침이다. 행동지침을 공통화하려면 어느 정도의 유사성이 있어야 한다. 세상에는 많은 자동차가 있지만 행동 지침은 비슷하다. 그러기에 운전자들이 다른 메이커의 자동차를 운전하더라도 어느정도는 쉽게 할수있지 않은가.. 마찬가지로  세상에는 많은  DB 가 있고.   각각의 DB 에서 데이터를 가져오는 방법(행동) 이  DB  마다 다르다면 따로 따로 공부를 해야하지만 , 행동지침이 정해져 있고, 모든 DB 가 그것에 맞춰서 개발을 한다면 , 개발자는 정해져있는 행동지침 ( JDBC ) 만 공부하면 된다.  


JDBC  를 디자인패턴과 함게 묶은 이유는 ,  일단 디자인 패턴을 이해하는 가장 효율적인 방법은 다른사람(특히 구루들) 이 잘 구현해놓은 코드(패턴)을 보고 감흥하는것인데 JDBC 를 구현한 코드들에는 몇몇개의 패턴이 뚜렷하게 녹아져 있다.  


5. Adapter  패턴




* Apdater 패턴은 위 전체 JDBC 패턴 모식도중 빨강 네모상자 안에서 이루어집니다.


어댑터하면 떠오르는것은 외국의 110v 콘센트에 우리나라에서 사용하고있는 가전제품 220v 짜리를 끼기위한  110v -> 220v 짜리 어댑터인데요.  여기서 변환하는것을 "어댑터" 라고 하고 , 변환당하는 110v 컨센트를 "어댑티" 라고 합니다. 따라서 위의 모식도에 Cursor 에 어댑티라고 써있고 , HAMAResultSet 에 어댑터라고 써있는것을 보아 , 클라이언트는  Cursor 를 직접적으로 사용하지 못하고 어댑터인  HAMAResultSet  라는 어댑터를 사용한다는것을 알수있습니다. 좀 더 깊이 들어가기 전에  정의를 내려봅니다.

클래스(어댑티)가 실제로는 지원하지 않는 인터페이스를 지원하는것 처럼 만든다.  (즉 클래스의 인터페이스를 클라이언트가 기대하는 인터페이스로 변환해 준다). 이를 통해 리팩토링 없이도 기존의 클래스를 이용해 새로운 클래스를 만들수있다.  - 실용주의 디자인 패턴 - 

(CURSOR 는 DB 에서 제공하는 객체이고java.sql.ResultSet 은 인터페이스 표준이다.) 



Adaptee : (클라이언트가) 원하는 인터페이스를 지원하지 않는 객체.

Target    : Adaptee 가 지원하길 바라는 인터페이스

Adpater : Adaptee 가 Target 인터페이스를 지원하는 것 처럼 보이게 해주는 클래스. 


결국 CURSOR 를 java.sql.ResultSet 처럼 보이게 하기위한 클래스를 만들자!!!  입니다.



어댑티를 어댑터의 부모클래스로 둘수도 있으며, 

어댑티를 어댑터의  연관(Aggregation)으로  관계를 맺을수도 있다.


// 어댑티가 부모클래스

class Adapter  extends Adpatee implements java.sql.ResultSet{

      void func(){   // ResultSet 인터페이스의 구현   

              orgFunc();  // 실제 작동하는 Adpatee 의 함수

     }

}


// 어댑티를 내부에 연관(Aggregation)

class Adapter  implements java.sql.ResultSet{

      Adpatee  adp;

      Adapter(Adaptee adp){

this.adp = adp;

}

     void func(){   // ResultSet 인터페이스의 구현   

             adp.orgFunc();  // 실제 작동하는 Adpatee 의 함수

     }

}


JDBC 나 보통 프레임워크에서 어댑터 패턴은 거의 쓰이질 않는다. 왜냐면 어댑터라는건 만들어져있는  라이브

러리를 사용할때 ( 유연성을 높히기 위해 )필요로 하기때문이다.

 

자!! 이제 실제 HAMAResultSet 클래스의 내부를 보자.

public lass HAMAResultSet implements java.sql.ResultSet {  // HAMAResultSet  는 어댑터이다. 

private final Cursor cursor;   // adpatee 역할을 하는 Cursor 를  가지고있다.

public HAMAResultSet(Cursor cursor){

     this.cursor = cursor;

}


public boolean next(){

     return cursor.advance();      // 클라이언트가 next 를 호출하면, advance() 로 변경시켜준다.

}                                                       110v 가  220v 로 바뀌듯이..


public int getInt(String columnName){     // HAMA DB 는 모든컬럼이 Sting 으로 저장되어있음.

String contents = getString(columnName);

return (contents ==  null) ? 0 : format.parse(contents).intValue();

}


public ResultSetMetaData getMetaData(){

return new HAMAResultSetMetaData(cursor);

}


HAMAResultSetMetaData (  이 버전은 모든 컬럼의 형이 VARCHAR 임) 

public class HAMAResultSetMetaData implements java.sql.ResultSetMetaData{

private final Cursor cursor;

public HAMAResultSetMetaData(Cursor cursor){

this.cursor = cursor;

      }

      public int getColumnType(int colum){

return java.sql.Types.VARCHAR;

      }

      public String getColumnTypeName(int column){

return "VARCHAR";

     }





레퍼런스 :  실용주의 디자인 패턴 (http://www.kangcom.com/sub/view.asp?sku=200607180006 )



Comments