Springboot

[Spring, JPA] PK의 auto_increment가 범위를 벗어날 경우

hyerann 2020. 5. 18. 01:21

안녕하세요. 😃

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 까지만 저장이 가능합니다!

 

저는 제 예상과 달라 굉장히 신기했는데요. ㅎㅎ

이 글을 보시는 분들은 어떠실지 모르겠습니다!

혹시 잘못된 부분이 있으면 알려주세요. 😄