본 글은 Java 개발과 iBatis에 대한 기본적인 이해를 갖추고 있는 개발자를 위한 연재글입니다.
iBatis는 객체지향 개발을 쉽게 할 수 있도록 도와주고 다양한 유용한 기능을 갖추고 있 때문에, 알아두면 업무에 유용하게 쓰일 수 있을 것입니다.
일반적으로 많이 사용 되고 있는 iBATIS의 기능을 예제를 통해 설명한 본 글을 통해 많은 개발자분들이 도움을 받으실 수 있었으면 합니다.




<1회> Complex Type Property 사용하기

<2회> Discriminator 이용하여 상속 구현하기



다시 지난 내용에서 사용했던 Customer-Order-OrderItem-Product 이라는 관계를 살펴보겠다.

클래스 다이어그램은 아래와 같다. 
 


이제 이 주문을 요청하는 고객이 온라인으로 주문하는 고객과 홈쇼핑으로 주문하는 고객이 별도로 있고, 온라인으로 주문하는 고객의 contact 은 email, 홈쇼핑으로 주문하는 고객의 contact 은 전화번호라고 가정해 보자. 이를 Customer class 를 상속하여 OnlineCustomerHomeShoppingCustomer 를 만들었다고 한다면 아래와 같이 표현될 수 있을 것이다. 
 



이번에는 데이터베이스 테이블 구조로 살펴보자. 별도로 정규화를 하지 않고 하나의 table에OnlineCustomerHomeShoppingCustomer를 표현한다고 하면, 아래와 같이 구분 컬럼을 추가하여 (여기서는 CUST_TYPE) 구분할 수 있을 것이다. 
 


이제 이러한 객체 모델과 DB 모델을 iBatis 를 통해 구현하는 방법을 살펴볼 차례이다.

iBatis에는 이러한 경우를 처리하기 위해 “discriminator” 라는 요소가 있다.

Discriminator 는 result map 에 설정하며, 어떤 특정 구분자의 값에 따라 다른 result map을 가져올 수 있도록 해준다.

이 예제에서는 ‘CUST_TYPE’ 컬럼의 값에 따라 OnlineCustomer 객체나 HomeShopingCustomer 객체를 각각 email 또는 전화번호 정보를 포함하여 결과를 가져올 수 있어야 한다.

이런 경우 아래와 같이 기본적인 customer-resultmap 에 ‘CUST_TYPE’에 대한 discriminator를 추가하고 그 값이 ‘ONLINE’ 또는 ‘HOME_SHOPPING’ 인가에 따라, iBatis는 email 정보를 포함한 OnlineCustomer객체 또는 phoneNumber 정보를 포함한 HomeShoppingCustomer 객체를 생성하게 된다.

SQL Map 설정은 아래와 같을 수 있다.
 


만일 online customer 의 contact 정보가 하나의 email 정보만 있는 것이 아니고, 별도의 테이블에 저장되어 있다면, 첫 번째 강좌에서 배운 것과 같이 complex property type 처리를 적용할 수도 있다. 
 


위와 같은 방법으로 하나의 테이블 또는 여러 개의 테이블로 구성된 데이터 구조를 객체의 상속과 같은 구조로 구현하고자 할 때 iBatis의 discriminator 를 이용할 수 있다.

관계 데이터베이스와 객체 자료 구조는 메우기 쉽지 않은 간격이 존재한다. ORM(Object Relational Mapping)기술들은 이러한 간격을 메워주는 역할을 하고 있고, 객체지향적인 설계와 개발에 집중할 수 있도록 도와 준다.

비록 iBatis는 ORM은 아니지만, Batis 가 가지고 있는 기능들을 잘 활용한다면, ORM을 사용할 때와 유사하게 객체지향적인 개발을 진행할 수 있을 것이다.


티스토리 툴바