๏ปฟ์ด๋ฐ์ ๋ฐ ๊ณ ์ ๋์ ์ํ๋ ํ์ฌ์ ์ทจ์
์ ํด์ ‘์ฃผ๋์ด’๋ผ๋ ๊ผฌ๋ฆฌํ๋ฅผ ๋ฌ๊ณ ์ด์ ๋ง ํ์ฌ ์ํ์ ํ๋ค ๋ณด๋ฉด ๊ฒฝํ์ด ๋ถ์กฑํด์ ์ค์๋ฅผ ํ๊ฑฐ๋ ๊ธฐ๋ํ๋ ์
๋ฌด ํผํฌ๋จผ์ค๊ฐ ๋์ค์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์๊ธด๋ค. ๊ทธ๋ด ๋๋ฉด “์ฃผ๋์ด์์~ ์ฃผ๋์ด๋๊น ๊ด์ฐฎ์~” ๋ผ๋ ๋ง๋ก ์ด๋ ์ ๋ ‘์ดํด’๋ฅผ ํ๊ฒ ๋์ง๋ง. ์ณ๋ฐํด์ฒ๋ผ ์ ์ ์์ด ์๊ฐ์ด ์ง๋ ์ด๋์ ๊ฒฝ๋ ฅ์ด ์๊ธฐ๊ฒ ๋๊ณ ์ด์ ๋ ์ฝ๊ฐ์ ์ค์์กฐ์ฐจ ‘์ดํด’ํ๊ธฐ ์ด๋ ค์ด ์์ ์ด ๋์ด๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ค ์ด๋ฐ์ ๋ฐ ์ด์ ๋ก ‘๊ฐ๋ฐ์’๋ฅผ ๊ทธ๋ง๋๊ฒ๊น์ง ๋๋ ์ฌํ ํ์ค์ ์ฃผ๋ณ์ ๋๋ฌ๋ณด๋ฉด ์ด๋ ต์ง ์๊ฒ ์ฐพ์๋ณผ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ, ์ฒ์๋ถํฐ ์ ํ ์๋ ์์๊น? ํน์ ์ด๋ ต๊ฑฐ๋ ํ๋ ์์ ์ด ์ฌ ๋๋ฉด ํ์ฐฝ ์์ ์ ๋๋ฅผ ์ด๋์ด ์ฃผ์
จ๋ ‘์ ์๋’๊ฐ์ ์กด์ฌ์๊ฒ ๊ธฐ๋๋ฉฐ ๋ค์ ์ผ์ด๋ ์๋ ์๋ ๊ฒ์ผ๊น?
ใ๋๋ฆ ๊ด์ฐฎ์ ์กฐ์ง์ ๊ฒฝ์ฐ ์ฐ์ฐจ๊ฐ ๋ฎ์ ์ง์์ด ํ๋ค์ดํ ๋๋ฉด ๊ทธ ์ง์์ด ์ ์์ ํ๋ ๋ฐ ๋์์ ์ค ์ ์๋๋ก ๋ณด๋ค ์ฐ์ฐจ๊ฐ ๋์ ‘์ง๋์ ๋ฐฐ’ ํน์ ‘๋ฉํ ’๋ฅผ ํ ๋นํด ์ฃผ๊ณค ํ๋ค. ๊ทธ๋ ๊ฒ ๋งบ์ด์ง ๊ด๊ณ๊ฐ ์ ์ง์์ด ๋๋ฉด ์์์ ๋งํ๋ ‘ํ๋ ์์ ’์์ ํฐ ๋์์ด ๋์ด ์ด๊ฒจ๋ผ ์ ์๋ ํ์ด ์๊ธธ ์ ์์ง๋ง ์์นซ ์๋ชป๋๋ ๊ฒฝ์ฐ ‘๋ฉํ ’, ‘๋ฉํฐ’ ๋ชจ๋์๊ฒ ๋ถ๋ด์ด ๋๊ฑฐ๋ ์คํ๋ ค ์ ํ๋๋๋ง ๋ชปํ ์๊ฐ๋ค์ด ๋์ด๋ฒ๋ฆฌ๋ ๋ฉํ ๋ง.
ํจ๊ป ์ฑ์ฅํ๋ ๋ฉํ ๋ง.์ถ์ฒ : https://medium.com/@ashokbalasubramanian/career-development-mentorship-844797327703" ํจ๊ป ์ฑ์ฅํ๋ ๋ฉํ ๋ง.
์ถ์ฒ : https://medium.com/@ashokbalasubramanian/career-development-mentorship-844797327703 ใ์ด๋ฒ ํฌ์คํ
์์๋ ๊ฐ๋ฐ์๋ก์จ ‘๋ฉํ ๋ง’์ ๋ํด ์ด๋ค ๋ง์๊ฐ์ง์ ๊ฐ์ ธ์ผ ํ ์ง์ ๋ํด ์์ฑํด๋ณด๊ณ ์ ํ๋ค. ๋ฌผ๋ก ํ๋ฆฐ ๋ถ๋ถ๋ ์์ ์ ์์ง๋ง ์ ์ด๋ ํ์๊ฐ ์ค๋ฌด ๊ฐ๋ฐ์๋ก์จ ๋ค์ํ ๊ฒฝํ๋ค์ ํด๋ณด๋ฉฐ ‘๋ฉํ ๋ง’์ ๋ํด ๊ฝค ์ค์ํ๋ค ์ฌ๊ฒจ์๋ ์๊ฐ๋ค์ด ๋ง์๊ณ , ์ง์ ๋ฉํฐ / ๋ฉํ ์ ๊ฒฝํ๋ ํด๋ดค๊ธฐ์ ๋๊ตฐ๊ฐ์๊ฒ๋ ๋์์ด ๋ ๊ฒ์ด๋ผ ์กฐ์ฌ์ค๋ ์๊ฐํด ๋ณธ๋ค.
๋ฉํ ๋ง? ์ด๋ป๊ฒ ์์ ํ๋๊ฑฐ์ผ? ๏ปฟ ๋ฉํ ๋ง์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ ์ ์ ๋ฉํ ๋ง์ ์ ์๋ถํฐ ์ด์ผ๊ธฐํ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค. ์ํค๋ฐฑ๊ณผ์ ๋ฐ๋ฅด๋ฉด ํ๋ถํ ๊ฒฝํ๊ณผ ์งํ๋ฅผ ๊ฒธ๋นํ ์ ๋ขฐํ ์ ์๋ ์ฌ๋์ด 1:1๋ก ์ง๋์ ์กฐ์ธ์ ํ๋ ํ์๋ผ ๋์์๋ค. ๋๋ถ์ด, ์กฐ๋ ฅ์์ ์ญํ ์ ํ๋ ์ฌ๋์ ๋ฉํ (mentor)๋ผ๊ณ ํ๋ฉฐ ์กฐ๋ ฅ์ ๋ฐ๋ ์ฌ๋์ ๋ฉํฐ(mentee)๋ผ๊ณ ๋์์๋ค. ํ์ฐฝ ์์ ๋ก ๋์๊ฐ ๋ณด๋ฉด ์ ์๋์ ๋ฉํ , ํ์๋ค์ ๋ฉํฐ์ ์ญํ ์ด ๋ ์๋ ์์ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ํ์ฌ์์ ๋ฉํ , ๋ฉํฐ์ ๊ด๊ณ๋ ์ด๋ป๊ฒ ๋งบ์ ์ ์์๊น? ์์ ์ด์ผ๊ธฐํ๋ฏ์ด ๋๊ตฐ๊ฐ(์๋ง๋ ์กฐ์ง์ ๋ฆฌ๋๊ฐ) ๋ฉํ ์ ๋ฉํฐ ๊ด๊ณ๋ฅผ ์ ํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
ใ์๋์์ ์ด์ผ๊ธฐํ๊ฒ ์ง๋ง ๋ฉํ ๋ง์ ๋น๋จ ๋์์ ‘์ป๊ฒ ๋๋’ ๋ฉํฐ๋ง ์ข์ ๊ฒ์ด ์๋๋ผ ๋์์ ‘์ฃผ๋’ ๋ฉํ ์๊ฒ๋ ์๋นํ ์ข์ ํ๋์ด๋ผ ์๊ฐํ๋ค. ํ์ง๋ง ๋จํธ์ ์ผ๋ก ๋ณด๋ฉด ๋ฉํ ๋ณด๋จ ๋ฉํฐ๊ฐ ํ๋ค๊ณ ์ด๋ ค์ด ์ํฉ์ ์ด๊ฒจ๋ด๋๋ฐ ๋์ฑ ‘ํ์’๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ถ๊ทน์ ์ผ๋ก๋ ๋ฉํฐ๊ฐ ๋ฉํ ๋ฅผ ์ฐพ์ ๋์์ ๋ฉํ ๋ง ๊ด๊ณ๋ฅผ ๋งบ์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ๋ฌผ๋ก ์ฒ์ฌ ๊ฐ์ ์ ๋ฐฐ๊ฐ ๋ฉํ ๋ฅผ ์์ฒํ๊ณ ๋ฉํ ๋ง์ ํด์ฃผ๊ฒ ๋ค๊ณ ํ๋ ์ํฉ์ด๋ผ๋ฉด ๋กํ์ง๋ง ๋๋ถ๋ถ์ ์ ๋ฐฐ๋ค์ ์๊ธฐ ์ฝ๊ฐ ์์๋ค ํ๋ฉฐ ๋ฐ์๊ธฐ์…
ใ๊ทธ๋ ๋ค๋ฉด ๋ฉํฐ๋ ๋ฉํ ๋ฅผ ์ด๋ป๊ฒ ์ฐพ์์ผ ํ ๊น? ํจ๊ป ์ผํ๋ ์ ๋ฐฐ ๋๋ฃ๊ฐ ์๋ค๋ฉด ์ ์คํ๊ฒ ๋์์ ์์ฒญํ๋ ๊ฒ๋ ๋์์ง ์๋ค ๋ณธ๋ค. ๋จ, ๋ฌด์์ “์ ์ ๋ฉํ ๊ฐ ๋์ด์ฃผ์ธ์.“๋ผ๋ ๊ฒ๋ณด๋ค ์์ ์ด ๊ฐ์ง๊ณ ์๋ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๋ฅผ ํธ์ด๋์ผ๋ฉฐ ์กฐ๊ธ์ฉ ์น๋ถ์ ์์๊ฐ๋ค๋ฉด ์๋ฌด๋๋ ๊ฒฝํ์ด ๋ง์ ์ ๋ฐฐ์ด๊ธฐ์ ๊ณ ๋ฏผ์ ๋ฒ์๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์ค์ฌ์ค ์ ์์ง ์์๊น. ํน์ฌ ์ฃผ๋ณ์ ์ ๋ฐฐ ๋๋ฃ๊ฐ ์๋ค๋ฉด ์จ/์คํ๋ผ์ธ ์ปค๋ฎค๋ํฐ ํ๋์ ํ๋ฉด์ ์ฐพ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฉ์ ์ ๋ฅผ ํตํด ๋ค๊ฐ๊ฐ๊ฑฐ๋ ๋ฉ์ผ๋ก ์ ์คํ๊ฒ ๊ณ ๋ฏผ์ ์์ฝํด์ ๋ณด๋ด๋์ผ๋ฉด ๋น์ฅ์ ์๋๋๋ผ๋ ๊ฐ๊น์ด ์์ผ ๋ด์ ์๋ต์ด ์ค๊ธฐ ๋ง๋ จ์ด๋ค. (์ ์ด๋ ๊ด์ฐฎ์ ์ ๋ฐฐ๋ผ๋ฉด.)
๏ปฟใ์ฌ๊ธฐ์ ๋งํ๋ ‘์ ๋ฐฐ’์ ์ ์๋ ๋จ์ ๋์ด๊ฐ ๋ง์์๊ฐ ์๋ ์์ ๋ณด๋ค ๊ฒฝํ์ด ๋ง์ ์ฌ๋์ ์๋ฏธํ๋ค. ๊ทธ๋ ๊ธฐ์ ์์ ๋ณด๋ค ๋์ด๊ฐ ์ ์ ์ฌ๋์ด ๋ฉํ ๊ฐ ๋ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค.
๏ปฟ
์ ๋ฉํ ๋ง์ ํด์ผํ ๊น? ๏ปฟ ‘๊ฒฝํ’์ด ์ ๋ง ์ค์ํ๊ณ ํ์๊ฐ์ด ์์์ง๋ ์ ๊ธฐ์ ์ ์จ๋ชธ์ผ๋ก ๋ฐ์๋ด์ผ ํ๋ ์ฐ๋ฆฌ ๊ฐ๋ฐ์๋ค์ ํนํ๋ ๋ฉํ ๋ง์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ ํ ๊ธฐ๋ฅ์ ๋ง๋ค์ด ๋ด์ผ ํ๋ ์ํฉ์ด๋ผ ์๊ฐํด ๋ณด์. ์์ฃผ ์ผ๋ฐ์ ์ผ๋ก๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ์๋ง ์ง์คํ๋ค ๋ณด๋ ์๋น์ค ๋ฆด๋ฆฌ์ฆ์ ๊ฒํ ํด์ผ ํ ๋ถ๋ถ๋ค์ ์๊ฐํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ง๋ ํฌ์คํ
์์๋ ๏ปฟ๋ฐ์ดํฐ๋ฅผ ์๊ธํ๋ฉฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณค๊ณ , Filebeat์ Logstash๋ฅผ ๊ฑฐ์ณ Elasticsearch์ ์ธ๋ฑ์ฑ ํ๋ ๊ฒ๊น์ง ์์๋ณด์๋ค. ์์ ํฌ์คํ
์์ ์ด์ผ๊ธฐํ์ง๋ง ๋จ์ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ๋๊ตฌ๋ฅผ ์ด์ฉํด์ ๋์๋ณด๋๋ฅผ ๋ง๋๋ ๊ฒ ์๋๋ผ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ๋ง๋ค์ด๋ ๋์๋ณด๋์ ์๋์ผ๋ก ๋ฐ์๋๋ ํ๋ฆ์ ๋ง๋ค๊ณ ์ถ์๋ค. ๋ง์นจ ํ์ดํ๋ผ์ธ์ ์ดํ ์ ์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๊ทธ๋์์ ๋น ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ์ํฉ์ด๋ค. ์ด ๊ฒฝ์ฐ Filebeat-Logstash-Elasticsearch ๊ฐ ์คํ ์ค์ด๋ผ๋ฉด ์์ ์์ฑํ๋ ํ์ด์ฌ ์คํฌ๋ฆฝํธ๋ง ํ๋ฒ ์คํํด ์ฃผ๋ฉด ์ดํ ์น ๋ฐ์ดํฐ๊ฐ ํ์ดํ๋ผ์ธ์ ๊ฑฐ์ณ Elasticsearch๋ก ์ธ๋ฑ์ฑ์ด ๋๋ค. ์ฆ, ๋ณ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ฌ ๊ฐ๊ณตํ๊ณ ์ถ๊ฐํ๋ ๋ค์ ๊น๋ค๋ก์ด ์์
์ด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ํ์ดํ๋ผ์ธ ๋๋ถ์ ํ ๋ฒ์ ์คํฌ๋ฆฝํธ ์คํ์ผ๋ก ์์ฝ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋จ์ ์ ์ ์๋ค.
ใ์ด์ ๋ ์์ฌ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ฐํ๋ฅผ ํด๋ณผ ์ฐจ๋ก์ด๋ค. ElasticStack์์๋ Kibana๋ผ๋ ๊ฐ๋ ฅํ ์๊ฐํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋๋ฐ ์ด๋ฒ ํฌ์คํ
์์๋ Kibana๋ฅผ ์ด์ฉํด์ ๋์๋ณด๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค ํ๋ค.
Visualize ใ๏ปฟElasticsearch์ ์ธ๋ฑ์ฑ ๋์ด์๋ ๋ฐ์ดํฐ๋ค์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ REST API๋ฅผ ํตํด์ ์กฐํํ ์ ์๊ณ JSON ํํ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ฐ์ง๊ณ ๋ค์ํ๊ฒ ์๊ฐํ๋ฅผ ํ ์๋ ์๋ค. ํ์ง๋ง Kibana์์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ UI๋ก ํํํ๋ ์ผ๋ จ์ ๋ชจ๋ ํ์๋ฅผ ํด๋ฆญ ๋ช ๋ฒ์ผ๋ก ํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ผ๋ ์กฐ๊ธ๋ง ๋ง์ ธ๋ณด๋ฉด ๋๊ตฌ๋ ๋ง๋ค ์ ์๋ค.
New Visualizaion!!" New Visualizaion!! ใ๋ฒ์ ์
์ด ๋๋ฉด์ ๋น์ฅฌ์ผ๋ผ์ด์ฆ๋ฅผ ๋ง๋๋ ์ฒซ ํ๋ฉด ๋ํ ๋ณํ๊ฐ ์๊ฒผ๋ค. ๊ธฐ์กด์๋ ์ด๋ค ์ ํ์ ๋น์ฅฌ์ผ๋ผ์ด์ฆ๋ฅผ ์ ํํ ๊ฒ์ธ์ง์ ๋ํด ์ ํํ๋ ํ๋ฉด๋ถํฐ ๋์๋๋ฐ ๋ง๋๋ ๊ฑธ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๋์์ฃผ๋ Lens, TSVB ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ๋จผ์ ๋ฐ๊ฒจ์ค๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด์ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ๊ด์ฐฎ์ง๋ง ๋ณด๋ค ๋ช
์์ ์ผ๋ก ๋ง๋ค๊ณ ์ถ์ผ๋ ํ๋จ์ Aggregation based์ ์ ํํด์ ์ํ๋ ๋น์ฅฌ์ผ๋ผ์ด์ฆ์ ํ์
์ ์ ํํด ๋ณด์. ์ดํ ์์ฑ๋์ด ์๋ ์ธ๋ฑ์ค๋ฅผ ์ ํํ๋ฉด ๋ณธ๊ฒฉ์ ์ผ๋ก ๋น์ฅฌ์ผ๋ผ์ด์ฆ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ํ๋ฉด์ด ๋์ค๋๋ฐ ๋์๋ณด๋ ํ๋ฉด ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ผ ํ ํญ๋ชฉ๋ณ๋ก ์ดํด๋ณด์.
์ ์ฒด ์ ." . ใ๏ปฟํ์ง์, ์ฌ๋ง์, ๊ฒฉ๋ฆฌ ํด์ ์ ์ดํฉ์ ํํํ๋ ค ํ๋ค. ์ด๋ ๊ฒ ‘์ซ์’๋ฅผ ํํํ๋ ค ํ๋ ๊ฒฝ์ฐ Metric์ ํ์ฉํ๊ณค ํ๋ค. ์ฐ์ธก์์ Aggregation ๋ฐฉ๋ฒ์ ‘sum’์ผ๋ก ์ค์ ํ๊ณ ํ๋๋ ์ ํ๋ณ๋ก ๊ฐ๊ฐ ์ ํํด ์ฃผ์. ์๋ ‘Add’๋ฒํผ์ ๋๋ฌ ํ์ง, ์ฌ๋ง, ๊ฒฉ๋ฆฌ ํด์ ์๋ฅผ ๋ชจ๋ ํ์ํ ๋ค์ ์ ์ฅ์ ๋๋ฌ์ค๋ค. Label์ ์ง์ ํ์ง ์์ผ๋ฉด ์ด๋ค ํํ๋ก Aggregation์ ํ๋์ง๋ฅผ Label ์์ญ์ ๋ณด์ฌ์ฃผ๋๋ฐ ๊ทธ๊ฒ ๋ณด๊ธฐ ์ซ๋ค๋ฉด ์ํ๋ ํ
์คํธ๋ก ์ง์ ํด ์ฃผ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ต๊ทผ ์ ." . ใ๏ปฟํ์ง์, ์ฌ๋ง์, ๊ฒฉ๋ฆฌ ํด์ ์ ‘์ต๊ทผ ๋ฐ์ดํฐ’๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ ๋ชฉ์ ์ด๋ค. ์ด ๊ฒฝ์ฐ Aggregation์ Top Hit์ผ๋ก ์ ํํ๋ฉด ํ๋๋ฅผ ์ ํํ ์ ์๊ฒ ๋๋๋ฐ ํ๋ฃจ์ ๋ฐ์ดํฐ๊ฐ ์ด 18 row์ด๊ธฐ ๋๋ฌธ์ (์์ธ, ๋ถ์ฐ, …, ์ ์ฃผ, ๊ฒ์ญ) 18 row ์ ์ ๋ถ ๋ํ ๊ฐ์ด ํ๋ฃจ ๊ธฐ์ค์ ํฉ๊ณ๊ฐ ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ ฌ์ ๋ ์ง ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ํด์ค์ผ ๊ฐ์ฅ ์ต๊ทผ ๋ฐ์ดํฐ์ ํฉ๊ณ๊ฐ ๋๋ ์ ๋ ์ ๊ฒฝ ์จ์ผ ํ๋ค.
๊ฐ ํ์
๋ณ ํฉ๊ณ ." . ใ๏ปฟ์ง์ญ๋ณ๋ก ํ์
๋ณ ์๋ฅผ ๋ณด๊ธฐ ์ํด Pie ํ์
์ผ๋ก ์ ํํ์ฌ ์งํํ๋ค. ํ์
๋ณ(์๋ก ๋ค์ด ํ์ง์ด๋ฉด confirmed)๋ก ํฉ๊ณ๋ฅผ ๊ตฌํ๊ธฐ ์ํด Aggregation์ ‘sum’์ผ๋ก ์ค์ ํ๋ฉด ๋น ์์ด ๋์ค์ง๋ง ๊ฐ ์ง์ญ๋ณ๋ก ์ฐจํธ๋ฅผ ์๋ผ์ ๋ด์ผ ํ๊ธฐ์ ํ๋จ์ Buckets์ Add๋ฅผ ๋๋ฅด๊ณ regieon์ ํ๋๋ฅผ Terms Aggregation ํ๋ค. 18 row์ ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ๋ณด์ฌ์ผ ํ๊ธฐ์ ์ ๋ ฌ ๊ฐ์๋ฅผ ๋๋ฆฌ๊ณ option ํญ์์ ๋ณด๋ ์ทจํฅ์ ์๋ง๊ฒ ์ค์ ๊ฐ๋ค์ ๋ฐ๊ฟ์ค๋ค.
ํ์
๋ณ ์ถ์ด ." . ใ๏ปฟํ์ง, ์ฌ๋ง, ๊ฒฉ๋ฆฌ ํด์ ์ค์ ์ฌ๋ง์ ์ ์ธํ๊ณ ๋๋จธ์ง ๋์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ํฌ๊ณ ๋ณํ๋์ด ๋น์ทํ๊ธฐ ๋๋ฌธ์ x์ถ์ ์๊ฐ์ผ๋ก ์ค์ ํด๋๊ณ ์ฌ๋ง์ ๋ง๋๋ก, ๋๋จธ์ง ๋์ ๋ผ์ธ์ผ๋ก ํ ํ๋ฉด์์ ํํํ๋ฉด ์ด 3๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ณด๊ธฐ ์ข์ ๊ฒ ๊ฐ์๋ค. Vertical bar ์ ์ ํํ๊ณ x์ถ(Buckets > X-axis)์ ๋ฐ์ดํฐ ํ์
์ธ convert_date๋ก ์ค์ ํ๋ค. ๋ค์์ผ๋ก ์ฌ๋ง์ ๋งค์ผ ๋ช ๋ช
์ฌ๋งํ๋์ง ๋๋ ทํ๊ฒ ๋ณด๊ธฐ ์ํด ๊ทธ๋ฅ sum์ผ๋ก, ๋๋จธ์ง ๋์ ๋์ ํฉ๊ณ๊ฐ ๋ ์๋ฏธ ์์ด ๋ณด์ผ ๊ฒ ๊ฐ์ Cumulative Sum์ผ๋ก Aggregation์ ํ๋ค.
๏ปฟใ์ผ๋ง ์ ์ ํ์์ ๋ธ๋ก๊ทธ๋ฅผ ๋ณด๊ณ ์ด๋ ๊ต์ก ๊ธฐ๊ด์์ ElasticStack์ ๋ํ ๊ฐ์ ์์ฒญ์ด ๋ค์ด์๋ค. ์ฌ์ค ๊ด๋ จ ๊ธฐ์ ์ ๋ํด ์ง์์ด ์์ฃผ ๊น๊ณ ํด๋ฐํ ๊ฒ ์๋๋ผ์ ์ฝ๊ฐ์ ๋ฐ๊ฐ๋ถํฐ ๋ค์์ง๋ง ElasticStack์ ์ ํ ๋ชจ๋ฅด๋ ์ฌ๋๋ค ๊ธฐ์ค์ผ๋ก ์ด๋ป๊ฒ ๋์๊ฐ๋์ง์ ๋ํด์๋ง ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ ์ ๋๋ก ํ๋ฉด ๋๋ค๊ณ ํ์ฌ ์กฐ์ฌ์ค๋ฝ์ง๋ง ๋จ๋ฆฌ๋ ๋ง์์ผ๋ก ์ด์ฌํ ์ค๋น๋ฅผ ํ๊ธฐ ์์ํ๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ฐ์ ๋ฐ ์ด์ ๋ก ๊ฐ์๊ธฐ ๊ฐ์๋ฅผ ํ ์ ์๊ฒ ๋์๊ณ ๊ทธ๊ฐ ์ค๋นํ๋ ๋ด์ฉ๋ค์ด ๋๋ฌด ์์ฝ์ง๋ง ์๋ฌด ์์ฉ์ด ์๊ฒ ๋์ด๋ฒ๋ ธ๋ค. ๊ทธ๋ฅ ์ค๋จํ๊ธฐ์ ์์ฌ์ด ๋ง์์ด ๋๋ฌด ์ปค์ ์ค๋นํ๋ ๋ด์ฉ ์ค์ ‘๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋์๋ณด๋๋ฅผ ๋ง๋๋ ๋ถ๋ถ’์ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ๊น ์ถ์ด ๋ธ๋ก๊ทธ์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค ํ๋ค.
๏ปฟ๊ฐ์๋ฅผ ์ค๋นํ ์ฌํด 1์ ์ค์์ Elasticsearch ๋ฒ์ ์ด 7.10.2์ด์๋๋ฐ ๋ธ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ์๋ ์ง๊ธ์ ๋ฒ์จ 7.11์ผ๋ก ๋ฒ์ ์
๋์๋ค. ๋ด๊ฐ ์๋ ์คํ์์ค ์ค์ ๋ฒ์ ์
์ด ๊ฐ์ฅ ๋น ๋ฅธ๋ฐ ๊ทธ๋ ๋ค๊ณ ๊ธฐ๋ฅ์ด ํ ๋ฐ๋๊ฑฐ๋ ์ต๋ํ๊ธฐ ์ด๋ ต๊ฒ ๋ฐ๋์ง ์์๋ค. ๊ทธ๋งํผ ์ฌ์ฉ์๊ฐ ๋ฌด์์ ์ํ๋์ง ๋ช
ํํ ์๊ณ ์์ ๋จ์๋ก ์กฐ๊ธ์ฉ ๋ฐ๋์ด ๊ฐ๋ ๋ชจ์ต์ด ๊ฝค ์ธ์์ ์ด๋ค.
ใ๏ปฟ์๋
์ด๋ถํฐ ์ฝ๋ก๋19 ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ธ๊ณ์ ์ผ๋ก ํผ์ง๊ธฐ ์์ํ๊ณ ์์ง๊น์ง๋ ์งํ ์ค์ด๋ค. ๋๋ ์ ์ผ๋๋ ๊ฑด ์๋๊น ํ๋ ๋๋ ค์์ ์ด๋์์ ์ผ๋ง๋ ๋ฐ์ํ๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ต๋ ์์ ์ฐ๋ฆฌ๋๋ผ์ ๋ฐ์ด๋ ๊ฐ๋ฐ์๋ค์ ๋๊ฐ ์ํค์ง๋ ์์๋๋ฐ ์ ๋ง ๊ฐ์ฌํ๊ฒ๋ ๊ทธ ํํฉ์ ํ๋์ ๋ณผ ์ ์๋๋ก ์ฌ๋ฌ ์ ํ์ผ๋ก ์ฝ๋ก๋19 ๋ฐ์ด๋ฌ์ค ๋์๋ณด๋๋ฅผ ๋ง๋ค๊ธฐ ์์ํ๋ค. ๊ทธ ๋๋ถ์ ์ข ๋ ํํฉ์ ๋ณด๊ธฐ์ ํธํด์ก๊ณ ๋์ฑ ์กฐ์ฌํ๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ค. ์ด์ ๋ ํฌํธ์ฌ์ดํธ๋ ๊ฐ์ข
๋งค์ฒด๋ฅผ ํตํด ์์ฝ๊ฒ ์ฝ๋ก๋19 ๋ฐ์ด๋ฌ์ค์ ํํฉ์ ๋ณผ ์ ์์ง๋ง ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฒ์์์ง์ด์ง๋ง ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋๋ฐ ํ๋ฅญํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ElasticStack์ ํ์ฉํด์ ‘๋๋ง์ ๋์๋ณด๋’๋ฅผ ๋ง๋๋ ๊ฑธ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. ๋ณธ ํฌ์คํ
์ ์ผํ์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋์๋ณด๋๋ฅผ ๋ง๋๋ ๊ฒ์์ ๋๋๋ ๊ฒ ์๋๋ผ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋๋ค๋ ๊ฐ์ ํ์ ์ ๋ฐ์ ์ธ “ํ์ดํ๋ผ์ธ"์ ๊ตฌ์ถํ ๋ค ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด ๋๊ณ ๋ฐ์ดํฐ๋ง ๊ฐฑ์ ํ๋ฉด ์๋์ผ๋ก ๋์๋ณด๋ ๋ํ ์
๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค. ์ ์ฒด ํ๋ฆ" ์ ์ฒด ํ๋ฆ
๏ปฟ๊ธ์ ๋ชจ๋ ์์ฑํ๊ณ ๋ณด๋ ์์ด ์๊ฐ๋ณด๋ค ๊ธธ์ด์ ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ํํฐ๋งํ์ฌ Elasticsearch์ ์ธ๋ฑ์ฑ ํ๋ ๋์๋ณด๋๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ผ์ข
์ “๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ"์ ๊ตฌ์ฑํ๋ ๋ถ๋ถ๊ณผ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก Kibana์ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋์๋ณด๋๋ฅผ ๋ง๋๋ 2๊ฐ์ ํฌ์คํ
์ผ๋ก ๋๋์ด ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
๏ปฟใ์ต์ข
์ ์ผ๋ก ๋ง๋ค๊ฒ ๋ ๋์๋ณด๋์ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ๋ค. ์ต์ข
๋ชฉํ!" ์ต์ข
๋ชฉํ!
๋์๋ณด๋ ๊ตฌ์ฑ ์ค๋น ใ๏ปฟ์์ ์๋ Elasticsearch, Logstash, Kibana 3๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ELK๋ผ ๋ถ๋ฆฌ๋ค Beat๋ผ๋ ๊ฒฝ๋ ์์ง๊ธฐ ์ ํ์ด ๋ฑ์ฅํ๋ฉฐ ์ด ๋ชจ๋ ๊ฑธ ElasticStack๋ผ ๋ถ๋ฅด๊ธฐ ์์ํ๋ค. (๊ณต์ ํํ์ด์ง ์ฐธ๊ณ ) ๋จผ์ ์ด๋ค ๋ชฉํ์ ์ด๋ค ์์๋ก ๋์๋ณด๋๋ฅผ ๊ตฌ์ฑํ ๊ฒ์ธ์ง์ ๋ํด ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค.๏ปฟ
๋ฐ์ดํฐ ใ๏ปฟ๋ฐ์ดํฐ๋ ๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ์์ ๊ฐ์ ธ์ค๋ ค๋ค ์กฐํ๋ฅผ ํด๋ณด๋ ๋๋ฝ๋๋ ๋ ์ง๋ ์์๊ณ ์ํ๋ ๋ฐ์ดํฐ์ ํ์ง์ด ์๊ฐ๋ณด๋ค ์ข์ง ์์์ ๋ค๋ฅธ ๊ณณ์ ์ฐพ์๋ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ค ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ๋ฐ์ดํฐ๊ฐ ๊นํ์ ๊ณต๊ฐ๊ฐ ๋์ด ์์ด์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ค ํ๋ค. ํด๋น ๋ฐ์ดํฐ๋ https://coronaboard.kr/ ์์๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค. ๏ปฟ
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(preprocessing) ใ๏ปฟ์ํ๋ ๋ฐ์ดํฐ๋ ์ ๊นํ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์ค์ ์ง์ญ๋ณ ๋ฐ์ ํํฉ. ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด๋ฉด ์์ผ๋ณ๋ก ๋ฐ์ดํฐ๊ฐ ‘๋์ ’๋์ด ์ ์ฅ๋์ด ์๋ค. ์ฆ, ์์ธ์ง์ญ ๊ธฐ์ค์ผ๋ก 2020๋
2์ 17์ผ์ 14๋ช
์ด ๋ฐ์ํ๊ณ 2020๋
2์ 18์ผ์ ํ ๋ช
๋ ๋ฐ์ํ์ง ์์๋๋ฐ 14๋ช
์ผ๋ก ‘๋์ ’๋์ด ์ ์ฅ๋์ด ์๋ค. ์ฌ์ค ์ด๋๋ก ํด๋ ํฐ ๋ฌธ์ ๋ ์์ง๋ง ์ด๋๊น์ง๋ ๋ณ๋์ ๊ฐ๊ณต ์์ด ์ต๋ํ ์๋ณธ ๋ฐ์ดํฐ(raw) ๊ฐ ์์ด์ผ ๋ฐ์ดํฐ ๋ถ์ ์ ๋ค์ํ๊ฒ ํ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค. ์ ๋ฆฌํ๋ฉด, ์ง๊ณ ์๊ฐ ๋์ ๋์ง ์๊ณ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์ง๊ณ๋ ์๋ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ค.๏ปฟ
ใ๏ปฟํ์๋ ์ฃผ๋ก java๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ฐ์ ํ์ง๋ง ๊ฐ๋ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ์ฑ ๊ฐ๋ฐ์ python์ ํ์ฉํ๋ ํธ์ด๊ธฐ์ ๋ค์ ์ด์ ์ฝ๋๋ ์๋์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ค ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
import csv, requests import pandas as pd CSV_URL = 'https://raw.githubusercontent.com/jooeungen/coronaboard_kr/master/kr_regional_daily.csv' # ํ์ง, ์ฌ๋ง, ๊ฒฉ๋ฆฌํด์ yesterday_data = {} yesterday_data['์์ธ'] = [0, 0, 0] yesterday_data['๋ถ์ฐ'] = [0, 0, 0] yesterday_data['๋๊ตฌ'] = [0, 0, 0] yesterday_data['์ธ์ฒ'] = [0, 0, 0] yesterday_data['๊ด์ฃผ'] = [0, 0, 0] yesterday_data['๋์ '] = [0, 0, 0] yesterday_data['์ธ์ฐ'] = [0, 0, 0] yesterday_data['์ธ์ข
'] = [0, 0, 0] yesterday_data['๊ฒฝ๊ธฐ'] = [0, 0, 0] yesterday_data['๊ฐ์'] = [0, 0, 0] yesterday_data['์ถฉ๋ถ'] = [0, 0, 0] yesterday_data['์ถฉ๋จ'] = [0, 0, 0] yesterday_data['์ ๋ถ'] = [0, 0, 0] yesterday_data['์ ๋จ'] = [0, 0, 0] yesterday_data['๊ฒฝ๋ถ'] = [0, 0, 0] yesterday_data['๊ฒฝ๋จ'] = [0, 0, 0] yesterday_data['์ ์ฃผ'] = [0, 0, 0] yesterday_data['๊ฒ์ญ'] = [0, 0, 0] flag = False csv_data = [] with requests.
๏ปฟ ์ด๋ ฅ์๋ ์ธ์ ์ฐ๊ฒ ๋๋ ๊ฑธ๊น? ์์ฃผ ์ผ๋ฐ์ ์ผ๋ก. ์ ์
(ํ์)์ ๊ฒฝ์ฐ ๋ํ์ ์กธ์
ํ ์ฆ์ ์ทจ์
ํ๊ณ ์ถ์ ํ์ฌ๋ก ์ง์ํ๊ธฐ ์ํด ์์ฑํ๊ณ , ๊ฒฝ๋ ฅ(ํ์ฌ์)์ ๊ฒฝ์ฐ ์ด์ง์ ๋ง์๋จน๊ณ ๊ฐ๊ณ ์ ํ๋ ํ์ฌ๊ฐ ๋๋ ทํ๊ฒ ๊ฒฐ์ ์ด ๋๋ฉด ๊ทธ๋ ์์ฑํ๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค. ํ์ฌ๋ง๋ค ์ ํด์ง ํ์์ด ์๋ ๊ณณ์ด๋ผ๋ฉด ๊ทธ ํ์์ ๋ง์ถ์ด ์์ฑํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด ๋๋ง์ ๊ธฐ์ค์ ๋ง์ถ์ด ์์ฑํ๊ฒ ๋๋ ‘์ด๋ ฅ์’.
ใํ์ฌ์ ์
์ฌํ๊ณ ์ ์ ์์ด ์ง๋ด๋ค ๋ณด๋ฉด ์ด์ง์ ์๊ฐํ๊ธฐ ์ ๊น์ง๋ ‘์ด๋ ฅ์’๋ผ๋ ์กด์ฌ๋ฅผ ์์นซ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ๋ค. ๋ํ ๊ตฌํ์ฌ ์๊ฐ์ ํ ์ ํ๋ฉด์๊น์ง ์จ์ผ ํ๋ค๋ ๋ง์์กฐ์ฐจ ์ ๋ค์ง ์๋๋ค. ์ค์ ๋ก ํ
๋น ์ฑ
์ ์์ ์์ ํ์ A4์ง์ ํ ํ ์๋ฃจ๋ง ๊ฐ์ง๊ณ ์จ๋ด์ผ์ง ํ๊ณ ์์ํ๋ฉด ๋ด๊ฐ ์ด์ ๊น์ง ๋ญ ํด์๋ ํ๋ฉฐ ์ ์จ์ง์ง ์๊ธฐ๋ ํ๊ณ .
์ด๋ ฅ์์ ๋ญ ์จ์ผ ํ ๊น.์ถ์ฒ : https://epsem.tistory.com/243" ์ด๋ ฅ์์ ๋ญ ์จ์ผ ํ ๊น.
์ถ์ฒ : https://epsem.tistory.com/243 ใ๊ทธ๋ฐ ๊ฐ๋ฐ์๋ก ๊ด์ฐฎ์๊ฐ ์๋ฆฌ์ฆ์ธ ๏ปฟ์ด๋ฒ ํฌ์คํ
์์๋ ๊ฐ๋ฐ์์๊ฒ ์์ด ‘์ด๋ ฅ์’๋ ๋ฌด์์ด๊ณ ์ธ์ , ์ ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๊ณ ์ ํ๋ค. ์ ๋ณด์ ๋ฐ๋ค, ํ์์ฒ๋ผ ์์์ง๋ ๊ธฐ์ ์ ๋ณํ๋ฅผ IT ์ต์ ๋ฐฉ์์ ์จ๋ชธ์ผ๋ก ๋ง์ ์ธ์ฐ๋ ์ฐ๋ฆฌ ๊ฐ๋ฐ์๋ค์๊ฒ ‘ํ์ฌ’๋ณด๋ค๋ ‘๋ ์์ ’์ ์ํด ํ๋ฃจ๋ฅผ ์ด์๊ฐ ์ ์๋ ‘ํ’์ด ๋์์ผ๋ฉด ํ๋ ๋ง์์ผ๋ก.
๏ปฟ๋ค์ด๊ฐ๊ธฐ ์์, ๋ณธ ํฌ์คํ
์ ์ด์ง์ ๊ถ์ ํ๋ ๋ด์ฉ์ ์ ๋ ์๋์ ๋ฐํ๋ค. ์คํ๋ ค ์ด๋ ฅ์ ์์ฑ์ ํตํด ํ์ฌ์ ์ง์ฅ์์ ๋ณธ์ธ์๊ฒ ๋์ฑ ์ง์คํ๊ณ ํ์ฌ์ ํจ๊ป ์ฑ์ฅํ์ผ๋ฉด ํ๋ ๋ฐ๋์ด๋ค.
๊ฐ๋ฐ์์๊ฒ ์ด๋ ฅ์๋? ใ์ฐ์ ์ด๋ ฅ์๋ ๋ฌด์์ผ๊น? ์ฌ์ ์ ์๋ฏธ๋ฅผ ๋จผ์ ์ดํด๋ณด์. ์ํค๋ฐฑ๊ณผ์ ๋ฐ๋ฅด๋ฉด “์ทจ์ง์ ์ํ ๋ฉด์ ์ ๊ธฐํ๋ฅผ ์ป๊ธฐ ์ํด ํ์ฌ ๋ฑ ์กฐ์ง์ ์ ์ถํ๋ ๊ฐ์ธ์ ์ ์์ ๋ณด, ํ๋ ฅ, ๊ฒฝ๋ ฅ ๋ฑ์ ์๊ฐ ์์ผ๋ก ์์ฝ ํน์ ๋์ดํ ๋ฌธ์"๋ผ ๋์์๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ์ฐ๋ฆฌ ๊ฐ๋ฐ์๋ค์ ๋ณธ์ธ์ด ์ฌ์ฉํ ์ ์๋ ‘๊ธฐ์ ’์ด๋ ํน์ ํ ‘๊ฒฝํ’์ ์ ์ผ๋ฉฐ ์์ ์ด ๊ฐ์ง๊ณ ์๋ ๊ธฐ์ ์ ๊ฐ์น์ ๋ํด ์ดํํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.
ใ์ฌ์ ์ ์๋ฏธ๋ก ๋ณด๋ฉด ‘๋ด ์ ๋ณด’๋ฅผ ์ ์์ฝํด์ ์ทจ์
ํ๊ณ ์ ํ๋ ‘ํ์ฌ’์ ์ ๋ฌํ๋ ์๋จ์ผ๋ก๋ ์ดํดํ ์๋ ์์ ๊ฒ ๊ฐ๋ค. ์ฆ, ๋๊ตฐ๊ฐ์๊ฒ ๋ณธ์ธ์ ์ ๋ณด(ํน์ ์ค๋ ฅ)๋ฅผ ์ ๋ฆฌํด์ ์๋ฆฌ๋ ์๋จ ์ค์ ํ๋๋ก ๋ณผ ์ ์๋๋ฐ, ๊ณผ์ฐ ์ด ์ด๋ ฅ์์๋ ‘์๋ฆฐ๋ค’๋ผ๋ ์๋ฏธ๋ง ๋ด๊ฒจ์์๊น?
ใํ์๊ฐ ์๊ฐํ๋ ์ด๋ ฅ์์ ์ ์๋ ‘๋๋ฅผ ์๋ฆฌ๋ ์๋จ’ ๋ณด๋ค ‘๋๋ฅผ ๊ฐ์ฅ ์ ์๋ ๊ฑฐ์ธ’์ด๋ผ ์๊ฐํ๋ค. ํนํ ๊ฐ๋ฐ์์๊ฒ๋ ๋์ฑ๋. ๋ฌด์์ ๊ฐ๋ฐํด์๊ณ ์ด๋ค ๊ธฐ์ ์ ์จ ์์ผ๋ฉฐ ์ด๋ค ๊ฒฝํ์ด ์๋์ง ์ด๋ ๊ณณ์ ์์ฑ์ ํ์ง ์์ผ๋ฉด ๋๋ฌ๋๋ฌ ๊ธฐ์ต์ผ๋ก ๋ ์์ ์ ์๊ธฐ์ ์์ฆ์ ๋ด์ผ ํ ์ ๋ณด๊ฐ ๋ง์ ์ธ์์ด ๋์ด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์จ์ผ ํ ๊น? ใ์์ ์ด๋ ฅ์๋ฅผ ‘๋๋ฅผ ๊ฐ์ฅ ์ ์๋ ๊ฑฐ์ธ’์ด๋ผ๊ณ ๋งํ๋ค. ๊ฑฐ์ธ์ ๋ณด๊ณ ์ผ๊ตด์ ๋ญ๊ฐ ๋ฌป์์ผ๋ฉด ๋ฆ๊ฑฐ๋ ์ท์ฐจ๋ฆผ์ด ๋ณ๋ก๋ผ๋ฉด ๊ณ ์ณ๋ณด๋ ๋ฑ ‘๊ฑฐ์ธ’์ ๋๋ฅผ ๊ฐ์ฅ ์ ๋ณผ ์ ์๋ ๋๊ตฌ ์ค์ ๊ฐ์ฅ ์ข์ ๋ฌผ๊ฑด์ด๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ์ด๋ ฅ์๋ ๋จ์ํ๊ฒ ‘Java ๊ฐ๋ฐ N ์ฐ์ฐจ’ ๊ฐ ์๋ ๊ทธ๋์ ๋ฌด์์ ํด์๊ณ ์ด๋ค ๊ฒฝํ๊ณผ ๊ธฐ์ ์ ์ฌ์ฉํด ์๋์ง ์ ๋ฆฌ๋ฅผ ํ๋ฉฐ ๋ ์์ ์ ๋์๋ณผ ์ ์๋ ํ๋ฅญํ ๋๊ตฌ๋ผ ์๊ฐํ๋ค.
ใ๊ฐ๋ฐ์ ์ํ(์ ํํ ๋งํ๋ฉด ํ์ฌ ์ํ)์ ํ๋ค ๋ณด๋ฉด ๊ฐ์ธ ์ฌ์
์ ์ ์ธํ๊ณ ํ์ฌ๊ฐ ์ถ๊ตฌํ๋ ๋น์ฆ๋์ค์ ๋ชฉํ๋ฅผ ์ํด ์์์ ์ด ์๋ ํ์์ ์ผ๋ก ์๋ฌด๋ฅผ ํ ๋น๋ฐ์ ์งํํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์์ ๋งํ๋ ‘์ฐ์ด๋ด๊ธฐ์ ๊ฐ๋ฐ’์ ํ๋ ๊ฒฝ์ฐ๋ ๋ง๊ณ , ๋ฌธ์ ๋ฅผ ๋ง๋ ๊ฒฝ์ฐ ๋ค์ํ ์ฝ์ง๋ก ํด๊ฒฐ์ ํ์ง๋ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ ์ฑ ์ผ์ ์ ์น์ฌ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๋ค๋ ์๋ค. ๊ทธ๋ ๊ฒ ์๊ฐ์ด ์ง๋๊ณ ์ฐ๋ง์ด ๋์ด ํ ํด๋ฅผ ๋์๋ณด๋ฉด ์
๋ฌด๋ฅผ ์ผ์ ์ ๋ง์ถ์ด ์งํํ๋ ๋ฐ๋ ์ฑ๊ณตํ์์ง๋ง ์ ์ ๋ณธ์ธ์๊ฒ ๋จ์ ๊ฑด ์ฅ์๊ฐ ์ปดํจํฐ ์์ ์์ ์๊ธด ๊ฑฐ๋ถ๋ชฉ๊ณผ ์ ์ ์ง์ด์ ธ๊ฐ๋ ๋คํฌ์ํด๋ฟ์ด๋ค.
์ ๋์ง?์ถ์ฒ : https://www.clien.net/service/board/park/4533074" ์ ๋์ง?
์ถ์ฒ : https://www.clien.net/service/board/park/4533074 ๏ปฟใ์ด๋ ฅ์๋ฅผ ์จ์ผ ํ๋ ์ด์ ๋ฅผ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๊ผฝ์๋ฉด, ์ฒซ ๋ฒ์งธ๋ก๋ ๋๋ฅผ ์๋ฆฌ๋ ์๋จ(Personal branding)์ผ๋ก ํ์ฉํ ์ ์๋ค๋ ์ ์์๋ค. ์ ์ ๋ฆฌํ ์์ ์ ์ด๋ ฅ์๋ฅผ ๊ณต๊ฐํด๋์ผ๋ฉด ์ทจ์
์ ๊ธฐํ๊ฐ ์๊ธธ ์๋ ์๊ณ ์ธ์ ๋คํธ์ํน์ด ๋์ด ์๊ฐํ์ง ๋ชปํ ‘๊ธฐํ’๋ฅผ ์ป์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๏ปฟใ๊ทธ ์ด๋ ๋๋ณด๋ค๋ ์ ์ ์์ด ๋ฌ๋ ค์จ 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.