** ๐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>๋ก ๋ถ๋ฆฌํด ๋๋ฒ๊น
์ฝ๊ฒ |
ย |