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์ ์ฐ๊ฒฐ ๊ณต์ ๋ฐฉ์ ๊ฐ์ ์ถฉ๋์ ํด๊ฒฐํ๋ค.
์ฑ๋ฅ์ ์ฝ๊ฐ์ ์์ค์ด ์์ ์ ์์ง๋ง, ์์ ์ ์ธ ์ฐ๊ฒฐ์ ์ํด์๋ ํ์ํ ํธ๋ ์ด๋์คํ๋ก ์ ๊ณ ๋ คํด์ ์ฌ์ฉํ์โฆ