- ParkEZ ํ ํ๋ก์ ํธ๋ ์ฌ์ฉ์์ ์ฃผ์ฐจ์ฅ ์์ ์๋ฅผ ์ํ ์์ฝ, ๊ฒฐ์ , ์ ์ฐ์ด ๊ฐ๋ฅํ ํตํฉ ์ฃผ์ฐจ ํ๋ซํผ์ ๊ตฌํํ ํ ํ๋ก์ ํธ์ ๋๋ค.
- ํ์ : ์กฐ์์ธ, ์ ์คํธ, ์ด๋ฏผ์ , ์ ์์ฐ, ์ฅ์คํ
- ๊ธฐ๊ฐ : 2025.04.01 - 2025.05.06
๐ ํ ๋ ธ์ : ParkEZ
๐ ํ ๋ธ๋ก์ : 10์กฐ - Park10EZ
๐ ๋๋ฉ์ธ : parkez.click
๐ ์์ฐ์์ : ParkEZ ์์ฐ์์
๐ฃ ์กฐ์์ธ : ์ฃผ์ฐจ๊ณต๊ฐ API, ๋ฆฌ๋ทฐ API, Redis Pub/Sub์ ์ด์ฉํ ๋ฉ์ผ ์ ์ก ๊ธฐ๋ฅ
๐ฆฆ ์ ์คํธ : ์ ์ API, JWT ์ธ์ฆ/์ธ๊ฐ, ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ, ํ๋ก๋ชจ์ API + ๋์์ฑ ์ ์ด ์ ์ฉ, AWS ์ํคํ ์ฒ ๊ตฌ์ฑ, GitHub Actions ํ์ฉํ CI/CD
๐ถ๏ธ ์ด๋ฏผ์ : ๊ฒฐ์ API, ์ ์ฐ API, AWS S3 ์ด๋ฏธ์ง ๊ธฐ๋ฅ, Toss payments API ์ฐ๋, Redis๋ฅผ ์ด์ฉํ ์์ฝ ๋๊ธฐ์ด ๊ธฐ๋ฅ
๐ฟ ์ ์์ฐ : ์ฃผ์ฐจ์ฅ API, ๋ค์ด๋ฒ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ, AWS Lambda๋ฅผ ์ด์ฉํ ๊ณต๊ณต๋ฐ์ดํฐ ์ ์ฅ, ์นด์นด์ค๋งต API ์ฐ๋ํ์ฌ ์ฃผ์ ์ ์ฅ
๐ ์ฅ์คํ : ์์ฝ API + ๋์์ฑ ์ ์ด ์ ์ฉ, ์ฃผ์ฐจ์ฅ ๋ค๊ฑด ์กฐํ ์บ์ฑ, Spring Batch๋ฅผ ์ด์ฉํ ์ ์ฐ ๊ธฐ๋ฅ
- ๐งฐ ๊ธฐ์ ์คํ
- ๐ ์์คํ ์ํคํ ์ฒ
- ๐ฟ CI/CD
- ๐งฉ ์์ด์ดํ๋ ์
- ๐งพ ERD
- ๐ก API ๋ช ์ธ
- ๐ ๊ธฐ์ ๊ณ ๋ํ
- ๐งช ์ฑ๋ฅ ํ ์คํธ
- ๐ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง
- ๐งฏ ํธ๋ฌ๋ธ์ํ
- ๐ญ ํฅํ ๋ฐ์ ๋ฐฉํฅ
- ๐ ํ๊ณ
๐ Swagger ์ฐธ์กฐ : parkez.click
โ๏ธ AWS Lambda๋ก ์ธ๋ถ API ํธ์ถ ์๋ํ
- ๋์ ๋ฐฐ๊ฒฝ: ํ๋ฃจ 1ํ ์คํ ์์ ์ ์ํด ์๋ฒ๋ฅผ 24์๊ฐ ์ ์งํ๋ ๊ฒ์ ๋นํจ์จ โ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ผ๋ก ์ ํ
- ๊ธฐ์ ์ ํ:
AWS Lambda + EventBridge์กฐํฉ์ผ๋ก ์๋ฒ ๊ด๋ฆฌ ๋ถ๋ด ์์ด ์ค์ผ์ค๋ง ์๋ํ
- ๋น ๋ฅธ ์ฝ๋ ์คํํธ (Spring ์ด๊ธฐํ ์ ๊ฑฐ)
- ํจํค์ง ๊ฒฝ๋ํ โ ๋ฐฐํฌ ๊ฐํธ
- ์คํ ์๊ฐ ๋จ์ถ โ ๋น์ฉ ์ ๊ฐ
- VPC Peering: Lambda โ RDS ๊ฐ ํต์ ์ํด VPC ๊ฐ ์ฐ๊ฒฐ
- ํ๋ผ์ด๋น ์๋ธ๋ท: Lambda ์คํ ์์น, ์์๋ฐ์ด๋๋ง ํ์ฉ
- ํผ๋ธ๋ฆญ ์๋ธ๋ท + IGW: ์ธ๋ถ ๊ณต๊ณต API ํธ์ถ ๊ฐ๋ฅํ๊ฒ ๊ตฌ์ฑ
- NAT Gateway: ํ๋ผ์ด๋น ์๋ธ๋ท์์๋ ์ธ๋ถ API ์ ๊ทผ ๊ฐ๋ฅ
๐ฐ Spring Batch ๊ธฐ๋ฐ ์ ์ฐ ์ฒ๋ฆฌ
- ๋์ ๋ฐฐ๊ฒฝ: ์๋ง ๊ฑด ์ด์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์ด๋ ฅ ๊ด๋ฆฌ์ ์ฌ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ตฌ์กฐ ํ์
- ๋์ฉ๋ ์ฒ๋ฆฌ ์ต์ ํ
- ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ Chunk ๋จ์๋ก ๋ถํ ์ฒ๋ฆฌ โ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ํ๋ณด
- ๊ตฌ์กฐ์ ์ค๊ณ (Job / Step ๋ถ๋ฆฌ)
- ์ ์ฐ ํ๋ก์ธ์ค๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์ ์ฉ์ด
- ์ด๋ ฅ ๊ด๋ฆฌ ์๋ํ
- Job ์คํ ๋ด์ญ๊ณผ ์ํ๋ฅผ DB์ ์๋ ๊ธฐ๋ก
- ์ค์ผ์ค๋ง ๋ฐ ์ฌ์๋ ์ง์
- ์ ํด์ง ์๊ฐ์ ์ ์ฐ ์๋ ์ํ
- ์คํจํ Step๋ง ์ฌ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Chunk ๊ธฐ๋ฐ ํธ๋์ญ์
์ ์ด
- ์คํจํ Chunk๋ง rollback โ ์ ์ฒด ์์ ์ ์ํฅ ์์ด ๋ณต๊ตฌ ๊ฐ๋ฅ
๐ง Redis Pub/Sub + Amazon SES ๊ธฐ๋ฐ ๋ฉ์ผ ์ ์ก
-
์ด๋ฉ์ผ ์ ์ก ๋ฐฉ์: SMTP + JavaMailSender
- ์ธ์ฆยท์ ์ก ์ ๋ขฐ๋ ๋ฎ์
- ์คํธ ์ฒ๋ฆฌ ์ฐ๋ ค
- TLS / ํฌํธ ์ ์ฝ ์กด์ฌ
-
์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์: Spring @EventListener
- ๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์ โ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์๋ฆผ ๋ก์ง ๊ฐ๊ฒฐํฉ
- ๊ตฌ์กฐ ํ์ฅ ๋ฐ ์ฌ์ฌ์ฉ ์ด๋ ค์
-
์ด๋ฒคํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ:
@EventListenerโredisTemplate.convertAndSend()๋ก ์ ํ
โ Redis Pub/Sub ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌ -
์ ๋ขฐ์ฑ ์๋ ์ด๋ฉ์ผ ์ ์ก:
JavaMailSenderโSesClient(AWS SDK v2) ์ ํ- ๋๋ฉ์ธ ์ธ์ฆ + DKIM ์๋ช
EmailTemplateService๋ฅผ ํตํ ํ ํ๋ฆฟ ๊ธฐ๋ฐ ๋ฉ์ผ ๊ตฌ์ฑ
| ํญ๋ชฉ | ๊ฐ์ ๋ด์ฉ |
|---|---|
| ์ ๋ขฐ๋ ํฅ์ | SES + DKIM ๊ธฐ๋ฐ์ผ๋ก ์ ์ก๋ฅ ๋ฐ ์์ ์ฑ๊ณต๋ฅ ํฅ์ |
| ํ์ฅ์ฑ ํ๋ณด | FCM / SES / Slack ๋ฑ ๋ค์ํ ์ฑ๋ ์ฐ๋ ์ฉ์ด |
| ์ ์ง๋ณด์ ํธ์์ฑ | ์คํจ ๋ด์ญ ๋ก๊น , ํต๊ณ ๋ถ์, ์ฌ์ฒ๋ฆฌ ๊ตฌ์กฐ ์ ์ฉ ๊ฐ๋ฅ |
- ๊ธฐ์กด SMTP ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋๋น ์ ์ก ์ ๋ขฐ์ฑ ๋ฐ ์ ์ง๋ณด์ ํธ์์ฑ ๋ํญ ๊ฐ์
- ์๋ฆผ ๋ก์ง์ ์ฑ ์ ๋ถ๋ฆฌ๋ก ๊ตฌ์กฐ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ ํ๋ณด
- ํ
์คํธ ์๋๋ฆฌ์ค
์ด 10๋ช ์ ์ฌ์ฉ์๊ฐ ๋์์ ์์ฝ ์์ฒญ - ์๋ต ๋ฉ์์ง
"์์ฝ ์ฑ๊ณต": ์ค์ ์์ฝ ์๋ฃ"๋๊ธฐ์ด ๋ฑ๋ก๋จ": ์์ฝ ์คํจ ํ ๋๊ธฐ์ด ๋ฑ๋ก
| ๊ตฌ๋ถ | ์๋ต ๊ฒฐ๊ณผ |
|---|---|
| โ ๋์์ฑ ์ ์ด ์ด์ | 10๋ช
๋ชจ๋ "์์ฝ ์ฑ๊ณต" โ ์ค๋ณต ์์ฝ ๋ฐ์ |
| โ ๋์์ฑ ์ ์ด ์ดํ | 1๋ช
"์์ฝ ์ฑ๊ณต" + 9๋ช
"๋๊ธฐ์ด ๋ฑ๋ก๋จ" โ ์ ์ ์ฒ๋ฆฌ๋จ |
- ๊ฒฐ๋ก : ๋์์ฑ ์ ์ด๋ฅผ ํตํด ํ๋์ ์ฃผ์ฐจ ๊ณต๊ฐ์ ๋ํ ์ค๋ณต ์์ฝ์ ๋ฐฉ์งํ๊ณ , ํ์์ ์ฌ์ฉ์๋ฅผ ๋๊ธฐ์ด์ ์์ ํ๊ฒ ๋ฑ๋กํ ์ ์๋๋ก ๊ฐ์ ๋์์ต๋๋ค.
๐ JMeter๋ฅผ ํ์ฉํ ์ฃผ์ฐจ์ฅ ์กฐํ ์ฑ๋ฅ ํ ์คํธ
- ๋ชฉํ: Redis ์บ์ ๋์ ์ /ํ ์ฑ๋ฅ ๋น๊ต
- ๋์: ์ฝ 10๋ง ๊ฑด์ ์ฃผ์ฐจ์ฅ ๋ฐ์ดํฐ
- ๋๊ตฌ: Apache JMeter
- ์กฐ๊ฑด: ๋์ผํ Thread ์, Ramp-up ์๊ฐ, Delay ์ค์
| ํญ๋ชฉ | ์บ์ ์ ์ฉ ์ | ์บ์ ์ ์ฉ ํ | ๋ณํ์จ |
|---|---|---|---|
| Throughput | 4.2/sec | 31.9/sec | ๐ผ +659.5% ์ฆ๊ฐ |
| ํ๊ท ์๋ต์๊ฐ | 61,641 ms | 15,678 ms | ๐ฝ -74.6% ๊ฐ์ |
- Redis ์บ์ ์ ์ฉ์ผ๋ก ์ฒ๋ฆฌ๋(Throughput)์ด 6๋ฐฐ ์ด์ ์ฆ๊ฐ
- ์๋ต์๊ฐ์ด 1/4 ์์ค์ผ๋ก ๋จ์ถ๋์ด ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
- ๋์ฉ๋ ๋ฐ์ดํฐ์ ๋ํด ์บ์ ์ ์ฉ ์ ํ์ฐํ ์ฑ๋ฅ ํฅ์ ํ์ธ
โ ๋ฌธ์ ์ํฉ
- ๋ก์ปฌ์์๋ ์ ์ ๋์ํ๋ ์์ฝ ์ํ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ด, ๊ฐ๋ฐ ์๋ฒ์์๋ DB์ ๋ฐ์๋์ง ์์
- ์์:
reservation.cancel()ํธ์ถ ํ์๋ReservationStatus.CANCELED๊ฐ DB์ ๋ฐ์๋์ง ์์
๐ ์์ธ ๋ถ์
-
OSIV ์ค์ ์ฐจ์ด
- ๋ก์ปฌ:
spring.jpa.open-in-view=true(๊ธฐ๋ณธ๊ฐ)
โ ํธ๋์ญ์ ์ข ๋ฃ ์ดํ์๋ ์์์ฑ ์ปจํ ์คํธ ์ ๊ทผ ๊ฐ๋ฅ - ๊ฐ๋ฐ ์๋ฒ:
open-in-view=false
โ ํธ๋์ญ์ ์ข ๋ฃ ์ ์์์ฑ ์ปจํ ์คํธ๋ ์ข ๋ฃ
- ๋ก์ปฌ:
-
๊ตฌ์กฐ์ ๋ฌธ์
@Transactional(readOnly = true)๊ฐ ์ ์ฉ๋ Reader์์ ์กฐํํ ์ํฐํฐ๋ Detached ์ํ์ผ ์ ์์- ์ดํ Writer์์ ์ํ ๋ณ๊ฒฝ ๋ฉ์๋๋ง ํธ์ถํ๋ฉด JPA์ dirty checking์ด ์๋ํ์ง ์์
// ReservationService
Reservation reservation = reservationReader.findMyReservation(...); // ReadOnly ํธ๋์ญ์
reservationWriter.cancel(reservation); // ๋ด๋ถ์์ reservation.cancel() ํธ์ถ โ ๋ณ๊ฒฝ ๊ฐ์ง ์ ๋จโ ํด๊ฒฐ ๋ฐฉ์
โ ๋จ๊ธฐ ํด๊ฒฐ: ๋ช ์์ save ํธ์ถ
public void cancel(Reservation reservation) {
reservation.cancel();
reservationRepository.save(reservation); // Detached ๊ฐ์ฒด merge
}โ ๊ทผ๋ณธ์ ํด๊ฒฐ: ํธ๋์ญ์ ๋ฒ์ ์ฌ์ค๊ณ
// ReservationService
@Transactional
public void cancelReservation(...) {
Reservation reservation = reservationReader.findMyReservation(...);
reservation.cancel(); // ์์ ์ํ์์ ๋ณ๊ฒฝ โ dirty checking ์๋
}๐ฏ ๊ฒฐ๊ณผ
- ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์์ฝ ์ํ ๋ณ๊ฒฝ์ด ์ ์ ๋ฐ์๋จ
- ๊ตฌ์กฐ์ ์ผ๋ก ์ญํ ๋ถ๋ฆฌ๊ฐ ๋ช
ํํด์ง:
- Reader โ ์กฐํ ์ฑ ์
- Writer โ ๋๋ฉ์ธ ๋ณ๊ฒฝ ์ฑ ์
- Service โ ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฐ ํ๋ฆ ์กฐ์จ
๐ ๋ฌธ์ ๋ฐ๊ฒฌ
- ๋์์ฑ ํ ์คํธ ์ํ ์ค, ํ ์คํธ๊ฐ ๋๋์ง ์๊ณ ๋๊ธฐ ์ํ ์ง์
- ์ปค๋ฅ์ ํ ๊ณ ๊ฐ๋ก ์ธํ ํ์์์ ํ์ ๋ฐ์
- ํ
์คํธ ๋ฉ์๋์
@Transactional์ด ์ ์ฉ๋์ด ์ ์ฒด ํ ์คํธ๊ฐ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ์คํ๋จ - ๋ด๋ถ ๋ฉ์๋๋ ๋์ผ ํธ๋์ญ์ ์ ๋ฌถ์ฌ ์ปค๋ฐ/๋กค๋ฐฑ ์ง์ฐ
- ๊ฒฐ๊ณผ์ ์ผ๋ก DB ๋ฝ์ด ํด์ ๋์ง ์๊ณ , ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฝ ๋๊ธฐ ์ํ์ ๋น ์ง
- ์ปค๋ฅ์ ํ ๋ถ์กฑ โ ์๋ก์ด ์ปค๋ฅ์ ์์ฑ ๋ถ๊ฐ โ ํ ์คํธ ํ์์์
โ ํด๊ฒฐ ๋ฐฉ์ ๋ฐ ๊ฒฐ๊ณผ
@Transactional์ด๋ ธํ ์ด์ ์ ๊ฑฐ- ๊ฐ ์ค๋ ๋๊ฐ ๋ ๋ฆฝ๋ ํธ๋์ญ์ ์ผ๋ก ์คํ๋์ด DB ๋ฝ ์ ์ ํด์
- ํ
์คํธ ์ข
๋ฃ ํ
deleteAllInBatch()์ฌ์ฉ- ํ ์คํธ ๊ฐ ๋ฐ์ดํฐ ์์กด ๋ฌธ์ ๋ฐฉ์ง
- ํธ๋์ญ์ ์ ๊ฑฐ๋ก ์ธํ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ํ
โ ํ์ฌ ๊ตฌ์กฐ DB์ Pessimistic Lock (๋น๊ด์ ๋ฝ) ์ ํ์ฉํ์ฌ ์ฟ ํฐ ์ฌ๊ณ ๋ฅผ ์์ ํ๊ฒ ์ ์ดํ๊ณ ์์ต๋๋ค.
-
์ฅ์
- ๋ค์ค ์ฌ์ฉ์ ํ๊ฒฝ์์๋ ์ค๋ณต ๋ฐ๊ธ ์์ด ์ฌ๊ณ ์ ์ด ๊ฐ๋ฅ
-
๋จ์
- ํน์ ํ๋ก๋ชจ์
๋ฐ๊ธ ์์ฒญ์ด ๋ชฐ๋ฆฌ๋ฉด ํด๋น ๋ ์ฝ๋์ ๋ฝ์ด ๊ฑธ๋ ค
โ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ง์ฐ๋๊ณ
โ ์ฟ ํฐ ์กฐํ ๋ฐ ๊ด๋ จ ๋ก์ง์ ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์์
- ํน์ ํ๋ก๋ชจ์
๋ฐ๊ธ ์์ฒญ์ด ๋ชฐ๋ฆฌ๋ฉด ํด๋น ๋ ์ฝ๋์ ๋ฝ์ด ๊ฑธ๋ ค
๐ง ๊ฐ์ ๋ฐฉํฅ
- ๋ชฉํ: ํน์ ํ๋ก๋ชจ์ ๋จ์๋ก ๋ถ์ฐ๋ฝ ์ ์ฉ (ex. Redis ๊ธฐ๋ฐ)
- ํจ๊ณผ:
- ๋ฐ๊ธ์๋ง ๋ฝ์ ์ ํํ๊ณ ์กฐํ๋ ๋ฝ ์ํฅ ์์ด ์ฒ๋ฆฌ ๊ฐ๋ฅ
- DB ๋ ๋ฒจ ๋ณ๋ชฉ ์์ด ํ์ฅ์ฑ ๋์ ๋์์ฑ ์ ์ด ๊ฐ๋ฅ
- ๋ฐ๊ธ ์์ฒญ์ ๋๊ธฐ ์ฒ๋ฆฌ, ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ์๋ต ์ ๊ณต
- ๋ฐ๊ธ ๊ธฐ๋ก์ ๋น๋๊ธฐ ์ฒ๋ฆฌ, ์์คํ ๋ถํ ๋ถ์ฐ
- ์์: Kafka, SQS ๋ฑ ๋ฉ์์ง ํ๋ฅผ ํตํด ์ฒ๋ฆฌ ๋ถ๋ฆฌ
โ
ํ์ฌ ๊ตฌ์กฐ
ํ์ฌ ์๋ฆผ ์์คํ
์ Redis Pub/Sub ๊ธฐ๋ฐ์ผ๋ก, ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ฆผ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ , ๊ตฌ๋
์์์ ์ด๋ฉ์ผ(SES)์ ์ ์กํ๋ ๊ตฌ์กฐ์
๋๋ค.
์ด ๊ตฌ์กฐ๋ ๊ฐ๋จํ๊ณ ๋น ๋ฅด์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ด์์์ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
โ ๋ฌธ์ ์
- Redis Pub/Sub์ ์ค์๊ฐ ๋ฉ์์ง ์ ํ๋ง ์ง์ํ๋ฉฐ, ๋ฉ์์ง๋ฅผ ์ ์ฅํ์ง ์์
- ๊ตฌ๋ ์๊ฐ ๋ค์ด๋ ๊ฒฝ์ฐ ๋ฉ์์ง๊ฐ ์ ์ค๋์ด ์๋ฆผ ์์ค ๋ฐ์
- ์๋ฆผ ๋ฐ์ก ์คํจ ์ ๋ก๊ทธ๋ง ๋จ๊ณ , ๋ณ๋์ ์ฌ์๋ ๋ก์ง์ด ์์ด ์ด์ ์ ๋ขฐ์ฑ ๋ถ์กฑ
โ ๊ฐ์ ๋ฐฉํฅ
- Redis Streams ๋๋ Kafka ๋ฑ ์์ ๋ฉ์์ง ํ๋ก ๊ต์ฒด ๋๋ ๋ณด์ ์์คํ ๋์ ์์
- ๊ตฌ๋ ์ ์ฅ์ ์์๋ ์ฌ์์ ๋ฐ ๋ณต๊ตฌ ๊ฐ๋ฅ
- ๋ฐ์ก ์คํจ ์ด๋ ฅ์ Redis List ๋๋ DB Table ๋ฑ์ ์ ์ฅ
- Scheduled Task ๋๋ Spring Batch๋ฅผ ํ์ฉํ ์ฌ์ฒ๋ฆฌ ๊ตฌ์กฐ ์ ์ฉ
- ์ฅ๊ธฐ์ ์ผ๋ก๋ Kafka DLQ(Dead Letter Queue) ๋์ ๊ณ ๋ ค
๐ฃ ์กฐ์์ธ : ๊ธด ์ฌ์ ์ ์ข์ ํํฐ๋, ํ์๋ถ๋ค์ ๋ง๋ ์ ๋ง๋ฌด๋ฆฌํ ์ ์์์ต๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ํ๋ก์ ํธ ์ดํ์๋ ๊ฐ์ด ๋ง๋์๋ณต์ต, ๊ฐ์ ๋ฐ ๋ฐ์ ํ๊ณ ์ถ์ต๋๋ค.
๐ฆฆ ์ ์คํธ : ํ์๋ค๊ณผ์ ์ง์์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ๊ณผ ์ญํ ๋ถ๋ด์ ํตํด ์ ์ฐจ ์์ ์ ์ธ ๊ฐ๋ฐ ํ๋ฆ์ ๋ง๋ค์ด๊ฐ ์ ์์์ต๋๋ค. ์งง์ ๊ธฐ๊ฐ์ด์์ง๋ง ๊ธฐ์ ๋ฟ๋ง ์๋๋ผ ํ์ ์ญ๋๊ณผ ์ฑ ์๊ฐ๊น์ง ํจ๊ป ํค์ธ ์ ์์๋ ๊ฐ์ง ์๊ฐ์ด์์ต๋๋ค.
๐ถ๏ธ ์ด๋ฏผ์ : ์ฒ์์ผ๋ก ๊ธฐํ๋ถํฐ ๋ฐฐํฌ๊น์ง ํด๋ณธ ํ๋ก์ ํธ์ธ ๋งํผ ์ด๋ ค์ด ์ ๋ ๋ง์์ง๋ง ๋ฐฐ์ด ์ ๋ ๋ง์๋ ์๊ฐ์ด์์ต๋๋ค. ํ๋ก์ ํธ๋ ๋๋ฌ์ง๋ง, ์ ๊ฐ ๊ตฌํํ์ง ์์ ๋ถ๋ถ์ ๋ํด์๋๊ผญ ๋ณต์ตํ๋ฉฐ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ข์ ํ์๋ค๊ณผ ํํฐ๋๊ณผ ์ํตํ๋ฉฐ ์ ๋ง๋ฌด๋ฆฌํ ์ ์์ด์ ๊ฐ์ฌํ์ต๋๋ค.
๐ฟ ์ ์์ฐ : ํ ๋ฌ ๋์ ์ต์ข ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ข์ ๊ฒฝํ์ ํ๊ฒ ๋์ด ๋ป ๊น์ ์๊ฐ์ด์์ต๋๋ค. ์ด๋ ค์ด ๋ถ๋ถ์ด ๋ง์์ง๋ง ์ข์ ํ์๊ณผ ํํฐ๋ ๋๋ถ์ ์ ๋ง๋ฌด๋ฆฌ ํ ์ ์๊ฒ ๋์์ต๋๋ค. 10์กฐ ์ทจ๋ฝ ํ์ดํ
๐ ์ฅ์คํ : ์ต์ข ํ๋ก์ ํธ์ธ ๋งํผ ์ข์ ํ์๋ค๊ณผ ํจ๊ป ์ฌ๋ฌ ๊ฐ์ง ์๋๋ฅผ ๋ค์ํ๊ฒ ํด ๋ณผ ์ ์์ด์ ์ข์์ต๋๋ค. ์ ๊ฐ ๊ตฌํํ์ง ๋ชปํ ๋ถ๋ถ์ ๋ํด์ ๋ณต์ตํ๋ฉฐ ์ง์ ๊ตฌํํด ๋ณผ ์์ ์ ๋๋ค.
