 # ๊ฐ์ ๋ ๊ธฐ์ ๊ณผ ๊ด๋ จ๋ ๊ธ์ ์จ์ ์ด ๋ธ๋ก๊ทธ์ ๊ฒ์ฌํ๊ณ ์๋ค. ์ต๊ทผ์๋ ๋ธ๋ก๊ทธ ๊ธ์ [GeekNews์ ๋งํฌ๋ก ๊ณต์ ํ ์ ](https://news.hada.io/topic?id=20309)์ด ์์๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ์๊ธฐ ๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ๊ฐ ์๋ ๋ถ๋ฅ์ ๋น ์ง๋ฉด์ **๋ธ๋ก๊ทธ ์ ์ ์ฅ์ **๋ฅผ ๊ฒช์๋ค. [^slashdot]: ์ด์ฒ๋ผ '๋ ํฐ ๊ท๋ชจ์ ์น์ฌ์ดํธ๋ก๋ถํฐ์ ํธ๋ํฝ ์ ์ ์ผ๋ก ์ธํ ์๋น์ค ์ฅ์ '์ "์ฌ๋์๋ท ํจ๊ณผ"๋ผ ํ๋ค. [์ํค๋ฐฑ๊ณผ - ์ฌ๋์๋ท ํจ๊ณผ](https://ko.wikipedia.org/wiki/%EC%8A%AC%EB%9E%98%EC%8B%9C%EB%8B%B7_%ED%9A%A8%EA%B3%BC) ๋ก๊ทธ ๋ฐ ๋งคํธ๋ฆญ์ ๋ถ์ํ ๊ฒฐ๊ณผ, **๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ๋ถ๊ฐ๋ก ์ธํ ์๋น์ค ๊ฑฐ๋ถ** ์งํ๊ฐ ํ์ธ๋์๋ค. ์ด ๊ธ์์๋ ์ฅ์ ์ฌ๋ฐ ๋ฐฉ์ง๋ฅผ ์ํด ํํ ๊ฐ์ ๋ฐฉ์๊ณผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋ค. ๊ธ์ ๊ธ์ด๊ฐ๊ธฐ ์์, ์ด ๋ธ๋ก๊ทธ์ SLA[^sla]๋ฅผ ์์นํํ ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ๊ณต์ ํ๊ฒ ๋ค. ๊ฐ์ ์ /ํ๋ฅผ ๋น๊ตํ๋ฉด ์๋์ ๊ฐ๋ค. - ๊ฐ์ ์ : 51% (1๋ถ๋น ์ฝ 400ํ ์์ฒญ์) - ๊ฐ์ ํ: **99.9996286%** (๋ถ๋น ์ฝ 40,500ํ ์์ฒญ์) [^sla]: [Wikipedia - Service-level Agreement - Cloud Computing](https://en.wikipedia.org/wiki/Service-level_agreement#Cloud_computing) - "SLAs span across the cloud and are offered by service providers as a service-based agreements rather than a customer-based agreements. Measuring, monitoring and reporting on cloud performance is based on the end UX or their ability to consume resources." # ์ ์ ์ฅ์ ๋น์ ์ํฉ  *์ฌ์ง: [์ถ์ฒ](https://news.hada.io/comment?id=37108)* 2025๋ 4์ 13์ผ ์ค์ , ๋๋ ๋ด ๋ธ๋ก๊ทธ ๊ธ์ ํ๊ตญ์ด ๊ฐ๋ฐ ๋ด์ค ์ฌ์ดํธ GeekNews์ ๋ฑ๋กํ์๋ค[^blog-article] [^gn-article]. ์ดํ GeekNews ๋ฐฉ๋ฌธ์๋ค์ด ๋ด ๋ธ๋ก๊ทธ์ ์ ์ ๋์๋ค [^slashdot]. ๊ทธ๋ฐ๋ฐ, ์ผ๋ถ ๋ฐฉ๋ฌธ์๋ ์ ์ ์ฅ์ ๋ฅผ ๊ฒช์๋ค. [^blog-article]: [https://blog.atj.sh/post/45](https://blog.atj.sh/post/45) [^gn-article]: [GeekNews - ๊ทธ๋ฅ LLM์ด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด๋ฅผ ์ดํดํด์ฃผ๋ฉด ์ ๋ ๊น: ๋ฒ๋ค๋ง์ ํตํ RAG ์๋ ](https://news.hada.io/topic?id=20309) ## ํ ํฌ ์คํ ์ด ๋ธ๋ก๊ทธ์ ๊ฒ์๋๋ ๋ชจ๋ ๊ธ๊ณผ ์ฌ์ง์ ๋ํ CRUD๋ฅผ ๋ด๋นํ๋, **๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ**์ ํ ํฌ ์คํ์ ์๋์ ๊ฐ์ด ์์ฝ๋๋ค. - DB ํ์ : PostgreSQL - PostgreSQL ๋ฐฐํฌ์ฒ: [Supabase](https://supabase.com) - SQL ํด๋ผ์ด์ธํธ: [launchbadge/sqlx::postgresql](https://github.com/launchbadge/sqlx) (์ดํ "sqlx") - ๋ฐฑ์๋ ์๋ฒ๋ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ(AWS Lambda)์ ๋ฐฐํฌ๋จ [^blog-tech-stack] [^blog-image] [^blog-tech-stack]: ๋ธ๋ก๊ทธ ์ ์ฒด์ ๋ํ ํ ํฌ ์คํ์ ๋ค๋ฅธ ๊ธ์ ์ ๋ฆฌํด ๋์๋ค. [์ ์ฑํ์ ๋ธ๋ก๊ทธ - blog.atj.sh](https://blog.atj.sh/post/4) [^blog-image]: [์ ์ฑํ์ ๋ธ๋ก๊ทธ - PostgreSQL๋ฅผ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ํ์ฉํ๊ธฐ](https://blog.atj.sh/post/33) ## ๋น์ ํธ๋ํฝ  ๋ธ๋ก๊ทธ ์ ์ ์ฅ์ ๋ฐ์ ์์ ์ ํธ๋ํฝ ์์น๋ ๋ค์๊ณผ ๊ฐ๋ค. - ๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ์ ํธ์ถ ๋น๋๋ ๋ถ๋น ํ๊ท 96ํ, ๋ถ๋น ์ต๋ 400ํ. - AWS Lambda concurrent execution ์์น๋ ๋ถ๋น ์ฝ 27๋จ์[^aws-ce]. [^aws-ce]: ๋์์ ์คํ๋ AWS Lambda ํจ์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. [Amazon AWS Documentation - Understanding Lambda function scaling ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html) ## ๋น์ ์๋ฌ ๋ก๊ทธ ์ ์ ๋ถ๊ฐ ํ์์ด ๋ฐ์ํ ๋ ๊ธฐ๋ก๋[^cloudwatch] ์๋ฌ ๋ก๊ทธ๋ ์๋์ ๊ฐ๋ค. [^cloudwatch]: ์๋น์ค ๋ชจ๋ํฐ๋ง์ ์ํด [Amazon Cloudwatch๋ก ๋ก๊ทธ๋ฅผ ์์ง](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html)ํ๊ณ ์์๋ค. `thread 'main' panicked at src/main.rs:52:10: can't connect to database: PoolTimedOut` sqlx์์ [PoolTimedOut](https://docs.rs/sqlx/latest/sqlx/enum.Error.html#variant.PoolTimedOut) ์๋ฌ๋ฅผ ์ผ์ผํจ ๊ฒ์ผ๋ก ํ์ธ๋๋ค. ## ์ค๊ฐ ์ ๋ฆฌ 1. ์์คํ ์ด ๊ฐ๋นํ์ง ๋ชปํ๋ ํธ๋ํฝ ์ ์ ์ด ๋ฐ์ํ์๋ค. 2. ํธ๋ํฝ์ ๋์ํ๊ธฐ ์ํด ๋ง์ ์๋ฒ๊ฐ ๋์์ ์์ฑ๋์๋ค. 3. ๊ฐ ์๋ฒ๊ฐ 1๊ฐ์ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ์ ์๋ํ์๋ค. 4. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์์ด ๋น ๋ฅด๊ฒ ์์ง๋์๊ณ ๊ฒฐ๊ตญ ๊ณ ๊ฐ๋์, ์ผ๋ถ ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ์คํจํ๋ ์ํฉ์ด ๋ฒ์ด์ก๋ค. 5. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ์ ๊ทผ์ ์คํจํ ์๋ฒ๋ค์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃํ์๊ณ , **๋คํธ์ํฌ ์๋ต์ ๊ฑฐ๋ถ**ํ์๋ค. ์ฆ, **๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ**์ **๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์คํจ**๊ฐ ์ด์ ๋ฐ์ ์ง์ ์ด๋ค. # ์ด์ ์์ธ ๋ถ์ ์ด์ ์์ธ ๋ถ์์ ์์, ์ด ๋ธ๋ก๊ทธ๋ ์ด 2๋จ๊ณ์ ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ๊ณ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก๋ ์ด ์ปค๋ฅ์ ํ ๊ด๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ด ๋ฐ์ํ ์ฅ์ ์ธ๋ฐ, ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. ## 1์ฐจ ์ปค๋ฅ์ ํ: Supabase์ PostgreSQL Connection Pooler  *[์ฌ์ง ์ถ์ฒ: Supabase Documentation - Connecting to your database](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pooler)* Supabase๋ PostgreSQL SaaS๋ก์จ, **๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์์ฒด์ ์ธ ์ปค๋ฅ์ ํ์ ์ ๊ณต**ํ๋ค. Supabase์ 'Connection Pooler'๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค๋ฅ์ ํ์ ํตํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ด ๋ณด์ฅ๋๋ค. ์ง์ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ์ข ๋ ๋น ๋ฅธ ์ปค๋ฅ์ ํ๋์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค. [^supabase]: ๊ณต์ ๋ฌธ์: [Supabase Database Documentation - Connect to your database](https://supabase.com/docs/guides/database/connecting-to-postgres) ํํธ, ๋ธ๋ก๊ทธ ์๋ฒ๋ prepared statements๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๋ด ํ๋ผ๋ฏธํฐ๋ฅผ ์นํํ๋ค. sqlx๋ ์ด๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ง์ํ๊ณ ์์ผ๋[^sqlx-prep], Supabase์ "transaction mode connection pooler"๋ ํ์ฌ prepared statements๋ฅผ ์ง์ํ์ง ์๊ณ ์๋ค[^supabase-tp]. [^sqlx-prep]: [launchbadge/sqlx/README.md](https://github.com/launchbadge/sqlx?tab=readme-ov-file#querying) - "When using the high-level query API (sqlx::query), statements are prepared and cached per connection." [^supabase-tp]: [Supabase Database Documentation - Connect to your database - Supavisor transaction mode](https://supabase.com/docs/guides/database/connecting-to-postgres#supavisor-transaction-mode) - "Transaction mode does not support prepared statements. To avoid errors, turn off prepared statements for your connection library." ๋ฐ๋ผ์ ๋๋ prepared statements๊ฐ ์ง์๋๋ Connection Pooler๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด, Supabase์ "session mode connection pooler"๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๋๋ก ํ๋ค. ์ด๋ ์ปค๋ฅ์ ํ ์ค์ ์ Supabase ๋์๋ณด๋์์ ์ง์ ์ง์ ํ ์ ์๋ค[^poolsize]. Supabase์ pool size ๊ธฐ๋ณธ๊ฐ์ 15์ด๋ค. ๋๋ ๊ธฐ๋ณธ๊ฐ ๊ทธ๋๋ก ๋ฐฐํฌํ์๋ค. [^poolsize]: [Supabase Database Documentation - Connection management](https://supabase.com/docs/guides/database/connection-management) ## 2์ฐจ ์ปค๋ฅ์ ํ: ๋ฐฑ์๋ ๋ด๋ถ Supabase์ 1์ฐจ์ ์ธ ์ปค๋ฅ์ ํ๊ณผ ๋ณ๊ฐ๋ก 2์ฐจ์ ์ธ ์ปค๋ฅ์ ํ์ ๋ฐฑ์๋ ์๋ฒ ์์ ๋๊ณ ์ถ์๊ธฐ์, ๋๋ sqlx ๋ฌธ์์ ์๊ฐ๋ ์ปค๋ฅ์ ํ ์์ ์ฝ๋๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ๋ด ์ฝ๋์ ๋ถํ๋ฃ์๋ค. ```rust use sqlx::postgres::PgPoolOptions; let pg_pool = PgPoolOptions::new() .max_connections(5) .acquire_timeout(Duration::from_secs(3)) .connect(&db_connection_str) .await .expect("can't connect to database"); let conn = pg_pool.acquire().await.map_err(|_| internal_error())?; ``` ## 2์ฐจ ์ปค๋ฅ์ ํ์ ์ด์ ์ด๋ฒ ์ด์๋ฅผ ํ์ธํ๋ฉด์ ๋ฐฑ์๋ ์์ค์ฝ๋๋ฅผ ๋ค์ ํ์ธํ์๋ค. ์ ์ฝ๋์ ์ง์ง ์๋ฏธ๋ ์๋์ ๊ฐ์๋ค. - ์ต์ด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ 0๊ฐ๋ง ์ ์ ํจ. - ํ์ํ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ปค๋ฅ์ ์ ์๋กญ๊ฒ 1๊ฐ ์ ์ ํด์ค๊ณ , ์๋ฒ ๋ด ์ปค๋ฅ์ ํ์ ๋ฑ๋ก. - ์ปค๋ฅ์ ํ์ ๋ฑ๋ก๋ ์ปค๋ฅ์ ์ ์๋ฒ ์์์๋ง ์ฌ์ฌ์ฉํจ. - ์๋ฒ ๋ด ์ปค๋ฅ์ ํ์ ์ต๋ 5๊ฐ ์ปค๋ฅ์ ์ ์ ์ ๊ฐ๋ฅ. - ํ ๋ฒ ์ ์ ํด์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ 10๋ถ ๋ค์ ์๋์ผ๋ก ๋ฐํ. - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์๋กญ๊ฒ ์ ์ ํด์ฌ ๋ ๋ง์ฝ 3์ด ์์ ํ๋ํด์ค์ง ๋ชปํ๋ฉด ์๋ฒ ๊ฐ์ ์ข ๋ฃ ์ฒ๋ฆฌ. ํนํ, "์ปค๋ฅ์ ์ 10๋ถ ๋ค ๋ฐํ"ํ๋ ๊ฒ์ **sqlx ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๊ธฐ๋ณธ๊ฐ**์ด๊ธฐ์[^sqlx-default], ๋ณ๋๋ก ์ง์ ํ์ง ์์ ๋ด ์๋์๋ ๋ค๋ฅด๊ฒ ์ ์ฉ๋ ์ ์ฑ ์ธ ์ ์ด๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค. ๋จผ์ , '๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์กฐํ'๊ฐ ๋์์ 15ํ ๋ฐ์ํ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฆ์ 15๊ฐ์ AWS Lambda ์๋ฒ๊ฐ ์์ฑ๋ ๊ฒ์ด๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๊ฐ์ 1๊ฐ์ฉ ์ ์ ํ๊ฒ ๋๋ค. ์ด๋ Supabase์ pool size ๊ธฐ๋ณธ๊ฐ์ธ 15๊ฐ ์ ๋ถ๋ฅผ ๋ฒ์จ ์ ์ ํด๋ฒ๋ฆฌ๊ฒ ๋๋ ์ ์ด๋ค. ์์ ์ฒ๋ฆฌ๋๋ ์์ค, '๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์กฐํ'๊ฐ ๋ฑ 1๊ฑด ๋ ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์์ ์์ฑ๋ 15๊ฐ์ AWS Lambda ์๋ฒ๋ค์ ์์ง ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ผ ๋ฐ์๊ธฐ์, ์๋ก์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ก์ด 16๋ฒ์งธ AWS Lambda ์๋ฒ๊ฐ ์์ฑ๋ ๊ฒ์ด๋ค. ์ด ์๋ฒ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ ๋ฅผ ์๋ํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ Supabase๋ ๋ ์ด์ ํ ๋น์ํฌ ์ปค๋ฅ์ ์์์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋๊ธฐ๋ฅผ ๋ฐ์์ํจ๋ค. ์์ ์์ฑ๋ 15๊ฐ์ ์๋ฒ๋ค์ ์ต์ฅ 10๋ถ๊ฐ ์ปค๋ฅ์ ์์์ ๋ด๋์ง ์์ ๊ฒ์ด๋ค. ์ด์ 16๋ฒ์งธ ์๋ฒ๋ ์ปค๋ฅ์ ์ง์ฐ์ ๊ธฐ๋ค๋ฆฌ๋ค 3์ด๊ฐ ์ง๋๋ฒ๋ฆฌ๋ ์๊ฐ, ํด๋น ์๋ฒ๋ ๊ฐ์ ์ข ๋ฃ๋๊ณ ์๋ต์ ์คํจํ๊ฒ ๋๋ค. 17๋ฒ์งธ, 18๋ฒ์งธ ์์ฒญ์ด ๋ค์ด์ค๋๋ผ๋, ์ปค๋ฅ์ ์์์ด ๊ณ ๊ฐ๋ ์ด์ ์๋ต์ ์คํจํ ์ ๋ฐ์ ์๋ค. ์ฆ, 2์ฐจ ์ปค๋ฅ์ ํ์ ์๋ชป๋ ์ค์ ์ผ๋ก ์ธํด, 1์ฐจ ์ปค๋ฅ์ ํ์ ๋ชจ๋ ์์งํ๊ณ ์์ ๊ณ ๊ฐ์ ๋ฐ์์ํจ ์ ์ด๋ค. ## ์ต์ข ์ ๋ฆฌ  ๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ๋ Supabase์ 1์ฐจ์ ์ธ ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ํ๋ํด์ค๊ณ ์์๋ค. 1์ฐจ ์ปค๋ฅ์ ํ์ ์ฌ์ด์ฆ๋ 15๊ฐ๋ก ๋ค์ ํ์ ์ ์ธ ์ํฉ์ด์๋ค. ๋ธ๋ก๊ทธ ๋ฐฑ์๋ ์๋ฒ๊ฐ ์์ ๊ฐ์ ธ์จ ์ปค๋ฅ์ ์ ์๋ฒ ๋ด๋ถ์ ๋ณด๊ดํ๋ 2์ฐจ์ ์ธ ์ปค๋ฅ์ ํ์ ์์ฑํ๋๋ก ๊ตฌํ๋์๋๋ฐ, pool size๋ 5๊ฐ๋ก ์ ์์ง๋ง ์ปค๋ฅ์ ์ ์ ํ ๋ฐํ ์ ๋๊ธฐ ์๊ฐ์ด 10๋ถ์ผ๋ก ๊ณผ๋ํ๊ฒ ๊ธธ์๋ค. ํํธ, 2์ฐจ ์ปค๋ฅ์ ํ์ ๊ฐ ์๋ฒ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ฉฐ, ๋ค๋ฅธ ์๋ฒ์ ๊ณต์ ๋์ง ์๊ณ ์๋ค.  ์ด๋ฌํ 2์ฐจ ์ปค๋ฅ์ ํ ์์ฑ์ผ๋ก ์ธํด Supabase ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์์์ด ์์ ํ ์๋ชจ๋์๋ค. ๊ทธ๋ฐ๋ฐ 2์ฐจ ์ปค๋ฅ์ ํ์์๋ ํ ๋ฒ ์ ์ ํด์จ ์ปค๋ฅ์ ์ ์ฆ์ ๋ฐํํ์ง ์์๊ธฐ์, 1์ฐจ ์ปค๋ฅ์ ํ์ ์์ ๊ณ ๊ฐ ์ํ๊ฐ ์ผ์ ์๊ฐ ์ ์ง๋์๋ค. ์์ ๊ณ ๊ฐ ์ํ์์ ์ปค๋ฅ์ ์ ์๋ํ ์๋ฒ ํ๋ก์ธ์ค๋ ์ ๋ถ ๊ฐ์ ์ข ๋ฃ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์๊ณ , ์ด๋ ์๋ฒ ์์คํ ์ ์ ์ฒด์ ์ธ ์๋ต ๊ฑฐ๋ถ๋ก ์ด์ด์ก๋ค. # ๊ฐ์ ๋ฐฉ์ ์ผ๋จ 1์ฐจ ์ปค๋ฅ์ ํ ์ ์ฑ ์ ์ต๋ ์์ค์ผ๋ก ๋๋ ธ๋ค. Supabase ๋ฌด๋ฃ ํ๋์์๋ pool size๋ฅผ 48๊ฐ๊น์ง ๋๋ฆด ์ ์๊ธฐ์ ๋ฐ๋ก ์ ์ฉํ์๋ค. ๊ทธ๋ฆฌ๊ณ 2์ฐจ ์ปค๋ฅ์ ํ ์ ์ฑ ์ ์ต์ ์์ค์ผ๋ก ์ค์๋ค. ์๋ฒ ๋ด ์ปค๋ฅ์ ํ ๊ด๋ฆฌ ์ ์ฑ ์ ์๋ณด์๋ค[^commit]. [^commit]: [https://github.com/atjsh/rust-blog/commit/a757834af7d9204684ae5a865922e9eb5d3659c5](https://github.com/atjsh/rust-blog/commit/a757834af7d9204684ae5a865922e9eb5d3659c5) ``` let pg_pool = PgPoolOptions::new() .max_connections(1) .acquire_timeout(Duration::from_secs(3)) .idle_timeout(Duration::from_secs(3)) .connect(&db_connection_str) .await .expect("can't connect to database"); ``` ์๋ฏธ๋ ์๋์ ๊ฐ๋ค. - ํ ์๋ฒ์์ ๋์์ ์ ์ ๊ฐ๋ฅํ ์ต๋ ์ปค๋ฅ์ ๊ฐ์๋ 1๊ฐ. - ํ ๋ฒ ์ ์ ํด์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ์ฒดํฌํ์ฌ 3์ด ๋ค์ ์๋์ผ๋ก ๋ฐํ. 2์ฐจ ์ปค๋ฅ์ ํ์ ์ต์ํ์ผ๋ก ์ ์งํ์ฌ ์๋ฒ ๋ด ์ปค๋ฅ์ ์ฌํ์ฉ์ ๊ฐ๋ฅ์ผ ํ๋ ๋์์, ๋๋ฌด ์ค๋ ์ปค๋ฅ์ ์ ์ ์ ํ์ง ์๊ฒ ์์ ํ์ฌ 1์ฐจ ์ปค๋ฅ์ ํ์ด ํญ์ ์ฌ์ ๋กญ๋๋ก ๊ฐ์ ํ์๋ค. ๋์์ 1์ฐจ ์ปค๋ฅ์ ํ์ ํฌ๊ธฐ๋ฅผ ํค์ ๋ง์ ์์ ์ปค๋ฅ์ ์ ํ์ฉํ ์ ์๋๋ก ํ์๋ค. # ๊ฐ์ ์ ๊ฒ์ฆ  *์ฌ์ง: [๋ถํ ํ ์คํ ์๋น์ค 'loadster'](https://loadster.app/)๋ก ์ด ๋ธ๋ก๊ทธ์ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ์๋ค.*  *์ฌ์ง: ๋ถํ ํ ์คํธ๊ฐ ์ด๋ฃจ์ด์ง ํ AWS Lambda ๋์๋ณด๋๋ฅผ ํตํด ํ์ธํ ๋งคํธ๋ฆญ.* ๊ฐ์ ์ ์ ์ ๋ถ ์ ์ฉํ ํ ์ผ๋ถ๋ฌ ๋ ๊ทน์ฌํ ํธ๋ํฝ์ ์ค์ ํ๊ณ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ์๋ค. ๋ถํ ํ ์คํธ๋ 3๋ถ ๋ด์ธ ์๊ฐ๋์ ์งํ๋์์ผ๋ฉฐ, ๋ถํ์ ์ ์ ์ ์ฐ์์ ๋์๋ 1๋ถ๊ฐ ์ฝ 40,500ํ ์ ๋์ ์์ฒญ์ด ์๋ฒ์ ์ ์ก๋์๋ค. ## ๊ฐ์ ์ ๊ฒ์ฆ ๊ฒฐ๊ณผ Amazon CloudWatch์ ๊ธฐ๋ก๋ ์๋ฒ ๋ก๊ทธ๋ฅผ ์ง๊ณํ ๊ฒฐ๊ณผ, 107,705ํ์ ์ ์ฒด ์์ฒญ ์ค ์๋ต ๊ฑฐ๋ถ ์ฌ๋ก๊ฐ ์ด 40ํ ๋ฐ๊ฒฌ๋์๋ค. ์ต์ ์๋น์ค ๊ฐ์ฉ์ฑ์ ์์นํํด๋ณธ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฏธ์๋ค. - ๊ธฐ์กด: 51% (1๋ถ๋น ์ฝ 400ํ ์์ฒญ์) - ํ์ฌ: 99.9996286% (1๋ถ๋น ์ฝ 40,500ํ ์์ฒญ์) # ๊ฒฐ๋ก ๋ธ๋ก๊ทธ์์ ๋ฐ์ํ๋ ์ ์ ๋ถ๋ฅ ์ฅ์ ์์ธ์ ์ฑ๊ณต์ ์ผ๋ก ํ์ ํ์๊ณ , ์ฅ์ ๋ฐ์๋ฅ ์ "์ฌ์ค์ ๊ทน๋ณตํ๋ค"๊ณ ๋ณผ ์ ์๋ ์์ค๊น์ง ๋ฎ์ถ ์ ์์๋ค. ๋คํํ๋ ๋น์ฉ ๋ถ๋ด์ด ๋ณ๋๋ก ๋ฐ์ํ๊ฑฐ๋ ์ถ๊ฐ๋์ง ์์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ํํ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒ ๋ฐ๊พธ์ง ์์ ์ ์์๋ค. # ์๊ฐ ๊ฒฐ๋ก ์ ์ผ๋ก๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ค ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง๊ณ ๊ตฌ์ฑ๋๋์ง[^sqlx-default] ํ์ธํ์๋ค๋ฉด ๋ง์ ์ ์์์ ๊ฒ ๊ฐ์์, ํ์ธ์ด ๋๋ฝ๋ ๋ถ๋ถ์ด ์์ฝ๊ฒ ๋๊ปด์ง๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฌ์ ๋ถํ ํ ์คํธ์ ์ค์์ฑ์ ๋ค์๋ ๋๊ฒผ๋ค. ์ด๋ฒ ์ฅ์ ๊ฐ ๋์๊ฒ ์์ด์๋, '์์ค ์ฝ๋ ์์์๋ ๋ณด์ด์ง ์๋ ๋ถ๋ถ๋ค์ ๊ฒ์ฆํ๋ ์์ '์ ์ค์์ฑ์ ๋ป์ ๋ฆฌ๊ฒ ๋๋ผ๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค. [^sqlx-default]: sqlx์ ์ปค๋ฅ์ ํ ์์ฑ ์ต์ ์ ๊ธฐ๋ณธ๊ฐ๋ค์ [launchbadge/sqlx - PoolOptions::new()](https://github.com/launchbadge/sqlx/blob/91d26bad4d5e2b05fab1c86d0fbe11586d30f29d/sqlx-core/src/pool/options.rs#L143-L166)์์ ํ์ธํด๋ณผ ์ ์๋ค.