resultMap
포스트
취소

resultMap

resultMap이란?

  • 데이터를 계층적으로 저장할수 있게 해주는 유틸 (요약 : vo 모음집)

1:1 매핑 (association)

  • 가정
    • 특정 이벤트에 참여한 유저들의 정보를 저장한다.
  • vo
    //유저 테이블
    @Data  
    public class Member{
        private String member_id; //유저 아이디
        private String name; //이름
        private String phone_number; //연락처
        private String home_address; //주소
    }

    //이벤트 참가자 테이블
    @Data  
    public class EventParticipant{
        private int no; //번호
        private String event_id; //이벤트 고유 ID
        private String member_id; //참가한 유저 아이디

        Member member;
    }
    
  • SQL
    <!-- ★ resultType이 아닌 resultMap을 사용 -->
    <!-- ★ resultMap 속성의 값으로는 작성한 resultMap의 id를 명시 -->
    <select id="list" parameterType="hashmap" resultMap="eventParticipantMap">
    SELECT 
        E.NO,
        E.EVENT_ID,
        M.MEMBER_ID,
        M.NAME,
        M.PHONE_NUMBER,
        M.HOME_ADDRESS
    FROM
        EventParticipant E
        INNER JOIN MEMBER M
        ON E.MEMBER_ID = M.MEMBER_ID
    WHERE
        EVENT_ID = #{event_id}
    </select>
    
  • resultMap
    <!-- resultMap 태그 →  id 속성 : 사용할 resultMap의 고유 id -->
    <!-- resultMap 태그 → type 속성 : 데이터를 저장할 클래스 -->
    <resultMap id="eventParticipantMap" type="com.my.vo.EventParticipant">
        <!-- property: 해당 VO에서 사용하는 필드명 -->
        <!-- column : 실제 Database에서 사용중인 칼럼명 -->
        <result property="no" column="NO" />
        <result property="event_id" column="EVENT_ID" />
        <result property="member_id" column="MEMBER_ID" />

        <!-- association 태그 → property 속성 : 참조 객체 변수명 -->
        <!-- 예시 : EventParticipant 클래스에서 MEMBER 클래스를 member라고 명시했으니 해당 속성의 값은 member가 된다. -->
        <!-- association 태그 → javaType 속성 : 해당 참조 객체가 사용하는 클래스 -->
        <!-- ★ association → id 태그 : Primary Key -->
        <association property="member" javaType="com.my.vo.Member">
            <id property="member_id" column="MEMBER_ID" />
            <result property="name" column="NAME" />
            <result property="phone_number" column="PHONE_NUMBER" />
            <result property="home_address" column="HOME_ADDRESS" />
        </association>
    </resultMap>
    

1:N 매핑 (collection)

  • 가정
    • 특정 게시글에 대해서 작성되어 있는 댓글 목록을 가져온다.
  • vo
    //게시글 테이블
    @Data
    public class Board{
        private int no; //고유 번호
        private String title; //제목
        private String content; //내용
        private String writer; //작성자
        private Date sign_date; //작성일
        private Data modify_date; //수정일

        private List<Comment> comments; //댓글 목록
    }

    //댓글 테이블
    @Data
    public class Comment{
        private int no; //고유 번호
        private String content; //내용
        private String writer; //작성자
        private Date sign_date; //작성일
        private Data modify_date; //수정일

        private int board_no; //댓글을 작성한 게시글의 고유 번호
    }
    
  • sql
    <!-- 게시글 정보 -->
    <select id="getOneBoard" resultMap="boardInfo">
    SELECT 
        NO,
        TITLE,
        CONTENT,
        WRITER,
        SIGN_DATE,
        MODIFY_DATE
    FROM
        Board B
    WHERE
        NO = #{no}
    </select>

    <!-- 댓글용 서브쿼리 -->
    <select id="getCommentList" resultType="com.my.vo.Comment">
    SELECT 
        NO,
        CONTENT,
        WRITER,
        SIGN_DATE,
        MODIFY_DATE,
        BOARD_NO
    FROM
        Comment C
    WHERE
        BOARD_NO = #{no}
    </select>
    
  • result
    <!-- resultMap 태그 →  id 속성 : 사용할 resultMap의 고유 id -->
    <!-- resultMap 태그 → type 속성 : 데이터를 저장할 클래스 -->
    <resultMap id="boardInfo" type="com.my.vo.Board">
        <result property="no" column="NO"/>
        <result property="title" column="TITLE"/>
        <result property="content" column="CONTENT"/>
        <result property="writer" column="WRITER"/>
        <result property="sign_date" column="SIGN_DATE"/>
        <result property="modify_date" column="MODIFY_DATE"/>

        <!-- collection 태그 → property 속성 : 참조 객체 변수명 -->
        <!-- 예시 : Board 클래스에서 Comment 클래스를 comments라고 명시했으니 해당 속성의 값은 comments가 된다. -->
        <!-- collection 태그 → column 속성 : 서브쿼리에서 참조할 값이 될 메인쿼리의 칼럼 -->
        <!-- 값을 여러개 참조해야 할 때는 column="{prop1=COLUMN1, prop2=COLUMN2}"처럼 쓰면 된다. -->
        <!-- collection 태그 → javaType 속성 : List로 받을 것이기 때문에 java.util.ArrayList가 된다. -->
        <!-- collection 태그 → ofType 속성 : List로 받을 객체 클래스-->
        <!-- collection 태그 → select 속성 : List로 결과 값을 받기 위해 실행할 서브쿼리의 id -->
        <collection property="comments" column="NO" javaType="java.util.ArrayList" ofType="com.my.vo.Comment" select="getCommentList"/>
    </resultMap>
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.