Spring Quick Start(์ฑ )์ Day5 class01~02 ์ค์ต์ ์งํํ๋ฉด์ ๊ธฐ๋กํ ๋ด์ฉ์ ๋๋ค.
์ค์ตํ ์ฝ๋์ ๋งํฌ์ ๋๋ค.
Mybatis ํ๋ ์์ํฌ์ ์ค์ํ ํน์ง
-
ํ ๋์ค์ ์๋ฐ ์ฝ๋๋ก dB ์ฐ๋์ ์ฒ๋ฆฌํ๋ค
-
SQL ๋ช ๋ น์ด๋ฅผ java ์ฝ๋์์ ๋ถ๋ฆฌํ์ฌ XML ํ์ผ์ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค.
Mybatis ํ๋ ์์ํฌ๋ฅผ Data Mapper๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Mybatis๋ xmL ํ์ผ์ ์ ์ฅ๋ SQL ๋ช ๋ น์ด๋ฅผ ๋์ ์คํํ๊ณ ์คํ ๊ฒฐ๊ณผ๋ฅผ VO ๊ฐ์ ๊ฐ์ฒด์ ์๋์ผ๋ก ๋งคํ๊น์ง ํด์ค๋ค.
====Mybatis ํ๋ก์ ํธ ์์ฑ๋ฐฉ๋ฒ====
1. pom.xml์ dependency ๋ฑ๋กํ๊ธฐ
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- Ibatis -->
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
2. VO ํด๋์ค ์์ฑํ๊ธฐ
XML ํ์ผ์ ์ ์ฅ๋ SQL ๋ช ๋ น์ด์์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ๋ค์ ์ ๋ฌํ๊ณ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ๋๋ฐ ์ฐ์ธ๋ค.
package com.springbook.biz.board;
import java.util.Date;
public class BoardVO {
private int seq;
private String title;
private String writer;
private String content;
private Date regDate;
private int cnt;
private String searchCondition;
private String searchKeyword;
// getter, setter, toString
}
3. SQL Mapper XML ํ์ผ ์์ฑํ๊ธฐ
SQL Mapper XML์ DB ์ฐ๋์ ํ์ํ SQL ๋ช ๋ น์ด๋ค์ด ์ ์ฅ๋๋ Mybatis์์ ๊ฐ์ฅ ์ค์ํ ํ์ผ์ด๋ค.
SQL๋ฌธ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ฐ ์๋ณ์ฑ์ ๋์ด๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌธ์๋ก ์์ฑํ๋ค.
[resource/mappings/board-mapping.xml]
<mapper namespace="BoardDAO">
<insert id="insertBoard1">
SET @mymax := (SELECT MAX(SEQ) FROM BOARD);
</insert>
<insert id="insertBoard2">
INSERT INTO BOARD(SEQ, TITLE, WRITER, CONTENT)
VALUES (IFNULL(@mymax, 0)+1,#{title},#{writer},#{content});
</insert>
<update id="updateBoard">
UDDATE BOARD SET TITLE=#{title}, CONTENT=#{content} WHERE SEQ=#{seq}
</update>
<delete id="deleteBoard">
DELETE BOARD WHERE SEQ=#{seq}
</delete>
<select id="getBoard" resultType="board">
SELECT * FROM BOARD WHERE SEQ=#{seq}
</select>
<select id="getBoardList" resultType="board">
SELECT * FROM BOARD
WHERE TITLE LIKE '%'||#{searchKeyword}||'%'
ORDER BY SEQ DESC
</select>
</mapper>
1์ค: ๋๋ xml ํ์ผ์ด๋ค.
2์ค: DTD ์ ์ธ์ด๋ค.
<mapper>: ๋ฃจํธ ์๋ฆฌ๋จผํธ์ด๊ณ namespace ์์ฑ์ผ๋ก DAO ํด๋์ค์์ ์ฐธ์กฐํ ๋ ์ด ๊ฐ์ ์ด๋ค.
<select>์ ์์ฑ์๋ id, parameterType, resultType์ด ์๋ค.
-
id: ํ์ ์์ฑ์ผ๋ก <mapper>์ namespace ๊ฐ ๊ฐ์ ํ์ผ "์"์์ ์ ์ผํ ์์ด๋๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค.
-
parameterType: sql ์คํ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ๋ฐ์์ผํ ๋ ์ฌ์ฉํ๋ค.
-
parameterType="com.springbook.biz.board.BoardVO" ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ์์ ๊ฐ์ด #{๋ณ์๋ช } ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ์ค์ ํ ์ ์๋ค.
-
๊ฐ์ฅ ์ค์ํ ๊ฑด parameterType ์์ฑ์ ์๋ตํ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ ์๋ตํ๋ค๋ ๊ฒ์ด๋ค.
-
-
resultType: ๊ฒ์ ๊ฒฐ๊ณผ๋ก ResultSet์ด ๋ฆฌํด๋๋๋ฐ, ์ด๋ค ์๋ฐ ๊ฐ์ฒด์ ๋งคํํ ์ง ์ง์ ํ ๋ ์ฌ์ฉํ๋ค.
์์ ์ฝ๋์์ resultType="board"๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ sql-map-config.xml ํ์ผ์์ alias๋ก ๋ฑ๋กํด๋์๊ธฐ ๋๋ฌธ์ด๋ค.
<insert> ๊ตฌ๋ฌธ์ ์์ ์์๋ก <selectKey>๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด๋ ๊ธฐ๋ณธ ํค ํ๋๋ฅผ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๊ฒ ํ๋์ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ ์ ์๋ ๊ฒฝ์ฐ์ ( ์๋ฅผ ๋ค๋ฉด JOIN ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋) mapper ๋ฐ์ <resultMap>์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํ ๊ท์น์ ์ง์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
SQL ์์์ "WHERE SEQ < #{seq}" ์ ๊ฐ์ด ๋ถ๋ฑํธ๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด CDATA Section์ ์ฌ์ฉํ๋ฉด ๋๋ค.
4. Mybatis ๋ฉ์ธ ํ๊ฒฝ์ค์ ํ์ผ ์์ฑํ๊ธฐ
[resource/sql-map-config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Properties ํ์ผ ์ค์ -->
<properties resource="db.properties" />
<!-- Alias ์ค์ -->
<typeAliases>
<typeAlias alias="board" type="com.springbook.biz.board.BoardVO" />
</typeAliases>
<!-- DataSource ์ค์ -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- Sql Mapper ์ค์ -->
<mappers>
<mapper resource="mappings/board-mapping.xml" />
</mappers>
</configuration>
5. db.properties ํ์ผ ์์ฑํ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ๊ด๋ฆฌ ํ๋กํผํฐ ์ ๋ณด๊ฐ ๋ค์ด์๋ ํ์ผ์ด๋ค.
[resource/db.properties]
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springquickstart?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true
jdbc.username=jueun
jdbc.password=jueun
6. SqlSession ๊ฐ์ฒด ์์ฑํ๊ธฐ
Mybatis๋ฅผ ์ด์ฉํ์ฌ DAO๋ฅผ ๊ตฌํํ๋ ค๋ฉด SqlSession ๊ฐ์ฒด๊ฐ ํ์ํ๋ค.
๋ SqlSession ๊ฐ์ฒด๋ฅผ ์ป์ผ๋ ค๋ฉด SqlSessionFactory ๊ฐ์ฒด๊ฐ ํ์ํ๋ค.
package com.springbook.biz.util;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryBean {
private static SqlSessionFactory sessionFactory = null;
static {
try {
if (sessionFactory == null) {
// ์ฌ๊ธฐ๊ฐ ํต์ฌ์ฝ๋
// sql-map-config.xml์์ ์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด๋ค์ด๊ธฐ ์ํ ์
๋ ฅ ์คํธ๋ฆผ์ ์์ฑํ๊ณ
// ์ด ์
๋ ฅ ์คํธ๋ฆผ์ ํตํด SqlSessionFactory ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSessionInstance() {
return sessionFactory.openSession();
}
}
7. DAO ํด๋์ค ์์ฑํ๊ธฐ
SqlSession ๊ฐ์ฒด๋ Mapper XML์ ๋ฑ๋ก๋ SQL์ ์คํํ๊ธฐ ์ํ ๋ค์ํ API๋ฅผ ์ ๊ณตํ๋ค.
selectOne(), selectList(), insert(), update(), delete() ๋ฉ์๋์ด๋ค.
package com.springbook.biz.board.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.util.SqlSessionFactoryBean;
public class BoardDAO {
private SqlSession mybatis;
public BoardDAO() {
mybatis = SqlSessionFactoryBean.getSqlSessionInstance();
}
public void insertBoard(BoardVO vo) {
mybatis.insert("BoardDAO.insertBoard", vo);
mybatis.commit();
}
public void updateBoard(BoardVO vo) {
mybatis.update("BoardDAO.updateBoard", vo);
mybatis.commit();
}
public void deleteBoard(BoardVO vo) {
mybatis.delete("BoardDAO.deleteBoard", vo);
mybatis.commit();
}
public BoardVO getBoard(BoardVO vo) {
return (BoardVO) mybatis.selectOne("BoardDAO.getBoard", vo);
}
public List<BoardVO> getBoardList(BoardVO vo) {
return mybatis.selectList("BoardDAO.getBoardList", vo);
}
}
8. ํ ์คํธํด๋ณด๋ ํด๋ผ์ด์ธํธ ์์ฑํด์ ์คํํด๋ณด๊ธฐ
main > test ํด๋ ๋ฐ์ ํด๋นํ๋ค.
package com.springbook.biz.board;
import com.springbook.biz.board.impl.BoardDAO;
import java.util.List;
public class BoardServiceClient {
public static void main(String[] args) {
BoardDAO boardDAO = new BoardDAO();
BoardVO vo = new BoardVO();
vo.setTitle("myBatis ์ ๋ชฉ");
vo.setWriter("ํ๊ธธ๋");
vo.setContent("myBatis ๋ด์ฉ์
๋๋ค......");
boardDAO.insertBoard(vo);
vo.setSearchCondition("TITLE");
vo.setSearchKeyword("");
List<BoardVO> boardVOList = boardDAO.getBoardList(vo);
for (BoardVO board: boardVOList)
System.out.println("---> " + board.toString());
}
}
๋ฐ์ ์ ์คํ๋ ํ๋ฉด์ด๋ค.
'Spring > Spring Quick Start' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ํ๋ก์ ํธ (0) | 2021.01.08 |
---|---|
์๋ธ๋ฆฟ ๊ฐ์ฒด์ service() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ณผ์ (0) | 2021.01.07 |
์คํ๋ง ์ปจํ ์ด๋์ ๊ด๊ณ (0) | 2021.01.07 |
intelliJ ํฐ์บฃ ์๋ฒ๋ก ์คํํ๊ธฐ (0) | 2021.01.07 |
IntelliJ๋ก, Spring ํ๋ก์ ํธ(maven) ์์ฑํ๊ธฐ (0) | 2021.01.07 |
IntelliJ Add Framework Support์ Spring์ด ๋ณด์ด์ง ์์ ๋ (0) | 2021.01.07 |