πŸš€ Growth/Troubleshooting

[νŠΈλŸ¬λΈ”μŠˆνŒ…] μ™ΈλΆ€ API 호좜과 DB 반영의 νŠΈλžœμž­μ…˜ 경계 뢄리

devCloud 2026. 8. 20. 16:43
728x90

μ™ΈλΆ€ API 호좜과 DB 반영의 νŠΈλžœμž­μ…˜ 경계 뢄리

μš”μ•½
λ§ˆμΌμŠ€ν†€ 기반 ν¬λΌμš°λ“œνŽ€λ”© μ„œλΉ„μŠ€μ—μ„œ OpenAIλ₯Ό μ΄μš©ν•œ AI 검증을 λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. 검증 μš”μ²­ μžμ²΄λŠ” μ‚¬μš©μž μš”μ²­κ³Ό λΆ„λ¦¬λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, 비동기 μž‘μ—… λ‚΄λΆ€μ—μ„œλŠ” OpenAI API 호좜과 κ²°κ³Ό μ €μž₯이 ν•˜λ‚˜μ˜ DB νŠΈλžœμž­μ…˜μ— ν¬ν•¨λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ™ΈλΆ€ API 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆμ—λ„ JDBC 컀λ„₯μ…˜μ΄ μ μœ λ˜λŠ” κ΅¬μ‘°μ˜€κ³ , 10초 μ§€μ—° ν™˜κ²½μ—μ„œ λ™μ‹œ DB μ‘°νšŒκ°€ 3,005ms ν›„ μ‹€νŒ¨ν•˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ API 호좜과 DB μž‘μ—…μ˜ νŠΈλžœμž­μ…˜ 경계λ₯Ό λΆ„λ¦¬ν•œ λ’€μ—λŠ” λ™μΌν•œ μ‘°κ±΄μ—μ„œ 컀λ„₯μ…˜μ΄ 풀에 λ°˜ν™˜λκ³  λ™μ‹œ DB μ‘°νšŒλ„ 8ms λ§Œμ— 정상 μ²˜λ¦¬λμŠ΅λ‹ˆλ‹€.

 

λͺ©μ°¨

  1. λ°°κ²½
  2. 문제
  3. ν•΄κ²°
  4. κ²°κ³Ό
  5. 남은 ν•œκ³„
  6. 정리

 

1. λ°°κ²½

아이디어 μ œμ•ˆμžμ™€ μ „λ¬Έκ°€, μŠ€ν°μ„œλ₯Ό μ—°κ²°ν•˜λŠ” λ§ˆμΌμŠ€ν†€ 기반 ν¬λΌμš°λ“œνŽ€λ”© μ„œλΉ„μŠ€λ₯Ό νŒ€ ν”„λ‘œμ νŠΈλ‘œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€. 아이디어가 곡개되기 전에 AIκ°€ κ³ΌλŒ€κ΄‘κ³  ν‘œν˜„, μœ μ‚¬ μ„œλΉ„μŠ€ 쑴재 μ—¬λΆ€, λ§ˆμΌμŠ€ν†€ ꡬ체성 등을 κ²€μ¦ν•˜κ³ , κ²°κ³Όλ₯Ό 신뒰도 μ μˆ˜μ™€ 후속 μ „λ¬Έκ°€ 심사에 λ°˜μ˜ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

 

OpenAI APIλŠ” 응닡 μ‹œκ°„μ΄ μΌμ •ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ™ΈλΆ€ API 지연이 아이디어 등둝 μš”μ²­μ— 직접 영ν–₯을 μ£Όμ§€ μ•Šλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€. 검증 μš”μ²­κ³Ό μƒνƒœλ₯Ό DB에 μ €μž₯ν•œ λ’€ μ‚¬μš©μžμ—κ²Œ μ‘λ‹΅ν•˜κ³ , μ‹€μ œ AI 검증은 Spring Eventλ₯Ό μ΄μš©ν•΄ 별도 μŠ€λ ˆλ“œμ—μ„œ λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

@Async("verificationTaskExecutor")
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void processAiVerification(VerificationRequestedEvent event) {
    // AI 검증 처리
}

 

@TransactionalEventListener(AFTER_COMMIT)을 μ μš©ν•΄ 아이디어 생성 νŠΈλžœμž­μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ»€λ°‹λœ μ΄ν›„μ—λ§Œ 검증이 μ‹œμž‘λ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€. @Async와 μ „μš© ThreadPoolTaskExecutorλ₯Ό μ‚¬μš©ν•΄ μ‹€μ œ 검증 μž‘μ—…μ€ 별도 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μž μš”μ²­κ³Ό AI 검증 μž‘μ—… μžμ²΄λŠ” λΆ„λ¦¬λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, 비동기 처리 λ‚΄λΆ€μ˜ νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λ‹€μ‹œ ν™•μΈν•˜λ©΄μ„œ λ‹€λ₯Έ λ¬Έμ œκ°€ λ³΄μ˜€μŠ΅λ‹ˆλ‹€.


2. 문제

AI 검증을 λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ TransactionTemplate둜 μ‹œμž‘ν•œ νŠΈλžœμž­μ…˜ λ‚΄λΆ€μ—μ„œ 검증 μ—”ν‹°ν‹° μ‘°νšŒλΆ€ν„° OpenAI API 호좜, κ²°κ³Ό μ €μž₯κΉŒμ§€ λͺ¨λ‘ μˆ˜ν–‰ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void processAiVerification(VerificationRequestedEvent event) {
    transactionTemplate.executeWithoutResult(
            status -> processAiVerificationInTransaction(event)
    );
}

public void processAiVerificationInTransaction(VerificationRequestedEvent event) {
    // 검증 μ—”ν‹°ν‹° 쑰회

    AiVerificationStructuredResult result =
            openAiVerificationService.verify(event.request());

    // κ²°κ³Ό μ €μž₯
    // 신뒰도 점수 κ°±μ‹ 
    // μƒνƒœ λ³€κ²½
}

 

즉 원본 μš”μ²­μ˜ νŠΈλžœμž­μ…˜κ³ΌλŠ” λΆ„λ¦¬λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, 별도 μŠ€λ ˆλ“œμ—μ„œ λ‹€μ‹œ μ‹œμž‘ν•œ νŠΈλžœμž­μ…˜μ΄ OpenAI 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ 계속 μœ μ§€λ˜λŠ” κ΅¬μ‘°μ˜€μŠ΅λ‹ˆλ‹€.

DB νŠΈλžœμž­μ…˜μ΄ μœ μ§€λ˜λŠ” λ™μ•ˆμ—λŠ” JDBC 컀λ„₯μ…˜λ„ ν•¨κ»˜ μ μœ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ‹€μ œ DB μž‘μ—…μ΄ μ—†λŠ” μ™ΈλΆ€ API λŒ€κΈ° μ‹œκ°„μ—λ„ 컀λ„₯μ…˜μ΄ ν’€λ‘œ λ°˜ν™˜λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

OpenAI ν΄λΌμ΄μ–ΈνŠΈμ˜ read timeout은 300초둜 μ„€μ •λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 단일 호좜이 timeoutκΉŒμ§€ 지연될 경우 μ΅œλŒ€ 300초 κ°€κΉŒμ΄ 컀λ„₯μ…˜μ΄ 점유될 수 μžˆλŠ” κ΅¬μ‘°μ˜€μŠ΅λ‹ˆλ‹€.

openai:
  verification:
    timeout-seconds: 300

 

검증 μš”μ²­μ΄ λ™μ‹œμ— μ¦κ°€ν•˜λ©΄ AI 검증과 직접 관련이 μ—†λŠ” μš”μ²­κΉŒμ§€ DB 컀λ„₯μ…˜μ„ ν• λ‹Ήλ°›μ§€ λͺ»ν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ API 응닡 지연이 DB 컀λ„₯μ…˜ 점유λ₯Ό 톡해 λ‹€λ₯Έ μš”μ²­μœΌλ‘œ μ „νŒŒλ  수 μžˆλŠ” κ΅¬μ‘°μ˜€μŠ΅λ‹ˆλ‹€.

 

직접 μΈ‘μ •ν•΄ 확인

μ½”λ“œλ§ŒμœΌλ‘œ ꡬ쑰적인 μœ„ν—˜μ€ 확인할 수 μžˆμ—ˆμ§€λ§Œ, μ‹€μ œλ‘œ μ™ΈλΆ€ API λŒ€κΈ° 쀑 컀λ„₯μ…˜μ΄ μ μœ λ˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μΈ‘μ • ν™˜κ²½μ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  • HikariCP maximum-pool-size=1
  • 컀λ„₯μ…˜ νšλ“ μ œν•œ μ‹œκ°„ 3,000ms
  • OpenAI Mock 응닡 10초 μ§€μ—°
  • OpenAI λŒ€κΈ° 쀑 λ³„λ„μ˜ DB 쑰회 μ‹€ν–‰

μ‹€μ œ read timeout인 300초λ₯Ό κ·ΈλŒ€λ‘œ μž¬ν˜„ν•˜μ§€ μ•Šκ³  10초 지연을 μ‚¬μš©ν•œ μ΄μœ λŠ” ν™•μΈν•˜λ €λŠ” λŒ€μƒμ΄ μ™ΈλΆ€ API λŒ€κΈ° μ‹œκ°„ λ™μ•ˆ DB 컀λ„₯μ…˜μ΄ ν•¨κ»˜ μ μœ λ˜λŠ”μ§€ μ—¬λΆ€μ˜€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

[초기] active=0, idle=1, waiting=0
[DelayedMock] OpenAI 호좜 μ§„μž… - 10000ms μ§€μ—° μ‹œμž‘

[OpenAI λŒ€κΈ° 쀑] active=1, idle=0, waiting=0

[λ™μ‹œ DB 쑰회] μ‹€νŒ¨ | μ†Œμš”=3005ms
[λ™μ‹œ DB 쑰회] μ˜ˆμ™Έ=CannotGetJdbcConnectionException

 

OpenAI 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ HikariCPκ°€ active=1, idle=0 μƒνƒœλ₯Ό μœ μ§€ν–ˆκ³ , 같은 μ‹œμ μ— μ‹€ν–‰ν•œ DB μ‘°νšŒλŠ” 컀λ„₯μ…˜μ„ ν• λ‹Ήλ°›μ§€ λͺ»ν•΄ 3,005ms ν›„ CannotGetJdbcConnectionException으둜 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.


3. ν•΄κ²°

비동기 κ²€μ¦μ˜ νŠΈλžœμž­μ…˜ 경계λ₯Ό μ™ΈλΆ€ API 호좜 λ‹¨μœ„κ°€ μ•„λ‹ˆλΌ μ‹€μ œ DB μž‘μ—… λ‹¨μœ„λ‘œ λ‹€μ‹œ λ‚˜λˆ΄μŠ΅λ‹ˆλ‹€.

  1. 짧은 νŠΈλžœμž­μ…˜μ—μ„œ 검증 μƒνƒœμ™€ μ·¨μ†Œ μ—¬λΆ€ 확인
  2. OpenAI API ν˜ΈμΆœμ€ νŠΈλžœμž­μ…˜ λ°–μ—μ„œ μˆ˜ν–‰
  3. 응닡을 받은 이후 μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•΄ κ²°κ³Ό μ €μž₯
검증 μš”μ²­
    ↓
μƒνƒœ 확인
[짧은 TX]
    ↓
OpenAI API 호좜
[TX μ—†μŒ]
    ↓
검증 κ²°κ³Ό · 신뒰도 점수 · μƒνƒœ 반영
[짧은 TX]

 

λ¨Όμ € 짧은 νŠΈλžœμž­μ…˜μ—μ„œ ν˜„μž¬ 검증 μƒνƒœμ™€ μ·¨μ†Œ μ—¬λΆ€λ§Œ ν™•μΈν•˜κ³  μ’…λ£Œν•©λ‹ˆλ‹€. 이미 μ·¨μ†Œλœ μš”μ²­μ΄λΌλ©΄ OpenAI APIλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이후 OpenAI API ν˜ΈμΆœμ€ νŠΈλžœμž­μ…˜ 없이 μˆ˜ν–‰ν•˜κ³ , 응닡을 받은 λ’€μ—λ§Œ μƒˆλ‘œμš΄ TransactionTemplate을 μ‹œμž‘ν•΄ 검증 κ²°κ³Ό, 신뒰도 점수, 아이디어 μƒνƒœ λ“± μ‹€μ œ DB 변경이 ν•„μš”ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

 

기쑴의 @TransactionalEventListener(AFTER_COMMIT)κ³Ό @Async κ΅¬μ‘°λŠ” κ·ΈλŒ€λ‘œ μœ μ§€ν–ˆμŠ΅λ‹ˆλ‹€.

원본 μš”μ²­ νŠΈλžœμž­μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ»€λ°‹λœ ν›„ 별도 μŠ€λ ˆλ“œμ—μ„œ AI 검증을 μ‹€ν–‰ν•œλ‹€λŠ” ꡬ쑰 μžμ²΄κ°€ λ¬Έμ œκ°€ μ•„λ‹ˆλΌ, κ·Έ 비동기 μž‘μ—… λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ API ν˜ΈμΆœκΉŒμ§€ DB νŠΈλžœμž­μ…˜μ— ν¬ν•¨ν•œ 것이 λ¬Έμ œμ˜€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

핡심은 비동기 처리 μ—¬λΆ€κ°€ μ•„λ‹ˆλΌ 비동기 μž‘μ—… λ‚΄λΆ€μ˜ νŠΈλžœμž­μ…˜ λ²”μœ„μ˜€μŠ΅λ‹ˆλ‹€.


4. κ²°κ³Ό

λ³€κ²½ 후에도 λ™μΌν•˜κ²Œ HikariCP ν’€ 크기λ₯Ό 1둜 μ œν•œν•˜κ³  OpenAI Mock 응닡을 10초 μ§€μ—°μ‹œν‚¨ λ’€ λ‹€μ‹œ μΈ‘μ •ν–ˆμŠ΅λ‹ˆλ‹€.

 

Before - νŠΈλžœμž­μ…˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ API 호좜

========== 컀λ„₯μ…˜ 점유 μΈ‘μ • ==========
[초기] active=0, idle=1, waiting=0
[DelayedMock] OpenAI 호좜 μ§„μž… - 10000ms μ§€μ—° μ‹œμž‘
[OpenAI λŒ€κΈ° 쀑] active=1, idle=0, waiting=0
HikariPool - Timeout failure stats (total=1/1, idle=0/1, active=1, waiting=0)
[λ™μ‹œ DB 쑰회] μ‹€νŒ¨ | μ†Œμš”=3005ms
[λ™μ‹œ DB 쑰회] μ˜ˆμ™Έ=CannotGetJdbcConnectionException
[λ™μ‹œ DB 쑰회] λ©”μ‹œμ§€=Failed to obtain JDBC Connection
[DelayedMock] μ§€μ—° μ’…λ£Œ - 응닡 λ°˜ν™˜
[μ™„λ£Œ ν›„] active=0, idle=1
=====================================

 

 

OpenAI 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ active=1, idle=0 μƒνƒœκ°€ μœ μ§€λμŠ΅λ‹ˆλ‹€. 같은 μ‹œμ μ— μ‹€ν–‰ν•œ DB μ‘°νšŒλŠ” 컀λ„₯μ…˜μ„ ν• λ‹Ήλ°›μ§€ λͺ»ν•΄ 3,005ms ν›„ CannotGetJdbcConnectionException으둜 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.

 

After - μ™ΈλΆ€ API ν˜ΈμΆœμ„ νŠΈλžœμž­μ…˜ λ°–μœΌλ‘œ 뢄리

========== 컀λ„₯μ…˜ 점유 μΈ‘μ • ==========
[초기] active=0, idle=1, waiting=0
[DelayedMock] OpenAI 호좜 μ§„μž… - 10000ms μ§€μ—° μ‹œμž‘
[OpenAI λŒ€κΈ° 쀑] active=0, idle=1, waiting=0
[λ™μ‹œ DB 쑰회] 성곡 | μ†Œμš”=8ms | κ²°κ³Ό=1
[DelayedMock] μ§€μ—° μ’…λ£Œ - 응닡 λ°˜ν™˜
[μ™„λ£Œ ν›„] active=0, idle=1
=====================================

 

 

λ™μΌν•œ 10초 μ§€μ—° ν™˜κ²½μ—μ„œλŠ” active=0, idle=1 μƒνƒœκ°€ μœ μ§€λ˜μ–΄ 컀λ„₯μ…˜μ΄ 풀에 λ°˜ν™˜λœ 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 같은 μ‹œμ μ— μ‹€ν–‰ν•œ DB μ‘°νšŒλ„ 8ms λ§Œμ— 정상 μ²˜λ¦¬λμŠ΅λ‹ˆλ‹€.

 

μΈ‘μ • ν•­λͺ© Before After
OpenAI λŒ€κΈ° 쀑 Hikari active 1 0
OpenAI λŒ€κΈ° 쀑 Hikari idle 0 1
λ™μ‹œ DB 쑰회 3,005ms ν›„ μ‹€νŒ¨ 8ms 성곡
쑰회 κ²°κ³Ό CannotGetJdbcConnectionException 정상 쑰회

μΈ‘μ • 쑰건: HikariCP maximum-pool-size=1, connection-timeout=3,000ms, OpenAI Mock delay=10s

 

μΈ‘μ • 결과도 ν•¨κ»˜ 검증

첫 μΈ‘μ •μ—μ„œλŠ” κΈ°λŒ€ν–ˆλ˜ active=0이 λ‚˜μ™”μ§€λ§Œ, ν™•μΈν•΄λ³΄λ‹ˆ μ§€μ—° Mock μžμ²΄κ°€ ν™œμ„±ν™”λ˜μ§€ μ•Šμ€ μƒνƒœμ˜€μŠ΅λ‹ˆλ‹€. 전체 μ‹€ν–‰ μ‹œκ°„κ³Ό Mock μ§„μž… 둜그λ₯Ό 확인해 ν•΄λ‹Ή 츑정이 μœ νš¨ν•˜μ§€ μ•Šλ‹€λŠ” 것을 λ°œκ²¬ν–ˆκ³ , μΈ‘μ • ν™˜κ²½μ„ μˆ˜μ •ν•œ λ’€ Before와 Afterλ₯Ό λ™μΌν•œ μ‘°κ±΄μ—μ„œ λ‹€μ‹œ μΈ‘μ •ν–ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό 톡해 μ›ν•˜λŠ” μˆ˜μΉ˜κ°€ λ‚˜μ™”λŠ”μ§€λ§Œ ν™•μΈν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ‹€μ œλ‘œ μ˜λ„ν•œ μ‘°κ±΄μ—μ„œ 츑정이 μ΄λ£¨μ–΄μ‘ŒλŠ”μ§€λ„ ν•¨κ»˜ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.


5. 남은 ν•œκ³„

이번 츑정은 단일 AI 검증 μš”μ²­μ„ κΈ°μ€€μœΌλ‘œ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ™μ‹œ 검증 μš”μ²­ μˆ˜μ™€ 컀λ„₯μ…˜ ν’€ 크기λ₯Ό λ‹¨κ³„μ μœΌλ‘œ μ¦κ°€μ‹œμΌ°μ„ λ•Œ μ²˜λ¦¬λŸ‰κ³Ό λŒ€κΈ° μ‹œκ°„μ΄ μ–΄λ–»κ²Œ λ‹¬λΌμ§€λŠ”μ§€κΉŒμ§€λŠ” ν™•μΈν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

maximum-pool-size=1 μ—­μ‹œ 컀λ„₯μ…˜ 경합을 λͺ…ν™•ν•˜κ²Œ κ΄€μ°°ν•˜κΈ° μœ„ν•œ μΈ‘μ • μ‘°κ±΄μž…λ‹ˆλ‹€. 운영 ν™˜κ²½μ˜ ν’€ 크기가 더 크더라도 μ™ΈλΆ€ API 호좜 쀑 νŠΈλžœμž­μ…˜μ΄ μœ μ§€λ˜λŠ” κ΅¬μ‘°μ—μ„œλŠ” λ™μ‹œ μš”μ²­μ΄ μ¦κ°€ν• μˆ˜λ‘ λ™μΌν•œ μœ ν˜•μ˜ 컀λ„₯μ…˜ 경합이 λ°œμƒν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

 

λ˜ν•œ μ™ΈλΆ€ API 호좜 μ΅œμ’… μ‹€νŒ¨ μ‹œμ—λŠ” PENDING_ADMIN_REVIEW μƒνƒœλ‘œ μ „ν™˜ν•˜κ³  κ΄€λ¦¬μžκ°€ λ‹€μ‹œ 검증할 수 μžˆλŠ” 경둜λ₯Ό λ‘μ—ˆμ§€λ§Œ, λ°±μ˜€ν”„ 기반 μžλ™ μž¬μ‹œλ„λ‚˜ μŠ€μΌ€μ€„λŸ¬ 기반 μžλ™ νšŒμˆ˜κΉŒμ§€λŠ” κ΅¬ν˜„ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.


6. 정리

μ½”λ“œλ₯Ό μ½μœΌλ©΄μ„œ 문제 κ°€λŠ₯성은 확인할 수 μžˆμ—ˆμ§€λ§Œ, μ‹€μ œλ‘œ μ–΄λŠ μ •λ„μ˜ 영ν–₯을 μ£ΌλŠ”μ§€λŠ” 츑정이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. 직접 μΈ‘μ •ν•œ λ’€μ—λŠ” "컀λ„₯μ…˜ 풀이 고갈될 수 μžˆλ‹€"λŠ” κ°€λŠ₯μ„± λŒ€μ‹  "10초 μ§€μ—° ν™˜κ²½μ—μ„œ λ™μ‹œ DB μ‘°νšŒκ°€ 3,005ms ν›„ CannotGetJdbcConnectionException으둜 μ‹€νŒ¨ν–ˆλ‹€"λŠ” 결과둜 문제λ₯Ό μ„€λͺ…ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

μΈ‘μ • κ³Όμ •μ—μ„œλŠ” κ²°κ³Ό μžμ²΄κ°€ μ‹ λ’°ν•  수 μžˆλŠ”μ§€λ„ ν•¨κ»˜ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 첫 μ‹€ν–‰μ—μ„œ κΈ°λŒ€ν–ˆλ˜ μˆ˜μΉ˜κ°€ λ‚˜μ™”λ”λΌλ„ μ‹€μ œ μ§€μ—° Mock이 μ‹€ν–‰λ˜μ§€ μ•Šμ•˜λ‹€λ©΄ μœ νš¨ν•œ κ²°κ³Όκ°€ μ•„λ‹ˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 수치뿐 μ•„λ‹ˆλΌ λ‘œκ·Έμ™€ μ‹€ν–‰ μ‘°κ±΄κΉŒμ§€ ν™•μΈν•œ λ’€ λ™μΌν•œ μ‘°κ±΄μ—μ„œ λ³€κ²½ μ „ν›„λ₯Ό λ‹€μ‹œ λΉ„κ΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

이번 κ°œμ„ μ„ 톡해 비동기 처리 여뢀와 νŠΈλžœμž­μ…˜μ˜ λ²”μœ„λŠ” λ³„κ°œμ˜ λ¬Έμ œλΌλŠ” 점을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ API ν˜ΈμΆœμ„ 별도 μŠ€λ ˆλ“œλ‘œ λΆ„λ¦¬ν•˜λ”λΌλ„ κ·Έ λ‚΄λΆ€μ—μ„œ νŠΈλžœμž­μ…˜μ΄ 계속 μœ μ§€λ˜λ©΄ API 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ DB 컀λ„₯μ…˜λ„ ν•¨κ»˜ 점유될 수 μžˆμŠ΅λ‹ˆλ‹€.

이후 λΉ„μŠ·ν•œ ꡬ쑰λ₯Ό 섀계할 λ•ŒλŠ” μ™ΈλΆ€ API 호좜과 μ‹€μ œ DB μž‘μ—…μ˜ 경계λ₯Ό λ¨Όμ € κ΅¬λΆ„ν•˜κ³ , λ„€νŠΈμ›Œν¬ λŒ€κΈ° ꡬ간에 λΆˆν•„μš”ν•œ νŠΈλžœμž­μ…˜κ³Ό 컀λ„₯μ…˜ μ μœ κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•˜λ € ν•©λ‹ˆλ‹€.

728x90