
๏ปฟใ๊ทธ ์ด๋ ๋๋ณด๋ค๋ ์ ์ ์์ด ๋ฌ๋ ค์จ 2020๋
. ํ๊ณ ์ถ์ ๊ฒ๋ ๋ง์๊ณ ํฐ ๊ฟ์ ๊พธ๊ธฐ๋ ํ์ง๋ง ํ์ค์ ๋ฒฝ ์์ ํฌ๊ฒ ์ข์ ๋ ํด๋ณด๊ธฐ๋ ํ๊ณ . ๊ฐ์์ค๋ฌ์ด ์ธ์์ ๋ณํ์ ์ ์ํ๋ด ์ ์ ์ ์ผ๋ก ์ก์ฒด์ ์ผ๋ก ๋๋ฌด ๋ง์ด ํ๋ค์๋ ์ฌํด. ๋์๋ณด๋ฉด ์ฐธ ํํ๊ฐ ๋์ง๋ง ํํธ์ผ๋ก ์๋ จ๊ณผ ์ข์ ์์์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋ฐฐ์ ๋ ๊ทธ๋ฐ ํ ํด๋ฅผ ๋ณด๋ธ ๊ฒ ๊ฐ๋ค.
ใ๏ปฟํ์๋ ๋ด๋
์ด ๋๋ฉด ์ด์ ์ด๋๋ง ๊ฐ๋ฐ์ ์ํ์ ํ ์ง 9๋
์ฐจ๊ฐ ๋๋ค. ๋ณดํต ์ฃผ๋์ด๋ผ ํจ์ ๋จ์ํ๊ฒ ์ด์ ๋ง ์ทจ์
ํ ์ ์
๋๋ 3~5๋
์ฐจ๋ฅผ ๋งํ๊ณ ์๋์ด๋ ์ฐ๋ด์ด X ์์ ๋๊ฑฐ๋ n ์ฐ์ฐจ๋ฅผ ๋์ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ๊ฐ ํ์ฌ๋ง๋ค ์ด ๋์ ์ ์ํ๋ ๊ธฐ์ค์ด ๋ค๋ฅด๊ฒ ์ง๋ง. ๊ทธ๋ฐ๋ฐ ํ์๋ ์ฃผ๋์ด๋ ์๋์ด๋ ์๋ ๊ทธ ์ฌ์ด์์ ์ ๋งค~ํ ์ฐ์ฐจ. ์ค๋์ด. ๊ณผ์ฐ ๋๋ ๋ฌด์์ ํด์ผ ํ ๊น? ๋ฌด์์ ํด์ผ ์ฐ์ฐจ์ ๋ง๋ ์ญํ (?)์ด๋ผ๊ณ ํ ์ ์์๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑด ๋๊ตฌ์๊ฒ ๋ฐฐ์์ผ ํ๊ณ ๋๊ฐ ๊ฐ๋ฅด์ณ ์ฃผ๊ธฐ๋ ํ ๊น?
๏ปฟใ๋งค๋
ํ๊ณ ๋ฅผ ์จ์๋ค. ๊ทธ๋ผ์ ์ฐ๋ง์ด ๋์ด์ ์ฐ๋กํ์ฌ์ฒ๋ผ ์์ฑํ๋ ๊ฒ ์๋ ๋์๊ฒ ์ ๋ง ํ์ํ ๋ฐฉํฅ์ผ๋ก ํ๊ณ ๋ฅผ ์์ฑํ๋ ค ํ๋ค. ๋จ์ํ๊ฒ ์ด๋ฐ์ ๋ฐ ์ผ๋ค์ด ์์๊ณ ‘์ด์ฉ ์ ์์๋ค~’ ์์กฐ๋ฆฌ๋ ๋ฌด์๋ฏธํ ํ๊ณ ๋ณด๋ค ํ์ค์ ์ผ๋ก ๋ ์์ ์ ์ํด ๋ณํํด์ผ ํ ๊ฒ ์์ผ๋ฉด ๊ตต๊ณ ๊ธธ๊ฒ ๊ณํ์ ์ธ์๋ณด๋ ๋ฐฉํฅ์ผ๋ก ํด๋ณด๊ณ ์ถ๋ค.
2019 ํ๊ณ 2018 ํ๊ณ 2017๋
์ ์ ์์ง..? 2016 ํ๊ณ ๋ฑ์ฅ, ์ฝ๋ก๋-19 ๋๊ฐ์ง ๋ง๋ผ๋ฉด ๋๊ฐ์ง ๋ง! ๋ฐฅ ๋จน์ง ๋ง! ๋ชจ์ด์ง ๋ง! ์ถ์ฒ : salihgonenli" ๋๊ฐ์ง ๋ง๋ผ๋ฉด ๋๊ฐ์ง ๋ง! ๋ฐฅ ๋จน์ง ๋ง! ๋ชจ์ด์ง ๋ง! ์ถ์ฒ : salihgonenli ๏ปฟใ์ธ์์ด ๋ณํ๋ค. ์๋
๊น์ง๋ง ํด๋ ๋ฏธ์ธ๋จผ์ง๊ฐ ์ฌํ๋ฉด ๋ง์คํฌ๋ฅผ ์ฐ๊ณ ๋๊ฐ๊ณค ํ์ง๋ง ์ฝ๋ก๋-19๋ผ๋ ์ ์ผ๋ณ์ด ์ ์ธ๊ณ์ ํผ์ง๋ฉฐ ์ด์ ๋ ๋ง์คํฌ ์์ด ์ด ์ ์๋ ์ธ์์ด ๋์๋ค. ๋ ์ฌ๋ฌด์ค์ ๋๊ฐ ํ ๋๋ฃ๋ถ๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ํ๋ฉฐ ๋ฐฅ๋ ๋จน๊ณ ํ์๋ ํ๋ฉฐ ์
๋ฌด๋ฅผ ์งํํ์ง๋ง ์ฌํ๊ทผ๋ฌด๋ฅผ ํ์ง ์ด๋๋ง ๋ฐ๋
์ด ํ์ฉ ์ง๋ฌ๋ค.
๏ปฟใ์ฒ์์ ์ง์์ ํธํ๊ฒ ์ผ์ ํ ์ ์์ด์ ์ข์๋ค. ๊ทธ๋ฌ๋ IT ํ์ฌ์ ๊ทผ๋ฌดํ๊ณ ์์ง๋ง ์์ง๋ ๋ฒ๋ฒ
๊ฑฐ๋ฆฌ๊ณ ์ด์ํ ํ์ํ์์ ๋๋ ์
๋ฌด ์งํ์ผ๋ก ์ธํด ์ ์ ์๊ฐ์ด ์ง๋ ์๋ก ๋ต๋ตํจ์ ๊ทน์ ๋ฌํ๋ค. ์ถ/ํด๊ทผ ์๊ฐ ๋ฑ ์
๋ฌด์ด์ธ์ ํ์ํ ์๊ฐ์ด ์ฌ๋ผ์ง๋ฉฐ ์คํ๋ ค ์
๋ฌด์ ์ง์คํ๋ ์๊ฐ์ ๋ง์์ก๋ค. ๊ทธ์ ๋ฐํด ํผ๋ก๋๋ ์ง์คํ ์
๋ฌด์๊ฐ์ ๋น๋กํ๋ฉฐ ๋์ด๋ฌ๊ธฐ์ ๋๋ฌด๋๋ณด์ฒ๋ผ ๋์ด์ง๋ ์๊ฐ๋ค ๋ํ ๋ง์๋ ๊ฒ ๊ฐ๋ค. ์ง๋๊ณ ๋ณด๋ฉด ๊ทธ๋ฌํ ์๊ฐ๋ค์ ์ ๊ณํํ๊ณ ์์ง์๋๋ผ๋ฉด ๋ญ๋ผ๋ ๋ฐฐ์ฐ๊ฑฐ๋ ๋ฌ์ฑํ์ ์๊ฐ๋ค์ธ ๊ฒ ๊ฐ์์ ์ฝ๊ฐ ์์ฌ์์ด ๋จ๋๋ค. ๋ด๋
์ ๊ณํํ๋ ์๊ฐ์ ๋น์ค์ ์ข ๋ ๋๋ฆฌ๋ ๊ฒ์ผ๋ก.
๏ปฟใ์๋ฌด์ชผ๋ก ์ฝ๋ก๋-19 ๋ฐ์ด๋ฌ์ค๊ฐ ์์ด์ง๊ณ ๋ค์ ์์ ์ผ๋ก ๋์๊ฐ์ผ๋ฉด ์ข๊ฒ ๋ค. ๊ทธ์ ๋ง์คํฌ ์ ์ฐ๊ณ ์ ์ ์ป๊ณ ์ฌ๋ ๋ง์ด ๋ชจ์ด๋ ๊ณณ์ ํผํด์ผ ํ๋ ๊ฑด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ํด์ผ ํ ๊ฐ์ฅ ํฐ์ผ์ด๊ฒ ์ง.
ํ์ฌ์ํ ์๋น์ค ์ ๋ฉด ๊ฐํธ ใ๏ปฟํ์ ํฌ์
ํ ์ดํ ๊ฐ์ฅ ํฐ ๊ท๋ชจ๋ก ์๋น์ค ์ ๋ฉด ๊ฐํธ์ ์งํํ์๋ค. ๊ฑฐ์ ์ฌํด ๋ด๋ด ํ๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉํ ์ ๋. ์
๋ฌด์ ์๋ ๋ง์๊ณ ์คํ ๋ํ ๋ณต์กํ์์ง๋ง ๊ฐ์ฅ ํฌ๊ฒ ๋ฐฐ์ธ ์ ์์๋ ๋ถ๋ถ์ ๋ชจ๋๋ฆฌํฑ ์๋น์ค์์ ๋ง์ดํฌ๋ก ์๋น์ค๋ก์ ์ํคํ
์ฒ ๋ณํ๋ฅผ ์๋ํ๋ค๋ ์ . ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ Request - Response ์์ 1์ฐจ์์ ์ธ ํ๋ฆ์์ ์ด๋ฒคํธ๋ผ๋ ํ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ์ํฅ์ ๋ฐ๋ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ฉฐ ๊ณ ๋ฏผํ๋ค๋ ์ ์์ ์ฌ๋ฌ ๊ฐ์ง ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์๋ค. ์๋ฌด๋๋ ์ค๋์ด๋ค ๋ณด๋ ์ฃผ์ด์ง ๊ธฐ๋ฅ์ ๊ฐ๋ฐ๋ง ํ๋ ๊ฒ๋ณด๋จ ์ข ๋ ๋์ ๊ณณ์ ์ค๊ณ ๊ด์ ์์ ๊ณ ๋ฏผํ๋ ์ฐ์ต์ ํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์๋ฐ ์์ง ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค.
๏ปฟใ์ฌํด๋ ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ๊ฐ์ ํ๋ ค๋ ๋
ธ๋ ฅ๋ ํ์๋ค. CI๋ฅผ ์ฌ์ค์นํ๊ณ ๋ค์ํ ๊ฐ์ ์ ํตํด ๋น๋ ์๋๋ฅผ ๋ช ๋ฐฐ๋ก ๋๋ฆฌ๊ธฐ๋ ํ์๊ณ , ๋จ์/๋ฐ๋ณต์ ์ธ ์
๋ฌด๋ค์ ๊ฐ์ข
๋ด๋ค์ ๊ฐ๋ฐํ์ฌ ์
๋ฌด ์์ฐ์ฑ์ ์ฌ๋ฆฌ๊ธฐ๋ ํ์๋ค. Sentry๋ฅผ ์๋ฒ ๋ ๋ฒจ์ ์ ์ฉํ์ฌ ๋ฌด๋ถ๋ณํ๊ฒ ๋ฐ์ํ๋ ์๋ฌ๋ค์ ๊ทธ๋ฃนํํ์ฌ ์ฐ์ ์์์ ๋ฐ๋ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ๋ ํ์๊ณ , ์๋ํ๋ธ์ jacoco๋ฅผ ์ ์ฉํ์ฌ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋์ํํ๋ฉฐ ํ์ฌ ๋ชจ๋์ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ๋ ํด๋ณด์๋ค.

๏ปฟใ‘์ ์์ผ’ ์ด๋ผ๊ณ ํ๋ฉด ๋ฌด์์ด ๋ ์ค๋ฅด๋๊ฐ? ์์ ๋ชจ๋ฅด์ง๋ง ๋ง์ฐํ๊ฒ ์๊ฐ์ ํด๋ณด๋ฉด, ๋งค์ผ ์ค์ ์คํฌ๋ผ์ ํ๊ณ ์งํ ํํฉ์ ๊ฐ์ํํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ด๋๋ ์ผ์ข
์ ‘ํ๋ก์ธ์ค’๋ก ์๊ณ ์๋ค. ์ข๋ค๋ ๊ฒ๋ ๋ค์๊ณ ๋์
์ ํ๋ ค ํ์ง๋ง ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ ์๋๋ ๊ทธ๊ฒ. ํ์
์ ๋ค์ด์ค๋ฉด์ ‘์ ์์ผ’ ๋์
์ ์ฑ๊ณต/์คํจ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๊ฐ๋์ฉ ๊ฑด๋๊ฑด๋ ๋ค์ด๋ง ๋ณธ ์์ค์ด๋ค. ์ด์ ๋ ์ฃผ๋์ด๋ ์๋์ด๋ ์๋ ์ค๋์ด๊ฐ ๋์ด๋ณด๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํจํด, ์ ๊ธฐ์ ๋ ์ค์ํ์ง๋ง ํ๊ณผ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑด๊ฐํ๊ณ ์ฑ๊ณต์ ์ธ ์งํ์ ์ํด์๋ ์ด๋ฌํ ํ๋๋ค์ด ์ค์ํ๊ตฌ๋ ํ๋ฉฐ ์์ฆ (์ฌํด) ๋ผ!์ !๋ฆฌ!๊ฒ! ๋๋ผ๋ ์ค์ด๋ค.
๏ปฟใ๋ง์นจ ํฌ๋ฆฌ์ค๋ง์ค ์ฐํด๋ฅผ ์๋๊ณ ์ด ์๊ตญ์ ๋๊ฐ์ง๋ ๋ชปํ๋๋ฐ ๋ญ ํด์ผ ํ๋ ๊ณ ๋ฏผํ๊ณ ์๋ ์ฐฐ๋ ์ด๋ช
์ฒ๋ผ ํด๋ฆฐ ์ ์์ผ, ์ ์ ๋ก๋ฒํธ 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)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฐ๋ฆฌ๋ ๋ ๋ฆฌ๊ฐ ์๋ ์ผ์ ๊ณ์ํ๋ ค๊ณ ํ๋ค. ๊ทธ๊ฒ๋ ์์ฃผ ๋ง์ด.
๊ทธ๋์ ์ ์์ผ์ด๋?

๏ปฟ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 ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๏ปฟ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 ํํ๋ก ๋ณด์ธ๋ค.

๏ปฟใ๊ด๋ฆฌํ๋ 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์ด ๋๊ธฐ ์ด ์์ด ๋์์ ์คํ๋ ์ ์๋๋ก ํด์ค๋ค.

์น์๋น์ค ๊ฐ๋ฐ์๋ผ๋ฉด ๋๋ง์ ๋ธ๋ก๊ทธ์ฏค์ ์์ด์ผ์ง ํ๋ฉฐ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ์์ํ ์ง๋ ์ด๋๋ง 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); // ๋ก๊ทธ๋ ๊ฐ๊ธ์ ์์ธํ๊ฒ ! } ๋ก๊ทธ๊ฐ ๊ฐ์ ธ๋ค ์ฃผ๋ ๋ ๋ค๋ฅธ ์ธ์ ใ๋ก๊ทธ๋ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ๋ ์ ์๋ค.

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} ๋ผ๊ณ ์ ์ด์ฃผ์.

์ ํํ 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๋
์ฐจ์ฌ๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์๋ก์ด ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ ๋ง๋ จ์ด๋ค. ๊ทธ๋ ๊ฒ ์กฐ๊ธ์ฉ ์ ์ ํ ๋ธ๋ก๊ทธ ํ๋ซํผ์ ์ ๋ฆฌ๋ฅผ ํด ๋๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ์์ ๋ง์ ๊ฐ๋ฐ ํ์คํ ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๊ณ , ๋์๊ฐ ๊ธ์ฐ๊ธฐ๊ฐ ์ ํด์ฃผ๋ ๊ธ์ ์ ์ธ ํจ๊ณผ๋ฅผ ๋ง๋ฝํ๋ฆฌ๋ผ ์๋ถํ๋ค.