안녕하세요. 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를 사용하기에 앞서 많은 이해와 영향도를 생각하는 개발자가 되도록 준비해야겠내요.
'컴퓨터 > Java' 카테고리의 다른 글
don't flush the Session after an exception occurs 이슈 해결 (0) | 2023.04.09 |
---|---|
Java - 기본타입과 박싱된 기본타입 에 대하여(Long vs long) (1) | 2021.04.06 |
Java - Unchecked Exception과 에러처리 (0) | 2021.04.03 |