Spring/Maven Project

Spring에 Model, Mapper XML 추가

carrotweb 2022. 10. 2. 14:31
728x90
반응형

이번에는 Spring-MyBatis를 이용하여 MariaDB에서 Query(쿼리)를 실행하여 데이터를 가져오도록 하겠습니다.

 

이전 "Maven Spring Project에 MariaDB JDBC(Java Database Connectivity) 적용"에서 MariaDB에 study란 이름으로 Database를 생성하고 INT_BOARD_TB란 게시판 Table를 생성하였습니다.

CREATE DATABASE study;

CREATE TABLE study.INT_BOARD_TB (
	BRD_SEQ BIGINT auto_increment NOT NULL COMMENT '게시판 시퀀스',
	BRD_SUBJECT VARCHAR(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '게시판 제목',
	BRD_CONTENT TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '게시판 내용',
	REG_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '등록자 아이디',
	REG_DTM DATETIME DEFAULT NOW() NOT NULL COMMENT '등록 일자',
	MOD_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '변경자 아이디',
	MOD_DTM DATETIME NULL COMMENT '변경 일자',
	CONSTRAINT INT_BOARD_TB_PK PRIMARY KEY (BRD_SEQ)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci
COMMENT='board';

 

INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert), 조회(select), 수정(update), 삭제(delete) 하기 위해서는 데이터 객체가 필요합니다. 이 데이터 객체는 MyBatis에서 insert, update, delete 할 때는 parameterType로 사용되고 select 할 때는 조건을 전달하기 위해서 parameterType로 사용되고 조회 결과를 받기 위해서 resultType 또는 resultMap의 type으로 사용됩니다. 이렇게 데이터베이스와 연동되는 객체가 Model(모델)이 됩니다.

 

그럼, Table의 칼럼에 대응하는 변수로 Model(모델)을 생성하겠습니다. 변수 명은 Full Name (풀 네임)으로 처리하겠습니다.

BRD_SEQ (게시판 시퀀스) → sequence
BRD_SUBJECT (게시판 제목) → subject
BRD_CONTENT (게시판 내용) → content
REG_ID (등록자 아이디) → registrationId
REG_DTM (등록 일자) → registrationDateTime
MOD_ID (변경자 아이디) → modificationId
MOD_DTM (변경 일자) → modificationDateTime

 

 

Maven Spring Project에 Board Model 추가하기

 

1. Java Resource > src/main/java에 com.home.study.test1 패키지에 board.model 패키지를 생성합니다.

  1. 모듈 별로 구분하기 위해서 com.home.study.test1 패키지에 board 패키지 생성
  2. board 패키지에 model 패키지 생성

 

2. com.home.study.test1.board.model 패키지에 Board 클래스를 생성합니다. (Board.java)

  1. Board 클래스에 Serializable가 구현(implements)되도록 class에 implements로 Serializable를 입력합니다.
  2. Board 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 "Add generated serial version ID"를 클릭하여 serialVersionUID를 생성합니다.
package com.home.study.test1.board.model;

import java.io.Serializable;

public class Board implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 2879518493396750972L;

	/**
	 * 게시판 시퀀스
	 */
	private int sequence = 0;

	/**
	 * 게시판 제목
	 */
	private String subject = "";

	/**
	 * 게시판 내용
	 */
	private String content = "";

	/**
	 * 등록자 아이디
	 */
	private String registrationId = "";

	/**
	 * 등록 일자
	 */
	private String registrationDateTime = "";

	/**
	 * 변경자 아이디
	 */
	private String modificationId = "";

	/**
	 * 변경 일자
	 */
	private String modificationDateTime = "";

	/**
	 * 게시판 시퀀스를 가져옵니다.
	 * @return 게시판 시퀀스
	 */
	public int getSequence() {
		return sequence;
	}

	/**
	 * 게시판 시퀀스를 설정합니다.
	 * @param sequence 게시판 시퀀스
	 */
	public void setSequence(int sequence) {
		this.sequence = sequence;
	}

	/**
	 * 게시판 제목을 설정합니다.
	 * @return 게시판 제목
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * 게시판 제목을 설정합니다.
	 * @param subject 게시판 제목
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * 게시판 내용을 가져옵니다.
	 * @return 게시판 내용
	 */
	public String getContent() {
		return content;
	}

	/**
	 * 게시판 내용을 설정합니다.
	 * @param content 게시판 내용
	 */
	public void setContent(String content) {
		this.content = content;
	}

	/**
	 * 등록자 아이디를 가져옵니다.
	 * @return 등록자 아이디
	 */
	public String getRegistrationId() {
		return registrationId;
	}

	/**
	 * 등록자 아이디를 설정합니다.
	 * @param registrationId 등록자 아이디
	 */
	public void setRegistrationId(String registrationId) {
		this.registrationId = registrationId;
	}

	/**
	 * 등록 일자를 가져옵니다.
	 * @return 등록 일자
	 */
	public String getRegistrationDateTime() {
		return registrationDateTime;
	}

	/**
	 * 등록 일자를 설정합니다.
	 * @param registrationDateTime 등록 일자
	 */
	public void setRegistrationDateTime(String registrationDateTime) {
		this.registrationDateTime = registrationDateTime;
	}

	/**
	 * 변경자 아이디를 가져옵니다.
	 * @return 변경자 아이디
	 */
	public String getModificationId() {
		return modificationId;
	}

	/**
	 * 변경자 아이디를 설정합니다.
	 * @param modificationId 변경자 아이디
	 */
	public void setModificationId(String modificationId) {
		this.modificationId = modificationId;
	}

	/**
	 * 변경 일자를 가져옵니다.
	 * @return 변경 일자
	 */
	public String getModificationDateTime() {
		return modificationDateTime;
	}

	/**
	 * 변경 일자를 설정합니다.
	 * @param modificationDateTime 변경 일자
	 */
	public void setModificationDateTime(String modificationDateTime) {
		this.modificationDateTime = modificationDateTime;
	}
}

 

 

Maven Spring Project에 MyBatis Mapper XML 추가하기

 

1. Java Resource > src/main/resource > com.home.study.test1.sqlmap 패키지에 mappers.mariadb.board 패키지를  생성합니다.

  1. com.home.study.test1.sqlmap 패키지에 Mapper XML 파일들을 저장하기 위해서 mappers 패키지 생성
  2. 데이터베이스 별로 구분하기 위해서 mappers 패키지에 mariadb 패키지 생성
  3. 모듈 별로 구분하기 위해서 mariadb 패키지에 board 패키지 생성

 

2. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 BoardMapper.xml 파일을 생성합니다.

 

<mapper>의 namespace(네임스페이스)는 Mapper XML 파일들을 서로 구분하기 위해서 사용됩니다. 그래서 하나의 Mapper XML 파일만 가리켜야 하기 때문에 중복되지 않아야 합니다. 그리고 namespace(네임스페이스)는 데이터를 처리하는 클래스(DAO)에서 Mapper XML 파일을 찾을 때 사용됩니다.

 

<mapper>의 namespace(네임스페이스)는 일반적으로 Mapper XML 파일들을 있는 src/main/resource의 패키지와 Mapper XML 파일 명을 결합하여 많이 사용합니다.

 

그래서, BoardMapper.xml 파일이 있는 패키지를 사용하여 namespace(네임스페이스)를 만들면 됩니다.

<mapper namespace="com.home.study.test1.sqlmapl.mappers.mariadb.board.BoardMapper">
</mapper>

 

그러나 이번 프로젝트에서는 namespace(네임스페이스)을 BoardMapper.xml 파일이 있는 패키지가 아닌 Board Model(모델)이 있는 src/main/java의 패키지와 Mapper XML 파일 명을 결합하여 사용하겠습니다.

<mapper namespace="com.home.study.test1.board.mapper.mariadb.BoardMapper">
</mapper>

 

MyBatis에서는 Mapper Scan 기능을 통해 패키지에 들어 있는 Mapper 인터페이스(interface) 파일들을 사용하여 자동으로 DAO와 같이 처리되게 해주는 기능이 있습니다. 트랜젝션이나 복잡한 쿼리가 없다면 별도의 DAO를 생성하지 않아도 되기 때문에 이 기능을 사용하는 것이 좋습니다.

 

그러나, 지금은 기초를 다지는 단계이기 때문에 Mapper 인터페이스(interface) 파일을 생성하지 않고 DAO를 생성하도록 하겠습니다.

 

향후를 위해 namespace(네임스페이스)는 Board Model(모델)이 있는 src/main/java의 패키지와 Mapper XML 파일 명을 결합하여 사용하겠습니다.

 

다음에 MyBatis의 Mapper Scan 기능에 대해 알아보겠습니다.

 

반응형

 

<mapper> 안에서는 insert(INSERT 쿼리문), select(SELECT 쿼리문), update(UPDATE 쿼리문), delete(DELEETE 쿼리문), resultMap(SELECT 쿼리 결과 데이터를 데이터 객체로 매핑하여 처리), sql(재사용하기 위한 쿼리문), cache(캐시 설정)를 설정할 수 있습니다.

 

INT_BOARD_TB(게시판) Table에 데이터(게시물)를 조회(select) 하기 위해서 <select>으로 쿼리문을 생성합니다.

 

<select>는 id 속성은 select를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다.

<select>는 id 속성은 DAO에서 구문을 찾을 때 사용됩니다.

<select> 안에는 SELECT 구문을 사용하여 데이터베이스에서 데이터를 가져오게 합니다.

<select>의 resultType 속성은 결과 데이터를 받을 Model(모델) 명을 입력합니다.

resultType 속성을 사용할 경우 SELECT 구문의 칼럼 명에 AS를 사용하여 Board Model(모델)에 있는 변수 명으로 입력해야 합니다.

<select id="selectBoardList" resultType="Board">
	SELECT BRD.BRD_SEQ AS sequence,
	       BRD.BRD_SUBJECT AS subject,
	       BRD.BRD_CONTENT AS content,
	       BRD.REG_ID AS registrationId,
	       DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS registrationDateTime
	  FROM INT_BOARD_TB BRD
</select>

 

<select>의 resultType 속성을 사용하면 매번 SELECT 구문의 칼럼 명에 AS를 사용해야 하는 번거로움이 있습니다. 그래서 <resultMap>을 생성하고 <select>의 resultType 속성 대신 resultMap 속성을 사용하면 SELECT 구문의 칼럼 명에 AS를 사용하지 않아도 됩니다.

 

<resultMap>은 SELECT 구문에서 조회된 결과를 Board Model(모델)에 매칭되는 변수로 매핑시켜 줍니다.

<resultMap>의 id 속성은 resultMap를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다.

<resultMap>의 id 속성은 <select>의 resultMap 속성에서 사용됩니다.

<resultMap>의 type 속성은 Model(모델)로 전체 클래스 경로(패키지 + 클래스, FQN)나 Alias(별칭)으로 입력합니다.

 

<resultMap> 안의 <result>의 column 속성은 SELECT 구문의 칼럼 명으로 property 속성은 Model(모델)에 매칭되는 변수 명으로 입력하면 됩니다.

<resultMap id="BoardMap" type="Board">
	<result column="BRD_SEQ" property="sequence"/>
	<result column="BRD_SUBJECT" property="subject"/>
	<result column="BRD_CONTENT" property="content"/>
	<result column="REG_ID" property="registrationId"/>
	<result column="REG_DTM" property="registrationDateTime"/>
	<result column="MOD_ID" property="modificationId"/>
	<result column="MOD_DTM" property="modificationDateTime"/>
</resultMap>

 

<resultMap>를 생성하였으니 <select>의 resultType 속성 대신 resultMap 속성으로 <resultMap>의 id를 입력합니다.

<?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="com.home.study.test1.board.mapper.mariadb.BoardMapper">

	<!--
		게시판 맵
	-->
	<resultMap id="BoardMap" type="Board">
		<result column="BRD_SEQ" property="sequence"/>
		<result column="BRD_SUBJECT" property="subject"/>
		<result column="BRD_CONTENT" property="content"/>
		<result column="REG_ID" property="registrationId"/>
		<result column="REG_DTM" property="registrationDateTime"/>
		<result column="MOD_ID" property="modificationId"/>
		<result column="MOD_DTM" property="modificationDateTime"/>
	</resultMap>

	<!--
		게시판 리스트를 가져옵니다.
	-->
	<select id="selectBoardList" resultMap="BoardMap">
		SELECT BRD.BRD_SEQ,
		       BRD.BRD_SUBJECT,
		       BRD.BRD_CONTENT,
		       BRD.REG_ID,
		       DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS REG_DTM
		  FROM INT_BOARD_TB BRD
	</select>
</mapper>

 

이이서, MyBatis를 이용하여 데이터를 처리하는 클래스(DAO)를 생성하고 Controller에 적용하여 처리해 보겠습니다.

728x90
반응형