๋ฐฑ์๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํ๋ ์์ํฌ์๋ ๊ฐ์ฅ ํํ๊ฒ MyBatis์ JPA๊ฐ ์๋ค.
MyBatis์ JPA์ ์ฐจ์ด์ ๋ํด ์ ๋ฆฌํด๋ณด์!
1. DB์ ์ฐ๋ํ๊ธฐ ์ํ ๊ธฐ์
DB์ ์ฐ๋ํ๊ธฐ ์ํ ๊ธฐ์ ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. (ํ๋ ์์ํฌ)
1) SQL Mapper
2) ORM (Object Relational Mapping)
SQL Mapper
: ๊ฐ๋ฐ์๊ฐ ์์ฑํ SQL ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์ ๋งคํํจ.
ORM (Object Relational Mapping)
: ๊ฐ์ฒด, DB๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํํ๋ค
-> ๋ ๊ธฐ์ ์ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๋ ๊ณตํต์ ์ ๊ฐ์ง์ง๋ง, ์๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๋ค.
2. MyBatis vs. JPA
MyBatis ๋ SQL Mapper ๊ธฐ์ ์ ์ ๊ณตํ๋ฉฐ,
JPA๋ ORM ์ ์ ๊ณตํ๋ค.
MyBatis
- JDBC ๋ฅผ ๋จ์ํํ์ฌ Java ์ฝ๋์์ SQL๋ฌธ์ ๋ถ๋ฆฌํด์ ๋ณ๋์ XML ํ์ผ๋ก ์ ์ฅํ๊ณ , XML ํ์ผ- Java ํ์ผ ๋์ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- MyBatis ์์ Java ๋ฉ์๋์ Sql์ ์๋ก ๋งคํ์ํจ๋ค.
- ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ Java ๋ฉ์๋ ์ ์ธ, SQL๋ฌธ๋ง ๋ง๋ค์ด์ฃผ๋ฉด MyBatis ๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ค๋ค.
- SQL๋ฌธ์ด Java ํ์ผ์์ ๋ถ๋ฆฌ๋ ํํ์์ผ๋ก ๊ด๋ฆฌ๊ฐ ํธํ๋ค.
- ๋์ SQL ์์ฑ ๊ธฐ๋ฅ : ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์ ๋ ฅ๋๋ ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ SQL๋ฌธ์ ๋์ ์ผ๋ก ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ.
- MyBatis ๋ด์ if๋ฌธ, choose, when ๋ฑ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. = ๋์ ์ธ SQL ๋ฌธ ์์ฑ ๊ฐ๋ฅ
<select id="findActiveBlogwithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE'
<if test= "title != null" >
AND title like #{title}
</if>
<select>
- xml ํ์ผ ์์
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.myboard">
<resultMap type="MyBoardDto" id="MyBoardMap">
<result property="myno" column="MYNO"/>
<result property="myname" column="MYNAME"/>
<result property="mytitle" column="MYTITLE"/>
<result property="mycontent" column="MYCONTENT"/>
<result property="mydate" column="MYDATE"/>
</resultMap>
<select id="selectAll" resultType="com.my.model.dto.MyBoard">
SELECT *
FROM MYBOARD
ORDER BY MYNO DESC
</select>
<select id="selectOne" resultMap="MyBoardMap">
SELECT *
FROM MYBOARD
WHERE MYNO = ${myno}
</select>
<!-- resultType => ํ์์์ด์ -->
<insert id="">
INSERT INTO MYBOARD
VALUES(SEQ_MYBOARD.NEXTVAL, #{myname), #{mytitle}, #{mycontent}, CURRENT_DATE)
</insert>
</mapper>
- xml ํ์ผ๋ก sql ๋ฌธ์ด ๋ถ๋ฆฌ๋ java ํ์ผ
//์ ์ฒด์ถ๋ ฅ
public List<MyBoard> selectAll(){
List<MyBoard> res = new ArrayList<>();
SqlSession session = null;
session = getSqlSessionFactory().openSession(true);
res = session.selectList("com.my.myboard.selectAll");
session.close();
return res;
}
- MyBatis ์ฌ์ฉ ์ํ๋ค๋ฉด ์ด๋ฐํํ์์ ๊ฒ ( Java ํ์ผ ์์ sql ๋ฌธ ใ )
//์ ์ฒด์ถ๋ ฅ
public List<MyBoard> selectAll(){
try {
con= DriverManager.getConnection(url,username,password);
System.out.println("02.๊ณ์ ์ฐ๊ฒฐ");
}catch(SQLException e) {
System.out.println("02.๊ณ์ ์ฐ๊ฒฐ ์คํจ");
e.printStackTrace();
}
Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM MYBOARD";
List<MyBoard> res = new ArrayList<>();
try {
stmt = con.createStatement();
System.out.println("03. query์ค๋น: "+sql);
rs = stmt.executeQuery(sql);
System.out.println("04. query ์คํ ๋ฐ ๋ฆฌํด");
while(rs.next()) {
MyBoard tmp = new MyBoard(rs.getInt(1),rs.getString(2), rs.getString(3),rs.getString(4),rs.getDate(5));
res.add(tmp);
}
}
catch(SQLException e){
System.out.println("3/4 ๋จ๊ณ ์๋ฌ");
e.printStackTrace();
}
finally {
try {
rs.close();
stmt.close();
con.close();
System.out.println("05. db์ข
๋ฃ \n");
}
catch(SQLException e) {
System.out.println("05. db์ข
๋ฃ์๋ฌ");
e.printStackTrace();
}
}
return res;
}
JPA ( Java Persistence API )
- Java์ ๊ฐ์ฒด์ DB์ entity( ํ ์ด๋ธ) ์์ฒด๋ฅผ ๊ทธ๋๋ก ๋งคํํด์ ์ฒ๋ฆฌํ ์ ์๋ ์ ๊ทผ๋ฐฉ์์ ์ฌ์ฉํจ
- DB - ๋ฐ์ดํฐ์ค์ฌ๊ตฌ์กฐ / Java - ๊ฐ์ฒด์งํฅ์ ๊ตฌ์กฐ ์ด ๋์ฌ์ด์ ๋ณํ์ด ์ด๋ ค์ ๋๋ฐ, JPA ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ ์ ์์.
- ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ๊ธฐ์ ์ ์ฌ์ฉํจ์ผ๋ก์ ๊ฐ์ฒด์งํฅ ๊ด์ ์์ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ๋๋ก ๋์.
- Java์ DB ๋ฐ์ดํฐ ๊ฐ์ ๋งคํ์ ์๋ํ -> ๊ฐ๋ฐ์๋ SQL๋ฌธ์ ์์ฑํ ํ์ X
- ORM ๋ด๋ถ์ ์ผ๋ก java ๋ฉ์๋์ ์ ํฉํ SQL ๋ฌธ์ด ์๋์ผ๋ก ์์ฑ์ด ๋์ด ์คํ๋๋ค.
*ํ์ต ํ ์์ ์ฝ๋ ์ถ๊ฐ ์์
- ๊ฐ์ฒด ์งํฅ์ ์ ๊ทผ, ๊ฐ๋จํ ๋งคํ -> JPA
- ๋ณต์กํ ์ฟผ๋ฆฌ, SQL ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ -> MyBatis
๋ฌผ๋ก ์ ๋ต์ ์๊ณ , ์ด๋ฐ ํน์ฑ์ ๊ฐ์ง๋ค ์ ๋๋ก ์ดํดํ์.
๊ฐ๋ฐ์์ ์ ํธ๋์ ํ๋ก์ ํธ ํน์ฑ์ ๋ฐ๋ผ ์ฌ์ฉ.
'๐ป > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ๋กํน(Locking) ๋จ์ , ๋กํน๊ณผ ๋ณํ์ฑ, DB ๋กํน ๊ธฐ๋ฒ (0) | 2025.02.26 |
---|---|
[DB/OracleDB] Oracle DB ์ญ์ ํ ๋ฐ์ดํฐ ๋ณต๊ตฌํ๊ธฐ (TIMESTAMP) (0) | 2025.01.23 |
[DB/OracleDB] SQL๋ฌธ ์กฐํ, ํจ์ ์ ๋ฆฌ (2) | 2024.09.09 |
[DB/OracleDB] Oracle Cloud , DBeaver ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ํ๊ธฐ (2) | 2024.09.08 |