μ€ν μ΄&μΌν° λ°±μ€νΌμ€ λͺ¨λ Next.jsμ knexλ₯Ό μ¬μ©νκ³ μλλ°, κ°λ° κ³Όμ μμ 컀λ₯μ μκ° λμΉλ μν©μ΄ λ무λλ λ§μ΄ λ°μνλ€.
(νλ‘λμ νκ²½μμλ νμΈ ν΄λ³΄μ§ μμμΌλ) λ΄κ° νμΈν 컀λ₯μ μ΄ λ°μνλ μΌμ΄μ€λ
- νμ΄μ§ μ΄λ
- λ΄κ° λμ΄λ Ό νμ΄μ§ νλ©΄μμμ μ½λ μμ ν μ μ₯ μ 리λ‘λ©
λ κ°μ§ μΌμ΄μ€μμ λ°μ νλ κ²μ νμΈ ν μ μμλ€.
2λ² μΌμ΄μ€μ κ²½μ° npm run start:dev
λ‘ μ€νμμΌλκ³ κ³μν΄μ μμ
μ νλ λ¬Έμ κ° λμ§ μλ μκ°μ΄ λ€μλ€.
컀λ₯μ μ νμΈ λ°©λ²
SELECT
datname,
count(*) as connection_count
FROM
pg_stat_activity
GROUP BY
datname;
ν΄κ²° κ³Όμ
max_connections
μμ μ ν λμμ΄ λμ§ μμλ€.
κ·Έμ μ°κ²°λλ μλ§ λ§μμ§κ² ν λΏ.. κ·Όλ³Έμ μΈ ν΄κ²°μ± μ λμ§ μλλ€.
무νμΌλ‘ μ¦κ°νλ 컀λ₯μ μ λ§μ λ°©λ²μ΄ μλλ€.
connection pool μ€μ
knexConfig
μ 컀λ₯μ νμ μ€μ ν΄λμλ€.pool: { min: 2, max: 10 }
μ μ©ν μ¦μ μ μ μ©λλ νμΈμ ν μ μμμΌλ, μΆν λ‘κ·Έλ₯Ό νμΈ ν΄ λ΄€μ λ 컀λ₯μ μμλ λμμ΄ λμ§ μλ κ²μ νμΈ νλ€.
컀λ₯μ μκ° μ΄κ³Όνλ μμΈμ μλμ κ°μ μ μλ€κ³ νλ€.
1. 컀λ₯μ λμ(Connection Leak): β’ νΈλμμ μ΄λ 쿼리λ₯Ό μ€νν ν 컀λ₯μ μ μ λλ‘ λ°ννκ±°λ μ’ λ£νμ§ μλ κ²½μ°, 컀λ₯μ νμμ 컀λ₯μ μ΄ λμλμ΄ κ³μ μ¦κ°ν μ μμ΅λλ€. 2. 컀λ₯μ ν μ€μ μ΄ μ λλ‘ μ μ©λμ§ μμ: β’ μ€μ νμΌμ΄λ μ½λμμ 컀λ₯μ ν μ€μ μ΄ μ λλ‘ μ μ©λμ§ μκ±°λ, μλͺ»λ μ€μ μ΄ μμ μ μμ΅λλ€. 3. λ€μ€ μΈμ€ν΄μ€ λ¬Έμ : β’ μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ€ν΄μ€λ‘ μ€νλλ κ²½μ°, κ° μΈμ€ν΄μ€κ° μμ μ 컀λ₯μ νμ κ΄λ¦¬νκ² λμ΄ μ΄ μ»€λ₯μ μκ° μ¦κ°ν μ μμ΅λλ€. 4. 컀λ₯μ νμ μμ μ¦κ°: β’ νΉμ μν©μμ 컀λ₯μ νμ΄ μΌμμ μΌλ‘ μ΅λ κ°μ μ΄κ³Όν μ μλ λ²μ€νΈ(Burst) μν©μ΄ λ°μν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μκ°μ μΌλ‘ λ§μ μμ²μ΄ λͺ°λ¦΄ λ μΌμμ μΌλ‘ λ λ§μ 컀λ₯μ μ΄ νμν μ μμ΅λλ€.
μ ν리μΌμ΄μ μ’ λ£ ν λλ§μ΄λΌλ 컀λ₯μ μ λμ΄λ²λ¦¬μ
μμ£Ό μ’ λ£ν΄μ£Όλ©΄ 컀λ₯μ λ¬Έμ λ μμ κ² μ²λΌ 보μλ€.
컀λ₯μ μ΄ λκΈ°λ μμ²λ λ‘κ·Έλ€λ νμΈ ν μ μμλ€.
async function handleExit(signal: string) { logger.info(`Received ${signal}. Closing database connection pool...`); await connection.destroy(); process.exit(0); } process.on('SIGINT', () => handleExit('SIGINT')); process.on('SIGTERM', () => handleExit('SIGTERM'));
컀λ₯μ μ μ μμΌλ‘ μ°μ
knexInstance
κ° μμΌλ©΄ μλ κ±Έλ‘ μ΄λ€.μμΌλ©΄ μλ‘ λ§λ€μ΄μ μ¬μ©νλ€.
declare global { var knexInstance: Knex | undefined; } if (!global.knexInstance) { global.knexInstance = knex(knexConfig); } const connection = global.knexInstance;
ν μ€νΈ ν΄λ³΄λ 1,2λ² μΌμ΄μ€ λͺ¨λ 컀λ₯μ μκ° λμ΄λμ§ μλ κ±Έ νμΈ νλ€.
νμ§λ§ μλμ κ°μ λ¨μ μ΄ μλ€κ³ νλ€.
1. λͺ¨λ κ° κ²°ν©: μ μ λ³μλ₯Ό μ¬μ©νλ©΄ λͺ¨λ κ° κ²°ν©μ΄ κ°ν΄μ Έ μ½λμ μ μ°μ±κ³Ό λͺ¨λνκ° λ¨μ΄μ§ μ μμ΅λλ€. μ΄λ μ½λ μ μ§λ³΄μμ μ΄λ €μμ μ΄λν μ μμ΅λλ€. 2. ν μ€νΈ μ΄λ €μ: μ μ μνλ₯Ό μ¬μ©νλ μ½λλ λ¨μ ν μ€νΈλ ν΅ν© ν μ€νΈ μ λ 립μ μΌλ‘ ν μ€νΈνκΈ° μ΄λ €μΈ μ μμ΅λλ€. ν μ€νΈ νκ²½μμ μ μ μνλ₯Ό μ΄κΈ°ννκ±°λ λ³κ²½νλ λ° μΆκ° μμ μ΄ νμν©λλ€. 3. λ€μ€ μΈμ€ν΄μ€ νκ²½: ν΄λΌμ°λ νκ²½μ΄λ 컨ν μ΄λνλ μ ν리μΌμ΄μ μμλ μ¬λ¬ μΈμ€ν΄μ€κ° λμμ μ€νλ μ μμ΅λλ€. μ΄ κ²½μ°, κ° μΈμ€ν΄μ€κ° μ체 μ μ 컀λ₯μ νμ κ΄λ¦¬νκ² λμ΄ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ μκ° μμλ³΄λ€ λ§μμ§ μ μμ΅λλ€. 4. λ©λͺ¨λ¦¬ λμ κ°λ₯μ±: μ μ λ³μλ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ΄ μ’ λ£λ λκΉμ§ λ©λͺ¨λ¦¬μμ ν΄μ λμ§ μμ΅λλ€. μ¬λ°λ₯΄κ² κ΄λ¦¬λμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λμμ μμΈμ΄ λ μ μμ΅λλ€.
3λ²κ³Ό 4λ²μ λ¨μ μ΄ ν¬λ¦¬ν°μ»¬νλ€κ³ λκ»΄ μ‘°μΈμ ꡬν΄λ³΄λ Next.jsλ μ μ DB Instanceλ₯Ό μ¬μ©νλ κ²μ΄ λ§λ€κ³ ν΄μ μμ κ°μ΄ μμ νλ€.
'TIL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Next.js μ Dynamic server usage λΉλ μλ¬ (0) | 2024.08.19 |
---|---|
λ Έμ APIλ₯Ό 곡μ§μ¬νμ μ μ©ν΄λ³΄λ©΄ μ΄λ¨κΉ? (0) | 2024.08.19 |
tokenμ κ΄λ¦¬ν΄λ³΄μ! (0) | 2024.08.19 |
x-api-key authorization (0) | 2024.08.19 |
supertestμ :idκ° 500μΌλ‘ λ¨μ΄μ§λ€λ©΄? (0) | 2024.08.19 |