본문 바로가기

Java

[Java] Proxy를 사용하여 MyBatis의 Mapper 구현해보기 -3-

이전 글에서 Mapper를 MapperFactory라는 클래스를 통해 생성하여
구현하였었습니다.

앞에서도 말씀드렸지만
이전 예제는 Mapper의 return type이 고정되어 버린다는
단점이 있었습니다. 이 부분을 Generic을 사용하여 수정해보려고 합니다.

기본적으로 앞서 구현했던 Select 어노테이션과 User클래스, 그리고 User를 Select 할 수 있는 UserMapper외에 
Depart 도메인에 대한 Mapper를 추가하겠습니다.

  Depart.java
DepartDataMapper.java

Depart와 Depart를 Select하는 Mapper입니다.

그 다음 이 Mapper를 대신하여 수행 될 ProxyHandler입니다.


MapperProxyHandler.java

보시면 아시겠지만
리턴되어야하는 타입이 User와 Depart 두개로
이를 구분하기 위하여 내부적으로 If문을 사용하고 있습니다.

지금은 Type이 2개뿐이지만 실제로는 이런식으로는 구현 자체가 어려울 것 입니다.
이 부분은 Reflect를 사용하여 IF문을 쓰지 않고도 Return Type을 구분 하도록 할 수도 있습니다.



MapperProxyHandler.java (개량형)

* 위 예제는 풍주형님(http://pungjoo.tistory.com/)께서 댓글로 알려주신 내용입니다. 

위에 보시면 메서드명을 인위적으로 만들어서 setter 메서드를 relfect로 실행하여
값을 셋팅하고 있습니다.

위 예제에서 메서드명을 DB ResultSet의 MetaData로부터 컬럼명을 읽어서
만들어 낼 수도 있고, 스프링프레임워크등을 사용하면 BeanProperty와 같은 라이브러리를
사용하여 좀 더 쉽게 사용 할 수도 있습니다.

아무튼 위와 같이 ProxyHandler가 작성되고나면 이제 MapperFactory를 작성해야 합니다.


MapperFactory.java
이렇게 Generic을 사용하면 이 Factory가 여러 종류의 Mapper를 생성 할 수 있게 됩니다.
아래 예제처럼요..


Test.java

이제 MapperFactory는 더 이상 Mapper의 Type에 종속적이지 않습니다.
보시면 하나의 Factory에서 여러 종류의 Mapper를 만들어내고 있습니다.

이렇게해서 mybatis에서 사용되는 mapper를 proxy api를 활용하여
구현해보았습니다.당연히 실제 Mybatis 내부적으로는 훨씬 많은 validation로직과 기타 예외에 대한 처리들이
구현되어 있을 것 입니다.

단순히 흉내내기에 불과하지만
proxy, annotation, generic등 여러 종류의 api에 대해서도
한번 훑어 볼 수 있는 예제라고 생각합니다.