코딩 개발/Spring

MyBatis 4탄 - resultmap & join문

호소세 2023. 7. 13. 18:28
728x90
반응형

MyBatis 1탄 : https://pabeba.tistory.com/196

MyBatis 2탄 : https://pabeba.tistory.com/197

MyBatis 3탄 : https://pabeba.tistory.com/198

 

4탄 찐막하겠습니다. 객체 안에 객체가 있는 VO(Value Object)가 있다고 가정해 봅시다.

영화 테이블과 영화감독 테이블이 있으면

MovieVO 안에 DirectorVO가 있을 것입니다.

 

Resultmap 사용하여 리스트 불러오기

<MovieVO.java>

public class MovieVO {
	private long movieId;
	private String title;
	private String genre;
	private long attendance;
	private DirectorVO directorVO;

	public MovieVO() {
		super();
	}
...............중략

}

<DirectorVO.java>

public class DirectorVO {
	private long directorId; // column name : director_id => 설정으로 자동 매핑
	private String directorName; // 자동 매핑
	private String intro;

	public DirectorVO() {
		super();
	}

......중략
}

이런 식으로 VO를 만들어줍니다.

 

영화 list를 불러오는 test 코드를 작성해 보겠습니다.

 

<TestFindMovieList.java>

public class TestFindMovieList {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-mybatis-config.xml");
		MovieMapper mm = (MovieMapper) ctx.getBean("movieMapper");
		List<MovieVO> list = mm.findMovieList();
		for (MovieVO movie : list) {
			System.out.println("감독 이름 : " + movie.getDirectorVO().getDirectorName());
		}
		System.out.println(list);
		ctx.close();
	}
}

 

mapper.xml 파일에 SQL 문을 작성해 보겠습니다.

 

<MovieMapper.xml>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myproject.model.mapper.MovieMapper">
	<resultMap type="myproject.model.vo.MovieVO"
		id="movieListRM">
		<result property="directorVO.directorName"
			column="director_name" />
	</resultMap>
	<resultMap type="myproject.model.vo.MovieVO"
		id="detailMovieRM" extends="movieListRM">
		<id property="directorVO.directorId" column="director_id" />
		<result property="directorVO.intro" column="intro" />
	</resultMap>
	<select id="findMovieList" resultMap="movieListRM">
		SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
		d.director_name, d.intro FROM movie m INNER JOIN director d ON
		d.director_id = m.director_id
	</select>
</mapper>

여기서부터 설명이 필요합니다.

근데 코드가 워낙 직관적이기 때문에 금방 알 수 있습니다.

 

resultMap을 두 개로 나눈 이유는 extends를 사용하기 위함입니다.

 

1. 감독 이름 resultMap으로 넣기

<resultMap type="myproject.model.vo.MovieVO" id="movieListRM">
		<result property="directorVO.directorName" column="director_name" />
</resultMap>

<resultMap> 안에 내용을 작성합니다.

type - movieVO 안에 넣을 것이기 때문에 넣어주는 대상 객체를 type에 작성합니다.

id - 그냥 이름을 작명해 줍니다.

 

이렇게만 해도

<select id="findMovieList" resultMap="movieListRM">
	SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
	d.director_name, d.intro FROM movie m INNER JOIN director d ON
	d.director_id = m.director_id
</select>

감독의 이름을 넣을 수 있습니다. 

 

결과 값을 resultMap으로 만들어 놓은 movieListRM을 넣어주면 됩니다.

 

결과 값

MovieVO [movieId=1, title=설국열차, genre=SF, attendance=100, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]
MovieVO [movieId=2, title=기생충, genre=스릴러, attendance=1000, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]
MovieVO [movieId=3, title=살인의 추억, genre=스릴러, attendance=2000, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]

보시면 감독 이름만 잘 들어가고 다른 변수들은 값이 들어가지 않았습니다.

 

extends 하여 새로운 resultMap 값 생성하기

DirectorVO에 있는 아이디와 into 도 넣기 위해서 extends를 사용해서 넣어보겠습니다.

<resultMap type="myproject.model.vo.MovieVO" id="detailMovieRM" extends="movieListRM">
	<id property="directorVO.directorId" column="director_id" />
	<result property="directorVO.intro" column="intro" />
</resultMap>

이전에 사용했던 movieListRM의 문장을 extends 해서 작성한다는 의미입니다.

값을 넣는 것은 같습니다.

 

이렇게 하고

<select id="findMovieList" resultMap="detailMovieRM">
	SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
	d.director_name, d.intro FROM movie m INNER JOIN director d ON
	d.director_id = m.director_id
</select>

resultMap 값에 detailMovieRM을 넣게 되면?

 

결과 값

MovieVO [movieId=1, title=설국열차, genre=SF, attendance=100, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]
MovieVO [movieId=2, title=기생충, genre=스릴러, attendance=1000, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]
MovieVO [movieId=3, title=살인의 추억, genre=스릴러, attendance=2000, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]

보시면 아이디, 이름, 설명이 잘 들어가게 됩니다.

 

소감

이렇게 MyBatis 기초에 대한 알아보기가 끝났습니다.

설정파일만 잘 작성하고 이해한다면 나머지 뒤에 있는 문장들은 자연스럽게 알 수 있습니다. 설정 값이 추상적인 것이지 

SQL 문을 실행하는 것들은 개발자를 위해 너무 편하게 만들어져 있다고 생각됩니다.

다음 시간에는 Spring MVC에 대하여 알아보겠습니다. (매우 복잡)

반응형