[Mybatis] resultMap을 이용해서 쿼리 서브 정보 받아오기 (left join 정보 받아오기)
jpa를 사용하는 환경이면 @OneToMany를 사용해서 Dto안의 List<Dto>를 반환하는 것을 쉽게 구현할 수 있다. 하지만, mybatis에서는 resultMap을 이용해서 서브정보를 쿼리로 반환해야 한다. (xml에 resultMap을 사용하는 예시를 바로 보려면 2-2. 쿼리작성 부터 보시면 됩니다.)
1. 요구사항
프론트에서 아래와 같은 json 포맷으로 요구했다. 메인 정보 안에 서브정보를 리스트로 반환해야 한다.
요구사항 JSON
[
{
"id": "an001",
"title": "데브옵스개발팀에 초대합니다.",
"content": "오세요",
"skills": [
{
"skillId": "sk001",
"skNm": "java"
},
{
"skillId": "sk002",
"skNm": "python"
},
{
"skillId": "sk003",
"skNm": "react"
}
]
},
{
"id": "an002",
"title": "춘개발자를 모집합니다.",
"content": "오십쇼",
"skills": [
{
"skillId": "sk002",
"skNm": "python"
},
{
"skillId": "sk004",
"skNm": "mySql"
}
]
}
]
위처럼 반환하기 위해서는 여러 가지 방법이 있겠지만, resultMap을 사용해서 한 번에 반환해 보자.
2. 해결방법
2-1. dto를 2개 만든다.
위에 json 내용을 보면 공고에 대한 정보(=dto) 하나 안에, 스킬에 관한 서브정보(=dto)로 2개의 dto가 필요할 것을 예상할 수 있다.
2-1-1. 공고 dto
AnnouncementDto
2-1-2. 스킬 dto
SkillDto
2-2. 쿼리 작성
xml에 쿼리를 작성할 때, resultMap을 사용하면 된다.
쿼리
위처럼, resultMap을 사용해서 메인 dto, 서브 dto 관계를 정의를 해서 쿼리문에서 사용하면 된다.
3. 결과 확인
vscode에서는 Thunder Client로 api를 테스트할 수 있다. 아래 캡처 화면을 보면 정상적으로 반환되는 것을 확인할 수 있다.