/images/profile.png

๋งค๋‹ˆ์ €๋Š” ์ •๋ง ๊ฐœ๋ฐœ์ž์˜ ๋ฌด๋ค์ผ๊นŒ? (๋ฆฌ๋ทฐ - ๊ฐœ๋ฐœ์ž 7๋…„์ฐจ, ๋งค๋‹ˆ์ € 1์ผ์ฐจ)

๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์ปค๋ฆฌ์–ด๋Š” ์ •๋ง ๋‹ค์–‘ํ•˜์ง€๋งŒ ํ•„์ž๊ฐ€ ๋ณด๊ณ  ๋“ค์€ ๊ฒฝํ—˜์„ ์•„์ฃผ ์ผ๋ฐ˜ํ™” ์‹œ์ผœ ์ •๋ฆฌํ•ด ๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฒ˜์Œ์—” ์ „๊ณต/๋น„์ „๊ณต์„ ๋ถˆ๋ฌธํ•˜๊ณ  ์‹ ์ž…์œผ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์‚ฌ์ˆ˜์—๊ฒŒ ํ˜ผ๋‚˜๊ธฐ๋„ ํ•ด๋ณด๊ณ  ๋˜๋Š” ํ˜ผ๋‚ด์ค„ ์‚ฌ์ˆ˜๊ฐ€ ์—†์–ด ํ˜ผ์ž ๋™๋™ ๋ฐค๋„ ์ƒˆ๋ณด๊ณ , ๋‹คํฌ์„œํด๊ณผ ๊ฑฐ๋ถ๋ชฉ์„ ๊ฒธ๋น„ํ•œ ์ด๋ฅธ๋ฐ” “์‚ฝ์งˆ"์„ ํ•˜๋ฉฐ ๊ณ ํ†ต์˜ ์‹œ์ ˆ์„ ๋ณด๋‚ด๊ณ  ๋‚˜๋ฉด ์–ด๋Š๋ง ์Šน์ง„(์ง„๊ธ‰)์„ ํ•˜๋ฉฐ ์ผ์ • ๊ทœ๋ชจ์˜ “ํŒ€์žฅ(ํ˜น์€ ๊ด€๋ฆฌ์ž)“์ด ๋œ๋‹ค. ๊ทธ๊ฒŒ ์ž์˜๋“  ํƒ€์˜๋“ . ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์†Œ “๊ธฐ์ˆ "์ด๋ผ๋Š” ํŠน์ˆ˜์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์–ด๋Š ์ง๊ตฐ์ด๋“  ๊ฐ„์— ์ด๋Ÿฌํ•œ ์ปค๋ฆฌ์–ด ํŒจ์Šค์˜ ํ๋ฆ„์€ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ ํ˜๋Ÿฌ๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ ์–ด๋„ ํ•„์ž๊ฐ€ ๋ณด๊ณ  ๋“ค์€ ๊ฒƒ๋งŒ ๋ณด๋ฉด ๋ง์ด๋‹ค. (์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” ํ•ญ์ƒ ์žˆ์ง€๋งŒ…) ํ•˜๋ฃจ๋Š” ํŒ€์žฅ๋‹˜๊ณผ์˜ ๋ฉด๋‹ด ์ค‘์— “์ด์ œ๋Š” ๋งˆ๋ƒฅ ๋ˆˆ์•ž์— ์žˆ๋Š” ๊ฐœ๋ฐœ๋งŒ ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์„ ์ข€ ๋” ๊นŠ๊ฒŒ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ์ž๋ฆฌ์™€ ์‚ฌ๋žŒ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ฃผ์–ด์ง„ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์ž๋ฆฌ, ๋‘˜ ์ค‘ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๊ฐ€ ์˜จ ๊ฒƒ ๊ฐ™๋‹ค. ๋” ๋†’๊ณ  ๋” ๋ฉ€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋” ๋„“๊ฒŒ ๋ณผ ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค.“๋ผ๋Š” ๋ง์”€์„ ๋“ฃ๊ฒŒ ๋œ๋‹ค. ์–ด๋Š๋ง “๊ทธ ์‹œ์ "์ด ๋‹ค๊ฐ€์˜จ ๊ฒƒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ํ•„์ž๋Š” ํŒ€์žฅ๋‹˜์ด ๋ง์”€ํ•˜์‹  ๋‘ ๊ฐ€์ง€ ์ค‘ ์ „์ž์— ์ข€ ๋” ๊ฐ€๊น๊ฒŒ ๋‹ค๊ฐ€๊ฐ€๊ณ  ์‹ถ๋‹ค. ๊ทธ๋งŒํผ ์˜ค๋ž˜์˜ค๋ž˜ “์‹ค๋ฌด ๊ฐœ๋ฐœ"์„ ํ•˜๊ณ  ์‹ถ๊ณ , ๋˜ ๊ทธ๋งŒํผ ๊ฐœ๋ฐœ์ด ์žฌ๋ฐŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์•„์ง๋„ ๋ˆˆ์•ž์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํ•˜๋ฉฐ ์‹œ๊ฐ„ ๊ฐ€๋Š” ์ค„ ๋ชจ๋ฅผ ๋งŒํผ ๋ฐค์„ ์ƒˆ์šฐ๋Š” ๊ฒŒ ์žฌ๋ฏธ์žˆ๋Š” ๊ฑธ ๋ณด๋ฉด… ์š”๋ฆฌํ•˜๋Š” ๊ฑธ ์ข‹์•„ํ•˜์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ ์น˜ํ‚จ์ง‘์€ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. ์ถœ์ฒ˜ : https://catapult.tistory.com/entry/%EC%B9%98%ED%82%A8%EC%A7%91%EC%9D%B4%EB%82%98-%EC%B0%A8%EB%A0%A4%EC%95%BC%EC%A7%80" ์š”๋ฆฌํ•˜๋Š” ๊ฑธ ์ข‹์•„ํ•˜์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ ์น˜ํ‚จ์ง‘์€ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. ์ถœ์ฒ˜ : https://catapult.tistory.com/entry/%EC%B9%98%ED%82%A8%EC%A7%91%EC%9D%B4%EB%82%98-%EC%B0%A8%EB%A0%A4%EC%95%BC%EC%A7%80 ์–ด๋Š ๋‚  SNS ํ”ผ๋“œ์— ๊ฐœ๋ฐœ ๊ด€๋ จ๋œ ์†Œ์‹๋“ค์„ ๋ฐ›์•„๋ณด๋‹ค๊ฐ€ ๊ฐœ๋ฐœ 7๋…„์ฐจ. ๋งค๋‹ˆ์ € 1์ผ์ฐจ๋ผ๋Š” ์ œ๋ชฉ์˜ ์ฑ…์„ ๋ณด๊ฒŒ ๋œ๋‹ค. ๋ญ์•ผ, ์ด๊ฑฐ ๋‚ด ์ด์•ผ๊ธฐ ์•„๋‹ˆ์•ผ? ํ•˜๋ฉฐ ๊ท€์‹ ์— ํ™€๋ฆฐ ๋“ฏ ์‚ฌ์„œ ์ฝ์–ด๋ณด๋ ค๋Š” ์ฐฐ๋‚˜, ๋งˆ์นจ ํ•œ๋น›๋ฏธ๋””์–ด ์—์„œ ์ฃผ์ตœํ•˜๋Š” ๋‚˜๋Š” ๋ฆฌ๋ทฐ์–ด๋‹ค ๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ตญ ๋ฆฌ๋ทฐ์–ด์— ๋‹น์ฒจ์ด ๋˜๊ณ  ์šด ์ข‹๊ฒŒ ํ•ด๋‹น ์ฑ…์„ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. (์ด ์ฑ…์„ ์ฝ๊ฒŒ ํ•ด์ค€ ํ•œ๋น›๋ฏธ๋””์–ด ์ธก์—๊ฒŒ ์ด ๊ธ€๋กœ๋‚˜๋งˆ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์ „ํ•˜๊ณ  ์‹ถ๋‹ค.) ํ•„์ž์˜ SNS๋ฅผ ์žฅ์‹ํ–ˆ๋˜ ‘๊ฐœ๋ฐœ 7๋…„์ฐจ, ๋งค๋‹ˆ์ € 1์ผ์ฐจ’" ํ•„์ž์˜ SNS๋ฅผ ์žฅ์‹ํ–ˆ๋˜ ‘๊ฐœ๋ฐœ 7๋…„์ฐจ, ๋งค๋‹ˆ์ € 1์ผ์ฐจ’ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์šฐ์„  ์ฑ…์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ„๋‹จํžˆ ์ ์–ด๋ณด๊ณ  ๊ฑฐ๊ธฐ์— ํ•„์ž์˜ ์ƒ๊ฐ์„ ์กฐ๊ธˆ ๋” ์–น์–ด๋ณด๊ณ  ์‹ถ๋‹ค. ํ•„์ž๋ฅผ ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ์ฑ… ๊ฐ™์•„์„œ ์•„์ง๋„ ์ฑ… ํ‘œ์ง€๋งŒ ๋ด๋„ ์‹ ๊ธฐํ•˜๊ณ  ์„ค๋ Œ๋‹ค. ์ผ๋‹จ ์ฑ… ํ‘œ์ง€๋‚˜ ์ œ๋ชฉ์ด ๋ง˜์— ๋“  ๊ฑด ๊ฐ์ถœ ์ˆ˜ ์—†๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์‹ ์ž… ํ˜น์€ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ์–ด๋ด๋„ ์ข‹์„ ์ฑ…. ์ œ๋ชฉ๋งŒ ๋ณด๋ฉด ์ด์ œ ๊ฐ“ ํŒ€์žฅ ํ˜น์€ ๋งค๋‹ˆ์ €๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋งŒ ํ•ด๋‹น๋˜๋Š” ์ฑ…์œผ๋กœ ๋ณด์ธ๋‹ค. ํ‘œ์ง€ ์ƒ๋‹จ์— “๊ฐœ๋ฐœ๋งŒ ํ•ด์™”๋˜ ๋‚ด๊ฐ€, ์–ด๋Š ๋‚  ๊ฐ‘์ž๊ธฐ ‘ํŒ€’์„ ๋งก์•˜๋‹ค!” ์ ํ˜€์žˆ๊ธฐ๋„ ํ–ˆ์œผ๋‹ˆ๊นŒ. ํ•˜์ง€๋งŒ ์ฑ…์„ ์ฝ๋‹ค ๋ณด๋ฉด ๊ผญ ๊ทธ๋ ‡์ง€๋งˆ๋Š” ์•Š๋‹ค. ๋ฉ˜ํ† ๋ง์„ ํ•  ๋•Œ์—” ๋ฉ˜ํ† ์™€ ๋ฉ˜ํ‹ฐ ๊ฐ์ž์˜ ์œ„์น˜์—์„œ ์–ด๋–ค ์ž์„ธ๋กœ ์„œ๋กœ๋ฅผ ๋งž์ดํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์•Œ๋ ค์ฃผ๊ธฐ๋„ ํ•˜๊ณ  ๋ฌด์ž‘์ • ๋ˆˆ์•ž์— ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋งŒ์„ ํ•˜๋ฉฐ ์•ˆ๊ฐฏ์†์„ ๊ฑท๋Š” ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ๋ฏธ๋ž˜๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด๋Š” ์ข‹์€ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ผญ ๋ˆ„๊ตฐ๊ฐ€ ํ˜น์€ ๋ฌด์–ธ๊ฐ€๋ฅผ “๊ด€๋ฆฌ"ํ•˜๋Š” ์ž…์žฅ์ด ์•„๋‹Œ “ํŒ€"์ด๋ผ๋Š” ๊ณต๋™์ฒด ์‚ฌํšŒ, ํŠนํžˆ ๊ฐœ๋ฐœ ํŒ€์—์„œ ํŒ€์›๋“ค๊ณผ ํ˜‘๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์‚ดํŽด๋ณด๊ณ  ์žˆ๊ณ , ๊ฒฝ๋ ฅ์ด ๋‚ฎ์œผ๋ฉด ์•ˆ ๋ณด์ด๋Š” ๋ถ€๋ถ„๋“ค๊นŒ์ง€ ๋งˆ์น˜ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๊ฒƒ์„ ๋Œ€์‹  ๋ง์›๊ฒฝ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค. ์•ž๋ถ€๋ถ„์—๋Š” “์ด ์ฑ…์„ ์ฝ๋Š” ๋ฐฉ๋ฒ•"์ด๋ผ๋ฉฐ ์ƒํ™ฉ๋ณ„๋กœ ์ฝ๋Š” ์ฑ•ํ„ฐ๋ฅผ ๊ฐ€์ด๋“œ ํ•ด์ฃผ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ์–ด๋Š ํ•˜๋‚˜ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋‚ด์šฉ์ด ์—†์–ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฌด์–ธ๊ฐ€์— ํ™€๋ฆฐ ๋“ฏ ์ฝ์„ ์ˆ˜๋ฐ–์— ์—†์—ˆ๊ณ  ์„ ๋ฐฐ๋‹˜์ด ์•ž์„œ ์ง€๋‚˜๊ฐ„ ๊ธธ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€์ด๋“œ ํ•ด์ฃผ๋Š” ๋Š๋‚Œ์œผ๋กœ ์ค‘๊ฐ„์ค‘๊ฐ„ ์‚ฌ๋ก€๊ฐ€ ์žˆ์–ด์„œ ํ˜„์—…์— ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฝํž ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค ์ฝ๊ณ ์„œ์•ผ ์•Œ์•„์ฐจ๋ฆฐ ๋ฒˆ์—ญ์„œ(?)๋ผ๋Š” ์‚ฌ์‹ค. ์–ด๋– ํ•œ XX ๊ธฐ์ˆ  ์„œ์ ์—์„œ๋Š” Method๋ฅผ ‘๋ฐฉ๋ฒ•’, Overriding ์„ ‘๊ณผ์ ’์ด๋ผ๊ณ  ๋ฒˆ์—ญํ•œ ์ฑ…๋“ค์ด ์žˆ๋Š”๊ฐ€ ๋ฐ˜๋ฉด, ์ด ์ฑ…์€ ์ฝ๋Š” ๋‚ด๋‚ด ๊ตญ๋‚ด ์–ด๋–ค ๋ถ„์ด ์“ฐ์‹  ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ฝ์–ด๋‚ด๋ ค ๊ฐ”์ง€๋งŒ ๋‹ค ์ฝ๊ณ  ๋ณด๋‹ˆ ์™ธ๊ตญ์— ์–ด๋Š CTO๊ฐ€ ์“ด ์ฑ…์„ ์˜ฎ๊ฒจ์„œ ๋‹ค์‹œ ์จ์ง„ ์ฑ…์ด์—ˆ๋‹ค.

์กฐ๊ธˆ ๋” ๊ดœ์ฐฎ์€ Rest Template 1๋ถ€ - Retryable

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ฉด์„œ ๊ผญ ํ•œ๋ฒˆ ์ฏค ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” “RestTemplate”. ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ HTTP URL(๋ณดํ†ต API)์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘์— ํ•˜๋‚˜๋กœ springframework ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์ด๋‹ค. ํŠนํžˆ ํฐ ํ•œ๋ฉ์–ด๋ฆฌ๋กœ ๊ด€๋ฆฌ๋˜๋˜ Monolithic Architecture ์—์„œ ์š”์ฒญ์„ ํ•˜๊ณ (client) ์‘๋‹ต์„ ์ฃผ๋Š”(server) ์ฆ‰, Endpoint๊ฐ€ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜๋Š” Microservice Architecture ๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ๊ฐ ์„œ๋น„์Šค๊ฐ„ ํ˜ธ์ถœ๋ฐฉ์‹์ด HTTP ์ผ ๊ฒฝ์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ณค ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. (webClient ๋“ฑ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋‹ค.) ๋งŒ์•ฝ, ์š”์ฒญ์„ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ์‘๋‹ต์„ ์ฃผ๋Š” ์„œ๋ฒ„์˜ ์ƒํƒœ๊ฐ€ ๋ถˆ์•ˆ์ • ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ, ์–ด๋–ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ์˜ˆ์ปจ๋Œ€, ์š”์ฒญ 10๋ฒˆ์— ํ•œ๋ฒˆ์€ ์–ด๋– ํ•œ ์ด์Šˆ๋กœ ์‘๋‹ต์ด ์ง€์—ฐ๋˜๊ฑฐ๋‚˜ ์„œ๋ฒ„์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๊ฐ„ํ—์ ์ธ ์˜ค๋ฅ˜์‘๋‹ต์— ๋‹ต๋‹ตํ•จ์„ ํ˜ธ์†Œํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์ž ์‹œ ๋ˆˆ์„ ๊ฐ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ€๋ณ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ “์˜ˆ์™ธ์ฒ˜๋ฆฌ"๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. try { // http call } catch (Exception e){ // ์„œ๋ฒ„์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ์•ฝ์†๋œ ์—๋Ÿฌ์‘๋‹ต์„ ๋ฆฌํ„ด } ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์ •๋‹ต์ด ์•„๋‹์ˆ˜ ์žˆ๋Š”๊ฒŒ, “๊ฐ„ํ—์ ์ธ ์˜ค๋ฅ˜"๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๋Š” ์˜ค๋ฅ˜ํ™”๋ฉด์„ ๋ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋ฅผ ์ €๋ฒ„๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ “์žฌ์‹œ๋„” ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆˆ์น˜ ๋ชป์ฑŒ๋งŒํผ ๋น ๋ฅด๊ฒŒ ์žฌ์‹œ๋„๋ฅผ ํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ๋‹ค์‹œํ•œ๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๊ทธ์น˜๋งŒ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ํ•ด๊ฒฐํ•ด์•ผ…) ์‹ค์ œ๋กœ ์กฐ๊ธˆ์žˆ๋‹ค ํ•ด๋ณด๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์•ˆ๋ ๋•Œ๋Š” ์กฐ๊ธˆ (์ฒœ์ฒœํžˆ) ์‹œ๋„ํ•ด๋ณด์ž. ์ถœ์ฒ˜ : http://www.segye.com/newsView/20200302504384" ์‹ค์ œ๋กœ ์กฐ๊ธˆ์žˆ๋‹ค ํ•ด๋ณด๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์•ˆ๋ ๋•Œ๋Š” ์กฐ๊ธˆ (์ฒœ์ฒœํžˆ) ์‹œ๋„ํ•ด๋ณด์ž. ์ถœ์ฒ˜ : http://www.segye.com/newsView/20200302504384 ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” RestTemplate ๋ฅผ ์ด์šฉํ• ๋•Œ “์žฌ์‹œ๋„” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ์•„์ฃผ ๊ฐ„๋‹จํ• ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๋…ธ๋ ฅ์— ๋น„ํ•ด ํšจ๊ณผ๊ฐ€ ์ƒ๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌํ•ด ๋‘๊ณ  ์‹ถ์—ˆ๋‹ค. Spring Retry ๊ณต์‹ Github์— ์†Œ๊ฐœ๋ฅผ ๋นŒ๋ฆฌ์ž๋ฉด, Spring ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์žฌ์‹œ๋„ ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋˜ “RestTemplate"๊ณผ๋Š” ์‚ฌ์‹ค ๋ฌด๊ด€ํ•˜๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ์žฌ์‹œ๋„ ํ•˜๋Š” “RetryRestTemplate"๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋ ค ํ•˜๋Š”๊ฒƒ์ด๋‹ค. ์šฐ์„  ์ด “Spring-Retry"์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์•„์ฃผ ์‹ฌํ”Œํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  pom์— ๊ตฌํ˜„์— ํ•„์š”ํ•œ dependency ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> @Configuration @EnableRetry // 1 public class Application { @Bean public Service service() { return new Service(); } } @Service class Service { @Retryable(RemoteAccessException.class) // 2 public void service() { // ... do something } @Recover // 3 public void recover(RemoteAccessException e) { // ... panic } } @EnableRetry ์–ด๋…ธํ…Œ์ด์…˜์„ @Configuration์„ ์ง€์ •ํ•œ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์žฌ์‹œ๋„ ํ•˜๋ ค๋Š” ๋ฉ”์†Œ๋“œ์— @Retryable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•ด์ค€๋‹ค. ์žฌ์‹œ๋„๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„๋•Œ ์„ ์–ธํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜, @Retryable ๋™์ผํ•œ ํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๊ณ  return type ์€ @Retryable์„ ์ง€์ •ํ•œ ๋ฉ”์†Œ๋“œ์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. Retry Rest Template ์ด๋ ‡๊ฒŒ springframework ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” spring-retry ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์˜ ๋ชฉํ‘œ์ธ ์žฌ์‹œ๋„๋ฅผ ํ•˜๋Š” Retry Rest Template ๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž. ์šฐ์„ , RestTemplate ๋ฅผ Bean ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค๋กœ ๊ตฌ์„ฑํ•ด๋ณด์ž. @EnableRetry @Configuration public class RetryableRestTemplateConfiguration { @Bean public RestTemplate retryableRestTemplate() { SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory(); // 1 clientHttpRequestFactory.setReadTimeout(2000); clientHttpRequestFactory.setConnectTimeout(500); RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory) { @Override @Retryable(value = RestClientException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000)) // 2 public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType) throws RestClientException { return super.exchange(url, method, requestEntity, responseType); } @Recover public <T> ResponseEntity<String> exchangeRecover(RestClientException e) { return ResponseEntity.badRequest().body("bad request T.T"); // 3 } }; return restTemplate; } } SimpleClientHttpRequestFactory ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •ํ•ด์ค€ ๋‹ค์Œ RestTemplate ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ exchange ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์ค€๋‹ค.

SpringRestDocs๋ฅผ SpringBoot์— ์ ์šฉํ•˜๊ธฐ

API๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” API ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ค URL์— ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ํ•˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋‚ด๋ ค์ฃผ๋Š”์ง€์— ๋Œ€ํ•œ ๊ด€๋ จ ์ •๋ณด๋“ค. ์ด๋Ÿฌํ•œ “API ๋ฌธ์„œ” ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค. API ์ฝ”๋“œ์™€ ํ•ด๋‹น ๋ฌธ์„œ์˜ ๋™๊ธฐํ™”๊ฐ€ ์ž๋™์œผ๋กœ ๋˜์–ด์•ผ ์กฐ๊ธˆ ํŽธํ•ด์งˆ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ถœ์ฒ˜ : https://dribbble.com/shots/3386291-API-Documentation" API ์ฝ”๋“œ์™€ ํ•ด๋‹น ๋ฌธ์„œ์˜ ๋™๊ธฐํ™”๊ฐ€ ์ž๋™์œผ๋กœ ๋˜์–ด์•ผ ์กฐ๊ธˆ ํŽธํ•ด์งˆ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ถœ์ฒ˜ : https://dribbble.com/shots/3386291-API-Documentation ํ•„์ž๋Š” ์ฃผ๋กœ “์œ„ํ‚ค”(๋˜๋Š” ์ผ๋ฐ˜ ๋ฌธ์„œ)๋ฅผ ํ™œ์šฉํ•ด์„œ ์ „๋‹ฌํ•˜๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ API์˜ ํ˜•ํƒœ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์œ„ํ‚ค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ๋งŒ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค. API ์ˆ˜์ •ํ•˜๋ฉด ์œ„ํ‚ค๋„ ์ˆ˜์ •ํ•˜๊ณ . ๊นœ๋ฐ•ํ•˜๊ณ  ์œ„ํ‚ค ์ˆ˜์ •์„ ์•ˆํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์™œ API ๋ช…์„ธ๊ฐ€ ๋‹ค๋ฅด๋ƒ๋Š” ๋ฌธ์˜๊ฐ€… ๊ทธ๋Ÿฌ๋‹ค ์•Œ๊ฒŒ๋œ Spring Rest Docs. (์•„๋ฌด๋ฆฌ ์ข‹์€ ๊ธฐ์ˆ , ์ข‹์€ ํˆด ์ด๋ผ ํ•ด๋„ ์‹ค์ œ๋กœ ๋ณธ์ธ์ด ํ•„์š”๋กœ ํ•˜๊ณ  ์‚ฌ์šฉ์„ ํ•ด์•ผํ•˜๋Š” ์ด์œ ๊ฐ€ ์ƒ๊ธธ๋•Œ ๋น„๋กœ์†Œ ๋น›์„ ๋ฐœํ•˜๋Š”๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด๋‹ค.) ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” swegger ์™€ ๋น„๊ตํ•˜๋Š” ๋‚ด์šฉ์€ ์ œ์™ธํ• ๊นŒ ํ•œ๋‹ค. ์›Œ๋‚™ ์œ ๋ช…ํ•œ ๋‘ ์–‘๋Œ€ ์‚ฐ๋งฅ(?)์ด๋ผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์ž์„ธํžˆ ๋‚˜์™€์žˆ๊ธฐ์—… ์ตœ๊ทผ ๋“ค์–ด TestCode ์˜ ์ค‘์š”์„ฑ์„ ์ ˆ์‹คํ•˜๊ฒŒ ๋Š๋ผ๊ณ  ์žˆ์—ˆ๊ณ , TestCode ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ด๋ฅผ ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•˜๋ฉด, TestCode ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋นŒ๋“œ ์ž์ฒด๊ฐ€ ์•ˆ๋˜๊ธฐ์— ์–ด์ฉ”์ˆ˜ ์—†์ด TestCode๋ฅผ ์„ฑ๊ณต์‹œ์ผœ์•ผ๋งŒ ํ•˜๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ •์ƒ์ ์ธ(์ตœ์‹ ํ™” ๋œ) API ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉํ‘œ๋ฅผ ๋‘๊ณ  ์‹ค๋ฌด์—์„œ ์–ธ์ œ๋“ ์ง€ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์•ฝ๊ฐ„์˜ “๊ฐ€์ด๋“œ” ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. Spring Boot ์ตœ์‹  ๋ฒ„์ „์—์„œ Spring Rest Docs ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ž„์˜์˜ API ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ TestCase ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. Spring.profile ์— ๋”ฐ๋ผ Spring Rest Docs Url ์„ ์ ‘๊ทผ ๊ฐ€๋Šฅ/๋ถˆ๊ฐ€๋Šฅ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋ฌผ๋ก  ํ•„์ž์˜ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅผ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ† ๋Œ€๋กœ ๋ณด๋‹ค ๋” ์šฐ์•„ํ•˜๊ณ  ์•„๋ฆ„๋‹ค์šด ๋ฐฉ๋ฒ•์„ ์•Œ์•„๊ฐˆ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ธฐ๋Œ€๋กœ. Spring Boot ์— Spring Rest Docs ์…‹ํŒ…ํ•˜๊ณ  TestCase ์ž‘์„ฑํ•˜๊ธฐ ์šฐ์„  Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. https://start.spring.io/ ์—์„œ ๋งŒ๋“ค์–ด๋„ ๋˜๊ณ  IDE ์—์„œ ์ œ๊ณตํ•˜๋Š” ํˆด๋กœ ๋งŒ๋“ค์–ด๋„ ๋˜๊ณ . ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์€ ๋ฌด๋ฐฉํ•˜๋‹ค. ๊ทธ ๋‹ค์Œ ํ•„์š”ํ•œ dependency ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค. <dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-mockmvc</artifactId> <scope>test</scope> </dependency> ์ž„์˜๋กœ API๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ชจ๋ธ @Getter @Setter public class Book { private Integer id; private String title; private String author; } ์ปจํŠธ๋กค๋Ÿฌ @RestController public class BookController { @GetMapping("/book/{id}") public Book getABook(@PathVariable Integer id) { Book book = new Book(); book.setId(id); book.setTitle("spring rest docs in spring boot"); book.setAuthor("taetaetae"); return book; } } ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ TestCase ๋ฅผ ์ž‘์„ฑํ•˜์ž. @WebMvcTest(BookController.class) @AutoConfigureRestDocs // (1) public class BookControllerTest { @Autowired private MockMvc mockMvc; // (2) @Test public void test_์ฑ…์„_์กฐํšŒํ•˜๋ฉด_null์ด_์•„๋‹Œ_๊ฐ์ฒด๋ฅผ_๋ฆฌํ„ดํ•œ๋‹ค() throws Exception { mockMvc.perform(get("/book/{id}", 1) .accept(MediaType.APPLICATION_JSON)) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(document("book", // (3) pathParameters( parameterWithName("id").description("book unique id") // (4) ), responseFields( fieldWithPath("id").description("book unique id"), fieldWithPath("title").description("title"), fieldWithPath("author").description("author") ) )) .andExpect(jsonPath("$.id", is(notNullValue()))) // (5) .andExpect(jsonPath("$.title", is(notNullValue()))) .andExpect(jsonPath("$.author", is(notNullValue()))); } } (1) Spring Boot ์—์„œ๋Š” ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์—ฌ๋Ÿฌ์ค„์— ๊ฑธ์ณ ์„ค์ •ํ•ด์•ผ ํ•  Spring Rest Docs ๊ด€๋ จ ์„ค์ •์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (์ฐธ๊ณ ) (2) ๊ณต์‹ ๋„ํ๋จผํŠธ ์—์„œ๋Š” 4๊ฐ€์ง€ ๋ฐฉ์‹์„ ๋งํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด ํฌ์ŠคํŒ… ์—์„œ๋Š” “MockMvc” ์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. (3) “book” ์ด๋ผ๋Š” identifier ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ•ด๋‹น TestCase ๊ฐ€ ์ˆ˜ํ–‰๋ ๋•Œ snippets ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ ํ•ด๋‹น identifier ๋ฌถ์Œ์œผ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค. (4) request์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํ•„๋“œ, response์˜ ํ•„๋“œ์˜ ์„ค๋ช…์„ ์ ์–ด์คŒ์œผ๋กœ์จ ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  snippets ๊ฐ€ ์ƒ์„ฑ์ด ๋˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ API ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค. (5) ํ•„์ž๊ฐ€ ๊ฐ€์žฅ ๋งค๋ ฅ์ ์ด๋ผ ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„. ์ด ๋ถ€๋ถ„์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋™์‹œ์— ํ•จ์œผ๋กœ์จ ์‘๋‹ต์ด ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์‘๋‹ต์ด ๋‚ด๋ ค์˜ฌ ๊ฒฝ์šฐ TestCase๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ๋˜์–ด API๋ฌธ์„œ ๋˜ํ•œ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

Jupyter ์„ค์น˜ํ•˜๊ณ  ์›๊ฒฉ์ ‘์†๊นŒ์ง€ (for ํŒŒ.์•Œ.๋ชป)

ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์–ธ์–ด๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์— ๋น„ํ•ด ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๋ผ ๊ทธ๋Ÿฐ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋”์šฑ์ด ์ฃผ๋ชฉ์„ ๋ฐ›๊ณ  ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ์ •๋ง ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ๋“ค์ด ๋งŽ์•„ ์—ฌ๋Ÿฌ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋˜๊ณ  ์žˆ๊ณ  ํŠนํžˆ ์–ธ์ œ๋ถ€ํ„ฐ์ธ๊ฐ€ ํ•ซ! ํ•ด์ง„ ๋ถ„์•ผ(?)๋ผ ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹์ •๋„์ธ “๋จธ์‹ ๋Ÿฌ๋‹” ๋ถ„์•ผ์—์„œ๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ๋งˆ์นจ ํ•„์ž๊ฐ€ ์†ํ•ด ์žˆ๋Š” ํŒ€ ๋‚ด์— ๋จธ์‹ ๋Ÿฌ๋‹ ์Šคํ„ฐ๋””๊ฐ€ ์‹œ์ž‘์ด ๋˜์—ˆ๊ณ , ๊ทธ์— ํŒŒ์ด์ฌ์„ ์ด์šฉํ•˜์—ฌ ์Šคํ„ฐ๋””๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ. ํ•˜์ง€๋งŒ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋Š” ํŒ€์› ์ ˆ๋ฐ˜ ์ด์ƒ์ด ํŒŒ์ด์ฌ์„ ์ด์šฉํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์—†์—ˆ๊ณ , ์„œ๋กœ ๋ฐฐ์šด๊ฒƒ์„ ๊ณต์œ ๋ฅผ ํ•˜๋ฉด์„œ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฉด ๋” ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๋•Œ ์ฆˆ์Œ. ์–ธ์ œ ์–ด๋””์„ ๊ฐ€ ๋ดค๋˜๊ฒƒ์ด ๋จธ๋ฆฟ์†์„ ์Šค์ณ ์ง€๋‚˜๊ฐ„๋‹ค. ๊ทธ๊ฑด ๋ฐ”๋กœ Jupyter(์ดํ•˜ ์ฃผํ”ผํ„ฐ). ์ถœ์ฒ˜ : https://jupyter.org/" ์ถœ์ฒ˜ : https://jupyter.org/ ์ฃผํ”ผํ„ฐ๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋Œ€ํ™” ํ˜• ์ปดํ“จํŒ…์„์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด, ์˜คํ”ˆ ํ‘œ์ค€ ๋ฐ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ํˆด์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ “์ฃผํ”ผํ„ฐ == ํŒŒ์ด์ฌ ์›น ๊ฐœ๋ฐœํˆด” ์ด๋ผ๊ณ ๋งŒ ์•Œ๊ณ ์žˆ์—ˆ๋Š”๋ฐ ์ข€๋” ์ฐพ์•„๋ณด๋‹ˆ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿผ ์ด๋Ÿฌํ•œ ์ฃผํ”ผํ„ฐ๋ฅผ ํŠน์ • ์„œ๋ฒ„์— ์„ค์น˜ํ•˜๊ณ  ๋กœ์ปฌ์— ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ์›๊ฒฉ์œผ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋”ฉ์„ ํ•ด๋ณด๋ฉด ์ข€๋” ์Šคํ„ฐ๋””์— ๋„์›€์ด ๋˜์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๋งˆ์Œ์ด ๋“ค์—ˆ๋‹ค. ๋˜ํ•œ ํ•™๊ต์—์„œ ์šด๋™์žฅ์— ์ž”๋””๋ฅผ ๊น”์•„์„œ ๋ง˜๊ป ๋›ฐ๋†€์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋Š๋‚Œ์œผ๋กœ ํŒ€์›๋“ค์„ ์œ„ํ•ด ์„ค์น˜๋ฅผ ํ•ด๋‘๊ณ  ์›๊ฒฉ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‘๋ฉด ๋ชจ๋‘๊ฐ€ ํŽธํ•˜๊ณ  ์‰ฝ๊ฒŒ ํŒŒ์ด์ฌ์— ๋Œ€ํ•ด ๊ฒฝํ—˜์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์ฃผํ”ผํ„ฐ๋ฅผ ์„ค์น˜๋ฅผ ํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋ณธ ํฌ์ŠคํŒ…์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํ™˜๊ฒฝ : CentOS 7.4 64Bit, python 2.7 (๊ธฐ๋ณธ) ๋ชฉํ‘œ anaconda ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ธฐ๋ณธ ํŒŒ์ด์ฌ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•œ๋‹ค. ์ฃผํ”ผํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์›๊ฒฉ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ๋ณด๋ฉด ํ•„์ž๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ํŒŒ์ด์ฌ์— ๋Œ€ํ•ด ์ž˜ ์•„๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ์ˆ˜๋„ ์žˆ์–ด ๋ฏธ๋ฆฌ ๋งํ•˜์ง€๋งŒ ํ•„์ž๋Š” ์ฐ ์ž๋ฐ” ๊ฐœ๋ฐœ์ž์ด๋ฉด์„œ ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ ์ˆ˜์ค€์€ ๊ธฐ๋ณธ์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ •๋„์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ด ํฌ์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์žˆ๋Š” ํ•„์ž๊ฐ™์€ ํŒŒ์•Œ๋ชป(?) ๋ถ„๋“ค๋„ ์ถฉ๋ถ„ํžˆ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ตœ๋Œ€ํ•œ ๋”ฐ๋ผํ• ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ์น˜ํŠธํ‚ค ์ˆ˜์ค€์œผ๋กœ ์ž‘์„ฑ ํ•˜๊ณ ์ž ํ•œ๋‹ค.) ์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ (๋ค์œผ๋กœ ์„ค์น˜๋˜๋Š” ์ฃผํ”ผํ„ฐ) ์šฐ์„  ์•„๋‚˜์ฝ˜๋‹ค๋ฅผ ์„ค์น˜ํ•˜์ž. ์•„๋‚˜์ฝ˜๋‹ค๋Š” Anaconda(์ด์ „: Continuum Analytics)๋ผ๋Š” ๊ณณ์—์„œ ๋งŒ๋“  ํŒŒ์ด์ฌ ๋ฐฐํฌํŒ์œผ๋กœ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ฆ‰, ์•„๋‚˜์ฝ˜๋‹ค๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์ด ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ. ์ถœ์ฒ˜ : https://www.anaconda.com/" ์ถœ์ฒ˜ : https://www.anaconda.com/ ๋”๋ถˆ์–ด ์‹œ์Šคํ…œ์— ๊ธฐ๋ณธ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ํŒŒ์ด์ฌ์„ ๊ฑด๋“œ๋ฆฌ๋ฉด ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ์—. ์•„๋‚˜์ฝ˜๋‹ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ด์ฌ 3์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ๋ณด์ž. ์„ค์น˜๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค. ์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๊ณ  ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋. (user ๋ ˆ๋ฒจ์ด root ๋ฉด sudo ๋ช…๋ น์–ด๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.) $ wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh $ sudo bash Anaconda3-2019.10-Linux-x86_64.sh Welcome to Anaconda3 2019.10 In order to continue the installation process, please review the license agreement. Please, press ENTER to continue >>> =================================== Anaconda End User License Agreement =================================== Copyright 2015, Anaconda, Inc. ~~~ ์ค‘๋žต ~~~ Do you accept the license terms? [yes|no] [no] >>> yes # yes!! Anaconda3 will now be installed into this location: /root/anaconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below [/root/anaconda3] >>> /home/anaconda3 # ์„ค์น˜๋  ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ๊ธฐ๋ณธ ์„ค์ •๊ฐ’์— ์„ค์น˜ํ•˜๋ ค๋ฉด ๊ทธ๋ƒฅ ์—”ํ„ฐ ~~~๋ญ๊ฐ€ ์—„์ฒญ ์„ค์น˜๋œ๋‹ค. ๋ฌผ ํ•œ์ž” ๋จน๊ณ  ์˜ค์ž.~~~ installation finished. Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no] [no] >>> yes # yes!! ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์„ค์น˜๋Š” ๋. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์„œ ๊ธฐ๋ณธ ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์„ ์•„๋‚˜์ฝ˜๋‹ค์— ์˜ํ•ด ์„ค์ •๋˜๋„๋ก ๋งž์ถฐ์ฃผ์ž. sudo vi .bashrc __conda_setup="$('/home/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/anaconda3/etc/profile.

์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ์…‹ํŒ…ํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ• ๋•Œ๋ฉด ๊ฐ ์ง๊ตฐ๋ณ„๋กœ ์ƒ๊ฐํ•˜๋Š” ํฌ์ธํŠธ๊ฐ€ ๋‹ค์–‘ํ•˜๋‹ค. ์„ค๊ณ„, ๊ธฐํš, ๋””์ž์ธ, ๊ฐœ๋ฐœ. ์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœ์€ ํ”„๋กœ์ ํŠธ ์…‹ํŒ…์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ง€? ํ•˜๋Š” ๊ณ ๋ฏผ์„ ํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ชจ๋“ˆ์„ ๋‚˜๋ˆ ์„œ ์…‹ํŒ…ํ•˜๋Š”๊ฒŒ ๊ด€๋ฆฌ์ธก๋ฉด์—์„œ ์žฅ์ ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. ๋„์„œ๊ด€์˜ ๋“ค์–ด์˜จ ์ฑ… ์ •๋ณด๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” “API”, ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฑ… ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” “Batch”. ์ด๋ ‡๊ฒŒ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์˜ ๋ชจ๋“ˆ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ ์–ด๋–ค์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ ๋ฉ”์ด๋ธ์„ ํ™œ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ(์ปดํฌ๋„ŒํŠธ)์—์„œ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Spring Multi Module์„ ์…‹ํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ํ•„์ž๋„ ์…‹ํŒ…ํ•˜๊ธฐ ์ „์—๋Š” “๊ทธ๋ƒฅ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹ˆ์•ผ?“๋ผ๋ฉฐ ์šฐ์Šต๊ฒŒ ๋ณด๋‹ค ์•„์ฃผ ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„๋“ค์—์„œ ์—„์ฒญ๋‚œ ์‚ฝ์งˆ์„ ํ•ด์„œ ๊ทธ๋Ÿฐ์ง€ ๊ผญ ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ฒจ๋†”์•ผ ๊ฒ ๋‹ค๊ณ  ๋‹ค์งํ–ˆ๊ณ  ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์„œ ๋‹คํ–‰์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋Š” ํŒ€๋„ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์ด ์•„๋‹๊นŒ? ์ถœ์ฒ˜ : https://bcho.tistory.com/813" ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋Š” ํŒ€๋„ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์ด ์•„๋‹๊นŒ? ์ถœ์ฒ˜ : https://bcho.tistory.com/813 ์™œ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ ์…‹ํŒ…ํ• ๊นŒ? ์œ„์—์„œ ์˜ˆ์‹œ๋กœ ์ด์•ผ๊ธฐ ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ์…‹ํŒ…ํ•ด์•ผํ•  ๋ชจ๋“ˆ์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ์ด๋‹ค. API : ์™ธ๋ถ€์— ๋„์„œ๊ด€์— ๋“ค์–ด์˜จ ์ฑ… ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ชจ๋“ˆ Batch : ์ฃผ๊ธฐ์ ์œผ๋กœ ๋„์„œ๊ด€์˜ ์ฑ… ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ชจ๋“ˆ ํ•œ๋ฒˆ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž. ์œ„์—์„œ ๋งํ•œ ๋ชจ๋“ˆ๋“ค ์ค‘์— ๋™์‹œ์— ์‚ฌ์šฉํ• ๊ฒƒ๋งŒ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค. “์ฑ… ์ •๋ณด”. ๊ฐ ๋ชจ๋“ˆ๋งˆ๋‹ค “์ฑ… ์ •๋ณด"๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š”๊ฒƒ ๋ณด๋‹ค ํ•œ๊ณณ์—์„œ ํ•ด๋‹น๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ž€๊ฑด ์‰ฝ๊ฒŒ ์•Œ์•„์ฐจ๋ฆด์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ• ์ˆ˜ ์žˆ์„๊นŒ? ํ•„์ž์˜ ๊ฒฝํ—˜์œผ๋กœ ๋ฏธ๋ฃจ์–ด ๋ณผ๋•Œ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ jar๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋ฉ”์ด๋ธ ์›๊ฒฉ ์ €์žฅ์†Œ์— deploy, ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์—์„œ ๋””ํŽœ๋˜์‹œ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์—์„œ ๋””ํŽœ๋˜์‹œ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€, ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๋ฒ„์ „์„ ๋ฐ”๊ฟ”์ฃผ๊ณ  (์•ˆ๋ฐ”๊ฟ”๋„ ๋˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์—์„œ ์บ์‹œ ๊ฐฑ์‹ ์„ ํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์ƒ๊ธด๋‹ค.) ๋ฉ”์ด๋ธ ์›๊ฒฉ ์ €์žฅ์†Œ์— deploy๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ์— ๋ฐ˜ํ•ด ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ด๋Ÿฐ๊ณผ์ •์—†์ด ํ•จ๊ป˜ ๋นŒ๋“œ๋งŒ ํ•ด์ฃผ๋ฉด ๋๋‚˜๊ณ  IDE์—์„œ ๊ฐœ๋ฐœ์‹œ ํ•œ ๋ชจ๋“ˆ์—์„œ ๋™์‹œ์— ์ˆ˜์ •๊ณผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๋‹ค. ์€์ด์•Œ์€ ์—†๋‹ค ๋ผ๋Š” ๋ง์ฒ˜๋Ÿผ, ์ •๋‹ต์€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ์ €๋Ÿฐ ๋ฐฉ๋ฒ•๋“ค์„ ๋ฏธ๋ฆฌ ์•Œ์•„๋‘๋ฉด ์ ์‹œ์ ์†Œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”. ํ•„์ž๊ฐ€ ๋‹ค๋ฅธ๊ธ€๋“ค์—์„œ๋„ ์–ธ๊ธ‰์„ ์ž์ฃผํ•˜๋˜ “๋‚˜๋งŒ์˜ ๋ฌด๊ธฐ"๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ? ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ์…‹ํŒ…ํ•˜๊ธฐ ์œ„์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋˜ “API”, “Batch"์™€๋Š” ๋ณ„๋„๋กœ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์ธ “Core” ์ด๋ ‡๊ฒŒ ์ด 3๊ฐœ์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์˜ˆ์ •์ด๋‹ค. ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ง€๋งŒ, ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ “๊ฐ™์•„์„œ” ๋ฏธ๋ฆฌ ๊ณตํ†ต๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์€ ์ข‹์ง€ ์•Š๋Š”๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋ฉด ์“ธ๋ฐ์—†์ด ๊ณตํ†ต๋กœ์ง์ด ๋ฌด๊ฑฐ์›Œ์ง€๋ฏ€๋กœ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ค‘๋ณต์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ๊ทธ๋•Œ ๊ณตํ†ต๋กœ์ง์œผ๋กœ ๋ฆฌํŽ™ํ† ๋ง ํ•ด๋„ ๋Šฆ์ง€ ์•Š๋Š”๊ฒƒ ๊ฐ™๋‹ค. (๊ผฐ๋ฐ์ธ๊ฐ€…) ๊ตฌํ˜„ํ•˜๋Š” ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Spring Boot 2.2.3 Maven IntelliJ ์šฐ์„  IDE์˜ ํž˜์„ ๋นŒ๋ ค ํ•˜๋‚˜์˜ ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณธ๋‹ค. ๋‹ค์Œ > ๋‹ค์Œ > ๋‹ค์Œ" ๋‹ค์Œ > ๋‹ค์Œ > ๋‹ค์Œ ๊ทธ ๋‹ค์Œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์šฐํด๋ฆญ ํ›„ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์„ ์„ ํƒ. Maven ๋ชจ๋“ˆ์„ ์„ ํƒํ•˜๊ณ  ์ ๋‹นํ•œ ์ด๋ฆ„์„ ์ ์–ด์ค€๋‹ค. ๋‹ค์Œ > ๋‹ค์Œ > ๋‹ค์Œ 222" ๋‹ค์Œ > ๋‹ค์Œ > ๋‹ค์Œ 222 “API”, “Batch”, “Core” ๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ค์ œ ๋ชจ๋“ˆ์ด ๋˜๋Š” “API”, “Batch"์— Build plugin ์„ ์…‹ํŒ…ํ•ด์ฃผ์ž. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ๊ฐ Pom.xml์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (“API” ๋ชจ๋“ˆ์— ๋Œ€ํ•ด์„œ๋งŒ ์ง‘์ค‘์ ์œผ๋กœ ์ด์•ผ๊ธฐ ํ•˜๋ ค ํ•œ๋‹ค. “Batch” ๋ชจ๋“ˆ๋„ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ.) ์ตœ ์ƒ์œ„ Pom.xml (library) modules ํ•˜์œ„์— ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ ์„ค์ •ํ•œ ๋ชจ๋“ˆ๋“ค์˜ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>api</module> <module>core</module> <module>batch</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.taetaetae</groupId> <artifactId>library</artifactId> <version>0.0.1-SNAPSHOT</version> <name>library</name> <description>Demo project for Spring Boot</description> <properties> <java.

์กฐ๊ธˆ์€ ๋ฌด๊ฑฐ์šด 2019 ํšŒ๊ณ 

“ํšŒ๊ณ "๋Š” ๋น„๋‹จ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ ๊ณผ์ •์˜ ๋งˆ์ง€๋ง‰์—๋Š” ๊ผญ ํ•ด์•ผํ•  ์ค‘์š”ํ•œ ์‹œ๊ฐ„์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์•ž๋งŒ๋ณด๊ณ  ๋‹ฌ๋ ค๊ฐ€์ž! ๋‹ฅ๊ณต! ๋ผ๋Š” ๋ง์ด ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ์ด ๋ง์ด ์„ฑ๋ฆฝ๋˜๊ธฐ ์œ„ํ•ด์„  ์ง€๋‚œ ๊ณผ๊ฑฐ์— ๋Œ€ํ•œ ์ •๋ฆฌ์™€ ๋ฐ˜์„ฑ ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์–ด๋–ค ์ด์œ ๋กœ ๋ชปํ–ˆ๋Š”์ง€์™€ ๊ทธ ๋™์•ˆ์˜ ๋‚˜ ์ž์‹ ์„ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ด “ํšŒ๊ณ ” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ๋ฒŒ์จ 2019๋…„๋„ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋˜์–ด๊ฐ„๋‹ค. ์ž‘๋…„๋ณด๋‹ค ๋” ์ •์‹ ์—†์ด ๋‹ฌ๋ ค์˜จ ์˜ฌํ•ด. ๋‚ด๋…„์—” ์˜ฌํ•ด๋ณด๋‹ค ๋” ๋ฉ‹์ง€๊ณ  ํž˜์ฐจ๊ฒŒ ์ถœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ž์˜ ํ•œ ํ•ด๋ฅผ ๋Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํšŒ๊ณ ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ์ข‹์„๊นŒ? ๋ฌด์ž‘์ • ํƒ€์ž„๋ผ์ธ ๊ธฐ๋ฐ˜์œผ๋กœ 1์›”์—” ๋ญํ–ˆ๊ณ  2์›”์—” ๋ญํ–ˆ๊ณ … ์ด ๋ฐฉ๋ฒ•์ด ํ‹€๋ฆฐ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ํƒ€์ž„๋ผ์ธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•œ ๋’ค ํ‚ค์›Œ๋“œ๋ณ„๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋งž์„๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด๋‹ค. ๋ฌด์—‡์„ ํ–ˆ๊ณ , ๋ญ๊ฐ€ ์ข‹์•˜๊ณ  ์–ด๋–ค๊ฑด ์•„์‰ฌ์› ๊ณ . ๊ทธ๋ž˜์„œ ๋‚ด๋…„์—” ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ด๊ณ . ๊ฐ์ž์˜ ํšŒ๊ณ  ๋ฐฉ์‹์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ํšŒ๊ณ ๋ฅผ ํ•˜๋Š” ์ด์œ , ๊ทธ๋ฆฌ๊ณ  ํšŒ๊ณ ๋ผ๋Š” ๋ชฉํ‘œ ์ค‘์— ๊ณตํ†ต์ ์€ “๋’ค๋ฅผ ๋Œ์•„๋ณด๊ณ , ์•ž์„ ๋ณด๊ธฐ์œ„ํ•œ ํž˜์„ ์ฐพ๋Š”๊ฒƒ” ์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค. ๋‚ด๋…„ ํšŒ๊ณ ๋ฅผ ํ• ๋•Œ๋Š” ํ‘๋ฐฑ์ด ์•„๋‹Œ ์ปฌ๋Ÿฌ ์‚ฌ์ง„์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ถ„์œ„๊ธฐ๊ฐ€ ๋ ๊นŒ?… ์ถœ์ฒ˜ : http://www.nanum.com/site/poet_walk/820914" ๋‚ด๋…„ ํšŒ๊ณ ๋ฅผ ํ• ๋•Œ๋Š” ํ‘๋ฐฑ์ด ์•„๋‹Œ ์ปฌ๋Ÿฌ ์‚ฌ์ง„์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ถ„์œ„๊ธฐ๊ฐ€ ๋ ๊นŒ?… ์ถœ์ฒ˜ : http://www.nanum.com/site/poet_walk/820914 ํšŒ์‚ฌ๋Š” ์„ฑ์žฅ์˜ ๊ณต๊ฐ„์ด ์•„๋‹Œ๊ฒƒ์„ ๊นจ๋‹ณ๋Š” ์ˆœ๊ฐ„. (์ด์•ผ๊ธฐ์— ์•ž์„œ ํ•„์ž๋Š” ํ˜„์žฌ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ž์ž„์„ ๋ฐํžŒ๋‹ค.) ๋‚ด๋…„์ด ๋˜๋ฉด ์ปดํ“จํ„ฐ์Ÿ์ด๊ฐ€ ๋œ์ง€ ๋ฒŒ์จ 8๋…„์ฐจ. ๋งค๋…„ ์„ฑ์žฅ์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์ž‘๋…„๊นŒ์ง€๋งŒ ํ•ด๋„ ์šฐ์ƒํ–ฅ์ด์—ˆ๋‹ค. (๊ทธ๋ž˜ํ”„์˜ ๊ธฐ์šธ๊ธฐ๋Š” ๋งค๋…„ ๋‹ฌ๋ž์ง€๋งŒ) ํ—ˆ๋‚˜ ์˜ฌํ•ด๋Š” ๊ธฐ์šธ๊ธฐ๊ฐ€ 0 ์ด๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด๋‹ค. ์™œ์ผ๊นŒ. ํ‚ค๋Š” ์™œ ๋”์ด์ƒ ์„ฑ์žฅ์„ ์•ˆํ• ๊นŒ? (์“ฐ์…) ์ถœ์ฒ˜ : http://www.guro1318.or.kr/bbs/board.php?bo_table=data&wr_id=1723" ํ‚ค๋Š” ์™œ ๋”์ด์ƒ ์„ฑ์žฅ์„ ์•ˆํ• ๊นŒ? (์“ฐ์…) ์ถœ์ฒ˜ : http://www.guro1318.or.kr/bbs/board.php?bo_table=data&wr_id=1723 ํšŒ์‚ฌ๋ฅผ ๋‹ค๋‹ˆ๋‹ค ๋ณด๋ฉด ์•„์ฃผ ์ผ๋ฐ˜์ ์œผ๋กœ “์‹œํ‚ค๋Š” ์ผ"์„ ํ•˜๊ณค ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ์—…๋ฌด๋ฅผ ์ •ํ•ด์ง„ ๊ธฐ๊ฐ„ ์•ˆ์— ์ŠคํŽ™์— ๋งž์ถฐ ๊ฐœ๋ฐœํ•˜๋Š”. ์•„์ฃผ ๊ทน๋‹จ์ ์œผ๋กœ ๋‚˜์˜๊ฒŒ ๋งํ•˜๋ฉด “๋„๊ตฌ"๋กœ ์ „๋ฝ๋˜์–ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๊ฐ„๋“ค. (๊ฐœ๋ฐœ์ž๊ฐ€ ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค๋Š” ๋ง์€ ๋„ˆ๋ฌด๋‚˜๋„ ๋“ฃ๊ธฐ ์‹ซ์€ ๋ง์ค‘์— ํ•˜๋‚˜.) ํ”ํžˆ ๋งํ•˜๋Š” CRUD(Create, Read, Update, Delete) ์„ฑ์˜ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ํ•˜๊ณค ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ผญ ์„ฑ๊ณผ์— align(๋” ์ข‹์€ ํ•œ๊ตญ๋ง์„ ์ฐพ๊ณ  ์‹ถ์€๋ฐ…) ํ•˜๋Š” ์ผ ๋ง๊ณ ๋„ ํ—ˆ๋“œ๋ ›์ผ(์ผ์ข…์˜ ์„œ์Šคํ…Œ์ด๋‹?)์„ ํ•  ๊ฒฝ์šฐ๋„ ์žˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋งŒ์•ฝ ์žฌ๋ฏธ์—†๋Š” ์ผ์ด๋ผ๋ฉด ์–ด๋–จ๊นŒ? ํ•„์ž๋Š” ๊ทธ๋ ‡๊ฒŒ “์‹œํ‚ค๋Š” ์ผ๋งŒ ํ•˜๋ฉฐ ์žฌ๋ฏธ์—†๋Š” ํšŒ์‚ฌ์ƒํ™œ” ๋ณด๋‹ค “์žฌ๋ฏธ์žˆ๊ฒŒ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์„ฑ์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์‚ฌ์ƒํ™œ” ์ด๋ผ๋Š” ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ํ•œ ํ•ด๋ฅผ ์ง€๋‚ด์˜จ ๊ฒƒ ๊ฐ™๋‹ค. ์ฆ‰, “์‹œํ‚ค๋Š” ์ผ"์ด ์•„๋‹Œ “์‹œํ‚ค์ง€๋„ ์•Š์€ ์ผ"์„ ์ฐพ์•„์„œ ํ•ด๊ฐ€๋ฉฐ. ์˜ˆ์ปจ๋Œ€, ์ฒ˜์Œ์— ์žก์•˜๋˜ ์„œ๋น„์Šค ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๊ณ  ์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŽ์•„์ง์— ๋”ฐ๋ผ ๋ณต์žกํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ €ํ•ดํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ฏธ๋ฆฌ ๊ตฌ์กฐ๊ฐœ์„ ์„ ํ†ตํ•ด ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์ด๋ผ๋Š” ๋‘๋งˆ๋ฆฌ์˜ ํ† ๋ผ๋ฅผ ์žก๋Š”๋‹ค๊ฑฐ๋‚˜. ์ง€๋‚œ ์™ธ๋ถ€ ์„ธ๋ฏธ๋‚˜์—์„œ ๋“ฃ๊ณ  ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์–ด ํŒ€๋‚ด์—๋„ ์ ์šฉํ•ด๋ณธ ๋ฐฐ์น˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๊ธฐ๋Šฅ. ํŒ€ ๋‚ด ์ฝ”๋“œ๋ฆฌ๋ทฐ์˜ ํ™œ์„ฑํ™”์™€ ์ˆ˜๋™์œผ๋กœ ํ•ด์•ผํ•  ์—…๋ฌด๋“ค์„ ๋ฉ”์‹ ์ € ๋ด‡์„ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ํ™” ํ•œ๋‹ค๊ฑฐ๋‚˜. ์„œ๋น„์Šค ์ง€ํ‘œ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค์–ด ํ•œ๋ˆˆ์— ์„œ๋น„์Šค ์ƒํ™ฉ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ„๋„์˜ ๊ฐœ๋ฐœ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋Š” ๋“ฑ. ๋‹ค์–‘ํ•œ ์—…๋ฌด ๋‚ด/์™ธ ์ ์œผ๋กœ ์ผ์„ ์ฐพ์•„๊ฐ€๋ฉฐ + ํ•„์ž์˜ ๊ฐœ์ธ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด ๊ฐ€๋ฉด์„œ ์ •๋ง ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ณด๋‚ด์˜จ ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ๋’ค๋ฅผ ๋Œ์•„๋ณด๋ฉด “์„ฑ์žฅ ํ–ˆ๋Š”๊ฐ€?” ๋ผ๋Š” ์งˆ๋ฌธ์ด ์žˆ๋‹ค๋ฉด “๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ ์žˆ๋Š”๊ฒƒ ๊ฐ™์•„์„œ ์‹ ๋‚˜๊ฒŒ ํ•ด์™”๋Š”๋ฐ ๋Œ์•„๋ณด๋‹ˆ ๋ง‰์ƒ ๋ญ˜ํ–ˆ๋‚˜ ํ•˜๋Š” ๋Š๋‚Œ์ด ๋“ ๋‹ค” ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋งŽ์ด ํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ “๊ฒฝํ—˜"์„ ์–ป๊ธด ํ–ˆ์ง€๋งŒ ์‹ค์งˆ์ ์ธ “์„ฑ์žฅ"์€ ์•„์‰ฝ์ง€๋งŒ ๋ถ€์กฑํ•œ ํ•œ ํ•ด ์˜€๋˜๊ฒƒ ๊ฐ™๋‹ค. ํšŒ์‚ฌ๊ฐ€ ์›ํ•˜๋Š”, ์—ฐ์ฐจ์— ๋งž๋Š” ์—…๋ฌด ์—ญ๋Ÿ‰๊ณผ ๊ฐœ๋ฐœ ํŒ€์—์„œ์˜ ์œ„์น˜๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ์—” ํšŒ์‚ฌ ์•ˆ์—์„œ ์„ฑ์žฅํ•˜๊ธฐ์—” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จ์ด ๋“ค์—ˆ๋‹ค. (์ด ์ƒ๊ฐ์ด ์™œ ์ด์ œ์„œ์•ผ ๋“ค์—ˆ์„๊นŒ.) ์˜คํ”ˆ์†Œ์Šค๋‚˜ ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ํšŒ์‚ฌ ๋ฐ–์—์„œ ํ˜ผ์ž์„œ ๊ณต๋ถ€ ํ•˜๋˜์ง€ ์—ฌ๋Ÿฌ๋ช…์ด์„œ ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด ์Šต๋“์„ ํ•ด์•ผํ•˜๊ณ  ํ† ์ดํ”„๋กœ์ ํŠธ ๋˜ํ•œ ํšŒ์‚ฌ์™€ ๋ณ„๋„๋กœ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ์Šคํ‚ฌ์„ ๋Š˜๋ ค์•ผ ํ• ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ์ด์œ ๋Š” ํšŒ์‚ฌ์—์„œ์˜ ์„ฑ์žฅ์ด ๊ฒฐ๊ตญ ๋‚˜์˜ ์„ฑ๊ณผ๋กœ ์žกํž ์ˆ˜๋Š” ์—†๋Š”๋ฐ ๊ดœ์‹œ๋ฆฌ ๊ธฐ๋Œ€๋ฅผ ํ•˜๊ฒŒ ๋˜๊ธฐ๋„ ํ•˜๊ณ  ํŠนํžˆ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š” ํŒ€์—์„œ๋Š” ์š”์ฆ˜ ํ•ซ ํ•˜๋‹ค๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‚˜ ์†”๋ฃจ์…˜์„ ๋„์ž…ํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐœ๋ฐœํ•˜๊ธฐ ๋ฐ”์œ๋ฐ ๊ธ€๊นŒ์ง€ ์“ฐ๋ผ๊ณ ? (๊ธ€์“ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž.)

์‹ ์ž…์‹œ์ ˆ. ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ๋„ ํšŒ์‚ฌ ์—…๋ฌด๋„ ๋งŽ์•„ ํ—ˆ์šฐ์ ๋Œ€๋˜ ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฃจ์— 3~4์‹œ๊ฐ„ ์ž๋ฉฐ ์ •์‹ ์—†์ด ํ•˜๋ฃจ๋ฅผ ๋ณด๋‚ด๋˜ ๋‚  ๋ฌธ๋“ ๋™๊ธฐ ํ˜•์ด “๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ํ•ด์•ผ ๋ผ!“๋ผ๋Š” ์ „ํ˜€ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜๋Š” ๋ง์„ ํ•ด์˜จ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ”๋น  ์ฃฝ๊ฒ ๋Š”๋ฐ ๋ธ”๋กœ๊ทธ์— ๊ธ€๊นŒ์ง€ ์“ฐ๋ผ๊ณ ? ๋ง์ด ๋˜๋Š” ์†Œ๋ฆด ํ•˜๋ผ๋ฉฐ ๋ฐ˜๋ฐ•ํ•˜๋‹ค ๋ชป๋‚ด ์ด๊ธฐ๋Š” ์ฒ™ ํ•˜๋‚˜ ๋‘˜ ๊ธ€์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ๋‹ค๋ฅธ ์œ ๋ช… ๋ธ”๋กœ๊ฑฐ์ฒ˜๋Ÿผ ์—„์ฒญ๋‚˜์ง„ ์•Š์ง€๋งŒ ํ•˜๋ฃจ์— 1,000~2,000๋ช… ์ •๋„ ๋“ค์–ด์˜ค๋ฉฐ ์ ์  ์„ฑ์žฅํ•ด ๊ฐ€๋Š” ๋‚˜๋งŒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๊ฐ€ ๋˜์—ˆ๋‹ค. ๋ฏธ์•ฝํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ณด๋‹ค๋Š” ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ธ”๋กœ๊ทธ PV(Page View)" ๋ฏธ์•ฝํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ณด๋‹ค๋Š” ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ธ”๋กœ๊ทธ PV(Page View) ๋˜ํ•œ ํ•„์ž์˜ ๊ฐœ๋ฐœ์ž ๊ฒฝ๋ ฅ(?)์„ ๋Œ์ด์ผœ ๋ณด์ž๋ฉด ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ํ•˜๊ธฐ ์ „๊ณผ ํ•˜๊ณ  ๋‚œ ํ›„๋กœ ๋‚˜๋‰  ๋งŒํผ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์—„์ฒญ๋‚œ ์˜ํ–ฅ๋ ฅ์ด ๋˜์—ˆ๋‹ค. ์ด ๊ธฐํšŒ๋ฅผ ๋นŒ์–ด ๋™๊ธฐ ํ˜•์—๊ฒŒ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์ „ํ•˜๊ณ  ์‹ถ๋‹ค. ํ˜•. ๋ณด๊ณ  ์žˆ์ฃ ? ;] ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ๊ผญ “๋ธ”๋กœ๊ทธ๋ฅผ ํ•˜์ž” ๋ผ๊ธฐ ๋ณด๋‹ค “๊ธ€์„ ์™œ ์จ์•ผ ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์จ์•ผ ํ•˜๋Š”์ง€"์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ฒ˜์Œ ์ด ๊ธ€์„ ์“ฐ๋ ค๊ณ  ๋งˆ์Œ๋จน์—ˆ์„ ๋• ๊ฐœ๋ฐœ์ž๋ผ๋Š” ์ง๊ตฐ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ ์šฉ๋  ์ •๋„์˜ ๋ฒ”์šฉ์ ์ธ ๊ธ€์„ ์“ฐ๋ ค ํ–ˆ์œผ๋‚˜ “S"์˜ ์กฐ์–ธ์œผ๋กœ ๋…์ž(ํƒ€๊นƒ)์„ ์ตœ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์— ๋งž์ถฐ ์จ๋ณด๊ณ ์ž ํ•œ๋‹ค. thanks to “S” ์‚ฌ์‹ค ์กฐ๊ธˆ๋งŒ ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋ฉด ํŠนํžˆ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ธ€์“ฐ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๋‹ค์–‘ํ•œ ๊ธ€๋“ค์—์„œ “๊ฐœ๋ฐœ์ž๊ฐ€ ์™œ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๊ฐ€"์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์–ธ๊ธ‰์ด ๋˜๊ณค ํ–ˆ์—ˆ๋‹ค. ๊ธ€์„ ์“ฐ์ง€ ์•Š๋˜ ๊ฐœ๋ฐœ์ž. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๊ธ€์“ฐ๊ธฐ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๋ผ๋ฉฐ ์ ์–ด๋„ 2์ฃผ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ธ€์„ ์“ฐ๋ ค๋Š” ํ˜„์—… ๊ฐœ๋ฐœ์ž์˜ ์‹œ์„ ์—์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ ๋ฉ˜ํ† ๋ง ํ•ด์ฃผ๊ณ  ์žˆ๋Š” ๋ถ„๊ป˜๋„ ๊ธ€ ์“ฐ๋Š”๊ฒƒ์— ๋Œ€ํ•œ ์ค‘์š”์„ฑ์„ ์•Œ๋ ค์ฃผ๊ณ  ์‹ถ์—ˆ๊ณ , ํŒ€ ๋‚ด์—๋„ ๊ณต์œ ๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด ๊ฒธ์‚ฌ๊ฒธ์‚ฌ. ์™œ ๊ธ€์„ ์จ์•ผ ํ• ๊นŒ? ๋น„๋กœ์†Œ ๋‚ด ๊ฒƒ์ด ๋˜๊ธฐ ์œ„ํ•œ ๊ณผ์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ๋•Œ ๊ผญ ๋งŒ๋‚˜๋Š” ๋ฌธ๊ตฌ Hello World๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค. ์ด๊ฒŒ ์˜๋ฏธํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? ์ •๋ง ์ƒˆ๋กœ์šด ์„ธ๊ณ„๋ฅผ ์•Œ๋ ค์ฃผ๋ ค ํ•˜๋Š” ๊ฒƒ ์ผ๊นŒ?(๊ทธ๋Ÿด์ˆ˜๋„ ์žˆ๋‹ค…) ์šฐ๋ฆฌ๊ฐ€ ์‚ด์•„๊ฐ€๋ฉฐ “๋ฐฐ์›€"์ด๋ผ๋Š” ๊ณผ์ •์€ ๋Œ€๋ถ€๋ถ„ ๋น„์Šทํ•˜๊ฒ ์ง€๋งŒ ํŠนํžˆ IT ๊ธฐ์ˆ ์€ ์ฑ…์„ ๋‹ค ์ฝ์—ˆ๋‹ค๋“ ์ง€, ๋™์˜์ƒ ๊ฐ•์˜๋ฅผ ๋‹ค ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋‚ด ๊ฒƒ์ด ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค. ์ง์ ‘ ํ‚ค๋ณด๋“œ๋ฅผ ๋‘๋“œ๋ ค ๊ฐ€๋ฉฐ ๊ฑฐ๊ธฐ์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ “์ธ์‚ฌ์ดํŠธ” ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค๋ฅธ ์˜ˆ๋กœ, ์šด์˜ํ•˜๋˜ ์‹œ์Šคํ…œ์ด๋‚˜ ์„œ๋น„์Šค์—์„œ ์žฅ์• ๋ฅผ ๋งž์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋Š˜ ๊ทธ๋ž˜์™”๋“ฏ ์–ด๋–ป๊ฒŒ๋“  ์žฅ์• ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๋ถ„๋ช… “๋ฌธ์ œ์˜ ์›์ธ"์ด ์žˆ์—ˆ์„ ํ…Œ๊ณ  “ํ•ด๊ฒฐ ๊ณผ์ •"์ด ์žˆ๊ธฐ ๋งˆ๋ จ์ธ๋ฐ ์ด๊ณณ์—์„œ๋„ “์ธ์‚ฌ์ดํŠธ"๊ฐ€ ๋ถ„๋ช… ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ “์ธ์‚ฌ์ดํŠธ"๋ฅผ ๊ธ€๋กœ ์ ๋‹ค ๋ณด๋ฉด ๊ทธ๋ƒฅ “์•„~ ๊ทธ๋ ‡๊ตฌ๋‚˜, ๊ทธ๋žฌ์—ˆ์ง€” ํ•˜๋Š” ๋จธ๋ฆฟ์†์—์„œ์˜ ๊ธฐ์–ต๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋” ์˜ค๋ž˜ ๋‚จ์„ ๊ฒƒ์ด๊ณ  ํ˜น์—ฌ ๊ธ€์—์„œ ์ •๋ฆฌ๋ฅผ ์ž˜๋ชปํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ๋”ํ•  ๋‚˜์œ„ ์—†์ด ์ข‹์€ ํšจ๊ณผ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋œ๋‹ค. (์ด๊ฒƒ์ด ๋ฐ”๋กœ ๊ณต์œ ์˜ ํž˜!) ๋”๋ถˆ์–ด ๊ธ€์„ ์“ธ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ์ •๋ณด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์“ฐ๋Š” ์Šต๊ด€์ด ์ค‘์š”ํ•œ๋ฐ ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์›๋ž˜ ์“ฐ๋ ค๊ณ  ํ–ˆ๋˜ ๋‚ด์šฉ๋ณด๋‹ค ๋” ๊นŠ๊ฒŒ ์•Œ์•„๊ฐ€๋Š” ๊ณผ์ • ์†์—์„œ ๋˜ ๋‹ค๋ฅธ ๋ฐฐ์›€์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๊ฐ•์ œ์  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ˆ„๊ฐ€ ์‹œํ‚ค์ง€ ์•Š์•˜์–ด๋„ ๋ฐฐ์šด ๊ฒƒ์— ๋Œ€ํ•œ ํ™œ์šฉ์„ ํ•˜๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค๊ณ  ์ด๋ฅผ ๋˜ ๊ธ€๋กœ ์“ฐ๊ณ . ๊ธ์ •์ ์ธ ์ˆœํ™˜ ์†์— ์ƒ๊ฒจ๋‚˜๋Š” ์ž‘์€ ๋ฐœ์ž๊ตญ์ผ์ง€๋ผ๋„ ์„ฑ์žฅํ•ด๊ฐ€๋Š” ์ž์‹ ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ชธ์ด ๊ธฐ์–ตํ•˜๋Š” ์ •๋ฆฌํ•˜๋Š” ์Šต๊ด€ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ •๋ง ๊ฐ„๋‹จํ•œ “CRUD”(Create, Read, Update, Delete) ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ์ง€์‹์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋ฉด ๋จธ๋ฆฟ์†์œผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ทธ๋ฆผ์ด๋‚˜ ๊ธ€์„ ์จ๊ฐ€๋ฉด์„œ ์ •๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š” ๊ฑด ๊ตณ์ด ๋งํ•˜์ง€ ์•Š์•„๋„ ์•„๋Š” ์‚ฌ์‹ค. ๊ธ€์„ ์“ฐ๋‹ค ๋ณด๋ฉด ๊ธฐ์Šน์ „๊ฒฐ์˜ ์ •๋ฆฌ ๋ฐฉ๋ฒ•๊ณผ ๋ชฉ์ ์ด ๋ฌด์—‡์ด๊ณ  ๊ทผ๊ฑฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๊ตฌ๋ถ„ํ•˜๋Š” ์Šคํ‚ฌ์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.(์ ์–ด๋„ ํ•„์ž๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜๋Š” ์Šคํ‚ฌ์ด ๊ทธ์ „๋ณด๋‹ค ์—„์ฒญ๋‚˜๊ฒŒ ๋Š˜์–ด๋‚ฌ๋‹ค๊ณ  ์ž๋ถ€ํ•œ๋‹ค.) ์ค‘๊ตญ ์†๋‹ด์ค‘์— ํ•˜๋‚˜, ๋จธ๋ฆฟ์†์— ๋ฐ•ํ˜€ ๋‚˜์˜ค์งˆ ์•Š๋Š”๋‹ค.

๋”์ด์ƒ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฐฐ์น˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

์ง€๋‚œ ํฌ์ŠคํŒ…, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค์—์„œ ์ดˆ๋Œ€๋ฅผ ๋ฐ›์•„ Spring batch ์— ๋Œ€ํ•œ ํ…Œํฌ์„ธ๋ฏธ๋‚˜์— ๋‹ค๋…€ ์™”๋‹ค. ๊ทธ ์ค‘ ๊ฐ€์žฅ ์ธ์ƒ๊นŠ์—ˆ๋˜ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ. ์ฐจ์ผํ”ผ์ผ ๋ฏธ๋ฃจ๋‹ค ํ•„์ž๊ฐ€ ์†ํ•œ ํŒ€์—์„œ๋„ ๋ฐฐํฌ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ ๋ถˆํŽธ์„ ๋Š๋ผ๊ณ  ์žˆ์—ˆ๋˜ ๋ถ€๋ถ„์ด์—ˆ๊ธฐ๋„ ํ–ˆ๊ณ , ๊ทธ๋Ÿฐ๊ฐ€๋ณด๋‹ค ํ•˜๋ฉฐ ๊ฐœ๋…๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ์—” ๋ฌด์–ธ๊ฐ€ ์–‘์‹ฌ์— ์ฐ”๋ ค ์ง์ ‘ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ์„ ํ•ด๋ณด๊ณ  ํ…Œ์ŠคํŠธ๊นŒ์ง€ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ƒํ™ฉ ๋ฐ ๋ฌธ์ œ์  ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์— Jenkins๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ณ , Spring batch ๋ชจ๋“ˆ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์žˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰์„ ํ•˜๊ฑฐ๋‚˜, Jenkins RestApi๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ๋กœ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ์ฆ‰, ์Šค์ผ€์ฅด๋ง์— ์˜ํ•ด ์‹คํ–‰๋˜๊ณค ํ•œ๋‹ค. ์Šค์ผ€์ฅด๋ง์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋Š” 1๋ถ„๋‹จ์œ„ ๋ฐฐ์น˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 24์‹œ๊ฐ„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฌด๋ฐฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์น˜ ๋ชจ๋“ˆ์ด ์ˆ˜์ •๋˜๊ณ , ๋ฐฐํฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ง„ํ–‰์ด ๋œ๋‹ค. Jenkins ์„ค์ •์˜ ๋„๊ธฐ์ „ ์ค€๋น„ ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋”์ด์ƒ Jenkins์— ์˜ํ•ด Spring batch ๋ชจ๋“ˆ(์ดํ•˜ Job)์ด ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ์ƒˆ๋กœ์šด Job์€ ๋”์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฏธ ์‹คํ–‰์ค‘์ด์˜€๋˜ Job ์€ ๊ฐ•์ œ๋กœ ์ค‘๋‹จ์„ ํ•˜๊ฑฐ๋‚˜ Job ์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์‹คํ–‰์ค‘์ธ Job์ด ์—†์„ ๊ฒฝ์šฐ ์ด์ œ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Jenkins ์„ค์ •์˜ ๋„๊ธฐ์ „ ์ค€๋น„๋ฅผ ํ•ด์ œํ•œ๋‹ค. ์‹คํ–‰์ค‘์ธ Job์ด ์•ˆ๋๋‚˜๋ฉด ๋งˆ๋ƒฅ ๊ธฐ๋‹ค๋ฆดํ…๊ฐ€? ์ถœ์ฒ˜ : https://m.post.naver.com/viewer/postView.nhn?volumeNo=14100660&memberNo=2032633" ์‹คํ–‰์ค‘์ธ Job์ด ์•ˆ๋๋‚˜๋ฉด ๋งˆ๋ƒฅ ๊ธฐ๋‹ค๋ฆดํ…๊ฐ€? ์ถœ์ฒ˜ : https://m.post.naver.com/viewer/postView.nhn?volumeNo=14100660&memberNo=2032633 ์‹คํ–‰๋˜๋Š” Job์„ ์ค‘๋‹จํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ ์ฆ‰, ์‹คํ–‰์ค‘์— ์ค‘๋‹จํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ๊นจ์ ธ ๋ฌด์กฐ๊ฑด ๊ธฐ๋‹ค๋ ค์•ผ๋งŒ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ๋ฐฐํฌ ๋˜ํ•œ ๊ณ„์† ์ง€์—ฐ๋  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ์ƒํ™ฉ์ธ ๊ฒƒ์ด๋‹ค. Spring boot์— java config ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋”ฑ jar ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด jarํŒŒ์ผ์„ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๋Š” ์‹์œผ๋กœ ๊ณ ๋ฏผ์„ ํ•ด๋ณผ์ˆ˜๋„ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ Legacy ์ฝ”๋“œ๊ฐ€ ์•„์ง ์กด์žฌํ•˜์—ฌ ์ผ๋ฐ˜ Spring ์— xml ๋กœ config ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜์ค‘์ด๋ผ jarํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ. ์€์ด์•Œ์ฒ˜๋Ÿผ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋งŒ๋ณ‘ํ†ต์น˜์•ฝ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ์–ธ์ œ๋‚˜ ๊ทธ๋žฌ๋“ฏ ํ˜„์žฌ ์‹œ์Šคํ…œ(xml config ๋ฐฉ์‹)์— ๊ฐ€์žฅ ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  java config ๋ฐฉ์‹์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ• ๊ฒƒ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด์•˜๋‹ค. ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” 3๊ฐ€์ง€ ํ•ต์‹ฌ 1. ๋ฐฐํฌ๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ์— ๋ฐฐํฌํ•œ๋‹ค. ๊ฐ ํšŒ์‚ฌ๋งˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค๋งˆ๋‹ค ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฐฐํฌ ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ณตํ†ต์ ์€ ์›๊ฒฉ์„œ๋ฒ„์˜ ํŠน์ • ๊ฒฝ๋กœ์— ๋นŒ๋“œ๋œ ํŒŒ์ผ๋“ค์„ ๋ฐ€์–ด ๋„ฃ์–ด์ค€๋‹ค๋Š” ๊ฒƒ. ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฐฐํฌํ• ๋•Œ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋’ค ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. ๋ฐฐํฌ๋Š” 1์—์„œ ์—ฐ๊ฒฐํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์— ๋ฐฐํฌ๋˜๋„๋ก ์„ค์ •, ๊ฒฐ๊ตญ ๋งค๋ฒˆ ๋งŒ๋“ค์–ด์ง€๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐํฌ๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ์ ์€ “๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐํฌ๊ฐ€ ๋œ๋‹ค” ์™€ ๋ฐฐํฌ์‹œ์—๋Š” ํ•ญ์ƒ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์—๋งŒ ๋ฐฐํฌ๋ฅผ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— “๋ฐฐํฌ์‹œ์Šคํ…œ์ด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ชฐ๋ผ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค"๋Š” ์ ์ด๋‹ค. #!/bin/sh cd /~~~/deploy/ # ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ DIRECTORY_NAME=batch_$(/bin/date +%Y%m%d%H%M%S) mkdir $DIRECTORY_NAME ์œ„ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด batch_20191012205218 ์™€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ด€๋ จํ•ด์„œ๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ์ด์–ด์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค. 2. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ์›๋ž˜ ๋งํฌ๋ฅผ ์ฆ‰์‹œ ๋ณ€๊ฒฝ ๋ณดํ†ต ์‹ฌ๋ณผ๋ฆญ ๋งํฌ (์ฆ‰, ๋ฐ”๋กœ๊ฐ€๊ธฐ) ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ง€์› ๋‹ค๊ฐ€ ์‚ญ์ œํ•˜๋Š” ์‹์œผ๋กœ ํ–ˆ์—ˆ๋Š”๋ฐ $ mkdir directory_a $ mkdir directory_b $ ln -s directory_a asdf $ ll asdf -> directory_a directory_a directory_b # directory_a ์—์„œ directory_b ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ (์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์ƒ์„ฑ) $ rm asdf $ ln -s directory_b asdf $ ll asdf -> directory_b directory_a directory_b ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‚ญ์ œํ•˜๊ณ  ~ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ํƒ€์ด๋ฐ์— ๋ฐฐํฌ๊ฐ€ ๋˜๊ฑฐ๋‚˜ ์‹คํ–‰์ด ๋˜๋Š” ์ฆ‰, ํ•ด๋‹น ๊ฒฝ๋กœ์— ์—‘์„ธ์Šค ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค๊ฑฐ๋‚˜ ์˜๋„ํ–ˆ๋˜ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. (์ฐฐ๋‚˜์˜ ํƒ€์ด๋ฐ ์ด์ง€๋งŒ ํ•„์ž๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋กœ ์ด์ „์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค.) ๊ทธ๋ž˜์„œ ln ์˜ ์˜ต์…˜์ค‘์ธ -Tfs์˜ต์…˜์œผ๋กœ ์ฆ‰์‹œ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ๋„๋ก ํ•˜์ž. (ln man ์ฐธ๊ณ ) # ๋งŒ๋“  ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ฐฐํฌ๋ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค.

์šฐ์•„ํ•œ ์Šคํ”„๋ง ๋ฐฐ์น˜ ํ…Œํฌ์„ธ๋ฏธ๋‚˜ ์ •๋ฆฌ ๋ฐ ํ›„๊ธฐ (by ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค)

์ง€๋‚œ์ฃผ ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค์—์„œ ์ง„ํ–‰ํ•˜์˜€๋˜ “9์›” ์šฐ์•„ํ•œ ํ…Œํฌ ์„ธ๋ฏธ๋‚˜ - ์šฐ์•„ํ•œ ์Šคํ”„๋ง ๋ฐฐ์น˜” ์— ๋‹ค๋…€์™”๋‹ค. ํ•„์ž์—๊ฒŒ ์ด๋ฒˆ 9์›”์€ ์ •์‹ ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅผ๋งŒํผ ๋ฐ”์˜๊ณ  ํž˜๋“ค์—ˆ์ง€๋งŒ ์˜ˆ์ „๋ถ€ํ„ฐ ๊ถ๊ธˆํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  ์š”์ฆ˜๋“ค์–ด ๊ด€์‹ฌ์„ ๊ฐ–๋˜ “๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜"์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด “์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•"์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ƒ๊ฐ๋“ค์ด ์žˆ์—ˆ๊ธฐ์— ํฐ ๊ธฐ๋Œ€๋ฅผ ๊ฐ€์ง€๊ณ  ์ง€์˜ฅ์ฒ ์„ ๊ฒฌ๋””๋ฉฐ ์ž ์‹ค ๊ทผ์ฒ˜์— ์žˆ๋Š” ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค ์ž‘์€์ง‘์œผ๋กœ ๊ฐ€๊ฒŒ ๋˜์—ˆ๋‹ค. ์–ด๋–ค ๋‚ด์šฉ์„ ๋ฐœํ‘œํ•˜์˜€๋Š”์ง€์— ๋Œ€ํ•ด ๊ธฐ์–ต์ž˜ํ•˜๋Š” ๋˜‘๋˜‘ํ•œ ์•ต๋ฌด์ƒˆ๊ฐ€ ๋˜์–ด ์ •๋ฆฌํ•˜๊ธฐ ๋ณด๋‹ค ์ฃผ์š” ํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ƒ๊ฐ๊ณผ ํ•จ๊ป˜ ์ฐธ์—ฌ๋ฅผ ๋ชปํ•œ ๋ถ„๋“ค ์œ„ํ•ด์„œ๋ผ๊ธฐ ๋ณด๋‹ค ๋‚ด ์Šค์Šค๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. (์ด๋ฒˆ์—๋„ ๋ถˆ๋Ÿฌ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ^=^) ์ธํŠธ๋กœ ์—ฐ์‚ฌ์ž ๋ถ„์€ ์›Œ๋‚™์— ์œ ๋ช…ํ•˜์‹  ๋ถ„์ด๋ผ ๋ณ„๋„์˜ ์„ค๋ช…์ด ํ•„์š” ์—†์ด ์šด์˜ํ•˜์‹œ๋Š” ๋ธ”๋กœ๊ทธ ์ฃผ์†Œ๋กœ ๋Œ€์ฒด๋ฅผ ํ•ด๋ณธ๋‹ค. ์ด๋ฒˆ ํ–‰์‚ฌ์— ์ดˆ๋Œ€๋˜์‹  ๋ถ„๋“ค์€ ํ•œ๋ฒˆ์ด๋ผ๋„ ์Šคํ”„๋ง ๋ฐฐ์น˜๋ฅผ ์จ๋ถ„ ๋ถ„๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋งˆ์นจ ํ•„์ž๋„ ํŒ€ ๋‚ด์—์„œ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ๋ฐ”๊ฟ”๋ณด๊ณ ์ž ํ•˜๋Š” ๋‹ˆ์ฆˆ๊ฐ€ ์žˆ์—ˆ๊ธฐ์— ์•„๋งˆ ์ดˆ๋Œ€๋œ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๋‹ค. ์•„๊ธฐ์ž๊ธฐํ•œ ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค ๊ฑด๋ฌผ ๋‚ด๋ถ€" ์•„๊ธฐ์ž๊ธฐํ•œ ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค ๊ฑด๋ฌผ ๋‚ด๋ถ€ ๋”๋ถˆ์–ด ๋ฐœํ‘œ์ „์— ๊ฐ„๋žตํžˆ ํšŒ์‚ฌ๊ฐ€ ์›ํ•˜๋Š” ์ธ์žฌ์— ๋Œ€ํ•˜์—ฌ ์–ธ๊ธ‰ํ•ด์ฃผ์…จ๋Š”๋ฐ ๊ทธ๊ฒŒ ์–ด์ฐŒ๋‚˜ ๊ณต๊ฐ์ด ๊ฐ€๋˜์ง€. ์—ญ์‹œ ์ƒ๊ฐ์ด ๋‚จ๋‹ค๋ฅธ ํšŒ์‚ฌ๊ตฌ๋‚˜ ํ•˜๊ณ  ๋‹ค์‹œํ•œ๋ฒˆ ์ƒ๊ฐ์„. ์ž๊ธฐ๋ณด๋‹ค ๊ฒฝํ—˜์ด “์ ์€” ์‚ฌ๋žŒ์—๊ฒŒ “์„ค๋“์„ ๋‹นํ•  ์ˆ˜” ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ž๊ธฐ๋ณด๋‹ค ๊ฒฝํ—˜์ด “๋งŽ์€ ์‚ฌ๋žŒ์„ ์„ค๋“” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธํŽธ ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€ ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ๋žŒ์™€ ์ƒํ˜ธ์ž‘์šฉ์—†์ด ์ด์–ด์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ(์ž‘์—…)๋“ค์˜ ์‹คํ–‰์ด๋ผ๊ณ  ์œ„ํ‚คํ”ผ๋””์•„์— ๊ฐ„๊ฒฐ&๋ช…๋ฃŒํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋งŒํผ ์ผ๋ฐ˜์ ์ธ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ด๊ณ  ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋‹ˆ ์•„๋ฌด๋ž˜๋„ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์ด๋ฉฐ QA์‹œ ํŽธํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ๊ทธ์— ๋ฐ˜ํ•ด ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งํ•˜๋Š” ์š”์ฒญ์ด๋ผ๋Š” ๊ฐœ๋…๋ณด๋‹ค ํ›„์†์ฒ˜๋ฆฌ์— ๊ฐ€๊น๊ณ , ์†๋„ ๋˜ํ•œ ์ ˆ๋Œ€์ ์ด๋ฉฐ QA๊ฐ€ ๋ณต์žกํ•˜๋‹ค๋Š”๊ฒŒ ํŠน์ง•์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด๋‹ค ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋” ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆ  ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ผ์ • ์ฃผ๊ธฐ๋กœ ์‹คํ–‰ ๋˜์–ด์•ผ ํ•  ๋•Œ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์šด ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ ํ• ๋•Œ ํ‰์†Œ ์ฒซ๋ฒˆ์งธ ์ƒํ™ฉ๋งŒ ์ƒ๊ฐํ•˜๊ณ  ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ ๋‘๋ฒˆ์žฌ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์ƒ๊ฐ์— ์ƒ๊ฐ์„ ๋” ํ•ด๋ณด๋‹ˆ ์Šคํ”„๋ง ๋ฐฐ์น˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ (Tasklet) ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฑด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ๋ฐ˜์„ฑ์„ ํ•ด๋ณด๊ณค ํ–ˆ๋‹ค. (Reader, Processor, Writer ๋“ฑ ๋‹ค์–‘ํ•œ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ๋Š”๋ฐ๋„…) ํŠนํžˆ ์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์Œ“์ง€ ์•Š๋Š” ์กฐํšŒ๋ฐฉ์‹๋ผ๊ณ  ํ•œ๋‹ค. (DB๊ธฐ์ค€) Paging ํ˜น์€ Cursor๋กœ pageSize๋งŒํผ๋งŒ ์ฝ์–ด์˜ค๊ณ  chunkSize๋งŒํผ๋งŒ commit ํ•˜๋Š” ํ˜•ํƒœ. ์ด๋Ÿฌํ•œ ๊ฐ ๋ ˆ์ด์–ด๋ณ„ size๋ฅผ ์ž˜ ์กฐ์ •ํ•˜๊ธฐ๋งŒ ํ•ด๋„ ์ ์€ ๋…ธ๋ ฅ์œผ๋กœ ํฐ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์•„๋‹๊นŒ ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณธ๋‹ค. ๋˜ํ•œ @JobScope ๋‚˜ @StepScope๋Š” Late Binding ์ฆ‰ ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ์•„๋‹ˆ๋ผ Job ์ด ์‹คํ–‰๋ ๋•Œ ์ƒ์„ฑ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ reader / processor / wirter ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํ™œ์šฉํŽธ ์Šคํ”„๋ง ๋ฐฐ์น˜๋ฅผ ์ด์šฉํ•œ ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๊ณ  ์ด๋ฅผ ์Šค์ผ€์ฅด๋ง ๋“ฑ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋“ค์— ์ด์•ผ๊ธฐ๋ฅผ ํ•ด์ฃผ์…จ๋‹ค. Cron ๋ฆฌ๋ˆ…์Šค๋ฅผ ์–ด๋Š์ •๋„ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด ์•Œ๋งŒํ•œ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ณธ ์Šค์ผ€์ฅด๋ง ํ”„๋กœ๊ทธ๋žจ์ธ Cron. ํ•„์ž๋„ Cron ์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•ด๋ณด๊ธฐ๋„ ํ•˜์˜€์ง€๋งŒ ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์ƒ ๋กœ๊ทธ ๋ฐ ์‹คํ–‰/์ข…๋ฃŒ ๋“ฑ ์ œํ•œ์‚ฌํ•ญ์ด ๋งŽ์€ ๊ฑด ์‚ฌ์‹ค์ธ๊ฒƒ ๊ฐ™๋‹ค. Spring MVC + API Call ์ฃผ๋ณ€์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋˜ ๋ฐฉ์‹. ์ด ๋ฐฉ์‹์˜ ์žฅ์ ์€ ํ•ญ์ƒ ๋– ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์‹œ๊ฐ„์ด ๋ณ„๋„๋กœ ํ•„์š” ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์ „๋ฐ˜์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šด ๋‹จ์ ์ด ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ์šธ๋ฉฐ ๊ฒจ์ž๋จน๊ธฐ ์‹์œผ๋กœ ๋‹จ์ ์„ ๊ทน๋ณตํ•  ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ๋ชจ๋“ ๊ฑด ํ•ญ์ƒ Trade off Spring Batch Admin (Deprecated) ์˜ˆ์ „ ํŒ€๋ถ„์ด ์•Œ๋ ค์ฃผ์…”์„œ ์ž ๊น ๋ดค๋˜ ๋ถ€๋ถ„์ด๊ธด ํ•œ๋ฐ ์–ด๋Š์‚ฌ์ด์— Deprecated ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. Quertz + Admin http://www.quartz-scheduler.org/ ์•„์ฃผ ์˜ค๋ž˜์ „์— ์จ๋ณธ ๊ธฐ์–ต์ด ์žˆ์ง€๋งŒ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํฐ ์ƒํ™ฉ๊ฐ™์•˜๋˜ ํž˜๋“ค์—ˆ๋˜ ๊ธฐ์–ต๋“ค๋งŒ ๋‚จ์•„์žˆ๋Š” ๊ตฌํ˜„๋ฐฉ๋ฒ•์ธ๊ฒƒ ๊ฐ™๋‹ค.

๋„คํŠธ์›Œํฌ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๊ถ๊ธˆํ• ๋• ? Packetbeat !

๋ชจ๋‹ˆํ„ฐ๋ง์€ ์„œ๋น„์Šค ๋กœ์ง ๊ฐœ๋ฐœ ๋งŒํผ ํ•œ๋ฒˆ์”ฉ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ๊ฒฝํ—˜ํ•ด ๋ดค์„ ์ค‘์š”ํ•œ ์˜์—ญ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ์ค‘ ์›น์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—‘์„ธ์Šค ๋กœ๊ทธ๋Š” ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ์›น์„œ๋น„์Šค์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์•„์ดํ…œ ์ค‘์— ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค url์„ ๋งŽ์ด ํ˜ธ์ถœํ•˜๊ณ , ์–ด๋–ค user-agentํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ ์„œ๋น„์Šค ์ „๋žต์„ ๋ณ€๊ฒฝํ• ์ˆ˜๋„ ์žˆ๊ณ  ์•…์˜์ ์œผ๋กœ ๊ณต๊ฒฉ์ ์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ์›น์„œ๋ฒ„๋‹จ์—์„œ ์ฐจ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ inbound ํŠธ๋ž˜ํ”ฝ(์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ)์— ๋Œ€ํ•ด์„œ๋Š” ์—‘์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์ž˜ ๋ถ„์„ํ•˜๋ฉด ๊ธฐ์กด์˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๋Š” ์ „ํ˜€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ outbund ํŠธ๋ž˜ํ”ฝ(์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ์š”์ฒญ)์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค์‹์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์›”๊ธ‰ํ†ต์žฅ์˜ inbound ํŠธ๋ž˜ํ”ฝ๋ณด๋‹ค outbound ํŠธ๋ž˜ํ”ฝ์ด ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฆ˜…์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://www.app24moa.com/feedDetail/2/2002" ์›”๊ธ‰ํ†ต์žฅ์˜ inbound ํŠธ๋ž˜ํ”ฝ๋ณด๋‹ค outbound ํŠธ๋ž˜ํ”ฝ์ด ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฆ˜… ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://www.app24moa.com/feedDetail/2/2002 ์˜ˆ์ปจ๋ฐ, ๋‚ ์”จ ์„œ๋น„์Šค๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€์—์„œ ์„œ์šธ๋‚ ์”จ๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ์กฐํšŒํ–ˆ์„ ๊ฒฝ์šฐ ๊ธฐ์ƒ์ฒญ API์—์„œ ๋„˜๊ฒจ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋•Œ ๊ธฐ์ƒ์ฒญ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŠน์ • API์ค‘์— ์–ด๋Š ํ•˜๋‚˜๊ฐ€ ๋Šฆ๊ฒŒ ์‘๋‹ต์ด ์˜จ๋‹ค๊ฑฐ๋‚˜, ํŠน์ •์‹œ๊ฐ„๋Œ€์— ์—๋Ÿฌ์‘๋‹ต์„ ๋ฐ›์„๊ฒฝ์šฐ ๊ณผ์—ฐ ์ด๋ฅผ ์–ด๋–ค์‹์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ• ์ˆ˜ ์žˆ์„๊นŒ? ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ธ๊ฐ€? ํ˜น ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ A๋ชจ๋“ˆ์€ java๋กœ, B๋ชจ๋“ˆ์€ python์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋ชจ๋“ˆ๋งˆ๋‹ค ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‹์œผ๋กœ ํ•˜๋‹ค๋ณด๋ฉด ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๋ฐฉํ•ดํ•˜๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ๋˜ํ•œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ์ปค์ ธ๋ฒ„๋ฆด ์ƒํ™ฉ๋„ ์ƒ๊ธธ์ˆ˜ ์žˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์„œ๋ฒ„ ์ž์ฒด์—์„œ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ๋„ ์‹ฌํ”Œํ•œ ๋ชจ๋“ˆ์„ ์ฐพ๊ณ  ์‹ถ์—ˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ๋ณ„๋„์˜ ์—์ด์ „ํŠธ ํ˜•์‹์œผ๋กœ ๋„์›Œ๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„, ๋‚˜์•„๊ฐ€์„œ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง๊นŒ์ง€ ํ• ์ˆ˜์žˆ๋Š”… ๊ทธ๋ž˜์„œ ์ฐพ๋‹ค๋ณด๋‹ˆ ์—ญ์‹œ๋‚˜ ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์„ ๋ˆ„๊ตฐ๊ฐ€๋Š” ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์˜คํ”ˆ์†Œ์Šค๊นŒ์ง€ ๋˜์–ด์žˆ๋Š” Elastic Stack ์˜ Beat์ค‘ Packetbeat๋ผ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ชจ๋“ˆ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ญ์‹œ ๋‚ด๊ฐ€ ํ•˜๊ณ ์žˆ๋Š” ๊ณ ๋ฏผ์€ ์ด๋ฏธ ๋ˆ„๊ตฐ๊ฐ€ ํ–ˆ๋˜ ๊ณ ๋ฏผ๋“ค… ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์— ๋Œ€ํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋‹ค ๋นจ๋ฆฌ ์ฐพ๋Š”๊ฒŒ ๊ฒฝ์Ÿ๋ ฅ์ด ๋ ํ…๋ฐ… ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Packetbeat ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ณ  ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ outbound ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ด๋ณด๋ฉฐ ์–ด๋–ค์‹์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. Packetbeat ? ElasticStack ์ค‘์— ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ ํ”Œ๋žซํผ์ธ Beats์ค‘ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ˆ˜์ง‘์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. pcap๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ํ•œ ํ›„ ์™ธ๋ถ€๋กœ(Elasticsearch, Logstash, Kafka ๋“ฑ) ์ „์†กํ•ด์ฃผ๋Š” ๊ฒฝ๋Ÿ‰ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋ถ„์„๊ธฐ๋ผ๊ณ  ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ์†Œ๊ฐœ๋˜๊ณ  ์žˆ๋‹ค. ๋ช‡๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ๋Š๋‚€ ์žฅ์ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์„ค์น˜ ๋ฐ ์‹คํ–‰์ด ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๋‹ค. ์„ค์ •๊ฐ’ ํŠœ๋‹์„ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๊ทธ๋Ÿฌํ•œ ๊ฐ„๋‹จํ•จ์— ๋น„ํ•ด์„œ ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ•œ ์ˆ˜์ง‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์•ž์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€๋Š” ์ „ํ˜€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ๋ฌด์—‡์„ ํ•ด๋ณผ๊ฒƒ์ธ๊ฐ€?! (a.k.a. ๋ชฉํ‘œ) ํ•„์ž๊ฐ€ ์šด์˜ํ•˜๋Š” Daily-DevBlog ๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค. (๊ฐ‘๋ถ„ ์„œ๋น„์Šค ํ™๋ณด) ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ rss๋ฅผ ์กฐํšŒํ•˜๊ณ  ํŒŒ์‹ฑํ•ด์„œ ๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ๋Š” ์„œ๋น„์Šค ์ธ๋ฐ, packetbeat ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ๋“ค๊ธฐ์œ„ํ•ด ์กฐ๊ธˆ ๋ณ€ํ˜•ํ•˜์—ฌ ๋ชจ๋“  rss๋ฅผ ์ ‘๊ทผํ•˜๊ณ  ๊ฐ€์žฅ ์ตœ์‹ ๊ธ€์˜ ์ œ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ python ์Šคํฌ๋ฆฝํŠธ๋กœ outbound ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œ์ผœ ๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  packetbeat ๋ฅผ ์ด์šฉํ•˜์—ฌ ์™ธ๋ถ€๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์ง‘ํ•˜๊ณ  Elasticsearch ๋กœ ์ธ๋ฑ์‹ฑ ํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ๋Š” ์–ด๋Š rss์˜ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋Š๋ฆฐ์ง€ ์‹คํ–‰๋˜๋Š” python์ฝ”๋“œ์™€๋Š” ์ „ํ˜€ ๊ด€๋ จ์—†์ด ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. python ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฐธ๊ณ ๋กœ ํ•„์ž๋Š” awesome-devblog์˜ ์šด์˜์ž๋ถ„๊ป˜ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ํ—ˆ๋ฝ์„ ๋ฐ›์€ ์ƒํƒœ์ด๋‹ค. import requests, yaml, feedparser blog_info_list_yml_url = 'https://raw.githubusercontent.com/sarojaba/awesome-devblog/master/db.yml' blog_info_list_yml = requests.get(url=blog_info_list_yml_url).text blog_info_yaml_parse_list = yaml.load(blog_info_list_yml) for blog_info in blog_info_yaml_parse_list : if 'rss' not in blog_info.keys() or not blog_info['rss']: continue rss_url = blog_info['rss'] try : parse_feed = feedparser.parse(rss_url) except : continue parse_feed_data = parse_feed.entries[0] print(blog_info['name'], '|', parse_feed_data['title'], '|', parse_feed_data['link']) ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ธ”๋กœ๊ทธ ์ฃผ์ธ์˜ ์ด๋ฆ„๊ณผ ์ตœ์‹ ๊ธ€ ์ œ๋ชฉ, ๋งํฌ๊ฐ€ ์ถœ๋ ฅ์ด ๋œ๋‹ค.