[MyBatis] Asscociation 을 쓰는 이유?
문제 정의
개발을 처음 접하다보니 MyBatis를 사용하면서 resultMap의 association을 왜 쓰는지 이해가 가질 않고 있다.
사실 수집
1. Association 을 쓰지 않아도 DTO를 이용하여 reusultType을 만들면 프로그램이 동작하는 데는 이상이 없다.
2. Association 엘리먼트는 “has-one”타입의 관계를 다룬다고 한다.
3. resultMap엘리먼트에서 사용하는 하위 엘리먼트들, 개념적인 뷰라고 한다.
가장 좋은 방법은 매번 ResultMap 을 추가해서 빌드한다.
이 경우 단위 테스트가 도움이 될 수 있다. 한번에 모든 resultMap 을 빌드하면
작업하기 어려울 것이다. 간단히 시작해서 단계별로 처리하는 것이 좋다. 프레임워크를 사용하는 것은 종종 블랙박스와
같다. 가장 좋은 방법은 단위 테스트를 통해 기대하는 행위를 달성하는 것이다. 이건 버그가 발견되었을때 디버깅을
위해서도 좋은 방법이다고 한다.
원인 추론
1. MyBatis에 대한 전반적인 이해가 부족하다.
2. ResultMap과 ResultType의 차이를 모른다.
3. Association을 사용하는 명확한 이유를 모른다.
조치 및 방안 검토
1. https://mybatis.org/mybatis-3/ko/index.html 사이트를 참고하여 공부
결과 관찰
1. ResultType : 이 구문에 의해 리턴되는 기대타입의 패키지 경로를 포함한 전체 클래스명이나 별칭.
ResultMap : 외부 resultMap 의 참조명. 결과맵은 마이바티스의 가장 강력한 기능이다.
ResultSet에서 데이터를 가져올때 작성되는 JDBC코드를 대부분 줄여주는 역할을 담당한다.
사실 join매핑과 같은 복잡한 코드는 굉장히 많은 코드가 필요하다.
ResultMap은 간단한 구문에서는 매핑이 필요하지 않고 복잡한 구문에서 관계를 서술하기 위해 필요하다.
=> resultType은 전체 클래스 경로명이나 별칭, resultMap은 resultType에서 정해진 컬럼명과 setXXX 이름이 다를 때 바꾸어 줄 수 있다.
=> resultMap을 이용해 join 관계등을 표현 할 때 엔티티 형태의 resultMap을 만들고 association 또는 collection을 이용하여 표현이 가능하다 이후에 이 엔티티 형태의 resultMap은 당연히 재사용이 가능하다.
객체지향의 목표중 하나인 재사용성 증가
2. association은 has-one 타입의 관계를 표현할 때 사용한다.
=> 복잡한 타입의 연관관계로 1:1 포함관계인 경우 사용한다.
* 번외로 collection은 복잡한 타입의 연관관계로 1:다 포함관계인 경우 사용한다.
문제 해결 여부
앞으로는 association, collection 관계를 표현하기 위해서 resultMap을 만들고
해당 resultMap을 이용해 데이터 중심의 개발보다는
조금이라도 더 객체 지향스럽게 resultMap의 association과 collection을 이용해야 할 것 같다.
뿐만아니라 myBatis를 공부하면서 왜 myBatis가 sql 중심개발이라고 하는지 조금은 알 것 같다.
1. SQL을 직접 장성하여 객체와 매핑시켜줘야 한다.
2. 특정 데이터베이스에 종속적이다.
왜 객체 중심 개발로의 전환을 위해 jpa로 전환하는 곳이 있는지 조금은 알 수 있었다.