프로젝트 정리

MyBatis 를 사용한 1:N 관계 조회하기

쿠쿠s 2022. 10. 19. 16:41

MyBatis 사용법 대부분은 공식문서에서 자세하게 설명되어 있습니다.

하지만 제가 프로젝트를 진행 하면서 1:N 관계 테이블에서 값을 가져오는데 발생한 문제점과 해결방법을 써보려고 합니다.

 

복잡한 연관관계 매핑

 

현재 진행하고있는 주문 도메인을 조회하는 쿼리인데 연관관계가 나름 복잡한 구문입니다.

(order - orderLineItem - orderItemOptionGroup - orderItemOption )

해당 결과를 가져오기 위해 어떻게 매핑을 해야할까를 공식문서와 블로그 등등 많이 찾아봤습니다.

 

공식 문서에서는 내포된(Nested) Results: 조인된 결과물을 반복적으로 사용하여 내포된 결과 매핑을 사용하는 방법으로

ResultMap 을 사용하도록 권장하고 있다. 단순히 Select 여러개 만드는 방법을 사용하게 된다면 불필요한 쿼리가 날라가게 됩니다.

 

- 공식문서에 적힌 예시 -

 

- 공식문서 -

resultMap을 사용해야한다는 것을 인지했는데 제 프로젝트에서는 어떻게 사용했는지 보여드리겠습니다.

 

두가지 방법을 사용할 수 있다는 사실을 알았습니다.

 

 

재사용을 위해 collection 별로 resultMap을 분리시키는 경우도 있지만 제가 진행하는 프로젝트에서 조회는 Order(Root)를 통해 이루어지므로 구현을 해서 재사용이 될 부분이 없다 생각하여 현재는 위와같은 방법으로 작성했습니다.

 

가독성이 많이 않지만... 결론을 말하면 두 사진의 다른점은 <id/> 의 유무입니다. 

 

 

공식문서에는 보통 pk 를 지정하라고 써져있습니다. 하지만 이렇게 사용하지 않고도 위의 두가지 방법 모두 매핑이 이루어져 중복된 column은 MyBatis가 처리를 해줘 하나의 객체로 반환할 수 있게 해줍니다.

 

 

<id property="id" column="o_id"/>

위의 구문처럼 id 를 지정하게 된다면 

 

select o.id AS o_id,

select 구문에서는 설정한 프로퍼티가 반드시 명시되어야 합니다. 그렇지 않으면 MyBatis는 중복되는 컬럼을 거르지 못하고

"Toomanyresultsexception"을 반환하게 될 것입니다.

 

*id를 지정하지 않고 사용을 한다면 해당 구문이 빠져도 상관이 없습니다.

 

프로젝트를 진행하면서 Id를 매핑하고 select 시에 id 값은 굳이 가져올 필요가 없다 생각하여 구문을 뺐는데 계속 List의 결과를 반환하여 원인을 파악하지 못했습니다.  공식 문서와 다른 블로그를 참고해봤지만 저와 비슷한 문제에 대해 쓴 곳은 없어 직접 정리하게 되었습니다.

 

저와 같은 상황에 처하신 분들이 도움을 받으셨으면 좋겠습니다.

 

감사합니다.

'프로젝트 정리' 카테고리의 다른 글

Flyway 버전업데이트로 발생한 문제 해결  (0) 2022.09.01