[Spring๐ฑ] Supabase PostgreSQL Transaction Pooler ์๋ฌ ํด๊ฒฐํ๊ธฐ
/ 4 min read
Table of Contents
Supabase PostgreSQL Transaction Pooler ์๋ฌ ํด๊ฒฐ
๋ฐฐ๊ฒฝ
Spring Boot ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ ์ผ์ด ์์ด์ DB ์๋ฒ๋ฅผ ์์๋ณด๋ค ์ต๊ทผ ๋ง์ด ์ฌ์ฉํ Supabase๋ฅผ ์ฐ๊ฒฐํ๋ คํ๋ค. PostgreSQL์ ์ง์ํ๊ธฐ์ ๋์ค์ migration์ ํ ๋์๋ ์์ํ ๊ฒ ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
์ฐ๋ ๋ฐฉ์์ ์๋ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ๊ณ ํ๊ณ Transaction Pooler
๋ชจ๋๋ก ์ฐ๊ฒฐ์ ์งํํ๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ
๋ฌธ์ ์ํฉ
Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์์ Supabase PostgreSQL์ Transaction Pooler
๋ชจ๋๋ก ์ฐ๊ฒฐํ๋ ์ค ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ค.
์ค์ ์๋ฌ ๋ก๊ทธ
๋ฐฐํฌ๋ AWS App Runner์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ
detail | error_severity | event_message | hint | id | identifier | timestamp |
---|---|---|---|---|---|---|
null | ERROR | prepared statement โS_3โ already exists | โฆ | โฆ | โฆ | โฆ |
๋น์ทํ๊ฒ "S_1" already exists
, "S_2" already exists
๋ฑ์ ์๋ฌ๋ ํจ๊ป ๋ฐ์ํ๋ค.
S_x already exists
๋ฅ์ ์๋ฌ ๋ฐ์!
์์ธ ๋ถ์
Transaction Pooler vs Session Mode
Supabase๋ ๋ ๊ฐ์ง ์ฐ๊ฒฐ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ค:
- Transaction Mode (ํฌํธ 6543): ์ฐ๊ฒฐ์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ ํ์ฌ ํจ์จ์ ์ธ ์์ ์ฌ์ฉ
- Session Mode (ํฌํธ 5432): ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ ์ ์ ์ธ ์ฐ๊ฒฐ์ ์ ์ง
PostgreSQL JDBC Driver์ Prepared Statement ์บ์ฑ
PostgreSQL JDBC Driver๋ ๊ธฐ๋ณธ์ ์ผ๋ก Server-side Prepared Statements๋ฅผ ์ฌ์ฉํ๋ค:
prepareThreshold
๊ธฐ๋ณธ๊ฐ์ 5- ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ 5๋ฒ ์คํ๋๋ฉด ์๋ฒ์์ prepared statement๋ฅผ ์์ฑ
- ์ด๋
S_1
,S_2
,S_3
๊ฐ์ ์ด๋ฆ์ผ๋ก statement๊ฐ ์ ์ฅ๋จ
๋ฌธ์ ์ ํต์ฌ
Transaction Pooler ๋ชจ๋์์๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ณต์ ํ๋๋ฐ, ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์ด๋ฆ์ prepared statement๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ๋ฉด์ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
Client A: CREATE PREPARED STATEMENT "S_1" ...Client B: CREATE PREPARED STATEMENT "S_1" ... # ์ถฉ๋!
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ง๋ฆฌ์ ๋ฌธ stackoverflow์ ๋ต์ด ์์๋คโฆ ๊ฐ๋จํ ์์ ์ผ๋ก ํด๊ฒฐํ์ผ๋ฉฐ ์๋์ ๊ธฐ์ ํ๊ฒ ๋ค!
1. prepareThreshold=0 ์ค์
๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ server-side prepared statements๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ด๋ค.
application.yml ์ค์
spring: datasource: url: jdbc:postgresql://aws-0-us-west-1.pooler.supabase.com:6543/postgres?prepareThreshold=0 username: postgres.your-project-ref password: your-password driver-class-name: org.postgresql.Driver
2. ํฌํธ ๋ณ๊ฒฝ ๊ณ ๋ ค
Transaction Pooler ๋ชจ๋(6543)์์ Session Mode(5432)๋ก ๋ณ๊ฒฝํ๋ ๊ฒ๋ ํด๊ฒฐ์ฑ ์ด ๋ ์ ์๋ค. supabase๊ณต์๋ฌธ์
spring: datasource: url: jdbc:postgresql://aws-0-us-west-1.pooler.supabase.com:5432/postgres username: postgres.your-project-ref password: your-password
ํ์ง๋ง ์ด ๊ฒฝ์ฐ Connection Pool์ ์ด์ ์ ์๊ฒ ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
prepareThreshold=0์ ์ํฅ
- ์ฅ์ : Transaction Pooler์์ ํธํ์ฑ ๋ณด์ฅ
- ๋จ์ : Prepared Statement ์บ์ฑ ๋นํ์ฑํ๋ก ์ธํ ์ฝ๊ฐ์ ์ฑ๋ฅ ์ ํ
๊ฒฐ๋ก
Supabase PostgreSQL Transaction Pooler์ Spring Boot๋ฅผ ์ฐ๊ฒฐํ ๋๋ prepareThreshold=0
์ค์ ์ด ํ์ํ๋ค. ์ด๋ PostgreSQL JDBC Driver์ server-side prepared statement ์บ์ฑ ๊ธฐ๋ฅ๊ณผ Transaction Pooler์ ์ฐ๊ฒฐ ๊ณต์ ๋ฐฉ์ ๊ฐ์ ์ถฉ๋์ ํด๊ฒฐํ๋ค.
์ฑ๋ฅ์ ์ฝ๊ฐ์ ์์ค์ด ์์ ์ ์์ง๋ง, ์์ ์ ์ธ ์ฐ๊ฒฐ์ ์ํด์๋ ํ์ํ ํธ๋ ์ด๋์คํ๋ก ์ ๊ณ ๋ คํด์ ์ฌ์ฉํ์โฆ