[JPA] 엔티티 매핑

재호·2022년 6월 21일
0

개요

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 옵션 중에 initialValueallocationSize 가 있는데 전자는 시퀀스 초기 번호를 의미하고 후자는 한번에 가져오는 시퀀스 사이즈이다.

예제처럼 사이즈가 50이라면 JPA는 시퀀스 번호를 1부터 50까지 메모리에 가져와 저장해놓고 필요할 때 마다 하나씩 사용해 나간다. 그러다가 저장해놓은 50번까지 다 사용하게 되면 다시 51번 부터 100번까지 50개를 가져와 메모리에 저장해 놓는 것이다.
이는 매번 시퀀스 넘버링 정보를 받아오기 위해 영속성 컨텍스트 flush 전에 쿼리를 날리는 부분을 커버할 수 있다.

그렇다고 한꺼번에 너무 많은 사이즈를 받아오는 것도 좋지 않으니 50~100 정도를 추천한다.

profile
Java, Spring, SpringMVC, JPA, MyBatis

0개의 댓글