/images/profile.png

โ€˜์ค‘๋‹ˆ์–ด ๊ฐœ๋ฐœ์žโ€™์˜ 2020 ํšŒ๊ณ 

๏ปฟใ€€๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค๋„ ์ •์‹ ์—†์ด ๋‹ฌ๋ ค์˜จ 2020๋…„. ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ๋„ ๋งŽ์•˜๊ณ  ํฐ ๊ฟˆ์„ ๊พธ๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ํ˜„์‹ค์˜ ๋ฒฝ ์•ž์— ํฌ๊ฒŒ ์ขŒ์ ˆ๋„ ํ•ด๋ณด๊ธฐ๋„ ํ•˜๊ณ . ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์„ธ์ƒ์˜ ๋ณ€ํ™”์— ์ ์‘ํ•˜๋žด ์ •์‹ ์ ์œผ๋กœ ์œก์ฒด์ ์œผ๋กœ ๋„ˆ๋ฌด ๋งŽ์ด ํž˜๋“ค์—ˆ๋˜ ์˜ฌํ•ด. ๋Œ์•„๋ณด๋ฉด ์ฐธ ํ›„ํšŒ๊ฐ€ ๋˜์ง€๋งŒ ํ•œํŽธ์œผ๋ก  ์‹œ๋ จ๊ณผ ์ขŒ์ ˆ ์†์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ๋ฐฐ์› ๋˜ ๊ทธ๋Ÿฐ ํ•œ ํ•ด๋ฅผ ๋ณด๋‚ธ ๊ฒƒ ๊ฐ™๋‹ค. ใ€€๏ปฟํ•„์ž๋Š” ๋‚ด๋…„์ด ๋˜๋ฉด ์ด์ œ ์–ด๋Š๋ง ๊ฐœ๋ฐœ์ž ์ƒํ™œ์„ ํ•œ ์ง€ 9๋…„ ์ฐจ๊ฐ€ ๋œ๋‹ค. ๋ณดํ†ต ์ฃผ๋‹ˆ์–ด๋ผ ํ•จ์€ ๋‹จ์ˆœํ•˜๊ฒŒ ์ด์ œ ๋ง‰ ์ทจ์—…ํ•œ ์‹ ์ž… ๋˜๋Š” 3~5๋…„ ์ฐจ๋ฅผ ๋งํ•˜๊ณ  ์‹œ๋‹ˆ์–ด๋Š” ์—ฐ๋ด‰์ด X ์›์„ ๋„˜๊ฑฐ๋‚˜ n ์—ฐ์ฐจ๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ๊ฐ ํšŒ์‚ฌ๋งˆ๋‹ค ์ด ๋‘˜์„ ์ •์˜ํ•˜๋Š” ๊ธฐ์ค€์ด ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ. ๊ทธ๋Ÿฐ๋ฐ ํ•„์ž๋Š” ์ฃผ๋‹ˆ์–ด๋„ ์‹œ๋‹ˆ์–ด๋„ ์•„๋‹Œ ๊ทธ ์‚ฌ์ด์—์„œ ์• ๋งค~ํ•œ ์—ฐ์ฐจ. ์ค‘๋‹ˆ์–ด. ๊ณผ์—ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ? ๋ฌด์—‡์„ ํ•ด์•ผ ์—ฐ์ฐจ์— ๋งž๋Š” ์—ญํ• (?)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑด ๋ˆ„๊ตฌ์—๊ฒŒ ๋ฐฐ์›Œ์•ผ ํ•˜๊ณ  ๋ˆ„๊ฐ€ ๊ฐ€๋ฅด์ณ ์ฃผ๊ธฐ๋‚˜ ํ• ๊นŒ? ๏ปฟใ€€๋งค๋…„ ํšŒ๊ณ ๋ฅผ ์จ์™”๋‹ค. ๊ทธ๋Ÿผ์— ์—ฐ๋ง์ด ๋˜์–ด์„œ ์—ฐ๋ก€ํ–‰์‚ฌ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ๋‚˜์—๊ฒŒ ์ •๋ง ํ•„์š”ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ๊ณ ๋ฅผ ์ž‘์„ฑํ•˜๋ ค ํ•œ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ์ด๋Ÿฐ์ €๋Ÿฐ ์ผ๋“ค์ด ์žˆ์—ˆ๊ณ  ‘์–ด์ฉ” ์ˆ˜ ์—†์—ˆ๋„ค~’ ์Š์กฐ๋ฆฌ๋Š” ๋ฌด์˜๋ฏธํ•œ ํšŒ๊ณ ๋ณด๋‹ค ํ˜„์‹ค์ ์œผ๋กœ ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๋ณ€ํ™”ํ•ด์•ผ ํ•  ๊ฒŒ ์žˆ์œผ๋ฉด ๊ตต๊ณ  ๊ธธ๊ฒŒ ๊ณ„ํš์„ ์„ธ์›Œ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. 2019 ํšŒ๊ณ  2018 ํšŒ๊ณ  2017๋…„์—” ์™œ ์—†์ง€..? 2016 ํšŒ๊ณ  ๋“ฑ์žฅ, ์ฝ”๋กœ๋‚˜-19 ๋‚˜๊ฐ€์ง€ ๋ง๋ผ๋ฉด ๋‚˜๊ฐ€์ง€ ๋งˆ! ๋ฐฅ ๋จน์ง€ ๋งˆ! ๋ชจ์ด์ง€ ๋งˆ! ์ถœ์ฒ˜ : salihgonenli" ๋‚˜๊ฐ€์ง€ ๋ง๋ผ๋ฉด ๋‚˜๊ฐ€์ง€ ๋งˆ! ๋ฐฅ ๋จน์ง€ ๋งˆ! ๋ชจ์ด์ง€ ๋งˆ! ์ถœ์ฒ˜ : salihgonenli ๏ปฟใ€€์„ธ์ƒ์ด ๋ณ€ํ–ˆ๋‹ค. ์ž‘๋…„๊นŒ์ง€๋งŒ ํ•ด๋„ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ์‹ฌํ•˜๋ฉด ๋งˆ์Šคํฌ๋ฅผ ์“ฐ๊ณ  ๋‚˜๊ฐ€๊ณค ํ–ˆ์ง€๋งŒ ์ฝ”๋กœ๋‚˜-19๋ผ๋Š” ์ „์—ผ๋ณ‘์ด ์ „ ์„ธ๊ณ„์— ํผ์ง€๋ฉฐ ์ด์ œ๋Š” ๋งˆ์Šคํฌ ์—†์ด ์‚ด ์ˆ˜ ์—†๋Š” ์„ธ์ƒ์ด ๋˜์—ˆ๋‹ค. ๋Š˜ ์‚ฌ๋ฌด์‹ค์— ๋‚˜๊ฐ€ ํŒ€ ๋™๋ฃŒ๋ถ„๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ฉฐ ๋ฐฅ๋„ ๋จน๊ณ  ํšŒ์˜๋„ ํ•˜๋ฉฐ ์—…๋ฌด๋ฅผ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ ์žฌํƒ๊ทผ๋ฌด๋ฅผ ํ•œ์ง€ ์–ด๋Š๋ง ๋ฐ˜๋…„์ด ํ›Œ์ฉ ์ง€๋‚ฌ๋‹ค. ๏ปฟใ€€์ฒ˜์Œ์—” ์ง‘์—์„œ ํŽธํ•˜๊ฒŒ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ IT ํšŒ์‚ฌ์— ๊ทผ๋ฌดํ•˜๊ณ  ์žˆ์ง€๋งŒ ์•„์ง๋„ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๊ณ  ์–ด์ƒ‰ํ•œ ํ™”์ƒํšŒ์˜์™€ ๋”๋”˜ ์—…๋ฌด ์ง„ํ–‰์œผ๋กœ ์ธํ•ด ์ ์  ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋‹ต๋‹ตํ•จ์€ ๊ทน์„ ๋‹ฌํ–ˆ๋‹ค. ์ถœ/ํ‡ด๊ทผ ์‹œ๊ฐ„ ๋“ฑ ์—…๋ฌด์ด์™ธ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์‚ฌ๋ผ์ง€๋ฉฐ ์˜คํžˆ๋ ค ์—…๋ฌด์— ์ง‘์ค‘ํ•˜๋Š” ์‹œ๊ฐ„์€ ๋งŽ์•„์กŒ๋‹ค. ๊ทธ์— ๋ฐ˜ํ•ด ํ”ผ๋กœ๋„๋Š” ์ง‘์ค‘ํ•œ ์—…๋ฌด์‹œ๊ฐ„์— ๋น„๋ก€ํ•˜๋ฉฐ ๋Š˜์–ด๋‚ฌ๊ธฐ์— ๋‚˜๋ฌด๋Š˜๋ณด์ฒ˜๋Ÿผ ๋Š˜์–ด์ง€๋Š” ์‹œ๊ฐ„๋“ค ๋˜ํ•œ ๋งŽ์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ง€๋‚˜๊ณ  ๋ณด๋ฉด ๊ทธ๋Ÿฌํ•œ ์‹œ๊ฐ„๋“ค์„ ์ž˜ ๊ณ„ํšํ•˜๊ณ  ์›€์ง์˜€๋”๋ผ๋ฉด ๋ญ๋ผ๋„ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๋‹ฌ์„ฑํ–ˆ์„ ์‹œ๊ฐ„๋“ค์ธ ๊ฒƒ ๊ฐ™์•„์„œ ์•ฝ๊ฐ„ ์•„์‰ฌ์›€์ด ๋‚จ๋Š”๋‹ค. ๋‚ด๋…„์—” ๊ณ„ํšํ•˜๋Š” ์‹œ๊ฐ„์˜ ๋น„์ค‘์„ ์ข€ ๋” ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ. ๏ปฟใ€€์•„๋ฌด์ชผ๋ก ์ฝ”๋กœ๋‚˜-19 ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์—†์–ด์ง€๊ณ  ๋‹ค์‹œ ์˜ˆ์ „์œผ๋กœ ๋Œ์•„๊ฐ”์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๊ทธ์— ๋งˆ์Šคํฌ ์ž˜ ์“ฐ๊ณ  ์† ์ž˜ ์”ป๊ณ  ์‚ฌ๋žŒ ๋งŽ์ด ๋ชจ์ด๋Š” ๊ณณ์€ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฑด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด์•ผ ํ•  ๊ฐ€์žฅ ํฐ์ผ์ด๊ฒ ์ง€. ํšŒ์‚ฌ์ƒํ™œ ์„œ๋น„์Šค ์ „๋ฉด ๊ฐœํŽธ ใ€€๏ปฟํŒ€์— ํˆฌ์ž…ํ•œ ์ดํ›„ ๊ฐ€์žฅ ํฐ ๊ทœ๋ชจ๋กœ ์„œ๋น„์Šค ์ „๋ฉด ๊ฐœํŽธ์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ๊ฑฐ์˜ ์˜ฌํ•ด ๋‚ด๋‚ด ํ–ˆ๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•  ์ •๋„. ์—…๋ฌด์˜ ์–‘๋„ ๋งŽ์•˜๊ณ  ์ŠคํŽ™ ๋˜ํ•œ ๋ณต์žกํ•˜์˜€์ง€๋งŒ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ถ€๋ถ„์€ ๋ชจ๋†€๋ฆฌํ‹ฑ ์„œ๋น„์Šค์—์„œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ณ€ํ™”๋ฅผ ์‹œ๋„ํ–ˆ๋‹ค๋Š” ์ . ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ Request - Response ์‹์˜ 1์ฐจ์›์ ์ธ ํ๋ฆ„์—์„œ ์ด๋ฒคํŠธ๋ผ๋Š” ํ–‰์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•˜๋ฉฐ ๊ณ ๋ฏผํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ค‘๋‹ˆ์–ด๋‹ค ๋ณด๋‹ˆ ์ฃผ์–ด์ง„ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœ๋งŒ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹จ ์ข€ ๋” ๋†’์€ ๊ณณ์˜ ์„ค๊ณ„ ๊ด€์ ์—์„œ ๊ณ ๋ฏผํ•˜๋Š” ์—ฐ์Šต์„ ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ์•„์ง ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๏ปฟใ€€์˜ฌํ•ด๋„ ๊ฐœ๋ฐœ ๋ฌธํ™”๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ๋„ ํ•˜์˜€๋‹ค. CI๋ฅผ ์žฌ์„ค์น˜ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ฐœ์„ ์„ ํ†ตํ•ด ๋นŒ๋“œ ์†๋„๋ฅผ ๋ช‡ ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๊ธฐ๋„ ํ•˜์˜€๊ณ , ๋‹จ์ˆœ/๋ฐ˜๋ณต์ ์ธ ์—…๋ฌด๋“ค์€ ๊ฐ์ข… ๋ด‡๋“ค์„ ๊ฐœ๋ฐœํ•˜์—ฌ ์—…๋ฌด ์ƒ์‚ฐ์„ฑ์„ ์˜ฌ๋ฆฌ๊ธฐ๋„ ํ•˜์˜€๋‹ค. Sentry๋ฅผ ์„œ๋ฒ„ ๋ ˆ๋ฒจ์— ์ ์šฉํ•˜์—ฌ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๋„ ํ•˜์˜€๊ณ , ์†Œ๋‚˜ํ๋ธŒ์™€ jacoco๋ฅผ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋„์‹ํ™”ํ•˜๋ฉฐ ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ๋„ ํ•ด๋ณด์•˜๋‹ค.

์• ์ž์ผ ์•„๋ฒ„์ง€์˜ ๊ณ ํ•จ๊ณผ ํ˜ธํ†ต (๋ฆฌ๋ทฐ๏ผšClean Agile - Back to Basics)

๏ปฟใ€€‘์• ์ž์ผ’ ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ฌด์—‡์ด ๋– ์˜ค๋ฅด๋Š”๊ฐ€? ์ž˜์€ ๋ชจ๋ฅด์ง€๋งŒ ๋ง‰์—ฐํ•˜๊ฒŒ ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด, ๋งค์ผ ์˜ค์ „ ์Šคํฌ๋Ÿผ์„ ํ•˜๊ณ  ์ง„ํ–‰ ํ˜„ํ™ฉ์„ ๊ฐ€์‹œํ™”ํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋„๋Š” ์ผ์ข…์˜ ‘ํ”„๋กœ์„ธ์Šค’๋กœ ์•Œ๊ณ  ์žˆ๋‹ค. ์ข‹๋‹ค๋Š” ๊ฒƒ๋„ ๋“ค์—ˆ๊ณ  ๋„์ž…์„ ํ•˜๋ ค ํ•˜์ง€๋งŒ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒŒ ์ž˜ ์•ˆ๋˜๋Š” ๊ทธ๊ฒƒ. ํ˜„์—…์— ๋“ค์–ด์˜ค๋ฉด์„œ ‘์• ์ž์ผ’ ๋„์ž…์˜ ์„ฑ๊ณต/์‹คํŒจ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๊ฐ€๋”์”ฉ ๊ฑด๋„ˆ๊ฑด๋„ˆ ๋“ค์–ด๋งŒ ๋ณธ ์ˆ˜์ค€์ด๋‹ค. ์ด์ œ๋Š” ์ฃผ๋‹ˆ์–ด๋„ ์‹œ๋‹ˆ์–ด๋„ ์•„๋‹Œ ์ค‘๋‹ˆ์–ด๊ฐ€ ๋˜์–ด๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํŒจํ„ด, ์‹ ๊ธฐ์ˆ ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์˜ ๊ฑด๊ฐ•ํ•˜๊ณ  ์„ฑ๊ณต์ ์ธ ์ง„ํ–‰์„ ์œ„ํ•ด์„œ๋Š” ์ด๋Ÿฌํ•œ ํ™œ๋™๋“ค์ด ์ค‘์š”ํ•˜๊ตฌ๋‚˜ ํ•˜๋ฉฐ ์š”์ฆ˜ (์˜ฌํ•ด) ๋ผˆ!์ €!๋ฆฌ!๊ฒŒ! ๋Š๋ผ๋Š” ์ค‘์ด๋‹ค. ๏ปฟใ€€๋งˆ์นจ ํฌ๋ฆฌ์Šค๋งˆ์Šค ์—ฐํœด๋ฅผ ์•ž๋‘๊ณ  ์ด ์‹œ๊ตญ์— ๋‚˜๊ฐ€์ง€๋„ ๋ชปํ•˜๋Š”๋ฐ ๋ญ˜ ํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ๋˜ ์ฐฐ๋‚˜ ์šด๋ช…์ฒ˜๋Ÿผ ํด๋ฆฐ ์• ์ž์ผ, ์ €์ž ๋กœ๋ฒ„ํŠธ C. ๋งˆํ‹ด์ด๋ผ๋Š” ์ฑ… ์ถ”์ฒœ์„ ๋ฐ›๋Š”๋‹ค. ๋ณดํ†ต ํ•„์ž๋Š” ์ฝ๊ณ  ์‹ถ์€ ์ฑ…์„ ๊ณ ๋ฅผ ๋•Œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ํ‘œ์ง€์™€ ์ถ”์ฒœ์ธ(ํ˜น์€ ๋ฆฌ๋ทฐ์–ด)์˜ ๋Œ€ํ•œ ์‹ ๋ขฐ. ๋‘˜ ๋‹ค ๋„ˆ๋ฌด ์ข‹์•˜๊ธฐ์— ๋ฐ”๋กœ ์ธํ„ฐ๋„ท ์ฃผ๋ฌธ์„ ํ•˜์˜€์ง€๋งŒ ๊ทธ์ƒˆ๋ฅผ ๋ชป ์ฐธ๊ณ  ๊ทผ์ฒ˜ ์„œ์ ์— ๋“ค๋Ÿฌ ์ฑ…์„ ์‚ฌ ์˜จ๋‹ค.๏ปฟ ๊ฐ‘.๋ถ„.๋ˆ(ํ‚คํ˜ธํ…Œ) ใ€€ํ’์ฐจ๋‚˜ ํญํฌ๋ฅผ ๊ณต๊ฒฉํ•ด๋ณธ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํ’์ฐจ๋ฅผ ๊ดด๋ฌผ๋กœ ๋ณด๊ณ  ๋‹ฌ๋ ค๋“ค์—ˆ๋˜ ๋ˆํ‚คํ˜ธํ…Œ" ํ’์ฐจ๋ฅผ ๊ดด๋ฌผ๋กœ ๋ณด๊ณ  ๋‹ฌ๋ ค๋“ค์—ˆ๋˜ ๋ˆํ‚คํ˜ธํ…Œ ๏ปฟใ€€ํ˜ธ๊ธฐ๋กญ๊ฒŒ ์ฒซ ์žฅ์„ ๋„˜๊ธฐ๋Š”๋ฐ ๊ฐ•๋ ฌํ•˜๊ฒŒ ๋‹ค๊ฐ€์˜ค๋Š” ๋ฌธ๊ตฌ. ์˜ฎ๊ธด์ด์— ๋”ฐ๋ฅด๋ฉด ์„ธ๋ฅด๋ฒคํ…Œ์Šค์˜ ์†Œ์„ค ‘๋ˆํ‚คํ˜ธํ…Œ’์—์„œ ์ฃผ์ธ๊ณต ๋ˆํ‚คํ˜ธํ…Œ๊ฐ€ ํ’์ฐจ๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋ชจ์Šต์—์„œ ์˜จ ํ‘œํ˜„์ด๋ผ ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„ ํ—›๋˜๊ณ  ๋ฌด๋ชจํ•œ ์‹ธ์›€์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋น—๋Œ€์–ด ์ด์•ผ๊ธฐํ•˜๋ฉฐ ๋ฐ”๋ณด ํ˜น์€ ํ˜„์‹ค ๋ถ€์ ์‘์ž๋กœ ๊ฐˆ์Œํ•˜๋Š” ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋Ÿฌ์‹œ์•„ ์ž‘๊ฐ€ ์ด๋ฐ˜ ํˆฌ๋ฅด๊ฒŒ๋„คํ”„๋Š” ํ–„๋ฆฟ์„ ์‚ฌ๋ž‘ํ•˜๊ธฐ๋Š” ํž˜๋“ค์ง€๋งŒ ๋ˆํ‚คํ˜ธํ…Œ๋Š” ์‚ฌ๋ž‘ํ•˜์ง€ ์•Š๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์•„๋งˆ ์ €์ž๋Š” ๊ณ ๋ฏผ๋ณด๋‹ค๋Š” ํ–‰๋™์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ๋ˆํ‚คํ˜ธํ…Œ๋ฅผ ๋น—๋Œ€์–ด ํ˜„์‹ค์— ์•ˆ์ฃผํ•˜์ง€ ์•Š๊ณ  ๊ฑด๊ฐ•ํ•œ ๊ฐœ๋ฐœ ๋ฌธํ™”๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์กฐ์–ธ๊ณผ ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋‚ด๋ ค ํ–ˆ๋˜ ๊ฑด ์•„๋‹๊นŒ ์‹ถ๋‹ค.๏ปฟ ์ฑ…์˜ ๊ตฌ์„ฑ ๏ปฟใ€€ํŽ˜์ด์ง€ ์ˆ˜(230p)๊ฐ€ ๋งŽ์ง€ ์•Š์•„์„œ ๊ฐ€๋ณ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์‹ถ์—ˆ์ง€๋งŒ ๋‹ค์†Œ ์ž‘์€ ๊ธ€์”จ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์„œ ์ฑ…์„ ์ž˜ ์•ˆ์ฝ์—ˆ๋˜ ํ•„์ž์—๊ฒ ์•ฝ๊ฐ„ ๋ถ€๋‹ด์œผ๋กœ ๋‹ค๊ฐ€์™”๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด์šฉ๋“ค์ด ๋„ˆ~๋ฌด ๊ณต๊ฐ์ด ๋˜์–ด ๋งˆ์น˜ ํ•„์ž์˜ 2020๋…„์„ ์˜ค๋ž˜์ „์— ์˜ˆ๊ฒฌํ•˜๊ณ  ๋ฏธ๋ฆฌ ์จ๋‘”๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์„ ๋ฐ›์•˜์„ ์ •๋„๋ผ ์•„์นจ 5์‹œ์— ์ผ์–ด๋‚˜ ์ €๋… 11์‹œ๊ฐ€ ๋˜์–ด์„œ์•ผ ๋‹ค ์ฝ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ ๋“ค์–ด๋ณธ ์šฉ์–ด๋‚˜ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋˜๋Š” ๊ฐœ๋…๋“ค๋„ ์žˆ์–ด ๋‹ค์Œ๋‚  ๋…ธํŠธ๋ถ์„ ์˜†์— ๋‘๊ณ  ์ฐพ์•„๊ฐ€๋ฉฐ ๋‹ค์‹œ ์ฝ๊ธฐ๋„ ํ•˜์˜€๋‹ค. (๊ทธ๋งŒํผ ์ œ๋Œ€๋กœ ์ฝ์–ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.) ๏ปฟใ€€์ฑ… ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ์ €์ž๋Š” ์ด ์ฑ…์„ ‘์„ ์–ธ’์ด๋‚˜ ‘์ •์˜’ ๊ฐ€ ์•„๋‹Œ ์• ์ž์ผ์— ๋Œ€ํ•œ ‘๊ฒฝํ—˜’์„ ํ† ๋Œ€๋กœ ์˜คํ•ด๋ฅผ ๋ฐ”๋กœ์žก๋Š”๋‹ค๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค. 2001๋…„ 2์›”, ์• ์ž์ผ ์„ ์–ธ์ด ๋ฐœํ‘œ๊ฐ€ ๋˜์—ˆ๊ณ  ๋‚ด๋…„์ด๋ฉด 20๋…„์ด ๋ผ๊ฐ€๋Š” ์‹œ์ ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ๋ณ€ํ˜•๋œ ‘์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ’์ด ๋‚˜์™”์ง€๋งŒ ์• ์ž์ผ์˜ ๊ธฐ์ค€์„ ๋‹ค์‹œ ์†Œ๊ฐœํ•˜๋ฉฐ ๋ณธ์งˆ์„ ํ๋ ค์„  ์•ˆ๋œ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค. (์ฑ…์ด ๋ถ€ ์ œ๋ชฉ์ด Back to Bascis์ธ ๊ฒƒ์„ ๋ณด๋ฉด …)๏ปฟ ๏ปฟใ€€ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฑ… ๋‚ด์šฉ ์ค‘์— ์•„์ง๊นŒ์ง€๋„ ๋จธ๋ฆฟ์†์— ๋‚จ์•„์žˆ๋˜ ์• ์ž์ผ๊ณผ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ‘ํญํฌ์ˆ˜ ๋ชจ๋ธ’๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๋ถ€๋ถ„์„ ํ•„์ž๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ์ ์–ด๋ณด๋ ค ํ•œ๋‹ค. (๋„ˆ๋ฌด๋‚˜๋„ ๋”์ฐํ•˜๊ฒŒ ๊ณต๊ฐ๋˜๊ธฐ์—…) ํญํฌ์ˆ˜ ๋ชจ๋ธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ์‚ฌ๋ก€ ๏ปฟํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ๋งˆ๊ฐ๊ธฐํ•œ์„ ํ™•์ธํ•˜๊ณ  ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์ง€๊ธˆ์€ 1์›”์ด๊ณ  ์ถœ์‹œ๊ฐ€ 10์›”์ด๋‹ˆ ๊ฐ ์ผ์ •์€ ๊ฑฐ๊พธ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐœ๋ฐœ์€ QA ๊ธฐ๊ฐ„ ๊ณ ๋ ค 9์›”์— ์ข…๋ฃŒ, ์„ค๊ณ„๋Š” 7์›”์—, ๋ถ„์„์€ ๋Šฆ์–ด๋„ 4์›”๊นŒ์ง„ ํ•˜๋Š” ๊ฑธ๋กœ ‘๋ชป ๋ฐ•๋Š”๋‹ค.’ (๋„ค…?) ๊ทธ๋ ‡๊ฒŒ ์—ฌ์œ ๋กญ๊ฒŒ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋‹ค 4์›”์ด ๋˜์–ด ๋ถ„์„ ๋‹จ๊ณ„๊ฐ€ ๋๋‚œ๋‹ค. ์™œ? 4์›”์ด ๋์œผ๋‹ˆ๊นŒ. ๋˜ ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ 7์›”์ด ๋˜์ž ๊ธฐ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์„ค๊ณ„ ์ข…๋ฃŒ. ์™œ? 7์›”์ด ๋์œผ๋‹ˆ๊นŒ. ๊ทธ ํ›„ ๋‚จ์€ 2๊ฐœ์›” ๋™์•ˆ ๊ฐœ๋ฐœ์ž๋“ค์€ ์—„์ฒญ๋‚œ ์••๋ฐ•๊ณผ ๊ธ‰์ฆํ•˜๋Š” ์•ผ๊ทผ๊ณผ ํ•จ๊ป˜ ํ•˜๋‚˜๋‘˜์”ฉ ํŒ€์„ ๋– ๋‚˜๊ณ  ๊ทธ๋งŒ๋‘๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. QA์—์„œ ํ™•์ธํ•œ ๋ฒ„๊ทธ๊ฐ€ ์…€ ์ˆ˜ ์—†์ด ์Ÿ์•„์ ธ ๋‚˜์˜จ๋‹ค. (์†Œ๋ฆ„ 1) ํ•˜์ง€๋งŒ 10์›”์— ์ถœ์‹œํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋‹ˆ ๋ฒ„๊ทธ๋‚˜ ์—๋Ÿฌ๊ฐ€ ํ„ฐ์ ธ ๋‚˜์˜ค์ง€๋งŒ ์ถœ์‹œ๋ฅผ ํ•˜๊ณ . ํ”„๋กœ์ ํŠธ๋Š” ์‹คํŒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํšŒ๊ณ ๋ฅผ ํ•˜๊ณ . ๋‹ค์Œ๋ฒˆ์—” ์ œ๋Œ€๋กœ ํ•ด์•ผ์ง€! ํ•˜๋ฉฐ ๋‹ค์งํ•œ๋‹ค. (์†Œ๋ฆ„ 2) ์ €์ž๋Š” ์ด๊ฒƒ์„ ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์—†๋Š” ํ”„๋กœ์„ธ์Šค ์ธํ”Œ๋ ˆ์ด์…˜(Runaway Process Inflation)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋  ๋ฆฌ๊ฐ€ ์—†๋Š” ์ผ์„ ๊ณ„์†ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๊ฒƒ๋„ ์•„์ฃผ ๋งŽ์ด. ๊ทธ๋ž˜์„œ ์• ์ž์ผ์ด๋ž€?

Swagger์™€ Spring Restdocs์˜ ์šฐ์•„ํ•œ ์กฐํ•ฉ (by OpenAPI Spec)

๏ปฟMSA ํ™˜๊ฒฝ์—์„œ์˜ API ๋ฌธ์„œํ™”๋Š” ์–ด๋–ค ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฑธ๊นŒ? ์˜ˆ์ปจ๋Œ€, ๋ชจ๋“ˆ์ด 10๊ฐœ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๊ฐ ๋ชจ๋“ˆ๋งˆ๋‹ค API ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ํ…Œ๊ณ  API ๋ฌธ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ๊ฐ์˜ (10๊ฐœ์˜) URL๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ํ…๋ฐ ์ด๊ฒŒ ๊ณผ์—ฐ ํšจ์œจ์ ์ผ๊นŒ? ๋ฌผ๋ก  ๊ธฐ๋Šฅ๋ณ„๋กœ URL์ด ๋ถ„๋ฆฌ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ณ  ๊ตณ์ด ๋ชจ์•„๋ณด์ž๋ฉด ๊ฐ API ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ํฌ๋กค๋ง ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜๋‹ˆ ์ผ์„ ์œ„ํ•œ ์ผ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ญ”๊ฐ€ ์•„์‰ฌ์› ๋‹ค. ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ? ๊ณ ๋ฏผ์˜ ์‹œ์ž‘ ใ€€ํ•œ์ฐฝ ๊ถ๊ธˆ์ฆ์ด ๋จธ๋ฆฟ์†์—์„œ ์ง€์›Œ์ง€์ง€ ์•Š์•˜์„๋•Œ Spring ํ•œ๊ตญ ์Šคํ”„๋ง ์‚ฌ์šฉ์ž ๋ชจ์ž„ ํŽ˜์ด์Šค๋ถ ๊ทธ๋ฃน์— ๋ฌธ์˜๋„ ํ•ด๊ฐ€๋ฉฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๊ฐ€๊ณ  ์žˆ์—ˆ๋‹ค. ๏ปฟ๋‹‰๋„ค์ž„์ด๋‚˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์€ ๊ทธ๋“ค์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์œ„ํ•ด ์ž„์˜๋กœ ์ง€์ •ํ•˜์˜€๋‹ค." ๏ปฟ๋‹‰๋„ค์ž„์ด๋‚˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์€ ๊ทธ๋“ค์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์œ„ํ•ด ์ž„์˜๋กœ ์ง€์ •ํ•˜์˜€๋‹ค. ใ€€๏ปฟํ•„์ž์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœ์ž์˜ ์ธ์ƒ์„ ์‹œ์ž‘ํ•œ ๋ฉ‹์ง„ ์นœ๊ตฌ๋“ค์—๊ฒŒ ์ •ํ™•ํžˆ ์˜ฌํ•ด 6์›” ์ดˆ์— ๊ณ ๋ฏผ์„ ํ„ธ์–ด๋†“์œผ๋ฉฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์„์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์นœ๊ตฌ ์ค‘ ํ•œ ๋ช…์ด ์žŠ๊ณ  ์žˆ์—ˆ๋˜ ๊ทธ ์ด์Šˆ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ๊บผ๋‚ด๋ฉฐ URL ํ•˜๋‚˜๋ฅผ ๋˜์ ธ์ค€๋‹ค. ์ฐธ ๊ณ ๋งˆ์šด ์นœ๊ตฌ๋“ค. Shout out 34. asuraiv, black9p ์–ธ ๋ฐ˜๋…„์ด ์ง€๋‚ฌ์œผ๋‚˜ ํ•„์ž๋„ ์žŠ๊ณ  ์žˆ์—ˆ๋˜ ์ด์Šˆ๋ฅผ ๊ทธ๋Š” ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์—ˆ๋‹ค." ์–ธ ๋ฐ˜๋…„์ด ์ง€๋‚ฌ์œผ๋‚˜ ํ•„์ž๋„ ์žŠ๊ณ  ์žˆ์—ˆ๋˜ ์ด์Šˆ๋ฅผ ๊ทธ๋Š” ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ใ€€๏ปฟ์˜ฌํ•ด NHN FORWARD์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ ์„ธ์…˜ ์ค‘์—์„œ MSA ํ™˜๊ฒฝ์—์„œ API ๋ฌธ์„œ ๊ด€๋ฆฌํ•˜๊ธฐ: ์ƒ์„ฑ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€๋ผ๋Š” ์ œ๋ชฉ์˜ ๋‚ด์šฉ์ด์—ˆ๊ณ , ์ •ํ™•ํ•˜๊ฒŒ ํ•„์ž๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ฝ•! ์ง‘์–ด์„œ ํ•ด๊ฒฐํ•ด ์ค€ ์‚ฌ๋ก€์˜€๋‹ค. ์—ญ์‹œ ์„ธ์ƒ์—” ์—„์ฒญ๋‚œ ๊ณ ์ˆ˜๋“ค์ด ๋‚ด๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ์ด๋ฏธ(ํ˜น์€ ์ดํ›„์—๋ผ๋„) ๊ณ ๋ฏผํ•˜๊ณ  ํ•ด๊ฒฐํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋ผ๊ณ  ๊ณต์œ ์˜ ํž˜์ด ์ด๋ ‡๊ฒŒ๋„ ๋Œ€๋‹จํ•˜๊ตฌ๋‚˜ ํ•˜๋ฉฐ ๋†€๋ผ์›€์„ ๊ธˆ์น˜ ๋ชปํ•˜์˜€๋‹ค.๏ปฟ ใ€€๏ปฟ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” OpenAPI Spec ์„ ํ™œ์šฉํ•˜์—ฌ Spring Restdocs๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฌธ์„œ๋ฅผ Swagger UI์—์„œ ๋ณด๋Š” ํ๋ฆ„์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ฆ‰, Swagger ๋‚˜ Spring Restdocs ๋ญ๋กœ ๋งŒ๋“ค๋“  ๊ฐ„์— OpenAPI Spec์— ๋งž์ถฐ์„œ๋งŒ ๋งŒ๋“ ๋‹ค๋ฉด ํ•œ๊ณณ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ํฌ๋ง์ด ๋ณด์˜€๋‹ค. ๋ฉฐ์น  ์ „ ์ž‘์„ฑํ•œ OpenAPI ์™€ Swagger-ui ํฌ์ŠคํŒ…์„ ๋ณธ ๋…์ž๋“ค์€ ์ง€๊ธˆ์˜ ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ‘๊ฑฐ๋ฆ„์ด์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ˆˆ์น˜์ฑ˜์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๏ปฟ์ข‹์€ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ด ์ฃผ์‹  (์ €์˜ ๊ณ ๋ฏผ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด ์ฃผ์‹ ) NHN FORWARD ๋ฐœํ‘œ์ž๋ถ„๊ป˜ ์ด ํฌ์ŠคํŒ…์„ ๋นŒ์–ด ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. :) ๋‹น์žฅ ํŒ€ ๋‚ด์—๋„ ์ ์šฉํ•ด๋ด์•ผ๊ฒ ์–ด์š”!! ๏ปฟSpring Restdocs์—์„œ OpenAPI Spec ์ถ”์ถœ ใ€€๏ปฟ๋ˆ„๊ฐ€ ๋˜ ์นœ์ ˆํ•˜๊ฒŒ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋งŒ๋“ค์–ด๋†จ๋‹ค. https://github.com/ePages-de/restdocs-api-spec ์—์„œ ๊ด€๋ จ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ํ•ด๋‹น ๋งํฌ์—์„œ๋Š” gradle ๋ฒ„์ „์ด๊ณ  https://github.com/BerkleyTechnologyServices/restdocs-spec ๋Š” maven ๋ฒ„์ „์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋งˆ์นจ ํ•„์ž์˜ Github์— Maven ๋ฒ„์ „์œผ๋กœ SpringRestdocs๋ฅผ ์„ธํŒ…ํ•ด๋‘” Repository ๊ฐ€ ์žˆ์–ด์„œ ์ด๋ฅผ ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.๏ปฟ pom.xml ์ถ”๊ฐ€ ใ€€๏ปฟ๊ด€๋ จ dependency๋ฅผ ์ถ”๊ฐ€ํ•˜์ž. jcenter๋ผ๊ณ  bintray.com ์—์„œ ์šด์˜๋˜๋Š” Maven Repository์— ์˜ฌ๋ ค์ง„ ์˜คํ”ˆ์†Œ์Šค์ด๋‹ˆ repository ๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž. <properties> <restdocs-api-spec.version>0.10.0</restdocs-api-spec.version> <restdocs-spec.version>0.19</restdocs-spec.version> </properties> <repositories> <repository> <id>jcenter</id> <url>https://jcenter.bintray.com</url> </repository> </repositories> <dependency> <groupId>com.epages</groupId> <artifactId>restdocs-api-spec</artifactId> <version>${restdocs-api-spec.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>com.epages</groupId> <artifactId>restdocs-api-spec-mockmvc</artifactId> <version>${restdocs-api-spec.version}</version> <scope>test</scope> </dependency> ๏ปฟ์œ„์˜ dependency์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๋ชจ๋“ˆ๋กœ ํ…Œ์ŠคํŠธ์˜ SpringRestdocs๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด OpenAPI Spec ์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” plugin ๋˜ํ•œ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž <pluginRepositories> <pluginRepository> <id>jcenter</id> <url>https://jcenter.bintray.com</url> </pluginRepository> </pluginRepositories> <plugin> <groupId>com.github.berkleytechnologyservices.restdocs-spec</groupId> <artifactId>restdocs-spec-maven-plugin</artifactId> <version>${restdocs-spec.version}</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <specification>OPENAPI_V3</specification> <format>JSON</format> <outputDirectory>${project.build.directory}/classes/static/docs</outputDirectory> </configuration> </execution> </executions> </plugin> ๏ปฟ์œ„ plugin ์„ค์ •์„ ๋ณด๋ฉด format ์„ JSON์œผ๋กœ ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ YAML๋กœ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ๋ช…์‹œํ•œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌธ์„œํ™” ๋กœ์ง ์ถ”๊ฐ€ ใ€€๏ปฟ๊ธฐ์กด์— SpringRestdocs๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋กœ์ง์€ org.springframework.restdocs.mockmvc.MockMvcRestDocumentation์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ•œ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด import๋งŒ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•œ๋‹ค. //import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*; import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; ๏ปฟ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๊ณ  Maven ๋นŒ๋“œ๋ฅผ ํ•ด๋ณด๋ฉด plugin์—์„œ ์ง€์ •ํ•œ ๊ฒฝ๋กœ์— JSON ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

OpenAPI ์™€ Swagger-ui ์ ์šฉํ•˜๊ธฐ

๏ปฟAPI๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ์‹ฌํ”Œํ•˜๊ฒŒ ๊ฐœ๋ฐœ ์ฝ”๋“œ์™€๋Š” ๋ณ„๋„๋กœ ์ง์ ‘ ์ˆ˜๊ธฐ๋กœ ์ž‘์„ฑํ•˜์—ฌ ํŒŒ์ผ ํ˜น์€ ๋ฌธ์„œ ๋งํฌ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ์ฝ”๋“œ์™€ ๋ณ„๋„๋กœ ์ง์ ‘ ์ž‘์„ฑ์„ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์˜คํƒ€/์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ์ตœ์‹ ํ™”๊ฐ€ ์•ˆ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ์— ๋“ฑ์žฅํ•œ API ๋ฌธ์„œํ™” ์ž๋™ํ™” ํˆด์˜ ์–‘๋Œ€ ์‚ฐ๋งฅ์ธ SpringRestDocs ์™€ Swagger. ใ€€๏ปฟ๊ณผ๊ฑฐ SpringRestDocs ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ํ–ˆ๊ธฐ์— ์ด๋ฒˆ์—” Swagger์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ด ๋‘˜์˜ ์žฅ๋‹จ์ ์€ ๋„ˆ๋ฌด ๋šœ๋ ทํ•˜๊ธฐ์— API๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๏ปฟSpringBoot์— Swagger ์ ์šฉ ใ€€๊ธฐ๋ณธ SpringBoot ๊ฐ€ ์…‹ํŒ…๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— Swagger ๊ด€๋ จ dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž. ์•„์ฐธ, ์ด์ œ๋ถ€ํ„ฐ์˜ ํ”„๋กœ์ ํŠธ ์…‹ํŒ…์€ Gradle๋กœ ํ•˜๋ คํ•œ๋‹ค. (๋ฌผ๋ก  Maven์œผ๋กœ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ…) dependencies { implementation "io.springfox:springfox-boot-starter:3.0.0" } ใ€€๏ปฟ์ดํ›„ JavaConfig ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋Š”๋ฐ ์•„๋ž˜ ๋‚ด์šฉ์€ ์•„์ฃผ ๊ธฐ๋ณธ ์„ธํŒ…์ด๋‹ˆ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋„ํ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. (๋ฌผ๋ก  ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉฐ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์€ ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.)๏ปฟ @EnableSwagger2 @Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } } ใ€€๏ปฟํ…Œ์ŠคํŠธํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์‹ฌํ”Œํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ (์‚ฌ์น™์—ฐ์‚ฐ…) ์‹คํ–‰์„ ์‹œํ‚จ ํ›„ /swagger-ui/์— ์ ‘์†์„ ํ•ด๋ณด๋ฉด swagger ๊ด€๋ จ javaConfig ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (http method๋Š” ํŽธ์˜์ƒ ๋‹ค์–‘ํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ ์™œ DELETE ์ธ๊ฐ€๋ผ๋Š” ์˜๋ฌธ์€ ์ ‘์–ด๋‘์ž.) @RestController public class SampleController { @GetMapping(value = "/addition") public Integer addition(Integer num1, Integer num2) { return num1 + num2; } @PostMapping(value = "/subtraction") public Integer subtraction(Integer num1, Integer num2) { return num1 - num2; } @PutMapping(value = "/multiplication") public Integer multiplication(Integer num1, Integer num2) { return num1 * num2; } @DeleteMapping(value = "/division") public Integer division(Integer num1, Integer num2) { return num1 / num2; } } ๊ธฐ๋ณธ ์…‹ํŒ…๋งŒ ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค." ๊ธฐ๋ณธ ์…‹ํŒ…๋งŒ ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค. ใ€€๏ปฟ์œ„์—์„œ ํ–ˆ๋˜ ์„ค์ •๋“ค ์ค‘ ๋ช‡ ๊ฐ€์ง€๋งŒ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž. ์„ค์ • ์„ค๋ช… Docket ๏ปฟSpringfox ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ๋นŒ๋”๋กœ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋ณธ๊ฐ’๊ณผ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์ดํ›„ select()๋กœ ApiSelectorBuilder๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. apis ๏ปฟ์–ด๋–ค ์œ„์น˜์— ์žˆ๋Š” API๋“ค์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ •์˜. RequestHandlerSelectors.any()์ด๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ SpringBoot์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” basic-error-controller ๋„ API ๋ฌธ์„œ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ํŒจํ‚ค์ง€๋งŒ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” RequestHandlerSelectors.basePackage("com.taetaetae.swagger.api") ์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€ ํ•˜์œ„์— ์žˆ๋Š” Controller๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค๏ปฟ. paths ๏ปฟ์ด๋ฆ„์—์„œ๋„ ๋ˆˆ์น˜๋ฅผ ์ฑŒ ์ˆ˜ ์žˆ๋“ฏ์ด ํŠน์ • path๋งŒ ํ•„ํ„ฐ๋งํ•ด์„œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. useDefaultResponseMessages ๏ปฟ๊ธฐ๋ณธ http ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋ž˜๊ทธ ๏ปฟ์ด์™ธ์—๋„ security ๋‚˜ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ฐ€๋Šฅํ•˜๋ฉด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋ฅธ ์„ค์ •๋“ค์„ ์ถ”๊ฐ€์‹œ์ผœ์„œ ์ข€ ๋” ์นœ์ ˆํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๋Š” Github์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. API ๋ฌธ์„œํ™”๋Š” ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ!!" API ๋ฌธ์„œํ™”๋Š” ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ!! OpenAPI ใ€€๏ปฟSwagger ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ๋‘˜๋Ÿฌ๋ณด๋ฉด OpenAPI๋ผ๋Š” ๋‚ด์šฉ์ด ๋งŽ์ด ๋‚˜์˜จ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด OpenAPI๋Š” ๋ฌด์—‡์ผ๊นŒ? ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ์„ ์ง์—ญํ•ด๋ณด๋ฉด Swagger ์‚ฌ์–‘์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ RESTful ์›น ์„œ๋น„์Šค๋ฅผ ์„ค๋ช…, ์ƒ์„ฑ, ์†Œ๋น„ ๋ฐ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ์‚ฌ์–‘์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, API ์ž์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ŠคํŽ™์ด๋ผ๊ณ  ์ดํ•ด๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์œ„์—์„œ ๋งŒ๋“ค์–ด์กŒ๋˜ Swagger๋ฅผ ๋ณด๋ฉด http://localhost:8080/v2/api-docs?group=Test API ๋ผ๊ณ  ๋‚˜์™€์žˆ๋Š”๋ฐ ์ด๋ฅผ ํด๋ฆญํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด json ํ˜•ํƒœ๋กœ ๋ณด์ธ๋‹ค.

Jenkins Job์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์„œ ์†๋„๋ฅผ ๊ฐœ์„ ํ•ด๋ณด์ž. (by. Pipeline)

๏ปฟใ€€๊ด€๋ฆฌํ•˜๋Š” URL์ด 200์‘๋‹ต์„ ์ฃผ๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๋– ์˜ค๋ฅธ ๊ฑด ๋‹จ์—ฐ Jenkins. ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์–ธ์–ด์— ๋งž์ถฐ Execute Script๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์Šค์ผ€์ค„๋ง์„ ๊ฑธ์–ด ๋†“์œผ๋ฉด ํฐ ์ˆ˜๊ณ  ์—†์ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์•„๋ž˜๋Š” python script๋กœ ์ž‘์„ฑํ•ด ๋ณด์•˜๋‹ค. import requests url="http://๋ชจ๋‹ˆํ„ฐ๋งurl" status_code = requests.get(url).status_code if status_code != 200: print(f'์‘๋‹ต ์‹คํŒจ :{url}, status : {status_code}') exit(1) ๏ปฟใ€€ํ•˜์ง€๋งŒ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ด์•ผ ํ•˜๋Š” URL์ด 1๊ฐœ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑํ•œ Script๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธด ํ•˜์ง€๋งŒ URL๋งˆ๋‹ค ์‘๋‹ต์†๋„๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ ์‹คํ–‰ ์†๋„๋Š” ๋Š๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค. import requests urls = [ "http://๋ชจ๋‹ˆํ„ฐ๋งurl-1", "http://๋ชจ๋‹ˆํ„ฐ๋งurl-2", "http://๋ชจ๋‹ˆํ„ฐ๋งurl-3" ] for url in urls: status_code = requests.get(url).status_code if status_code != 200: print(f'์‘๋‹ต ์‹คํŒจ :{url}, status : {status_code}') exit(1) ๏ปฟ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑด ๋ˆ„๊ตฌ๋‚˜ ๋‹ค ์•Œ์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  Thread๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์—” ๋ฒŒ์จ๋ถ€ํ„ฐ ๋œ์ปฅ ๋ถ€๋‹ด์ด ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  Job์„ URL ๊ฐœ์ˆ˜๋งŒํผ ๋Š˜๋ฆฌ๊ธฐ์—๋Š” ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ์ปค๋ฒ„๋ฆฌ๊ณ … ๊ทธ๋Ÿฌ๋‹ค ๋ฐœ๊ฒฌํ•œ ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ Jenkins Pipeline! ใ€€์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Jenkins Job์„ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ Pipeline์„ ํ†ตํ•ด์„œ ๊ฐœ์„ ํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•˜์—ฌ ๊ณต์œ ํ•ด๋ณด๋ ค ํ•œ๋‹ค. Jenkins Pipeline์— ๋Œ€ํ•ด ๋“ค์–ด๋งŒ ๋ดค๋Š”๋ฐ ์ด๋ฒˆ์— ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์˜ต์…˜๋“ค์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐํ•ฉ์„ ์ž˜ ํ•œ๋‹ค๋ฉด ์ƒ๋‹นํžˆ ํ™œ์šฉ์„ฑ์ด ๋†’์•„ ๋ณด์ด๋Š” ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ธฐ์กด์ƒํ™ฉ ใ€€ํ…Œ๏ปฟ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ž„์˜๋กœ ๋Š๋ฆฐ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋„๋ก URL์„ ๊ตฌ์„ฑํ•˜๊ณ  ์œ„์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Job ํ•˜๋‚˜์— ์•„์ฃผ ์‹ฌํ”Œํ•˜๊ฒŒ Python script๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณด๋„๋ก ํ•˜์ž. ์ž„์˜๋กœ ๋Š๋ฆฐ ์‘๋‹ต์€ http://slowwly.robertomurray.co.uk/ ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์˜€๋‹ค.๏ปฟ import requests urls = [ "http://slowwly.robertomurray.co.uk/delay/0/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/100/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/200/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/500/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/1000/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/2000/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/5000/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/10000/url/https://www.naver.com/", "http://slowwly.robertomurray.co.uk/delay/20000/url/https://www.naver.com/" ] for url in urls: status_code = requests.get(url).status_code if status_code != 200: print(f'์‘๋‹ต ์‹คํŒจ :{url}, status : {status_code}') exit(1) print(f'์‘๋‹ต์„ฑ๊ณต : {url}') ๊ทธ๋ž˜์„œ ์‹คํ–‰ํ•ด๋ณด๋ฉด 50์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ๋‹ค. ์ž, ์ด์ œ ๊ฐœ์„ ์„ ํ•ด๋ณด์ž! ๊ฐœ์„ ์„ ํ•ด๋ณด์ž ใ€€๏ปฟ์ „์ฒด์ ์ธ ๊ฐœ์„ ์˜ ํ๋ฆ„์€ ํ•˜๋‚˜์˜ Job์— ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ ์ž ํ•˜๋Š” url์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ Jenkins Pipeline ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ URL์„ ๋™์‹œ์— ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‘ ๊ฐœ์˜ Job(ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” Job, Jenkins Pipeline Job) ๋งŒ์œผ๋กœ ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๊ตฌ์„ฑ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ์ƒ์„ ํ•˜๊ณ . Job์„ ๋ฒ”์šฉ์ ์œผ๋กœ (Jenkins paramters ํ™œ์šฉ) ใ€€๏ปฟ์œ„์—์„œ ์ƒ˜ํ”Œ๋กœ ์ž‘์„ฑํ•˜์˜€๋˜ Python script๋Š” url ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก Job ์•ˆ์— script๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ์ด๋ฒˆ ๊ฐœ์„ ์˜ ๋ชฉํ‘œ๋Š” ํ•˜๋‚˜์˜ Job์„ Pipeline ์ด ๋ณ‘๋ ฌ๋กœ ์ปจํŠธ๋กคํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Jenkins Job์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์•„๋ž˜์ฒ˜๋Ÿผ Jenkins Job ์„ค์ •์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  Python script ๋˜ํ•œ ์ˆ˜์ •ํ•ด ์ฃผ์ž. ๏ปฟJob > ๊ตฌ์„ฑ > ์ด ๋นŒ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค" ๏ปฟJob > ๊ตฌ์„ฑ > ์ด ๋นŒ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค import requests, os url = os.environ['url'] status_code = requests.get(url).status_code if status_code != 200: print(f'์‘๋‹ต ์‹คํŒจ :{url}, status : {status_code}') exit(1) print(f'์‘๋‹ต์„ฑ๊ณต : {url}') ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์œ„ํ•œ Jenkins ์„ค์ • ใ€€๏ปฟJenkins Job ์„ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Job๋งˆ๋‹ค์˜ ๋Œ€๊ธฐ์—ด(Queue)์ด ์žˆ์–ด Job์ด ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด ์‹œ์ž‘๋œ ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์•ž์„  Job์ด ์ข…๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ด์–ด์„œ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” Job์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ–ˆ๊ธฐ์— Job ์„ค์ • ์ค‘ ํ•„์š”ํ•œ ๊ฒฝ์šฐ concurrent ๋นŒ๋“œ ์‹คํ–‰ ์˜ต์…˜์„ ์ผœ์ค˜์„œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๏ปฟJob > ๊ตฌ์„ฑ > ํ•„์š”ํ•œ ๊ฒฝ์šฐ concurrent ๋นŒ๋“œ ์‹คํ–‰" ๏ปฟJob > ๊ตฌ์„ฑ > ํ•„์š”ํ•œ ๊ฒฝ์šฐ concurrent ๋นŒ๋“œ ์‹คํ–‰ ใ€€๏ปฟ๋˜ํ•œ Jenkins Job ์ž์ฒด๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •๋˜์—ˆ๋‹ค ํ•ด๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ Jenkins ์ž์ฒด์˜ ๋Œ€๊ธฐ์—ด์€ ํ•œ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํžˆ ๋Š˜๋ ค์ค˜์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Job์ด ๋Œ€๊ธฐ ์—ด ์—†์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ ๊ฐœํŽธ๊ธฐ (by HUGO)

์›น์„œ๋น„์Šค ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋‚˜๋งŒ์˜ ๋ธ”๋กœ๊ทธ์ฏค์€ ์žˆ์–ด์•ผ์ง€ ํ•˜๋ฉฐ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•œ ์ง€๋„ ์–ด๋Š๋ง 4๋…„์ด ๋˜์—ˆ๋‹ค. ์ฒ˜์Œ์—” ๊ทธ์ € ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ๊ธฐ์ˆ ์ด๋‚˜ ์‚ฝ์งˆํ•˜๋ฉฐ ๊ฒฝํ—˜ํ•œ ๊ฒƒ๋“ค ์ค‘์— ํ•ต์‹ฌ๋งŒ์„ ์ ์–ด๋†“๋Š” ์ˆ˜์ค€์ด์—ˆ๋‹ค. (์ง€๊ธˆ ๋‹ค์‹œ ๋ณด๋ฉด ๋ญ”๊ฐ€ ์˜ค๊ธ€๊ฑฐ๋ฆฌ๋Š” ๊ฑด ๊ธฐ๋ถ„ ํƒ“์ด๊ฒ ์ง€…) ๊ทธ๋ ‡๊ฒŒ ๊ณ„์† ๊ธ€์„ ์จ์˜ค๋ฉด์„œ ๊ธ€์“ฐ๊ธฐ๋ผ๋Š” ๊ฒƒ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋˜๊ณ  ๋‚ด ๊ธ€์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋  ๊ฑฐ๋ผ๋Š” ๊ธฐ๋Œ€์— ์กฐ๊ธˆ์ด๋ผ๋„ ๊ธ€์„ ์ž˜ ์จ๋ณด๊ณ ์ž ๋‹จ์ˆœ ๊ธฐ๋ก ์šฉ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ‘๊ธ€’์„ ์“ฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์˜จ ๊ฒƒ ๊ฐ™๋‹ค. ใ€€์ผ์ฃผ์ผ์— ํ•œ ๊ฐœ๋Š” ์จ์•ผ์ง€. ํ•œ ๋‹ฌ์— ํ•œ ๊ฐœ๋Š” ์จ์•ผ์ง€. ํ•˜๋ฉฐ ์ž๊พธ ๋‚˜ ์ž์‹ ๊ณผ์˜ ํƒ€ํ˜‘์„ ํ•˜๋‹ค๊ฐ€ ์ตœ๊ทผ์—๋Š” ํšŒ์‚ฌ์—์„œ ์šด์˜ํ•˜๋Š” ์„œ๋น„์Šค ๊ฐœํŽธ ๋•Œ๋ฌธ์— ์ •์‹ ์—†์ด ๋ฐ”์˜๋‹ค๋Š” ํ•‘๊ณ„๋กœ ‘๋ธ”๋กœ๊ทธ’์— ‘ใ…‚’์ž๋„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์€ ๊ฒฐ๊ตญ ๋‚ด ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋„ ํšŒ์‚ฌ ์„œ๋น„์Šค์ฒ˜๋Ÿผ ‘๊ฐœํŽธ’์„ ํ•ด๋ณด์ž๋Š” ์ƒ๊ฐ์œผ๋กœ ๋„๋‹ฌํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ๊ฐ„๋‹จํ•  ๊ฒƒ๋งŒ ๊ฐ™์•˜๋˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๊ฐœํŽธ ์ž‘์—…์€ ๊ฝค ์˜ค๋žซ๋™์•ˆ + ๋‹ค์–‘ํ•œ ์‚ฝ์งˆ๋“ค๋กœ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ใ€€์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฐœํŽธํ•˜๋ฉฐ ๊ฒช์—ˆ๋˜ ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ธฐ์กด์— ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋‚˜ ์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค๊ป˜ ๋„์›€์ด ๋  ๊ฑฐ๋ผ ๊ธฐ๋Œ€ํ•œ๋‹ค. ๋”๋ถˆ์–ด ์„œ๋น„์Šค ‘์ถœ์‹œ’ ๊ฐ€ ์•„๋‹Œ ๊ฐœํŽธ’์ด๋ผ๋Š” ๊ณผ์ • ์†์—์„œ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋˜ ์ธ์‚ฌ์ดํŠธ๋„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๋ณผ๊นŒ ํ•œ๋‹ค. ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ ํ”Œ๋žซํผ ์„ ํƒ ใ€€์ฒ˜์Œ ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ํฌํ„ธ์„œ๋น„์Šค์˜ ๊ธ€์“ฐ๊ธฐ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜๋‹ค. ‘๊ธ€์“ฐ๊ธฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž์ด๊ธฐ์— ์›น์‚ฌ์ดํŠธ(๋ธ”๋กœ๊ทธ)๋ฅผ ๋‚ด ์ž…๋ง›์— ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜๊ธฐ ์œ„ํ•ด์„œ. ๊ทธ ์ด์œ ๋กœ hexo ๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— github์˜ ํ˜ธ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์šด์˜์„ ํ•ด์™”๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•ด์˜ค๋ฉด์„œ ๋Š๊ผˆ๋˜ ๋ถˆํŽธํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ๊ฐœํŽธ์„ ํ•˜๋ฉฐ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์„ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ํ…Œ๋งˆ(UI)๊ฐ€ ์ด๋ป์•ผ ํ•˜๊ณ  ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์ธ ๋งŒํผ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์‚ฝ์ž…๋˜๋‹ˆ ์ฝ”๋“œ ํ‘œํ˜„ ๋˜ํ•œ ์ด๋ป์•ผ ํ•œ๋‹ค. ํ…Œ๋งˆ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ๋ฐœํ•ด์•ผ ํ•œ๋‹ค. ํŽ˜์ด์ง€ ์ƒ์„ฑ ๋˜๋Š” ๋งŒ๋“ค์–ด์ง„ ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์•ผ ํ•œ๋‹ค. ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์ด ์‹ฌํ”Œํ•˜๊ณ  ๊น”๋”ํ•ด์•ผ ํ•œ๋‹ค. ๏ปฟ ใ€€์œ„์™€ ๊ฐ™์€ ์ด์œ ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ค SSG(์“ฑ ์‡ผํ•‘๋ชฐ ์•„๋‹˜, Static site generators)๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋†“์€ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค. ์ •๋ง ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๋“ค์„ ์‚ดํŽด๋ณด๋ฉฐ ํ•„์ž์—๊ฒŒ ๋งž๋Š” ๊ฒŒ ์–ด๋–ค ๊ฑด์ง€ ๊ณ ๋ฏผํ•˜๋‹ค ๊ฒฐ๊ตญ hugo ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค. hugo๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” go๋ผ๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ (๊ฐ„์ ‘์ ์œผ๋กœ๋ผ๋„ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ + go ์–ธ์–ด๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์†Œ๋ฆฌ๋ฅผ ์–ด๋””์„ ๊ฐ€ ๋“ค์–ด์„œ) ํ…Œ๋งˆ๋“ค์ด ๋„ˆ๋ฌด ๋‹ค์–‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๏ปฟ์•„์ฃผ ๋Œ€๋†“๊ณ  ๋น ๋ฅด๋‹ค๊ณ  ํ•˜๋‹ˆ… ์“ฐ๊ณ  ์‹ถ์–ด์ง„๋‹ค." ๏ปฟ์•„์ฃผ ๋Œ€๋†“๊ณ  ๋น ๋ฅด๋‹ค๊ณ  ํ•˜๋‹ˆ… ์“ฐ๊ณ  ์‹ถ์–ด์ง„๋‹ค. ใ€€๊ฒฐ๊ตญ hugo์— hugo-ranking-trend๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์ƒ์œ„์— ๋žญํฌ๊ฐ€ ๋˜์–ด์žˆ๊ณ  ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ์„ฑ๊ฒฉ์— ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์€ LoveIt์ด๋ผ๋Š” ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. ์ž ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ?! hugo ๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”๊ฑฐ์•ผ? ๏ปฟใ€€๋Œ€๋ถ€๋ถ„์˜ ์˜คํ”ˆ์†Œ์Šค๋Š” hello world ํ˜น์€ quick start ๊ฐ™์ด ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋„ํ๋จผํŠธ๊ฐ€ ์žˆ๊ธฐ ๋งˆ๋ จ. hugo๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ quick-start๊ฐ€ ์žˆ์—ˆ๊ณ  ์ด๋ฅผ ์ฒœ์ฒœํžˆ ๋”ฐ๋ผ ํ•˜๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดˆ๊ธฐ ์„ธํŒ…์„ ํ•  ์ˆ˜ ์žˆ์—ˆ… ์„๊บผ๋ผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ ์•ฝ๊ฐ„ ์ดˆ๊ธฐ ์„ค์ • ๊ณผ์ •์ด ์–ด๋ ค์›Œ์„œ ๋‚จ๊ฒจ ๋‘๊ณ ์ž ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ํ•„์ž๋Š” ์œˆ๋„ 10 ํ™˜๊ฒฝ์—์„œ ๊ตฌ์„ฑํ•˜์˜€๋‹ค. mac์ด๋ผ๋ฉด ๋” ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์ด ๋ถ€๋ถ„์€ OS์˜ ์ฐจ์ด์—์„œ ์ƒ๊ฒจ๋‚˜๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์•ฝ๊ฐ„์˜ ์žฅ๋ฒฝ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ์ด์œ ํ…Œ๋งˆ์™€ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธฐ๋Œ€๊ฐ์œผ๋กœ ๊พน ์ฐธ์•„๋ณธ๋‹ค. ๊ธฐ๋ณธ์„ค์ • ใ€€๏ปฟgit์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์šฐ์„  hugo๋Š” go ์–ธ์–ด๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ์— ์šฐ์„  go๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์šด๋กœ๋“œํŽ˜์ด์ง€์—์„œ ํ™˜๊ฒฝ์— ๋งž๋Š” ์„ค์น˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜๋ฅผ ํ•ด์ค€๋‹ค. ๋‹ค์Œ์œผ๋กœ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ธ chocolatey ๋˜ํ•œ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ํŽ˜์ด์ง€์—์„œ ๋‚˜์™€์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์„ค์น˜ ์™„๋ฃŒ. ํ•„์ž๋Š” ์—ฌ๊ธฐ์„œ ์ง„ํ–‰์ด ์ž˜ ์•ˆ๋์—ˆ๋Š”๋ฐ, ‘๊ด€๋ฆฌ์ž ๊ถŒํ•œ’์œผ๋กœ PowerShell ์„ ์‹คํ–‰์‹œ์ผœ์•ผ์ง€๋งŒ ์„ฑ๊ณต์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.๏ปฟ ๏ปฟใ€€์œ„ ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด ๋“œ๋””์–ด hugo๋ฅผ ์„ค์น˜ํ•ด ์ฃผ๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค€ ๋’ค ์ƒ˜ํ”Œ๋กœ ๊ธ€ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ  ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋ฉด ๋. # chocolatey ์— ์˜ํ•ด hugo ์„ค์น˜ choco install hugo -confirm # hugo ์ดˆ๊ธฐํ™” hugo new site quickstart # post ์ƒ์„ฑ hugo new posts/post-name.

๊ทธ๋Ÿฐ ๊ฐœ๋ฐœ์ž๋กœ ๊ดœ์ฐฎ์€๊ฐ€ - '๋กœ๊ทธ & ๋ชจ๋‹ˆํ„ฐ๋ง' ํŽธ

์บ๋ฆญํ„ฐ๋ฅผ ์œก์„ฑํ•˜๋ฉฐ ๊ฒŒ์ž„ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ๋” ์ข‹์€ ์•„์ดํ…œ์„ ์–ป๊ฑฐ๋‚˜ ํ€˜์ŠคํŠธ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์บ๋ฆญํ„ฐ๋ฅผ ์„ฑ์žฅ์‹œํ‚จ๋‹ค. ์‚ฌ๋ƒฅ์„ ํ•˜๋‹ค ์ฒด๋ ฅ์ด ๋–จ์–ด์ง€๊ฒŒ ๋˜๋ฉด ๋ฌผ์•ฝ์„ ๋จน๊ณ , ์บ๋ฆญํ„ฐ์˜ ๋Šฅ๋ ฅ ์ค‘ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ›ˆ๋ จ์„ ๋” ํ•˜๊ฑฐ๋‚˜ ๊ทธ์— ๋งž๋Š” ์•„์ดํ…œ์„ ์žฅ์ฐฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์บ๋ฆญํ„ฐ์˜ ‘์ƒํƒœ’๋ฅผ ์ ์ ˆํ•œ UI๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ‘ํ™•์ธ’์ด ๊ฐ€๋Šฅํ•˜๊ณ  ‘๋Œ€์‘’์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. ใ€€์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜ํ•œ ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ•œ ๊ฒŒ์ž„์ƒ์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹๊นŒ ์‹ถ๋‹ค. ๋ณต์žกํ•œ ์ŠคํŽ™์„ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉฐ ๋กœ์ง ๋™์ž‘์—๋Š” ์ด์ƒ์ด ์—†์Œ์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด ๊ทธ๊ฑธ๋กœ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐœ๋ฐœ์ž์˜ ‘๋ ˆ๋ฒจ’์€ ์ด ๋ถ€๋ถ„์—์„œ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์šด์˜ํ™˜๊ฒฝ์— ์ถœ์‹œํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”์ง€, ํŠธ๋ž˜ํ”ฝ์ด ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์˜ค๊ณ  ์žˆ๊ณ  ํŠธ๋ž˜ํ”ฝ์˜ ์œ ํ˜•์€ ๋˜ ์–ด๋– ํ•œ์ง€, ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์†๋„๋Š” ์–ด๋–ป๊ณ  ์„œ๋ฒ„์˜ ์‹œ์Šคํ…œ ์ง€ํ‘œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๋“ฑ๋“ฑ. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•˜๊ฒ ์ง€๋งŒ ์ ์ ˆํ•œ ๋กœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ‘์ƒํƒœ’๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ‘๋Œ€์‘’ํ•˜๋Š” ๊ฒŒ ๊ผญ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ใ€€์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํฌ๊ฒŒ ๋กœ๊น…๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ‘๊ฐœ๋ฐœ’์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ๋˜ ๊ด€์ ์„ ๋ณด๋‹ค ๋” ๋†’์€ ๊ณณ์—์„œ ๋ฐ”๋ผ๋ณด๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ‘์šด์˜’ ์ธก๋ฉด์—์„œ๋„ ๊ณ ๋ฏผํ•ด ๋ณด๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ์œผ๋ฉด ํ•œ๋‹ค. ํ•„์ž๋Š” ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž์ด๋‹ค ๋ณด๋‹ˆ ๊ธ€์˜ ๋‚ด์šฉ์ด ๋‹ค์†Œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž์˜ ์‹œ์„ ์—์„œ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ‘๊ฐœ๋ฐœ์ž’๋ผ๋ฉด ์œ ํ˜•๋งŒ ๋‹ค๋ฅด์ง€ ๋Œ€๋ถ€๋ถ„ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋กœ๊ทธ๋Š” ์–ด๋–ค๊ฑธ, ์–ด๋–ป๊ฒŒ ๋‚จ๊ฒจ์•ผ ํ• ๊นŒ? ใ€€๏ปฟ๋กœ๊ทธ๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ๋‹ค. (๊ตณ์ด ๋งํ•˜์ง€ ์•Š์•„๋„ ๊ทธ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค๋Š” ํ‘œํ˜„์ด ๋” ์–ด์šธ๋ฆด ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.) ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ์„  ์–ด๋–ค ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์•ผ ํ• ๊นŒ? ํ•„์ž๊ฐ€ ๊ฟˆ๋‚˜๋ฌด ์‹œ์ ˆ๋•Œ ๋‚˜๋ˆ„์—ˆ๋˜ ์กฐ์ง์žฅ๋‹˜๊ณผ์˜ ๋Œ€ํ™” ๋‚ด์šฉ" ํ•„์ž๊ฐ€ ๊ฟˆ๋‚˜๋ฌด ์‹œ์ ˆ๋•Œ ๋‚˜๋ˆ„์—ˆ๋˜ ์กฐ์ง์žฅ๋‹˜๊ณผ์˜ ๋Œ€ํ™” ๋‚ด์šฉ ใ€€๏ปฟ์•„์ง๊นŒ์ง€๋„ ๊ธฐ์–ต์— ๋‚จ์•„์žˆ๋Š” ์˜ˆ์ „ ์กฐ์ง ์žฅ๋‹˜๊ณผ์˜ ๋Œ€ํ™”. ์ผ๋‹จ ๋กœ๊ทธ๋Š” ์ตœ๋Œ€ํ•œ ๋งŽ์ด (๊ณผํ•˜๊ฒŒ) ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋‹ค์Œ ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ๋“ค์€ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ ˆ๋ฒจ์„ ๋‚ฎ์ถ”๋Š” ๋“ฑ ์ƒํ™ฉ์— ๋งž๋„๋ก ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค. ๊ฒฝํ—˜์„ ํ•ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์šด์˜ํ™˜๊ฒฝ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋งŒ๋‚˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๊ฒฝํ—˜ํ•ด๋ณด์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ณค ํ•œ๋‹ค. ์ด๋Ÿด ๋•Œ ์ƒํ™ฉ์— ๋งž๋Š” ๋กœ๊ทธ๋“ค์ด ์žˆ๋‹ค๋ฉด ๋ฏธ๋ฆฌ ๋‚จ๊ฒจ๋‘” ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋” ํšจ๊ณผ์ ์œผ๋กœ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์˜ ์ •๋ณด(request url, parameter, UA, remote ip ๋“ฑ)๋ฅผ ๋‚จ๊ฒจ์„œ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋ถ„์„ํ•˜๋Š”๋ฐ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์™ธ๋ถ€๋กœ ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋‚œ ๋’ค์— ๋ฐ›๋Š” ์‘๋‹ต์— ๋Œ€ํ•ด์„œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ๋‘๋ฉด ์™ธ๋ถ€ ํ†ต์‹ ์˜ ์˜ค๋ฅ˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ์šด์˜ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ค ํ–‰๋™์„ ํ•˜๋Š”๊ฐ€์— ๊ด€์ ์„ ๋‘๊ณ  ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ใ€€๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋‹ค์–‘ํ•˜๋‹ค. ์‹œ์Šคํ…œ ๋กœ์ปฌ์— ํŒŒ์ผ๋กœ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ํŠน์ • ๋กœ๊ทธ ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ํ•œ๊ณณ์—์„œ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค๋งŒ ๋กœ๊ทธ๋ฅผ ‘๋‚จ๊ธฐ๋Š”’ ๊ฒƒ ๋˜ํ•œ ํ•˜๋‚˜์˜ ๋น„์šฉ์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์— ์ตœ๋Œ€ํ•œ ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ํ•œ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. (ํ˜น์€ ๋น„๋™๊ธฐ๋กœ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๋“ฑ) ใ€€๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ์ด์œ  ์ค‘ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ‘๋‚˜์ค‘์— ๋ณด๊ธฐ ์œ„ํ•ด์„œ’์ด๋‹ค. ๊ทธ๋งŒํผ ํ•œ๋ฒˆ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ๋•Œ์—๋„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค. ์˜ˆ์ปจ๋Œ€, ์•„๋ž˜์— ์ ์–ด๋†“์€ ๋กœ๊ทธ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์ž‘์€ ์ฐจ์ด์ง€๋งŒ ๋‚˜์ค‘์— ๋ณผ ๋•Œ ๊ฝค ํฐ ์ฐจ์ด๋ฅผ ์œ ๋ฐœํ•œ๋‹ค. ๏ปฟ ์•ˆ์ข‹์€ ์˜ˆ try { ... } catch (Exception e){ log.Error(e); // ์–ด๋–ค ์ƒํ™ฉ์ด์ง€..? } ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ข‹์€ ์˜ˆ try { ... } catch (Exception e){ log.Error("url : " + url + ", parameter : " + parameter + ", remote ip : " + remoteIp, e); // ๋กœ๊ทธ๋Š” ๊ฐ€๊ธ‰์  ์ž์„ธํ•˜๊ฒŒ ! } ๋กœ๊ทธ๊ฐ€ ๊ฐ€์ ธ๋‹ค ์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ์„ธ์ƒ ใ€€๋กœ๊ทธ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋นŒ๋“œ/ํ…Œ์ŠคํŠธ๋Š” ๋‚ด๊ฐ€ ํ•ด์ค„๊ฒŒ. ๋„ˆ๋Š” ์ฝ”๋”ฉ์— ์ง‘์ค‘ํ•ด (by GitHub Pull Request Builder)

git ์€ ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์ค‘ ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ ์ •๋„๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฅผ ์›น์„œ๋น„์Šค์—์„œ ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ์‹œ์Šคํ…œ์ด Github. Github ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ค‘์— ๊ฐ€์žฅ ํฐ ์ด์œ ๋ฅผ ํ•˜๋‚˜๋งŒ ์ด์•ผ๊ธฐํ•ด๋ณด์ž๋ฉด ๋ฐ”๋กœ ์˜จ๋ผ์ธ์ƒ์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” pullRequest๋ผ๋Š” ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐ์„ ํ•ด๋ณธ๋‹ค. ใ€€pullRequest๋Š” work branch์—์„œ ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ base branch๋กœ merge ์ „ ๊ผญ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์ž‘์—…ํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ๋‹ค. ์ด๋Ÿฌํ•œ ์ž๋™ํ™”๋Š” CI(์ง€์†์  ํ†ตํ•ฉ) ๊ด€์ ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ฒดํฌํ•ด์•ผ ํ•  ๋ถ€๋ถ„๋“ค(๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ์ •์  ๋ถ„์„ ๋“ฑ)์„ “์•Œ์•„์„œ” ํ•ด์ค€๋‹ค๋ฉด ์ž‘์—…์ž๋Š” ์˜ค๋กฏ์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ๋งŒ ์‹ ๊ฒฝ ์“ธ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ƒ์‚ฐ์„ฑ ์ ˆ์•ฝ ์ธก๋ฉด์—์„œ ์—„์ฒญ๋‚œ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ํ•˜๋Š”์ผ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ! ์ถœ์ฒ˜ : https://www.clien.net/service/board/park/10453442" ๋‚ด๊ฐ€ ํ•˜๋Š”์ผ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ! ์ถœ์ฒ˜ : https://www.clien.net/service/board/park/10453442 ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ทธ์ค‘์—์„œ๋„ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์„ค์ •๋งŒ์œผ๋กœ work branch์˜ ๋นŒ๋“œ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” Jenkins์˜ Github Pull Request Builder๋ฅผ ์„ค์น˜ ๋ฐ ํ™œ์šฉํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ์‚ฌ์‹ค ์ตœ๊ทผ ํŒ€์—์„œ CI ์„œ๋ฒ„๋ฅผ ์ด์ „ํ•ด์•ผ ํ–ˆ์—ˆ๋‹ค. ๋จธ๋ฆฟ์†์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋˜๊ฒ ์ง€ ์‹ถ์—ˆ์ง€๋งŒ ๋ง‰์ƒ ํ•ด๋ณด๋ ค๋‹ˆ Jenkins ๋ฒ„์ „์—…๋„ ๋˜์—ˆ๊ณ  ๋ญ๋ถ€ํ„ฐ ํ•ด์•ผ ํ• ์ง€ ํ—ˆ๋‘ฅ๋Œ€๋Š” ํ•„์ž๊ฐ€ ๋ถ€๋„๋Ÿฌ์› ๋‹ค. ์ด์ฐธ์— ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ฉฐ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฆฌ๋งˆ์ธ๋“œ ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ณ ์ž ํ•œ๋‹ค. (์ด๋ž˜์„œ ๊ธฐ์–ต๋ณด๋‹ค ๊ธฐ๋ก์ด ์ค‘์š”ํ•˜๋‹ค.) ์ค€๋น„๋ฌผ ใ€€์ „์ฒด์ ์ธ ํ๋ฆ„์€ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ˜๋Ÿฌ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์„œ๋ฒ„์— Jenkins ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. Jenkins ์„ค์น˜๋Š” ํ•„์ž์˜ ํฌ์ŠคํŒ…(Jenkins ์„ค์น˜ ์น˜ํŠธํ‚ค)๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ „์ฒด์ ์ธ ํ๋ฆ„" ์ „์ฒด์ ์ธ ํ๋ฆ„ ใ€€์ฐธ๊ณ ๋กœ ํ•„์ž๋Š” GitHub Enterprise ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ผ๋ฐ˜ Github์—์„œ๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. Github๊ณผ Jenkins์˜ ์—ฐ๋™์„ ์œ„ํ•œ 2๊ฐ€์ง€ ์„ค์ • ใ€€Github ๊ณผ Jenkins ๊ฐ€ ํ†ต์‹ ์ด ๋˜๋„๋ก ์„ค์ •ํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ Github์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ Jenkins ๊ฐ€ ๋นŒ๋“œ๋ฅผ ํ•˜๊ณ  ๊ทธ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ Github์— ๋ฆฌํฌํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ๋กœ ssh ์„ค์ •์œผ๋กœ Github์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ssh ์„ค์ •์„ ํ•ด๋‘์ž. ssh ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•„์ž์˜ ํฌ์ŠคํŒ…(Github๊ณผ Jenkins ์—ฐ๋™ํ•˜๊ธฐ)ํŽธ์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ใ€€๊ทธ๋‹ค์Œ์œผ๋กœ ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐํ•  GitHub Pull Request Builder๋ผ๋Š” Jenkins plugin ์ด ๋นŒ๋“œ๊ฐ€ ๋๋‚œ ๋’ค์— ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํŒ… ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„๋‘์ž. Github > Settings > Developer settings > Personal access tokens ํ™”๋ฉด์—์„œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ ํ‚ค๋ฅผ ์ €์žฅํ•ด ๋‘”๋‹ค. (์ด ํ‚ค๋Š” ๋ณด์•ˆ์— ์œ ์˜ํ•ด์•ผ ํ•˜๊ณ , ํ™”๋ฉด ๊ฒฝ๊ณ (?)์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ‚ค๋Š” ์ƒ์„ฑ ์‹œ ํ•œ ๋ฒˆ๋ฐ–์— ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘ฌ์•ผ ํ•œ๋‹ค.) ์ธ์ฆํ† ํฐ์„ ๋ฏธ๋ฆฌ ๋ฐ›์•„๋‘์ž." ์ธ์ฆํ† ํฐ์„ ๋ฏธ๋ฆฌ ๋ฐ›์•„๋‘์ž. Jenkins ์„ค์ • ใ€€Jenkins > ๊ด€๋ฆฌ > pluginManager์— ๋“ค์–ด๊ฐ€ GitHub Pull Request Builder๋ฅผ ๊ฒ€์ƒ‰ ํ›„ ์„ค์น˜ํ•ด ์ค€๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ Jenkins > ๊ด€๋ฆฌ > ํ™˜๊ฒฝ์„ค์ •์— ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด GitHub Pull Request Builder ํ•ญ๋ชฉ์ด ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์œ„์—์„œ ์„ค์ •ํ•œ ์ธ์ฆํ† ํฐ์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋“ฑ๋ก ํ›„ ์ €์žฅ์„ ํ•œ๋‹ค. credentials ์„ ์œ„์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆํ† ํฐ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค." credentials ์„ ์œ„์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆํ† ํฐ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค. ใ€€Jenkins job์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  pullRequest ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •์„ ํ•ด์ค€๋‹ค. ๋จผ์ € General ํƒญ์— Github project์— Github url ์„ ์ ์–ด์ฃผ๊ณ  ใ€€์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ํƒญ์—์„œ ssh ์ฃผ์†Œ๋ฅผ ์ ๊ณ  ์œ„์—์„œ ๋ฏธ๋ฆฌ ์„ค์ •ํ•œ ssh ํ‚ค๋กœ credentials ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. ์ „์—๋„ ์ด์•ผ๊ธฐํ–ˆ์ง€๋งŒ ์ด ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋นจ๊ฐ„์ƒ‰ ๊ธ€์”จ๋กœ ์˜ค๋ฅ˜ ๋‚ด์šฉ์ด ๋‚˜์˜ค๊ณ  ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚˜์˜จ๋‹ค. Refspec ์— +refs/pull/*:refs/remotes/origin/pr/* ๋ผ๊ณ  ์ ์–ด์ฃผ๊ณ  ๋ธŒ๋žœ์น˜ ์„ค์ •์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์™€์„œ pullRequest๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ธŒ๋žœ์น˜๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ${sha1} ๋ผ๊ณ  ์ ์–ด์ฃผ์ž.

๋ฒŒ์จ 2๋…„ (feat. ํ† ์ดํ”„๋กœ์ ํŠธ ํšŒ๊ณ ,๊ฐ€์น˜,์ˆ˜์ž…)

์ •ํ™•ํžˆ 2018๋…„ 07์›” 12์ผ ํ•„์ž์˜ ์ฒซ ํ† ์ด ํ”„๋กœ์ ํŠธ์ธ โ€˜๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๊ตฌ๋… ์„œ๋น„์Šคโ€™๋ฅผ ์˜คํ”ˆํ•˜๊ฒŒ ๋œ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๊ตฌ๋…(๊ฐ€์ž…) ํ•˜๊ฒ ์–ด ํ•˜๋Š” ์ƒ๊ฐ์ด ๋ถ€๋„๋Ÿฌ์šธ ๋งŒํผ 6๊ฐœ์›”์ด ์ง€๋‚˜ ๊ตฌ๋…์ž ์ˆ˜๋Š” 1,000๋ช…์„ ๋„˜๊ธฐ๊ณ  1๋…„์ด ์ง€๋‚˜ 2,000๋ช….์–ด๋Š๋ง ๋‹ฌ๋ ฅ์„ ๋ณด๋‹ˆ ์˜ค๋Š˜์ด ์ •ํ™•ํ•˜๊ฒŒ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์„œ๋น„์Šคํ•œ์ง€ ๋ฒŒ์จ 2๋…„์ด ๋˜๋Š” ๋‚ . ๊ตฌ๋…์ž ์ˆ˜๋Š” ์–ด๋Š๋ง 3,000๋ช…์„ ๋„˜์–ด์„ ๋‹ค. ๋ญ”๊ฐ€ ๋ฟŒ๋“ฏํ•˜๋ฉด์„œ๋„ ์„œ๋น„์Šค๋ฅผ ์ข€ ๋” ๋””๋ฒจ๋กญ ํ•˜์ง€ ๋ชปํ•œ ํ•„์ž ์ž์‹ ์„ ๋Œ์•„๋ณด๋‹ˆ ๊ดœํžˆ ๋งˆ์Œ์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ณ . ๋ญ”๊ฐ€ ํ•ด์•ผํ•˜๋Š”๋ฐ… ๊ดœํžˆ ๋ˆˆ์น˜๋งŒ ๋ณด์ด๋„ค…์ถœ์ฒ˜ : http://egloos.zum.com/nievess/v/657827" ๋ญ”๊ฐ€ ํ•ด์•ผํ•˜๋Š”๋ฐ… ๊ดœํžˆ ๋ˆˆ์น˜๋งŒ ๋ณด์ด๋„ค… ์ถœ์ฒ˜ : http://egloos.zum.com/nievess/v/657827 ใ€€์ง€๋‚œ 2๋…„ ๋™์•ˆ์„ ๋Œ์ด์ผœ๋ณด๋ฉฐ ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์šด์˜ํ•ด ์™”๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ† ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•„์ž์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ์—ˆ๋Š”์ง€ ๋˜๋Œ์•„๋ณด๋ฉฐ ์…€ํ”„ ๋ฆฌ๋ทฐ๋ฅผ ํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ์„œ๋น„์Šค ์ž์ฒด ํ‰๊ฐ€ ์‹ฌํ”Œํ•œ ๊ธฐ๋Šฅ ใ€€๋ง ๊ทธ๋Œ€๋กœ ํ† ์ด ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ ๋˜ํ•œ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค. awesome-devblog์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐœ์ธ/๋‹จ์ฒด ๋ธ”๋กœ๊ทธ๋“ค์˜ ํฌ์ŠคํŒ…์„ ์กฐํšŒํ•˜์—ฌ ์–ด์ œ ์ž‘์„ฑ๋œ ๊ธ€๋“ค๋งŒ ๋ชจ์•„ ๋ฐœ์†กํ•œ๋‹ค. ๊ฑฐ๊ธฐ์— ์ฃผ๊ฐ„ ๋งŽ์ด ํด๋ฆญ๋œ ํฌ์ŠคํŒ…์„ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ ๋” ๋ฐœ์†กํ•˜๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€. ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋” ๋””๋ฒจ๋กญ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์•„์ด๋””์–ด๊ฐ€ ์—†์–ด์„œ ์ธ์ง€ ๋””๋ฒจ๋กญ ํ•  ํž˜์ด ์•ˆ ๋‚˜์„œ ์ธ์ง€ ์œ ์ง€๋งŒ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋‹ค. ์„œ๋น„์Šค์— ์—†์–ด์„œ๋Š” ์•ˆ๋  ‘๋กœ๊น…(Logging)’ ใ€€ํ˜•์‹์„ ๋ง‰๋ก ํ•˜๊ณ  ์ปดํ“จํ„ฐ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ชจ๋“  ‘ํ”„๋กœ๊ทธ๋žจ’์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ๋กœ์ง์— ๋”ฐ๋ผ ์›€์ง์ด๋Š” ๋กœ๋ด‡์— ๋ถˆ๊ณผํ•˜๋‹ค. ๋ฌผ๋ก  ์š”์ฆ˜์—๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์ด๋‚˜ AI ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์Šค์Šค๋กœ ํ•™์Šตํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ ๊ทธ ๋˜ํ•œ ๋ฏธ๋ฆฌ ์ฝ”๋”ฉ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„๋“ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ์ด์ œ๊นŒ์ง€ ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ”๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์ „์— ์ค€๋น„ํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ‘๋กœ๊น…’. ์„œ๋น„์Šค ํˆฌ์ž… ์ „๋ถ€ํ„ฐ ํ”„๋ก ํŠธ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋กœ๊น…์„ ํ•ด์„œ์ธ์ง€ 2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ, ๊ธฐ๋ก๋œ ๋กœ๊ทธ๋กœ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์ง€ํ‘œ๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Œ์— ๋‹คํ–‰์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ๊ฐ์ข… ์ง€ํ‘œ ใ€€๋จผ์ € ๋ด์•ผ ํ•  ์ง€ํ‘œ๋Š” ๋‹น์—ฐํžˆ ๊ฐ€์ž…/ํ•ด์ง€ ์ถ”์ด. ๋“œ๋ผ๋งˆํ‹ฑ ํ•œ ์„ ํ˜• ๊ทธ๋ž˜ํ”„๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‹น์—ฐํžˆ(?) ํ•ด์ง€ ๋ณด๋‹ค ๊ฐ€์ž…์ด ๋” ๋งŽ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์–ด๋Š ์ •๋„ ๊พธ์ค€ํ•˜๊ฒŒ ๊ฐ€์ž…์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ์•Œ๊ณ  ๊ฐ€์ž…์„ ํ•˜๋Ÿฌ ์˜ค๋Š”์ง€ ์‹ ๊ธฐํ•  ๋”ฐ๋ฆ„์ด๋‹ค. ํ•˜์ง€๋งŒ ๋งˆ๋ƒฅ ์‹ ๊ธฐํ•ดํ•˜์ง€๋งŒ ๋ง๊ณ  ํ•ด์ง€ํ•˜๋Š” ์›์ธ์„ ๋ถ„์„ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ธ๋‹ค. ์•„๋งˆ๋„ ์ˆ˜์ง‘ํ•˜๋Š” ๋ธ”๋กœ๊ทธ๋“ค ์ค‘ ๊ฐ„ํ˜น ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋˜์ง€ ์•Š๋Š” ๊ธ€๋“ค์ด ์ข…์ข… ์ˆ˜์ง‘๋˜์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค. ๊ฐ€์ž…/ํ•ด์ง€ ํŠธ๋žœ๋“œ" ๊ฐ€์ž…/ํ•ด์ง€ ํŠธ๋žœ๋“œ ใ€€๋‹ค์Œ์œผ๋กœ๋Š” ํด๋ฆญ์ˆ˜. ๋ˆˆ์น˜๊ฐ€ ๋น ๋ฅธ ๋ถ„๋“ค์€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฒ ์ง€๋งŒ ์ด๋ฉ”์ผ์—์„œ ํด๋ฆญ ์‹œ ์„œ๋ฒ„์—์„œ ๊ฐ์ข… ๋กœ๊น…์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ํด๋ฆญ ์„ฑํ–ฅ(?)์— ๋Œ€ํ•ด ์ง‘๊ณ„๋„ ๊ฐ€๋Šฅํ•œ๋ฐ ์•„๋ž˜ ์ง€ํ‘œ๋ฅผ ๋ณด๋ฉด ์˜ค์ „ ์ผ๊ณผ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋ฉ”์ผ๋กœ ์ข…ํ•ฉ๋œ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๋“ค์„ ์ฝ๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ์ค‘์—์„œ ํŠนํžˆ ์›”์š”์ผ - 10์‹œ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํด๋ฆญ์ˆ˜๊ฐ€ ์ง‘๊ณ„๋˜์—ˆ๋‹ค. ํด๋ฆญ์ˆ˜ ํŠธ๋žœ๋“œ | ์‹œ๊ฐ„+์š”์ผ ๋ณ„ ํด๋ฆญ์ˆ˜ ํŠธ๋žœ๋“œ | ์‹œ๊ฐ„+์š”์ผ ๋ณ„ ํด๋ฆญ์ˆ˜ ํžˆํŠธ๋งต" ํด๋ฆญ์ˆ˜ ํŠธ๋žœ๋“œ | ์‹œ๊ฐ„+์š”์ผ ๋ณ„ ํด๋ฆญ์ˆ˜ ํŠธ๋žœ๋“œ | ์‹œ๊ฐ„+์š”์ผ ๋ณ„ ํด๋ฆญ์ˆ˜ ํžˆํŠธ๋งต ใ€€์ด ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์•ฝ 19,000์—ฌ ๊ฐœ์˜ ํฌ์ŠคํŒ…์„ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐœํ–‰ํ•˜์˜€๋Š”๋ฐ ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ์—ˆ๋˜ ํฌ์ŠคํŒ… TOP 30 ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์•„๋ฌด๋ž˜๋„ ๋‹จ์ฒด ๋ธ”๋กœ๊ทธ์˜ ํฌ์ŠคํŒ…์„ ๋ฉ”์ผ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ณ  ๋…ธ๋ž€์ƒ‰์œผ๋กœ ํ…Œ๋‘๋ฆฌ๋ฅผ ํ‘œ์‹œํ•ด์„œ์ธ์ง€ ๋Œ€๋ถ€๋ถ„์˜ ๊ธ€๋“ค์ด ๋‹จ์ฒด ๋ธ”๋กœ๊ทธ์˜ ํฌ์ŠคํŒ…์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ํšŒ์‚ฌ, ์ด ์„ธ์ƒ ์ฟจํ•จ์ด ์•„๋‹ˆ๋‹ค ๋Œ€๋†“๊ณ  ์ž๋ž‘ํ•˜๋Š” ๊ธ€ LINE ์‹ ์ž… SW ๊ฐœ๋ฐœ์ž ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ, ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค ์šฐํ…Œ์ฝ”์—์„œ ์ฐพ์€ ๋‚˜๋งŒ์˜ ํšจ๊ณผ์ ์ธ ๊ณต๋ถ€๋ฒ• LINE ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ๊นŒ์ง€ ๋‚ด๊ฐ€ ์ค€๋น„ํ•œ ๊ฒƒ๋“ค ์—ฐ๋ด‰์„ ๋†’์ด๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€? ํ•™๊ต์—์„œ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” 17๊ฐ€์ง€ ์‹ค๋ฌด ๊ฐœ๋ฐœ ๊ธฐ์ˆ  ๋ฆฌ๋ทฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ด์ƒํ•œ ์•Œ๋žŒ ํŒ€ ๋ฌธํ™”์˜ ํƒ„์ƒ LINE์—์„œ ์ „ ์ง์›์ด ์žฌํƒ ๊ทผ๋ฌดํ•˜๋ฉด์„œ ์ƒ์‚ฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• Flutter, ์™œ ์„ ํƒํ•˜์ง€ ๋ชปํ–ˆ๋‚˜ ์ฃผ์„ ๋‹ฌ ์‹œ๊ฐ„์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ œ๋Œ€๋กœ ํ•˜๊ธฐ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค : ์ƒˆ๋กœ์šด ์‹œ์ž‘ ๊ธฐํš์ž๋Š” ํ•„์š”์—†๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•ด ๋ณด๋Š” JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค : ๋‚˜๋งŒ์˜ ํ•ญ๋กœ ์ฐพ๊ธฐ ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ชจ์Œ ์„œ๋น„์Šค๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๊ฐœ๋ฐœ์ž๋กœ ๊ดœ์ฐฎ์€๊ฐ€ - '์ž๊ธฐ๊ณ„๋ฐœ' ํŽธ

ํ•™์ฐฝ ์‹œ์ ˆ์—” ‘์„ ์ƒ๋‹˜’๊ป˜์„œ ์ •ํ•ด๋†“์œผ์‹  ์ปค๋ฆฌํ˜๋Ÿผ์— ๋”ฐ๋ผ๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ํฐ ๋ฌธ์ œ ์—†์ด ์ง€์‹์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์น˜๋ฅด๋Š” ์‹œํ—˜์„ ํ†ตํ•ด ‘์ ์ˆ˜’๋ผ๋Š” ํ‰๊ฐ€ ๊ธฐ์ค€์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์ž˜ ์„ฑ์žฅํ–ˆ๋‚˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์กธ์—… ํ›„ ์–ด๋ ต๊ฒŒ ์–ด๋ ต๊ฒŒ ์ทจ์—…์— ์„ฑ๊ณต์„ ํ•˜์—ฌ ‘์‹ ์ž… ๊ฐœ๋ฐœ์ž’๋ผ๋Š” ๋ฐฐ์ง€๋ฅผ ๋‹ฌ๊ณ  ํšŒ์‚ฌ์— ์ฒซ ์ถœ๊ทผ. ๊ทธ๋ ‡๊ฒŒ n ๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๊ณผ ๋ผ๋–ผ ์‹œ์ ˆ(?)์„ ๋น„๊ตํ•ด ๋ณด๋ฉฐ ๊ณผ์—ฐ ‘ํ•™์Šต’์— ๋Œ€ํ•œ ์—ด์ • ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„์ง๋„ ์šฐ์ƒํ–ฅ ์ค‘์ธ๊ฐ€? ํ•˜๋Š” ์งˆ๋ฌธ์—” ์ผ๋‹จ ๋‹จ์ „๋ถ€ํ„ฐ ์˜ฌ๋ผ์˜ค๋Š” ๊นŠ์€ ํ•œ์ˆจ๊ณผ ํ•จ๊ฒŒ ์ด์ƒํ•˜๊ฒŒ๋„ ์•ž์ด ์บ„์บ„ํ•ด์ง„๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๋ผ๋–ผ ์‹œ์ ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ถœ์ฒ˜ : https://www.dogdrip.net/212294087" ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๋ผ๋–ผ ์‹œ์ ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ถœ์ฒ˜ : https://www.dogdrip.net/212294087 ใ€€๋ฐฐ์›Œ์•ผ ํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์•„๋‹ˆ ๊ทธ๋ณด๋‹ค ๋ฐฐ์šด ๊ฒƒ์„ ์ด์ œ ํ™œ์šฉํ•ด์•ผ์ง€ ์‹ถ์œผ๋ฉด ๋˜ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋งค๋„ˆ๋ฆฌ์ฆ˜์— ๋น ์ง€๊ณ . ๊ฑฐ๊ธฐ๋‹ค ํšŒ์‚ฌ์ผ์ด ๋ฐ”์˜๋‹ค๋Š” ํ•‘๊ณ„๋กœ ์ž๊ธฐ๊ณ„๋ฐœ์„ ๋ฉˆ์ถ”๋‹ค ๋ณด๋ฉด ๋‚จ๋“ค๋ณด๋‹ค ๋’ค์ฒ˜์ง„๋‹ค๋Š” ์ƒ๊ฐ์— ๊ดœํžˆ ์ž๊ดด๊ฐ์ด ๋“ค์–ด ์šฐ์šธํ•ด ์ง€๊ณค ํ•œ๋‹ค. (์ฝ”๋กœ๋‚˜ ๋ธ”๋ฃจ ๋•Œ๋ฌธ๋งŒ์€ ์•„๋‹ˆ๊ฒ ์ง€…) ๊ทธ ๊ฐ€์šด๋ฐ ํšŒ์‚ฌ์—๋Š” ์ •๋ง ์ข‹์€ ์„ ๋ฐฐ๋‹˜๋“ค๋„ ๋งŽ๊ณ  ๋ฉ˜ํ† -๋ฉ˜ํ‹ฐ ๊ด€๊ณ„๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ, ์ž˜, ์˜ฌ๋ฐ”๋ฅธ ๊ธธ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ‘์˜์กด’๋งŒ ํ•˜๋‹ค ๊ทธ ๋Œ€์ƒ์ด ์—†์–ด์ง„๋‹ค๋“ ์ง€ ์‹ฌ์ง€์–ด ๊ทธ๋Ÿฐ ๋Œ€์ƒ์กฐ์ฐจ ์—†์„ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ์ ์  ๊ธฐ์ˆ ์€ ๋ฐœ์ „ํ•˜๊ณ  ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ๋“ค์€ ํ™์ˆ˜์ฒ˜๋Ÿผ ๋„˜์ณํ๋ฅด๊ณ  ์žˆ๋Š” ๊ฐ€์šด๋ฐ ‘ํšŒ์‚ฌ์›’์—์„œ ๋‚˜์•„๊ฐ€ ‘๊ฐœ๋ฐœ์ž’๋กœ์จ ์„ฑ์žฅ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ? ใ€€์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๋กœ ์‚ด์•„๊ฐ€๋ฉด์„œ ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•œ์ฆ‰, ์ž๊ธฐ๊ณ„๋ฐœ์˜ ‘๋ฐฉ๋ฒ•’์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ด๊ฒƒ์ด ์ •๋‹ต์ด๋‹ค ํ•˜๋Š” ์€ ํƒ„ํ™˜์„ ์†Œ๊ฐœํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์ƒ์„ ๋งˆ๊ฐ(?) ํ•  ๋•Œ๊นŒ์ง€๋Š” ๊ณ„์† ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์ˆ™๋ช…๊ณผ๋„ ๊ฐ™์€ ์ง์—…์ด๊ธฐ์— ์ฒซ ๋‹จ์ถ”๋ฅผ ์ž˜ ๋ผ์›Œ์„œ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ๊ธฐ์ˆ ์˜ ๋ณ€ํ™”์— ์ผํฌ์ผ๋น„ ํ•˜์ง€ ์•Š๊ณ  ์ŠคํŽ€์ง€์ฒ˜๋Ÿผ ๋ฌด์—‡์ด๋“  ํก์ˆ˜ํ•˜๋Š”. ๋ง๋ž‘๋ง๋ž‘ํ•œ ์ •์‹ ์„ ๊ฐ–๊ธฐ ์œ„ํ•จ์ด๋ผ๊ณ ๋‚˜ ํ• ๊นŒ. ๋ธ”๋กœ๊ทธ ใ€€๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธ€๋„ ์จ์•ผ ํ•˜๋‚˜?๋ผ๋Š” ์งˆ๋ฌธ์—๋Š” ํ•„์ž๊ฐ€ ์˜ˆ์ „์— ์ •๋ฆฌํ•ด๋‘” ๊ฐœ๋ฐœํ•˜๊ธฐ ๋ฐ”์œ๋ฐ ๊ธ€๊นŒ์ง€ ์“ฐ๋ผ๊ณ ? (๊ธ€์“ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž.)๋ผ๋Š” ๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ํ•ด๋‹น ํฌ์ŠคํŒ…์—์„œ ์ˆ˜์ฐจ๋ก€ ๊ฐ•์กฐํ•˜์˜€์ง€๋งŒ ๊ทธ๋งŒํผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ํŠนํžˆ๋‚˜ ๊ธ€์“ฐ๊ธฐ๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ํ•„์š”ํ•˜๋‹ค. ๊ธ€์„ ๊ผญ ‘์ž˜’์จ์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋‹ด์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๋‹ค. (ํ•„์ž๋„ ๊ทธ๋ ‡๊ฒŒ ์ž˜ ์“ฐ๋Š” ํŽธ์€ ์•„๋‹ˆ๋‹ค…) ๋‹ค๋งŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ •๋ฆฌํ•˜๊ณ  ์ž์‹ ๋งŒ์˜ ๊ธฐ์ค€์— ๋งž์ถ”์–ด ์žฌ ์ •๋ฆฌํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋‹ค ๋ณด๋ฉด ์ด๋Ÿฌํ•œ ์ƒ๊ฐ๋“ค์ด ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ์—๋„ ๋„์›€์ด ์ƒ๋‹นํžˆ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ผผ๊ผผํ•˜๊ฒŒ ์ฒดํฌํ•ด์•ผํ•  ์˜ˆ์™ธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์ถœ์ฒ˜ : https://gfycat.com/ko/menacingeducatedatlasmoth" ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ผผ๊ผผํ•˜๊ฒŒ ์ฒดํฌํ•ด์•ผํ•  ์˜ˆ์™ธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์ถœ์ฒ˜ : https://gfycat.com/ko/menacingeducatedatlasmoth ใ€€๋ณต์žกํ•œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐœ๋ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์—ฐ๋™ํ•˜๋Š” ์‹œ์Šคํ…œ๋„ ๋งŽ๊ณ  ์ •๋ง ๋‹ค์–‘ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์—์„œ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋ณดํ†ต ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ์— ์•ž์„œ ‘์„ค๊ณ„’๋ผ๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๊ทธ๋•Œ ๊ธ€์“ฐ๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ์˜ ์Šต๊ด€(์Šคํ‚ฌ?)์„ ์ ์šฉํ•ด ๋ณด๋ฉด ์š”๊ตฌ ์‚ฌํ•ญ๋“ค ์ค‘์— ์ค‘์š”ํ•œ feature ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๊ณ , ๊ฐ ์ดํ•ด๊ด€๊ณ„์ž๋“ค์—๊ฒŒ ์ •๋ฆฌํ•œ ๋ถ€๋ถ„์„ ๊ณต์œ ํ•˜๋ฉฐ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ๋„ ์ง€๋‚œ๋ฐค์— ์•ผ์‹์œผ๋กœ ๋จน์€ ๋ผ๋ฉด ๋ฉด๋ฐœ์ฒ˜๋Ÿผ ๊ผฌ์—ฌ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์„ ๋ณด๋‹ค ๊ฐœ๋ฐœํ•˜๊ธฐ ํŽธํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๊ฒŒ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ‘์ •๋ฆฌ’์˜ ์Šต๊ด€ ๋˜ํ•œ ๊ธ€์“ฐ๊ธฐ๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜๋ จ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ‘๊ผผ๊ผผํ•จ’์„ ๊ธฐ๋ฅด๋Š” ๋ฐ์—๋Š” ๊ธ€์“ฐ๊ธฐ๋งŒ ํ•œ ๊ฒŒ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ใ€€์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ์–ธ์–ด๋กœ ์ฝ”๋”ฉ์„ ํ•˜๊ณค ํ•œ๋‹ค. ์™œ ์ฝ๊ธฐ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋ผ๋Š” ์ฑ…์ด ์žˆ๋“ฏ์ด ๊ฒฐ๊ตญ ์ฝ”๋”ฉ ๋˜ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์ผ์ข…์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋กœ์ง์„ ๊ฐœ๋ฐœ ์–ธ์–ด๋กœ ์ฝ”๋”ฉ์„ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด, ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋กœ์ง์ด ๋ช…๋ฃŒํ•˜๊ณ  ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋œ ์ƒํƒœ์—์„œ์•ผ ์ฝ”๋“œ ๋˜ํ•œ ์†Œ์œ„ ‘์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ’๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ใ€€๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋‚˜ ๋ง‰๋ง‰ํ•˜๋‹ค๋ฉด, ์˜ค๋Š˜์˜ ๋ฐฐ์šด ๋‚ด์šฉ (๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์œ ํ–‰์ฒ˜๋Ÿผ ๋ฒˆ์ง€๊ณ  ์žˆ๋Š” TIL์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์ถ”์ฒœํ•œ๋‹ค. ๊ฒฝ๋ ฅ์ด 1๋…„ ์ฐจ์—ฌ๋„ 10๋…„ ์ฐจ์—ฌ๋„ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์กฐ๊ธˆ์”ฉ ์ ์ ˆํ•œ ๋ธ”๋กœ๊ทธ ํ”Œ๋žซํผ์— ์ •๋ฆฌ๋ฅผ ํ•ด ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์ž์‹ ๋งŒ์˜ ๊ฐœ๋ฐœ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ๋‚˜์•„๊ฐ€ ๊ธ€์“ฐ๊ธฐ๊ฐ€ ์ „ํ•ด์ฃผ๋Š” ๊ธ์ •์ ์ธ ํšจ๊ณผ๋ฅผ ๋งŒ๋ฝํ•˜๋ฆฌ๋ผ ์ž๋ถ€ํ•œ๋‹ค.