이동봉사 중개 공고 등록 시 PostImage를 save하는 쿼리가 여러 번 나가는 성능 문제가 생긴다 ,, !

분명 PostImage의 List를 만들어 한 번에 saveAll을 했지만 쿼리가 PostImage의 개수만큼 나간다 !
벌크 연산을 적용하기 위해 batch size를 설정하여 한 번에 할 수 있는 작업을 늘렸다.
하지만 batch size를 설정한 후에도 쿼리가 나가는 횟수는 동일했다. 어떤 게 문제일까?
문제는 바로 ,,,
Id 채번 방식 (데이터베이스나 시스템에서 고유한 식별자(ID)를 생성하는 방식)이 GenerationType.IDENTITY이면 batch insert가 불가능하다는 것이었다!!
GenerationType.SEQUENCE 또는 GenerationType.TABLE로 설정 변경이 필요!
- GenerationType.IDENTITY 전략은 데이터 입력 시 엔티티를 먼저 저장하고 식별자를 조회해서 할당하는 방식이다.
- GenerationType.TABLE은 PK를 별도 테이블로 관리하는 건데 관리 할 테이블이 늘어나기 때문에 번거롭다.
- GenerationType.SEQUENCE 전략은 데이터 입력 시 sequence를 먼저 조회하고(sequence 조회 쿼리 발생) 엔티티에 할당하여 저장한다.
sequence 전략을 추천하는데, 만약 이를 지원하지 않는 DB라면(ex. Mysql) JPA가 아니라 jdbc를 사용하여 bulk insert를 수행하는게 속도 측면에서 더 우수하다고 한다.
현재 공고의 이미지는 최대 5개까지 등록하는 것이기 때문에 벌크연산을 썼을 때와 성능상 크게 차이나지는 않을 것으로 보인다! Batch Insert 시에 한 번의 쿼리로 해결할 수 없다는 것이 문제인데, 다른 save 로직에서 batch 연산을 적용하는 것이 좋을지 생각해 보고 적용하는 과정을 거치려고 한다!
참고 자료:
[JPA] batch insert 적용
batch insert는 단건 insert가 아닌, insert를 모아서 하는 multi insert를 의미한다. jpa에서 객체를 데이터베이스에 저장할 때 save() 대신 saveAll()을 한다고해서 멀티 insert가 되는건 아니었다. 별도의 설정
do5do.tistory.com
'Trouble Shooting' 카테고리의 다른 글
ConnectDog 동시성 이슈 해결 (1) | 2024.03.11 |
---|---|
S3 이미지 업로드 시 나타나는 warn 로그 (1) | 2023.11.11 |
게시글 테이블과 게시글 이미지 테이블의 연관 관계 설정 (0) | 2023.11.11 |
RDB vs NoSQL (0) | 2023.10.20 |
소셜 로그인, JWT 관련 의문점 정리 (0) | 2023.10.18 |
이동봉사 중개 공고 등록 시 PostImage를 save하는 쿼리가 여러 번 나가는 성능 문제가 생긴다 ,, !

분명 PostImage의 List를 만들어 한 번에 saveAll을 했지만 쿼리가 PostImage의 개수만큼 나간다 !
벌크 연산을 적용하기 위해 batch size를 설정하여 한 번에 할 수 있는 작업을 늘렸다.
하지만 batch size를 설정한 후에도 쿼리가 나가는 횟수는 동일했다. 어떤 게 문제일까?
문제는 바로 ,,,
Id 채번 방식 (데이터베이스나 시스템에서 고유한 식별자(ID)를 생성하는 방식)이 GenerationType.IDENTITY이면 batch insert가 불가능하다는 것이었다!!
GenerationType.SEQUENCE 또는 GenerationType.TABLE로 설정 변경이 필요!
- GenerationType.IDENTITY 전략은 데이터 입력 시 엔티티를 먼저 저장하고 식별자를 조회해서 할당하는 방식이다.
- GenerationType.TABLE은 PK를 별도 테이블로 관리하는 건데 관리 할 테이블이 늘어나기 때문에 번거롭다.
- GenerationType.SEQUENCE 전략은 데이터 입력 시 sequence를 먼저 조회하고(sequence 조회 쿼리 발생) 엔티티에 할당하여 저장한다.
sequence 전략을 추천하는데, 만약 이를 지원하지 않는 DB라면(ex. Mysql) JPA가 아니라 jdbc를 사용하여 bulk insert를 수행하는게 속도 측면에서 더 우수하다고 한다.
현재 공고의 이미지는 최대 5개까지 등록하는 것이기 때문에 벌크연산을 썼을 때와 성능상 크게 차이나지는 않을 것으로 보인다! Batch Insert 시에 한 번의 쿼리로 해결할 수 없다는 것이 문제인데, 다른 save 로직에서 batch 연산을 적용하는 것이 좋을지 생각해 보고 적용하는 과정을 거치려고 한다!
참고 자료:
[JPA] batch insert 적용
batch insert는 단건 insert가 아닌, insert를 모아서 하는 multi insert를 의미한다. jpa에서 객체를 데이터베이스에 저장할 때 save() 대신 saveAll()을 한다고해서 멀티 insert가 되는건 아니었다. 별도의 설정
do5do.tistory.com
'Trouble Shooting' 카테고리의 다른 글
ConnectDog 동시성 이슈 해결 (1) | 2024.03.11 |
---|---|
S3 이미지 업로드 시 나타나는 warn 로그 (1) | 2023.11.11 |
게시글 테이블과 게시글 이미지 테이블의 연관 관계 설정 (0) | 2023.11.11 |
RDB vs NoSQL (0) | 2023.10.20 |
소셜 로그인, JWT 관련 의문점 정리 (0) | 2023.10.18 |