데이터베이스와 관련된 조작을 하다보면 1:N (1 대 다수)의 관계를 가지는 엔터티가 종종 생긴다. Mybatis에서는 1:N 관계의 엔터티를 조인하여 한 번에 가져오기 위해 resultMap을 사용할 수 있다.
다음은 상품분류 테이블에서 상품분류 데이터를 가져오는 질의문이다. 하나의 상품분류는 여러 개의 사진을 가질 수 있다.
<select id="detail" parameterType="lprodVO" resultMap="lprodMap">
SELECT A.LPROD_ID, A.LPROD_GU, A.LPROD_NM,
B.SEQ, B.FILENAME, B.FILESIZE, B.THUMBNAIL, B.REGDATE, B.ETP_ID
FROM LPROD A INNER JOIN ATTACH B
ON A.LPROD_GU = B.ETP_ID
AND A.LPROD_GU = #{lprodGu}
</select>
하나의 상품분류 여러 개의 사진을 가질 수 있기 때문에 LprodVO에는 사진 데이터가 담기는 List 타입의 멤버변수가 존재한다.
여기서 이 List 타입의 멤버변수에 Mybatis에서 데이터를 넣어주기 위해 resultMap을 사용해 컬럼과 멤버변수를 연결해주어야 한다.
public class LprodVO {
private int lprodId;
private String lprodGu;
private String lprodNm;
private MultipartFile[] uploadFile;
private List<AttachVO> attachVOList;
...
}
최상단의 질의문에서 반환타입으로 resultType 대신 resultMap을 사용한 것을 볼 수 있는데 resultMap을 사용하면 MyBatis에서 개발자가 작성한 resultMap을 사용하겠다는 의미이다.
resultMap을 사용하면 개발자가 테이블의 컬럼명과 VO 클래스의 멤버 변수를 직접 이어줄 수 있다. VO 클래스는 테이블 하나의 스키마를 멤버변수를 통해 정의하는 클래스이다. 지금 같이 1:N 관계의 엔터티를 조인하여 조회할 때는 기존 테이블 이외의 데이터도 가져와야하기 때문에 다음과 같이 resultMap을 사용해 컬럼과 멤버변수를 이어주어야한다.
<resultMap type="lprodVO" id="lprodMap">
<id property="lprodGu" column="LPROD_GU" />
<result property="lprodId" column="LPROD_ID" />
<result property="lprodNm" column="LPROD_NM" />
<collection property="attachVOList" resultMap="attachMap"></collection>
</resultMap>
그중 List 타입의 멤버변수의 경우에는 또다른 VO 객체를 1개 이상 가지게 된다. 이에 대해서도 resultMap을 사용해 컬럼과 멤버변수를 매핑해주어야한다.
<resultMap type="attachVO" id="attachMap">
<id property="etpId" column="ETP_ID" />
<result property="seq" column="SEQ" />
<result property="filename" column="FILENAME" />
<result property="filesize" column="FILESIZE" />
<result property="thumbnail" column="THUMBNAIL" />
<result property="regdate" column="REGDATE" />
</resultMap>
* resultMap의 속성
type | 매핑을 할 VO 클래스 |
id | resultMap을 식별할 id |
* resultMap의 요소
id | 기본키(PK)를 지정할 때 사용한다. |
result | 일반 속성 컬럼을 지정할 때 사용한다. |
collection | Collection 타입의 멤버변수를 지정할 때 사용한다. 1 : N 관계일 때 N인 엔터티의 데이터를 담는다. |
* id, result의 속성
property | 연결할 VO 클래스의 멤버변수 이름 |
column | 연결할 DB의 컬럼 이름 |
* collection의 속성
property | 연결할 VO 클래스의 Collection 타입 멤버 변수 이름 |
resultMap | Collection이 담고 있는 VO 객체의 매핑을 설정할 resultMap의 id. List의 경우 제너릭 타입으로 설정한 VO 클래스를 resultMap을 사용해 추가로 매핑하게 된다. |
'웹 개발 > 웹 개발' 카테고리의 다른 글
AJAX를 사용한 파일 업로드 (0) | 2023.02.02 |
---|---|
MyBatis의 동적쿼리 (0) | 2023.02.01 |
Mybatis 다중행 삽입 (0) | 2023.01.30 |
WHOIS OpenAPI를 활용한 클라이언트 접속 국가 확인 (0) | 2023.01.24 |
쿠키(Cookie) (0) | 2023.01.18 |