** ๐ 9๋จ๊ณ: ๊ธฐ์ ๋ฉด์ & ์ต์ข
์ ๋ฆฌ ๐ ์์ ์ง๋ฌธ 20์ (MyBatis + JSP MVC2 ๊ธฐ๋ฐ) **
๐ ๋ชฉ์ฐจ
- MyBatis ๊ธฐ๋ณธ
- Mapper, DAO, Service ๊ตฌ์กฐ
- ๋์ SQL, ํธ๋์ญ์
, ์๋ฌ ์ฒ๋ฆฌ
- JSP + JSTL + MVC ํ๋ฆ
- ์ค๋ฌด ํ์ฅ & ๋น๊ต ์ง๋ฌธ
๐งฉ 1. MyBatis ๊ธฐ๋ณธ
โ
Q1. MyBatis๋ ๋ฌด์์ธ๊ฐ์?
- SQL Mapper ํ๋ ์์ํฌ
- SQL์ XML์ ์ ์, Java ์ฝ๋์์ ๊ฐํธํ๊ฒ ํธ์ถ
- ORM์ ์๋์ง๋ง, SQL์ ์์ ๋กญ๊ฒ ๋ค๋ฃจ๊ธฐ ์ ๋ฆฌ
- JDBC๋ณด๋ค ์ฝ๋ ๊ฐ๊ฒฐ, SQL ์ฑ๋ฅ ํ๋ ์ฉ์ด
โ
Q2. resultType
๊ณผ resultMap
์ ์ฐจ์ด๋?
ํญ๋ชฉ |
resultType |
resultMap |
๋งคํ ๋ฐฉ์ |
์๋ ๋งคํ (์ปฌ๋ผ=ํ๋) |
์๋ ๋งคํ (๋ช
์์ ์ง์ ) |
์ฌ์ฉ ์ |
SELECT * FROM student |
JOIN, alias, ๋ณต์กํ ๊ฒฐ๊ณผ |
์ฅ์ |
๊ฐ๋จ, ๋น ๋ฆ |
์ ๋ฐ ์ ์ด ๊ฐ๋ฅ |
๋จ์ |
์ปฌ๋ผโ ํ๋ ์ ์คํจ |
์ค์ ๋ณต์กํจ |
โ
Q3. #{} vs ${}
์ฐจ์ด?
ํญ๋ชฉ |
#{} |
${} |
์ฒ๋ฆฌ ๋ฐฉ์ |
๋ฐ์ธ๋ฉ (PreparedStatement) |
๋ฌธ์์ด ์นํ |
๋ณด์ |
โ
์์ (SQL Injection ๋ฐฉ์ง) |
โ ์ํ (์ฃผ์ ํ์) |
์ฌ์ฉ ์ |
WHERE name = #{name} |
ORDER BY ${column} (ํ์ดํธ๋ฆฌ์คํธ ํ์) |
โ
Q4. MyBatis์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ 3๊ฐ์ง ๋ฐฉ์์?
๋ฐฉ์ |
์์ |
์ค๋ช
|
๋จ์ผ ๊ฐ |
int id |
selectOne(โidโ, 1001) |
Map |
Map<String, Object> |
์ฌ๋ฌ ์กฐ๊ฑด ์ ๋ฌ ์ ์ฌ์ฉ |
DTO |
Student ๊ฐ์ฒด |
form ์ ์ฒด ์ ๋ฌ ์ ์ฌ์ฉ |
โ
Q5. ๋์ SQL ์์ฑ ๋ฐฉ๋ฒ์?
<if test="์กฐ๊ฑด">
<where>
, <choose>
, <foreach>
, <trim>
- ์กฐ๊ฑด์ ๋ฐ๋ผ SQL์ ์ ๋์ ์ผ๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ
- ํนํ ์กฐ๊ฑด ๊ฒ์, ๋์ INSERT, ๋ค์ค ์กฐํ์์ ์ ์ฉ
๐งฉ 2. Mapper, DAO, Service ๊ตฌ์กฐ
โ
Q6. Mapper์ DAO์ ์ฐจ์ด๋?
ํญ๋ชฉ |
Mapper |
DAO |
์์น |
XML / ์ธํฐํ์ด์ค |
Java ํด๋์ค |
์ญํ |
SQL ์ ์ |
DB ํธ์ถ ๋ก์ง ๋ด๋น |
ํธ์ถ ๋ฐฉ์ |
ID or ์ธํฐํ์ด์ค |
SqlSession์ผ๋ก ํธ์ถ |
โ
Q7. DAO โ Service โ Controller ๊ณ์ธต ๋ถ๋ฆฌ ์ด์ ?
- Controller: ์์ฒญ ์ฒ๋ฆฌ / JSP ์ ๋ฌ
- Service: ๋น์ฆ๋์ค ๋ก์ง / ํธ๋์ญ์
๊ด๋ฆฌ
- DAO: DB ์ ์ฉ ์ ๊ทผ
์ ์ง๋ณด์์ ํ
์คํธ, ์ฌ์ฌ์ฉ์ฑ ํฅ์
โ
Q8. MyBatis Mapper XML ๊ตฌ์กฐ๋?
<mapper namespace="dao.StudentMapper">
<select id="getAllStudents" resultType="main.Student">
SELECT * FROM student
</select>
</mapper>
- namespace๋ ์ธํฐํ์ด์ค์ ์ผ์นํด์ผ ํจ
- id๋ ํธ์ถ ๋ฉ์๋๋ช
๊ณผ ๊ฐ์์ผ ํจ
โ
Q9. SqlSessionFactory๋ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋์?
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
- DB ์ฐ๊ฒฐ, ํธ๋์ญ์
๊ด๋ฆฌ์ ํต์ฌ
- ๋ณดํต static ์ด๊ธฐํ ๋ธ๋ก์์ 1ํ๋ง ์์ฑ
โ
Q10. Mapper XML ๋ฑ๋ก ๋ฐฉ๋ฒ์?
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mapp
resource="๊ฒฝ๋ก"
๋ classpath ๊ธฐ์ค
- ์ด๋
ธํ
์ด์
๋ฐฉ์์ธ ๊ฒฝ์ฐ
<mapper class="dao.StudentMapper"/>
๐งฉ 3. ํธ๋์ญ์
& ์์ธ ์ฒ๋ฆฌ
โ
Q11. ํธ๋์ญ์
์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์?
try {
session.insert(...);
session.update(...);
session.commit();
} catch (Exception e) {
session.rollback();
}
- ์์ธ ๋ฐ์ ์ rollback
- ๋ฐ๋์
finally { session.close(); }
ํ์
โ
Q12. insert/update/delete ์ commit()
์ด ํ์ํ๊ฐ์?
- โ
Yes
autoCommit=false
๊ฐ ๊ธฐ๋ณธ๊ฐ
- commit ์ ํ๋ฉด DB์ ๋ฐ์ ์ ๋จ
โ
Q13. SQL ์์ธ ๋ก๊ทธ ๋ถ์ ๋ฐฉ๋ฒ์?
### The error may exist in mapper/StudentMapper.xml
### SQL: SELECT * FROM ...
### Cause: java.sql.SQLSyntaxErrorException: ...
- XML ์์น, SQL ๋ฌธ์ฅ, ์๋ฌ ์ฝ๋ 3๋จ๊ณ ํ์ธ
- log4j ์ค์ ์ผ๋ก Preparing, Parameters ํ์ธ ํ์
โ
Q14. NullPointerException์ ๋ฐฉ์งํ๋ ํจํด์?
Student s = mapper.getStudentByHakbun(9999);
if (s != null) {
System.out.println(s.getIrum());
} else {
System.out.println("์กฐํ ๊ฒฐ๊ณผ ์์");
}
selectOne()
์ ์กด์ฌํ์ง ์์ผ๋ฉด null
๋ฐํ
- ํญ์
null
์ฒดํฌ ํ์
โ
Q15. selectList() ๊ฒฐ๊ณผ๊ฐ null์ผ ์ ์๋์?
- ๊ธฐ๋ณธ์ ๋น ๋ฆฌ์คํธ (
[]
) ๋ฐํ
- ์ค์ ์ ๋ฐ๋ผ
null
์ผ ์๋ ์์ผ๋ isEmpty()
์ฒดํฌ์ ๋ณํ
๐งฉ 4. JSP + JSTL ์ฐ๋
โ
Q16. Controller์์ JSP๋ก ๋ฐ์ดํฐ ๋๊ธฐ๋ ๋ฐฉ๋ฒ์?
request.setAttribute("list", list);
request.getRequestDispatcher("/view/student/list.jsp").forward(request, response);
- JSP์์๋
${list}
, <c:forEach>
๋ก ์ถ๋ ฅ
โ
Q17. JSTL๊ณผ EL์ ์ฌ์ฉํ๋ ์ด์ ๋?
- scriptlet ์์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด
- ๊ฐ๋
์ฑ, ์ ์ง๋ณด์, ์ฌ์ฌ์ฉ์ฑ์ด ์ข์์ง
โ
Q18. ์
๋ ฅ ํผ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ Controller๋ก ์ ๋ฌํ๋์?
<form method="POST" action="insert.do">
request.getParameter("...")
๋ก ์ถ์ถ ํ DTO์ set
๐งฉ 5. ์ค๋ฌด ๋น๊ต & ์ข
ํฉ ์ง๋ฌธ
โ
Q19. MyBatis์ JPA์ ์ฐจ์ด์ ์?
ํญ๋ชฉ |
MyBatis |
JPA (Hibernate) |
SQL ์์ฑ |
์ง์ ์์ฑ (์์ ๋ก์) |
SQL ์๋ต (์๋ ์์ฑ) |
์ฑ๋ฅ ํ๋ |
SQL ํ๋ ์ฌ์ |
SQL ์ ์ด ์ด๋ ค์ |
๋ฌ๋ ์ปค๋ธ |
๋น๊ต์ ์ฌ์ |
๊ฐ์ฒด-๊ด๊ณ ๋งคํ ํ์ต ํ์ |
๋ํ ์ฑํฅ |
SQL ์ค์ฌ |
๊ฐ์ฒด ์ค์ฌ |
โ
Q20. MyBatis์ ๋จ์ ์?
- SQL์ด ๋ง์์ง ๊ฒฝ์ฐ XML ๊ด๋ฆฌ ๋ถ๋ด
- ์ฟผ๋ฆฌ ์ฌ์ฌ์ฉ์ ์ํ
<sql>
, <include>
ํ์ต ํ์
- join ๊ฒฐ๊ณผ ๋งคํ ๋ณต์กํ ๊ฒฝ์ฐ
resultMap
์๋ ๋งคํ ํ์
๐ ๊ธฐ์ ๋ฉด์ ์ด์ ๋ฆฌ
โ
๋ด๊ฐ ๊ตฌํํ ํ๋ก์ ํธ ํ๋ฆ์ ์ ํํ ์๊ณ ,
โ
๊ฐ ๊ณ์ธต์ ์ญํ ๊ณผ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ณ ,
โ
์์ฃผ ๋์ค๋ ๋น๊ต ์ง๋ฌธ(resultType vs resultMap, #{} vs ${}) ์ ํ์คํ ๋งํ ์ ์์ด์ผ ํด!
๐จโ๐ป MyBatis ๊ธฐ์ ๋ฉด์ ์์ฝ
- SQL Mapper ํ๋ ์์ํฌ
resultType
vs resultMap
์ฐจ์ด
#{}
vs ${}
๋ฐ์ธ๋ฉ ์ฐจ์ด
- ๋์ SQL, ํธ๋์ญ์
, ์์ธ ์ฒ๋ฆฌ
- DAO โ Service โ Controller ๊ตฌ์กฐ ํ๋ฆ
Mapper
, JSTL
, EL
, form
์ฒ๋ฆฌ ๋ฐฉ์
- JPA์ ์ฐจ์ด์ , ์ค๋ฌด ์ ํ ๊ธฐ์ค
โ
๐ก ์ค์ ํ 20์ โ MyBatis + JSP MVC2 ํ๋ก์ ํธ์ฉ
์์ฃผ ํ๋ ์ค์๋ถํฐ DAO/DTO ์ค๊ณ ์ ๋ต๊น์ง ์ค๋ฌด ์ค์ฌ์ผ๋ก ์ ๋ฆฌ
โจ ์ ์ง๋ณด์, ํ์ฅ์ฑ, ์์ ์ฑ์ ๋์์ ๊ณ ๋ คํ ์ค์ ๋ง์ธ๋์
๐ 1. Mapper / SQL ๊ด๋ จ ํ
โ
1. resultType
์ ์ปฌ๋ผ๋ช
= ํ๋๋ช
์ผ ๋๋ง!
- ์ปฌ๋ผ๋ช
์ด ๋ค๋ฅด๋ฉด
resultMap
์ ๊ผญ ์ฌ์ฉํด์ผ ํจ
- ์กฐ์ธ ๊ฒฐ๊ณผ ๋๋ alias ์ฌ์ฉ ์ ์๋ ๋งคํ ์คํจ
โ
2. #{}
vs ${}
ํผ์ฉ ์ฃผ์
๊ตฌ๋ถ |
์ค๋ช
|
์ค์ ์ |
#{} |
๋ฐ์ธ๋ฉ (PreparedStatement) |
WHERE name = #{name} |
${} |
SQL ๋ฌธ์์ด ์นํ |
ORDER BY ${sortColumn} (X: ์ฌ์ฉ์ ์
๋ ฅ ์ง์ ์ ๋ฌ โ) |
โ
3. <sql>
, <include>
๋ ์ค๋ณต ์ ๊ฑฐ์ ํต์ฌ
- SELECT ์ปฌ๋ผ, WHERE ์กฐ๊ฑด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
<sql id="baseColumns"> hakbun, irum, grade </sql>
<include refid="baseColumns"/>
โ
4. <where>
์์ด AND๋ก ์์ํ๋ฉด ๊ตฌ๋ฌธ ์ค๋ฅ ๋ฐ์
- ํญ์
<where>
๋๋ <trim prefix="WHERE">
๋ก ๊ฐ์ธ์ผ ํจ
AND
์๋ ์ ๊ฑฐ ๊ธฐ๋ฅ ๋ด์ฅ
โ
5. <foreach>
๋ open, separator, close ์๋ต ๊ธ์ง
<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach>
๐ 2. DAO / DTO ์ค๊ณ ์ ๋ต
โ
6. DAO๋ ๋ฐ๋์ try-catch-finally ๊ตฌ์กฐ๋ก!
SqlSession session = null;
try {
session = factory.openSession();
session.insert(...);
session.commit();
} catch (Exception e) {
session.rollback();
} finally {
if (session != null) session.close();
}
โ
7. DTO๋ ๊ธฐ๋ณธ ์์ฑ์ ํ์ + Getter/Setter๋ ๋ชจ๋ ๊ตฌํ
- MyBatis ๋ด๋ถ ๊ฐ์ฒด ์์ฑ ์ ๊ธฐ๋ณธ ์์ฑ์ ํ์
- ํ๋๋ช
์ DB ์ปฌ๋ผ๋ช
๊ณผ ์ ํํ ์ผ์นํด์ผ ํจ
โ
8. DTO์๋ ์ ๋ public ํ๋ โ
private
+ public getter/setter
๊ฐ ๊ธฐ๋ณธ ์ค๊ณ ์์น
โ
9. DAO๋ DB ์ ์ฉ! ๋ก์ง, ํธ๋์ญ์
, ์กฐ๊ฑด ํ๋จ์ Service์์
- DAO๋ SQL ์คํ๋ง
- ์ ํจ์ฑ ๊ฒ์ฌ, ํธ๋์ญ์
์ ์ด๋ Service์์ ๋ถ๋ฆฌ
โ
10. insert, update, delete ํ์๋ session.commit()
ํ์!
- ์๋ตํ๋ฉด ์๋ฌด ์์
๋ ๋ฐ์๋์ง ์์
- rollback๋ ๋ฐ๋์ ์์ธ ๋ฐ์ ์ ์ฒ๋ฆฌ
๐ 3. Null / ์๋ฌ ๋ฐฉ์ง ํจํด
โ
11. selectOne()
์ ํญ์ null ์ฒดํฌ
Student s = dao.selectByHakbun(1001);
if (s != null) {
...
}
โ
12. selectList()
๋ .isEmpty()
๊น์ง ํจ๊ป ์ฒดํฌ
if (list == null || list.isEmpty()) {
...
}
โ
13. log4j/logback์ ๊ผญ ์ค์ ํด์ SQL ๋ก๊ทธ๋ฅผ ๋ณด์
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
- Preparing, Parameters ๋ก๊ทธ ํ์ธ ๊ฐ๋ฅ
โ
14. ์์ธ ๋ฉ์์ง๋ ์ต๋ํ ๊ตฌ์ฒด์ ์ผ๋ก ์ถ๋ ฅํ์
System.out.println("โ ์ฝ์
์ค ์ค๋ฅ ๋ฐ์: " + e.getMessage());
โ
15. Mapper ID, method๋ช
, namespace๊ฐ ๋ค๋ฅด๋ฉด ์คํ ์คํจ
- ์คํ ์ค์๊ฐ ๋ง์ โ IDE ์๋์์ฑ ์ ๊ทน ํ์ฉ
๐ 4. ๊ตฌ์กฐ ๋ฐ ์ ์ง๋ณด์ ์ ๋ต
โ
16. Controller โ Service โ DAO โ Mapper ํ๋ฆ ์ฒ ์ ๋ถ๋ฆฌ
๊ณ์ธต |
์ญํ |
Controller |
์์ฒญ/์๋ต ์ฒ๋ฆฌ |
Service |
๋ก์ง/ํธ๋์ญ์
|
DAO |
DB ์ ์ ๋ฐ Mapper ์คํ |
Mapper |
SQL ์ ์ |
โ
17. Mapper XML์๋ ๋น์ฆ๋์ค ๋ก์ง ์ ๋ ๋ฃ์ง ๋ง ๊ฒ
- ์กฐ๊ฑด ๋ถ๊ธฐ, ์ ํจ์ฑ ๊ฒ์ฌ๋ Java์์
- Mapper๋ SQL๋ง ๋ด๋น
- ํ๋์ JSP์ ๋๋ฌด ๋ง์ ๊ธฐ๋ฅ ๋ฃ์ง ๋ง๊ธฐ
- ์
๋ ฅ, ์์ , ๋ฆฌ์คํธ, ์์ธ ๋ถ๋ฆฌ ์์น
โ
19. useGeneratedKeys="true"
๋ก ์๋ ํค ์์ฑ ์ฒ๋ฆฌ ๊ฐ๋ฅ
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="hakbun">
โ
20. ์ค๋ฅ ์์ธ ์ถ์ ์์
1. ์ฝ์ ๋ก๊ทธ (์๋ฌ ๋ฉ์์ง ํ์ธ)
2. log4j Preparing: SQL ๋ฌธ ํ์ธ
3. DTO ํ๋ โ ์ปฌ๋ผ ๋งคํ ์ผ์น ์ฌ๋ถ
4. Mapper ID, namespace, ํธ์ถ ID ์ผ์น ์ฌ๋ถ
๐ ์ถ์ฒ ์ ๋ฆฌ ํฌ๋งท (Notion ๋ณต๋ถ์ฉ)
## ๐ก ์ค์ ํ #3 - resultType vs resultMap ์ธ์ ์ ํ?
| ํญ๋ชฉ | resultType | resultMap |
|------|------------|-----------|
| ๋งคํ ๋ฐฉ์ | ์๋ ๋งคํ | ์๋ ๋งคํ |
| ์ฌ์ฉ ์กฐ๊ฑด | ์ปฌ๋ผ = ํ๋ | ์ปฌ๋ผ โ ํ๋, JOIN |
| ์ถ์ฒ ์ํฉ | ๋จ์ SELECT * | ์กฐ์ธ, alias ๋ฑ ๋ณต์กํ ๊ฒฐ๊ณผ |
๐ ์์น: ์ปฌ๋ผ๋ช
โ ํ๋๋ช
์ด๋ฉด ๋ฌด์กฐ๊ฑด resultMap ์ฌ์ฉ!
๐ ๋ง์ง๋ง ํ
โ
์ค๋ฅ๊ฐ ๋ฐ์ํ ์๊ฐ์ด ์ค๋ ฅ ํฅ์์ ์ฐฌ์ค!
โ
MyBatis๋ ๊ตฌ์กฐํ + ๋ฐฉ์ด + ๋ก๊ทธ๋ฅผ ์ ํ๋ฉด ๋ฌด์กฐ๊ฑด ์์ ์ ์ผ๋ก ๋์๊ฐ๋ค
โ
IDE ์๋์์ฑ + ๋ก๊ทธ + JSTL ์กฐํฉ์ ํ์ฉํ๋ฉด ์ ์ง๋ณด์๊ฐ ์ฆ๊ฑฐ์์ง๋ค ๐ช
โ
์ต์ข
์ ๊ฒ ์ฒดํฌ๋ฆฌ์คํธ โ MyBatis + JSP MVC2 ์ค์ต ํ๋ก์ ํธ
๐ ๊ธฐ๋ฅ ์๋ฃ ์ฌ๋ถ ํ์ธ + ์์ธ ๋์ ์ ๋ต๊น์ง ํฌํจ๋ ์ค์ ์ฉ QA ์ํธ
๐ก Notion์ ๋ฐ๋ก ๋ณต๋ถ ๊ฐ๋ฅํ๋ฉฐ, ์ค๋ฌด์ฉ์ผ๋ก๋ ๋ฐ๋ก ํ์ฉ ๊ฐ๋ฅ!
โ
1. ๊ธฐ๋ณธ ํ์ผ ๊ตฌ์กฐ ์ ๊ฒ ๐
ํญ๋ชฉ |
์ค๋ช
|
์๋ฃ ์ฌ๋ถ |
Student.java |
DTO ํด๋์ค, ํ๋๋ช
= DB ์ปฌ๋ผ๋ช
|
โฌ |
StudentDao.java |
DB ์ ๊ทผ ์ ์ฉ DAO, SqlSession ํฌํจ |
โฌ |
StudentMapper.xml |
SQL ์ฟผ๋ฆฌ ์ ์ (SELECT, INSERT ๋ฑ) |
โฌ |
StudentMapper.java |
Mapper ์ธํฐํ์ด์ค (Optional) |
โฌ |
StudentService.java |
๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๊ณ์ธต |
โฌ |
StudentController.java |
์์ฒญ ์ฒ๋ฆฌ / JSP ์ฐ๋ ์ปจํธ๋กค๋ฌ |
โฌ |
list.jsp ๋ฑ |
JSTL ๊ธฐ๋ฐ View ๋ถ๋ฆฌ ๊ตฌ์ฑ |
โฌ |
mybatis-config.xml |
mapper ๊ฒฝ๋ก ๋ฐ ํ๊ฒฝ ์ค์ ํฌํจ |
โฌ |
โ
2. ๊ธฐ๋ฅ ๊ตฌํ ์ฒดํฌ โ
๊ธฐ๋ฅ ์ฝ๋ |
๊ธฐ๋ฅ ์ค๋ช
|
๊ตฌํ ์ฌ๋ถ |
S001 |
์ ์ฒด ํ์ ๋ชฉ๋ก ์กฐํ (selectAll ) |
โฌ |
S002 |
ํน์ ํ๋ฒ์ผ๋ก ํ์ ์กฐํ (selectOne ) |
โฌ |
S003 |
์ ๊ท ํ์ ๋ฑ๋ก (insert ) |
โฌ |
S004 |
ํ๋
/ ์ด๋ฆ ์กฐ๊ฑด ๊ฒ์ (<if> , <where> ) |
โฌ |
S005 |
ํ๋
/ ์ ํ๋ฒํธ ์์ (update ) |
โฌ |
S006 |
ํ๋ฒ ๊ธฐ์ค ์ญ์ (delete ) |
โฌ |
โ
3. SQL Mapper ๊ตฌ์ฑ ์ฒดํฌ ๐ฏ
ํญ๋ชฉ |
์ค๋ช
|
ํ์ธ |
resultType โ DTO ๋งคํ์ด ์ผ์นํ๋๊ฐ |
์ปฌ๋ผ๋ช
= ํ๋๋ช
์ฌ๋ถ ํ์ธ |
โฌ |
parameterType ์ ํํ ์ง์ ๋์๋๊ฐ |
int , map , main.Student |
โฌ |
#{} ์ฌ์ฉ ๋ฐ์ธ๋ฉ ๋ฐฉ์๋ง ์ฌ์ฉํ๊ณ ์๋๊ฐ |
${} ๋ ๊ตฌ์กฐ์ฉ์ผ๋ก๋ง ์ฌ์ฉ |
โฌ |
useGeneratedKeys ์ต์
ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ |
์๋ PK ์์ฑ ์ ํ์ |
โฌ |
<if> , <where> , <trim> ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ |
์กฐ๊ฑด๋ถ ๋์ SQL ์ฒ๋ฆฌ ํ์ธ |
โฌ |
<foreach> ๋ open/close/separator ์๋น |
IN ์กฐ๊ฑด ๋ฑ์์ ์ค๋ฅ ๋ฐฉ์ง |
โฌ |
<sql> , <include> ๋ก ์ค๋ณต ์ ๊ฑฐ |
SELECT ์ปฌ๋ผ, WHERE ๊ณตํตํ |
โฌ |
โ
4. ์์ธ ๋ฐฉ์ง ๋ฐ ๋์ ์ ๋ต ๐งฏ
์ํฉ |
์ฒดํฌ ํฌ์ธํธ |
๋์ ์๋ฃ |
selectOne() ๊ฒฐ๊ณผ null โ NPE ๋ฐ์ |
if-null ์ฒดํฌ ๋๋ Optional ์ฒ๋ฆฌ |
โฌ |
insert/update ํ commit() ์๋ต |
๋ฐ๋์ commit() ํธ์ถํ๋๊ฐ? |
โฌ |
MyBatis ๋ฐ์ธ๋ฉ ์ค๋ฅ ๋ฐ์ |
#{} ๋ด๋ถ ์ด๋ฆ โ Java ์ ๋ฌ๊ฐ ์ผ์น ํ์ธ |
โฌ |
์ปฌ๋ผ ์คํ๋ก ์ธํ SQLSyntaxError |
DB ์ปฌ๋ผ๋ช
๊ณผ DTO ํ๋๋ช
์ผ์น ์ฌ๋ถ ํ์ธ |
โฌ |
Mapper ID ์คํ |
DAO / XML ID / ์ธํฐํ์ด์ค ๋ฉ์๋ ์์ ์ผ์น |
โฌ |
XML ํ์ฑ ์ค๋ฅ |
<mapper> , <sql> , ํ๊ทธ ๋ซํ ๋ฑ ๊ตฌ์กฐ ๊ฒํ |
โฌ |
์ค๋ณตํค ์ค๋ฅ (PRIMARY KEY) |
INSERT ์ ์ ์ค๋ณต ์ฌ๋ถ ํ์ธ or auto_increment |
โฌ |
โ
5. View ์ถ๋ ฅ / ์
๋ ฅํผ ์ฐ๊ณ ์ ๊ฒ ๐ฅ๏ธ
JSP ํ์ผ |
์ญํ |
๊ตฌํ ์ฌ๋ถ |
list.jsp |
์ ์ฒด ํ์ ๋ชฉ๋ก ์ถ๋ ฅ |
โฌ |
detail.jsp |
ํ์ 1๋ช
์์ธ๋ณด๊ธฐ ์ถ๋ ฅ |
โฌ |
insertForm.jsp |
ํ์ ์
๋ ฅ ํผ |
โฌ |
updateForm.jsp |
ํ์ ์์ ์ฉ ํผ |
โฌ |
JSTL ํ๊ทธ ์ ์ธ |
<%@ taglib uri=... %> ํฌํจ ์ฌ๋ถ |
โฌ |
๋ฐ์ดํฐ ์ถ๋ ฅ ๋ฐฉ์ |
${student.irum} ๋ฑ EL๋ก ์ถ๋ ฅ |
โฌ |
์กฐ๊ฑด ๊ฒ์ฌ |
<c:if test="${empty list}"> ๋ฑ ์ฌ์ฉ |
โฌ |
โ
6. ๋ก๊ทธ / ๋๋ฒ๊น
์ค์ ์ฒดํฌ ๐
ํญ๋ชฉ |
์ค๋ช
|
์๋ฃ |
log4j ์ค์ ์ ์ฉ๋จ |
log4j.properties or XML ์ค๋น |
โฌ |
Preparing: ๋ก๊ทธ ํ์ธ๋จ |
์ค์ ์คํ SQL ํ์ธ |
โฌ |
Parameters: ๋ก๊ทธ ์ถ๋ ฅ๋จ |
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ํ์ธ |
โฌ |
XML ๋ฌธ๋ฒ ์ค๋ฅ ์ ๋น ๋ฅธ ๋์ ๊ฐ๋ฅ |
refid ์์, ํ๊ทธ ๋๋ฝ ๋ฑ ์ ๊ฒ ๋ฃจํด ์์ |
โฌ |
โ
7. ์ ์ง๋ณด์ ์ ๋ต ์ฒดํฌ ๐
ํญ๋ชฉ |
์ค๋ช
|
์ฒดํฌ |
Controller โ Service โ DAO ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌ๋์๋๊ฐ |
๋น์ฆ๋์ค ๋ก์ง ๊ณ์ธตํ ์ ์ฉ |
โฌ |
DAO๋ DB ์ ์ฉ, ๋ก์ง ์์ |
insert, update, select๋ง ์ฒ๋ฆฌ |
โฌ |
Service๋ ํธ๋์ญ์
/๊ฒ์ฆ ์ฑ
์ |
์กฐ๊ฑด ๋ถ๊ธฐ, rollback ํฌํจ |
โฌ |
Mapper๋ ์ค์ง SQL ์ ์ ์ ์ฉ |
Java ๋ก์ง ์ ๋ ์์ |
โฌ |
์ฝ๋ ์ค๋ณต ์ ๊ฑฐ |
<sql> , <include> , DAO ๋ฉ์๋ ์ฌ์ฌ์ฉ |
โฌ |
๐ง ๋ณด๋์ค: ์ค๋ฌด ํ โจ
ํ |
์ค๋ช
|
์ค๋ฅ ๋ฐ์ ์ ๋ก๊ทธ๋ถํฐ ๋ณด์ |
๋ก๊ทธ โ SQL โ DTO โ Mapper ์์๋ก ์ถ์ |
ํ
์คํธ๋ select๋ถํฐ! |
INSERT/UPDATE ์ ์ ๋ฐ๋์ SELECT๋ก ๊ตฌ์กฐ ํ์ธ |
DTO ํ๋ ์์ ์ Mapper ๋จผ์ ์ฒดํฌ |
resultType or resultMap ๋ณ๊ฒฝ ์ฌ๋ถ ํ์ธ ํ์ |
JSP ๋๋ฒ๊น
์ EL๋ก! |
${} ๊ฐ ์ ๋์ค๋ฉด setAttribute ๋ฌธ์ ๊ฐ๋ฅ์ฑ |
์ ์ฒด ๊ตฌ์กฐ๋ ํญ์ โ์์ฒญ โ ์ฒ๋ฆฌ โ ๊ฒฐ๊ณผโ ํ๋ฆ์ผ๋ก ์๊ฐํ๊ธฐ |
ย |