콘솔에 status:500과 함께 Internal Server Error가 떴다.
디버깅해보니 BOARD 테이블의 IDX 필드에 대한 기본 키 또는 고유 인덱스 위반이 발생했단다.
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.BOARD(IDX) ( /* key:1 */ TIMESTAMP '2022-02-18 23:24:00', CAST(1 AS BIGINT), U&'\\c791\\c131\\c7901', U&'\\ac8c\\c2dc\\ae00 \\b0b4\\c6a91', U&'\\ac8c\\c2dc\\ae00 \\c81c\\baa91')"; SQL statement:
insert into board (author,contents,created_at,title,idx) values (?,?,?,?,default) [23505-220]
이러한 에러는 보통 다음 2가지 상황일 때 발생한다.
이미 @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 통해 idx 필드의 값이 데이터베이스에 새 레코드를 삽입할 때 데이터베이스에 의해 자동으로 생성(즉, 자동 증가)되도록 지정된 상태였다.
그래서 테이블의 스키마에서 IDX가 자동 증가로 설정되어 있는지 확인해보았다. 다음 SQL 명령어를 통해 알아볼 수 있다.
SHOW COLUMNS FROM BOARD;
SELECT COLUMN_NAME, IS_AUTOINCREMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'BOARD';
IS_AUTOINCREMENT 컬럼을 확인할 수 없다면 아래 명령어를 이용하자.
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'BOARD';
테이블의 모든 컬럼에 대한 상세정보를 반환한다.
AUTO_INCREMENT 또는 유사한 필드를 찾아 IDX 컬럼의 자동 증가 설정 여부를 확인하면 된다.
나의 경우, 테이블 스키마에서는 AUTO_INCREMENT 역할이 잘 설정되어 있었다.
IDENTITY_GENERATION는 BY DEFAULT (기본적으로 IDENTITY 값이 자동으로 생성됨),
IDENTITY_START(자동 증가 시작 값)과IDENTITY_INCREMENT(증가량)가 1, 1로 설정되어 있었다.
애플리케이션의 데이터 삽입 로직을 봤을 때 다른 파일에서는 IDX 값에 대한 수동 설정이 없지만, import.sql에서 INSERT 문을 사용하여 BOARD 테이블에 초기 데이터를 삽입할 때 IDX 값을 수동으로 지정하고 있었다.
애플리케이션을 여러 번 재시작할 경우 IDX에 대한 자동 증가 값이 초기화되면서 이러한 충돌이 발생할 수 있으므로, IDX 필드를 삭제했다.
INSERT INTO BOARD (IDX, TITLE, CONTENTS, AUTHOR, CREATED_AT) VALUES (1, '게시글 제목1', '게시글 내용1', '작성자1', '2022-02-18 23:24:00');
INSERT INTO BOARD (TITLE, CONTENTS, AUTHOR, CREATED_AT) VALUES ('게시글 제목1', '게시글 내용1', '작성자1', '2022-02-18 23:24:00');
spring.jpa.hibernate.ddl-auto 속성을 create-drop 또는 create로 설정하면, 애플리케이션 시작 시 데이터베이스 테이블이 새로 생성되고 종료 시 삭제된다.
spring:
jpa:
hibernate:
ddl-auto: create-drop
나의 경우, 이미 위와 같이 설정하였는데도 에러가 발생했었다.
IDX 필드를 삭제한 후 문제가 해결되었다.
🕯️참고하면 좋을 글)
1. https://velog.io/@youswim96/Unique-index-or-primary-key-violation-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95
2. https://velog.io/@g00dluckroon/JPA-%EC%97%AC%EB%9F%AC-%EC%98%A4%EB%A5%98%EB%93%A4