개발/java

Mybatis resultMap으로 쿼리 결과 하나의 DTO에 매핑하기 & Enum 매핑

뽀글뽀글 개발자 2024. 5. 21. 13:53

Mybatis에 대해 무지한 상태로 사용하면서 여러 JOIN의 결과를 하나의 DTO로 받는 방법에 대해 찾아보다가 resultMap을 통해 받는 방법을 찾았다.

나는 설문 조사를 만드는 프로젝트를 진행하면서 설문조사에 질문 리스트가 있고 질문에 객관식 질문 리스트가 있는 구조의 결과를 받아야하는 상황에서 다음과 같은 resultMap을 선언해서 하나의 DTO로 결과를 반환할 수 있었다.

<resultMap type="surveyDTO" id="surveyDTO">
    <id property="id" column="survey_id" />
    <result property="memberId" column="member_id" />
    <result property="memberName" column="member_name" />
    <result property="title" column="title" />
    <result property="description" column="description" />
    <result property="stDate" column="st_date" />
    <result property="edDate" column="ed_date" />
    <collection property="questions" ofType="questionDTO">
        <id property="id" column="question_id" />
        <result property="surveyId" column="q_survey_id" />
        <result property="content" column="question_content" />
        <result property="type" column="question_type" javaType="QuestionType"
            typeHandler="enumTypeHandler"/>
        <result property="position" column="question_position" />
        <result property="isRequired" column="question_is_required" />
        <association property="fileVO" javaType="fileVO">
            <id property="id" column="file_id" />
            <result property="questionId" column="f_question_id" />
            <result property="originalName" column="original_name" />
            <result property="extension" column="extension" />
            <result property="savedName" column="saved_name" />
            <result property="path" column="path" />
            <result property="size" column="size" />
        </association>
        <collection property="options" ofType="selectOptionVO">
            <id property="id" column="option_id" />
            <result property="questionId" column="o_question_id" />
            <result property="content" column="option_content" />
            <result property="position" column="option_position" />
        </collection>
    </collection>
	</resultMap>

 

<collection>을 사용해서 리스트 필드를 받고 association을 사용해서 객체 필드를 받았다.

또한 내부에 Enum을 사용해서 eum도 받게 되었는데, enum은 TypeHandler를 구현해서 받을 수 있었다. 

 

 

타입 핸들러에 관한 내용은 링크에서 확인할 수 있다.