본문 바로가기
웹개발지식쌓기

[back] Mybatis <association> 사용하기 - 게시글 + 게시글첨부파일 동시조회 (feat.부적합한 열)

by developer_j 2023. 11. 9.
728x90
반응형

association 사용법


가져오려는 객체와 연결된 다른 정보들을 객체화해서 가져오기 위해 1:1 관계일 경우 association 기능을 이용한다.

예를 들어, 게시글 정보와, 게시글의 파일 정보를 개별 테이블로 구분하여 사용하고 있고
게시글을 가져올 때 게시글의 첨부파일 정보를 가져오려 한다면 
게시글과 첨부파일 조회 쿼리매핑에 <association>을 사용할 수 있다.

 

매핑쿼리 목적 : 게시글 조회 getArticleDetail 호출 시, getFileObject도 함께 호출되어 첨부파일까지 한번에 조회


1. association 추가하기 전 쿼리 : 단순 게시글 조회

 

<!-- 게시글 정보 map  -->
<resultMap id="mapArticleDetail" type="ArticleVO" >
    <result property="articleSeq" column="ATC_SEQ"/>
    <result property="title" column="TITLE"/>
    <result property="registrationId" column="REG_ID"/>
    <result property="registrationDateTime" column="REG_DTM"/>
    <result property="contents" column="CTS"/>
    <result property="viewCount" column="VIEW_CNT"/>
</resultMap>

<!-- 게시글 검색 -->
<select id="getArticleDetail" parameterType="ArticleVO" resultMap="mapArticleDetail">
    SELECT
        ATC_SEQ
        , TITLE
        , REG_ID
        , REG_DTM
        , CTS
        , VIEW_CNT
    FROM TB_ATC_FILE
    WHERE ATC_SEQ = #{articleSeq}
</select>

 

 

2. <association> 추가 (게시글-첨부파일 관계가 1:1 인 경우임)

기존 게시글 map 구문에, <association> 추가

 

    <!-- 게시글 정보 map  -->
    <resultMap id="mapArticleDetail" type="ArticleVO" >
        <result property="articleSeq" column="ATC_SEQ"/>
        <result property="title" column="TITLE"/>
        <result property="registrationId" column="REG_ID"/>
        <result property="registrationDateTime" column="REG_DTM"/>
        <result property="contents" column="CTS"/>
        <result property="viewCount" column="VIEW_CNT"/>
        <!-- 추가 -->
        <association property="attachFile" column="{fileSeq=ATTCH_FILE_SEQ}" javaType="FileVO" select="getFileObject"/>
    </resultMap>

 

< association 속성 설명 >
property : 결과가 매핑될 VO 변수명. VO에 변수가 선언되어있고 + getter / setter 함수가 있어야 한다.
column : association 내용을 가져올 때 사용되는 kcp 값들, 복수사용 가능 (예) column="{fileSeq=FILE_SEQ,title=TITLE}"
javaType : 결과객체 타입
select : select 하는 데에 사용 될 쿼리의 id

 

3. association select 문에 사용될, key column을 가져오는 컬럼 추가

 

<association> 에 사용되는 key column을 가져오도록, 게시글 검색 쿼리(getArticleDetail)에 해당 컬럼(ATTCH_FILE_SEQ) 추가

 

	<!-- 게시글 검색 -->
	<select id="getArticleDetail" parameterType="ArticleVO" resultMap="mapArticleDetail">
		SELECT
		         ATC_SEQ
		       , TITLE
		       , REG_ID
		       , REG_DTM
		       , CTS
		       , VIEW_CNT
		       , ATTCH_FILE_SEQ <!-- 추가 !!!!!!!!!!!!!!!!! -->
		  FROM TB_ATC_FILE
		 WHERE ATC_SEQ = #{articleSeq}
	</select>

 

4. 파일 가져올 쿼리 추가 getFileObject

 

	<!-- 파일 map -->
	<resultMap id="mapFile" type="FileVO">
		<result property="fileSeq" column="FILE_SEQ"/>
		<result property="fileName" column="FILE_NM"/>
		<result property="fileUrl" column="FILE_URL"/>
		<result property="fileSize" column="FILE_SIZE"/>
		<result property="registrationDateTime" column="REG_DTM"/>
		<result property="registrationId" column="REG_ID"/>
	</resultMap>
	
	<!-- 파일 검색 -->
	<select id="getFileObject" parameterType="FileVO" resultMap="mapFile">
		SELECT
		         FILE_SEQ
		       , FILE_NM
		       , FILE_URL
		       , FILE_SIZE
		       , REG_DTM
		       , REG_ID
		  FROM TB_ATC_FILE
		 WHERE FILE_SEQ = #{fileSeq}
	</select>

 

파일 가져올 쿼리. select 기본 구조 사용

 

 

 

 

 

 

오류 발생 기록

 


1. association에 사용되는 column을 쿼리에서 가져오지 않고 있다면 발생할 수 있는 오류

"부적합한 열 이름"

하.. 진짜 이거때문에 .. 삽질했다

 



2. 가져오는 컬럼이 association에 사용하는 쿼리와 데이터가 맞지 않는 경우 

"java.lang.NoSuchMethodError"

parameterType과, javaType에 명시된 데이터가 잘못되지는 않았는지 보기

728x90
반응형