일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- AssertJ
- F-Lab
- spring boot
- Thymeleaf
- junit
- Enum
- Naver Cloud
- 네이버 클라우드
- 네이버클라우드
- ncloud
- spring
- 회고
- Naver Cloud Platform
- OrientalUnity
- 에프랩
- Java
- navercloud
- object storage
- NCP
- NooBLoL
- Scheduler
- Pinpoint
- ngrinder
- docker
- DBDocs
- Database
- React
- papago
- NaverCloudPlatform
- mybatis
- Today
- Total
DevJong12
[Issue] H2사용시 ON DUPLICATE KEY UPDATE 오류사항 본문
개요
프로젝트를 진행하면서 UPSERT에 대하여 알게 되어, 게시판기능에 대하여 제작을 하면서 사용해볼 기회가 생겨서 활용하게 되었다.
기능 구현의 완료 이후 테스트를 진행하면서 지속적으로 JdbcSQLSyntaxErrorException가 발생하였다.
해당 문제에 대한 포스트를 남기고자 한다.
프로젝트 기술스택
- JDK 11
- Spring Boot 2.7.2
- Mybatis
- MariaDB, H2
사용 쿼리, 설정
사용중이던 DB url
url: jdbc:h2:tcp://localhost/~/h2/nooblol
문제가 발생한 쿼리는 다음과 같다.
INSERT INTO bbs_articles(article_id, bbs_id, article_title, article_read_count, article_content,
status, created_user_id, created_at, updated_at)
VALUES (#{articleId}, #{bbsId}, #{articleTitle}, #{articleReadCount}, #{articleContent},
#{status}, #{createdUserId}, #{createdAt}, #{updatedAt})
ON DUPLICATE KEY UPDATE
updated_at = IFNULL(VALUES (updated_at), updated_at)
, bbs_id = IFNULL(VALUES (bbs_id), bbs_id)
, article_title = IFNULL(VALUES (article_title), article_title)
, article_content = IFNULL(VALUES (article_content), article_content)
, status = IFNULL(VALUES (status), status)
세부 오류로그
오류가 발생한 원인에 대해서만 가져왔다. Grammer 오류로 보이며, 오류가 발생한 것 같은 부분에 대해서 빨간색으로 칠해 놓았다.
### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO BBS_ARTICLES(ARTICLE_ID, BBS_ID, ARTICLE_TITLE, ARTICLE_READ_COUNT, ARTICLE_CONTENT,
STATUS, CREATED_USER_ID, CREATED_AT, UPDATED_AT)
VALUES (?, ?, ?, ?, ?,
?, ?, ?, ?)
ON[*] DUPLICATE KEY
UPDATE
UPDATED_AT = IFNULL(VALUES (UPDATED_AT), UPDATED_AT)
, BBS_ID = IFNULL(VALUES (BBS_ID), BBS_ID)
, ARTICLE_TITLE = IFNULL(VALUES (ARTICLE_TITLE), ARTICLE_TITLE)
, ARTICLE_CONTENT = IFNULL(VALUES (ARTICLE_CONTENT), ARTICLE_CONTENT)
, STATUS = IFNULL(VALUES (STATUS), STATUS)"; SQL statement:
오류원인
이걸 찾는데 하루가 전부 소요된 것 같다. 오류의 원인은 기본적으로 문법오류이다. 처음부터 문법오류가 난다는건 알고 있었다.
원인을 찾다가 우연히 포스트를 한개 발견했다. 아래의 북마크가 해당 포스트이다.
포스트를 보고 테스트를 진행해보며 원인을 찾을 수 있었다.
해당 오류의 원인은 h2를 사용 할 때 Mode와 관련이 있었다.
설정에서 있듯이 따로 DB의 Mode를 설정을 안하고 사용하고 있었다. 그러다보니 Default로 셋팅된 DB모드를 사용했다고 추측을 하고 있다.
Default로 설정된 DB에 대해서는 따로 문서를 찾지를 못하였으나, Oracle로 강제로 변환해서 테스트를 해본 결과 같은 Syntax Error가 발견되는 것을 봐서는 필자는 일단 Oracle이 Default Mode가 아닌가 추측하고 있다.
추가적으로 Mode의 변경 방법에 대한건 공식문서에 기록이 되어있다. h2공식문서에 대한 북마크는 아래를 참고하면 되겠다.
해결방안
Mode의 문제이다 보니 H2의 사용하는 DB에 대해서 Maria 혹은 MySQL로 변경만 하면된다.
필자도 공식문서에 나온 대로 아래의 설정처럼 변경 후 테스트를 진행했다.
url: jdbc:h2:tcp://localhost/~/h2/nooblol;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
아래의 로그는 실행내역에 대해서 긁어왔다. 오류대신 정상적으로 진행되는 로그가 출력되는 것을 볼 수 있다.
[2022-09-09 01:38:14:12992] DEBUG 32046 --- [nio-8080-exec-3] c.n.b.m.ArticleMapper.upsertArticle : ==> Preparing: INSERT INTO bbs_articles(article_id, bbs_id, article_title, article_read_count, article_content, status, created_user_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE updated_at = IFNULL(VALUES (updated_at), updated_at) , bbs_id = IFNULL(VALUES (bbs_id), bbs_id) , article_title = IFNULL(VALUES (article_title), article_title) , article_content = IFNULL(VALUES (article_content), article_content) , status = IFNULL(VALUES (status), status)
[2022-09-09 01:38:14:12993] DEBUG 32046 --- [nio-8080-exec-3] c.n.b.m.ArticleMapper.upsertArticle : ==> Parameters: 2(Integer), 1(Integer), 수정하는 테스트 제목(String), 0(Integer), 수정 테스트 내용(String), 1(Integer), null, null, 2022-09-09T01:38:14.285949(LocalDateTime)
[2022-09-09 01:38:14:12994] DEBUG 32046 --- [nio-8080-exec-3] c.n.b.m.ArticleMapper.upsertArticle : <== Updates: 2
P.S
한번 Mode를 변경한 이후 다시 URL에서 Mode설정을 제거해보고 테스트를 진행해보니 정상적으로 기능이 실행되고 있었다.
한번 실행하면 해당 값으로 계속 실행이 되는 것 같다...
'프로젝트 > NoobLoL' 카테고리의 다른 글
[refactor]Integer의 equals와 ==의 차이점 (0) | 2022.09.11 |
---|---|
[Issue] 회원가입 인증 메일의 방식 수정 (0) | 2022.09.10 |
개발서버 구성 - 사양이슈 (0) | 2022.08.02 |
프로젝트 세팅 - Git Action CI / CD (2) | 2022.07.29 |
개발 서버 구성작업(3) - MariaDB설치 (0) | 2022.07.26 |