ํ›„๊ธฐ

Spring Camp (2025) ํ›„๊ธฐ

young-ji 2026. 1. 1. 15:08

spring camp

์ž‘๋…„์— ์ด์–ด ์˜ฌํ•ด๋„ 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

 


์Šคํ”„๋ง์บ ํ”„๋Š” ๊ธฐ์ˆ  ์Šคํƒ์ด ์ •ํ•ด์ ธ์žˆ์œผ๋ฉฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค๋„ ๋ฐœํ‘œ๋ฅผ ๋งŽ์ด ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ €๊ฐ™์€ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋„ ๊ฐ•์—ฐ์ด ๋ณด๋Š”๋ฐ ์–ด๋ ค์›€์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋ž˜๋„ ํ˜„์—…์—์„œ ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋“ค์„ ๋‹ค๋ฃจ๋Š” ์„ธ์…˜๋“ค์— ์œ ๋… ์ฃผ๋ชฉ์ด ๊ฐ”์—ˆ๋Š”๋ฐ, ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ์ž…์žฅ์—์„œ ๊ฒฉํ•˜๊ฒŒ ๊ณต๊ฐ์ด ๊ฐ€๊ธฐ๋„ ํ–ˆ๊ณ  ๋‹ค๋ฅธ ํšŒ์‚ฌ์—์„œ๋Š” ์–ด๋–ค์‹์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜์˜€๋Š”์ง€ ๋ณด๋ฉด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ์„ ๊ณ„์†ํ•ด์„œ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ฌํ•ด๋„ ์—ญ์‹œ๋‚˜ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋“ค์€ ์ปจํผ๋Ÿฐ์Šค์˜€๊ณ  ๋‚ด๋…„์—๋„ ๊ผญ ์ฐธ๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š”!