Spring Camp (2025) ํ๊ธฐ

์๋ ์ ์ด์ด ์ฌํด๋ Spring Camp์ ๋ค๋ ์์ต๋๋ค. ์ปจํผ๋ฐ์ค ๋น์ฒจ์ด์ ์๋ ํธ์ธ๋ฐ ์คํ๋ง์บ ํ๋ ์ด ์ข๊ฒ 2๋ ์ฐ์ ์ ์ ๋์๋ค์. (๋ด๋ ์๋ ์ ๋ถํ๋๋ฆฝ๋๋ค.)
Java + Spring ๊ฐ๋ฐ์๋ก์ ์คํ๋ง์บ ํ๋ ๋งค๋ฒ ์๋ก์ด ๊ธฐ์ ๊ณผ ํ์ ์์ ๊ณต๊ฐํ ๋งํ ๊ฒฝํ์ ์ ํ ์ ์๋ ์๋ฆฌ๋ผ ๊ธฐ๋๊ฐ ์ปธ์ต๋๋ค. ์ข์ ํค์๋ค์ด ๋ง์ ๊ธฐ์ต์ด ์ฌ๋ผ์ง๊ธฐ์ ์ ๋ฆ๊ฒ๋๋ง ์ผ๋ถ ์ธ์ ๋ด์ฉ์ ๊ธฐ๋กํด๋ด ๋๋ค.
Amazon Q Developer์ ํจ๊ป ํ๋ ์์ฑํ AI ์๋ ํค์ณ๋๊ฐ๊ธฐ
AWS์ ๊ฐ๋ฐ์์ธ ์ด์ํ๋๊ป์ ์์ฌ์ ์์ฑํ AI์ธ Amazon Q Developer์ ๊ดํด ์๊ฐํด ์ฃผ์ จ์ต๋๋ค.
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ด AI ์๋์ ๊ฐ๋ฐ ํจ๋ฌ๋ค์ ๋ณํํ๋ฉฐ AI ์๋๊ฐ ๋๋ํ์์ต๋๋ค. ์ปจํ ์ด๋์ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ํ์ฐฝ์ผ ๋๋ฅผ ์ง๋, ์ด์ ๋ ์์ฑํ AI์ LLM(๋ํ์ธ์ด๋ชจ๋ธ)์ ํ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ด ๋์ธ์ธ ๊ฒ์ ๋๊ตฌ๋ ์๋ ์ฌ์ค์ ๋๋ค.
์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ์์ฐํ AI ํฌ๋ฌ์ฑ์ ์ฝ๋ ์์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
Amazon Q Developer๋ ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ๋ฐ์๋๋ฅผ ํฅ์ ์์ผ์ฃผ๋ ๋์์ ์ฃผ๋ ํด์ด๋ผ๊ณ ํฉ๋๋ค. ์์ด์ ํธ๊ฐ ์์จ์ ์ผ๋ก ๊ธฐ๋ฅ๊ตฌํ์ ๋์์ฃผ๋ฉฐ ํ์ฌ 4๊ฐ์ง์ ์์ด์ ํธ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ์ฝ๋๊ฐ๋ฐ์ ์ํ ์์ด์ ํธ (/dev)
- ์ ๋ ํ ์คํธ ์ฝ๋ ์์ฑ ์์ด์ ํธ (/test)
- ๋ณด์ ์ทจ์ฝ์ ๋ฐ ์ฝ๋๋ฆฌ๋ทฐ ์์ด์ ํธ (/reivew)
- ๋ฌธ์ ์์ฑ ์์ด์ ํธ (/docs)
Q Developer๋ CLI ํด์ ์ง์ํ๋๋ฐ, idle์์ AI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์๋๊ฐ ํ์คํ ๋น ๋ฅด๋ฉฐ idle์ ์ข ์๋์ง ์์ ์ฝ๋๋ฅผ ๋ ์ ์งค ์ ์๋ค๊ณ ํฉ๋๋ค. ํ์์๋ ํ์ฌ ๋ฐ๊ณ ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ ์ถํ์๋ CLI ๊ฐ๋ฐ์ด ๋ ํธํด์ ธ ๊ฐ๋ฐ์๋ค์ด idel์ ์ฌ์ฉํ์ง ์๋ ๊ทธ๋ฆผ๊น์ง ๊ทธ๋ฆฌ๊ณ ๊ณ์ จ์ต๋๋ค.
(์ต๊ทผ ์ปค์์ ์ฝํ์ผ๋ฟ์์๋ CLI ํด์ ๊ณต๊ฐํ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. AI ๋ฐ์ ์๋๊ฐ ๋์ ๋๊ฒ ๋นจ๋ผ์ง๋ ๊ฒ ๊ฐ์์.)
๊ทธ ์ธ ์ฃผ์ ํ๋ํ ์๋๋ฆฌ์ค๋ก AI๋ฅผ ํตํ Java ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ด์ผ๊ธฐ ํ์ จ๊ณ , MCP๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ์ฅ์ฑ์ด ๋งค์ฐ ์ข์ผ๋ ๋ณด์์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ ๊ทน ์ฌ์ฉํด ๋ณด๊ธฐ๋ฅผ ๊ถ์ฅํ์ จ์ต๋๋ค.
Q Developer๋ ํ๋ฆฌํฐ์ด ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์๋ค๊ณ ํ์๋ ํ๋ฒ ์จ ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ธ๋ จํ๊ฒ ๋ฐํํ์๋ ๋ชจ์ต์ด ์ธ์์ ์ธ ์ธ์ ์ด์์ต๋๋ค.
์ฌ๋ฆฌ๋ธ์ ๋ฌผ๋ฅ์์คํ ๊ฐ์ ๊ธฐ
ํด๋น ์ธ์ ์ ๋ ๋ถ์ ๋ฐํ์๊ฐ ๋ฌผ๋ฅ ์์คํ ์ ์ด๋ป๊ฒ ๊ฐ์ ํ๋์ง ํํธ๋ฅผ ๋๋ ์์ฐจ์ ์ผ๋ก ์งํํด ์ฃผ์ จ์ต๋๋ค.
๋ค์ํ ํ๋งค ๋ฐฉ์(๋ฐฐ์ก, ๋ฐ๋ก๋๋ฆผ, ์คํ๋ผ์ธ ํ๋งค)์ ์ ๊ณตํ๋ ์ฌ๋ฆฌ๋ธ์์์ ๋ฌผ๋ฅ์์คํ ์ ๋จ์ํ ๋ฐฐ์ก์ ๋์ด ๊ณ ๊ฐ์ ๊ฒฝํ์ ์ข์ฐํ๋ ํต์ฌ ์์๋ผ๊ณ ํฉ๋๋ค.
1. Batch ์ค์ฌ์์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก์ ์ ํ
์ฌ๋ฆฌ๋ธ์ ๋ฌผ๋ฅ์์คํ ์ ํฌ๊ฒ ํ๋ ฅ์ฌ ๋ฐ์ฃผ๋ฅผ ํตํ ์ ๊ณ ์ ์ฃผ๋ฌธ ๊ด๋ฆฌ ์์คํ ์ ํตํ ์ฌ๊ณ ๋ก ๊ตฌ์ฑ๋๋ฉฐ ๊ธฐ์กด์๋ ๋ค์๊ณผ ๊ฐ์ด Batch์ EAI์ ์ํด ์ฌ๋ฌ ๋จ๊ณ์ ์ค์ผ์ค๋ก ์ด์ด์ง๋ ๊ตฌ์กฐ์์ต๋๋ค.
๋ฐ์ฃผ/์ฃผ๋ฌธ ํ
์ด๋ธ -> ์ธํฐํ์ด์ค ํ
์ด๋ธ -> EAI -> ๋ฌผ๋ฅ์ผํฐ ์ธํฐํ์ด์ค ํ
์ด๋ธ -> ์
๊ณ ์์ ํ
์ด๋ธ
๋ค๋จ๊ณ ์ค์ผ์ค ๊ตฌ์กฐ๋ก ์ด๋ค์ง๋ค๋ณด๋ ์ต๋ 1์๊ฐ ๋ฐ์ดํฐ ์ง์ฐ์ด ๋ฐ์ํ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ก์ธํด ์ค๋ฌผ ์ฌ๊ณ ์ ์์ฐจ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ ฅ์ฌ๊ฐ ์ ๊ณ ๋ฅผ ํฌ๊ธฐํ์ฌ ํ์กํ๋ ์ผ์ด์ค๊น์ง ๋ฐ์ํ๋ค๊ณ ํฉ๋๋ค. ๋ํ Batch ํน์ฑ์ ์ถ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํด ์์คํ ๋ถํ๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ๊ณ ์ฅ์ ๋ฐ์์ ๋ณต์กํ ๋จ๊ณ์ ๋ณต๊ตฌ๊ฐ ์๊ตฌ๋์ด ๋นํจ์จ์ ์ด์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฆฌ๋ธ์์ Batch ์์คํ ์ ๊ฑท์ด๋ด๊ณ Apache Kafka ๊ธฐ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ์ง์ ์ ํ์ ์งํํ์ต๋๋ค.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ก ๋ฌผ๋ฅ์ผํฐ๊น์ง ์ค์ค์๊ฐ ๋ฐ์ดํฐ ์ฐ๋ ๊ฐ๋ฅ
- Consumer์ ์ค๋ฅ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ฅ์ ๋ฅผ ์ฆ์ ๊ฐ์ง
- ์ค์๊ฐ ์ฒ๋ฆฌ๋ก ์ธํ ์์ ๋ณด์ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํํฐ์ ๋์ ์ฌ์ฉ. ์ฃผ๋ฌธ๋ฒํธ/์ํID ๊ธฐ๋ฐ ๋์ผ ํํฐ์ ์ผ๋ก ๋ผ์ฐํ
- ๋น์ฆ๋์ค ๋ก์ง์์ ์ค๋ณต ๋ฐฉ์ง ์ฒ๋ฆฌ ์ถ๊ฐ. ๋ฉ์ธ์ง ID ๊ธฐ๋ฐ ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ
2. ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ์ฒด๊ณ ๊ตฌ์ถ
Batch ๊ตฌ์กฐ์ ๋๋ค๋ฅธ ๋ฌธ์ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ง์ฐ ํน์ ๋๋ฝ๋ ์ํ์์ Batch๊ฐ ์คํ๋๋๋ผ๋ ์คํจ(FAIL)๋ก ์ธ์๋์ง ์์ ๋ฌธ์ ๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ์ธ์งํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฒคํธ ๊ธฐ๋ฐ ์ ํ์ผ๋ก ๋ฌธ์ ์ ์๋น ๋ถ๋ถ ํด์๋์์ง๋ง, ๊ทธ๋ผ์๋ ์ถ๊ณ ์ฒ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์ด๋คใ ใ ์ง๊ณ ์๋์ง ๊ฐ์์ ์ผ๋ก ํ์ธํ ์ ์๋ ์ฒด๊ณ๊ฐ ํ์ํ์ต๋๋ค.
- ์ด์ ์งํ๋ฅผ ์กฐ๊ธฐ ๊ฐ์งํ ์ ์๋๋ก ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋์
- ์ฒ๋ฆฌ์จ์ด ๊ธฐ์ค์น(99%)์ดํ๋ก ๋จ์ด์ง ๊ฒฝ์ฐ ์จ์ฝ ์์คํ
์ผ๋ก ์๋ ์๋ ๋ฐ์ก
- ์ค๋ฅ๋ S3 ๋ฒํท์ ์ ์ฅ → Lambda๋ฅผ ํตํด ์๋ ์ ๋ฌ
- Datadog ๊ธฐ๋ฐ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ์ฌ ์๋ฒ ์ ์ ์์ด๋ ๋น ๋ฅด๊ฒ ์ํ ํ์
- ์ฒ๋ฆฌ ๋ฐ์ดํฐ ๊ฐ์, ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ ์๊ฐํ
3. Redis ๊ธฐ๋ฐ ์คํ๋ผ์ธ ์ฌ๊ณ ๊ตฌ์กฐ ๊ฐ์
์ฌ๋ฆฌ๋ธ์์ ์ฌ๊ณ ๋ฅผ ์จ๋ผ์ธ ์ฌ๊ณ (๋ฌผ๋ฅ์ผํฐ)์ ์คํ๋ผ์ธ ์ฌ๊ณ (๋งค์ฅ)๋ก ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๋๋ฐ ์คํ๋ผ์ธ ์ฌ๊ณ ์ ๊ฒฝ์ฐ ์จ๋ผ์ธ ์ฌ๊ณ ๋ณด๋ค 500๋ฐฐ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ํฉ๋๋ค.
‘์ค๋๋๋ฆผ’ ์๋น์ค์ ๊ฒฝ์ฐ ์จ๋ผ์ธ์ผ๋ก ์ฃผ๋ฌธ์ ํ์ง๋ง ์คํ๋ผ์ธ ๋งค์ฅ์์ ์ถ๊ณ ๋๊ธฐ ๋๋ฌธ์ ์คํ๋ผ์ธ ์ฌ๊ณ ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ๋๊ท๋ชจ ์ด๋ฒคํธ๊ฐ ์์๋ ๋ง๋ค Read/Write ์์ ์ด ๋ง์ ์คํ๋ผ์ธ ์ฌ๊ณ API ๋ถํ๊ฐ ์ง์ ์ ์ธ ๋ณ๋ชฉ์ ์์ธ์ด ๋์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Redis ๊ธฐ๋ฐ Read ๊ตฌ์กฐ๋ฅผ ๋์ ํ์๋ค๊ณ ํฉ๋๋ค. ์คํ๋ผ์ธ ์ฌ๊ณ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Oracle์ Writeํ ๋ค Redis๋ก ๋ฉ์ธ์ง๋ฅผ ๋ฐํํด ์บ์๋ฅผ ๊ฐฑ์ ํ๋ ๊ตฌ์กฐ์ ๋๋ค.
Redis๋ฅผ ๋์ ํ๋ฉด์ ๊ณ ๋ คํ์๋ 3๊ฐ์ง ํต์ฌ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋์์ฑ ์ ์ด ๋ฌธ์
- Redis๋ row-lock์ด ์๊ธฐ๋๋ฌธ์ ๋ณตํฉ ์ฐ์ฐ ์ ์ ํฉ์ฑ์ด ๊นจ์ง ์ ์์
- Redisson ๊ธฐ๋ฐ ๋ถ์ฐ๋ฝ์ ์ปค์คํ ์ด๋ ธํ ์ด์ ํํ๋ก ๊ตฌํ
- ์กฐํ ์ฑ๋ฅ ๋ฌธ์
- ๋ฉ๋ชจ๋ฆฌ๊ธฐ๋ฐ db์ธ Redis๋ ๋จ๊ฑด ์กฐํ์์ Oracle๋ณด๋ค ํ์คํ ์ฑ๋ฅ์ด ์ข๋ค.
- ํ์ง๋ง ‘ํน์ ๋งค์ฅ์ ์ ์ฒด ๋งค์ฅ ์ฌ๊ณ ์กฐํ’์ ๊ฐ์ด ๋ค๊ฑด ์กฐํ ์์ฒญ์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ Oracle๋ณด๋ค ์ฑ๋ฅ ์ ํ ๋ฐ์ใ
- ์กฐํ ๋ชฉ์ ์ ๋ง์ถ 3๊ฐ์ง ํํ์ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ
- ๊ฐ์ ํ ์กฐํ API ์ฝ 10๋ฐฐ ์ฑ๋ฅ ํฅ์
- ์์ ์ฑ ๋ฌธ์
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ + ํด๋ผ์ฐ๋ ํ๊ฒฝ ํน์ฑ์ ์ฅ์ ๊ฐ๋ฅ์ฑ์ด ๋์
- ์ฅ์ ์ Oracle๋ก ์ฆ์ fallbackํ๋ Circuit Breaker ํจํด ์ ์ฉ
- try-catch ๊ธฐ๋ฐ ๋ณต๊ตฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ ํ ๊ฐ๋ฅ
ํฅํ ๋จ์์๋ ๊ณผ์ ์ธ Redis–Oracle ๊ฐ Batch ๊ธฐ๋ฐ ์ฑํฌ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋๋ CDC(Change Data Capture) ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ ์์ ์ด๋ผ๊ณ ํฉ๋๋ค.
์ฌ๋ฆฌ๋ธ์ ๋ฌผ๋ฅ ์์คํ ์ ํ์ฌ๊น์ง๋ ์ ์ง์ ์ธ ๊ฐ์ ์ ์งํํ๊ณ ์์ผ๋ฉฐ ๋จ์ํ ๊ตฌ์กฐ ๊ฐ์ ์ด ์๋, ํ์ฅ์ ๊ฒฝํ๊ณผ ๊ณ ๊ฐ ๋ง์กฑ๋๋ฅผ ๋์ด๊ธฐ ์ํ ์ง์์ ์ธ ๊ฐ์ ์ ์ฌ์ ์ด๋ผ๊ณ ์ค๋ช ํด์ฃผ์ จ์ต๋๋ค.
์ด๋ฒ ์บ ํ์ ์ฌ๋ฆฌ๋ธ์์ด ๊ณจ๋ ํ์์๊ธฐ์ด๊ธฐ๋ ํ๊ณ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์๋ ์ธ์ ์ด ์๋์์๊น ํ๋ค์. ์ ํฌ ํ์์๋ Batch ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์ข์ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์๋ ์๊ฐ์ด์์ต๋๋ค. (์ธํ๋ผ ์ง์์ด ์ ๋๋ค๋ ๊ฒ์ ์ ๋ง ๋ถ๋ฝ๋ค์ใ ใ )
์ฌ๋ฆฌ๋ธ์ ํ ํฌ ๋ธ๋ก๊ทธ์ ๊ด๋ จ ๊ธ์ด ์๋ ๊ฒ ๊ฐ์ ๋งํฌ ๋จ๊ธฐ๊ฒ ์ต๋๋ค.
https://oliveyoung.tech/2024-10-17/oy-delivery-mq
์ฌ๋ฆฌ๋ธ์ ๋ฌผ๋ฅ์์คํ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฃผ๊ณ ๋ฐ์๊น? | ์ฌ๋ฆฌ๋ธ์ ํ ํฌ๋ธ๋ก๊ทธ
Message Queue๋ฅผ ์ ์ฉํด ๋ฆฌ๋ด์ผํ ์ฌ๋ฆฌ๋ธ์ ๊ฐ๋ฐํ์ ์ด์ผ๊ธฐ
oliveyoung.tech
์นด์นด์ค๋ฑ ํฌ ํ๋์์คํ ์ ๋ ๊ฐ๋ฅผ ๋ฌ์์ค, ์ฌ๋ด Spring Boot Starter ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ผ๊ธฐ
ํด๋น ์ธ์ ์ ์นด์นด์ค๋ฑ ํฌ์ ๋จ์ผ ์ํ ์์คํ ์์ ํ๋์์คํ ์ ๋ถ๋ฆฌ ๊ตฌ์ถํด๋ด๋ฉฐ, ๊ทธ ๊ณผ์ ์์ ๋ง๋ค์ด์ง ์ฌ๋ด Spring Boot Starter ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ณต์ ํด ์ฃผ์ จ์ต๋๋ค.
์นด์นด์ค๋ฑ ํฌ์์๋ ๊ธฐ์กด์ ๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์์๋๋ฐ ์ฅ์ ํ์ฐ, ๋น๋ ์๋ ์ ํ, ์ฝ๋ ํ์ ์ ์ด๋ ค์ ๋ฌธ์ ์ ๋ค์ ์ง๋ฉดํ๋ฉฐ ์ ์ง์ ์ผ๋ก MSA๋ก ์ ํ ์ค์ด๋ผ ํ์์ต๋๋ค.
ํ์ง๋ง ๊ธ์ต๊ถ ํน์ฑ์ ๊ท์ ๊ฐ ๋ง์, ๋จ์ํ ํด๋ผ์ฐ๋ ํ๊ฒฝ ์์ ์คํ์์ค Spring์ผ๋ก ์๋ฒ๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ฝ์ง ์์์ต๋๋ค. ์์ฉ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์๋ ์ปค์คํ ์ด ํ๋ค๊ณ ๊น์ ์ข ์์ฑ์ผ๋ก ์ ์ง๋ณด์๊ฐ ํ๋ค๋ค๋ ๋ฌธ์ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฌธ์ ๋ค์ ๊ณ ๋ คํด, ์ํ ๊ตฌ์กฐ๋ฅผ “์ฝ์ด ๋ฑ ํน/ ์ฑ๋๊ณ(๊ณ ๊ฐ ์ ์ )/ ์ด์ ์ ๋ฌด ํด”๋ก ๋ถ๋ฆฌํ๊ฒ ๋์๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฌํ ๊ณผ์ ์์ ํ๋ก์ ํธ๋ฅผ ์ ๊ท ๊ตฌ์ถํ๋ฉฐ ๋ฐ๋ณต๋๋ Spring ํ๋ก์ ํธ ์ธํ ์์ ๊ณผ ๊ทธ ์ธ ๊ณตํต ๊ด์ฌ์ฌ๋ค์ ๋ถ๋ฆฌํ๊ฒ ๋์๊ณ ๊ทธ๊ฒ์ด ์ฌ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Spring Boot Starter ์ ๋๋ค. Spring Boot Starter์ ์ฃผ์ ๊ตฌํ ๊ธฐ๋ฅ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ ๋ค์ด ์์ต๋๋ค.
- ์ง๋ ฌํ/์ญ์ง๋ ฌํ(FixedLength Module)
- ๊ธฐ์กด JSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๊ณ , ์ง์ ๋ง๋ ์๋ฆฌ์ผ๋ผ์ด์ฆ/๋์๋ฆฌ์ผ๋ผ์ด์ฆ ๊ธฐ๋ฅ์ ์ถ์ํ
- ๊ธ์ต ๋ฐ์ดํฐ ํนํ ํ์(FixedLength) ์ฒ๋ฆฌ๋ฅผ ์ง์
- ์ฌ๋ด HTTP Client
- ์ฌ๋ด ์์คํ ๊ฐ ์์ ํ ํต์ ์ ์ํด ๊ณตํต ๊ท๊ฒฉํ
- RestClient, WebClient, RestTemplate ๋ฑ ํด๋ผ์ด์ธํธ ์ข ๋ฅ ํต์ผ
- ์์ฒญ ์ /ํ ๊ณตํต ๋ก์ง ์ถ๊ฐ ํฌ์ธํธ ์ ๊ณต → ํ๋ก์ ํธ๋ณ ์์ ๋ก์ด ํ์ฅ ๊ฐ๋ฅ
- ์ฑ ์ ์ฐ์ ํจํด(Chain of Responsibility) ํ์ฉ์ผ๋ก ์ ์ฐ์ฑ ํ๋ณด
- ๋ถ์ฐ ํธ๋ ์ด์ฑ(Opentelemetry ๊ธฐ๋ฐ)
- ๋จ์ ์์คํ ๊ฐ ์์ฒญ ์ถ์ ๋ฐ ์๋ฌ ์์ธ ํ์ ์ด๋ ค์ ํด๊ฒฐ
- Trace Id, Span Id ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ ๊ณ์ธก
- Context ์ ํ(Baggage) ๊ฐ๋ ์ ํ์ฉ, ์ด๋์๋ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
- ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด์๋, ์ฌ๋ด ํธ์ ๊ธฐ๋ฅ์ ์ถ์ํํ์ฌ ์ฌ์ฉ์ฑ ๊ฐํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ๋๋ฉ์ธ์ ์ง์คํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ผ ์ ์์๋ค๊ณ ํฉ๋๋ค.
์๋น์ค๊ฐ ์ปค์ ธ๊ฐ๋ฉด์ ๊ผญ ํ๋ฒ์ ๊ณ ๋ฏผํ๊ฒ ๋๋ ๋ถ๋ถ์ธ๊ฒ ๊ฐ๋ค. ๊ธ์ต๊ถ ๋๋ฉ์ธ์ ์ ํ๋ ํ๊ฒฝ์์์ ๊ณ ๊ตฐ๋ถํฌ๊ฐ ๊ณต๊ฐ์ด ๋์๊ณ ๋ด์ฉ ์ค์ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋ฅผ ๋ด๋นํ๋ ์ ํธ์ ๋ค์ํ ํฌ๋งท์ ์ ๋ฌธ์ ๋ค๋ฃจ๋ ์ ํฌ ํ์์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋น ๋ฑ ๋ฐฉ์์ผ๋ก ์ต์ ์ ๊ฐ๋ฐํ๊ธฐ
SI ์ ์ฒด์์ ๊ทผ๋ฌดํ์๋ ๊ทผ์๋๊ป์ ๋น ๋ฑ ๋ฐฉ์์ ๊ฐ๋ฐํ๊ฒฝ์์ ์ต์ ์ ๊ฐ๋ฐ์ ํ๊ธฐ ์ํด ์คํํ์๋ ๋ ธ๋ ฅ๋ค์ ๋ํด ๋ฐํํด์ฃผ์ จ์ต๋๋ค.
๋น ๋ฑ ๋ฐฉ์์ ์ค๋๋ ๊ฐ๋ฐ๋ก ์ผ๋ก ๋จ์๋ณ๋ก ๊ธฐ๋ฅ์ ์ชผ๊ฐ์ด ๊ฐ๋ฐํ๋ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ฒ์๋ถํฐ ๋๊น์ง ํ๋ฒ์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. SI ํน์ฑ์ ์งง์ ๊ธฐ๊ฐ์ ๋ง์ ์์ ๊ฐ๋ฐ์ ํด์ผํ๋ฉฐ, ํด๋ผ์์ธํธ๋ ์๊ตฌ์ฌํญ์ ์ ๋ชจ๋ฅด๊ฑฐ๋ ์ค๋ช ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ํฉ๋๋ค.
์ด๋ฌํ ํ๊ฒฝ์์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด์ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ์๊ตฌ์ฌํญ ๋ถ์, API ๋ช ์ธ ์์ฑํ๊ธฐ, ๋ฉํฐ๋ชจ๋ ๋์ ๋ฑ์ ๋ฐฉ๋ฒ์ ๋ง์ํด์ฃผ์ จ์ต๋๋ค.
ํธ๋ฆฌ ๊ตฌ์กฐ ๋๋ฉ์ธ ๋ถ์์ ๊ดํ ์์์ ๋๋ค.

- ํ๋ก์ ํธ๋ฅผ ํธ๋ฆฌ ํํ๋ก ์ ๋ฆฌ. ์ผ์ชฝ์์ ์์ํ์ฌ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ป์ด๋๊ฐ๋ ํธ๋ฆฌ ํํ์ ๋๋ค.
- ์ต์์ ๊ฐ๋ ์ ์ค์ ํ๊ณ ๊ฐ๋ ์ ๋ํ ๋ช ํํ ์ ์๋ฅผ ํฉ๋๋ค
- ์ด๋ ๋ฌด์์ด ์์ ๊ฐ๋ ์ธ์ง ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์๋ชป๋ ์์์ ์๋ชป๋ ์ค๊ณ๋ฅผ ์๋ฏธํ๋ฉฐ ๋ชจ๋ ๊ธฐํ์ ๋ ผ๋ฆฌ์ ์ธ ์ค๋ฅ ๋ฐ์ํ์ง ์์ ๋๊น์ง ์ง์์ ์ธ ์์ ๊ณผ ๊ฒ์ฆ์ ์งํ
์ ๋ฆฌ๊ฐ ๊ต์ฅํ ๊น๋ํ์ฃ ? ๊ทผ์๋๊ป์ ์ฌ์ฉํ์๋ ์ฑ์ ์ ๋ฃ๋ก ๊ตฌ๋ ์ค์ธ Edrawmind๋ผ๊ณ ํฉ๋๋ค.
ํธ๋ฆฌ๊ตฌ์กฐ ์ ๋ฆฌ ๋ฐฉ์์ด ์ธ์์ ์ผ๋ก ๋ค๊ฐ์์ต๋๋ค. ํ์ฌ ์ ํฌ ํ์ ์ฃผ์ ์ ๋ฌด๋ ๊ธฐ์กด์ ๋ ๊ฑฐ์ํ ์๋น์ค๋ค์ ํ๋์ ํตํฉ์์คํ ์ผ๋ก ๋ด์ฌํํ๋ ๊ฒ ์ ๋๋ค. ๋ฐฉ๋ํํ๊ณ ๋ณต์กํ ์์คํ ์์ ๋๋ฉ์ธ์ ํ์ ํ๋๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์์๋๋ฐ ์ ํฌ ํ์๋ ํธ๋ฆฌ์ ์ ๋ฆฌ ๋ฐฉ์์ด ๋๋ฉ์ธ์ ์ดํดํ๋๋ฐ ํจ์จ์ ์ด๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์ฃผ์ด์ง ํ๊ฒฝ์์ ๊ฐ๋ฐ๋ฌธํ๋ฅผ ๊ตฌ์ถํด๋์๊ฐ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ ๋ชจ์ต์ด ์ธ์์ ์ธ ์ธ์ ์ด์์ต๋๋ค.
์ ๋๋ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ซ์๊น?(2024)
ํด๋น ์ธ์ ์ ์๋ Spring Camp(2024)์์ ๊ฐ์ฅ ์ธ์ ๊น๊ฒ ๋ค์๋ ๋ฐํ๋ผ ์ด๋ฒ ํฌ์คํ ์ ํจ๊ป ๊ธฐ๋กํฉ๋๋ค. ์ ์ญ์ ํ ์คํธ ์ฝ๋์ TDD๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์๋ก์, ํ ์คํธ์ ๋ํ ์ด์ฌ์ ๋ค์ ๋ ์ฌ๋ฆด ์ ์๋ ์๊ฐ์ด์์ต๋๋ค.
๋ค์ด๋ฒํ์ด์ ์กฐ์ฑ์๋์ ๋ณธ์ธ์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก, ๊ฐ๋ฐ์๋ค์ด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ซ์ด์ง๋ ์ด์ ์ ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ด์ผ๊ธฐํด์ฃผ์ จ์ต๋๋ค. ๋ค์ด๋ฒํ์ด๋ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ์ค์ํ ์๋น์ค๋ก ์ด๊ธฐ๋ถํฐ ํ ์คํธ ๋ฌธํ๊ฐ ์ ์๋ฆฌ ์ก์ ํ์ด์๋ค๊ณ ํฉ๋๋ค. ์์ฐ์ค๋ฝ๊ฒ ํ ์คํธ ์ฝ๋ ์์ฑ์ ๋ชฐ์ ํ๊ฒ ๋์๊ณ , ํ ์คํธ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ JVM ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ํฝ์ฒ์ค ๋ชฝํค(Pictures Monkey)๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์๋ค๊ณ ํฉ๋๋ค.
ํฝ์ฒ์ค ๋ชฝํค๋ฅผ ํ์ฉํ๋ฉด์ ๋ค์ํ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ฐ๊ฒฌํ ์ ์์๊ณ , DomainFixture๋ฅผ ํตํด MSA ํ๊ฒฝ์ API๋ฅผ ๋ชจํน, ์ ์ดํ๋ฉด์ ๊ธฐ๋ฅ ํ์ฅ์ ๋ํ ๊ธฐ๋๋ ์ปค์ก๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ฐ์ด ํ๋ฅด๋ฉฐ ํผํ ์ ์๋ ์ ์ง๋ณด์์ ๋ฒฝ์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค.
ํ ์คํธ๊ฐ ์์ฃผ ๊นจ์ง๋ฉฐ ์ ๋ขฐ์ฑ์ ์๊ฒ ๋์๊ณ ๋น๊ฒฐ์ ํ ์คํธ(Non-deterministic Test) ๋ฌธ์ ๋ก ํ ๋ด ๊ณต์ ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ก์ผ๋ฉฐ ํ ์คํธ ๋ ๋ฒจ์ ์ฌ๋ ค์ฃผ๋ DomainFixture๋ ์คํ์ด ๋์ด๋ ๋๋ง๋ค ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ์ฆ๊ฐํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ด๋ฌํ ๊ณผ์ ์์์ ํ ์คํธ ์์ฑ์ ๋ํ ์ด์ ์ด ์ฌ๊ทธ๋ผ๋ค์๊ณ ํ ์คํธ์ ์ด๋๊ณผ ๋น์ฉ์ ๋ํด ์ง์งํ๊ฒ ๊ณ ๋ฏผํ๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค๊ณ ํฉ๋๋ค.
์กฐ์ฑ์๋๊ป์ ๋ฐํํด์ฃผ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ซ์ด์ง๋ ์ด์ ์ ๊ทน๋ณต ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ
์คํธ ์์ฑ์ด ์ซ์ด์ง๋ ์ด์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ผ๋ก ์์ฑ ๋น์ฉ์ด ๋ฎ์์ก์ง๋ง ๊ทธ๋ก์ธํด ๋์ด์ง ํ ์คํธ ๋ฒ์
- ๋๋ฉ์ธ ํน์ฑ์ ๋ชจ๋ ์ฝ๋๋ฅผ ํ ์คํธ ํด์ผํ๋ค๋ ๊ฐ๋ฐ
- DomainFixture ์ ์ง๋ณด์ ๋น์ฉ
์ฌ๋๋ค์ด ํ ์คํธ ์์ฑ์ ํ๋ค์ดํ๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ํ ์คํธ๊ฐ ์ ๊ณตํ๋ ์ด๋๋ณด๋ค ๋น์ฉ์ด ๋ง์ด ๋ค๊ธฐ๋๋ฌธ์ ๋๋ค.
์์ฑ ๋น์ฉ + ์ ์ง๋ณด์ ๋น์ฉ > ํ ์คํธ๊ฐ ์ ๊ณตํ๋ ์ด๋
- ํ
์คํธ ํ๋ผ๋ฏธ๋ ๊ธฐ์ค ๋น์ฉ ๊ตฌ๋ถ
- E2E : ๋ฆฌ์ผ ํ๊ฒฝ์์ ์ด์์ด ์๋๊ฐ → ๋น์ฉ์ด ๊ฐ์ฅ ํผ
- Integration : ๊ธฐ๋ฅ์ด ์๋๋๋ก ํ๋ ฅํ๋๊ฐ. ๋ค์ํ ์๋๋ฆฌ์ค ํ ์คํธ
- Unit : ๊ธฐ๋ฅ์ด ์๋ ๋๋ก ๋์ํ๋๊ฐ.
ํ ์คํธ ๋จ์๊ฐ ์์์ ์๋ก ๋น์ฉ์ด ์ค๊ธฐ๋๋ฌธ์ ๋จ์ ํ ์คํธ๋ก ์ต๋ํ ๋ง์ ๊ฒฝ์ฐ์ ์๋ฅผ ํ ์คํธ ํด๋ณผ ์ ์์ต๋๋ค. ์กฐ์ฑ์๋์ ํนํ ๋น์ฉ์ด ๋ง์ด๋๋ ์ธ์ ํ ์คํธ๋ ๋ถ๋ฆฌํ์ฌ ๋ฐ๋ก ๊ด๋ฆฌํ๊ณ ๋ก์ปฌ ๋ณด๋ค๋ CI์์๋ง ์คํํ๋๋ก ํ์ฌ ์์ฐ์ฑ์ ํฅ์ ์์ผฐ๋ค๊ณ ํฉ๋๋ค.
- ๋ถํ์ํ ๋น์ฉ ์ ๊ฑฐํ๊ธฐ
- Given ๋จ๊ณ๊ฐ ๋ณต์กํ ํ ์คํธ → ์์ฑ ๋น์ฉ ์ฆ๊ฐ
- Then ๋จ๊ณ์์ ๋๋ฌด ๋ง์ ๊ฒ์ฆ ์ํ → ์ ์ง๋ณด์ ๋น์ฉ ์ฆ๊ฐ
- ๋ํ์ ์ธ ์ฌ๋ก:
- ํ์ํ์ง ์์ ๋ฆฌ์คํธ ์์๋ฅผ ํ ์คํธ๋ฅผ ์ํด ์ฌ๋ฌ ๊ฐ ๋ฃ๊ธฐ
- ํ๋์ ํ ์คํธ์์ ์ ์ถ๊ธ ๊ฒ์ฆ + ๊ณ์ข ๊ฒ์ฆ๊น์ง ๋ชจ๋ ์ฒ๋ฆฌํ๊ธฐ
ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ฉด assert๋ฌธ์ ์๊พธ ์ถ๊ฐํ๊ณ ์ถ์ ์๊ตฌ๊ฐ ์๊ธฐ๋๋ฐ ๊ทธ๊ฒ์ ์ ์ง๋ณด์์ ๋ช์ ๋น ์ง๋ ์ง๋ฆ๊ธธ ์ ๋๋ค. ํต์ฌ ์์น์ Less Is More! ํ์ํ ํ ์คํธ๋ง ์ต์ํ์ผ๋ก ์์ฑํ๋๊ฒ์ ๋๋ค. ์ปดํฉํธํ ํ ์คํธ๋ฅผ ์์ฑ์ ์์ฑ๊ณผ ์ ์ง๋ณด์ ๋น์ฉ์ ์ค์ด๋ฉฐ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
ํ ์คํธ ๊ถํ๊ธฐ๋ ๋๊ตฌ์๊ฒ๋ ์ฌ ์ ์์ต๋๋ค. ํด๋น ์ธ์ ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ๋ฒ๊ณผ ๋๊ตฌ๋ฅผ ํตํด์ ๊ทธ๋ฌํ ๋ฌธ์ ๋ฅผ ์ถฉ๋ถํ ๊ทน๋ณตํ ์ ์๋ค๋ ๋ฉ์ธ์ง๋ฅผ ์ ํด์ฃผ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ํฝ์ฒ์ค ๋ชฝํค๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ ๋ ์ธ์ ์ดํ ์ค์ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํฝ์ฒ์ค ๋ชฝํค(MonkeyFixture)๋ฅผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก Reflection์ ์ฌ์ฉํ์ฌ์ ์ธ์ง ๋๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋๋ฐ๋ ์๋ ์ธก๋ฉด์์ ํ๊ณ๊ฐ ์์ง๋ง ์ปค์คํ ์ด ์ฝ๊ณ ๋๋คํ ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋ค๋ ์ ์์ ์์ผ๋ก๋ ์ข ์ข ์ฌ์ฉํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ข์ ์คํ์์ค๋ฅผ ์ ๊ณตํด์ฃผ์ ์ ๊ฐ์ฌํ ๋ฐ๋ฆ์ ๋๋ค.
ํฝ์ฒ์ค ๋ชฝํค(MonkeyFixture) ์คํ์์ค : https://github.com/naver/fixture-monkey
GitHub - naver/fixture-monkey: Let Fixture Monkey generates fully-customizable, randomly populated instance. Focus on the proper
Let Fixture Monkey generates fully-customizable, randomly populated instance. Focus on the properties of the class that really matter in your test. - naver/fixture-monkey
github.com
์คํ๋ง์บ ํ๋ ๊ธฐ์ ์คํ์ด ์ ํด์ ธ์์ผ๋ฉฐ ์ฃผ๋์ด ๊ฐ๋ฐ์ ๋ถ๋ค๋ ๋ฐํ๋ฅผ ๋ง์ด ํ๊ธฐ๋๋ฌธ์ ์ ๊ฐ์ ์ฃผ๋์ด ๊ฐ๋ฐ์๋ ๊ฐ์ฐ์ด ๋ณด๋๋ฐ ์ด๋ ค์์ด ์์์ต๋๋ค.
์๋ฌด๋๋ ํ์ ์์ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ค์ ๋ค๋ฃจ๋ ์ธ์ ๋ค์ ์ ๋ ์ฃผ๋ชฉ์ด ๊ฐ์๋๋ฐ, ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ ์ฅ์์ ๊ฒฉํ๊ฒ ๊ณต๊ฐ์ด ๊ฐ๊ธฐ๋ ํ๊ณ ๋ค๋ฅธ ํ์ฌ์์๋ ์ด๋ค์์ผ๋ก ๊ทธ๋ฌํ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ์๋์ง ๋ณด๋ฉด์ ์ ์ฉํ ์ ์๋ ์ ์ ๊ณ์ํด์ ์๊ฐํ๊ฒ ๋์์ต๋๋ค.
์ฌํด๋ ์ญ์๋ ์ฌ๋ฏธ์๊ฒ ๋ค์ ์ปจํผ๋ฐ์ค์๊ณ ๋ด๋ ์๋ ๊ผญ ์ฐธ๊ฐํ ์ ์์์ผ๋ฉด ์ข๊ฒ ๋ค์!