** ๐Ÿ“Œ 9๋‹จ๊ณ„: ๊ธฐ์ˆ ๋ฉด์ ‘ & ์ตœ์ข…์ •๋ฆฌ ๐Ÿ” ์˜ˆ์ƒ ์งˆ๋ฌธ 20์„  (MyBatis + JSP MVC2 ๊ธฐ๋ฐ˜) **


๐Ÿ“Œ ๋ชฉ์ฐจ

  1. MyBatis ๊ธฐ๋ณธ
  2. Mapper, DAO, Service ๊ตฌ์กฐ
  3. ๋™์  SQL, ํŠธ๋žœ์žญ์…˜, ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  4. JSP + JSTL + MVC ํ๋ฆ„
  5. ์‹ค๋ฌด ํ™•์žฅ & ๋น„๊ต ์งˆ๋ฌธ

๐Ÿงฉ 1. MyBatis ๊ธฐ๋ณธ

โœ… Q1. MyBatis๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?


โœ… 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 ์ž‘์„ฑ ๋ฐฉ๋ฒ•์€?


๐Ÿงฉ 2. Mapper, DAO, Service ๊ตฌ์กฐ

โœ… Q6. Mapper์™€ DAO์˜ ์ฐจ์ด๋Š”?

ํ•ญ๋ชฉ Mapper DAO
์œ„์น˜ XML / ์ธํ„ฐํŽ˜์ด์Šค Java ํด๋ž˜์Šค
์—ญํ•  SQL ์ •์˜ DB ํ˜ธ์ถœ ๋กœ์ง ๋‹ด๋‹น
ํ˜ธ์ถœ ๋ฐฉ์‹ ID or ์ธํ„ฐํŽ˜์ด์Šค SqlSession์œผ๋กœ ํ˜ธ์ถœ

โœ… Q7. DAO โ†’ Service โ†’ Controller ๊ณ„์ธต ๋ถ„๋ฆฌ ์ด์œ ?

์œ ์ง€๋ณด์ˆ˜์™€ ํ…Œ์ŠคํŠธ, ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ


โœ… Q8. MyBatis Mapper XML ๊ตฌ์กฐ๋Š”?

<mapper namespace="dao.StudentMapper">
  <select id="getAllStudents" resultType="main.Student">
    SELECT * FROM student
  </select>
</mapper>

โœ… Q9. SqlSessionFactory๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋‚˜์š”?

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

โœ… Q10. Mapper XML ๋“ฑ๋ก ๋ฐฉ๋ฒ•์€?

<mappers>
  <mapper resource="mapper/StudentMapper.xml"/>
</mapp

๐Ÿงฉ 3. ํŠธ๋žœ์žญ์…˜ & ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

โœ… Q11. ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

try {
  session.insert(...);
  session.update(...);
  session.commit();
} catch (Exception e) {
  session.rollback();
}

โœ… Q12. insert/update/delete ์‹œ commit()์ด ํ•„์š”ํ•œ๊ฐ€์š”?


โœ… Q13. SQL ์˜ˆ์™ธ ๋กœ๊ทธ ๋ถ„์„ ๋ฐฉ๋ฒ•์€?

### The error may exist in mapper/StudentMapper.xml
### SQL: SELECT * FROM ...
### Cause: java.sql.SQLSyntaxErrorException: ...

โœ… Q14. NullPointerException์„ ๋ฐฉ์ง€ํ•˜๋Š” ํŒจํ„ด์€?

Student s = mapper.getStudentByHakbun(9999);
if (s != null) {
  System.out.println(s.getIrum());
} else {
  System.out.println("์กฐํšŒ ๊ฒฐ๊ณผ ์—†์Œ");
}

โœ… Q15. selectList() ๊ฒฐ๊ณผ๊ฐ€ null์ผ ์ˆ˜ ์žˆ๋‚˜์š”?


๐Ÿงฉ 4. JSP + JSTL ์—ฐ๋™

โœ… Q16. Controller์—์„œ JSP๋กœ ๋ฐ์ดํ„ฐ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€?

request.setAttribute("list", list);
request.getRequestDispatcher("/view/student/list.jsp").forward(request, response);

โœ… Q17. JSTL๊ณผ EL์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?


โœ… Q18. ์ž…๋ ฅ ํผ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ Controller๋กœ ์ „๋‹ฌํ•˜๋‚˜์š”?


๐Ÿงฉ 5. ์‹ค๋ฌด ๋น„๊ต & ์ข…ํ•ฉ ์งˆ๋ฌธ

โœ… Q19. MyBatis์™€ JPA์˜ ์ฐจ์ด์ ์€?

ํ•ญ๋ชฉ MyBatis JPA (Hibernate)
SQL ์ž‘์„ฑ ์ง์ ‘ ์ž‘์„ฑ (์ž์œ ๋กœ์›€) SQL ์ƒ๋žต (์ž๋™ ์ƒ์„ฑ)
์„ฑ๋Šฅ ํŠœ๋‹ SQL ํŠœ๋‹ ์‰ฌ์›€ SQL ์ œ์–ด ์–ด๋ ค์›€
๋Ÿฌ๋‹ ์ปค๋ธŒ ๋น„๊ต์  ์‰ฌ์›€ ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘ ํ•™์Šต ํ•„์š”
๋Œ€ํ‘œ ์„ฑํ–ฅ SQL ์ค‘์‹ฌ ๊ฐ์ฒด ์ค‘์‹ฌ

โœ… Q20. MyBatis์˜ ๋‹จ์ ์€?


๐Ÿ“š ๊ธฐ์ˆ ๋ฉด์ ‘ ์ด์ •๋ฆฌ

โœ… ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ํ”„๋กœ์ ํŠธ ํ๋ฆ„์„ ์ •ํ™•ํžˆ ์•Œ๊ณ ,

โœ… ๊ฐ ๊ณ„์ธต์˜ ์—ญํ• ๊ณผ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ ,

โœ… ์ž์ฃผ ๋‚˜์˜ค๋Š” ๋น„๊ต ์งˆ๋ฌธ(resultType vs resultMap, #{} vs ${}) ์„ ํ™•์‹คํžˆ ๋งํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด!

๐Ÿ‘จโ€๐Ÿ’ป MyBatis ๊ธฐ์ˆ ๋ฉด์ ‘ ์š”์•ฝ

โœ… ๐Ÿ’ก ์‹ค์ „ ํŒ 20์„  โ€“ MyBatis + JSP MVC2 ํ”„๋กœ์ ํŠธ์šฉ

์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜๋ถ€ํ„ฐ DAO/DTO ์„ค๊ณ„ ์ „๋žต๊นŒ์ง€ ์‹ค๋ฌด ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌ

โœจ ์œ ์ง€๋ณด์ˆ˜, ํ™•์žฅ์„ฑ, ์•ˆ์ •์„ฑ์„ ๋™์‹œ์— ๊ณ ๋ คํ•œ ์‹ค์ „ ๋งˆ์ธ๋“œ์…‹


๐Ÿ“ 1. Mapper / SQL ๊ด€๋ จ ํŒ

โœ… 1. resultType์€ ์ปฌ๋Ÿผ๋ช… = ํ•„๋“œ๋ช…์ผ ๋•Œ๋งŒ!


โœ… 2. #{} vs ${} ํ˜ผ์šฉ ์ฃผ์˜

๊ตฌ๋ถ„ ์„ค๋ช… ์‹ค์ˆ˜ ์˜ˆ
#{} ๋ฐ”์ธ๋”ฉ (PreparedStatement) WHERE name = #{name}
${} SQL ๋ฌธ์ž์—ด ์น˜ํ™˜ ORDER BY ${sortColumn} (X: ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ง์ ‘ ์ „๋‹ฌ โŒ)

โœ… 3. <sql>, <include>๋Š” ์ค‘๋ณต ์ œ๊ฑฐ์˜ ํ•ต์‹ฌ

<sql id="baseColumns"> hakbun, irum, grade </sql>
<include refid="baseColumns"/>

โœ… 4. <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๋Š” ๋ชจ๋‘ ๊ตฌํ˜„


โœ… 8. DTO์—๋Š” ์ ˆ๋Œ€ public ํ•„๋“œ โŒ


โœ… 9. DAO๋Š” DB ์ „์šฉ! ๋กœ์ง, ํŠธ๋žœ์žญ์…˜, ์กฐ๊ฑด ํŒ๋‹จ์€ Service์—์„œ


โœ… 10. insert, update, delete ํ›„์—๋Š” session.commit() ํ•„์ˆ˜!


๐Ÿ“ 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

โœ… 14. ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ์ตœ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ถœ๋ ฅํ•˜์ž

System.out.println("โŒ ์‚ฝ์ž… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: " + e.getMessage());

โœ… 15. Mapper ID, method๋ช…, namespace๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‹คํ–‰ ์‹คํŒจ


๐Ÿ“ 4. ๊ตฌ์กฐ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต

โœ… 16. Controller โ†’ Service โ†’ DAO โ†’ Mapper ํ๋ฆ„ ์ฒ ์ € ๋ถ„๋ฆฌ

๊ณ„์ธต ์—ญํ• 
Controller ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ
Service ๋กœ์ง/ํŠธ๋žœ์žญ์…˜
DAO DB ์ ‘์† ๋ฐ Mapper ์‹คํ–‰
Mapper SQL ์ •์˜

โœ… 17. Mapper XML์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ ˆ๋Œ€ ๋„ฃ์ง€ ๋ง ๊ฒƒ


โœ… 18. insertForm.jsp / list.jsp ๋“ฑ์€ ์—ญํ• ๋ณ„๋กœ 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 ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ
์ „์ฒด ๊ตฌ์กฐ๋Š” ํ•ญ์ƒ โ€œ์š”์ฒญ โ†’ ์ฒ˜๋ฆฌ โ†’ ๊ฒฐ๊ณผโ€ ํ๋ฆ„์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ย