JPA 관련 웹 애플리케이션 제작 과제를 진행하던 중 JPA 쿼리 동작 방식의 이해도가 낮아서 애플리케이션 제작에 어려움을 느끼고 이를 해결하고자 인프런에서 김영한님의 ORM 강의를 공부하며 그 내용들을 기록하고자 한다.
JPA를 활용해 엔티티를 정의할 때 기본키를 @Id
로 정의하고 @GeneratedValue
를 통해 자동생성 기능을 이용하는데 나는 지금까지 단순하게
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
위와 같은 방식을 이용해왔는데 이 방식은 그렇게 좋지 못한 방법이란 걸 알게되었다.
그 이유는 저 방식은 제약조건의 네이밍이 무작위로 만들어져 제약조건의 이름만으로 의미를 알 수없게 되기 때문이다.
그렇기에 SEQUENCE 전략은 아래와 같이 사용하는 것이 좋다
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 50)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
위 코드를 보면 SequenceGenerator
옵션 중에 initialValue
와 allocationSize
가 있는데 전자는 시퀀스 초기 번호를 의미하고 후자는 한번에 가져오는 시퀀스 사이즈이다.
예제처럼 사이즈가 50이라면 JPA는 시퀀스 번호를 1부터 50까지 메모리에 가져와 저장해놓고 필요할 때 마다 하나씩 사용해 나간다. 그러다가 저장해놓은 50번까지 다 사용하게 되면 다시 51번 부터 100번까지 50개를 가져와 메모리에 저장해 놓는 것이다.
이는 매번 시퀀스 넘버링 정보를 받아오기 위해 영속성 컨텍스트 flush 전에 쿼리를 날리는 부분을 커버할 수 있다.
그렇다고 한꺼번에 너무 많은 사이즈를 받아오는 것도 좋지 않으니 50~100 정도를 추천한다.