/images/profile.png

2018 ์˜คํ”ˆ์†Œ์Šค๊ฐœ๋ฐœ์ž์ด์•ผ๊ธฐ ํ›„๊ธฐ

Facebook๊ทธ๋ฃน๋“ค์„ ๋ˆˆํŒ…ํ•˜๋‹ค(?) OSS๊ฐœ๋ฐœ์ž ํฌ๋Ÿผ์—์„œ ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ์ž์ด์•ผ๊ธฐ๋ผ๋Š” ์ฃผ์ œ๋กœ ์„ธ๋ฏธ๋‚˜๋ฅผ ์ฃผ์ตœํ•œ๋‹ค๋Š” ๊ณต์ง€๋ฅผ ๋ณด๊ฒŒ๋˜์—ˆ๋‹ค. ์–ธ์ œ๋ถ€ํ„ด๊ฐ€ ํŠธ๋žœ๋“œ์— ๋’ค์ณ์ง€์ง€ ์•Š์œผ๋ ค๋Š” ๋ชธ๋ถ€๋ฆผ์ค‘ ์„ธ๋ฏธ๋‚˜๊ฐ™์€ ์™ธ๋ถ€ ๊ฐœ๋ฐœ ํ–‰์‚ฌ์— ์ฐธ์—ฌํ•ด๋ณด์ž๋Š” ๋งˆ์Œ์œผ๋กœ ๊ณต์ง€๋ฅผ ๋ณด์ž๋งˆ์ž ํ™€๋ฆฐ๋“ฏ์ด ์‹ ์ฒญ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ ์„ธ๋ฏธ๋‚˜๋ฅผ ๋“ฃ๊ณ  ๊ฐํฅ์ด ๊ฐ€์‹œ๊ธฐ ์ „์— ํ›„๊ธฐ๋ฅผ ์ ๊ณ ์ž ํ•œ๋‹ค.(์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์žŠ์–ด๋ฒ„๋ฆด๊ฒƒ๋งŒ๊ฐ™์€, ๋ณด๊ณ  ๋“ค์€ ์ƒ์ƒํ•œ ๊ทธ ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป์—ˆ๊ธฐ์—…) ๋น„๊ฐ€์˜ค๋Š” ์ฃผ๋ง์ด์˜€์ง€๋งŒ ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ์˜ค์ž๋Š” ์„ค๋ ˆ์ž„์„ ๊ฐ–๊ณ  ์„œ์šธ ๊ด‘ํ™”๋ฌธ ๊ทผ์ฒ˜์— ์žˆ๋Š” ํ•œ๊ตญ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๋กœ ๊ฐ€๊ฒŒ๋˜์—ˆ๋‹ค. ๋ง๋กœ๋งŒ ๋“ฃ๋˜ MS์‚ฌ ๋กœ๊ณ ๋ฅผ ๋ณด๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ•˜๋‚˜๋‘˜์”ฉ ๋ชจ์ด๋Š”๊ฑธ ๋ณด๋‹ˆ ๋ญ”๊ฐ€ ๋ฐฐ์šธ์ˆ˜ ์žˆ๊ฒ ๊ตฌ๋‚˜ ํ•˜๋Š” ๊ธฐ๋Œ€๊ฐ์ด ์ƒ๊ฒผ๋‹ค. ์‚ฌ์‹ค ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ๋งŒ ํ•ด๋ณธ ์ž…์žฅ์ด๋ผ ์‹ค์ œ ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ์—ฌํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ์–ด๋–ค ์ƒ๊ฐ๋“ค์„ ๊ฐ–๊ณ  ๊ณ„์‹œ๋Š”์ง€๊ฐ€ ๊ฐ€์žฅ ๊ถ๊ธˆํ–ˆ๊ณ  ๊ฐœ๋ฐœ์ž์ธ ๋‚˜๋„ ์–ธ์  ๊ฐ„ ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ์—ฌํ• ์ˆ˜์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•˜๋ฉฐ ๋ฐœํ‘œ๋ฅผ ๋“ค์—ˆ๋‹ค. # ํšŒ์ƒ‰์ง€๋Œ€ : ์ด์ƒ๊ณผ ํ˜„์‹ค - ์˜คํ”ˆ์†Œ์Šค ์ €์ž‘๊ถŒ / ์‹ ์ •๊ทœ ๋‹˜ ์˜คํ”ˆ์†Œ์Šค๋Š” ์•„๋ฌด๋ฆฌ ๋ง๊ทธ๋Œ€๋กœ Open์ด์ง€๋งŒ ์˜คํ”ˆ์†Œ์Šค๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ์ €์ž‘๊ถŒ์„ ๊ฐ–๊ณ ์žˆ๊ณ  ์„œ๋กœ ์Ÿ์ทจํ•˜๋ ค๋Š” ์‹ธ์›€์ด ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์–ด๋– ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ณ  ์˜คํ”ˆ์†Œ์Šคํ™” ์‹œํ‚ฌ๋•Œ๋„ ๋ผ์ด์„ผ์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์ž˜ ๊ฒฐ์ •ํ•ด์•ผ ์ถ”ํ›„ ๋ถˆ์ด์ต์„ ๋‹นํ•˜๋Š” ์ƒํ™ฉ์„ ๋ชจ๋ฉดํ• ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํŠนํ—ˆ์™€ ๋ผ์ด์„ผ์Šค๋Š” ๊ฐ™์€ ๋ง์ด๋ฉด์„œ๋„ ๋‹ค๋ฅธ๋ฐ ์•„๋ž˜ ํ‘œ์ฒ˜๋Ÿผ ๊ฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ํ™•์ธํ• ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํ—ˆ ๋ผ์ด์„ผ์Šค ๊ถŒ๋ฆฌ๋ฐœ์ƒ ์ถœ์›, ์‹ฌ์‚ฌ, ๋“ฑ๋ก ์ฐฝ์ž‘๊ณผ ๋™์‹œ ๋ฐœ์ƒ ๊ถŒ๋ฆฌ๋‚ด์šฉ ๋…์ ๋ฐฐํƒ€์  ์‹ค์‹œ๊ถŒ ์ธ๊ฒฉ๊ถŒ/์žฌ์‚ฐ๊ถŒ ํšจ๋ ฅ๋ฒ”์œ„ ์•„์ด๋””์–ด์˜ ๋™์ผ์„ฑ ํ‘œํ˜„์˜ ์‹ค์งˆ์  ์œ ์‚ฌ์„ฑ ์ฒซ ์‹œ๊ฐ„์ด๊ธฐ๋„ ํ•˜์˜€๊ณ  ์•„๋ฌด๋ž˜๋„ ์ฃผ์ œ๊ฐ€ ๋์žฅํ† ๋ก ์„ ํ•ด๋„ ์•ˆ๋๋‚  ์ฃผ์ œ์˜€๋˜์ง€๋ผ ์ •ํ•ด์ง„ ์‹œ๊ฐ„์„ ๋„˜๊ธธ์ •๋„๋กœ ์ด์•ผ๊ธฐ๋ฅผ ๋งŽ์ด ํ•ด์ฃผ์…จ๋‹ค. ํŠนํžˆ ์˜คํ”ˆ์†Œ์Šค ๊ด€๋ จ๋œ ์ด์•ผ๊ธฐ๋Š” ์‚ฌ๋ก€๋ฅผ ์ด์•ผ๊ธฐ ํ•ด์•ผ ์žฌ๋ฐŒ๋‹ค๊ณ  ํ•˜์…จ๋Š”๋ฐ ์‹œ๊ฐ„๊ด€๊ณ„์ƒ ๋ช‡๊ฐ€์ง€๋งŒ ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค. ๋งํฌ๊ฐ€ ๋งž๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์ฒจ๋ถ€ํ•ด๋ณธ๋‹ค. ์—˜๋ฆผ๋„ท vs ํ•˜์ด์˜จ๋„ท ์‚ฌ๊ฑด EFM Networks ์˜ค๋ผํด VS ๊ตฌ๊ธ€ ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ๋‹จ์ˆœํ•˜๊ฒŒ ๋ˆ„๊ตฌ๋‚˜ ์ˆ˜์ •ํ• ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ์ด๋ผ๊ณ ๋งŒ ์ƒ๊ฐ์„ ํ•˜๊ณ ์žˆ๋‹ค๊ฐ€ ์ด๋Ÿฐ ๋ณต์žกํ•œ ๋ผ์ด์„ผ์Šค ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋‹ˆ ์•ฝ๊ฐ„ ์–ด๋ ค์› ์ง€๋งŒ, ์˜คํ”ˆ์†Œ์Šค์˜ ์ƒํƒœ๊ณ„๋ฅผ ์•Œ๊ณ  ๋ฐœ์„ ๋“ค์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋Š์ •๋„์˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ์•Œ์•„์•ผ ๊ฒ ๋‹ค๊ณ  ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค. Elastic ์—์„œ Remote ๋กœ ์ผํ•˜๊ธฐ / ๊น€์ข…๋ฏผ ๋‹˜ ๊ทธ์ „๋ถ€ํ„ฐ Elastic ์ œํ’ˆ๋“ค์„ ์‹ค๋ฌด์—์„œ๋„ ์‚ฌ์šฉํ•ด ์™”์—ˆ๊ธฐ์— ๊ฐœ์ธ์ ์œผ๋กœ ์˜ค๋Š˜ ๋ฐœํ‘œ์ค‘์— ๊ฐ€์žฅ ๊ถ๊ธˆํ–ˆ์—ˆ๊ณ , ๊ด€์‹ฌ์ด ์žˆ๋˜ ์‹œ๊ฐ„์ด์˜€๋‹ค. ๋ฐœํ‘œ์— ์•ž์„œ ์–ด๋–ป๊ฒŒ Elastic์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์…จ๊ณ  ํšŒ์‚ฌ ์†Œ๊ฐœ๋ฅผ ๊ฐ„๋‹จํžˆ ํ•ด์ฃผ์…จ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋งˆ์–ด๋งˆํ•œ ํšŒ์‚ฌ๋‹ค๊ณ  ๋Š๋‚„์ˆ˜ ์žˆ์—ˆ๋‹ค.(800์—ฌ๋ช…์ค‘ ํ•œ๊ตญ์—” 9๋ช… / ๋„ค๋œ๋ž€๋“œ ์ถœ์‹  ์Šคํƒ€ํŠธ์—… ์ธ๋ฐ ๋ณธ์‚ฌ๋Š” ์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋งˆ์šดํ‹ด๋ทฐ์— ์žˆ๊ณ  ๋“ฑ๋“ฑ) ์›๊ฒฉ๊ทผ๋ฌด๋Š” ํŽธํ•˜๊ณ  ๋น„์šฉ์ด ์ ˆ์•ฝ๋˜๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜ ๋™๋ฃŒ๋“ค๊ฐ„์˜ ์œ ๋Œ€๊ฐํ˜•์„ฑ์ด ํž˜๋“ค๊ฑฐ๋‚˜ ํšŒ์˜์‹œ ์ง‘์ค‘์ด ํž˜๋“  ๋‹จ์ ๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๋ง์”€ํ•ด ์ฃผ์…จ๋‹ค. ์‹œ๊ฐ„๊ด€๊ณ„์ƒ ๋ช‡๊ฐ€์ง€ ๋งํฌ๋“ค์„ ์†Œ๊ฐœํ•ด์ฃผ์…จ๋Š”๋ฐ ๋‚˜์ค‘์— ๋ด๋ณผ ์ƒ๊ฐ์ด๋‹ค. ์นจ๋Œ€์—์„œ ํšŒ์‚ฌ๊นŒ์ง€ 1๋ถ„ [๋งˆ์†Œ 392ํ˜ธ] ๋ฆฌ๋ชจํŠธ ์›Œํฌ์˜ ์ค‘์‹ฌ์— ์„œ๋ณด๋‹ค ์›๊ฒฉ ํˆด๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. github : ์Šฌ๋ž™์—ฐ๋™, ๊ฐœ๋ฐœ๋ฟ ์•„๋‹ˆ๋ผ ์šด์˜/๊ธฐํš/์ด๋ฒคํŠธ ๊ณต์œ ์‹œ ํ™œ์šฉ Google Apps Slack : ๋ด‡ ํ™œ์šฉ (๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ด‡, ์ƒํ™ฉ๋งˆ๋‹ค ํŠน์ • ์•Œ๋ฆผ์„ ์ค€๋‹ค.) salesforce : CRM ํˆด zoom : ํ™”์ƒํšŒ์˜ 200๋ช… ๋™์‹œ์ฝœ ๊ฐ€๋Šฅ, ํšŒ์˜๊ฐ€ ๋๋‚˜๋ฉด ๋…น์Œ/๋…นํ™”/์Šคํฌ๋ฆฝํŒ…๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค (wow) pinboard : ๊ทผํƒœ/์ธ์‚ฌ ๊ด€๋ฆฌ์šฉ ์•ฑ jira๋Š” ์‚ฌ์šฉ ์ž˜ ์•ˆํ•จ ๋‚˜์ค‘์— ํŒ€ ๋‚ด Slack ๋ด‡์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค์–‘ํ•œ ์ž๋™ํ™”๋ฅผ ๊ตฌ์„ฑํ• ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„ ์ผ์›์œผ๋กœ์„œ์˜ ๊ฐœ๋ฐœ์ž / ๋ณ€์ •ํ›ˆ ๋‹˜ ์‚ฌํšŒ์ž๋ถ„์ด “์•„์›ƒ์‚ฌ์ด๋”๋‹˜"์ด๋ผ๊ณ  ํ•˜์‹œ๊ธธ๋ž˜ ์„ค๋งˆ ํ–ˆ๋‹ค. ๋ญ๊ฐ€ ์ž˜ ์•ˆ๋˜๋ฉด ๊ตฌ๊ธ€๋ง์„ ํ•˜๊ฒŒ๋˜๋Š”๋ฐ ๋‚ด๊ฐ€ ์ž์ฃผ ๋ณด๋˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜์…จ๋˜ ๋ถ„์ด ๋‚ด๋ˆˆ์•ž์— ใ„ทใ„ท… ์–ธ์ œ๋ถ€ํ„ฐ ํ•ด์•ผ์ง€~๊ฐ€ ์•„๋‹ˆ๊ณ  ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋‹ˆ ์–ด๋Š์ƒˆ ์˜คํ”ˆ์†Œ์Šค์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ์ฐธ์—ฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ด๋ฏธ ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„์†์—์„œ ์‚ด๊ณ ์žˆ๋Š” ์šฐ๋ฆฌ๋“ค์ด๋ผ ๋ง์”€ํ•˜์‹œ๊ณ , ์˜คํ”ˆ์†Œ์Šค Contribution ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์‚ฌ์šฉ/ํ™๋ณด/๋ฒˆ์—ญ/๋ฆฌํฌํŒ…/๋ฌธ์„œํ™”/์ฝ”๋“œ์ œ์ถœ ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ์žˆ์œผ๋‹ˆ ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋ง์ž ๋ผ๊ณ  ํ•˜์…จ๋‹ค. ์˜คํ”ˆ์†Œ์Šค์—์„œ ๋ฐฐ์šธ์ˆ˜ ์žˆ๋Š”์ ์€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์˜ ๋ฐฉ๋ฒ•, ํ˜‘์—…์˜ ๋ฐฉ๋ฒ•๊ณผ ์ค‘์š”์„ฑ, ํ…Œ์ŠคํŠธ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ, ์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ, ์ฝ”๋“œ์˜ ํ’ˆ์งˆ๊ด€๋ฆฌ ๋ผ๊ณ  ํ•œ๋‹ค. ์ ์  ๋ฐœํ‘œ๋ฅผ ๋“ค์œผ๋ฉด์„œ ์˜คํ”ˆ์†Œ์Šค์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ๋ฐ”๋€Œ๊ณ  ์žˆ๋Š” ๋‚ด ์ž์‹ ์„ ๋Š๋‚„์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ดˆ๊ฐ„๋‹จ API์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ - 2๋ถ€ (Python + Flask + Nginx)

์ง€๋‚œํฌ์ŠคํŒ…์— ์ด์–ด ์ด๋ฒˆ์—” Flask์™€ Nginx๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. Apache๋กœ ์—ฐ๋™ํ–ˆ๋Š”๋ฐ ์™œ ๋˜ Nginx๋กœ ์—ฐ๋™ํ•˜๋Š”๊ฑธ ์ •๋ฆฌํ•˜์ง€(?)ํ•˜๋ฉฐ ์˜๋ฌธ์ด ๋“ค์ˆ˜ ์žˆ๋Š”๋ฐ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์„ ๋ด๋„ Apache + Flask ์กฐํ•ฉ๋ณด๋‹ค Nginx + Flask ์กฐํ•ฉ์ด ๋” ๋งŽ๊ณ  ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋„ ์•Œ์ˆ˜์žˆ์—ˆ๋“ฏ์ด (Apache VS Nginx) ๋‘˜์ค‘ ์–ด๋Š๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ• ์ˆ˜๋„ ์—†๊ณ  ๊ฐ ์ƒํ™ฉ์—์„œ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๋˜ํ•œ ๋‚˜๋งŒ์˜ ๋ฌด๊ธฐ๊ฐ€ ๋ ๊ฒƒ๊ฐ™์•„ Nginx๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. 1๋ถ€์—์„œ ์™œ Flask์ธ๊ฐ€, Flask์˜ ์žฅ์ ์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ–ˆ์œผ๋‹ˆ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์ง„ ์•Š๋Š”๋‹ค. Nginx ์„ค์น˜ ( https://nginx.org/en/ ) ์—ญ์‹œ ์†Œ์Šค์„ค์น˜๋ฅผ ํ•œ๋‹ค. - ๋‹ค์šด์„ ๋ฐ›๊ณ  $ https://nginx.org/download/nginx-1.14.0.tar.gz - ์••์ถ•์„ ํ‘ผ ๋‹ค์Œ $ tar -zxvf nginx-1.14.0.tar.gz - ํด๋”๋กœ ์ด๋™ํ•ด์„œ $ cd nginx-1.14.0 - ์„ค์น˜ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๊ณ  $ ./configure --prefix=/~~~/apps/nginx - make ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  $ make - ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. $ make install ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋‹จ Nginx๋Š” ์„ค์น˜๊ฐ€ ๋˜์—ˆ๋‹ค. uWSGI ์„ค์น˜ ( https://uwsgi-docs.readthedocs.io/ ) ์•ž์„œ Apache์™€ ์—ฐ๋™ํ• ๋•Œ๋Š” ๋ณ„๋„์˜ ๋ชจ๋“ˆ์„ Apache์—๊ฒŒ ๋“ฑ๋กํ•˜๋Š” ํ˜•ํƒœ์˜€๋‹ค๋ฉด Nginx๋Š” WSGIํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•˜๋Š” WSGI ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค. - ๋‹ค์šด์„ ๋ฐ›๊ณ  $ wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz - ์••์ถ•์„ ํ’€๊ณ  $ tar zxvf uwsgi-latest.tar.gz - ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ $ cd uwsgi-2.0.17 - make ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 'uwsgi'์ด๋ผ๋Š” ์‹คํ–‰ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. $ make Nginx ์„ค์ • Apache์™€ ๋น„์Šทํ•˜๊ฒŒ uWSGI ๊ด€๋ จ ์„ค์ •์„ ํ•ด์ค€๋‹ค. server { listen 80; server_name localhost; location / { # ( / ) ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ include uwsgi_params; # GET/POST ๋“ฑ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ include ํ•ด์ค€๋‹ค. uwsgi_pass 127.0.0.1:3031; # ์š”์ฒญ์„ IP:PORT๋กœ ์ „๋‹ฌํ•œ๋‹ค. } } ๋ณ„๋„์˜ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์ „๋‹ฌํ•ด์ฃผ๋Š” (proxy๋Š๋‚Œ) ์„ค์ •์„ ํ•ด์ค€๋‹ค. uWSGI ์‹คํ–‰ ๋ฐ Nginx ์žฌ์‹œ์ž‘ ์•ž์„œ ์„ค์น˜ํ•œ uwsgi๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ IP:port ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์ฃผ๊ณ  (์œ„์—์„œ ์ „๋‹ฌ๋ฐ›์€ IP:PORT์™€ ๋™์ผํ•˜๊ฒŒ) Apache ์—ฐ๋™์‹œ ํ™œ์šฉํ–ˆ๋˜ wsgiํŒŒ์ผ์„ ์ด๋ฒˆ์—๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค. $ ./uwsgi -s 127.0.0.1:3031 --wsgi-file /~~~/python_app/hello_world.wsgi ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด background๋กœ ์‹คํ–‰๋˜๋Š”๊ฒŒ ์•„๋‹Œ foreground๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— &์„ ์‚ฌ์šฉํ•œ๋‹ค๋˜์ง€ ํ•ด์„œ background๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•ด์ค€๋‹ค. ๊ทธํ›„ Nginx๋ฅผ ์žฌ์‹œ์ž‘ ํ•ด์ฃผ๋ฉด ์›ํ•˜๋Š” ๊ทธํ† ๋ก ์›ํ–ˆ๋˜ Hello World!๋ฅผ ๋งŒ๋‚ ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค. Apache์—ฐ๋™๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅธ์ ์€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  ๋ณ„๋„์˜ ์ „๋‹ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(?)์ด ํ•„์š”ํ•˜๋‹ค๋Š”์ ์ด๋‹ค. ๊ฐ„๋‹จํžˆ Apache์ฒ˜๋Ÿผ ๋ชจ๋“ˆ๋งŒ ๋„ฃ์œผ๋ฉด ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ์„œ ๋ถˆํŽธํ• ์ˆ˜๋„ ์žˆ์„๊ฒƒ ๊ฐ™์ง€๋งŒ ํ•œํŽธ์œผ๋กœ๋Š” ๊ด€๋ฆฌํ• ์ˆ˜์žˆ๋Š” ํฌ์ธํŠธ๊ฐ€ ๋” ๋Š˜์–ด๋‚œ ์…ˆ์ด๋ผ ์–ด๋–ค ์ธก๋ฉด์—์„œ๋Š” ํ™œ์šฉํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ๋Š˜์–ด๋‚œ๊ฒƒ์œผ๋กœ ๋ณผ์ˆ˜๋„ ์žˆ๋‹ค. ๋งˆ์น˜๋ฉฐ ๋ง‰์ƒ ์ •๋ฆฌํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹Œ๋ฐ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ๋ชธ๋ถ€๋ฆผ์„ ์ณ๊ฐ€๋ฉฐ ์ฑ…์ด๋ฉฐ ๊ตฌ๊ธ€๋ง์„ ํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์ ์  ์„ฑ์žฅ์„ ํ•˜๋Š”๊ฒƒ ๊ฐ™๋‹ค. (์„ฑ์žฅํ†ต์ด๋ผ๊ณ ๋‚˜ ํ• ๊นŒ) ์ด๋ ‡๊ฒŒ ๋‹จ์ˆœํžˆ Flask๋ฅผ ํ• ์ˆ˜์žˆ๋‹ค ๊ฐ€ ์•„๋‹Œ ์›น์„œ๋ฒ„๋ฅผ ์—ฐ๋™ํ• ์ˆ˜์žˆ๋‹ค. ๊ทธ๊ฒƒ๋„ Apache์™€ Nginx ๋‘๊ฐœ๋‚˜. ์ด๊ฒƒ๋„ ์–ธ์  ๊ฐ„ ๋‚˜๋งŒ์˜ ๋ฌด๊ธฐ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ?

์ดˆ๊ฐ„๋‹จ API์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ - 1๋ถ€ (Python + Flask + Apache)

Staticํ•œ HTML์ด ์•„๋‹Œ ๋กœ์ง์ด ํ•„์š”ํ•œ API์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. (์ด์ œ๊นŒ์ง€ ์ง€์‹์œผ๋กœ)์ฒ˜์Œ ๋จธ๋ฆฟ์†์— ๋– ์˜ค๋ฅด๋Š”๊ฑด Java๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์Šคํ”„๋ง์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ณ  apache์— tomcat์„ ์—ฐ๋™ํ•œ ๋‹ค์Œ …์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ API์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ• ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ดํ•‘ ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค์ •ํ•˜๋Š” ์‹œ๊ฐ„์ด ์€๊ทผ ๋งŽ์ด ์†Œ์š”๋œ๋‹ค. (๋ฌผ๋ก  Java Config, Spring Boot ๋“ฑ ๊ฐ„์†Œํ•ด์กŒ์ง€๋งŒ…) ์–ผ๋งˆ์ „๋ถ€ํ„ฐ Python์— ๋Œ€ํ•œ ๋งค๋ ฅ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๋ผ๊ณ  ์žˆ๋‹ค๋ณด๋‹ˆ Python์œผ๋กœ API์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ• ์ˆœ ์—†์„๊นŒ ์•Œ์•„๋ดค๊ณ  (๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ๋“€๋ž‘๊ณ  ์„œ๋ฒ„๊ฐ€ python์ด๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•˜๊ณ …) Flask์™€ Django๊ฐ€ ์žˆ์–ด์„œ ๋‘˜๋‹ค ์จ๋ณธ ๊ฒฐ๊ณผ ํ•„์ž๋Š” Flask๊ฐ€ ๋งž๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณผ๊นŒ ํ•œ๋‹ค. ‘์žฅ๊ณ ’๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” Django์—๋Š” ๋ชจ๋“ ๊ฒƒ๋“ค์ด ๋‹ค ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•˜๋‹ค. (DB, ์–ด๋“œ๋ฏผ ๋“ฑ ) ํ•˜์ง€๋งŒ Flask๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ๋“ค๋งŒ importํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ์–ด๋–ค ์ธก๋ฉด์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค ํ• ์ˆ˜ ์žˆ๊ฒ ์œผ๋‚˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์— ์šฉ์ดํ•˜๋‹ค๊ณ  ๋ณผ์ˆ˜ ์žˆ์—ˆ๊ธฐ์— Flask๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. (Django๊ฐ€ Flask๋ณด๋‹ค ์•ˆ์ข‹๋‹ค๋Š” ๋ง์€ ์•„๋‹ˆ๋‹ˆ ์˜คํ•ด๋Š” ํ•˜์ง€ ๋งˆ์‹œ๊ธธ…) ๊ธ€์“ฐ๊ธฐ์— ์•ž์„œ ๋ณธ ํฌ์ŠคํŒ…์€ 2๊ฐœ์˜ ํฌ์ŠคํŒ…์— ๊ฑธ์ณ ์‹œ๋ฆฌ์ฆˆ(?)ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ค. 1๋ถ€์—์„œ๋Š” Flask๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉฐ Apache์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ณ , 2๋ถ€์—์„œ๋Š” Nginx์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค. ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. CentOS 7.4 Python 3.6 (๊ธฐ๋ณธ์€ 2.7์ด์˜€์œผ๋‚˜ ์ถ”๊ฐ€๋กœ ์„ค์น˜) Flask ( http://flask.pocoo.org/ ) ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ๋„ ๋ณด๋ฉด ์•Œ์ˆ˜ ์žˆ๋“ฏ์ด ๋„ˆ~๋ฌด ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹จ์ง€ ์•„๋ž˜ ์ฝ”๋“œ ๋ช‡์ค„๋งŒ ์ž‘์„ฑํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์ดˆ๊ธฐ ์ž‘์„ฑ์‹œ ํ•ญ์ƒ ๋งŒ๋‚˜๋Š” “Hello World"๋ฅผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. #hello_world.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" ์œ„์™€๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ  python hello.py๋กœ ์‹คํ–‰ํ•ด๋‘๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ http://127.0.0.1:5000 ์„ ์š”์ฒญํ•˜๋ฉด ๋ฐ˜๊ฐ€์šด Hello World๋ฅผ ๋งŒ๋‚ ์ˆ˜ ์žˆ๋‹ค. (๋„ˆ๋ฌด ๊ฐ„๋‹จ;;) ์ž์„ธํ•œ ๋ฌธ๋ฒ•์€ ๋„ํ๋จผํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋ ๋“ฏํ•˜๊ณ  ์ด Flask๋ฅผ ์ž˜๋งŒ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ API์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ• ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค. Hello World๋ฅผ ์ฐ์—ˆ์œผ๋ฉด ๋œ๊ฑฐ ์•„๋‹Œ๊ฐ€ ๋ผ๊ณ  ์งˆ๋ฌธํ• ์ˆ˜๋„ ์žˆ๊ฒ ์œผ๋‚˜ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ž๋‹จ์— ์›น์„œ๋ฒ„๋ฅผ ๋‘๋Š”๊ฒŒ ์—ฌ๋Ÿฌ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์›น์„œ๋ฒ„๋Š” Apache ์™€ Nginx๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” Apache์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. Apache ์„ค์น˜ ( http://archive.apache.org/ ) ์šฐ์„  ํ•„์ž๋Š” yum ์ด๋‚˜ apt-get์ฒ˜๋Ÿผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ ์„ค์น˜ํ•˜๋Š”๊ฒƒ์„ ๊ทธ๋ ‡๊ฒŒ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์œ ๋Š” ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•  ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์–ด๋Š๊ณณ์— ์„ค์น˜๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์œˆ๋„์šฐ๊ฒฝ์šฐ Program Files์ฒ˜๋Ÿผ ๋‚ด๊ฐ€ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ํ•œ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๊ธฐ์— ์™ ๋งŒํ•˜๋ฉด ์†Œ์Šค๋ฅผ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ค์น˜ํ•˜๊ณค ํ•œ๋‹ค. ์ด๋ฒˆ ์—ญ์‹œ ์•„ํŒŒ์น˜๋„ ์†Œ์Šค๋กœ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ˜„์žฌ ์•„ํŒŒ์น˜๋Š” 2.4๋ฒ„์ „์ด Stable๋ฒ„์ „์œผ๋กœ ๋˜์–ด์žˆ์ง€๋งŒ ๋ณด๋‹ค ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์€ 2.2๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋ ต๊ฒŒ ์•„์นด์ด๋น™๋œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋‹ค์šด์„ ๋ฐ›๊ณ  ์„ค์น˜๋ฅผ ํ•œ๋‹ค. - ๋‹ค์šด์„ ๋ฐ›๊ณ  $ wget http://archive.apache.org/dist/httpd/httpd-2.2.29.tar.gz - ์••์ถ•์„ ํ‘ผ ๋‹ค์Œ $ tar xvzf httpd-2.2.29.tar.gz - ํ•ด๋‹น ํด๋”๋กœ ๋“ค์–ด๊ฐ€ $ cd httpd-2.2.29 - ์ปดํŒŒ์ผ ํ›„ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ•ด์ฃผ๊ณ  $ ./configure --prefix=/~~~/apps/apache - make ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค์Œ $ make - ์„ค์น˜๋ฅผ ํ•ด์ค€๋‹ค. $ make install ์ด๋ ‡๊ฒŒ ๋˜๋ฉด /~~~/apps/apache/ ํ•˜์œ„์— ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด ์„ค์น˜๊ฐ€ ๋˜๋Š”๋ฐ root๊ณ„์ •์ด ์•„๋‹Œ ์ผ๋ฐ˜๊ณ„์ •์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” /binํ•˜์œ„์— ์žˆ๋Š” httpd์— ๋Œ€ํ•œ ์‹คํ–‰/์†Œ์œ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•œ๋‹ค. (์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ root๊ถŒํ•œ์œผ๋กœ ์‹œ์ž‘/์ข…๋ฃŒ. ์™œ? Apache๋Š” 80port๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” 1024 ์•„๋ž˜ port๋ฅผ ์ปจํŠธ๋กค ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” root๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ, ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ด์ฒ˜๋Ÿผ ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.) $ sudo chown root:๊ณ„์ •๋ช… httpd $ sudo chmod +s httpd mod_wsgi ์„ค์น˜ ( https://code.google.com/archive/p/modwsgi/ ) ์›น ์„œ๋ฒ„ ๊ฒŒ์ดํŠธ์›จ์ด ์ธํ„ฐํŽ˜์ด์Šค(WSGI, Web Server Gateway Interface)๋Š” ์›น์„œ๋ฒ„์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ„ํ•œ ํŒŒ์ด์„  ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ๋ผ๊ณ  ์ •์˜๋˜์–ด์žˆ๋‹ค. ์ฆ‰, ์›น์„œ๋ฒ„(Apache)์™€ ์œ„์—์„œ ๋งŒ๋“  Flask ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฐ๋™ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ด๋˜ํ•œ ์†Œ์Šค๋กœ ์„ค์น˜ํ•ด๋ณด์ž. (์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ~) - ๋‹ค์šด์„ ๋ฐ›๊ณ  $ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/3.5.tar.gz - ์••์ถ•์„ ํ‘ผ ๋‹ค์Œ $ tar -zxvf 3.5.tar.gz - ํด๋”์— ๋“ค์–ด๊ฐ€์„œ $ cd mod_wsgi-3.5 - ์•„ํŒŒ์น˜์˜ ๋นŒ๋“œํˆด์ธ apxs์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  - ํ•„์ž์™€ ๊ฐ™์ด ๊ธฐ๋ณธ python ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊บผ๋ผ๋ฉด ๊ผญ python๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

Apache๋ƒ Nginx๋ƒ, ๊ทธ๊ฒƒ์ด ์•Œ๊ณ ์‹ถ๋‹ค.

์›น์„œ๋ฒ„๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ฝํž์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ž๋‹จ์— ๋ฐฐ์น˜๋˜๊ณค ํ•œ๋‹ค. ๋™์ ์ธ ๋ฆฌ์†Œ์Šค๋Š” WAS์—๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ณ  ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ผ์ˆ˜๋„ ์žˆ๋‹ค. ํฌ๊ฒŒ Apache์™€ Nginx๊ฐ€ ์‚ฌ์šฉ๋˜๊ณค ํ•˜๋Š”๋ฐ ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?์‚ฌ์‹ค ํ•„์ž๋Š” ์‚ฌ๋‚ด์—์„œ ์ฃผ๋กœ Apache๋งŒ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ Nginx๋Š” ๊ทธ์ € Apache์™€๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์›น์„œ๋ฒ„๋‹ค ๋˜๋Š” ๋ณด๋‹ค ๊ฒฝ๋Ÿ‰ํ™” ๋˜์—ˆ๋‹ค ์ •๋„๋กœ๋งŒ ์•Œ๊ณ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ๊ธฐํšŒ๋ฅผ ํ†ตํ•ด ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๋น„๊ต๋ฅผ ํ•ด๋ณด๋ฉด์„œ ๊ฒฐ๊ตญ ์–ด๋–ค๊ฒŒ ์ข‹์€์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ตฌ๊ธ€๋ง์„ ์กฐ๊ธˆ๋งŒ ํ•ด๋ณด๋ฉด Apache์™€ Nginx๋ฅผ ๋น„๊ตํ•˜๋Š” ํฌ์ŠคํŒ…์ด ๋งŽ์ด ๋‚˜์˜จ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์˜ ๋ชฉ์  ์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์„ ๋‹จ์ˆœํžˆ ์š”์•ฝ/์ข…ํ•ฉ ํ•˜๋ ค๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ , ์ตœ๋Œ€ํ•œ ์‹ค๋ฌด ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š” ์‹œ๊ฐ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•จ์„ ๋ฐํžŒ๋‹ค. Apache ( https://httpd.apache.org/ ) ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ํ•œ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ดค์„ Apache. ๊ตญ๋‚ด ์ผ๋ฐ˜์ ์ธ ๊ธฐ์—…์—์„œ ์›น์„œ๋ฒ„์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ์žก์•˜๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹๊ฒƒ ๊ฐ™๋‹ค. Client์—์„œ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด MPM (Multi Processing Module : ๋‹ค์ค‘์ฒ˜๋ฆฌ๋ชจ๋“ˆ) ์ด๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” Prefork์™€ Worker๋ฐฉ์‹์ด ์žˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž. Prefork MPM Prefork MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html" Prefork MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œ๋˜์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ํ•œ๋ฒˆ์— ํ•œ ์—ฐ๊ฒฐ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์š”์ฒญ๋Ÿ‰์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํ”„๋กœ์„ธ์Šค๋Š” ์ฆ๊ฐ€ํ•˜์ง€๋งŒ ๋ณต์ œ์‹œ ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ๊นŒ์ง€ ๋ณต์ œ๋˜์–ด ๋™์ž‘ํ•˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ๊ฐ€ ์—†์–ด ์•ˆ์ •์ ์ด๋ผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. Worker MPM Worker MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html" Worker MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html Prefork ๋™์ž‘๋ฐฉ์‹์ด 1๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด Worker ๋™์ž‘๋ฐฉ์‹์€ 1๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ๊ฐ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์“ฐ๋ ˆ๋“œ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ PreFork๋ฐฉ์‹๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ WAS๋กœ tomcat์„ ์—ฐ๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด mod_jk, mod_proxy, mod_proxy_ajp ๋ฐฉ์‹์„ Apache ์ž์ฒด์ ์œผ๋กœ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ tomcat์„ ์—ฐ๋™ํ• ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋งํฌ Nginx ( https://nginx.org/en/ ) Nginx์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ธฐ ์ „์— ๊ตฌ๊ธ€ ํŠธ๋žœ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Nginx์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์–ด๋Š์ •๋„์ธ์ง€๋ฅผ ๋ณด๊ณ  ๋„˜์–ด๊ฐ€์ž. ์ตœ๊ทผ 5๋…„๊ฐ„ ๊ตฌ๊ธ€ํŠธ๋žœ๋“œ, ํŒŒ๋ž€์ƒ‰์ด Apache์ด๊ณ  ๋นจ๊ฐ„์ƒ‰์ด Nginx" ์ตœ๊ทผ 5๋…„๊ฐ„ ๊ตฌ๊ธ€ํŠธ๋žœ๋“œ, ํŒŒ๋ž€์ƒ‰์ด Apache์ด๊ณ  ๋นจ๊ฐ„์ƒ‰์ด Nginx ์ „์„ธ๊ณ„๋Š” Nginx๋ณด๋‹ค๋Š” Apache์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๋งŽ์€๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ ๊ตญ๋‚ด๋Š” ์•„์ฃผ ์กฐ๊ธˆ์”ฉ Nginx์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์˜ค๋ฅด๋Š”๊ฒƒ์„ ๋ณผ์ˆ˜์žˆ์—ˆ๋‹ค. (๊ทธ๋ž˜๋„ ์•„์ง์€ Apache๊ฐ€ ์›”๋“ฑํžˆ ์šฐ์„ธํ•œ ํŽธ์ด๋‹ค.) ๊ทธ๋Ÿผ Nginx๋Š” ์–ด๋–ค์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ผ๊นŒ? ๊ฐ€์žฅ ์œ ๋ช…ํ•œ(?) ํŠน์ง•์ด๋ผ๋ฉด Event Driven ๋ฐฉ์‹์„ ๊ผฝ์„์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค. Event Driven ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ž ๊น ์–ธ๊ธ‰์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์–ด๋–ค ๋™์ž‘์„ ํ•ด์•ผํ•˜๋Š”์ง€๋งŒ ์•Œ๋ ค์ฃผ๊ณ  ๋‹ค๋ฅธ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. (Producer Consumer Pattern๊ณผ ์œ ์‚ฌํ•˜๋‹ค.) ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ํ”„๋กœ์„ธ์Šค๋ฅผ forkํ•˜๊ฑฐ๋‚˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„ํŒŒ์น˜์™€๋Š” ๋‹ฌ๋ฆฌ CPU์™€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  IO๋“ค์„ ์ „๋ถ€ Event Listener๋กœ ๋ฏธ๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ํ๋ฆ„์ด ๋Š๊ธฐ์ง€ ์•Š๊ณ  ์‘๋‹ต์ด ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰์ด ๋˜์–ด 1๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋” ๋น ๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์ ์ธ ์ธก๋ฉด์—์„œ Nginx๊ฐ€ System Resource๋ฅผ ์ ๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. Nginx Process Model (https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale)" Nginx Process Model (https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale) ๊ทธ๋ž˜์„œ ๋ญ๊ฐ€ ์ข‹์€๊ฐ€? ์ด ํฌ์ŠคํŒ…์„ ์ ์œผ๋ฉด์„œ ๋งˆ์ง€๋ง‰์—” Apache๊ฐ€ ๋”์ข‹๋‹ค ๋˜๋Š” Nginx๊ฐ€ ๋”์ข‹๋‹ค๋กœ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ง“๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์–ด๋Š ์‹œ์‚ฌ/๊ต์–‘ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ์–ด์ฉ”์ˆ˜ ์—†๋Š” ์—ด๋ฆฐ๊ฒฐ๋ง๋กœ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ง€์„์ˆ˜๋ฐ–์— ์—†์„๊ฒƒ ๊ฐ™๋‹ค. (์–ด์ฐŒ๋ณด๋ฉด ์ด๊ฒŒ ์ •๋‹ต์ผ์ˆ˜๋„?) ๊ธฐ์ˆ ์˜ ์„ ํƒ์— ์žˆ์–ด์„œ ์ •๋‹ต์€ ์—†๋Š”๊ฒƒ ๊ฐ™๋‹ค.(๋ฌผ๋ก  Spring ์„ ์‚ฌ์šฉํ•˜๋Š๋ƒ ์„œ๋ธ”๋ฆฟ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š”๋ƒ ์™€๋Š” ์ข€ ๋‹ค๋ฅธ ์„ฑ๊ฒฉ์˜ ์ด์•ผ๊ธฐ;;) ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค์˜ ์ƒํ™ฉ์„ ์ž˜ ์•Œ๊ณ  ํŠœ๋‹์„ ํ•ด๊ฐ€๋ฉด์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ๊ฒƒ์„ ์„ ํƒํ•˜๋Š”๊ฒŒ ์ •๋‹ต์ด๋ผ๊ณ  ๋งํ• ์ˆ˜ ๋ฐ–์—… ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒŒ์›Œ๋ฅผ ๋ฌด์‹œ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— Apache๋ฅผ ์„ ํƒํ• ์ˆ˜๋„ ์žˆ์„ํ…Œ๊ณ , ์ ์  ๊ด€์‹ฌ๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค๋Š”๊ฑด ๊ทธ๋งŒํผ์˜ ์žฅ์ ์ด ์žˆ๊ณ  ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋™์ ‘์ž ์ฒ˜๋ฆฌ์‹œ ํšจ์œจ์ ์ธ Nginx๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค. ์ •๋ฆฌํ•˜๋ฉด. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ์–ด๋ ค์›€์ด ์—†๋Š” ๋„๊ตฌ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š”๊ฒƒ, ๊ทธ๋ ‡๋‹ค๊ณ  ์˜ค๋ž˜๋œ ๊ธฐ์ˆ ์ด ํŽธํ•œ๋‹ค๊ณ  ์ง‘์ฐฉํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋‘๋ ค์›Œ ํ•˜์ง€๋ง๊ณ  ๊ฒฝํ—˜์„ ํ•ด๋ณธ ๋’ค์— ๊ฒฐ์ •์„ ํ• ๊ฒƒ ์ด๋ผ๊ณ  ๋‚ด๋ฆด์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค. (์–ด๋ ต๋‹ค…ใ… ใ… ) ์ฐธ๊ณ  ํฌ์ŠคํŒ… http://www.mukgee.com/?p=293 http://knot.tistory.com/88 http://tmondev.blog.me/220737182315 http://tmondev.blog.me/220731906490 http://urin79.com/blog/20654191 http://jaweb.tistory.com/entry/apache-%EC%99%80-Nginx-%EB%AD%90%EA%B0%80-%EC%A2%8B%EC%9D%80%EA%B1%B0%EC%95%BC

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ฏธ๋ž˜ ์˜ˆ์ธก ํ•˜๊ธฐ(Anomaly Detection)

๊ธ‰๋ณ€ํ•˜๋Š” ๋‚ ์”จ๋ฅผ ์˜ˆ์ธกํ•˜๋ ค๋ฉด ์–ด๋– ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ• ๊นŒ? ๋˜๋Š” ๋งˆํŠธ๋ฅผ ์šด์˜ํ•˜๋Š” ๋‹ด๋‹น์ž์ธ ๊ฒฝ์šฐ ๋งค์žฅ ์šด์˜์‹œ๊ฐ„์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋– ํ•œ ๊ธฐ์ค€์œผ๋กœ? ๋œจ๊ฑฐ์šด ๊ฐ์ž์ธ ๋น„ํŠธ์ฝ”์ธ ์‹œ์žฅ์—์„œ ์ˆ˜์ต์„ ์–ป์œผ๋ ค๋ฉด ์–ด๋–ค ์ •๋ณด๋“ค์ด ์žˆ์–ด์•ผ ๋ฌผ๋ฆฌ์ง€(?) ์•Š์„์ˆ˜ ์žˆ์„๊นŒ? ์œ„ ์งˆ๋ฌธ์— ๊ณตํ†ต๋œ ์ •๋‹ต์€ ์˜ˆ์ „ ๊ธฐ๋ก๋“ค์ธ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ ์”จ์˜ˆ์ธก์€ ๊ธฐ์ƒ์ฒญ์—์„œ ๊ณผ๊ฑฐ ๊ธฐ๋ก๋“ค์„ ๋ณด๊ณ  ๋น„๊ฐ€ ์˜ฌ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ( ๊ณผ๊ฑฐ ๋‚ ์”จ ์„œ๋น„์Šค๋ฅผ ๋‹ด๋‹นํ•ด๋ดค์ง€๋งŒ ๋‹จ์ˆœํžˆ ๊ณผ๊ฑฐ ๊ธฐ๋ก๋“ค๋กœ ์˜ˆ์ธกํ•œ๋‹ค๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๊ธด ํ•˜๋‹ค. ) ๋งค์žฅ ์šด์˜์‹œ๊ฐ„์€ ์˜ˆ์ „์— ์†๋‹˜๋“ค์ด ์–ธ์ œ์™”๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ . ๋น„ํŠธ์ฝ”์ธ์ด๋‚˜ ์ฃผ์‹์€ ์ฐจํŠธ๋ฅผ ๋ณด๊ณ  ์–ด๋Š์ •๋„๋Š” ์ƒ์Šน์žฅ์ผ์ง€ ํ•˜๋ฝ์žฅ์ผ์ง€ ์ถ”์ธก์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ( ๋ฌผ๋ก  ํ˜ธ์žฌ/์•…์žฌ์— ๋”ฐ๋ผ ํ”๋“ค๋ฆฌ์ง€๋งŒ..ใ… ใ… ..?? ) ์ด์ฒ˜๋Ÿผ ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋Š”๊ฒƒ์„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๋ถ„์„์ด๋ผ ๋ถ€๋ฅด๊ณ  ์žˆ๋‹ค. ํ•„์ž๊ฐ€ ์šด์˜ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ†ตํ•ด ์žฅ์• ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ์‚ฌ๋ก€๋ฅผ ๊ณต์œ  ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ƒํ™ฉํŒŒ์•…๋ถ€ํ„ฐ ์†์ž๋ณ‘๋ฒ•์—๋Š” ์ง€ํ”ผ์ง€๊ธฐ ๋ฐฑ์ „๋ถˆํƒœ ๋ผ๋Š” ๋ง์ด ์žˆ๋‹ค. ๊ทธ๋งŒํผ ํ˜„ ์ƒํ™ฉ์„ ์ž˜ ์•Œ์•„์•ผ ๋Œ€์‘์„ ์ž˜ํ• ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ. ํ•„์ž๊ฐ€ ์šด์˜ํ•˜๋Š” ์„œ๋น„์Šค๋Š” PG(Payment Gateway) ์„œ๋น„์Šค๋กœ ์‡ผํ•‘๋ชฐ๊ฐ™์€ ์˜จ/์˜คํ”„๋ผ์ธ ์‚ฌ์—…์ž์™€ ์‹ค์ œ ์นด๋“œ์‚ฌ์™€์˜ ์ค‘๊ฐ„ ์—ญํ™œ์„ ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์ˆ˜๋ฅผ 10,000์›์— XX์นด๋“œ๋กœ ๊ตฌ๋งคํ•ด์ค˜ ๋ผ๊ณ  ์š”์ฒญ์ด ์˜ค๋ฉด ๊ทธ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ˜•์‹์— ๋งž์ถฐ ์นด๋“œ์‚ฌ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. PG์„œ๋น„์Šค : ์‡ผํ•‘๋ชฐ๊ณผ ์นด๋“œ์‚ฌ์˜ ์ค‘๊ฐ„์—์„œ ๋ฆด๋ ˆ์ด ํ•ด์ฃผ๋Š” ์—ญํ™œ์ด๋ผ ๋ณด๋ฉด๋œ๋‹ค." PG์„œ๋น„์Šค : ์‡ผํ•‘๋ชฐ๊ณผ ์นด๋“œ์‚ฌ์˜ ์ค‘๊ฐ„์—์„œ ๋ฆด๋ ˆ์ด ํ•ด์ฃผ๋Š” ์—ญํ™œ์ด๋ผ ๋ณด๋ฉด๋œ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•ด๋ณด๋‹ˆ ๊ฐ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์—ฐ๋™ํ•˜๋Š” ์‡ผํ•‘๋ชฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊ฒฝ์šฐ ์ฆ‰, ํŠธ๋ž˜ํ”ฝ์ด ํ‰์†Œ๋ณด๋‹ค ์ ๊ฒŒ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ์ •์ƒ์ ์ธ ์—๋Ÿฌ(e.g. ์ž”์•ก๋ถ€์กฑ) ๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋งŽ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๋ถ„์„ํ•˜๊ธฐ์œ„ํ•ด ๊ธฐ์กด์˜ ํŠธ๋ž˜ํ”ฝ/๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด๋ด์•ผ ํ–ˆ๋‹ค. ๊ฒฐ์ œ๊ฑด์ˆ˜ Kibana Visualize, ๊ธฐ์˜์ด ํŒจํ„ด" ๊ฒฐ์ œ๊ฑด์ˆ˜ Kibana Visualize, ๊ธฐ์˜์ด ํŒจํ„ด ์œ„ ๊ทธ๋ž˜ํ”„๋Š” ๊ฒฐ์ œ๋ฐ์ดํ„ฐ ์นด์šดํŠธ ์ธ๋ฐ ์–ด๋Š์ •๋„ ํŒจํ„ด์„ ์ฐพ์„์ˆ˜ ์žˆ๋‹ค. ์—๋Ÿฌ๊ฑด์ˆ˜ Kibana Visualize, ์•…์–ด ํŒจํ„ด..(๋ฌด๋ฆฌ์ˆ˜..)" ์—๋Ÿฌ๊ฑด์ˆ˜ Kibana Visualize, ์•…์–ด ํŒจํ„ด..(๋ฌด๋ฆฌ์ˆ˜..) ์œ„ ๊ทธ๋ž˜ํ”„๋Š” ์—๋Ÿฌ์นด์šดํŠธ ์ธ๋ฐ ์ผ์ •ํ•œ ํŒจํ„ด ์†์—์„œ ์–ด๋Š ์ง€์ ์—์„œ๋Š” ํŠ€๋Š”๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค. (๋นจ๊ฐ„์ƒ‰ ์˜์—ญ) ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์žฅ์• ์ƒํ™ฉ๋ณด๋‹ค ์•ž์„œ์„œ ๊ฐ์ง€๋ฅผ ํ• ์ˆ˜ ์žˆ์„๊นŒ? ( ์žฅ์•  : ์–ด๋– ํ•œ ๋‚ด/์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด ์ •์ƒ์ ์ธ ์„œ๋น„์Šค๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ ) ์žฅ์• ๋ฐœ์ƒ ์ „์— ๋จผ์ € ์ฐพ์•„๋ณด์ž! ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋กœ๋“ค์–ด ์ž์ • ์ฆˆ์Œ์—๋Š” ๊ฒฐ์ œ๋Ÿ‰์ด ๊ฐ€์žฅ ๋งŽ๊ธฐ๋•Œ๋ฌธ์— ์•ฝ xx๊ฑด์œผ๋กœ ์„ค์ •ํ•ด๋‘๊ณ , ์ƒˆ๋ฒฝ์—๋Š” ๊ฒฐ์ œ๋Ÿ‰์ด ๊ฐ€์žฅ ์ ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ yy๊ฑด์œผ๋กœ ์„ค์ •ํ•ด๋‘” ํ›„ ์—๋Ÿฌ ๊ฑด์ˆ˜๋‚˜ ๊ฒฐ์ œ๊ฑด์ˆ˜์— ๋Œ€ํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์‚ฌ๋ฅผ ํ•ด๊ฐ€๋ฉด์„œ ์„ค์ •ํ•œ ๊ฐ’๋ณด๋‹ค ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ ์•Œ๋ฆผ์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ฌด๋ฆฌ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„์„ํ–ˆ๋‹ค ํ• ์ง€๋ผ๋„ 24์‹œ๊ฐ„ ๋ชจ๋“  ์‹œ์ ์—์„œ ์˜ˆ์ธก์€ ๋ฒ—์–ด๋‚  ์ˆ˜๋ฐ–์— ์—†๋‹ค. (์˜ˆ๋กœ๋“ค์–ด ์‡ผํ•‘ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ฒŒ ํ•˜๊ฒŒ๋˜๋ฉด ๊ฒฐ์ œ๋Ÿ‰์€ ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ• ์ •๋„๋กœ ๋Š˜์–ด๋‚ ํ…Œ๊ณ …) ๋˜ํ•œ ์„ค์ •ํ•œ ์˜ˆ์ธก๊ฐ’์„ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์˜ˆ์ธก๊ฐ’์„ ์กฐ์ •ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿด๊บผ๋ฉด 24์‹œ๊ฐ„ ์ข…ํ•ฉ ์ƒํ™ฉ์‹ค์—์„œ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ˆˆ์œผ๋กœ ๋ณด๋Š”๊ฒƒ ๋ณด๋‹ค ๋ชปํ• ๊ฒƒ ๊ฐ™๋‹ค. (์ธ๋ ฅ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ๋ญ… ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ๋œ๋‹ค.) ์ง€๋‚œ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•˜๊ธฐ ์ผ์ฃผ์ผ ๊ธฐ์ค€์œผ๋กœ ์ง€๋‚œ ์ผ์ฃผ์ผ๊ณผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•๋˜ํ•œ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์ด๋ฒˆ์ฃผ ์›”์š”์ผ 10์‹œ์˜ ๋ฐ์ดํ„ฐ์™€ ์ง€๋‚œ์ฃผ ์›”์š”์ผ 10์‹œ์˜ ๋ฐ์ดํ„ฐ์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ‚ค๋ฐ”๋‚˜์—์„œ ํด๋ฆญ ๋ช‡๋ฒˆ๋งŒ์œผ๋กœ ์‹œ๊ฐํ™”๋ฅผ ๋„์™€์ฃผ๋Š” Visualize ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ง€๋‚œ ์ผ์ฃผ์ผ๊ณผ ์ด๋ฒˆ์ฃผ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด ์•„๋ž˜ ๊ทธ๋ž˜ํ”„์ฒ˜๋Ÿผ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ผ์ฃผ์ผ ์ „ ๋ฐ์ดํ„ฐ์™€ ๋‹จ์ˆœ ๋น„๊ต" ์ผ์ฃผ์ผ ์ „ ๋ฐ์ดํ„ฐ์™€ ๋‹จ์ˆœ ๋น„๊ต ์ด ๊ฒฝ์šฐ๋„ ์ง€๋‚œ์ฃผ ์ƒํ™ฉ๊ณผ ์ด๋ฒˆ์ฃผ ์ƒํ™ฉ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์›ํ•˜๋Š” ๋น„๊ต ํ•ญ๋ชฉ ์™ธ์— ๋‹ค๋ฅธ ์š”์ธ์ด ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๋น„๊ต๋ฅผ ํ• ์ˆ˜๊ฐ€ ์—†๊ณ  ์œ„์—์„œ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ณ„๋ฐ˜ ๋‹ค๋ฅผ๋ฐ” ์—†์„๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ์กฐ๊ธˆ๋” ์šฐ์•„ํ•˜๊ฒŒ! (์–ธ์ œ๋ถ€ํ„ด๊ฐ€ ์šฐ์•„ํ•˜๋‹จ ๋ง์„ ์ข‹์•„ํ•˜๋Š”๊ฒƒ ๊ฐ™๋‹ค..) ๊ฐœ๋ฐœ์ž๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ์–ธ์ œ๋‚˜ ๋ถ„์„์„ ํ† ๋Œ€๋กœ ์ ‘๊ทผ์„ ํ•˜๋Š”๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผํ•œ๋‹ค. ์–ธ์ œ๋ถ€ํ„ด๊ฐ€ Hotํ•œ ๋จธ์‹ ๋Ÿฌ๋‹์„ ๋„์ž…ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ์•„์ง ๊ทธ๋Ÿฐ ์‹ค๋ ฅ์ด ๋˜์งˆ ๋ชปํ•˜๊ณ … ํญํ’ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์•Œ๊ฒŒ๋œ Facebook์—์„œ ๋งŒ๋“  Prophet์ด๋ผ๋Š” ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. https://opensource.fb.com/#artificial ์ด๊ณณ์— ๊ฐ€๋ณด๋ฉด ์—ฌ๋Ÿฌ Artificial Intelligence ๊ด€๋ จ๋œ ์˜คํ”ˆ์†Œ์Šค๋“ค์ค‘์— Prophet ๋ชจ๋“ˆ์„ ์ฐพ์„์ˆ˜ ์žˆ๋‹ค.

์•„ํŒŒ์น˜ ์—‘์„ธ์Šค ๋กœ๊ทธ์— 408์ฝ”๋“œ๊ฐ€?

์˜ˆ์ „์— ์•„ํŒŒ์น˜ ๋กœ๊ทธ๋ฅผ ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ๋‚ด ์„œ๋ฒ„์— ๋ˆ„๊ฐ€ ๋“ค์–ด์˜ค๋Š”์ง€๋ฅผ ํ™•์ธํ• ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ์„ ํ•ด๋‘๊ณ  ๋ช‡์ผ๊ฐ„ ์ง€์ผœ๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—‘์„ธ์Šค ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.1.2.3.4 - - [26/Apr/2018:01:27:33 +0900] "GET /aaa/ HTTP/1.1" 200 6001 30788 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 28 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 12 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:50 +0900] "GET /aaa/ HTTP/1.1" 200 5999 13521 "http://www.naver.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:14 +0900] "GET /aaa/ HTTP/1.1" 200 5996 19437 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:15 +0900] "GET /aaa/ HTTP/1.1" 200 5997 17553 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:15 +0900] "GET /aaa/ HTTP/1.1" 200 5998 17429 "http://www.naver.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 32 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 38 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 29 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:30:54 +0900] "GET /aaa/ HTTP/1.1" 200 6000 17881 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 25 "-" "-" ํ•œ์‹œ๊ฐ„์— ๋งŒ๊ฑด์ด์ƒ ์‘๋‹ต์ฝ”๋“œ๋Š” 408, referrer๋„ ์—†๊ณ , useragent๋„ ์—†๋Š”, ip๋“ค๋„ ๋งค์šฐ ๋‹ค์–‘ํ•œ ์ด์ƒํ•œ ๋…€์„๋“ค์ด ์š”์ฒญ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์—‘์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ• ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์„ ํ•ด๋‘๊ณ  ๋‚˜๋‹ˆ ๋ณด์˜€์ง€ ์•ˆ๊ทธ๋žฌ์Œ ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ”์„ ํ„ฐ.. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค๋ฐ”๋‚˜์—์„œ ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณผ์ˆ˜์žˆ๋Š”๋ฐ ํ•œ๋ˆˆ์— ๋ด๋„ ๊ณผ์—ฐ ์˜๋ฏธ์žˆ๋Š” ์š”์ฒญ๋“ค์ผ๊นŒ? ํ•˜๋Š” ์˜๊ตฌ์‹ฌ์ด ๋“ค์ •๋„์ด๋‹ค. (1์‹œ๊ฐ„ ์•„ํŒŒ์น˜ ์—‘์„ธ์Šค ๋กœ๊ทธ) ์ฃผํ™ฉ์ƒ‰์ด 408์‘๋‹ต" ์ฃผํ™ฉ์ƒ‰์ด 408์‘๋‹ต ๊ทธ๋Ÿผ ์ด๋Ÿฐ ํ˜ธ์ถœ๋“ค์€ ๋„๋Œ€์ฒด ๋ญ˜๊นŒ? ์ฒœ์ฒœํžˆ ์ƒ๊ฐ์ข€ ํ•ด๋ณด์ž. ์ •์ƒ์ ์ด์ง€ ์•Š๋Š” ํ˜ธ์ถœ๋กœ ์šฐ๋ฆฌ ์„œ๋ฒ„์˜ ์ทจ์•ฝ์ ์„ ํŒŒ์•…ํ•˜๋ ค ํ•˜๋Š”๊ฒƒ๋“ค์ผ๊นŒ? ์‘๋‹ต์ฝ”๋“œ 408์€ ์š”์ฒญ์‹œ๊ฐ„์ดˆ๊ณผ ์‘๋‹ต์ฝ”๋“œ์ธ๋ฐ… ์˜คํžˆ๋ ค ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๊ฑด ์•„๋‹๊นŒ? ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ์ž˜๋ชป๋˜์–ด ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์กŒ๋‚˜; ์œ„ํ‚ค๋ฐฑ๊ณผ์—์„œ๋Š” ์•„ํŒŒ์น˜ ์‘๋‹ต์ฝ”๋“œ ์ค‘ 408์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. The server timed out waiting for the request. According to HTTP specifications: “The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time ์ฆ‰, ์•„ํŒŒ์น˜ ๋‹จ์—์„œ ํƒ€์ž„์•„์›ƒ์„ ๋‚ด๋ฒ„๋ฆฌ๋Š” ์ƒํ™ฉ. ์—ฌ๋Ÿฌ ๋‹ค์–‘ํ•œ ํ‚ค์›Œ๋“œ๋“ค๋กœ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ์ด๋ ‡๋‹คํ•  ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ๊ด€๋ จ์ƒํ™ฉ์ธ์ง€ ์‹ถ์–ด ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋ฅผ ์—ด์–ด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜์œผ๋‚˜ ๋ณ„ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ฒ”์ธ์ฐพ๋Š” ํ˜•์‚ฌ์˜ ์‹ฌ์ •์œผ๋กœ ์ด๊ฒƒ์ €๊ฒƒ ์•Œ์•„๋ณด๋‹ค ์šฐ์—ฐํžˆ ์ง‘์—์„œ ์›๊ฒฉ์œผ๋กœ ํšŒ์‚ฌ VPN ๋ถ™์–ด์„œ ํ…Œ์ŠคํŠธ ํ•˜๋˜๋„์ค‘ ๊ด€๋ จ ์ฆ์ƒ์„ ์žฌํ˜„ ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. # ์žฌํ˜„์ƒํ™ฉ ์šฐ์„  ์•„ํŒŒ์น˜๋ฒ„์ „์€ 2.2์ด๊ณ  KeepAlive Off๊ฐ€ ๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ. ์•„๋ž˜๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ง‘PC - ๊ณต์œ ๊ธฐ - VPN - Apache - tomcat jenkins ์ƒํ™ฉ์ด์˜€๋Š”๋ฐ ์  ํ‚จ์Šค์— ํ•œ๋ฒˆ ์ ‘์†ํ›„์—๋Š” ํ•ญ์ƒ 408 ์‘๋‹ต์ด ์ฃผ๋ฃจ๋ฃฉ(?

๋‚ด ์„œ๋ฒ„์—๋Š” ๋ˆ„๊ฐ€ ๋“ค์–ด์˜ค๋Š”๊ฑธ๊นŒ? (์‹ค์‹œ๊ฐ„ user-agent ๋ถ„์„๊ธฐ)

Desktop ๋ฐ ์Šค๋งˆํŠธํฐ์˜ ๋Œ€์ค‘ํ™”๋กœ ๋‹ค์–‘ํ•œ OS์™€ ๋ธŒ๋ผ์šฐ์ €๋“ค์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋•Œ, ๋‚ด๊ฐ€ ์šด์˜ํ•˜๋Š” ์›น์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์Šจ ๊ธฐ๊ธฐ๋กœ ์ ‘์†์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ํ˜น์—ฌ ํŠน์ • OS์˜ ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด ๋ช‡์ผ๋ฐค์„ ๊ณ ์ƒํ•˜๋ฉฐ ๊ฒจ์šฐ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ… ๊ณผ์—ฐ ๊ทธ OS์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ ‘์†์€ ํ•˜๊ธฐ๋‚˜ ํ•˜๋Š”๊ฑธ๊นŒ? (ใ… ใ… ) ๋งŒ์•ฝ, ์ ‘์† ์‚ฌ์šฉ์ž์˜ Device ์ •๋ณด๋ฅผ ์•Œ๊ณ ์žˆ๋‹ค๋ฉด ๊ณ ์ƒํ•˜๋ฉฐ ๋ฒ„๊ทธ๋ฅผ ์žก๊ธฐ ์ „์— ๋จผ์ € ํ•ด๋‹น Device ์‚ฌ์šฉ์œจ์„ ์ฒดํฌํ•ด ๋ณผ์ˆ˜๋„ ์žˆ๊ณ (์ˆ˜์ •์ด ์•„๋‹Œ ๊ฐ„๋‹จํ•œ ์–ผ๋Ÿฟ์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค๊ฑฐ๋‚˜?) ๋น„์ง€๋‹ˆ์Šค ๋ชจ๋ธ๊นŒ์ง€ ์ƒ๊ฐํ•ด์•ผํ•˜๋Š” ์„œ๋น„์Šค๋ผ๋ฉด ํƒ€๊ฒŸํŒ…์„ ์ •ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ํ™œ์šฉ๋„๊ฐ€ ๋†’์€ ๊ฒƒ์ด ๋ฐ”๋กœ User-Agent๋ผ๊ณ  ํ•œ๋‹ค(์ดํ•˜ UA). ์ผ๋ฐ˜ Apache ๋ฅผ ์›น์„œ๋ฒ„๋กœ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๋ถ„์„์„ ํ• ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถ„์„์„ ํ•˜๋ฉฐ ์ข€๋” ์šฐ์•„ํ•œ(?) ๋ฐฉ๋ฒ•์€ ์—†๋Š”์ง€ ์•Œ์•„ ๋ณด๊ณ ์ž ํ•œ๋‹ค. User-Agent๊ฐ€ ๋ญ์•ผ? ๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผํƒ€(?)๋ผ ํ–ˆ๋˜๊ฐ€, ์šฐ์„  http://www.useragentstring.com ๋ฅผ ๋“ค์–ด๊ฐ€๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ž์‹ ์˜ OS ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๋“ฑ ์ •๋ณด๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ์œ„ํ‚ค๋ฐฑ๊ณผ์— ๋”ฐ๋ฅด๋ฉด ‘์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—์ด์ „ํŠธ’๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, UA๋งŒ ์•Œ์•„๋„ ์–ด๋–ค ๊ธฐ๊ธฐ/๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ. mozilla์— ๊ฐ€๋ณด๋ฉด ์ŠคํŒฉ ๋“ฑ ๋‹ค์–‘ํ•œ UA๋ฅผ ๋ณผ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ํŠนํžˆ ๋งจ ์•„๋ž˜๋ณด๋ฉด ๊ธฐ๊ธฐ/๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ์ง€์›์ •๋ณด๊ฐ€ ๋‚˜์™€์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ๋ณด๋ฉด ๋ชจ๋“  ๋ชจ๋ฐ”์ผ ์‚ผ์„ฑ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ „๋ถ€ ์ง€์›์ด ๋˜๋Š”๊ฑธ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค. ์ถœ์ฒ˜ : developer.mozilla.org" ์ถœ์ฒ˜ : developer.mozilla.org ๊ธฐ์กด์˜ ๋ฐฉ๋ฒ• ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ๋‚ด ์„œ๋ฒ„์— ๋“ค์–ด์˜จ ์‚ฌ์šฉ์ž๋“ค์˜ UA๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊นŒ? (์•ž์„œ Apache๋ฅผ ์›น์„œ๋ฒ„๋กœ ์šด์˜ํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ) Apache access log ์—๋Š” Apache์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๊ฐ€ ๋‚จ๊ฒจ์ง€๊ณค ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด access log๋ฅผ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด๋“  ์—‘์…€๋กœ ๋ฝ‘์•„์„œ๋“ ์ง€ ํ™œ์šฉํ•ด์„œ ์ •๊ทœ์‹์œผ๋กœ ํฌ๋งทํŒ… ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฃนํ™” ์‹œํ‚ค๋ฉด ์–ผ์ถ” ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด ๋‚ผ์ˆ˜ ์žˆ๋‹ค. ( ๋ฒ„๊ฑฐํ˜•๋“ค์ด ๋งŒ๋“ค์–ด๋‘” ์ •๊ทœ์‹์„ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค. https://regexr.com/?37l4e ) ํ•˜์ง€๋งŒ, ์šฐ์„  ์ž๋™ํ™”๊ฐ€ ์•ˆ๋˜์–ด์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ์„๋•Œ๋งˆ๋‹ค ๊ท€์ฐจ๋‹ˆ์ฆ˜์— ๊ฑธ๋ฆด์ˆ˜ ์žˆ๊ณ  ์Šˆํผ ๊ฐœ๋ฐœ์ž ํŒŒ์›Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ(?) ๋ฐ์ดํ„ฐ ์ถ”์ถœ์„ ์ž๋™ํ™” ํ•œ๋“ค ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด๊ณ ์‹ถ์„๋• ์ œํ•œ์‚ฌํ•ญ์ด ๋งŽ๋‹ค. ์ข€๋” ๋‚˜์€ ๋ฐฉ๋ฒ•(?) ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š”๋ฐ์—๋Š” ๋‹ค์–‘ํ•œ ์˜คํ”ˆ์†Œ์Šค์™€ ๋‹ค์–‘ํ•œ ํˆด์ด ์žˆ๊ฒ ์ง€๋งŒ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ๊ฑด์ง€ ์•„์ง๊นŒ์ง„ ElasticStack ๋งŒํ•œ๊ฑธ ๋ชป๋ณธ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•˜๋ฉด access log ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  front๋‹จ์—์„œ javascript ๋กœ UA๋ฅผ ๊ตฌํ•œ๋‹ค์Œ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์„์ˆ˜ ์žˆ๋Š” API๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ์ชฝ์œผ๋กœ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„์—์„œ ํ•ด๋‹น UA๋ฅผ ๋ถ„์„ํ•ด์„œ ์นดํ”„์นด๋กœ ๋ณด๋‚ด๊ณ  ..!@#$%^blabla… ^^; ๊ทธ๋ฆผ์œผ๋กœ ๋ณด์ž. ์ข€๋” ๋‚˜์€ ๋ฐฉ๋ฒ•" ์ข€๋” ๋‚˜์€ ๋ฐฉ๋ฒ• front๋‹จ์—์„œ๋Š” navigator.userAgent๋ฅผ ํ™œ์šฉํ•˜์—ฌ UA๋ฅผ ๊ตฌํ• ์ˆ˜ ์žˆ์—ˆ๊ณ , API์—์„œ๋Š” UA๋ฅผ ๋ฐ›๊ณ  ํŒŒ์‹ฑ์„ ํ•˜๋Š”๋ฐ ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค. private static final String VERSION_SEPARATOR = "."; private void userAgentParsingToMap(String userAgent, Map<String, Object> dataMap) { HashMap browser = Browser.lookup(userAgent); HashMap os = OS.lookup(userAgent); HashMap device = Device.lookup(userAgent); dataMap.put("browserName", browser.get("family")); dataMap.put("browserVersion", getVersion(browser)); dataMap.put("osName", os.get("family")); dataMap.put("osVersion", getVersion(os)); dataMap.put("deviceModel", device.get("model")); dataMap.put("deviceBrand", device.get("brand")); } private String getVersion(HashMap dataMap) { String majorVersion = (String)dataMap.get("major"); if (StringUtils.isEmpty(majorVersion)) { return StringUtils.EMPTY; } String minorVersion = (String)dataMap.get("minor"); String pathVersion = (String)dataMap.get("path"); StringBuffer sb = new StringBuffer(); sb.append(majorVersion); if (!StringUtils.isEmpty(minorVersion)) { sb.append(VERSION_SEPARATOR); sb.append(minorVersion); } if (!StringUtils.isEmpty(pathVersion)) { sb.append(VERSION_SEPARATOR); sb.append(pathVersion); } return sb.toString(); } ์ฐธ๊ณ ๋กœ Java๋‹จ์—์„œ UA๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” parser๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘ uap_clj๋ผ๋Š” ๋ชจ๋“ˆ์ด ๊ทธ๋‚˜๋งˆ ์ž˜ ํŒŒ์‹ฑ์ด ๋˜์–ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ชจ๋“ˆ๋ณ„ ๋น„๊ต ๋ชจ๋“ˆ Browser OS Device eu.bitwalker.useragentutils.UserAgent O ๋ถˆ๋ช…ํ™•ํ•จ (Android 5.x) X net.sf.uadetector.UserAgentStringParser O O ๋ถˆ๋ช…ํ™•ํ•จ (Smartphone) uap_clj.java.api.* O O O Parsing ๋น„๊ต UA "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" ๊ฒฐ๊ณผ - Browser : {patch=3239, family=Chrome Mobile, major=63, minor=0} - OS : {patch=1, patch_minor=, family=Android, major=5, minor=1} - Device : {model=Nexus 6, family=Nexus 6, brand=Generic_Android} ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•˜๋ฉด Elasticsearch์— ์ธ๋ฑ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Kibana์—์„œ ์ž…๋ง›์— ๋งž๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณผ์ˆ˜์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!

gzip ์„ค์ •์œผ๋กœ ์†๋„๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ!

๋‚ด๊ฐ€ ์šด์˜์ค‘์ธ ์›น์„œ๋น„์Šค์˜ ์‘๋‹ต์†๋„๋ฅผ ๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ? ์›น ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ž๋‹จ์— ์›น์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ๊ทธ๋’ค์— WAS๋ฅผ ๋‘๋Š” ์„ค๊ณ„๋ฅผ ํ•˜๊ณค ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์›น์„œ๋ฒ„๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ Apache๋‚˜ Nginx๊ฐ€ ์žˆ๊ณ  WAS๋Š” tomcat์ด๋‚˜ ๊ธฐํƒ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋‘๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์•ž๋‹จ์˜ ์›น์„œ๋ฒ„(Apache)์˜ ์„ค์ •์œผ๋กœ ์‘๋‹ต์†๋„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ณด๊ณ ์ž ํ•œ๋‹ค. ์›นํŽ˜์ด์ง€์˜ ์‘๋‹ต์†๋„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ‘์ผ๋ฐ˜์ ์ธ’๋ฐฉ๋ฒ•๋“ค ๊ผญ ์„œ๋ฒ„์˜ ์„ค์ •๋“ค์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ์›นํŽ˜์ด์ง€์˜ ์‘๋‹ต์†๋„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์„ค์ •ํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์œ„์— ์„ ์–ธํ•˜๊ฑฐ๋‚˜ java script๋Š” ์ฝ”๋“œ ์•„๋ž˜๋ถ€๋ถ„์— ๋„ฃ๋Š”๊ฒƒ๋งŒ์œผ๋กœ๋„ ์–ด๋Š์ •๋„ ์‘๋‹ต์†๋„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. (์‚ฌ์กฑ) ์‹ ์ž…์‹œ์ ˆ ํšŒ์‚ฌ ๋Œ€ํ‘œ๋‹˜์ด ํ•„์ˆ˜๋กœ ์ฝ์–ด๋ณด๋ผ๊ณ  ์ „ ์ง์›๋“ค์—๊ฒŒ ์„ ๋ฌผํ•ด์ฃผ์…จ๋˜ ์›น์‚ฌ์ดํŠธ ์ตœ์ ํ™”๊ธฐ๋ฒ• (์Šคํ‹ฐ๋ธŒ ์‚ฌ์šฐ๋”์Šค ์ €)์ด ์ƒ๊ฐ์ด ๋‚œ๋‹ค. ๋ชจ๋‘ ์‚ฌ์ฃผ๋ ค๋ฉด ๋ˆ์ด ์–ผ๋งˆ์•ผ… ๊ทธ๋งŒํผ ์›น๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ค‘์š”ํ•˜๋ฉด์„œ๋„ ํ•œํŽธ์œผ๋กœ๋Š” ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ถ€๋ถ„๋“ค์ด๋‹ˆ ํ•œ๋ฒˆ์ฏค ๋ชฉ์ฐจ๋ผ๋„ ์ฝ์–ด๋ณด๋Š”๊ฒŒ ์ข‹์„๋“ฏ ํ•˜๋‹ค. ์‚ฌ์‹ค ์ด ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•˜๊ฒŒ๋œ ๊ฐ€์žฅ ํฐ ๊ณ„๊ธฐ๋Š” ์–ผ๋งˆ์ „ ์‚ฌ๋‚ด ํ•ด์ปคํ†ค์„ ํ•˜๋ฉด์„œ ๊ฒฝํ—˜ํ•œ ๋ถ€๋ถ„ ๋•Œ๋ฌธ์ด๋‹ค. ( + ๋“ค์–ด๋งŒ ๋ดค์ง€ ์‹ค์ œ๋กœ ํ•ด๋ณด์ง€๋Š” ์•Š์•„์„œ… ) ์„œ๋ฒ„์—์„œ node(React)๋ฅผ ๋„์šฐ๊ณ  ๊ทธ ์•ž๋‹จ์— Apache๋กœ ๋‹จ์ˆœ Port Redirect ( 80 โ†’ 3000 ) ์‹œ์ผœ์ฃผ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ react ์—์„œ ์‚ฌ์šฉํ•˜๋Š” bundle.js์˜ ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋ณด๋‹ˆ ์ตœ์ดˆ ํŽ˜์ด์ง€ ์ ‘๊ทผ์‹œ ๋กœ๋”ฉ์‹œ๊ฐ„์ด 5์ดˆ ์ด์ƒ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค. bundle.js๋ฅผ ์ค„์—ฌ๋ณด๋Š”๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€ ๊ฒฐ๊ตญ Apache ์„ค์ •์„ ํ†ตํ•ด 1์ดˆ ์ด๋‚ด๋กœ ์ค„์ผ์ˆ˜ ์žˆ์—ˆ๋‹ค. gzip ์šฐ์„  gzip์ด๋ž€ ํŒŒ์ผ ์••์ถ•์— ์“ฐ์ด๋Š” ์‘์šฉ ์†Œํ”„ํŠธ์›จ์–ด๋กœ GNU zip์˜ ์ค€๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค. (์ฐธ๊ณ  : ์œ„ํ‚ค๋ฐฑ๊ณผ Gzip) ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›์„ ํ•ด์•ผํ•˜๋Š”๋ฐ https://caniuse.com/#search=gzip ์„ ๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜๋Š”๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ทธ๋Ÿผ gzip ์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ์˜ ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ? ์šฐ์„  Request/Response Flow ๋ฅผ ์ž ๊น ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. gzip ์‚ฌ์šฉ ์ „ ์ถœ์ฒ˜ : betterexplained.com" ์ถœ์ฒ˜ : betterexplained.com ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์ธก์— /index.html์„ ์š”์ฒญํ•œ๋‹ค. ์„œ๋ฒ„๋Š” Request๋ฅผ ํ•ด์„ํ•œ๋‹ค. Response์— ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค. Response๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์—ฌ์ค€๋‹ค. (100kb) gzip ์‚ฌ์šฉ ํ›„ ์ถœ์ฒ˜ : betterexplained.com" ์ถœ์ฒ˜ : betterexplained.com ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์ธก์— /index.html์„ ์š”์ฒญํ•œ๋‹ค. ์„œ๋ฒ„๋Š” Request๋ฅผ ํ•ด์„ํ•œ๋‹ค. Response์— ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ์••์ถ•ํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค. Response header์— ์••์ถ•์ด ๋˜์–ด์žˆ๋‹ค๋Š” ์ •๋ณด๋ฅผ ํ™•์ธํ›„ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฐ›๊ณ (10kb), ์••์ถ•์„ ํ•ด์ œํ•œ ํ›„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค. ์ •๋ฆฌํ•˜๋ฉด, gzip์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๋Š” Client์—๊ฒŒ ๋ณด๋‚ผ Response๋ฅผ ์••์ถ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ์ค„์ผ์ˆ˜ ์žˆ์–ด ์‘๋‹ต์†๋„๊ฐ€ ๋น ๋ฅธ ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ๋ฌผ๋ก  ๋ฌด์กฐ๊ฑด ์ข‹์€ (๋งˆ์น˜ show me the money ๊ฐ™์€)์ •๋‹ต์€ ์—†๋‹ค. ์„œ๋ฒ„์—์„œ ์••์ถ•์„ ํ•˜์—ฌ Client์—๊ฒŒ ๋ณด๋‚ด๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์••์ถ•์„ ํ•ด์ œํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” cpu๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์˜คํžˆ๋ ค ๋žœ๋”๋ง ํ•˜๋Š” ๊ณผ์ •์ด ๋Š๋ ค์งˆ์ˆ˜ ์žˆ์–ด ์ž์นซ ์‘๋‹ต์†๋„๋Š” ๋นจ๋ผ์กŒ๋‹ค ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž ์ฒด๊ฐ์ƒ ๋” ๋Š๋ ค์ง„๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์งˆ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ™ฉ์— ๋งž์ถฐ gzip์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊ฒƒ์ธ์ง€ ๋ง๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋งˆ์น˜๋ฉฐ ํ•™๋ถ€์‹œ์ ˆ ๋˜๋Š” ์‹ ์ž…์‹œ์ ˆ, ์•„ํŒŒ์น˜๋Š” ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ํ†ฐ์ผ“์€ ์„œ๋ธ”๋ฆฟ ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ์ฃผ๋ฌธ์„ ์™ธ์šฐ๋“ฏ ํ•˜์˜€์ง€๋งŒ, ์›น์„œ๋ฒ„์—์„œ ์••์ถ•์„ ํ•˜๋ฉด ์–ด๋–ค ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•ด๋ณด๋Š”๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฒƒ ๊ฐ™๋‹ค. ์ ์šฉ ๋ฐฉ๋ฒ•์€ ๋ณต๋ถ™ํ•˜๋Š” ๋Š๋‚Œ์ด๋ผ ์•„ํŒŒ์น˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋งํฌ ํ•˜๋Š”๊ฒƒ์œผ๋กœ ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ฒ ๋‹ค. Apache Document (์‚ฌ์šฉ๋ฒ•) : https://httpd.apache.org/docs/2.2/ko/mod/mod_deflate.html ์ ์šฉ ํ…Œ์ŠคํŠธ ์‚ฌ์ดํŠธ https://developers.google.com/speed/pagespeed/insights http://www.whatsmyip.org/http-compression-test

RestClientException ์ฒ˜๋ฆฌ

Spring ํ™˜๊ฒฝ์—์„œ (Spring5๋Š” ๋‹ฌ๋ผ์กŒ์ง€๋งŒ…) ์™ธ๋ถ€ API๋กœ์˜ ํ˜ธ์ถœ์„ ํ• ๋•Œ ์ž์ฃผ ์“ฐ์ด๋Š” RestTemplate. ์ด๋•Œ request์— ๋Œ€ํ•ด ์ •์ƒ์ ์ธ ์‘๋‹ต์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? ๋ง‰์—ฐํ•˜๊ฒŒ ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด Http Status Code๋ฅผ ๋ฐ›์•„์„œ ํŒ๋ณ„์„ ํ•˜๋ฉด ๋˜์ง€๋งŒ Http Status Code๋งŒ ๋ด๋„ ์—„์ฒญ~๋งŽ๋‹ค. ( ์œ„ํ‚คํ”ผ๋””์•„ ์ฐธ๊ณ  : https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ) if~else ๋กœ ๋‹ค ๋‚˜๋ˆŒ์ˆ˜๋„ ์—†๊ณ … ์šฐ์„  ์„ฑ๊ณต/์‹คํŒจ์— ๋Œ€ํ•œ ํŒ๋ณ„์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ํŒŒ๊ณ ํŒŒ๊ณ  ๋“ค์–ด๊ฐ€๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒ ๋‹ค. Http Status Code ๊ทธ๋ฃน์ •์˜ Spring-project github์— ๊ฐ€๋ณด๋ฉด HttpStatus ํ•˜์œ„์— ๋‚ด๋ถ€ Enum์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ( ๋งํฌ ) public enum HttpStatus { ... public Series series() { return Series.valueOf(this); } ... public enum Series { INFORMATIONAL(1), SUCCESSFUL(2), REDIRECTION(3), CLIENT_ERROR(4), SERVER_ERROR(5); ... public static Series valueOf(int status) { int seriesCode = status / 100; for (Series series : values()) { if (series.value == seriesCode) { return series; } } throw new IllegalArgumentException("No matching constant for [" + status + "]"); } } } ์•ฝ 80์—ฌ๊ฐœ ์‘๋‹ต์ฝ”๋“œ๋“ค์„ ํฌ๊ฒŒ 5๊ฐœ ๋ฌถ์Œ์œผ๋กœ ์ •์˜ํ•ด ๋†“์€๊ฒƒ์„ ๋ณผ์ˆ˜์žˆ๋‹ค. ์ฆ‰, 201 / 201 / 202 ๊ฐ™์€ ๋…€์„๋“ค์€ ์ „๋ถ€ SUCCESSFUL ์„ฑ๊ณต ์œผ๋กœ ๊ทธ๋ฃนํ•‘์ด ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ RestTemplate ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‚˜? ์ฝ”๋“œ๋ฅผ ์ญ‰์ญ‰ ๋”ฐ๋ผ๊ฐ€๋‹ค ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ 4xx, 5xx ๋Š” ์—๋Ÿฌ๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ RestClientException ์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค. RestTemplate ํ˜ธ์ถœ ๋งํฌ try { ClientHttpRequest request = createRequest(url, method); if (requestCallback != null) { requestCallback.doWithRequest(request); } response = request.execute(); handleResponse(url, method, response); if (responseExtractor != null) { return responseExtractor.extractData(response); } else { return null; } } catch (IOException ex) { ์—๋Ÿฌ ํŒ๋ณ„ ๋งํฌ protected boolean hasError(HttpStatus statusCode) { return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR || statusCode.series() == HttpStatus.Series.SERVER_ERROR); } ์„ฑ๊ณต/์‹คํŒจ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€ ๊ฐ์ž ์ •์˜ํ•˜๊ธฐ ๋‚˜๋ฆ„์ผ๊ฒƒ ๊ฐ™๋‹ค. ์šฐ์„  ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ RestTemplate ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ์ •์˜๋œ ๋Œ€๋กœ 4xx, 5xx๊ฐ€ ์—๋Ÿฌ๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๊ณ  try { responseBody = restTemplate.postForObject(url, httpEntity, byte[].class); } catch (RestClientException e) { // ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ RestClientException ์„ ๋‚ด๋ฑ‰๋Š”๋‹ค. log.error("##### restTemplate error, url = {}", url, e); } ์ •์˜๋œ ์—๋Ÿฌ(?)์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด DefaultResponseErrorHandler์„ ์ƒ์†๋ฐ›๊ณ  hasError๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌด์กฐ๊ฑด ํŒจ์Šคํ•˜๋„๋ก Override ํ•˜๊ณ ๋‚œ ๋‹ค์Œ ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„์ˆ˜ ์žˆ๊ฒ ๋‹ค. (๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ• ๋ง๊ณ  ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค.)

์†Œ๋‚˜ํ๋ธŒ ์ด์šฉ ์ฝ”๋“œ ์ •์ ๋ถ„์„ ์ž๋™ํ™”

์ฝ”๋“œ ์ •์ ๋ถ„์„์ด๋ผ ํ•จ์€ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋งŒ์˜ ํ˜•ํƒœ์— ๋Œ€ํ•œ ๋ถ„์„์„ ๋งํ•œ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ๋ƒ„์ƒˆ๋‚˜๋Š” ์ฝ”๋“œ(?)๋ผ๋˜์ง€, ์œ„ํ—˜์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ, ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ทœ์น™์ด๋‚˜ ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ถ„์„์„ ๋งํ•˜๋Š”๋ฐ java ๊ธฐ์ค€์œผ๋กœ๋Š” ์•„๋ž˜ ๋‹ค์–‘ํ•œ (์ž˜ ์•Œ๋ ค์ง„) ์ •์ ๋ถ„์„ ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ค. PMD ๋ฏธ์‚ฌ์šฉ ๋ณ€์ˆ˜, ๋น„์–ด์žˆ๋Š” ์ฝ”๋“œ ๋ธ”๋ฝ, ๋ถˆํ•„์š”ํ•œ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๊ณผ ๊ฐ™์€ Defect์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌ https://pmd.github.io FindBugs ์ •ํ•ด์ง„ ๊ทœ์น™์— ์˜ํ•ด ์ž ์žฌ์ ์ธ ์—๋Ÿฌ ํƒ€์ž…์„ ์ฐพ์•„์คŒ http://findbugs.sourceforge.net CheckStyle ์ •ํ•ด์ง„ ์ฝ”๋”ฉ ๋ฃฐ์„ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ถ„์„ http://checkstyle.sourceforge.net ์ด์™ธ์— SonarQube ๋ผ๋Š” ํˆด์ด ์žˆ๋Š”๋ฐ ๊ฐœ์ธ์ ์œผ๋กœ ์œ„ ์•Œ๋ ค์ง„ ๋‹ค๋ฅธ ํˆด๋“ค์˜ ์ข…ํ•ฉํŒ(?)์ด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๊ทธ์ค‘ ๊ฐ€์žฅ ์ธ์ƒ๊นŠ์—ˆ๋˜ ๊ธฐ๋Šฅ์ด github๊ณผ ์—ฐ๋™์ด ๋˜๊ณ  ์ ์ ˆํ•œ ๊ตฌ์„ฑ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๊ณผ ๋™์‹œ์— ์ž๋™์œผ๋กœ ๋ถ„์„์„ ํ•˜๊ณ  ๋ฆฌํฌํŒ…๊นŒ์ง€ ํ•ด์ค€๋‹ค๋Š” ๋ถ€๋ถ„์ด์˜€๋‹ค. ( ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์€ ์ˆ˜๋™์œผ๋กœ ๋Œ๋ ค์ค˜์•ผ ํ•˜๊ณ  ๋ฆฌํฌํŒ… ๋˜ํ•œ Activeํ•˜์ง€ ๋ชปํ•œ(?) ์•„์‰ฌ์šด ์ ์ด ์žˆ์—ˆ๋‹ค. ) ์ง€๊ธˆ๋ถ€ํ„ฐ Jenkins + github web-hook + SonarQube ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  PullRequest๋ฅผ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์ˆ˜์ •ํ•œ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ •์ ๋ถ„์„์ด ์ด๋ค„์ง€๊ณ , ๊ทธ์—๋Œ€ํ•œ ๋ฆฌํฌํŒ…์ด ํ•ด๋‹น PullRequest์— ๋Œ“๊ธ€๋กœ ๋‹ฌ๋ฆฌ๋„๋ก ์„ค์ •์„ ํ•ด๋ณด๊ฒ ๋‹ค. (์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ด‡(?)์ด ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ์–ผ๋งˆ๋‚˜ ํŽธํ•œ ์ผ์ธ๊ฐ€…) ๊ธฐ๋ณธ ์ปจ์…‰ ์ „์ฒด์ ์ธ ์ปจ์…‰์€ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. ์ „์ฒด ์ปจ์…‰" ์ „์ฒด ์ปจ์…‰ IDE์—์„œ ์ฝ”๋“œ์ˆ˜์ •์„ ํ•˜๊ณ  remote ์ €์žฅ์†Œ์— commit & push๋ฅผ ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ github์—์„œ master(ํ˜น์€ stableํ•œ branch)์— ๋Œ€ํ•ด ์ž‘์—… branch๋ฅผ PullRequest ์˜ฌ๋ฆฐ๋‹ค. ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•œ github์˜ web-hook์— ์˜ํ•ด PullRequest ์ •๋ณด๋“ค์„ jenkins์— ์ „์†กํ•œ๋‹ค. ์ „๋‹ฌ๋ฐ›์€ ์ •๋ณด๋ฅผ ์žฌ ๊ฐ€๊ณตํ•˜์—ฌ SonarQube๋กœ ์ •์ ๋ถ„์„์„ ์š”์ฒญํ•œ๋‹ค. SonarQube์—์„œ ๋ถ„์„ํ•œ ์ •๋ณด๋ฅผ ๋‹ค์‹œ jenkins๋กœ return ํ•ด์ค€๋‹ค. SonarQube์œผ๋กœ๋ถ€ํ„ฐ return ๋ฐ›์€ ์ •๋ณด๋ฅผ ํ•ด๋‹น PullRequest์˜ ๋Œ“๊ธ€์— ๋ฆฌํฌํŒ…์„ ํ•ด์ค€๋‹ค. ๊ฐ„๋‹จํžˆ ๋ณด๋ฉด (๋ญ ๊ฐ„๋‹จํ•˜๋‹ˆ ์‰ฝ๋„ค~) ๋ผ๊ณ  ๋ณผ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋‚˜๋Š” ์ด๋Ÿฐ ์ „์ฒด ํ๋ฆ„์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์žˆ์–ด ์–ด๋ ค์› ๋‹ค. ์‚ฌ์‹ค ์…‹ํŒ…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ ์ง€์•Š์€ ์‚ฝ์งˆ์„ ํ–ˆ์—ˆ๊ธฐ์—, ์ด ํฌ์ŠคํŒ…์„ ์ ๋Š” ์ด์œ ์ผ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค. ๋”๋ถˆ์–ด ๊ฒ€์ƒ‰์„ ํ•ด๋ด๋„ ์ด๋ ‡๊ฒŒ ์ „์ฒดํ๋ฆ„์ด ์ •๋ฆฌ๋œ ๊ธ€์ด ์ž˜ ์•ˆ๋ณด์—ฌ์„œ + ๋‚ด๊ฐ€ ํ•œ ์‚ฝ์งˆ์„ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋„ ํ• ๊ฒƒ๊ฐ™์•„์„œ(?) Maven ์„ค์น˜ ๊ธฐ๋ณธ์ ์œผ๋กœ Maven์˜ H2DB๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ SonarQube๋ฅผ ์„ค์น˜ํ•˜๊ธฐ์ „์— Maven๋ถ€ํ„ฐ ์„ค์น˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค. $ wget http://apache.mirror.cdnetworks.com/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz $ tar -zxvf apache-maven-3.5.2-bin.tar.gz (ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์…‹ํŒ…ํ›„ ) $ mvn -version Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00) ... SonarQube ์„ค์น˜ ์ •์ ๋ถ„์„์„ ๋„์™€์ฃผ๋Š” SonarQube๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž. $ wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.1.zip $ unzip sonarqube-6.7.1.zip $ cd sonarqube-6.7.1/bin/linux-x86-64 $ ./sonar.sh start Starting SonarQube... Started SonarQube. ๊ธฐ๋ณธ์ ์œผ๋กœ 9000ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ๋‹ค๋ฅธํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด /sonarqube-6.7.1/conf/sonar.properties ๋‚ด sonar.web.port=9000 ์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (SonarQube๋„ Elasticsearch๋ฅผ ์‚ฌ์šฉํ•˜๊ตฌ๋‚˜…) ์„ค์น˜ํ›„ ์‹คํ–‰์„ ํ•œ๋’ค ์„œ๋ฒ„IP:9000์„ ์ ‘์†ํ•ด๋ณด๋ฉด ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋‚˜์˜จ๋‹ค. (ํ˜น์‹œ ์ ‘์†์ด ์•ˆ๋œ๋‹ค๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰์ด ์•ˆ๋œ๋‹ค๋ฉด ./sonar.sh console๋กœ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ๋ฌธ์ œํ•ด๊ฒฐ์— ๋„์›€์ด ๋ ์ˆ˜๋„ ์žˆ๋‹ค. ) SonarQube ๋ฉ”์ธํ™”๋ฉด" SonarQube ๋ฉ”์ธํ™”๋ฉด SonarQube Scanner ์„ค์น˜ ์†Œ์Šค๋ฅผ ์—ฐ๋™์‹œ์ผœ ์ •์ ๋ถ„์„์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SonarQube Scanner ๋ผ๋Š”๊ฒŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์•„๋ž˜ url์—์„œ ๋‹ค์šด๋ฐ›์•„ ์ ์ ˆํ•œ ๊ณณ์— ์••์ถ•์„ ํ’€์–ด๋‘์ž. https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner $ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip $ unzip sonar-scanner-cli-3.0.3.778-linux.zip # jenkins ์„ค์น˜ ๋ฐ SonarQube ์—ฐ๋™ jenkins ์„ค์น˜๋Š” ๊ฐ„๋‹จํ•˜๋‹ˆ ๋ณ„๋„ ์–ธ๊ธ‰์€ ์•ˆํ•˜๊ณ  ๋„˜์–ด๊ฐ€…๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ํ•˜๋‚˜๋ถ€ํ„ฐ ์—ด๊นŒ์ง€ ์ •๋ฆฌํ•œ๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ~ https://jenkins.io/download/ ์—์„œ ์ตœ์‹ ๋ฒ„์ „์„ tomcat/webapps/ ์•„๋ž˜์— ๋‹ค์šด๋ฐ›๊ณ  server.xml ์„ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์ค€๋‹ค. $ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war $ vi tomcat/conf/server.xml <Connector port="19001" protocol="HTTP/1.1" # ํฌํŠธ ๋ณ€๊ฒฝ <Context path="/jenkins" debug="0" privileged="true" docBase="jenkins.war" /> #์ถ”๊ฐ€ # tomcat/bin/startup.sh jenkins ์„ค์น˜๋ฅผ ์™„๋ฃŒ ํ•œ ํ›„ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์ค€๋‹ค. Python Plugin GitHub Pull Request Builder GitHub plugin ์ ‘์† : ์„œ๋ฒ„IP:19001 (์ฐธ๊ณ ๋กœ ํ•œ ์„œ๋ฒ„์—์„œ ๋‹ค ์„ค์น˜ํ•˜๋‹ค๋ณด๋‹ˆ port ์ถฉ๋Œ์„ ์‹ ๊ฒฝ์“ฐ๊ฒŒ๋˜์—ˆ๋‹ค. ) ์ฒ˜์Œ jenkins๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฐ์ €๋Ÿฐ ์„ค์ •์„ ํ•˜๋Š”๋ฐ ํŠน๋ณ„ํ•œ ์„ค์ • ๋ณ€๊ฒฝ์—†์ด next๋ฒ„ํŠผ์„ ์—ฐ์‹  ๋ˆŒ๋Ÿฌ๋ฉด ์„ค์น˜๊ฐ€ ์™„๋ฃŒ ๋˜๊ณ , SonarQube๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด SonarQube Scanner for Jenkins๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์ฃผ์ž.