- ๊ด๋ จ ๊ธ
- MyBatis ์ค์ ํ์ผ - SQL Mapper ์์ฑ ๋ฐฉ๋ฒ
- MyBatis ์ค์ ํ์ผ ์์ฑ ๋ฐฉ๋ฒ
[JAVA/WEB] ์น ํ๋ก์ ํธ์ MyBatis ์ธํ ๋ฐ ์ ์ฉํ๊ธฐ
ํ๊ฒฝ ๋ฐ ๋ฒ์ ์ ๋ณด
IntelliJ IDEA 2019.3 Ultimate, JDK 11, Tomcat 9, MyBatis 3
MyBatis
Persistence framework ์ค ํ๋์ธ MyBatis๋ฅผ ์ฌ์ฉํ๋ฉด JDBC ํ๋ก๊ทธ๋๋ฐ ์์ด DB์ ์ฐ๋ํ ์ ์๋ค. ๊ฐ๋ฐ์๊ฐ JDBC API๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ MyBatis๊ฐ ๋์ ํธ์ถํ๋ ๋ฐฉ์์ด๋ค.
MyBatis์ ํต์ฌ์ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์๊ฐ ์ฝ๋๋ก ์์ค ์ฝ๋์ ๋ด์ฅ๋ผ์๋ SQL์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๋ํ ๋จ์ํ๊ณ ๋ฐ๋ณต์ ์ธ JDBC ์ฝ๋๋ฅผ ์บก์ํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ ๋ค.
1. MyBatis ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๋น
https://github.com/mybatis ์ ์ ์ํ๋ค.
Pinned repositories์์ mybatis-3์ ํด๋ฆญํ๋ค.
README.md์์ Download Latest๋ฅผ ํด๋ฆญํ๋ค.
Assets์์ mybatis-3.5.4.zip์ ํด๋ฆญํ๋ค.
์์ถ์ ํ๋ฉด JAR ํ์ผ๊ณผ ์ฌ์ฉ ์ค๋ช PDF ํ์ผ, ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ JARํ์ผ์ด ์๋ค.
mybatis-3.5.4.jar ํ์ผ๊ณผ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ๋ค์ ์น ํ๋ก์ ํธ์ ์ถ๊ฐํ๋ค.
2. DAO ๋ณ๊ฒฝ
MyBatis ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ด์ DB ์ฐ๋์ MyBatis๊ฐ ๋์ ํ๋ค.
JDBC ํ๋ก๊ทธ๋๋ฐ ๋์ , MyBatis์ SqlSessionFactory ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๊ณ DAO์ SQL๋ฌธ์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ ์ฐจ๋ก์ด๋ค.
1) SqlSessionFactory
1
2
3
4
5
6
|
// myBatis - SqlSessionFactory: SqlSession ๊ฐ์ฒด ์์ฑ
private SqlSessionFactory sqlSessionFactory;
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
|
cs |
์ฐ์ DAO ํด๋์ค์ SqlSessionFactory ์ธ์คํด์ค ๋ณ์์ setter๋ฅผ ์ ์ธํ๋ค.
MyBatis์์๋ SqlSession ๊ฐ์ฒด๊ฐ ์ค์ SQL์ ์คํํ๋๋ฐ, SqlSession ๊ฐ์ฒด๋ SqlSessionFactory๋ก๋ถํฐ ์ป์ ์ ์๋ค.
DAO๊ฐ ํ์๋กํ๋ SqlSessionFactory๋ ์ธ๋ถ์์ ์ฃผ์ ๋ ์ ์๋๋ก setter๋ฅผ ์ ์ธํ๋ ๊ฒ์ด๋ค.
2) Select
๋จผ์ MyBatis๋ฅผ ์ด์ฉํ select ๊ตฌํ ๋ฐฉ๋ฒ์ ์์๋ณด์.
selectList()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Override
public List<Project> selectList() throws SQLException {
// myBatis - SqlSession: SQL ์คํ
// openSession(): SqlSession ์ป๊ธฐ
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// selectList(): SELECT
// ํ๋ผ๋ฏธํฐ: SQL ๋งตํผ์ ๋ค์ ์คํ์ด์ค(com.atoz_develop.spms.dao.ProjectDao) + SQL๋ฌธ ID(selectList)
return sqlSession.selectList("com.atoz_develop.spms.dao.ProjectDao.selectList");
} finally {
sqlSession.close();
}
}
|
cs |
SqlSessionFactory ๊ฐ์ฒด์ openSession()์ ํธ์ถํด์ SqlSession์ ์ป๋๋ค.
SqlSession์ MyBatis์์ ์ค์ SQL ์คํ์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ์ด๋ค. ์ฆ SQL์ ์คํํ๋ ค๋ฉด SqlSession์ด ํ์ํ๋ฉฐ, ์ด ๊ฐ์ฒด๊ฐ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ค.
SqlSession ๊ฐ์ฒด์ selectList()๋ฅผ ํธ์ถํด์ select๋ฌธ์ ์คํํ ์ ์๋ค.
ํ๋ผ๋ฏธํฐ๋ก๋ SQL mapper์ ๋ค์ ์คํ์ด์ค์ SQL๋ฌธ id๋ฅผ ํฉ์น ๋ฌธ์์ด์ ๋๊ธด๋ค.
์ ์ฝ๋์์ com.atoz_develop.spms.dao.ProjectDao๊ฐ ๋ค์ ์คํ์ด์ค, selectList๊ฐ SQL๋ฌธ id์ ํด๋นํ๋ค.
๋ง์ง๋ง์ผ๋ก finally ๋ธ๋ก์์ SqlSession ๊ฐ์ฒด์ close()๋ฅผ ํธ์ถํด์ SQL๋ฌธ์ ์คํํ ๋ ์ฌ์ฉํ ์์์ ํด์ ํด์ค๋ค.
selectOne()
1
2
3
4
5
6
7
8
9
10
|
@Override
public Project selectOne(int no) throws SQLException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
return sqlSession.selectOne("com.atoz_develop.spms.dao.ProjectDao.selectOne", no);
} finally {
sqlSession.close();
}
}
|
cs |
ํ ๊ฐ ๋ฐ์ดํฐ๋ฅผ select ํด์ฌ ๋๋ selectOne() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
selectList()์ ๋ฌ๋ฆฌ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ์กฐ๊ฑด์ ์์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๋๊ธด๋ค.
์ด ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ํ์ ์ Object, ์ฆ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ผ ํ์ง๋ง int์ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ๋๊ฒจ๋ ์ปดํ์ผ ์ auto boxing์ด ์ํ๋ผ์ ๋ณํ ์์ด ๊ทธ๋๋ก ๋๊ฒจ๋ ๋๋ค.
3) Insert
insert()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Override
public int insert(Project project) throws SQLException {
// SqlSession sqlSession = sqlSessionFactory.openSession(true); // auto commit
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// insert(): INSERT
int count = sqlSession.insert("com.atoz_develop.spms.dao.ProjectDao.insert", project);
sqlSession.commit();
return count;
} finally {
sqlSession.close();
}
}
|
cs |
Insert๋ฌธ์ SqlSession ๊ฐ์ฒด์ insert()๋ฅผ ํธ์ถํด์ ์คํํ ์ ์๋ค.
selectList()์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ SQL mapper์ ๋ค์ ์คํ์ด์ค์ SQL id๋ฅผ ํฉ์น ๋ฌธ์์ด์ ๋๊ธด๋ค.
๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก๋ insert๋ฌธ์ ์คํํ ๋ ํ์ํ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง VO ๊ฐ์ฒด๋ฅผ ๋๊ธด๋ค.
insert() ํธ์ถ ํ commit()์ ํธ์ถํ๋ค.
SqlSession ๊ฐ์ฒด๋ฅผ ์ป์ ๋ openSession(true)์ ๊ฐ์ด ํธ์ถํ๋ฉด INSERT, UPDATE, DELETE๋ฌธ ์คํ ์ auto commit์ ์ํํ๋ SqlSession ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค.
4) Update
update()
1
2
3
4
5
6
7
8
9
10
11
12
|
@Override
public int update(Project project) throws SQLException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
int count = sqlSession.update("com.atoz_develop.spms.dao.ProjectDao.update", project);
sqlSession.commit();
return count;
} finally {
sqlSession.close();
}
}
|
cs |
UPDATE๋ฌธ์ SqlSession ๊ฐ์ฒด์ update()๋ฅผ ํธ์ถํด์ ์คํํ ์ ์๋ค.
๋ฌธ๋ฒ์ ์ด์ ๊ณผ ๋์ผํ๋ฏ๋ก ์๋ตํ๋ค.
5) Delete
delete()
1
2
3
4
5
6
7
8
9
10
11
12
|
@Override
public int delete(int no) throws SQLException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
int count = sqlSession.delete("com.atoz_develop.spms.dao.ProjectDao.delete", no);
sqlSession.commit();
return count;
} finally {
sqlSession.close();
}
}
|
cs |
DELETE๋ฌธ์ SqlSession ๊ฐ์ฒด์ delete()๋ฅผ ํธ์ถํด์ ์คํํ ์ ์๋ค.
๋ฌธ๋ฒ์ ์ด์ ๊ณผ ๋์ผํ๋ฏ๋ก ์๋ตํ๋ค.
์ด๋ ๊ฒ SQL๋ฌธ ๋ช ๋ น์ด์ SqlSession ๊ฐ์ฒด์ ๋ฉ์๋๋ช ์ด ๊ฑฐ์ ๋์ผํด์ ํธ์ถ ์ ํ๋ผ๋ฏธํฐ๋ง ์ ์ํด์ ๋๊ฒจ์ฃผ๋ฉด ํฌ๊ฒ ์ด๋ ค์ ์์ด DAO๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
3. SQL Mapper ํ์ผ ์์ฑ
SqlSession์ด SQL๋ฌธ์ ์คํํ ๋ ์ฐธ์กฐํ๋ SQL mapper ํ์ผ์ ์์ฑํ๋ค.
์ฆ ์๋ DAO ํด๋์ค์ ๋ด์ฅ๋ผ์๋ SQL๋ฌธ์ ์ด SQL mapper ํ์ผ๋ก ๋ถ๋ฆฌํด์ฃผ๋ ๊ฒ์ด๋ค.
DAO ํจํค์ง์ xml ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
ํ์ํ resultMap๊ณผ SQL๋ฌธ์ ๊ฐ์ ํ๋ก์ ํธ์ ๋ง๊ฒ ๋ณ๊ฒฝํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
<?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.atoz_develop.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" parameterType="int" resultMap="projectResultMap">
select PNO, PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS
from PROJECTS
where PNO = #{no}
</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 = #{no}
</delete>
</mapper>
|
cs |
์์ธํ ์์ฑ ๋ฐฉ๋ฒ์ MyBatis ์ค์ ํ์ผ - SQL Mapper ์์ฑ ๋ฐฉ๋ฒ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
SQL mapper ํ์ผ์์ <mapper>์ namespace๊ฐ ๊ณผ <select>, <insert>, <update>, <delete>์ id ๊ฐ์ SqlSession ๊ฐ์ฒด๊ฐ SQL๋ฌธ์ ์ฐพ์ ๋ ์ฌ์ฉํ๋ค.
DAO ํด๋์ค์์ SqlSession์ selectList(), selectOne(), insert(), update(), delete() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋๊ธฐ๋ ๋ฌธ์์ด ๊ฐ๊ณผ ๋งคํ๋๋ ๊ฒ์ด๋ค.
4. MyBatis ์ค์ ํ์ผ ์์ฑ
MyBatis ์ค์ ํ์ผ์๋ DB ์ปค๋ฅ์ ์ ์์ฑํ๋ data source์ ๋ํ ์ ๋ณด, ํธ๋์ญ์ ๊ด๋ฆฌ์, MyBatis ๋์์ ์ ์ดํ๋ ํ๊ฒฝ๊ฐ, SQL mapper ํ์ผ ๊ฒฝ๋ก ๋ฑ์ ์ค์ ํ๋ค.
DAO ํจํค์ง์ xml ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
์์ธํ ์ค์ ๊ฐ์ ๊ฐ์ ํ๋ก์ ํธ์ ๋ง๊ฒ ๋ณ๊ฒฝํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="com/atoz_develop/spms/dao/db.properties"/>
<typeAliases>
<typeAlias type="com.atoz_develop.spms.vo.Project" alias="project"/>
<typeAlias type="com.atoz_develop.spms.vo.Member" alias="member"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/atoz_develop/spms/dao/MySqlProjectDao.xml"/>
</mappers>
</configuration>
|
cs |
5. ํ๋กํผํฐ ํ์ผ ์์ฑ
MyBatis ์ค์ ํ์ผ์ <properties resource="...">์ ์ง์ ํ ํ๋กํผํฐ ํ์ผ์ ์์ฑํ๋ค.
์ด ํ์ผ์ DB ์ ์ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
1
2
3
4
|
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3307/spms
username=username
password=password
|
cs |
6. SqlSessionFactory ๊ฐ์ฒด ์์ฑ
DAO์์ SqlSessionFactory์ setter๋ฅผ ์ ์ธํด ์ฃผ์๋ค.
์ธ๋ถ์์ SqlSessionFactory ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฃผ์ ํด์ฃผ์ด์ผ ํ๋ค.
SqlSessionFactory๋ SqlSessionFactoryBuilder ๊ฐ์ฒด๋ฅผ ํตํด ์์ฑํ ์ ์๋๋ฐ build()๋ฅผ ํธ์ถํด์ ์์์ ์์ฑํ MyBatis ์ค์ ํ์ผ์ ์ ๋ ฅ ์คํธ๋ฆผ์ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค.
1
2
3
4
|
String resource = "com/atoz_develop/spms/dao/mybatis-config.xml";
// Resources.getResourceAsStream(): ClASSPATH ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ์
๋ ฅ ์คํธ๋ฆผ ์ป์
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
|
cs |
MyBatis ์ค์ ํ์ผ์ ๋ณดํต CLASSPATH์ ์์น์ํค๋๋ฐ, CLASSPATH์ ์๋ ํ์ผ์ ์ ๋ ฅ์คํธ๋ฆผ์ Resources ํด๋์ค์ getResourceAsStream()์ ์ด์ฉํด์ ์์ฝ๊ฒ ์ป์ ์ ์๋ค.
์ด๋ ๊ฒ ์์ฑํ sqlSessionFactory๋ฅผ DAO์ ์ฃผ์ ์์ผ์ฃผ๋ฉด MyBatis ์ฌ์ฉ์ ํ์ํ ๋ชจ๋ ๊ตฌํ์ด ์๋ฃ๋๋ค.
์๋ฒ ๊ธฐ๋ ํ ์ด์ ๊ณผ ๋์ผํ๊ฒ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํ๋์ง ํ์ธํด๋ณด์.
#MyBatis ์ค์ ํ์ผ
#MyBatis SQL Mapper
- ๊ด๋ จ ๊ธ
- MyBatis ์ค์ ํ์ผ - SQL Mapper ์์ฑ ๋ฐฉ๋ฒ
- MyBatis ์ค์ ํ์ผ ์์ฑ ๋ฐฉ๋ฒ
References
์ดํ๊ฐ์ ์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ๋ถ(ํ๋ฆฌ๋ , 2016, ์์ง์)
'Javaยท๏ปฟServletยท๏ปฟJSP > LibraryยทFramework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MyBatis ๋์ SQL - <choose>์ <set>์ ์ฌ์ฉํ์ฌ ๋์ SQL ๋ง๋ค๊ธฐ (1) | 2020.02.26 |
---|---|
MyBatis์ Log4J ์ฐ๋ํ๊ธฐ (0) | 2020.02.25 |
MyBatis ์ค์ ํ์ผ ์์ฑ ๋ฐฉ๋ฒ (0) | 2020.02.24 |
MyBatis ์ค์ ํ์ผ - SQL Mapper ์์ฑ ๋ฐฉ๋ฒ (6) | 2020.02.23 |
[JSP] JSTL ์ฌ์ฉ ๋ฐฉ๋ฒ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋ ๋ฐ ์ธํ (0) | 2020.02.14 |
๋๊ธ