본문 바로가기
스프링 부트/JPA

[스프링] DATA JPA In절로 파라미터 넣기

by illlilillil 2022. 8. 25.

JPA를 통해 in clause를 쉽게 사용할 수 있습니다.

아래처럼 in을 통해 한 개의 쿼리만 수행됩니다.

List<Worker> findByIdIn(List<Integer> ids);

select .... from Worker where id in (? ,? ,?)

 

여기서 문제는 ids가 고정된 크기의 객체가 아니라는 점입니다. 

한번에 16개를 할당해 결과를 얻고 싶을때 너무 많은 데이터를 대비해 5개씩 짤라서 조회했다고 가정했을때, 여러 가지의 SQL이 생성되고 호출이 됩니다.

JDBC에는 PreparedStatement 객체가 있는데 이 객체는 이미 생성된 SQL문을 활용해 지속해서 재사용을 통해 좋은 성능을 얻을 수 있도록 하는 객체입니다.

in절을 통해 생성하다보면 호출마다 다른 SQL이 호출되고 저장되어 위의 장점을 활용하지 못하게 되고, query가 hibernate에 지속적으로 쌓이게 되어 힙 메모리를 점유하게 됩니다.

 

 

 

DBA와 개발자가 모두 행복해지는 Hibernate의 in_clause_parameter_padding 옵션 : NHN Cloud Meetup

Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다.

meetup.toast.com

 

댓글