fromm์ SQS์ DLQ - 1. DeadLetterQueue๋ฅผ ๋์ ํ๊ธฐ๊น์ง
- #AWS
- #SQS
- #DLQ
- #event-driven
์๋ ํ์ธ์. ๋ ธ๋จธ์ค ๋ฐฑ์๋ํ์์ fromm ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๊น์ฐํ์ ๋๋ค.
fromm์ Event Driven
fromm์ ์๋น์ค๋ ํฌ๊ฒ ์ํฐ์คํธ์ ํ๋ผ์ด๋น๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ fromm ์ฑ๊ณผ fromm ์ฑ์ ์ด์ฉ๊ถ, ์ํฐ์คํธ๋ณ ๊ตฟ์ฆ ๋ฑ์ ๊ตฌ๋งคํ ์ ์๋ fromm store ๋ ๊ฐ์ ์๋น์ค๋ก ๋๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์๋น์ค๋ ์ฃผ๋ฌธ, ๊ฒฐ์ , ํ๋กฌ์น๊ตฌ, ์๋ฆผ ๋ฑ์ ์ฌ๋ฌ ๋ชจ๋๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์ฌ๋ฌ ๋ชจ๋๋ก ๊ตฌ์ฑ๋ ์๋น์ค์์ ์ํ์ ๊ตฌ๋งคํ๋๋ฐ ๊ตฌ๋งค๊ณผ์ ์์ ์ฑ์ ์ด์ฉ๊ถ์ด ์ฆ์ ๋ฑ๋ก๋์ง ์์๋ค๊ณ , ํน์ ์ฑ์์ ์ฑํ ๋ฉ์์ง๋ฅผ ๋ณด๋๋๋ฐ ํธ์์๋ฆผ์ด ๊ฐ์ง ์์๋ค๊ณ ์ด์ฉ๊ถ ๊ตฌ๋งค๊ฐ ์คํจํ๊ฑฐ๋ ์ฑํ ๋ฉ์์ง ์ ์ก์ด ์คํจํ ํ์๋ ์์ต๋๋ค. ์ด์ ๊ฐ์ ์ฌ๋ก๋ค์ ์ฆ์ ๋ฐ์๋์ง๋ ์์ง๋ง ์ธ์ ๊ฐ ๋ชฉํํ๋๋ก ์ํ๊ฐ ๋ฐ์๋๋ฉด ๋๋ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ(eventually consistency)๋ฅผ ํตํด ์ปดํฌ๋ํธ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค. fromm ์๋น์ค์ ๋ฐฑ์๋๋ ์ด๋ฅผ ์ํด event driven architecture๋ฅผ ์ ํํ๊ณ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ๋ฉ์์ง ํ๋ก SQS๋ฅผ ํ์ฉํ๊ณ ์์ต๋๋ค.
์ SQS์๋?
๋ฉ์์ง ํ๋ก SQS๋ฅผ ์ ํํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SQS์ ๋์ ํธ๋ํฝ ์ฒ๋ฆฌ๋
SQS๋ ํ์ค๋๊ธฐ์ด์ ์ฌ์ฉ์ ๊ฑฐ์ ๋ฌด์ ํ์ ๊ฐ๊น์ด ์ด๋น API ์์ ์ ์ง์ํ๋ฉฐ ๋์์ ์ฒ๋ฆฌ๊ฐ๋ฅํ inflight message limit์ 120,000๊ฐ๋ก ํ์ฌ fromm ์๋น์ค์์ ๋ฐ์ํ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ๋์ ์ฒ๋ฆฌ๋์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ๋ํ SQS์ ํ์ค๋๊ธฐ์ด์ ๋ฉ์์ง์ at least once delivery๋ฅผ ๋ณด์ฅํ์ฌ ์ด๋ฒคํธ๊ฐ ์ ์ ํ ์ฒ๋ฆฌ๋ ์ ์์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ๋ง์ฝ ๋ฉ์์ง์ ์๋ฒฝํ ์์๋ณด์ฅ๊ณผ exactly once๊ฐ ํ์ํ๋ค๋ฉด ์ฒ๋ฆฌ๋์ ์กฐ๊ธ ํฌ๊ธฐํ๊ณ ํ์ค๋๊ธฐ์ด ๋์ FIFO Queue๋ฅผ ์ฌ์ฉํด๋ ๋๋ค๋ ์ต์ ๋ ๋์ ๋์์ต๋๋ค.
์คํ์ดํฌ์ฑ ํธ๋ํฝ์ ์ ์ ํ ๋์๊ฐ๋ฅํ Lambda์ ์กฐํฉ
fromm ์๋น์ค๋ ์ํฐ์คํธ๊ฐ ํ๋ผ์ด๋น ๋ฉ์์ง๋ฅผ ๋ฐ์กํ๋ฉด ํฌ๋ค์ด ๋ค์ ์ ์ ๋๋ฉฐ ์๊ฐ์ ์ผ๋ก API call์ด ๋ค์ ์ผ์ด๋๋ ์คํ์ดํฌ์ฑ ํธ๋ํฝ์ ํน์ฑ์ ๋ณด์ ๋๋ค. ๋ฏธ๋ฆฌ ์ค์ผ์ผ์์์ ํ๊ธฐ์๋ ์ํฐ์คํธ๊ฐ ์ธ์ ํ๋ผ์ด๋น๋ฉ์์ง๋ฅผ ๋ณด๋ผ์ง๋ ์ ํ ์์ํ ์ ์์ผ๋ฏ๋ก ํธ๋ํฝ์ด ์ ์ ์์ ์ ๋์ด๋ ์ธ์คํด์ค์ ์ ํด์์์ผ๋ก ์ธํ ๋น์ฉ์ ํฌ๊ธฐํ๋์ง SQS์ ํธ๋ค๋ฌ๊ฐ ์คํ ์ค์ผ์ผ๋ง๋๋ ์๊ฐ๋์ ๋ฉ์์ง๊ฐ ๋ฆ๊ฒ ์ฒ๋ฆฌ๋ ์ ์์์ ๊ฐ์ํด์ผ ํฉ๋๋ค.
SQS์ event handler๋ก node.js๋ก ๋ง๋ Lambda๋ฅผ ํ์ฉํ๋ฉฐ EC2, ECS์ ์คํ ์ค์ผ์ผ๋ง์ ๋นํด ํจ์ฌ ๋น ๋ฅธ ์ค์ผ์ผ์์์ ํ ์ ์์ผ๋ฉฐ JVM, .net์ ๋นํด cold start ์ด์์์๋ ๋น๊ต์ ์์ ๋ก์ธ ์ ์์ต๋๋ค.
์ด์์ผ๋ก๋ถํฐ์ ์์
๋ฌผ๋ก Kafka๊ฐ SQS์ ๋นํด ๋์ ์ฑ๋ฅ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ณด์ฌ์ฃผ๊ณ ์์ฝ์์คํ ์ด ๋ค์ํ ๊ฒ์ด ์ฌ์ค์ด์ง๋ง Kafka๋ฅผ ์ฅ์ ์์ด ์ด์ํ๊ธฐ ์ํด์ ๋ง์ ์ง์๊ณผ ๊ฒฝํ์ด ํ์ํฉ๋๋ค. AWS๋ฅผ ํตํด ์์ ํ ๋งค๋์ง๋๋ SQS๋ฅผ ์ ํํจ์ผ๋ก์จ Kafka๋ฅผ ์ด์ํ๋ค ๋ง์ฃผ์น ์ ์๋ ๋ชจ๋ํฐ๋ง, EBS ๋ณผ๋ฅจ์ด์, ์ฃผํคํผ ์ด์, ๋ธ๋ก์ปค ์ถ๊ฐ ์ค ์๋จ ๋ฑ ์๋ง์ ๋ฌธ์ ์์ ์์ ๋ก์ธ ์ ์์๊ณ ์ด๋ฐ ๋ฎ์ ๋ฌ๋์ปค๋ธ๋ฅผ ํตํด ๋ชจ๋ ํ์๋ค์ด ์์ํ๊ฒ SQS๋ฅผ ์ฌ์ฉํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค.
SQS ์ฌ์ฉ์ค ๋ง์ฃผํ ๋ฌธ์ ์
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ SQS๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ง์ฃผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฐ๋ก ํธ๋ค๋ง ํ์ง ์๋ ์ด์ ๊ณ์ ์ฌ์ฒ๋ฆฌ ์๋๋๋ ์คํจํ ๋ฉ์์ง
SQS์์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฃผ์ API๋ 3๊ฐ์ง ์ ๋๋ค.
- SendMessage : ๋ฉ์์ง๋ฅผ SQS์ producing ํฉ๋๋ค.
- ReceiveMessage : ๋ฉ์์ง๋ฅผ consume ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
- DeleteMessage : ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋ฉ์์ง๋ฅผ SQS ํ์์ ์ญ์ ํฉ๋๋ค.
SQS๋ ๋ฉ์์ง๊ฐ consume ๋์๋ค๊ณ ์ฆ์ ํ์์ ์ญ์ ๋์ง ์์ต๋๋ค. ํธ๋ค๋ฌ์์ ์ ์์ ์ผ๋ก ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋ ํ DeleteMessage Request๊ฐ ์์ด์ผ์ง๋ง ๋ฉ์์ง๊ฐ ํ์์ ์ญ์ ๋๋ฉฐ DeleteMessage Request๊ฐ ์๋ค๋ฉด ๋ฉ์์ง๋ SQS์ ์ค์ ๋ Visibility Timeout, Delay Seconds์ ๊ฑฐ์น ํ ๋ค์ ์๋น๋ ์ ์์ต๋๋ค.
Lambda์์๋ ๋ช ์์ ์ผ๋ก DeleteMessage๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ ์ ์์ ์ผ๋ก Lambda function์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ DeleteMessage Request๋ฅผ ๋ ๋ ค์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ Service ์ฝ๋ ๋ฑ์์ throw Error๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ Lambda๋ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ง ์๊ณ DeleteMessage๋ ๋์ง ์์ ์ผ์ ์๊ฐ ํ ๋ฉ์์ง๋ ๊ณ์ํด์ ์ฌ์ฒ๋ฆฌ๋๊ฒ ๋ฉ๋๋ค.
์ฌ์ฒ๋ฆฌ๋ฅผ ์๋ํด ๋ฉ์์ง๊ฐ ๋ค์ ์ฒ๋ฆฌ๋ ์ ์๋ค๋ฉด ๋คํ์ด์ง๋ง ์์ฐจ๋ก ์ฌ์๋ ํ์๋ ์ฒ๋ฆฌ๋์ง ์๋ ๋ฉ์์ง๋ ๋๊ฐ ์จ๋ํํฐ API ๋ฌธ์ ํน์ ์๋ชป๋ ๋ฐฐํฌ๋ก ์ธํ ์ฝ๋๋ฌธ์ ๋ฑ์ผ๋ก ๊ณ์ํด์ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด๋ฐ ์ํฉ์ด ์ง์๋๋ค๋ฉด SQS์ ๋์์ ์ฒ๋ฆฌ๊ฐ๋ฅํ ๋ฉ์์ง ์ limit์ผ๋ก ์ธํด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋์ง ๋ชปํ ์ ์์ต๋๋ค. Error๋ก ์ธํ ์๋์ ๊ฑธ์ด๋๋ค๋ฉด ๋ฌดํํ ์ธ๋ฆฌ๋ ์๋์ ๋ค์ ๋๋ค๐ญ
ํ์ธํ๊ธฐ ์ด๋ ค์ด ์คํจํ ๋ฉ์์ง ๋ ์ฝ๋
SQS์ ๋ฉ์์ง๊ฐ ํ์ ๋ค์ด์ Delay Seconds ๋์ ํน์ ReceiveMessage Request๋ฅผ ํตํด Visibility Timeout ๋์์ invisible ์ํ๋ก AWS console ์์ ๋ฉ์์ง์ ๋ ์ฝ๋ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ง์ฝ ๋ฉ์์ง๊ฐ ์ง์์ ์ผ๋ก ์คํจ๋ฅผ ํด ์ฌ์๋๊ฐ ์ผ์ด๋๊ณ ์๊ณ ์ดํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๋ก ์์ธ์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ๋ ์ฝ๋ ๋ด์ฉ์ ์ง์ ํ์ธํด ์๋ชป๋ ๊ฐ์ด ์๋์ง ์์ธ์ ์ฐพ์๋ณด๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์คํจํ ๋ฉ์์ง๋ฅผ ์ธ์ invisible ์ํ๊ฐ ์๋๋ผ ๋ณผ ์ ์๋์ง, ๋ณผ ์ ์๋ ๋ฉ์์ง๊ฐ ์๋ค ํ๋๋ผ๋ ์ ์์ ์ผ๋ก ์๋น๋๋ ๋ฉ์์ง์ธ์ง ์คํจํ ๋ฉ์์ง์ธ์ง ๊ตฌ๋ถํ ์ ์์ด์ ๋ฉ์์ง์ ๋ ์ฝ๋๋ฅผ ํ์ธ ํ ์ ์์์ต๋๋ค.
DLQ(DeadLetterQueue) ๋์
SQS๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ํ์๋งํผ ๋ฉ์์ง ์๋น๋ฅผ ์๋ ํ ๊ณ์ํด์ ์คํจํ๋ฉด ์คํจํ ๋ฉ์์ง๋ฅผ ๋ชจ์๋์ ์ ์๋ DLQ๋ฅผ ์ง์ํฉ๋๋ค. SQS DLQ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์์ ๋ง์ฃผํ SQS๋ฅผ ์ฌ์ฉํ ๋์ ๋ฌธ์ ์ ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ ์ ์์ต๋๋ค.
- DLQ์ ์คํจํ ๋ฉ์์ง๋ค์ด ๋ชจ์ฌ์๊ณ ์ด ๋ฉ์์ง๋ค์ ํญ์ visibleํ ์ํ์ด๋ฏ๋ก AWS console์์ ๋ฉ์์ง๋ฅผ receiveํด ๋ ์ฝ๋๋ฅผ ํ์ธํ ์ ์๋ค.
- ์ปจ์๋จธ์์ ์คํจํ์ ๋ ์๋์ ๋ณด๋ด๊ธฐ๋ณด๋จ DLQ๋ก ์ ์ก๋ ๋ ์๋์ ๋ณด๋ด๋ ๋ฐฉ์์ ํตํด ๊ณ์๋๋ ์๋์ ๋ฐ๋๊ฒ ์๋๋ผ 1ํ๋ง ์๋์ ๋ฐ์ ์ ์๋ค.
- ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋ด๋ถ ์ฝ๋, ์ธํ๋ผ, ์๋ํํฐ API ๋ฑ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค๋ฉด ํด๊ฒฐ๋ ํ DLQ์ ๋ฉ์์ง๋ฅผ Origin Queue๋ก Redriveํด ๋ค์ ์ ์์ ์ผ๋ก ์๋น์ํฌ ์ ์๋ค.
์ด๋ฌํ ์ฅ์ ๋ค ๋๋ฌธ์ ์ ํฌ ํ์์๋ ์ฆ์ DLQ๋ฅผ ๋์ ํด ๊ธฐ์กด์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ณ ์ ํ์ต๋๋ค.
DLQ ๊ตฌ์ฑํ๊ธฐ
๊ฐ๋จํ ์์ค์ฝ๋ ์์๋ฅผ ํตํด ์ด๋ป๊ฒ DLQ๋ฅผ ๊ตฌ์ฑํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
DLQ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ AWS console์ ํตํ๊ฑฐ๋ AWS CLI, CloudFormation ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์์์์๋ Lambda๋ฅผ ํ๋ก๋น์ ธ๋ ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ serverless framework๋ฅผ ํตํด SQS Queue, DLQ, Lambda Handler๋ฅผ ๊ตฌ์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Lambda Handler Source Code
lambda.ts
export const handler = async event => {
const app = await NestFactory.create(AppModule);
const helloFrommService = app.get(HelloFrommService);
try {
await helloFrommService.executeTestData(JSON.parse(event.Records[0].body));
} catch (e) {
// logging, alerting, etc...
throw e;
}
}
Lambda ํธ๋ค๋ฌ๋ DLQ๋ฅผ ์ฌ์ฉํ์ง ์์๋์ ์์ค์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
๋ค๋ง ์ง์ ๋ ํ์๋งํผ ๋ฉ์์ง๊ฐ ์ฌ์๋ ๋ ํ DLQ๋ก ๋ฉ์์ง๊ฐ ๋ณด๋ด์ง ๋์๋ง ์๋์ ๋ฐ๊ณ ์ถ๋ค๋ฉด catch ๋ธ๋ก ์์์ if (*event*.Records[0].attributes.ApproximateReceiveCount >= maxReceiveCount){ ...alert }
๋ฅผ ํตํด ์๋์ ๋ฐ์ ์ ์์ต๋๋ค.
serverless YAML config
serverless.yml
service: hello-fromm
provider:
name: aws
runtime: nodejs18.x
region: ap-northeast-2
memorySize: 1024
timeout: 60
tracing:
lambda: true
functions:
HelloFromm:
handler: src/lambda.handler
events:
- sqs:
arn:
Fn::GetAtt:
- HelloFrommQueue
- Arn
resources:
Resources:
HelloFrommQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: Hello-Fromm-Queue
VisibilityTimeout: 60
MessageRetentionPeriod: 2000 # should be less than or equal to HelloFrommDeadLetterQueue's MessageRetentionPeriod
RedrivePolicy:
deadLetterTargetArn:
Fn::GetAtt:
- HelloFrommDeadLetterQeueue
- Arn
maxReceiveCount: 5
HelloFrommDeadLetterQeueue:
Type: AWS::SQS::Queue
Properties:
QueueName: Hello-Fromm-DeadLetterQueue
MessageRetentionPeriod: 1209600 # 14 * 24 * 60 * 60 = 14 days, available range : 60 ~ 1209600
์์ ๊ฐ์ serverless.yml config file์ ํตํด lambda, SQS Queue, DLQ ๋ฅผ ๋ชจ๋ ํ๋ก๋น์ ๋ ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์
- SQS Queue์ DLQ๋ ๊ฐ์ ํ์ ์ด์ด์ผ ํฉ๋๋ค. ํ์ค๋๊ธฐ์ด์ DLQ๋ ํ์ค๋๊ธฐ์ด์ด์ด์ผ ํ๊ณ FIFO ํ๋ DLQ๋ FIFOํ์ฌ์ผ ํฉ๋๋ค.
- DLQ์ MessageRetentionPeriod๋ ํญ์ SQS Queue์ ๊ฐ๋ณด๋ค ์ปค์ผํฉ๋๋ค. SQS Queue์์ Record๋น ์นด์ดํธ๋๋ MessageRetentionPeriod๋ DLQ์์๋ ์ด๊ธฐํ๋์ง ์๊ณ ์ง์์ ์ผ๋ก ์นด์ดํธ๋ฉ๋๋ค. ์ฆ DLQ์ MessageRetentionPeriod ๊ฐ์ด SQS Queue์ MessageRetentionPeriod ๊ฐ๊ณผ ๊ฐ๊ฑฐ๋ ์์ผ๋ฉด DLQ๋ก ๋ฉ์์ง๊ฐ ์ด๋๋์ ๋ง์ retentionPeriod๊ฐ ๋๋ ์ฆ์ ์ญ์ ๋ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง fromm์๋น์ค์ SQS์ DLQ๋ฅผ ๋์ ํ๊ฒ๋ ๊ณผ์ ๊ณผ ๋ฐฉ๋ฒ์ ๊ฐ๋ตํ ์์๋ณด์์ต๋๋ค. ๋ค์๋ฒ fromm์ SQS์ DLQ - 2. Throughput์ ํจ๊ณผ์ ์ผ๋ก ๋๋ฆฌ๊ธฐ ์ํ Partial Batch ์ฌ์ฉ์์๋ SQS์ throughput์ ๋๋ฆฌ๊ธฐ ์ํ ๋ฐฉ๋ฒ๊ณผ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ partial batch failure๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ๊ธ์ ๊ด์ฌ์๊ฒ ์ฝ์ด์ฃผ์ ๋ชจ๋ ๋ถ๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค๐โ
๋น์ ์ ์์ ์ด ์ธ์์ ๋ฐ๊พผ๋ค.
์ ํฌ์ ํจ๊ป ์๋น์ค์ ํ์ง์ ๋์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๊ณ ํจ๊ป ์ฑ์ฅํด๋๊ฐ ๊ฐ๋ฐ์๋ฅผ ์ฐพ์ต๋๋ค. ๊ด์ฌ์์ผ์ ๋ถ๋ค์ ์ธ์ ๋ ์ง ์ง์๋ถํ๋๋ฆฝ๋๋ค๐