programming/프로젝트
Mybatis 상속 관계 매핑
yhsim98
2022. 8. 22. 03:02
Koin 개선 작업을 하며 기존에는 회원이 학생밖에 없었으나, 이제는 사장님이 추가되게 되었습니다.
이전 프로젝트에서 했던 것처럼 슈퍼-서브 타입으로 모델링하고 조인 전략을 사용했습니다.
이전 프로젝트에서는 부모 타입으로 조회 시, 우선 DB에 접근하여 dtype을 통해 어떤 타입인지 확인 후 다시 DB에 접근하여 데이터를 조회하는 방법을 사용했습니다. DB에 접근을 두 번 하게 됩니다
하지만 면접 때 DB에 접근을 한 번만 하여 조회할 수 있는 방법이 없을까요? 라는 질문을 받았고 결국 대답은 못했지만, 면접 후 찾아보니 다 방법이 있었습니다(생각해보면 JPA 에서도 제공하는 기능을 Mybatis 가 없을 리가 없겠죠)
바로 Mybatis의 discriminator 입니다
<resultMap type="koreatech.in.domain.user.User" extends="userResultMap" id="userDiscriminator">
<discriminator javaType="String" column="user_type">
<case value="USER" resultType="koreatech.in.domain.user.student.Student"/>
<case value="STUDENT" resultType="koreatech.in.domain.user.owner.Owner/"/>
</discriminator>
</resultMap>
이런 방식으로 resultMap의 discriminator을 사용하여 반환 타입을 실행시간에 동적으로 결정할 수 있습니다.
또 아래처럼 메소드에 제너릭을 사용하면 반환받는 타입도 호출 시 결정할 수 있습니다.
<T extends User> Optional<T> getUserById(Long id);
Owner owner = userMapper.<Owner>getUserById(id);
물론 User 같은 부모타입 조회에서 하위타입인 Owner와 Student 등의 정보를 가져오는 것은 좋지 않습니다.
쿼리를 만들 때, 모든 서브 테이블을 조인 후 실행시간에 원하는 정보만 반환하는 방식으로 구현해야 하기 때문이죠
필요없는 조인이 너무 나갑니다. 따라서 Owner은 getOwnerById, Studnet는 getStudentById를 사용해서 조회하는 것이 좋습니다.