본문 바로가기
개발자의 공부방/프로젝트

프로젝트] API 만드는 과정 중 MyBatis Collection 사용하기.

by 쌈빡한 쥬니준 2020. 6. 18.

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 의 개념을 정확하게 확실히 숙지하지 못해서 생긴 오류들이다... 휴 ... 공부해야지...

 

 

댓글0