컴퓨터/Java

JPA - Field 'id' doesn't have a default value

곤정이 2021. 4. 4. 16:34
반응형

안녕하세요. Ruk입니다.

요즘 한창 JPA를 탐구하고 사용해보는 중인데요. 이번에 발생한 에러에 대해 적어보려고 해요.

 

Entity 객체를 Builder하여 save시키는 단순한 로직인데 500에러가 발생을 한다고 Fe개발자에게 연락을 받았습니다.

( 회사 실무가 아닌 주말 스터디 팀이에요... ㅎㅎㅎㅎ 500에러 후,,,, 다행 )

바로 aws서버 로그를 까서 보았습니다.

해당 필드에 null값이 들어가면서 sql문에 오류가 발생한 것 인데요.

기존에 잘 쓰던 로직이라 처음에는 뭔가 이해가 되지 않더라구요.

 

바로 최근 변경내역에 대한 히스토리를 보다가 문득 아차싶은 부분을 볼 수 있었습니다.

변경 전 : @GeneratedValue

변경 후 : @GeneratedValue(strategy = GenerationType.IDENTITY)

 

최근 Entity에 대하여 IDENTITY 옵션을 주며 수정을 했습니다.

해당 옵션을 주면서 장애가 발생하게 된 것인데요.

결론부터 말해서 수정방법은 아래와 같습니다.

자동증가(AI)옵션을 추가해주면 됩니다.

 

우리는 개발자이기에 왜 멀쩡하던 기능이 option하나 주었다고 왜 이렇게 장애로 바뀐것 인지 탐구해 볼 필요가 있는데요.

 

yml파일에서 ddl-auto: create로 보통 쓰시진 않을 것 으로 생각합니다.

create 였다면, 해당 테이블을 삭제 후 새로 생성하면서 AI옵션을 넣어주었을 것이고, 물론 장애도 안생겼겠죠.

하지만 update, none으로 설정하였기에 테이블을 새로 생성하진 않습니다.

 

이러면서 문제가 발생 합니다.

기존 @GeneratedValue의 경우 

save() 처리 시 hibernate_sequence테이블에서 id값을 할당받아 자동으로 채우고 insert를 시키게 되는데

변경 된 @GeneratedValue(strategy = GenerationType.IDENTITY)의 경우

save() 처리 시 자동증가값을 사용하도록 설정이 되어 있기에 id값이 sql에 없는걸 확인 할 수 있습니다.

 

눈치 채셨나요? 네 DB와 JPA가 Save()의 sql문이 상이한 것 입니다.

현재 DB는 AI설정이 off이므로 sql에 필수 값 이였던 것 이죠.

 

IDENTITY 외 테이블 방식도 있는데 어떤 DB와 전략을 사용하느냐에 따라 설정하고 DB까지 맞춰줘야겠군요.

 

GeneratedValue설정을 변경 할 때 어떻게 동작하게 될지. DB에 대한 영향도를 생각안하고 변경만 해버린 제 실수가 500장애를 발생시켰습니다.

JPA를 사용하기에 앞서 많은 이해와 영향도를 생각하는 개발자가 되도록 준비해야겠내요.

반응형