본문 바로가기
교재 실습/자바 웹 개발 워크북

107. SQL 맵퍼 파일 (1)

by Jint 2022. 9. 1.

이번 절에서는 SQL 맵퍼 파일을 작성하는 방법에 대해 자세히 알아본다. 이전 절에서 작성한 MySqlProjectDao.xml 파일을 참고하여 설명한다. mybatis의 가장 중요한 목적 중 하나가 DAO로부터 SQL문을 분리하는 것이다. 이렇게 분리된 SQL문은 SqlSession 객체에서 사용한다. 다음은 이전 절에서 작성한 SQL 맵퍼 파일이다.

<?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="spms.dao.ProjectDao">
	<resultMap type="project" id="projectResultMap">
		<id column="PNO" property="no"/>
		<result column="PNAME"    property="title"/>
		<result column="CONTENT"  property="content"/>
		<result column="STA_DATE" property="startDate" javaType="java.sql.Date"/>
		<result column="END_DATE" property="endDate" javaType="java.sql.Date"/>
		<result column="STATE"    property="state"/>
		<result column="CRE_DATE" property="createdDate" javaType="java.sql.Date"/>
		<result column="TAGS"     property="tags"/>
	</resultMap>

	<select id="selectList" resultMap="projectResultMap">
		SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
		FROM PROJECTS
		ORDER BY PNO DESC
	</select>

	<insert id="insert" parameterType="project">
		INSERT INTO PROJECTS (PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS)
		VALUES (#{title}, #{content}, #{startDate}, #{endDate}, 0, now(), #{tags})
	</insert>

	<select id="selectOne" resultMap="projectResultMap" parameterType="int">
		SELECT PNO, PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS
		FROM PROJECTS
		WHERE PNO = #{value}
	</select>

	<update id="update" parameterType="project">
		UPDATE PROJECTS
		SET PNAME = #{title}
			,CONTENT = #{content}
			,STA_DATE = #{startDate}
			,END_DATE = #{endDate}
			,STATE = #{state}
			,TAGS = #{tags}
		WHERE PNO = #{no}
	</update>

	<delete id="delete" parameterType="int">
		DELETE FROM PROJECTS
		WHERE PNO = #{value}
	</delete>
</mapper>

 

1. SQL 맵퍼 파일 작성

SQL 맵퍼 파일은 XML이기 때문에 제일 먼저 XML 선언이 온다.

<?xml version="1.0" encoding="UTF-8"?>

 

다음으로 태그 규칙을 정의한 DTD 선언이 온다.

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

# <mapper> 루트 엘리먼트

SQL 맵퍼 파일은 루트 엘리먼트 <mapper> 태그를 작성하는 것으로 시작한다. <mapper> 태그의 namespace 속성은 자바의 패키지처럼 SQL문을 묶는 용도로 사용한다. 맵퍼 파일에 작성하는 모든 SQL문은 <mapper> 태그에 놓인다.

<mapper namespace="spms.dao.ProjectDao">
    ...
</mapper>

 

# <select>, <insert>, <update>, <delete> 엘리먼트

SQL문을 작성할 때 명령어에 따라 사용하는 태그가 다르다. SELECT문은 <select> 태그에 작성하고, INSERT문은 <insert> 태그, UPDATE문은 <update> 태그, DELETE문은 <delete> 태그를 사용하여 작성한다. 그러나 DELETE문을 <insert> 태그에 작성하더라도 문제는 없다. 그렇지만, 유지 보수를 위해서라도 다른 사람이 알아보기 쉽도록 의미 있는 태그를 사용하는 것을 권장한다.

<select ...>
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    ...
</select>

<insert ...>
    INSERT INTO PROJECTS (PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS)
    ...
</insert>

 

- id 속성

SQL문을 작성할 때 각각의 SQL문을 구분하기 위해 id 속성을 사용한다.

<select id="selectList" ...> ... </select>

<insert id="insert" ...> ... </insert>

<select id="selectOne" ...> ... </select>

<update id="update" ...> ... </update>

<delete id="delete" ...> ... </delete>

앞의 예제에서는 관리하기 쉽도록 일부러 id 값을 SqlSession 객체의 메서드 이름과 비슷하게 지었다.

 

- resultType 속성

SELECT문을 실행하면 결과가 생성되는데, 이 결과를 담을 객체를 지정하는 속성이 resultType이다. resultType에는 다음과 같이 클래스 이름(패키지 이름 포함)이 온다.

<select id="selectList" resultType="spms.vo.Project">

만약 mybatis 설정 파일에 다음과 같이 spms.vo.Project 클래스에 대한 별명이 정의되어 있다면,

- mybatis-config.xml의 일부분
<typeAliases>
    <typeAlias type="spms.vo.Project" alias="project"/>
    <typeAlias type="spms.vo.Member" alias="member"/>
</typeAliases>

resultType의 값으로 그 별명을 사용할 수 있다.

<select id="selectList" resultType="project">

 

- 컬럼과 셋터 메서드

mybatis는 SELECT 결과를 저장하고자 resultType에 선언된 클래스의 인스턴스를 생성한다. 그리고 다음 그림과 같이 각 컬럼에 대응하는 셋터 메서드를 찾아서 호출한다. 이때 셋터 메서드는 대소문자 구분없이 set을 뺀 메서드의 이름과 컬럼 이름이 같으면 된다(그림 1).

그림 1 (PROJECTS 테이블 컬럼과 spms.vo.Project 클래스의 셋터 메서드)

컬럼의 이름과 일치하는 셋터가 없다면, 해당 컬럼의 값은 인스턴스에 저장되지 않는다. 앞의 그림을 보면 결과 데이터의 컬럼 이름과 일치하는 셋터는 setState() 메서드 밖에 없다. 나머지 컬럼의 값은 Project 객체에 저장되지 않는다.

이 문제를 해결하려면 SELECT문을 작성할 때 컬럼에 별명을 붙이면 된다. 즉, 다음과 같이 셋터 이름과 똑같은 이름으로 각 컬럼에 대해 별명을 붙인다.

<select id="selectList" resultType="project">
    SELECT PNO AS NO
          ,PNAME AS TITLE
          ,STA_DATE AS STARTDATE
          ,END_DATE AS ENDDATE
          ,STATE
    FROM PROJECTS
    ORDER BY PNO DESC
</select>

이렇게 컬럼에 별명을 붙이는 방식은 '프로젝트 목록'뿐 아니라 '프로젝트 상세 정보'를 가져오는 SELECT문에도 별명을 붙여야 하므로 매우 번거롭다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

109. mybatis 설정 파일 (1)  (0) 2022.09.06
108. SQL 맵퍼 파일 (2)  (0) 2022.09.03
106. mybatis 적용 (4)  (0) 2022.08.31
105. mybatis 적용 (3)  (0) 2022.08.30
104. mybatis 적용 (2)  (0) 2022.08.29

댓글