728x90
발단
DB 에서 값을 변경하려고 JPA 를 통해 시도하였을 때 필자 입장에서는 단순한 VARCHAR(1) 구조의 필드 였음으로 수정되어 마땅한 상황이었지만, 왜인지 SQL Error: 1064, SQLState: 42000 오류가 지속적으로 발생하였다.
설명
필자가 사용한 테이블에는 DB 의 예약어를 포함하고 있었다 (예약어인지 모르고 필드로 사용). 테이블의 값을 수정하려 할 때 예약어를 수정하려 한 것은 아니지만, JPA 가 객체 형태로 영속성 매니저에게 값을 전달하고 있었기에 DB 에 전달한 query 를 실행하면서 syntax error 가 발생하게 된것이다.
예시
DB 구조
CREATE TABLE `test1` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`openYn` VARCHAR(1) NOT NULL DEFAULT 'N' COLLATE 'utf8_general_ci',
`offset` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE
)
값 수정 시 로그
update
chatloginfo
set
openYn=?,
offset=?,
- 예약어가 아닌 openYn 에 대한 값을 수정 하였을 때도 위와 같은 @Entity 객체 값 전부를 query 에 포함한다.
- 즉, DB 입장에서 offset 을 수정하기 위해 offset 필드에 접근하게 된다.
예시 설명
- 위 로그에서 볼 수 있듯이, openYn 의 값을 변경하려 하였지만 offset(예약어) 또한 query 에 포함되기에 syntax error 가 발생하게 된다.
해결
@Column(name = "`offset`", nullable = false)
var offset: Long = 0
- @Entity 내부에서 예약어로 인한 문제라면 @Column name 필드값을 '`' 로 감싼것으로 수정하자.
- 위와 같이 수정하게 되면 DB 입장에서 예약어임에도 필드명으로 인지하여 query 가 처리된다.
해결된 코드로 수정 요청시 로그
update
chatloginfo
set
openYn=?,
`offset`=?,
- '`' 로 필드를 감싸서 요청하는 것을 확인할 수 있다.
728x90