안녕하세요. 😃
JPA와 데이터베이스 관련해서 새로 알게 된 내용이 있어서 간단하게 정리해보려고 합니다.
스프링에서 엔티티 클래스를 만들 때 아래와 같이 Long 값을 pk로 잡고 @GeneratedValue를 이용하여 auto increment 되도록 많이 사용하실거라고 생각합니다.
@NoArgsConstructor
@Entity
public class Book() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
@Builder
public User(String title, String content) {
this.title = title;
this.content = content;
}
}
그럼 만약 API 호출로 Book을 저장하는 요청이 왔을 때, Long의 범위를 벗어나면 어떻게 될까요?
직접 호출을 해보니
- DB에서 Out of range value for column id 에러가 발생하여 저장에 실패하고,
- 서버 내부에서 org.hibernate.exception.DataException 에러가 발생하게 됩니다.
❓여기서 질문❓
Long의 최대값은 9223372036854775807 입니다.
그럼 PK로 9223372036854775807를 가지는 데이터가 저장가능할까요?
아마 대부분 당연히 최대값이니까 최대값까지는❗️ 저장이 가능할거라고 생각하실 것 같은데요.
신기한 점을 발견하였습니다.
auto increment인 경우 최대값을 저장할 수 없습니다.
왜냐하면 PK로 9223372036854775807를 가지는 데이터를 저장하면서 다음 auto increment된 PK 값으로 +1을 더한 값까지 함께 계산이 됩니다.
그 계산된 값은 Long의 범위를 벗어난 9223372036854775808이 되므로 PK로 9223372036854775807를 가지는 데이터가 저장되지 못하고 에러가 발생하게 됩니다.
그러니까 pk가 auto increment로 설정되어 있는 경우 최대값-1 까지만 저장이 가능합니다!
저는 제 예상과 달라 굉장히 신기했는데요. ㅎㅎ
이 글을 보시는 분들은 어떠실지 모르겠습니다!
혹시 잘못된 부분이 있으면 알려주세요. 😄
'Springboot' 카테고리의 다른 글
Spring에서 XML 형식 응답 처리 방법 (0) | 2023.12.06 |
---|---|
Jsoup으로 크롤링하기 (0) | 2020.04.12 |
Spring - @Valid @Requestbody Collection 유효성 검사 하는 법 (0) | 2020.03.30 |
Spring Validation Annotation 총정리 (0) | 2020.01.14 |
HTTP Method - PUT, PATCH 차이점 (0) | 2019.10.22 |
댓글