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에 명시된 데이터가 잘못되지는 않았는지 보기
'웹개발지식쌓기' 카테고리의 다른 글
Git 설치하기 : 'git'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. (0) | 2023.12.10 |
---|---|
[back] 함수가 있는데 없다고 나와요 : The method METHOD() from the type CLASS is not visible (1) | 2023.12.08 |
[back] 클라이언트 오류로서 인지된 어떤 문제로 인하여, 서버가 해당 요청을 처리할 수 없거나 어쩌구 저쩌구 (0) | 2023.10.19 |
[back] Mybatis 쿼리 작동 오류 Query Result[]: -1row (0) | 2023.10.17 |
[back] 엑셀 파일 생성 및 다운로드 소스 구조 (0) | 2023.09.01 |