JPA를 사용하여 saveAll을 할 경우 100개의 데이터를 저장하는데 100개의 쿼리를 날린다.
insert를 할때 batch_size를 지정하여 쿼리를 한번에 날릴 수 있다는 글을 보고 시도를 했는데 적용이 되지 않았다.
그 이유는 아래 글에 나와있고, 해결방법은 native query를 사용하거나 stategy=table 옵션을 사용하는 등의 방법이 있는 것 같다.
JPA를 사용할때
@Entity 와 함께 필수적으로 사용해야할 @Id가 있다.
이때 Id값을 어떻게 자동으로 생성해 줄지 정해줄 수 있다. 오늘은 이것에 대해 알아보자
@GeneraterdValue
@GeneraterdValue 어노테이션을 사용하면 Stategy 라는 옵션을 설정해 기본키 생성 전략을 정할 수 있다.
옵션은 AUTO, IDENTITY, SEQUENCE, TABLE 4종류가 있다.
IDENTITY
기본키 생성을 데이터베이스에 위임하는 방식이다.
auto_increment를 사용해서 기본키를 생성하는 방식으로, commit을 하여 DB에 저장되지 않는다면 키값을 알 수 없다.
때문에 properties.setPropertiy("hibernate.jdbc.batch_size", "100") 와 같은 한번에 저장하는 옵션에는 적용할 수 없다.
SEQUENCE
시퀀스 전략은 DB에서 값을 미리 받아오는 방식이다.
먼저 next_sequence(id값)를 지정된 갯수만큼 DB에서 발급받는다. 이때 갯수는 allocationSize 라는 값을 통해 지정할 수 있다.
이때 allocationSize가 100이고, 저장하려는 데이터가 101이라면 DB호출을 한번 더하여 또 100개의 next_sequence를 가져와야한다.
allocationSize를 적게 잡으면 잦은 DB호출이 일어나고, 많이 잡으면 메모리가 낭비될 수 있다.
TABLE
테이블 전략은 키 전용 테이블을 생성해서 키 값을 관리하는 방식이다.
최적화 되지않은 테이블을 사용하게되면 성능상 이슈가 있을 수 있어 운영 서버에서는 사용하지 않는다고한다.
그만 알아보자.
AUTO
데이터베이스(방언)에 따라 위의 세가지 전략을 자동으로 지정한다.
mysql - auto_increment / oracle - sequence
'Web' 카테고리의 다른 글
| 관심사의 분리 (0) | 2022.03.13 |
|---|---|
| 좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2022.03.13 |
| 아파치와 톰캣의 차이 (0) | 2020.11.01 |
| HttpServletRequst와 HttpServletResponse (0) | 2020.11.01 |
| 프록시x게이트웨이x터널 (0) | 2020.09.25 |