오늘은 몰랐으면 내일은 알면 된다
2022-12-16 (4) Dynamic SQL을 이용한 실습 본문
게시글에는 제목과 내용이 있다. 이 게시글을 수정한다고 했을 때, 반드시 제목과 내용을 둘 다 수정하는 것은 아닐 것이다.
글제목만 수정하려면 요청전달데이터의 글내용에는 null 또는 ""이 전달 될 것이다.
반대로 글내용만 수정하려면 요청전달데이터의 글제목에는 null 또는 ""이 전달 될 것이다.
아래와 같은 컨트롤러에 Postman을 사용하여 수정 요청을 보내보자.

boardContent는 빼고 보낼 것이다.

지금 현재는 이에 대한 처리가 없기 때문에 SQLException이 발생한다.
콘솔을 확인해보면 2번째 바인딩 변수에 setNull이 호출된 것을 확인할 수 있다.

여기서 구분해야할 점이 있는데, Java에서의 null은 아무 값도 참조하지 않는다는 뜻이고, Oracle에서의 null은 아무 값도 아니라(값으로 쓸 수 없다)는 뜻이다.
서로 null의 정의가 다르다보니, Java에서의 null을 Oracle에서 어떻게 세팅할 것인지 정의해줘야한다.
위의 경우에는 해당 내용이 없으니 MyBatis에서 setNull을 호출해서 1111이라는 값을 냅다 박아버린 것이다.
MyBatis 공식문서에서 어떻게 설정하는지를 확인할 수 있다.
https://mybatis.org/mybatis-3/configuration.html
mybatis – MyBatis 3 | Configuration
Configuration The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves. The high level structure of the document is as follows: configuration properties These are externalizable, substitutable properties
mybatis.org

실습에서는 Java에서의 null을 Oracle의 null과 같은 의미라고 설정해주겠다.
mybatis-config.xml 로 가서 해당 설정을 추가해준다.
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- java의 null값을 DB의 어떤타입으로 매핑할 것인가를 세팅 -->
<!-- ex) java의 null값을 Oracle의 null 값으로 세팅 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
설정을 마친다음 위의 요청을 다시 보내보자. board_content = NULL이 된 것을 확인할 수 있다.

그러나 이것도 문제가 있는데, NULL을 보낸다는 뜻은 내용을 수정하지 않겠다는 뜻이지 내용을 NULL로 바꾸겠다는 뜻이 아니기 때문이다.
Dynamic SQL문을 클래스로 만들려면 Provider 클래스가 추가로 필요하고, 점차 복잡해진다고 하여 과감히 버리고 xml에만 집중한다.
이제 sql문을 바꿔보자.
<update id="update" parameterType="RepBoard">
UPDATE rep_board
<set>
<if test="boardTitle != null">
board_title = #{boardTitle},
</if>
<if test="boardContent != null">
board_content = #{boardContent}
</if>
</set>
WHERE board_no = #{boardNo} AND board_id = #{boardC.id}
</update>
Repository도 다시 xml을 사용하도록 변경한다.
@Override
public void update(RepBoard rb) throws ModifyException {
SqlSession session = null;
try {
session = sqlSessionFactory.openSession();
session.update("com.my.mybatis.RepBoardMapper.update", rb);
} catch(Exception e) {
e.printStackTrace();
throw new ModifyException(e.getMessage());
} finally {
if(session != null) {
session.close();
}
}
}
그 다음 다시 요청을 보내보면, 다음과 같이 요청값이 null인 컬럼은 세팅되지 않은 것을 확인할 수 있다.

'Java > JAVA 개발자 양성과정' 카테고리의 다른 글
| 2022-12-17 (1) Spring Boot 계속 (0) | 2022.12.17 |
|---|---|
| 2022-12-16 (5) Spring Boot 시작 (0) | 2022.12.16 |
| 2022-12-16 (3) Transaction (0) | 2022.12.16 |
| 2022-12-16 (2) AOP (0) | 2022.12.16 |
| 2022-12-16 (1) MyBatis 동적 SQL (0) | 2022.12.16 |