<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jpa on 42Class</title><link>https://42class.com/tags/jpa/</link><description>Recent content in Jpa on 42Class</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Wed, 03 Feb 2021 00:00:00 +0000</lastBuildDate><atom:link href="https://42class.com/tags/jpa/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리</title><link>https://42class.com/posts/spring-data-jpa-in-mysql%EC%97%90%EC%84%9C-pessimistic-lock%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD-%EC%B2%98%EB%A6%AC/</link><pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/spring-data-jpa-in-mysql%EC%97%90%EC%84%9C-pessimistic-lock%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD-%EC%B2%98%EB%A6%AC/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/title_jpa.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;WMS운영 중 비정상적인 락 처리 현상이 있어 확인한 결과 공유드립니다.
Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;락 어논테이션으로 처리 : @Lock(LockModeType.PESSIMISTIC_WRITE)&lt;/li&gt;
&lt;li&gt;쓰기,읽기 모두 lock를 거는 방식이지만 실제로는 읽기에 대핸 lock이 걸리지 않음&lt;/li&gt;
&lt;li&gt;읽기도 lock을 걸려면, 해당 row에 접근하는 select 쿼리에 모두 for update구문을 걸어줘야 함(@Lock(LockModeType.PESSIMISTIC_WRITE))&lt;/li&gt;
&lt;li&gt;해당 락은 row level lock이지만 mysql innoDB의 락 처리 방식은 인덱싱 되지 않은 조건으로 선별 된 row에 대해선 row level로 락은 잡지 못함&lt;/li&gt;
&lt;li&gt;mysql innoDB는 인덱싱 범위에 대해서 락을 잡는 방식으로 인덱싱 되지 않은 조건으로 선별 된 select결과는 row가 아닌 테이블이 락이 걸리는 현상이 발생됨&lt;/li&gt;
&lt;li&gt;락을 걸어야 하는 데이터 셋의 검색조건은 인덱싱된 컬럼을 기준으로 잡아야 함&lt;/li&gt;
&lt;li&gt;JPA에서 lock scope범위에 따라 릴레이션 된 모델들도 함께 락이 잡히게 됨&lt;/li&gt;
&lt;li&gt;대상 테이블만 락의 범위로 잡으려면 scope를 지정해줘야 함&lt;/li&gt;
&lt;li&gt;락 범위 어논테이션으로 처리 : @QueryHints(value = {@QueryHint(name = &amp;ldquo;javax.persistence.lock.scope&amp;rdquo;, value = &amp;ldquo;NORMAL&amp;rdquo;)})&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JPA N+1튜닝과정에서 선언한 배치 사이즈와 다르게 쿼리 분할 되어 수행되는 이유</title><link>https://42class.com/posts/jpa-n-1%ED%8A%9C%EB%8B%9D%EA%B3%BC%EC%A0%95%EC%97%90%EC%84%9C-%EC%84%A0%EC%96%B8%ED%95%9C-%EB%B0%B0%EC%B9%98-%EC%82%AC%EC%9D%B4%EC%A6%88%EC%99%80-%EB%8B%A4%EB%A5%B4%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EB%B6%84%ED%95%A0-%EB%90%98%EC%96%B4-%EC%88%98%ED%96%89%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/</link><pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/jpa-n-1%ED%8A%9C%EB%8B%9D%EA%B3%BC%EC%A0%95%EC%97%90%EC%84%9C-%EC%84%A0%EC%96%B8%ED%95%9C-%EB%B0%B0%EC%B9%98-%EC%82%AC%EC%9D%B4%EC%A6%88%EC%99%80-%EB%8B%A4%EB%A5%B4%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EB%B6%84%ED%95%A0-%EB%90%98%EC%96%B4-%EC%88%98%ED%96%89%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/title_jpa.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;h2 id="jdbc-preparedstatement의-캐싱-방식"&gt;JDBC preparedstatement의 캐싱 방식
&lt;/h2&gt;&lt;p&gt;먼저 이 현상을 설명하려면 JDBC의 preparedstatement의 캐싱 방식을 알아야 합니다.&lt;br&gt;
preparedstatement는 in절이 들어가는 select 쿼리에 대해 각 경우를 모두 캐싱합니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;,&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 n개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;,&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, ...)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hibernate의-batch_size에-의한-캐싱-방식"&gt;hibernate의 batch_size에 의한 캐싱 방식
&lt;/h2&gt;&lt;p&gt;위의 방식으로 캐시되는 경우 데이터가 많아질수록 많은 케이스를 캐싱해야 해서 성능에 문제가 발생합니다.&lt;br&gt;
그래서 하이버네이트는 최적화를 위해 캐싱케이스를 줄이는 방식으로 수행됩니다.&lt;br&gt;
줄이는 방식은 프로젝트에 선언 된 기본배치사이즈 &lt;em&gt;(hibernate.default_batch_fetch_size: 100)&lt;/em&gt; 를 기준으로 절반씩 나눠가면서 캐싱합니다.&lt;br&gt;
그리고 자주사용할 것으로 예상되는 1~10 사이는 모두 캐싱 하게됩니다.&lt;br&gt;
in절 항목값을 100으로 잡을 때, 기존 preparedstatement 방식에 의하면 총 100개의 케이스를 캐싱해두게 됩니다.&lt;br&gt;
하이버네이트의 방식으로 하게 되면 14개로 줄어듭니다.&lt;br&gt;
(1,2,3,4,5,6,7,8,9,10,12, 25,50,100)&lt;/p&gt;
&lt;p&gt;N+1이슈가 발생한 쿼리가 있고 총 데이터가 83건이면 83번의 동일한 쿼리가 나가는 상황일겁니다.&lt;br&gt;
현상 튜닝을 위해 &lt;em&gt;hibernate.default_batch_fetch_size: 100&lt;/em&gt; 으로 설정 후 조회합니다.&lt;br&gt;
예상으로는 쿼리는 한번 나가고 in절 항목이 83개가 들어간 쿼리를 기대합니다.&lt;br&gt;
하지만 실제로는 캐싱된 케이스에 의해 아래와 같이 총 3번의 동일한 쿼리가 나가게 됩니다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;in절 항목이 50으로 캐싱된 쿼리 한 번
in절 항목이 25로 캐싱된 쿼리 한 번
in절 항목이 8으로 캐싱된 쿼리 한 번
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="83개-항목이-분리-요청-된-실제-예"&gt;83개 항목이 분리 요청 된 실제 예
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bd93f9"&gt;2020&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;08&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;07&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;17&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;33&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;30&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;948&lt;/span&gt; DEBUG [XNIO&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt; task&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;] &lt;span style="color:#ff79c6"&gt;SQL&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bd93f9"&gt;2020&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;08&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;07&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;17&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;33&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;30&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;969&lt;/span&gt; DEBUG [XNIO&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt; task&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;] &lt;span style="color:#ff79c6"&gt;SQL&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="최적화-전략"&gt;최적화 전략
&lt;/h2&gt;&lt;p&gt;위와 같이 하이버네이트는 최적화 전략으로 수행됩니다.&lt;br&gt;
3번의 캐싱된 쿼리가 수행되는 것은 정상적인 부분이며 하이버네이트에서 권장하는 기본전략입니다.&lt;br&gt;
참고로, 선언한 &lt;em&gt;(hibernate.default_batch_fetch_size: 100 )&lt;/em&gt; 사이즈 만큼 in절 항목을 발생시키고 싶다면 설정파일에 &lt;em&gt;hibernate.batch_fetch_style: dynamic&lt;/em&gt;을 추가하시면 됩니다.&lt;br&gt;
하지만 이 방식은 캐싱되지 않은 케이스로 쿼리가 수행되므로 권장하지 않는 방식이라고 합니다.&lt;/p&gt;</description></item></channel></rss>