** ๐Ÿ“Œ7.1๋‹จ๊ณ„: try-catch, finally ๊ตฌ์กฐ โ€“ DB ์—ฐ๊ฒฐ ์‹คํŒจ, ์ฟผ๋ฆฌ ์‹คํŒจ ์ฒ˜๋ฆฌ ์‹ค์Šต **

(๐Ÿ“‚ StudentDao.java, SqlSession ์‚ฌ์šฉ ๊ธฐ์ค€)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  DB ์—ฐ๊ฒฐ ์‹คํŒจ ๋˜๋Š” SQL ์‹คํ–‰ ์˜ค๋ฅ˜ ์‹œ ์•ˆ์ •์ ์ธ ์ฒ˜๋ฆฌ
ํ•ต์‹ฌ ๊ฐœ๋… try-catch-finally, session.commit() ์‹œ์ , rollback()
๊ธฐ๋Œ€ ํšจ๊ณผ ์„œ๋น„์Šค ์•ˆ์ •์„ฑ ํ™•๋ณด, ์˜ค๋ฅ˜ ์ถ”์  ๋กœ๊ทธ ์ถœ๋ ฅ, ์—ฐ๊ฒฐ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€

โœ… 1. ๊ธฐ๋ณธ ๊ตฌ์กฐ: SqlSession ์ฒ˜๋ฆฌ ๋ฐฉ์‹

๐Ÿ”น ๊ธฐ์กด ์ฝ”๋“œ (์—๋Ÿฌ ์ฒ˜๋ฆฌ ์—†์Œ)

SqlSession session = factory.openSession();
List<Student> list = session.selectList("student.getAllStudents");
session.close();

๐Ÿ‘‰ ๋ฌธ์ œ์ : ์ฟผ๋ฆฌ ์‹คํŒจ ์‹œ ๋กœ๊ทธ๋„ ์•ˆ ๋‚จ๊ณ , session์ด ๋‹ซํžˆ์ง€ ์•Š์•„ ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ


โœ… 2. ์‹ค์ „์šฉ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ

public List<Student> selectAll() {
    SqlSession session = null;
    List<Student> list = null;

    try {
        session = factory.openSession();  // DB ์—ฐ๊ฒฐ
        list = session.selectList("student.getAllStudents");  // ์ฟผ๋ฆฌ ์‹คํ–‰
    } catch (Exception e) {
        System.out.println("โŒ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: " + e.getMessage());
        e.printStackTrace();  // ๋กœ๊ทธ๋กœ ์˜ˆ์™ธ ์›์ธ ์ถœ๋ ฅ
    } finally {
        if (session != null) session.close();  // ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์คŒ
    }

    return list;  // ์‹คํŒจ ์‹œ null ๋ฐ˜ํ™˜
}

โœ… 3. INSERT/UPDATE/DELETE ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

public int insert(Student s) {
    SqlSession session = null;
    int result = 0;

    try {
        session = factory.openSession();
        result = session.insert("student.insertStudent", s);
        session.commit();  // ์ •์ƒ ์ฒ˜๋ฆฌ ์‹œ ์ปค๋ฐ‹
    } catch (Exception e) {
        System.out.println("โŒ ํ•™์ƒ ๋“ฑ๋ก ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ");
        e.printStackTrace();
        if (session != null) session.rollback();  // ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ
    } finally {
        if (session != null) session.close();
    }

    return result;
}

โœ… 4. ์˜ˆ์™ธ ์ƒํ™ฉ๋ณ„ ์ฒ˜๋ฆฌ ์ „๋žต

์ƒํ™ฉ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
DB ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ (session = null) catch์—์„œ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ e.printStackTrace()๋กœ SQL ์œ„์น˜ ํŒŒ์•…
์ค‘๋ณต ํ‚ค ๋“ฑ ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜ session.rollback()์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ์ทจ์†Œ
๋กœ๊ทธ ๋ฏธ์ถœ๋ ฅ log4j ๋˜๋Š” SLF4J ์—ฐ๋™ ํ•„์š”

โœ… 5. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
๋ชจ๋“  DAO ๋ฉ”์„œ๋“œ์— try-catch-finally๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 
์ปค๋ฐ‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ commit() ํ˜ธ์ถœ ํ›„ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ rollback()๋„ ์žˆ๋Š”๊ฐ€ โœ… ย 
session์€ ํ•ญ์ƒ finally์—์„œ ๋‹ซํžˆ๋Š”๊ฐ€ โœ… ย 
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ฌ์šฉ์ž/๋กœ๊ทธ์— ๊ตฌ๋ถ„๋˜์–ด ์ถœ๋ ฅ๋˜๋Š”๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
๋ชจ๋“  DB ์ฒ˜๋ฆฌ์—๋Š” ์˜ˆ์™ธ ๋ฐฉ์–ด ์ฝ”๋“œ ํ•„์ˆ˜ ย 
rollback()์€ INSERT/UPDATE/DELETE๋งŒ ํ•„์š” (SELECT๋Š” ๋ถˆํ•„์š”) ย 
๋กœ๊ทธ ํ”„๋ ˆ์ž„์›Œํฌ ์—ฐ๋™ ์‹œ logger.error(e)๋กœ ๋ณ€๊ฒฝ ย 
try-with-resources ๊ตฌ๋ฌธ์œผ๋กœ session ์ž๋™ close๋„ ๊ฐ€๋Šฅ (Java 7+) ย 

โœ… ํ™•์žฅ ํ•™์Šต (์‹ค๋ฌด ์—ฐ์Šต์šฉ)

์‹œ๋‚˜๋ฆฌ์˜ค ์—ฐ์Šต ๋ฐฉ๋ฒ•
ํ•™๋ฒˆ ์ค‘๋ณต์œผ๋กœ INSERT ์‹คํŒจ Duplicate entry ์˜ˆ์™ธ ํ™•์ธ
WHERE ์กฐ๊ฑด ๋ถˆ์ผ์น˜๋กœ UPDATE ์‹คํŒจ ์˜ํ–ฅ ํ–‰ ์ˆ˜ 0 ํ™•์ธ
SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์˜คํƒ€ ํฌํ•จ๋œ ์ฟผ๋ฆฌ ์‹คํ–‰ โ†’ ์˜ˆ์™ธ ๋ฐœ์ƒ ๋กœ๊ทธ ํ™•์ธ

โœ… 7.2๋‹จ๊ณ„: SQL ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ๋ถ„์„๋ฒ• โ€“ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๋ถ„์„ ์‹ค์ „

(๐Ÿ“‚ StudentDao.java ๊ธฐ๋ฐ˜, JDBC + MyBatis ์—๋Ÿฌ ๋กœ๊ทธ ์ค‘์‹ฌ)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ์ฝ˜์†”์— ์ถœ๋ ฅ๋œ SQL ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด์„ํ•˜๊ณ  ์›์ธ ํŒŒ์•…
๋Œ€์ƒ ์ฟผ๋ฆฌ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜, ์ปฌ๋Ÿผ ๋ถˆ์ผ์น˜, ์ค‘๋ณตํ‚ค ์˜ค๋ฅ˜ ๋“ฑ
๊ธฐ๋Œ€ ํšจ๊ณผ ์‹ค๋ฌด์—์„œ DB ์˜ค๋ฅ˜ ์›์ธ ํŒŒ์•… ์†๋„ ๋Œ€ํญ ํ–ฅ์ƒ

โœ… 1. MyBatis ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ ์ดํ•ด

๐Ÿ’ก ๋Œ€๋ถ€๋ถ„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์œผ๋กœ ์ถœ๋ ฅ๋ผ

### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ...
### The error may exist in mapper/StudentMapper.xml
### The error occurred while executing a query
### SQL: SELECT * FROM student WHERE hakbun = #{studentId}
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'studentId' in 'where clause'
๋กœ๊ทธ ํ–‰ ์˜๋ฏธ
### Error querying database MyBatis ์ฟผ๋ฆฌ ์‹คํ–‰ ์˜ค๋ฅ˜
Cause: JDBC๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ๊ตฌ์ฒด์  ์˜ˆ์™ธ (SQLSyntaxErrorException, IntegrityConstraintViolationException ๋“ฑ)
The error may exist in ... ์–ด๋А XML์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ‘œ์‹œ
SQL: ์‹ค์ œ ์‹คํ–‰๋œ SQL (๋ฐ”์ธ๋”ฉ ์ „)
Cause: DB์—์„œ ๋ฐ›์€ ์ตœ์ข… ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

โœ… 2. ์‹ค์ „ ์˜ˆ์™ธ ์‚ฌ๋ก€๋ณ„ ๋ถ„์„


โŒ โ‘  SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ (SyntaxError)

Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax
SQL: SELECT * FORM student WHERE grade = ?

๐Ÿ” ์›์ธ: FROM ์˜คํƒ€ โ†’ FORM

โœ… ํ•ด๊ฒฐ: ์˜คํƒ€ ์ˆ˜์ •


โŒ โ‘ก ์ปฌ๋Ÿผ ์˜คํƒ€

SQLSyntaxErrorException: Unknown column 'phnne' in 'field list'

๐Ÿ” ์›์ธ: SQL์ด๋‚˜ DTO์— ์—†๋Š” ์ปฌ๋Ÿผ๋ช… ์‚ฌ์šฉ

โœ… ํ•ด๊ฒฐ: DB ์Šคํ‚ค๋งˆ ๋˜๋Š” DTO, SQL์—์„œ phnne โ†’ phone ์œผ๋กœ ์ˆ˜์ •


โŒ โ‘ข ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜ (MyBatis)

org.apache.ibatis.binding.BindingException: Parameter 'hakbun' not found. Available parameters are [id]

๐Ÿ” ์›์ธ: XML์—์„œ๋Š” #{hakbun}์ธ๋ฐ Java์—์„œ๋Š” param.put("id", 1001) ์ฒ˜๋Ÿผ ์ด๋ฆ„์ด ๋‹ค๋ฆ„

โœ… ํ•ด๊ฒฐ: XML์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…๊ณผ Java์˜ ์ „๋‹ฌ ํ‚ค(key)/ํ•„๋“œ๋ช…์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•จ


โŒ โ‘ฃ ์ค‘๋ณตํ‚ค ์˜ค๋ฅ˜

Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1001' for key 'PRIMARY'

๐Ÿ” ์›์ธ: PRIMARY KEY์ธ hakbun์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ’ ์‚ฝ์ž… ์‹œ๋„

โœ… ํ•ด๊ฒฐ: ์ค‘๋ณต ์—ฌ๋ถ€ ๋จผ์ € ํ™•์ธํ•˜๊ฑฐ๋‚˜ auto_increment ์ ์šฉ


โŒ โ‘ค ResultType ๋งคํ•‘ ์˜ค๋ฅ˜

java.lang.IllegalArgumentException: Result Maps collection does not contain value for studentResultMap

๐Ÿ” ์›์ธ: <select resultMap="studentResultMap"> ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์œ„์— resultMap ์ •์˜๊ฐ€ ์—†์Œ

โœ… ํ•ด๊ฒฐ: <resultMap id="studentResultMap">๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ


โœ… 3. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ์ฒดํฌ
์ฝ˜์†”์—์„œ SQL ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์บก์ฒ˜ํ–ˆ๋Š”๊ฐ€ โœ… ย 
XML ์œ„์น˜, SQL ๋ฌธ, ๋ฐ”์ธ๋”ฉ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ •ํ™•ํžˆ ์ถ”์ ํ–ˆ๋Š”๊ฐ€ โœ… ย 
์˜ค๋ฅ˜ ์›์ธ์„ ๋ช…ํ™•ํžˆ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐ ํฌ์ธํŠธ๋ฅผ ์ •๋ฆฌํ–ˆ๋Š”๊ฐ€ โœ… ย 
๋™์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋„๋ก ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ–ˆ๋Š”๊ฐ€ โœ… ย 

โœ… 4. ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
log4j ์„ค์ •์€ ํ•„์ˆ˜ โ†’ SQL, ํŒŒ๋ผ๋ฏธํ„ฐ ๋กœ๊ทธ ํ•จ๊ป˜ ์ถœ๋ ฅ๋จ ย 
SQLSyntaxErrorException์€ ์ฟผ๋ฆฌ ๊ตฌ์กฐ ์ž์ฒด ๋ฌธ์ œ ย 
BindingException์€ XML โ†” ์ž๋ฐ” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ ย 
IntegrityConstraintViolationException์€ ์ค‘๋ณต ํ‚ค ๋˜๋Š” ์™ธ๋ž˜ํ‚ค ์˜ค๋ฅ˜ ย 
MySQL Workbench์—์„œ ์ˆ˜๋™ ์‹คํ–‰ํ•ด๋ณด๋ฉฐ SQL ํ™•์ธ๋„ ๋ณ‘ํ–‰ ย 

โœ… ํ™•์žฅ ํ•™์Šต ์˜ˆ์‹œ

์˜ˆ์™ธ ์ƒํ™ฉ ์—ฐ์Šต ๋ฐฉ๋ฒ•
์ปฌ๋Ÿผ ์˜คํƒ€ SELECT phnne FROM student
์—†๋Š” resultMap ํ˜ธ์ถœ resultMap id ์˜คํƒ€ intentionally ์œ ๋ฐœ
DTO ํ•„๋“œ๋ช… ๋ณ€๊ฒฝ Student.java์˜ phone์„ tel๋กœ ๋ณ€๊ฒฝ ํ›„ ์‹คํ–‰

โœ… 7.3๋‹จ๊ณ„: NullPointerException ๋ฐฉ์ง€ ํŒจํ„ด

(๐Ÿ“‚ StudentDao.java + StudentMapper.xml + Controller ์—ฐ๋™ ๊ธฐ์ค€)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  selectOne, selectList ๊ฒฐ๊ณผ๊ฐ€ null์ผ ๋•Œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
์ฃผ์š” ๊ฐœ๋… null ์ฒดํฌ, Optional ํŒจํ„ด, ๊ฒฐ๊ณผ ์œ ๋ฌด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
๊ธฐ๋Œ€ ํšจ๊ณผ ์„œ๋น„์Šค ๋‹ค์šด ๋ฐฉ์ง€, ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ ˆํ•œ ๋ฉ”์‹œ์ง€ ์ œ๊ณต, NullPointerException ์˜ˆ๋ฐฉ

โœ… 1. ๊ฐ€์žฅ ํ”ํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ ์˜ˆ์‹œ

Student s = mapper.getStudentByHakbun(9999);
System.out.println("์ด๋ฆ„: " + s.getIrum());  // โŒ ์—ฌ๊ธฐ์„œ NullPointerException ๋ฐœ์ƒ ๊ฐ€๋Šฅ

๐Ÿ” ์›์ธ: ํ•™๋ฒˆ 9999๋ฒˆ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ null์ด ๋ฆฌํ„ด๋จ


โœ… 2. ์•ˆ์ „ํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์˜ˆ์‹œ (๊ธฐ๋ณธ ํŒจํ„ด)

๐Ÿ”น ๋ฐฉ๋ฒ• 1: null ์ฒดํฌ ํ›„ ๋ถ„๊ธฐ

Student s = mapper.getStudentByHakbun(9999);

if (s != null) {
    System.out.println("์ด๋ฆ„: " + s.getIrum());
} else {
    System.out.println("โ— ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
}

๐Ÿ’ก selectOne() ๊ฒฐ๊ณผ๋Š” ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ํ•ญ์ƒ ์ฒดํฌํ•ด์•ผ ํ•จ.


๐Ÿ”น ๋ฐฉ๋ฒ• 2: Optional ํŒจํ„ด (Java 8+)

Optional.ofNullable(mapper.getStudentByHakbun(9999))
        .ifPresentOrElse(
            stu -> System.out.println("์ด๋ฆ„: " + stu.getIrum()),
            () -> System.out.println("โ— ํ•ด๋‹น ํ•™๋ฒˆ ํ•™์ƒ ์—†์Œ")
        );

์‹ค๋ฌด์—์„œ๋Š” Optional๋กœ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ (Spring ํ™˜๊ฒฝ ๋“ฑ)


โœ… 3. Controller + JSP ์—ฐ๋™ ์‹œ ์•ˆ์ „์ฒ˜๋ฆฌ ํ๋ฆ„

Student s = dao.selectByHakbun(9999);

if (s == null) {
    request.setAttribute("msg", "ํ•ด๋‹น ํ•™์ƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
    request.getRequestDispatcher("/error.jsp").forward(request, response);
} else {
    request.setAttribute("student", s);
    request.getRequestDispatcher("/student_detail.jsp").forward(request, response);
}

โœ… 4. selectList() ๊ฒฐ๊ณผ๊ฐ€ ๋นˆ ๋ฆฌ์ŠคํŠธ์ผ ๊ฒฝ์šฐ

List<Student> list = mapper.getAllStudents();

if (list == null || list.isEmpty()) {
    System.out.println("โ— ํ•™์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
} else {
    for (Student s : list) {
        System.out.println(s.getHakbun() + " / " + s.getIrum());
    }
}

โœ… selectList()๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ,

MyBatis ์„ค์ •์— ๋”ฐ๋ผ null์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ null || isEmpty() ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ด์•ผ.


โœ… 5. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
selectOne() ๊ฒฐ๊ณผ๊ฐ€ null์ผ ์ˆ˜ ์žˆ์Œ์„ ๊ฐ€์ •ํ•˜๊ณ  ๋Œ€์‘ํ•˜๋Š”๊ฐ€ โœ… ย 
null ๊ฒ€์‚ฌ ์—†์ด getter ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋Š”๊ฐ€ โœ… ย 
selectList() ๊ฒฐ๊ณผ๊ฐ€ ๋นˆ ๋ฆฌ์ŠคํŠธ์ผ ๋•Œ๋„ ์˜ˆ์™ธ ์—†์ด ์ถœ๋ ฅ ๊ฐ€๋Šฅํ•œ๊ฐ€ โœ… ย 
์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” โ€˜์กฐํšŒ ๊ฒฐ๊ณผ ์—†์Œโ€™ ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š”๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

์ƒํ™ฉ ๋Œ€์‘ ๋ฐฉ๋ฒ•
select ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š”๋ฐ getter ํ˜ธ์ถœ ์‹œ NullPointerException ๋ฐœ์ƒ โ†’ ๋ฐ˜๋“œ์‹œ null ์ฒดํฌ
JSP์—์„œ ${student.irum} ์ถœ๋ ฅ ์‹œ null์ด๋ฉด? JSTL <c:if test="${empty student}">๋กœ ๋ฐฉ์–ด ๊ฐ€๋Šฅ
๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฒฐ๊ณผ ์—†์Œ "๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค" ๋ฉ”์‹œ์ง€ ๋„์šฐ๊ธฐ ํ•„์ˆ˜
API ์‘๋‹ต null ๋Œ€์‹  { "data": null, "message": "ํ•™์ƒ ์—†์Œ" } ๋“ฑ์˜ ํฌ๋งท ๊ถŒ์žฅ

โœ… ํ™•์žฅ ํ•™์Šต: ์˜ˆ์™ธ UX ์„ค๊ณ„

๋ชฉํ‘œ ์‹ค์Šต ๋ฐฉ๋ฒ•
null ๊ฒฐ๊ณผ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ JSP + <c:if> + ${empty} ํ™œ์šฉ
์„œ๋น„์Šค ์žฅ์•  ๋ฐฉ์ง€ ๋ชจ๋“  DAO ๋ฉ”์„œ๋“œ์— null ๋ฐฉ์–ด ์ถ”๊ฐ€
๋กœ๊ทธ ์ถœ๋ ฅ๋„ ํ•จ๊ป˜ ๊ตฌ์„ฑ null ๋ฐ˜ํ™˜ ์‹œ logger.info("ํ•™์ƒ ์—†์Œ")

โœ… 7.4๋‹จ๊ณ„: XML ๋งคํผ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๋””๋ฒ„๊น…

(๐Ÿ“‚ StudentMapper1.xml, StudentMapper.xml ์ค‘์‹ฌ)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  XML Mapper ์ž‘์„ฑ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ ๋˜๋Š” ๋น ๋ฅด๊ฒŒ ๋””๋ฒ„๊น…
๋Œ€์ƒ ์˜คํƒ€, ๋ˆ„๋ฝ, ๊ฒฝ๋กœ ์˜ค๋ฅ˜, ํƒœ๊ทธ ์ˆœ์„œ ์˜ค๋ฅ˜ ๋“ฑ
๊ธฐ๋Œ€ ํšจ๊ณผ XML ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ ํ™•๋ณด

โœ… 1. ๋งคํผ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์˜ ๋Œ€ํ‘œ ์ฆ์ƒ 5๊ฐ€์ง€

์ฆ์ƒ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์˜ˆ์‹œ ์›์ธ ๋ถ„์„
โŒ XML ํŒŒ์‹ฑ ์‹คํŒจ org.apache.ibatis.exceptions.PersistenceException: Error parsing SQL Mapper Configuration. DTD ๋ˆ„๋ฝ, ํƒœ๊ทธ ๋ˆ„๋ฝ, XML ๊นจ์ง
โŒ Mapper ID ๋ถˆ์ผ์น˜ Parameter 'id' not found. Available parameters are ... XML ID ์ด๋ฆ„ ์˜คํƒ€ ๋˜๋Š” Java ์ชฝ ID ์˜คํƒ€
โŒ resultType ๋ถˆ์ผ์น˜ Could not set property 'irum' on class main.Student DTO ํ•„๋“œ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฆ„
โŒ SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ SQLSyntaxErrorException: Unknown column ์ปฌ๋Ÿผ๋ช… ์˜คํƒ€ or ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”
โŒ include refid ์˜ค๋ฅ˜ org.apache.ibatis.builder.IncompleteElementException: Could not find SQL statement to include with refid <sql id="..."> ์ •์˜ ์—†์Œ or ์ˆœ์„œ ์˜ค๋ฅ˜

โœ… 2. Common Error Checklist (ํ˜„์—… ๊ธฐ๋ฐ˜ ์ •๋ฆฌ)

๊ตฌ๋ถ„ ์ฒดํฌ ํ•ญ๋ชฉ ์˜ˆ์‹œ / ์„ค๋ช…
โœ… XML ๊ธฐ๋ณธ ๊ตฌ์กฐ <!DOCTYPE mapper ...> ์„ ์–ธ์ด ์žˆ๋Š”๊ฐ€? DTD ๋ˆ„๋ฝ ์‹œ ํŒŒ์‹ฑ ์˜ค๋ฅ˜
โœ… ๋„ค์ž„์ŠคํŽ˜์ด์Šค <mapper namespace="...">์— ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋“ค์–ด์žˆ๋Š”๊ฐ€? Java ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„๊ณผ ์™„์ „ํžˆ ๊ฐ™์•„์•ผ ํ•จ
โœ… <select>/<insert> ํƒœ๊ทธ id, resultType, parameterType ๋ˆ„๋ฝ ์—†์Œ? ๋น ์ง€๋ฉด ์ปดํŒŒ์ผ OK โ†’ ์‹คํ–‰ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
โœ… resultType DTO ํ•„๋“œ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…์ด ์ผ์น˜ํ•˜๋Š”๊ฐ€? ์ž๋™ ๋งคํ•‘์ด ์‹คํŒจํ•˜๋ฉด ๊ฐ’์ด ์•ˆ ๋“ค์–ด์˜ด
โœ… ํŒŒ๋ผ๋ฏธํ„ฐ๋ช… Java โ†’ XML ์ „๋‹ฌ๊ฐ’ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š”๊ฐ€? #{hakbun} โ‡” Java param.put("hakbun", 1)
โœ… ์ค‘์ฒฉ ํƒœ๊ทธ <where>, <trim>, <foreach> ์•ˆ ๋‹ซํž˜ ์—ฌ๋ถ€ ํ™•์ธ ์—ด๊ณ  ๋‹ซ๋Š” ํƒœ๊ทธ ์Œ ํ•„์ˆ˜
โœ… include <sql> ์ •์˜ ์ˆœ์„œ๊ฐ€ <include>๋ณด๋‹ค ๋จผ์ €์ธ๊ฐ€? refid๋ฅผ ๋ชป ์ฐพ๋Š” ๊ฒฝ์šฐ
โœ… ๊ฒฝ๋กœ ๋ฌธ์ œ mapper/*.xml ๊ฒฝ๋กœ๊ฐ€ mybatis-config.xml์— ๋งž๊ฒŒ ์ง€์ •๋˜์–ด ์žˆ๋Š”๊ฐ€? ๊ฒฝ๋กœ ์˜คํƒ€๊ฐ€ ์˜์™ธ๋กœ ์žฆ์Œ
โœ… ๋กœ๊ทธ๋กœ SQL ํ™•์ธ log4j ์„ค์ •์ด ์ ์šฉ๋˜์–ด ์žˆ๋Š”๊ฐ€? SQL์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด์•ผ ์ถ”์  ๊ฐ€๋Šฅ

โœ… 3. ์‹ค์ „ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์˜ˆ์‹œ & ํ•ด๊ฒฐ


โŒ ์˜ˆ์™ธ: Could not set property 'irum'

Caused by: java.lang.NoSuchMethodException: main.Student.setIrum(java.lang.Integer)

๐Ÿ” ์›์ธ: DB์—์„œ irum์„ ์ˆซ์ž๋กœ ๋ณด๋‚ด๋Š”๋ฐ DTO์˜ setIrum(String)์ด๊ธฐ ๋•Œ๋ฌธ

โœ… ํ•ด๊ฒฐ: ์ปฌ๋Ÿผ ํƒ€์ž…, DTO ํƒ€์ž…์„ ์ผ์น˜์‹œํ‚ด


โŒ ์˜ˆ์™ธ: <sql id="studentColumns"> ์ •์˜ ๋ชป ์ฐพ์Œ

Could not find SQL statement to include with refid 'studentColumns'

๐Ÿ” ์›์ธ: <sql id="studentColumns">๊ฐ€ <include refid="studentColumns"/>๋ณด๋‹ค ์•„๋ž˜์ชฝ์— ์ •์˜๋˜์–ด ์žˆ์Œ

โœ… ํ•ด๊ฒฐ: <sql> ์ •์˜๋Š” ์œ„์ชฝ์— ์„ ์–ธ


โœ… 4. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ์ฒดํฌ
DTD ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ (<!DOCTYPE mapper ...>) โœ… ย 
๋ชจ๋“  ํƒœ๊ทธ ๋‹ซํž˜ ์—ฌ๋ถ€ ํ™•์ธ โœ… ย 
<sql>, <include> ์ˆœ์„œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”๊ฐ€ โœ… ย 
parameterType, resultType ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š”๊ฐ€ โœ… ย 
DTO ํ•„๋“œ๋ช… โ†” ์ปฌ๋Ÿผ๋ช… ์ผ์น˜ ์—ฌ๋ถ€ โœ… ย 
Java โ†’ XML ์ „๋‹ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์ผ์น˜ ์—ฌ๋ถ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
XML ์—๋””ํ„ฐ์—์„œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋„๊ตฌ(Eclipse, IntelliJ)๋ฅผ ์‚ฌ์šฉ ย 
๋กœ๊ทธ์— SQL: Parameters: ๊ฐ€ ๋‚˜์˜ค๋„๋ก log4j ์„ค์ • ํ•„์ˆ˜ ย 
์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด Mapper XML์„ ์ตœ์†Œ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ํ…Œ์ŠคํŠธ ย 
๋ณต์žกํ•œ WHERE์ ˆ์€ <sql>๋กœ ๋ถ„๋ฆฌํ•ด ๋””๋ฒ„๊น… ์‰ฝ๊ฒŒ ย