1. org.hibernate.engine.query.spi.QueryPlanCache
์ผ๋ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, where ์ ์ in clause ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. JPA ์ ๊ตฌํ์ฒด์ธ Hibernate ๋ JPQL, Criteria ์ฟผ๋ฆฌ๋ฅผ AST(Abstract Syntax Tree)์ผ๋ก ํ์ฑํ๋ค. ์ด ๋ ์ฟผ๋ฆฌ ์ปดํ์ผ ์๊ฐ์ ๋จ์ถํ๊ธฐ ์ํด Hibernate ์์๋ QueryPlanCache ์ ์ฌ์ฉํ๋ค. ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋๋ง๋ค QueryPlanCache ์ ํ์ธํ์ฌ ์คํ ๊ณํ์ ์บ์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฌ์ฉํ๋ค. (๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ, ํ๋ผ๋ฏธํฐ์ ๋ฐํ ํ์ ์ ์ถ์ถํ์ฌ ParameterMetadata ์ ์ ์ฅํ๋ค.)
2. spring.jpa.properties.hibernate.query.in_clause_parameter_padding
spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true
hibernate.query.in_clause_parameter_padding ์ต์ ์ ํ์ด๋ฒ๋ค์ดํธ 5.2.18 ๋ฒ์ ์ดํ์ ๋ฑ์ฅํ ํ๋กํผํฐ ์ด๋ค. ํด๋น ํ๋กํผํฐ๋ฅผ true ๋ก ์ค์ ํ๋ฉด in clause ์ฟผ๋ฆฌ์ ๋ํด 2์ ์ ๊ณฑ๋จ์๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
[1] ์ ํํ ๋ฌด์์ธ์ง ํ๋ฒ ์๋ฅผ ๋ค์ด ํ์ธํด๋ณด์.
-- http://localhost:8080/api/v1/students?tagNames=1,2,3,4,5 (in์ 5๊ฐ)
select
student0_.id as id1_0_,
student0_.name as name2_0_,
student0_.tag_name as tag_name3_0_
from
student student0_
where
student0_.tag_name in (? , ? , ? , ? , ?); -- 5๊ฐ ํ๋ผ๋ฏธํฐ
์๋ฅผ ๋ค์ด, in clause ํ๋ผ๋ฏธํฐ๊ฐ 5๊ฐ์ธ ๊ฒฝ์ฐ, ํ๋ผ๋ฏธํฐ ์ค ์ค๋ณต๋ ๊ฐ์ ํจ๋ฉํด์ ํ๋ผ๋ฏธํฐ๋ฅผ 8๊ฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ํด๋น ์ต์ ์ ์ ์ธํ๋ฉด ์บ์ฑ๋ ์ฟผ๋ฆฌ ํ๋๋ฅผ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์๋ ์ฅ์ ์ด ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์ต์ ์ default value ๋ false ์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฐฏ์์ in clause ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ memory leak ์ ์์ธ์ด ๋ ์ ์๋ค.
[2] in clause ํ๋ผ๋ฏธํฐ๊ฐ ์ค๋ณต๋๋ฉด ์ด๋ป๊ฒ ๋์ํ ๊น?
MySQL ์๋ฒ์ ๊ฒฝ์ฐ, IN (list) ์กฐ๊ฑด์ด ์ฌ์ฉ๋๋ฉด, list ์๋ฆฌ๋ฉํธ ๊ฐ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋จผ์ ๋ก๋ํด์ ์ค๋ณต ๊ฐ์ ์ ๊ฑฐํด ๊ฐ๋ฅํ ํํ๋ก ๋ง๋ ๋ค.
in (1, 2, 3, 3) -> in (1, 2, 3)
[3] hibernate.query.in_clause_parameter_padding ์์
spring.jpa.properties.hibernate.query.in_clause_parameter_padding ๊ฐ์ด true ์ผ ๊ฒฝ์ฐ, in clause ์ 2์ ์ ๊ณฑ ๋จ์๋ก ์ค๋ณต๋ ๊ฐ์ ํจ๋ฉํด์ ์์ฑํ๊ธฐ ๋๋ฌธ์ QueryPlanCache ์ ์ฟผ๋ฆฌ ํ๋์ ์บ์ฑํ ๋๋ ํ๋ผ๋ฏธํฐ์ ๊ฐฏ์๊ฐ ์ผ์ ํ ๊ฐฏ์๋ก ์ฑ์์ง๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
false
[QueryPlanCache]
3๊ฐ : in (?, ?, ?)
4๊ฐ : in (?, ?, ?, ?)
5๊ฐ : in (?, ?, ?, ?, ?)
6๊ฐ : in (?, ?, ?, ?, ?, ?)
7๊ฐ : in (?, ?, ?, ?, ?, ?, ?)
8๊ฐ : in (?, ?, ?, ?, ?, ?, ?, ?)
[์ฟผ๋ฆฌ ์คํ]
3๊ฐ : in (?, ?, ?) -> (์ฌ์ฌ์ฉ)
4๊ฐ : in (?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
5๊ฐ : in (?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
6๊ฐ : in (?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
7๊ฐ : in (?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
8๊ฐ : in (?, ?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
[QueryPlanCache]
4๊ฐ : in (?, ?, ?, ?)
8๊ฑ : (?, ?, ?, ?, ?, ?, ?, ?)
[์ฟผ๋ฆฌ ์คํ]
3๊ฐ : in (?, ?, ?) -> 4๊ฐ : (?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
4๊ฐ : in (?, ?, ?, ?) -> 4๊ฐ : (?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
5๊ฐ : in (?, ?, ?, ?, ?) -> 8๊ฑ : (?, ?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
6๊ฐ : in (?, ?, ?, ?, ?, ?) -> 8๊ฑ : (?, ?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
7๊ฐ : in (?, ?, ?, ?, ?, ?, ?) -> 8๊ฑ : (?, ?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
8๊ฐ : in (?, ?, ?, ?, ?, ?, ?, ?) -> 8๊ฑ : (?, ?, ?, ?, ?, ?, ?, ?) -> (์ฌ์ฌ์ฉ)
Reference
'๐ backend > spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring Batch] Job ์คํ ํ๋กํผํฐ, JobParameter, Scope (0) | 2024.08.26 |
|---|---|
| Spring Batch Architecture (0) | 2024.05.10 |
| JPA ์ UUID version 7 ์ ์ฉํ๊ธฐ (0) | 2024.03.04 |
| [Spring] Spring AOP ๋์ ์์๋ณด๊ธฐ (0) | 2024.03.04 |
| [JPA] ์ฝ๋๋ก ๋ณด๋ OSIV ์ ๊ณ ์ฐฐ (2) | 2024.01.30 |