๐ 1. ์ปค๋ฅ์ ํ(Connection Pool)์ด๋?
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ(Connection)์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ํ(Pool)์ ๋ณด๊ดํด๋๊ณ , ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฆ์ ๊บผ๋ด์ ์ฌ์ฉํ๊ณ ๋ค์ ๋ฐ๋ฉํ๋ ๊ตฌ์กฐ.
โ ์ฅ์
- ๋งค๋ฒ DB ์ฐ๊ฒฐ์ ์๋ก ๋ง๋ค์ง ์์๋ ๋ผ์ ์๋ ๋น ๋ฆ
- DB ์ปค๋ฅ์ ์๋ฅผ ์ ํํด ๊ณผ๋ถํ ๋ฐฉ์ง
๐ 2. HikariCP๋?
- Spring Boot์ ๊ธฐ๋ณธ ์ปค๋ฅ์ ํ ๊ตฌํ์ฒด.
- ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ์ปค๋ฅ์
ํ๋ก, ์ฑ๋ฅ์ด ๋ฐ์ด๋์ ๋๋ฆฌ ์ฐ์ธ๋ค.
๐ 3. HikariCP ์ค์
โ 3-0. yaml ์์
spring:
datasource:
hikari:
maximum-pool-size: 30
minimum-idle: 30
idle-timeout: 60000
connection-timeout: 3000
โ 3-1. maximum-pool-size
- ์ปค๋ฅ์ ํ์ ์์ฑ๋ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ์
- ์: 30 → ๋์์ 30๊ฐ์ ์ปค๋ฅ์
๊น์ง ์์ฑ ๊ฐ๋ฅ
- ๋๋ฌด ์์ผ๋ฉด ์์ฒญ ๋๊ธฐ ๋ง์์ง๊ณ , ๋๋ฌด ํฌ๋ฉด DB์ ๋ถํ ์๊น
๐ ์์
์ฌ์ฉ์ 100๋ช ์ด ๋์์ ์ ์ํ์ง๋ง DB ์์ ์ 20๋ช ์ ๋๋ง ๋์์ ๋ฐ์ํ๋ค๋ฉด, 30 ์ ๋๊ฐ ์ ์ ํ ์ ์๋ค.
์ฌ์ฉ์ 1๋ช ์ด ๋ณ๋ ฌ๋ก ์ฌ๋ฌ๊ฐ ์์ฒญ ํ ์ ์์.
โ 3-2. minimum-idle
- ์ ํด ์ํ๋ก ์ ์ง๋๋ ์ปค๋ฅ์ ์
- ์: 30 → ํญ์ 30๊ฐ์ ์ปค๋ฅ์ ์ ์ ์ง (ํ ๊ณ ์ ๋๋)
- ์์ฒญ์ด ์๋๋ผ๋ 30๊ฐ๋ฅผ ๋ง๋ค์ด ๋๊ธฐ ๋๋ฌธ์, ์ด๊ธฐ ์๋ต์ด ๋น ๋ฆ
๐ฅ ์ฃผ์
minimum-idle์ด maximum-pool-size๋ณด๋ค ํฌ๋ฉด ๋ฌด์๋๊ณ , ๊ธฐ๋ณธ๊ฐ maximum-pool-size๋ก ์ค์ ๋จ (ํ ์ ์ฒด๋ฅผ ํญ์ ๋๊ธฐ ์ํ๋ก ์ ์ง)
โ 3-3. idle-timeout
- ์ ํด ์ปค๋ฅ์ ์ ์ ๋ฆฌํ๋ ์๊ฐ (ms)
- ์: 60000 → 60์ด ์ด์ ์๋ฌด ์์ ๋ ์ ํ ์ปค๋ฅ์ ์ ์ ๋ฆฌ๋จ
- ๋จ, ์ต์ ์ ํด ์(minimum-idle)๋ ํญ์ ์ ์ง๋๊ธฐ ๋๋ฌธ์
60์ด ์ง๋๋ ์ ๋ฆฌ๋์ง ์์ ์ ์์.
โญ ๊ธฐ๋ณธ๊ฐ: 600000ms (10๋ถ)
๐ฅ ์ต์ 10์ด ์ด์ (10000)์ผ๋ก ์ค์ ํด์ผ ํจ
โ 3-4. connection-timeout
- ์ปค๋ฅ์ ์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ (ms)
- ์: 3000 → 3์ด ๋์ ์ปค๋ฅ์ ์ด ์์ผ๋ฉด ์์ธ ๋ฐ์ (ex: SQLTransientConnectionException)
- ๋๋ฌด ์งง์ผ๋ฉด ์ค๋ฅ ๋น๋ฒ, ๋๋ฌด ๊ธธ๋ฉด ์ฌ์ฉ์ ์๋ต ์ง์ฐ
๐ ์์
DB๊ฐ ์๊ฐ์ ์ผ๋ก ๋ถํ ๊ฑธ๋ฆด ๋, ์ปค๋ฅ์ ์ด ์์ผ๋ฉด 3์ด ๊ธฐ๋ค๋ฆฌ๋ค ํฌ๊ธฐํ๊ฒ ํจ
๐ 3-5. ํต์ฌ ์ ๋ฆฌ
| ํญ๋ชฉ๋ช | ์๋ฏธ | ์ถ์ฒ๊ฐ ์์ |
| maximum-pool-size | ๋์์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ์ต๋ ์ปค๋ฅ์ ์ | 20~50 |
| minimum-idle | ํญ์ ์ ์งํ ์ ํด ์ปค๋ฅ์ ์ | maximum๊ณผ ๊ฐ๊ฒ ์ค์ ์ ์ฑ๋ฅ↑ |
| idle-timeout | ์ ํด ์ปค๋ฅ์ ์ ํ์ํ๋ ์๊ฐ | 60000~300000 |
| connection-timeout | ์ปค๋ฅ์ ๋ชป ์ป์์ ๋ ์ต๋ ๋๊ธฐ ์๊ฐ | 2000~5000 |
โ ๏ธ ์ฃผ์ํ ์
- maximum-pool-size๋ DB ์๋ฒ์ ์ต๋ ์ปค๋ฅ์
์๋ฅผ ์ด๊ณผํ๋ฉด ์ ๋จ.
- ์ ํด ์ปค๋ฅ์
์ด ๋ง์์ง๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ DB ์ปค๋ฅ์
๊ณ ๊ฐ ์ฐ๋ ค ์์.
- ์ค์ ์๋น์ค ํ๊ฒฝ์ ๋ฐ๋ผ ์กฐ์ ํ์ (ํธ๋ํฝ ๋ถ์, DB ์ค์ ์ฐธ๊ณ )
๐ 4. ์ค์ ์์ minimum-idle ์ค์
๐ค 4-1. minimum-idle์ ์ค์ ํ๋ฉด ์๊ธธ ์ ์๋ ์ํฉ
- minimum-idle: 5 ์ค์
- ์ฌ์ฉ์๊ฐ ์์ฒญํด์ ์ปค๋ฅ์
5๊ฐ๋ฅผ ๋ค ์ฌ์ฉ ์ค
- ์ถ๊ฐ ์์ฒญ์ด ์์ ์ปค๋ฅ์
1๊ฐ๋ฅผ ์ถ๊ฐ ์์ฑํจ → ์ด 6๊ฐ
- ์์ฒญ ๋๋๋ฉด ๊ทธ ์ถ๊ฐ ์์ฑ๋ ์ปค๋ฅ์
์ "idle์ด 5๋ณด๋ค ๋ง์ผ๋๊น" ๋ฐ๋ก ์ ๊ฑฐ๋จ
- ๊ทธ๋ฐ๋ฐ ์ ์ ๋ค์ ์์ฒญ ํญ์ฃผ! ์ปค๋ฅ์
4๊ฐ ๋ ํ์!
→ ๋ค์ 4๊ฐ ์์ฑ → ๊ทธ๋์ ์์ฒญ์ ๋๊ธฐ!
→ โ ์ปค๋ฅ์ ๋ง๋ค ์๊ฐ = ์๋ต ์ง์ฐ ๋ฐ์
๐จ ํต์ฌ ๋ฌธ์ ์์ฝ
- minimum-idle๋ก ์ ๊ฒ ์ ์งํ๋ฉด
→ ํธ๋ํฝ ๊ธ์ฆ ์ ์ปค๋ฅ์ ์์ฑ ์ง์ฐ
→ ์๋ต ๋๋ฆผ / ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ - ๋ฐ๋ฉด, ํ์ ํญ์ ์ผ์ ํ๊ฒ ์ ์งํ๋ฉด
→ ๋ฐ๋ก ์ฌ์ฉํ ์ปค๋ฅ์ ์ด ์์ด์ ๋น ๋ฆ
→ ์ฑ๋ฅ ์์ ์ฑ ๋์
๐ 4-2. ๊ทธ๋์ ๊ฒฐ๋ก ์?
๐ฏ "์ฑ๋ฅ ์ฐ์ "์ด๋ฉด ์๋์ฒ๋ผ ํ์!
minimum-idle: ์๋ตํ๊ฑฐ๋ maximum-pool-size์ ๋์ผํ๊ฒ ์ค์
maximum-pool-size: ์์ ๋์ ์ ์ ์ + ์ฌ์ ๋ถ์ผ๋ก ์ค์
โญ ์ฆ, "ํ ์ฌ์ด์ฆ๋ ๊ณ ์ ํด๋ผ! ์ ๋์ ์ธ ๊ฑด ์ฑ๋ฅ ์ ํ์ ์์ธ์ด๋ค!"
์๋ก์ด ์ฐ๊ฒฐ์ ๋งบ์๋๊น์ง ์๊ฐ์ด ์์๋๊ธฐ ๋๋ฌธ์ ๊ณ ์ ์ ์ธ ์ฑ๋ฅ์ ๋ผ ์ ์์ผ๋ ๋ญ๋น๋๋ ์ปค๋ฅ์ ์์์ด ์๋๋ผ๋ minimum๊ณผ maximum์ ์ฌ์ด์ฆ๋ฅผ ๊ณ ์ ์ํค๋๊ฒ ๋ ์ข๋ค๊ณ ํ๋ค!
๐ 4-3. ๊ทธ๋ผ minimum-idle ์ ๋ง๋ค์์๊น?
- ๋ฆฌ์์ค ์๋ผ๋ ๊ฒ ๋ ์ค์ํ ๊ฒฝ์ฐ
- AWS Lambda์ฒ๋ผ ๋ถํ ์ ์ ์๋ฒ์์ ํ์ ์ด์์ผ๋ก ์ฐ๊ฒฐ ์ ์งํ๋ฉด ๋ญ๋น
โก๏ธ ๊ทธ๋์ "์ฑ๋ฅ vs ๋ฆฌ์์ค ์ ์ฝ"์ ๊ฐ๋ฐ์๊ฐ ์ ํํ ์ ์๊ฒ ํ ๊ฒ!
๐4-4. ์์ฝ
| ํญ๋ชฉ | ์ค์ ํ๋ฉด ์ข์ ๊ฒฝ์ฐ | ์ฃผ์์ |
| minimum-idle ์๊ฒ ์ค์ | ๋ฆฌ์์ค ์ ์ฝ ์ค์ํ ๋ | ํธ๋ํฝ ๊ธ์ฆ ์ ์ปค๋ฅ์ ์์ฑ ์ง์ฐ |
| minimum-idle = maximum-pool-size ๋๋ ์๋ต | ์ฑ๋ฅ ์ฐ์ , ์๋ต์๋ ์ค์ | ๋ฉ๋ชจ๋ฆฌ/DB ์ปค๋ฅ์ ์์ ๋ง์ด ์ |
๐ 5. ์ปค๋ฅ์ ํ ์ฐ์ ์์ (์ชฝ์ง ์์คํ )
์๋ฅผ ๋ค์ด "์ด์ฉ์ 1000๋ช
์ธ ์ชฝ์ง ์์คํ
"์ด๋ผ๋ฉด?
๐ ํต์ฌ์ "ํ๊ท ๋์ ์์ฒญ ์”๋ฅผ ์ ์ถ์ ํ๋ ๊ฒ!!
โ 5-1. ์ชฝ์ง ์์คํ ํน์ง ๋ถ์
- ์ฝ๊ธฐ: ์ชฝ์ง ๋ชฉ๋ก ๋ณด๊ธฐ, ์ฝ๊ธฐ (DB read)
- ์ฐ๊ธฐ: ์ชฝ์ง ๋ณด๋ด๊ธฐ (DB write)
- ์ฃผ๊ธฐ์ ํด๋ง or ์๋ฆผ ํ์ธ: ์ชฝ์ง ๋์ฐฉ ์ฌ๋ถ ํ์ธ (read or API polling)
โก๏ธ ๋๋ถ๋ถ ์งง์ ์์ฒญ, ์งง์ ํธ๋์ญ์ ์ด ๋ง๊ณ ,์ง์์ ์ธ ์ปค๋ฅ์ ์ ์ ๋ ๋๋ฌผ๋ค.
โ 5-2. ๋์ ์ ์ ์ฌ์ฉ์ ์ ์ถ์
- ์ด์ฉ์ ์: 1000๋ช
- ์ผ๋ฐ์ ์ผ๋ก 10~20% ์ ๋๊ฐ ๋์ ์ ์ ์ค์ด๋ผ๊ณ ๋ด
๐ ์ถ์ ๋์ ์ ์์ ์: 100~200๋ช . ๊ทธ๋ฌ๋, ๋ชจ๋ ์์ฒญ์ด ๋์์ DB๋ฅผ ๋๋ฆฌ๋ ๊ฑด ์๋!
- ๋คํธ์ํฌ/ํ๋ก ํธ ์ฒ๋ฆฌ + ์บ์ฑ ๋ฑ์ผ๋ก ๋ถ์ฐ๋จ
- ๋์ DB ์ปค๋ฅ์
์ ๊ทธ๋ณด๋ค ํจ์ฌ ์ ์ -> ์ค์ DB ์ปค๋ฅ์
์์: 10~50๊ฐ
โ 5-3. ์ปค๋ฅ์ ํ ์ถ์ฒ๊ฐ (HikariCP ๊ธฐ์ค)
# application.yml ์์
spring:
datasource:
hikari:
maximum-pool-size: 30 # ์์ ๋์ ์ปค๋ฅ์
์ + ์ฌ์
minimum-idle: 30 # ํ ๊ณ ์ ์ผ๋ก ๋น ๋ฅธ ์๋ต
idle-timeout: 60000 # 1๋ถ ์ด์ ์ ํด๋ฉด ์ ๊ฑฐ
connection-timeout: 3000 # ์ปค๋ฅ์
๋ชป ์ป์ผ๋ฉด 3์ด๋ง ๋๊ธฐ
๐ 5-4. ์ถ๊ฐ ํ
- ํผํฌ ํ์์ ๋ชจ๋ํฐ๋งํด์ ํ๋ ํ์
- DB๊ฐ ๊ฐ๋นํ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ์๋ ํ์ธํด์ผ ํจ!
- ์บ์ฑ(Memcached, Redis ๋ฑ) ๊ณ ๋ คํ๋ฉด ํ ๋ ์๊ฒ ํด๋ ๋จ.
'Backend > spring (Boot)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Redis๋? (Spring ์ฐ๋) (0) | 2026.01.07 |
|---|---|
| [Spring, JSP] session ์์ฑ ์ฐจ๋จ (0) | 2025.07.26 |
| [Spring] (ํ๋ก์ ํธ ์ธ๋ถ) ์ ์ ๋ฆฌ์์ค ์ฒ๋ฆฌ (0) | 2025.07.26 |
| Spring boot ์์ธ ์ฒ๋ฆฌ: @ControllerAdvice, @ExceptionHandler, ResponseStatusException (0) | 2025.07.26 |
| [error] java.lang.IllegalArgumentException: Name for argument of type [int] not specified (0) | 2025.02.23 |