MyBatis 에서 collection 을 사용하는 방법을 검색하면 대부분 VO 에 list 를 선언해서 사용하는 방법 밖에 나오지 않는다.
근데 현재 내가 해야하는 경우는 vo가 없는 상황에서 쓰는 것이다.
JSON 으로 결과를 이렇게 내려줘야한다.
{
"code": "0000",
"message": "예약내역 조회에 성공했습니다.",
"data": {
"reservationHistory": [
{
"rsSeq": "RS20000007720",
"gdSeq": "GD2000144",
"rsStatus": "A",
"rsStatusNm": "미확인",
"sdSeq": "SDPACK",
"gdName": "패키지상품",
"rsDate": "2020-06-11 13:57:37.0",
"rsSdDate": "20200630",
"rsBuyerName": "홍길동",
"rsBuyerTel": "010-1111-2323",
"rsPerson": 2,
"pmPayMethodNm": "전화예약",
"rsDetails": [
{
"rdSeq": "RD20000012375",
"rdPerson": 1,
"rdPrice": 1800,
"rdAmount": 1800,
"plName": "1회권 패키지",
"inspectInfo": [
"RS20000007737-RD20000012375-1"
]
}
],
"reservationHistoryMemoList": []
}
]
}
}
처음 생각했을 때는 reservationHistory 안에 rsDetails 라는 이름으로 for을 돌리고 그 안에 또 inspectInfo 라는 for 을 돌려야 하지 않을까? 그리고 쿼리는 2~3개를 사용해야하지 않을까? 생각을 했다. 그리고 그렇게 만들고 있었다.
하지만 방법은 의외로 심플했다.
<resultMap id="ticketing_reservationHistoryResultMap" type="java.util.LinkedHashMap">
<id property="rsSeq" column="rsSeq"/>
<result property="gdSeq" column="gdSeq"/>
<result property="rsStatus" column="rsStatus"/>
<result property="rsStatusNm" column="rsStatusNm"/>
<result property="sdSeq" column="sdSeq"/>
<result property="gdName" column="gdName"/>
<result property="rsDate" column="rsDate"/>
<result property="rsSdDate" column="rsSdDate"/>
<result property="rsBuyerName" column="rsBuyerName"/>
<result property="rsBuyerTel" column="rsBuyerTel"/>
<result property="rsPerson" column="rsPerson"/>
<result property="rsBuyerAmount" column="rsBuyerAmount"/>
<result property="pmPayMethodNm" column="pmPayMethodNm"/>
<collection property="rsDetails" javaType="java.util.List" resultMap="ticketing_reservationDetailHistoryResultMap"></collection>
</resultMap>
<resultMap id="ticketing_reservationDetailHistoryResultMap" type="java.util.LinkedHashMap">
<id property="rdSeq" column="rdSeq"/>
<result property="rdPerson" column="rdPerson"/>
<result property="rdPrice" column="rdPrice"/>
<result property="rdAmount" column="rdAmount"/>
<result property="plName" column="plName"/>
<collection property="inspectInfo" javaType="java.util.List" resultMap="ticketing_inspectHistoryResultMap"></collection>
</resultMap>
<resultMap id="ticketing_inspectHistoryResultMap" type="String">
<result property="inspectNo" column="inspectNo"/>
</resultMap>
collection 선언한 곳에 보면 JSON 구조에 표시한 이름이 있다.
rsDetails, inspectInfo 가 있다. collection 의 property가 JSON 에서 키 값으로 그대로 노출이 되는 것이다.
여기서 의문점 하나.
과연 collection만 되고 association은 안될까???
collection 을 아래처럼 association 으로 바꿔서 그대로 실행해보았다.
<association property="rsDetails" javaType="java.util.List" resultMap="ticketing_reservationDetailHistoryResultMap"></association>
결과는???
맨 위의 JSON 구조와 동일하게 나왔다.
https://mybatis.org/mybatis-3/ko/project-reports.html
솔직히 mybatis 레퍼런스를 봐도 설명을 봐도... 왜 저렇게 되는지는 잘 모르겠다...
이 글을 보시고 아시는 분은 댓글 좀 달아주세여.......개린이는 웁니다....(개발자어린이...)
그리고 궁금증 하나 더!
어째서 JSON 구조에서 rsDetails 가 [] 배열로 나오는건가?
위에 있듯이 javaType이 List로 선언되어 있기때문이다.
JSON 구조를 정확하게 파악하지 못했고 그리고 LIST 와 Object 의 개념을 정확하게 확실히 숙지하지 못해서 생긴 오류들이다... 휴 ... 공부해야지...