๐Ÿง ์•„๋ฌด๋„ ๊ฐ€๋ฅด์ณ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ

๋ชจ๋นˆ์ผˆยท2020๋…„ 5์›” 10์ผ
1298
post-thumbnail

๐Ÿค— ์ด ๊ธ€์—๋Š” ์š•์„ค์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ์•ˆ ๊ฐ€๋ฅด์ณ ์ฃผ๋Š” ๋‚ด์šฉ์„ ์ ์–ด ๋ดค๋‹ค. ํ•™์ƒ์ผ ๋•Œ๋Š” ์ „ํ˜€ ๋ชฐ๋ž์ง€๋งŒ ์ง์—…์„ ๊ฐ–๊ณ  ์ผ์„ ์‹œ์ž‘ํ•˜๋‹ˆ ์ •๋ง ์ค‘์š”ํ–ˆ๋˜ ๊ฒƒ๋“ค์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋„ ๊ฐ€๋ฅด์ณ ์ฃผ์ง€ ์•Š์•˜๊ณ  ๋‹น์—ฐํ•˜๋“ฏ์ด ์ด๋Ÿฐ๊ฒŒ ์žˆ๋Š”๋“ฏ ํ–‰๋™ํ•˜๋Š” ํšŒ์‚ฌ์—์„œ ์ ์‘ํ•˜๊ธฐ ์œ„ํ•ด ์• ๋ฅผ ๋งŽ์ด ์จ์•ผ ํ–ˆ๋‹ค.

ํ•™์ƒ ๋•Œ ์•Œ์•˜๋‹ค๋ฉด ์‚ฌ๋ฌด์‹ค ์ ์‘์ด ํ›จ์”ฌ ๋” ํŽธํ–ˆ์„ ๊ฒƒ ๊ฐ™์€ ์ฃผ์ œ๋“ค, ๋‚ด๊ฒŒ ์•„๋ฌด๋„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•„์„œ ๋ฐฐ์‹ ๊ฐ ๋Š๊ผˆ๋˜ ์ฃผ์ œ๋“ค์„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฝ‘์•„ ๋ดค๋‹ค.

๐Ÿ“Š Log

์„ค๋ น ๊ฐ„๋‹จํ•˜๊ฒŒ ์žฅ๋‚œ๊ฐ์„ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ๋ณด๋”๋ผ๋„ logging์„ ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋กœ๊ทธ๋Š” ๋‚˜์ค‘์— ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ ํ–ˆ์„ ๋•Œ ๋‚ด ํ”„๋กœ๊ทธ๋žจ์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ด์šฉํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ๋ฌด์—‡๋ณด๋‹ค Exception์ด ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ error log๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๋ญ”๊ฐ€ ์ผ์ด ํ„ฐ์กŒ๋Š”๋ฐ ์–ด์ฉŒ๋‹ค ์ด๋ ‡๊ฒŒ error๊ฐ€ ๋‚ฌ์—ˆ๋Š”์ง€ ๊ธฐ๋ก์œผ๋กœ ๋‚จ์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‚˜์ค‘์—๋ผ๋„ ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์ž˜๋ชป ํ•œ ๊ฑด์ง€ ๋ถ„์„์„ ํ•ด ๋ณผํ…Œ๋‹ˆ ๋ง์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๊ฐ‘์ž๊ธฐ ๊ฝฅ ์ฃฝ์–ด ๋ฒ„๋ ธ๋Š”๋ฐ error log๋Š” ๋‚จ์•„ ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ฐธ์œผ๋กœ ๋‚œ๊ฐํ•ด์ง„๋‹ค. ๋ˆ„๊ฐ€ ๋Œ์—ฐ์‚ฌ ํ•ด ๋ฒ„๋ ธ๋Š”๋ฐ ๋ถ€๊ฒ€ ํ•  ์˜์‚ฌ๋„ ์—†๋Š” ์ƒํ™ฉ์ธ ๊ฒƒ์ด๋‹ค.

ํŠนํžˆ Java์—์„œ try catch ๊ตฌ๋ฌธ์„ ์“ธ ๋•Œ catch ๋‚ด๋ถ€๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ •๋ง ๋งŽ์•˜๋‹ค. ๊ทธ๋ƒฅ Exception์„ catchํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ์•„๋ฌด๋Ÿฐ ์ฒ˜๋ฆฌ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋‘˜ ๊ฒฝ์šฐ try๋ฅผ ์“ด ์ด์œ ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

try {
    doSomething();
} catch(IOException e) {
    e.printStackTrace(); // default.
}

๋ณดํ†ต ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” IDE์—์„œ ์ž๋™ ์™„์„ฑ ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์—”ํ„ฐ๋งŒ ํœ˜๊ฐˆ๊ฒจ์„œ ๋‚จ์€ ๊ฒฝ์šฐ๋“ค์ด ๋งŽ๋‹ค. ํ•™์ƒ ๋•Œ๋Š” ๋ญ ์–ด์ฐจํ”ผ ๋‚˜ ํ˜ผ์ž ์“ฐ๋Š” ์ฝ”๋“œ๋‹ˆ๊นŒ ์•„๋ฌด ์ƒ๊ฐ ์—†์ด IDE๊ฐ€ ์ถ”์ฒœ ํ•˜๋Š”๋Œ€๋กœ ์ฝ”๋”ฉ ํ–ˆ์ง€๋งŒ ํšŒ์‚ฌ์—์„œ๋Š” ์ด๋Ÿฌ์ง€ ๋ง์ž. ๋ฌผ๋ก  ํšŒ์‚ฌ์—์„œ๋„ ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๋งŽ์ด ๋ฐœ๊ฒฌ ๋œ๋‹ค. ์•„๋ฌดํŠผ ๋„ˆ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€๋ง์ž. ์ด์ œ๋Š” ์•„๋ž˜ ์ฒ˜๋Ÿผ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋„๋ก ํ•˜์ž.

try {
    doSomething();
} catch(IOException e) {
    log.error(e);
}

๋ฌผ๋ก  ์ด๋Ÿฐ์‹์œผ๋กœ ๋กœ๊ทธ๋งŒ ํˆญ ์‹ธ๊ณ  ๋๋‚˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” Exception์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋”์šฑ ์ข‹๋‹ค. ๋งŒ์•ฝ ์ด Exception์ด ์ผ์–ด ๋‚ฌ์„ ๋•Œ ๋ณต๊ตฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋Ÿฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

try {
    doSomething();
} catch(IOException e) {
    log.error(e);
    goto RETRY;
}

๐ŸŽก Log Rotation

logging ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž˜ ์จ์„œ ๋กœ๊ทธ๋ฅผ ์ž˜ ๋‚จ๊ฒผ๋‹ค. ๊ทผ๋ฐ ์ด๋Ÿฐ๋‹ค๊ณ  ๋์ด ์•„๋‹ˆ๋‹ค. ๋ง‰์ƒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋‚ ์ด ๊ฐˆ ์ˆ˜๋ก ๋กœ๊ทธ๊ฐ€ ์Œ“์—ฌ๊ฐ€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. 1๋…„ ๋™์•ˆ ์„œ๋น„์Šค๋ฅผ ํ–ˆ๋‹ค๋ฉด 365๊ฐœ์˜ ํŒŒ์ผ์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

log๋Š” ํ…์ŠคํŠธ ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์ง€๋งŒ ์ด๊ฒŒ ์€๊ทผํžˆ ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค. ์ธ๊ธฐ ์„œ๋น„์Šค๋ผ๋ฉด ํ•˜๋ฃจ์— ์ˆ˜์ฒœ๋งŒ ๊ฐœ์˜ ๋กœ๊ทธ๊ฐ€ ์Œ“์ด๊ณ  ์‚ฌ์šฉ์ž๊นŒ์ง€ ๋งŽ๋‹ค๋ฉด ์–ต๋Œ€๋กœ ์Œ“์ด๋Š” ๊ฒฝ์šฐ๋„ ๋ดค๋‹ค. ๋กœ๊ทธ๋ฅผ ์ž์„ธํžˆ ๋‚จ๊ธด๋‹ค๋ฉด ํ•˜๋ฃจ์น˜ ๋กœ๊ทธ๊ฐ€ 100GB๋ฅผ ๋„˜๋Š” ๊ฒƒ์€ ์ผ๋„ ์•„๋‹ˆ๋‹ค. ๋Œ€ํ˜• ํฌํ„ธ์—์„œ ์ผํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿด ๊ฒƒ์ด๋‹ค.

๋‚˜๋„ ์ฒ˜์Œ์—” text๋กœ๋งŒ ์ด๋ค„์ง„ log file์„ ๋งŒ๋งŒํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํ•œ ๋ฒˆ ํฐ ์ฝ” ๋‹ค์นœ ์ ์ด ์žˆ์—ˆ๋‹ค. ์˜ํ™”๊ด€์—์„œ ํ˜ผ์ž ์ฆ๊ฒ๊ฒŒ ๊ฐ์ƒ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ๊ฒฝ๊ณ  ์•Œ๋žŒ์ด ๋‚ ์•„ ์™”๋‹ค.

โš ๏ธ [WARNING]
๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ ์ด 80%๋ฅผ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค!

๋””์Šคํฌ ์šฉ๋Ÿ‰์ด 500GB์— ์œก๋ฐ•ํ•˜๋Š” ์„œ๋ฒ„์˜€๋Š”๋ฐ ๋กœ๊ทธ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์ด ์Œ“์—ฌ์„œ ๊ณต๊ฐ„์ด ๋ถ€์กฑ ํ•ด ์ ธ ๊ฐ€๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค. ๋Š๊ณ  ๋‚˜๊ฐ€๊ธด ์•„๊นŒ์›Œ์„œ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ 85%โ€ฆ 90%โ€ฆ ๋ชป๋ณธ์ฒ™ ํ•˜๋ ค๋‹ค๊ฐ€ '95%' ์•Œ๋žŒ์ด ์˜ค๋Š”๊ฑธ ๋ณด๊ณ  ์ „๋ ฅ์งˆ์ฃผ๋กœ ์ง‘์— ๋‹ฌ๋ ค๊ฐ”๋‹ค.

๊ฒฐ๊ตญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋„ ๋๋‚œ๊ฒŒ ์•„๋‹Œ ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž˜ ์จ์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ํ•ด๋„ ๋กœ๊ทธ๋ฅผ ์ž˜ ๋‚จ๊ฒจ์•ผ ํ•˜๊ณ , ๋กœ๊ทธ๋ฅผ ์ž˜ ๋‚จ๊ธฐ๋ฉด ๋กœ๊ทธ๊ฐ€ ๊ฝ‰ ์ฐจ์ง€ ์•Š๋„๋ก ๊ณผ๊ณ  ๋กœ๊ทธ๋ฅผ ์ง€์›Œ์ค˜์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์„ log rotation์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ฐธ ๋ฌด์—‡ํ•˜๋‚˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ์—†๊ณ  ํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๋‹ค.

์•„๋ž˜์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ nginx log rotate, go log rotate ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ฐ ์ง„์˜๋ณ„ ํˆด์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Ž pm2 log-rotate

pm2์—์„œ๋Š” log-rotate๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด ์œ„์—์„œ ๋‚ด๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Ž Sentry

๋‚œ ์ด ๋ชจ๋“ ๊ฒŒ ๋‹ค ์‹ซ๊ณ  ๊ท€์ฐฎ๋‹ค? sentry๋ฅผ ์ถ”์ฒœํ•œ๋‹ค. Exception์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ด๋ฉ”์ผ๋กœ ์•Œ๋ ค์ฃผ๊ณ  ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ์ •๋ณด๋ฅผ ์ด์Šˆ๋กœ ๋“ฑ๋ก ํ•ด ์ค˜์„œ ๋‚˜์ค‘์— ์‹ ๊ฒฝ์„ ์จ ์ฃผ๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๋‹ค. ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ๋“ค์€ ๋ˆ ๋ฐ›๊ณ  ํ•˜๋Š” ํšŒ์‚ฌ ์ผ๋„ ์•„๋‹ˆ๋ผ์„œ ๊ฐœ๋ฐœ ํ•ด ๋†“๊ณ  ์‹ ๊ฒฝ์„ ์“ฐ๊ธฐ๊ฐ€ ๋ฌด์ฒ™ ์–ด๋ ต๋‹ค. ํŠนํžˆ Exception๋“ค์€ log๋ฅผ ๋’ค์ ธ ์ฐพ์•„ ๋‚ด๋Š” ๊ฒƒ๋„ ๊ท€์ฐฎ๊ณ  ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฅผ ํ•ด ๋†“์ž๋Š” ๊ทธ๊ฑด ๋” ๊ท€์ฐฎ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚œ ํ˜ผ์ž ๊ฐœ๋ฐœ ํ•  ๋•Œ ์ด ํ”Œ๋žซํผ์„ ์จ ์™”๋Š”๋ฐ ์ตœ๊ทผ ๋“ค์–ด์„œ๋Š” Sentry๋ฅผ ๋„์ž…ํ•˜๋Š” ํšŒ์‚ฌ๊ฐ€ ๋Š˜์–ด๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿž ENV

๋ฆฌ๋ˆ…์Šค๋ฅผ ์ž˜ ๋‹ค๋ฃจ๋ฉด ์ข‹๋‹ค๋Š” ์ ์€ ์•„๋ฌด๋ฆฌ ๋ง ํ•ด๋„ ์ง€๋‚˜์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. environment๋Š” node๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค. OS ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์œผ๋กœ development ํ™˜๊ฒฝ์ด๋ƒ, production ํ™˜๊ฒฝ์„ ๊ตฌ๋ถ„ํ•ด์„œ logging์„ ํ•˜๋„๋ก ํ•˜๋ฉด print๋กœ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ ํ•ด์ง€๋Š” ๊ฒƒ์„ ์ž˜ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ENV๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  config์™€ ๊ด€๋ จ์ด ๊นŠ๋‹ค.

๋‚˜๋Š” ๊ฐœ๋ฐœ์ด๋ž€๊ฑธ ํ•˜๋ฉด ๋งˆ๋ƒฅ ์„œ๋ฒ„ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํšŒ์‚ฌ์— ๊ฐ€ ๋ณด๋ฉด ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„์ธ dev์™€ ์ง„์งœ ์„œ๋น„์Šค์šฉ์ธ prod๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. stage๋ผ๋Š” ์„œ๋ฒ„๋„ ๋”ฐ๋กœ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ๋” ๋ณต์žกํ•˜๋ฉด stage1, stage2.. .๊นŒ์ง€ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑ ํ•ด ๋‘”๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ ํ™˜๊ฒฝ์€ ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

local --- dev --- stage1 --- stage2 --- prod

๋Œ€์ฒด ์™œ ์ด๋ ‡๊ฒŒ ๋งŽ์ด ์„œ๋ฒ„๋ฅผ ๋‘๋Š” ๊ฑธ๊นŒ? ํšŒ์‚ฌ์—์„œ ์ผ์„ ํ•ด ๋ณธ ์ง€๊ธˆ์€ ๋‹น์—ฐํžˆ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋Œ€ํ•™์ƒ ๋•Œ๋Š” ๋„์ €ํžˆ ์ดํ•ด ํ•  ์ˆ˜๋„ ์—†์—ˆ๊ณ  ์„ค๋ช…์„ ๋“ค์–ด๋„ ์™€๋‹ฟ์ง€๋„ ์•Š์•˜๋‹ค. ์ผ๋‹จ์€ ์ข‹์€ ๊ตฌ์ ˆ์ด ์žˆ์–ด์„œ ์•„๋ž˜ ํ•œ ๋ฌธ๋‹จ์„ ์ธ์šฉ ํ•˜์˜€๋‹ค.

ํ™˜๊ฒฝ์ด ๋งŽ์•„์ง€๋ฉด ์กฐ๊ธˆ ๋” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๊ฒ€์ฆ๊ณผ ๊ฐ stakeholder (ํ…Œ์Šคํ„ฐ, ๊ฐœ๋ฐœ์ž, ์‚ฌ์šฉ์ž ๋“ฑ)๋ณ„๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ, ๊ฐ ํ™˜๊ฒฝ์„ ์œ ์ง€ ํ•˜๋Š”๋ฐ, ํ•„์š”ํ•œ ์„œ๋ฒ„๋“ค๊ณผ, ์šด์˜ ์ธ๋ ฅ์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๐Ÿ“Ž https://bcho.tistory.com/759

๐Ÿ”ง config

์„ค์ •๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ ํ•  ๊ฒƒ์ธ๊ฐ€? ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๋ฉด์„œ๋Š” ๋”ฑํžˆ ์‹ ๊ฒฝ์ด ๊ฐ€์ง€ ์•Š์•„ ๋Œ€ํ•™์ƒ ๋•Œ๋Š” ์ž˜ ๋Š๋ผ์ง€ ๋ชปํ•ด์„œ ๊ฒฝํ—˜์ด ์—†๋Š” ์ฑ„๋กœ ์กธ์—…ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์–ด๋–ค ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ ‘์†ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

redis.Redis(host='redis-us-east', charset='utf-8', password='WCaZYz7Kn14vdvw')

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ๋„ host๋‚˜ password๊ฐ€ ์ฝ”๋“œ ๋‚ด์— ์—ฌ์‹คํžˆ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ๋˜์–ด ์ฉ ์šฐ์•„ํ•˜์ง€ ์•Š์•„ ๋ณด์ธ๋‹ค. ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์–ธ๊ฐ€ ์ „๋ฌธ์ ์ด๊ฒŒ(?) ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ์งš์–ด๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํžˆ ๋“ค์–ด ์˜จ ๊ฒƒ์ด host๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ํ•  ๊ฒฝ์šฐ ๊ณณ๊ณณ์— ์‚ฐ์žฌํ•œ host ์ฃผ์†Œ๋ฅผ ๋ฐ”๊พธ๊ธฐ๊ฐ€ ๊ท€์ฐฎ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์ฐจํ”ผ ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ํ•œ ๋ฒˆ๋งŒ ์“ฐ์ด๊ฒŒ ๋˜๊ธฐ์— ๊ณ ๊ฐœ๋ฅผ ๋„๋•์ด๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์Œ“์ธ ์ด์ œ๋Š” ํ™•์‹คํ•œ ๋‹จ์  ๋ช‡๊ฐ€์ง€๋ฅผ ๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

  • dev ํ™˜๊ฒฝ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ prod ํ™˜๊ฒฝ์šฉ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ENV์— ๋”ฐ๋ผ host๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค. stage1, stage2 ๋“ฑ์˜ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์˜ host๊ฐ€ ์“ฐ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • password๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•ด์•ผํ•œ๋‹ค. ์ฝ”๋“œ์— password๋ฅผ ์จ ๋‘๋ฉด git pushํ•˜๋Š” ์ˆœ๊ฐ„ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋œ๋‹ค. API secret key๋‚˜ ๊ฐ์ข… access token๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฒช๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด๋Ÿฐ key๋ฅผ ๋‹ด์€ config file๋“ค์€ ์•”ํ˜ธํ™”ํ•˜์—ฌ pushํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ config์˜ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ ์ด๊ฒƒ์ด ๋‚ด local์—์„œ ์‹คํ–‰ ๋  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด dev์šฉ ์„œ๋ฒ„์— ๋ฐฐํฌ๋˜์–ด ํ…Œ์ŠคํŠธ ํ•  ๊ฑด์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ํ•  ๋•Œ ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. dev์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๊ทธ๋Œ€๋กœ prod์— ๋ฐฐํฌ ํ•ด ๋ฒ„๋ฆฌ๋ฉด ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์งˆ์ง€๋Š” ๋ถˆ๋ณด๋“ฏ ๋ป”ํ•˜๋‹ค.

๐Ÿงช Test

์ˆ˜๋งŽ์€ ๊ธ€๋“ค์ด TDD๋ฅผ ์ฃผ์ฐฝํ•˜๊ณ  TDD๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. test๊ฐ€ ์ „ํ˜€ ๋ญ”์ง€ ๋ชฐ๋ผ๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํฌ์ŠคํŒ…์ด ๋งŽ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ์ด test๋‹ค. ๋‚˜๋Š” ํ•™์ฐฝ ์‹œ์ ˆ ์‹œํ—˜์„ ์ณค๋‹คํ•˜๋ฉด ๋Š˜ ๊ผด์ง€์˜€๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ 'ํ…Œ์ŠคํŠธ'๋ผ๋Š” ๋‹จ์–ด ์ž์ฒด์—์„œ ๋ถ€ํ„ฐ ์˜ค๋Š” ๊ฑฐ๋ถ€๊ฐ์ด ์ƒ๋‹นํ–ˆ๋‹ค. ๐Ÿ˜ž.

ํ…Œ์ŠคํŠธ๋ž€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚ด๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ ํ•ด ์ฃผ๋Š” ์ฝ”๋“œ ๋˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. ๋‚˜๋Š” ์ฒ˜์Œ ์ด ๋ง์„ ๋“ฃ๊ณ  ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์•„๋‹ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง‘์ค‘ ํ•ด์„œ ์ž˜ํ•˜๋ฉด ๋˜์ง€ ๋‚ด๊ฐ€ ์ž˜ ์งฐ๋Š”์ง€ ๊ฒ€์ฆ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‘”๋‹ค๊ณ ? ๊ทธ๋Ÿผ ๋‚ด๊ฐ€ ์ž˜ ์งฐ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•ˆ ํ•„์š” ํ•œ ๋ชจ์–‘์ด์ง€?

๋‚ด๊ฐ€ ๋งŒ์•ฝ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์€ ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ€์ถฉ ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋„๋กœ ์จ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


Test() {
    // ์ผ๋‹จ ๊ธ€์„ ์“ด๋‹ค.
    Post("์œผ์•„์•„ ์ด๊ฑด ๋‚ด ๊ธ€ ์ œ๋ชฉ", "๊ธ€ ๋‚ด์šฉ")
    
    // ์ด์ œ ๋ฆฌ์ŠคํŠธ์— ๋‚ด๊ฐ€ ์“ด ๊ธ€์ด ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ด ๋ณธ๋‹ค.
    var list = PostList()
    
    if (list.contain("์œผ์•„์•„ ์ด๊ฑด ๋‚ด ๊ธ€ ์ œ๋ชฉ")) {
      return true // ์˜ˆ์•„ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต
    } else {
      return false // ??? ๋‚ด๊ฐ€ ์“ด ๊ธ€ ์–ด๋””๊ฐ?
    }
}

๋‚ด๊ฐ€ ์“ด ํ•จ์ˆ˜๋ฅผ ๋‚ด๊ฐ€ ํ˜ธ์ถœํ•ด์„œ ํ™•์ธ ํ•ด ๋ณด๋Š” ๊ณผ์ •์ด๋‹ค. ๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ ์ค‘๊ฐ„์— print ๋„ฃ์–ด์„œ ๋””๋ฒ„๊น…(?)ํ•˜๋Š” ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์จ ๋‘” ๊ฒƒ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ด ์ด Test ํ•จ์ˆ˜๋Š” ์–ด๋””์„œ ํ˜ธ์ถœ ํ•˜๋Š”๋ฐ? ๊ทธ๊ฒƒ์ด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์ด ์กด์žฌํ•˜๋Š” ์ด์œ ๋‹ค.

npm test

javascript์—์„œ๋Š” ์ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๊ณผ์ •์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด ๐Ÿ“Ž Jest๋‚˜ Mocha์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ค. JAVA์—๋Š” ๐Ÿ“Ž JUnit์ด ์žˆ๊ณ  ์ด๊ฑด ์•„๋งˆ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ญ”์ง€ ๋ชฐ๋ผ๋„ ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด ๋ดค์„ ์ •๋„๋กœ ์œ ๋ช… ํ•œ ํˆด์ด๋‹ค. ๋ฒŒ์จ ํ…Œ์ŠคํŠธ์— ๊ด€์‹ฌ์ด ์ƒ๊ฒผ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์—ฌ๋Ÿฌ๋ถ„์ด ์“ฐ๋Š” ์–ธ์–ด์—๋Š” ์–ด๋–ค ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋“ค์ด ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰ ํ•ด ๋ณด์ž.

๋‚˜๋Š” ๊ทธ ์œ ๋ช…ํ•œ ์ผ„ํŠธ ๋ฒก์˜ ๐Ÿ“Ž ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ์ฑ…์„ ์ฝ์–ด ๋ณธ ์ ์ด ์—†๋‹ค. TDD๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด๊ฒƒ์—๋Š” ์•„์ฃผ ๋งŽ์€ ๋…ผ์Ÿ์ด ์žˆ๋‹ค. ์•„๋‹ˆ ๊ทธ๋ƒฅ ์ฝ”๋“œ ์“ฐ๊ธฐ๋„ ๋ฐ”์œ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์“ธ ์‹œ๊ฐ„์— '์ง„์งœ' ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š”๊ฒŒ ํ›จ ๋‚ซ๋‹ค๋Š” ์ฃผ์žฅ๊ณผ, ์ดˆ๊ธฐ์— ์‹œ๊ฐ„์ด ๋” ๋“ค๋”๋ผ๋„ ์˜คํžˆ๋ ค ๋‚˜์ค‘์—๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋•๋ถ„์— ๋ฒ„๊ทธ๋„ ๋œ ์ƒ๊ธฐ๊ณ  ๋” ํƒ„ํƒ„ํ•œ SW๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ๋‹ค.

์ˆ˜ ๋งŽ์€ ๋…ผ์Ÿ์ด ์žˆ์ง€๋งŒ ์•„๋ฌดํŠผ TDD๋Š” ๋ถ„๋ช…ํžˆ ์—…๊ณ„์—์„œ ์ ์šฉ๋˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ๋„ ์žˆ๋Š” '๋ฐฉ๋ฒ•๋ก '์ด๋‹ค.

๋‚˜๋Š” ๋ฏธ์นœ๋†ˆ์ด๋ผ "TDD๋Š” ๋ณ„๋กœ์—์š”" ๋˜๋Š” "TDD๋Š” ๋ฌด์กฐ๊ฑด ํ•ด์•ผํ•˜๋Š”๋ฐ์š”?"๋ผ๊ณ  ์–ด๋Š ์ชฝ๋„ ์ž…์žฅ์€ ์•ˆ ์ •ํ–ˆ๋‹ค. ๊ทธ๋ƒฅ ํŒ€์ด ํ•˜์ž๊ณ  ํ•˜๋ฉด ๋”ฐ๋ผ์„œ ํ–ˆ๊ณ  ์•ˆ ํ•˜๋ฉด ๋‚ด๊ฐ€ ํ•˜์ž๊ณ  ํ•˜๋Š” ์ฒญ๊ฐœ๊ตฌ๋ฆฌ ๊ฐ™์€ ๋†ˆ์ด์—ˆ๋‹ค. ๐Ÿคช. ๊ทธ๋ž˜๋„ ์ด ๋ง์€ ํ•˜๊ณ  ์‹ถ๋‹ค.

REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์น˜์ž, ์ตœ์†Œํ•œ request์— ๋Œ€ํ•ด 200 OK status๊ฐ€ ์˜ค๋Š”์ง€ ํ™•์ธ ํ•˜๋Š” ์ฝ”๋“œ ํ•œ ์ค„์ด๋ผ๋„ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ตœ์†Œํ•œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ผ๋„ ์ž‘์„ฑ ํ•ด ๋‘๋ฉด git push๋ฅผ ํ•  ๋•Œ, deploy๋ฅผ ํ•  ๋•Œ ๋ง์„ค์ž„์ด ์—†๊ฒŒ ๋œ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์“ธ ๋•Œ๋„ ๋ถ€๋‹ด์ด ๋œ ํ•˜๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป ํ–ˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๊ฒ€์ฆ์„ ํ•ด ๋‚ผ ํ…Œ๋‹ˆ๊นŒ.

๐Ÿ˜ถ ๋‹น์—ฐํžˆ ์ด ๋ชจ๋“ ๊ฑด test code๋ฅผ ์ž˜ ์ž‘์„ฑ ํ–ˆ์„ ๋•Œ์˜ ์ด์•ผ๊ธฐ๋‹ค. test code๊ฐ€ ๊ฐœํŒ์ธ๋ฐ test๊ฐ€ ์ž˜ ๋ ๋ฆฌ๊ฐ€ ์—†๋‹ค. test code๋„ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  test๋ฅผ ํ†ต๊ณผ ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ quality๋ฅผ ํ™•์‹คํžˆ ์ถฉ์กฑ ํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์—†๋‹ค.

๐Ÿ— git

์ด๊ฑด ์š”์ฆ˜ ํ•™์ƒ๋“ค๋„ ๋งŽ์ด ์•Œ๊ณ  ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ๋‚˜๋ณด๋‹ค ๋” ์ž˜ ์•Œ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€์žก๋Œ€์—์„œ๋Š” ๊ต์ˆ˜๊ฐ€ git์„ ์ˆ˜์—…์— ์‹œ๋„ํ•  ์—„๋‘๋„ ๋ชป๋‚ด์–ด ์–ด๋ ดํ’‹์ด ๋“ค์–ด๋ณธ ํ•™์ƒ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์–ผ๋งˆ์ „์—๋Š” github์™€ git์ด ๊ฐ™์€ ๊ฒƒ์ธ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋ณธ ์ ๋„ ์žˆ๋‹ค. git์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด์ด๊ณ  github๋Š” git์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šคํ•˜๋Š” ๊ฒƒ์ž„์„ ๋ชจ๋ฅด๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค. ์š”์ฆ˜ ๊ณต๋ถ€ํ•˜๋Š” 10, 20๋Œ€ ํ•™์ƒ๋“ค์€ ์ด ์ •๋„๋Š” ์•„๋‹ˆ๋‹ค.

git์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž˜ ์ตํ˜€ ๋‘๋Š” ๊ฒƒ์ด ๋ญ” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜๊ฐ„์— ํŽธํ•˜๋‹ค. ๋งŒ์•ฝ git์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ง€๊ธˆ ๋ถ€ํ„ฐ ์•Œ์•„๋ผ. ๋˜ ๋ฐ˜๋“œ์‹œ git์„ ์‚ฌ์šฉํ•ด์„œ ์นœ๊ตฌ๋ผ๋ฆฌ ํ˜‘๋™์„ ํ•ด ๋ณด์•„์•ผ ํ•œ๋‹ค. git์˜ rebase ๊ฐ™์€ ์ปค๋งจ๋“œ๋Š” ์ง์ ‘ ํ˜‘์—…์„ ํ•ด ๋ณด์ง€ ์•Š์œผ๋ฉด ์‰ฝ๊ฒŒ ์™€๋‹ฟ์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์ด ๋งŽ๋‹ค.

๋˜ git commit์„ ํ•  ๋•Œ commit message๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€ ํŒ€๊ณผ ํ•ฉ์˜ ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ๐Ÿ“Ž Node ํ”„๋กœ๋•ํŠธ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋†’์ด๋Š” ํ˜‘์—… ๋ฐฉ๋ฒ•์˜ Commit message convention์„ ์ฐธ๊ณ  ํ•˜๋ฉด ์ข‹๋‹ค.

๐Ÿ“Ž Gitflow Workflow

์—ฌ๋Ÿฌ๋ช…์ด์„œ git์„ ์“ธ ๋•Œ branch๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ๊ฐ branch๋Š” ์–ด๋–ค ์—ญํ• ์„ ํ•ด์•ผ ํŒ€์ด ํ˜‘์—… ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด ๋ฐฉ๋ฒ•๋“ค์„ 'Branch ์ „๋žต'์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•˜๋Š”๋ฐ ๊ทธ ์ค‘ gif flow๋ผ๋Š” ๊ฒƒ์ด ์œ ๋ช…ํ•˜๋‹ค. ์ด์™€ ๊ด€ํ•ด์„œ๋„ ๊ณต๋ถ€ ํ•  ๊ฒƒ์ด ๋งŽ๋‹ค. ์ž˜ ์„ค๋ช… ๋œ ๊ธ€์„ ์ฒจ๋ถ€ํ•œ๋‹ค.

๐Ÿ“Ž Git Kraken

๋‚˜ ๊ฐ™์ด ๋ˆˆ ์•ž์— ์•ˆ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ๊ทธ๋ฆผ์œผ๋กœ ์•ˆ ๊ทธ๋ ค์ฃผ๋ฉด ์ดํ•ด ๋ชปํ•˜๋Š” ๋ฐ”๋ณด๋“ค์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํˆด์ด๋‹ค. git์˜ flow๋ฅผ ์†Œ์Šค ํŠธ๋ฆฌ ์ฒ˜๋Ÿผ ์‹œ๊ฐํ™” ํ•ด ์ฃผ์–ด์„œ ์ข‹๋‹ค. Merge๋‚˜ Cherry Picking ๊ฐ™์€ ๊ฒƒ๋„ ๋งˆ์šฐ์Šค๋กœ ๋”ฑ๋”ฑ ํด๋ฆญํ•ด์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งฅ๋ถ์—์„œ๋Š” ์ผฐ๋‹ค ํ•˜๋ฉด ๊ผญ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” ์•ฑ 1์œ„๋กœ ๋“ฑ๊ทนํ•œ๋‹ค. ์‚ฌ์‹ค commit, push๋Š” ๊ทธ๋ƒฅ cli๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ํฌ๋ผ์ผ„์€ ๊ทธ๋ƒฅ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๊ฑฐ๋‚˜ rebaseํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์“ฐ๊ณ  ์žˆ๋‹ค.

โš ๏ธ git์˜ ๋ธŒ๋žœ์น˜ ์ „๋žต์€ git์„ ์‚ฌ์šฉ ํ•ด ๋ณธ ์‚ฌ๋žŒ๋„ ์–ด๋ ต๊ณ  git์„ ๋ชจ๋ฅด๋ฉด ๋‹น์—ฐํžˆ ์–ด๋ ต๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ๋‹น์žฅ ์ด๊ฒƒ๋“ค ๋ชจ์กฐ๋ฆฌ ๊ณต๋ถ€ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๋Ÿฐ ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ๊ณ ๋งŒ ์žˆ์–ด๋„ ํšŒ์‚ฌ ๊ฐ”์„ ๋•Œ ๋‘๋ ค์›€์— ์™€๋“ค์™€๋“ค ๋– ๋Š” ์ผ์€ ์—†๋‹ค. ๋งˆ์น˜ ๊ต๊ณผ์„œ ์ฒ˜๋Ÿผ git์„ ๊ณต๋ถ€ํ•˜์ง€ ๋ง๊ณ  ์ž์‹ ์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ์ ์šฉ ํ•ด ๋ณด๋ฉด์„œ ๋Š์ž„ ์—†์ด ์ต์ˆ™ ํ•ด ์ ธ ๊ฐ€๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํฐ ๊ณต๋ถ€๊ฐ€ ๋œ๋‹ค.

๐Ÿฆพ CI/CD

git commit๊ณผ git push ํ•œ ๋ฒˆ์œผ๋กœ ์œ„์—์„œ ๋ง ํ•œ ํ…Œ์ŠคํŠธ์™€ ๋ฐฐํฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์‚ฌ์‹ค์„ ์•Œ์•˜์„ ๋•Œ ์–ผ๋งˆ๋‚˜ ์ถฉ๊ฒฉ์ด์—ˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค. ๋‚ด๊ฐ€ ํ•™์ƒ์ผ ๋•Œ๋Š” ์ด๋Ÿฐ๊ฑธ ๊ฐ€๋ฅด์ณ ์ค€ ์‚ฌ๋žŒ์ด ์—†์—ˆ๋‹ค.

์š”์ฆ˜์—๋Š” ์›Œ๋‚™ ์ข‹์€ PaaS์™€ ์„œ๋น„์Šค๋“ค์ด ๋งŽ์•„์„œ CI/CD๊ฐ€ ๋ญ”์ง€ ์ž˜ ๋ชฐ๋ผ๋„ ๋ฒ„ํŠผ ๋ช‡๋ฒˆ์ด๋ฉด ๋‹ค ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ CI/CD๋ฅผ ํ•ด๋‚ด๊ณ  ์‹ถ์œผ๋ฉด Heroku๋ฅผ ๋ฌด๋ฃŒ ๋ฒ„์ „์œผ๋กœ ์จ๋„ ์ข‹๋‹ค. Hroku์— github repository๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋‚ด ๊นƒํ—ˆ๋ธŒ์— push ํ•  ๋•Œ ๋งˆ๋‹ค ์ž๋™์œผ๋กœ Deploy๋ฅผ ํ•ด ์ฃผ๊ณ  ์‹ฌ์ง€์–ด ํ˜ธ์ŠคํŒ…๊นŒ์ง€ ํ•ด ์ค€๋‹ค.

Gitlab๋„ ์ข‹๋‹ค. gitrunner๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•œ ๋ฒˆ ์จ๋ณด๊ณ  ์‹ถ๋‹ค.

์œ ๋ฃŒ์ด๊ธด ํ•˜์ง€๋งŒ Digital Ocean๋„ ์ข‹์•˜๋‹ค. ํ•™์ƒ์ด๋ผ๋ฉด 50$๋ฅผ ๋ฌด๋ฃŒ ํฌ๋ ˆ๋”ง์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. 1๋…„ ์ •๋„๋Š” ์“ธ ์ˆ˜ ์žˆ๋Š” ์•ก์ˆ˜๋‹ค.

์ผ์ฃผ์ผ์— ๋ช‡๋ฒˆ Deployํ•˜๋Š๋ƒ, ์–ผ๋งˆ๋‚˜ ์ž์ฃผ deploy๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š๋ƒ๊ฐ€ App Quality์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋๋‹ค. ์ˆ˜ ๋…„์ „ ๋ถ€ํ„ฐ Facebook๊ณผ Twitter์˜ ๋ชจ๋ฐ”์ผ ์•ฑ์€ Quality Improvement๋ผ๋Š” ์งค๋ง‰ํ•œ ๋‚ด์—ญ๊ณผ ํ•จ๊ป˜ Regular update๋ฅผ ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์žฅ๋‚œ์œผ๋กœ๋ผ๋„ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ๋Š” CD๊ฐ€ ๊ฐ–์ถฐ์ง€๋ฉด ๋งค์šฐ ํŽธํ•˜๋‹ค. ์–ด์จŒ๋“  ์—ด์‹ฌํžˆ ์ฝ”๋“œ๋งŒ ๋‹ค๋“ฌ์œผ๋ฉด ๋˜๋‹ˆ๊นŒ.

๐Ÿ” AMP/Analytics

์ž์‹ ์ด ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์ž˜ ๋ฐฐํฌ ํ–ˆ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ ํ•˜์—ฌ์•ผํ•œ๋‹ค.

์‹ค์ œ ํšŒ์‚ฌ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜ ๋Ÿฐ์นญํ•˜๊ณ  ๋‚˜๋ฉด์€ ์ด ์—…๊ณ„์—์„œ ์งˆ๋ฆฌ๋„๋ก ๋งํ•˜๋Š” โ€˜์„ฑ์žฅโ€™์„ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ„์„์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์‚ฌ์šฉ์ž ์—ฐ๋ น์ธต์€ ์–ด๋– ํ•œ์ง€ ์„ฑ๋ณ„์€ ์–ด๋–ค์ง€ ์‚ฌ์šฉ ์‹œ๊ฐ„๊ณผ ์–ด๋–ค ๋ฉ”๋‰ด๋ฅผ ์–ผ๋งˆ๋งŒํผ ๋ˆ„๋ฅด๋Š”์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋˜ ๋‹ค๋ฅธ ์ง๊ฐ์„ ์–ป์–ด๋‚˜๊ฐ„๋‹ค.

ํ•™์ƒ์ด์•ผ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋ฐฐํฌํ•œ ๋’ค์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐœ์„ ์ ์„ ์Šค์Šค๋กœ ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค. ๋งŒ์•ฝ ๋ฐฐํฌํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข‹์€ ์ธ๊ธฐ๋ฅผ ์–ป์–ด ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์ด ๋ฆฌ๋ทฐ๋ฅผ ํ•ด ์ค€๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๋‚ด ์•ฑ์„ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋””๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ถ•์  ํ•ด ๋‘”๋‹ค๋ฉด ๋˜ ์งˆ๋ฆฌ๋„๋ก ๋งํ•˜๋Š” โ€˜์ธ์‚ฌ์ดํŠธโ€™๋ฅผ ๊ธฐ๋ฅด๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋œ๋‹ค.

๐Ÿ“Ž Sentry

์ฒ˜์Œ์— Log์—์„œ๋„ ์ถ”์ฒœ ํ–ˆ๋˜ Sentry์ด๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง์—๋„ ํ•ด๋‹น ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๊ฐ™์ด ๋งํฌ ๊ฑธ์–ด ๋‘์—ˆ๋‹ค.

๐Ÿ“Ž pm2 monitor

pm2์˜ ๊ฒฝ์šฐ ๋‚˜๋ฆ„๋Œ€๋กœ ๋ฉ‹์ง„ UI๋ฅผ ๊ฐ€์ง„ moniotring ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ“Ž Google Analytics / Firebase

iOS ๋˜๋Š” Android App์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด firebase์˜ Analytics๋ฅผ ์‚ฌ์šฉ ํ•ด ๋ณผ๋ฒ•๋„ ํ•˜๋‹ค. Web์ด๋ผ๋ฉด Google Analytics๋ฅผ ์ƒ๊ฐ ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. GA๋กœ ๋งŽ์ด๋“ค ์–ธ๊ธ‰ํ•˜๋Š” ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค๋Š” ๊ผญ ๊ฐœ๋ฐœ์ž๋“ค๋งŒ์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งˆ์ผ€ํŒ…์„ ์ผ์‚ผ๋Š” ์‚ฌ๋žŒ๋“ค ์—ญ์‹œ GA๋ฅผ ๊ณต๋ถ€ํ•˜๊ณค ํ•œ๋‹ค.

๐Ÿž Debugging / Profiling

๊ฐ€์žฅ ์ž˜ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ๋ ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•œ์ฐฝ ๊ฐœ๋ฐœ๋งŒ ๋ถ€์—ฌ์žก๋‹ค๊ฐ€ ์–ด๋Š ๋‚  ์Šคํƒ์„ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊น…์„ ํ•ด์•ผ ํ•  ์ƒํ™ฉ์ด ์ƒ๊ฒผ์„ ๋•Œ ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ ๋˜๋Š”์ง€ ์กฐ์ฐจ ๋ชฐ๋ž๋‹ค. ์ž์‹ ์—๊ฒŒ๋„ ๋„ˆ๋ฌด ๋ถ€๋„๋Ÿฌ์šด ์ˆœ๊ฐ„์ด์—ˆ๋‹ค. ๋””๋ฒ„๊น…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘๋„๋ก ํ•˜์ž.

ํ”„๋กœํŒŒ์ผ๋ง์€ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋นˆ๋„ ๋“ฑ์„ ์ธก์ •ํ•ด ๋‚ด ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ ์ž ํ•จ์ด๋‹ค. ์ฉ ๊ดœ์ฐฎ๊ฒŒ ๋งŒ๋“ค์–ด ๋†จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ง‰์ƒ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ณด๋ฉด ๋ถ„๋ช…ํžˆ ์‹ค์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ด์ „์—๋Š” ๋ชฐ๋ž๋˜ ์ง€์‹ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ๋Š๋ ค์ง€๋Š” ๊ตฌ๊ฐ„์ด ํ•˜๋‚˜ ์ฏค ๋‚˜ํƒ€๋‚œ๋‹ค.

ํŠนํžˆ ๊ตฌ๊ธ€๋ง๊ณผ ๊ธฐํƒ€ ๋ธ”๋กœ๊ทธ์— ๋„๋ฆฌ ํผ์ ธ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ์„œ ์“ฐ๊ธฐ ์ „์— ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ๊ฒ€์ฆ์„ ํ•ด ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ์•„๋ฌด๋ฆฌ ์œ ๋ช…ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ณ  ํ™•์‹คํ•ด ๋ณด์ด๋Š” ์ฝ”๋“œ๋ผ๋„ ๋ญ”๊ฐ€ ์ด์ƒํ•œ ์ ์ด ๋‹ค ํ•˜๋‚˜์”ฉ ์žˆ๋‹ค.

๐Ÿ“Ž Flow

์ฝ˜์†” ํ™”๋ฉด์ด ์•„๋ฌด๋ฆฌ ๋ฉ‹์žˆ๋‹ค์ง€๋งŒ ์‹œ๊ฐํ™” ํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์ตœ๊ณ ๋‹ค. ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜์™€ ์žˆ๋‹ค๋ฉด ๋ง‰๋Œ€๊ธฐ ์ œ์ผ ํฐ ๋†ˆ์ด ์ œ์ผ ๋Š๋ฆฐ ๋†ˆ ์•„๋‹Œ๊ฐ€? ๊ทธ ํ•จ์ˆ˜๋งŒ ์ฃฝ์–ด๋ผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๋ฉด 100์  ๋งŒ์ ์— ์ตœ์†Œ 80์ ์€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. Spring์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ์—ˆ๊ณ  ๋ณ‘๋ชฉ๊ตฌ๊ฐ„์„ ๋งŽ์ด ์žก์•„ ๋ƒˆ์—ˆ๋‹ค. ์ •๋ง ์ข‹์•„ ํ–ˆ๋˜ ํˆด์ธ๋ฐ ์ตœ๊ทผ์—๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฐ•์‚ด์ด ๋‚œ๊ฑด์ง€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ด์–ด ๋ฐ›์•„์„œ ๊ณ„์† ๊ฐœ๋ฐœํ•  ์‚ฌ๋žŒ์„ ๊ตฌํ•œ๋‹ค๋Š” ๋ฉ”์ผ์„ ๋ณด๋‚ด ์˜ค๋”๋ผ. ๊ทธ๋ž˜๋„ ์•„์ง์€ ์“ธ๋งŒ ํ•˜๋‹ค๊ณ  ์ž์‹ ํ•œ๋‹ค.

๐Ÿ“Ž Lighthouse

๋‚ด๊ฐ€ ๋งŒ๋“  ์›น ํŽ˜์ด์ง€๊ฐ€ ์˜น๊ณจ์ฐฌ PWA ํŽ˜์ด์ง€์ธ์ง€ ๊ฒ€์‚ฌ ํ•ด์ฃผ๋Š” ํˆด์ด๋‹ค. PWA์— ๋Œ€ํ•ด์„  ์•Œ์•„์„œ ์•Œ์•„๋ณด์ž ๋ฏธ์•ˆํ•˜๋‹ค.

๐Ÿ“Ž Artillery

Node๋กœ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ์ธก์ • ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. velog์— Artillery๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹  ๋ถ„์ด ์žˆ์–ด ์ด ๊ธ€์„ ๋ณด๋ฉด ์ข‹๋‹ค. ๐Ÿ“Ž Nodeํ™˜๊ฒฝ์—์„œ Artillery๋ฅผ ํ™œ์šฉํ•œ ์ŠคํŠธ๋ ˆ์Šคํ…Œ์ŠคํŠธ

๐Ÿ’ฐ toss๋กœ ์„œํฌํŠธํ•˜๊ธฐ

profile
๐ŸŒš ๋ฐฉ๋ž‘ ๊ฐœ๋ฐœ์ž, https://duge.space/DOZYHExYNz

66๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 5์›” 10์ผ

์—…๊ณ„ ๋“ค์–ด์˜ค๋ฉด์„œ ๋กœ๊ทธํŒŒ์ผ์˜ ์ค‘์š”์„ฑ์„ ์ •๋ง ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๊ผˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ญ”๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ํ™•์ธ์ค‘์ด๋ผ๊ณ  ์‚ฌ์ˆ˜์—๊ฒŒ ๋งํ•˜๋ฉด ์šฐ์„  ๋Œ์•„์˜ค๋Š” ๋‹ต๋ณ€์€ ๋กœ๊ทธํŒŒ์ผ ํ™•์ธ ํ–ˆ๋ƒ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ณต๊ฐ๊ฐ€๋Š” ๊ธ€ ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 10์ผ

์ €๋„ REST API ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๋งŒ๋“ค๋•Œ status code ํ™•์ธ๋งŒ ๋„ฃ์„๋•Œ๊ฐ€ ๋งŽ์€๋ฐ, ์ด๊ฑฐ๋„ ๊ฝค ๋„์›€์ด ๋˜๋”๋ผ๊ตฌ์š” ใ…‹ใ…‹

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 10์ผ

ํ•™๋ถ€์ƒ ๋‚˜๋ถ€๋žญ์ด์ง€๋งŒ.. ํ•˜๋‹ค๋ชปํ•ด ํ† ์ดํ”„๋กœ์ ํŠธ ํ• ๋•Œ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋‚ด์šฉ๋“ค์ด๋„ค์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 12์ผ

์ด์ง‘๋ง›์ง‘์ด์—ˆ๋„ค ๋งค๋ ฅ์ ์ด์•ผ

1๊ฐœ์˜ ๋‹ต๊ธ€

๊ธ€๋ง›์ง‘์ด๋‹คใ… ใ…  ์ง„์งœใ… ใ… ใ… ใ…  ์ตœ๊ณ ๋„ค์š”๐Ÿ™๐Ÿป

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 13์ผ

์œผ์•„์•„์•„ ๊ฐœ๊ฟ€๊ฒŒ์‹œ๋ฌผ

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 13์ผ

์ง„์งœ ๋ชจ๋“  ๊ธ€ ์ •๋…ํ•ด์•ผ๊ฒ ๋„ค ์œ ์šฉํ•˜๊ณ  ๊น”๋”ํ•œ ๊ธ€ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 17์ผ
1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 20์ผ

์•„๋‹ˆ ๊ตฌ๋… ๊ธฐ๋Šฅ์ด ์—†๋‹ค๋‹ˆ ใ… ใ…  ๊ธ€ ํ•˜๋‚˜์”ฉ ์ž˜ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค~

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 21์ผ

test๋ฅผ ๊ทธ test์™€ ์—ฐ๊ฒฐ์‹œํ‚ค๋‹ค๋‹ˆ ๊ธฐ๋ฐœํ•˜๋„ค์š” !

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 21์ผ

๊ธ€ ์ž˜ ์ฝ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค! ํฌ๋กค๋ง์— ๋Œ€ํ•œ ๊ธ€ ๋ณด๊ณ  ๋“ค์–ด์™”๋Š”๋ฐ....๋‹ฌ๋‹ฌํ•œ ๊ธ€๋“ค์ด ๋„ˆ๋ฌด ๋งŽ๋„ค์š” ํฌ.....์ž˜ ์ฝ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 29์ผ

ํ”„๋กœํ•„์—์„œ ๊ณต๊ฐ์„ ๋Š๋ผ๊ณ ๊ฐ‘๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 30์ผ

์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 6์›” 22์ผ

๋ณด์•ˆ ์ฝ”๋”ฉ์—์„œ๋„ ๊ถŒ๊ณ ์‚ฌํ•ญ์œผ๋กœ ์ŠคํƒํŠธ๋ ˆ์ด์Šค๋Š” ์ œ๊ฑฐํ•˜๋ผ๊ณ  ํ•ด์š”. ์‹œ์ž‘๋ถ€ํ„ฐ logging์„ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€๋“ค์ด๋Š”๊ฒŒ ์ข‹์•„์š”

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 7์›” 3์ผ

ํŒ€๋‚ด ๋ฐฐํฌ๋‹ด๋‹นํ•˜๋Š” ์ž…์žฅ์—์„œ ๊ทนํžˆ ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.ใ…Žใ…Ž ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 7์›” 7์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 7์›” 15์ผ

์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 7์›” 27์ผ

๊ธ€ ์ž˜ ์ฝ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 8์›” 28์ผ

์™€ ๊ธ€ ๋„ˆ๋ฌด ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ˆ˜๊ณ ๊ทธ๋Ÿฐ ๊ธ€์„ ์ € ๊ฐ™์€ ์ด๋“ค์„ ์œ„ํ•ด ์จ์ฃผ์‹œ๋‹ค๋‹ˆ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 1์›” 18์ผ

๋ณ‘์‹ ์ด๋ž€ ์ž๊ธฐ์†Œ๊ฐœ๋ถ€ํ„ฐ ์ทจํ–ฅ์ €๊ฒฉ ๋‹นํ•ด๋ฒ„๋ ธ๋Š”๋ฐ
๋‹˜ ํฌ์ŠคํŒ…๋ณด๋ฉฐ ์กด๋‚˜ ๊ฐํƒ„ํ•œ๋’ค
๋‹น์‹ ์†Œ๊ฐœ ํ•œ๋ฒˆ๋”๋ณผ๋•Œ ์กด๋‚˜๋ฉ‹์ง
์—ฌ์œฝ์‹œ ์‚ถ์ž˜๋Ÿฌ๋Š” ๊ธ€์ž˜๋Ÿฌ์•ผ.. RESPECT!!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 2์›” 17์ผ

์Šคํ”„๋ง์œผ๋กœ log๋งŒ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ์ด๋Ÿฐ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๊ตฐ์š”.
ํšŒ์‚ฌ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ๋„์›€์ด ๋งŽ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งˆ์„ฑ์˜ ๋ธ”๋กœ๊ทธ์—์š”.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 4์›” 23์ผ

์žฌ๋ฐŒ๋Š” ๊ธ€์ด๋„ค์š”. TDD์— ๋Œ€ํ•œ ๊ด€์ ์ด ์ธ์ƒ๊นŠ์Šต๋‹ˆ๋‹ค. ์ € ๋˜ํ•œ TDD๋ฅผ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ์ฑ„ํƒํ•œ ํšŒ์‚ฌ์—์„œ๋„ ๊ทผ๋ฌดํ•ด๋ณด๊ณ , (๋Œ€๋ถ€๋ถ„์˜) ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ณณ์—์„œ๋„ ์ผํ•ด ๋ณด์•˜๋Š”๋ฐ ๊ฒฐ๋ก ์ ์œผ๋กœ ์ง€๊ธˆ์€ ์ด๋„์ €๋„ ์•„๋‹Œ ํฌ์ง€์…˜์—์„œ ์ ‘๊ทผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์™€ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœํ•œ CI/CD ๊ตฌํ˜„์€ ๋ฌผ๋ก  ์žˆ์œผ๋ฉด ์—†๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋‚ซ์ง€๋งŒ, ํ…Œ์ŠคํŠธ์— ๋„ˆ๋ฌด ์ง‘์ฐฉํ•œ ๋‚˜๋จธ์ง€ ์ฃผ๊ฐ์ด ์ „๋„๋˜๋Š” ์ƒํ™ฉ์„ ํ”ผํ•˜๋Š” ์„ ์€ ์ง€์ผœ ๊ฐ€๋ฉด์„œ ์ ๋‹นํ•œ ์œ ํ‹ธ๋ผ์ด์ œ์ด์…˜์„ ํ•˜๋Š” ์ •๋„๊ฐ€ ๋”ฑ ์ ๋‹นํ•œ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์œ ์ €์˜ ์‚ฌ์šฉ Flow๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊นŒ์ง€ ํ•ด ๊ฐ€๋ฉด์„œ ์•„์ฃผ ๊นŠ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ฑด ์กฐ๊ธˆ ๊ด‘๊ธฐ์ฒ˜๋Ÿผ ๋Š๊ปด์ ธ์„œ, ์บก์Šํ™”๋œ ๊ฐœ๋ณ„ ์—”๋“œํฌ์ธํŠธ ์ •๋„์˜ ๋ ˆ๋ฒจ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์— ๋”ฑ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ์˜ ๊ฒ€์ˆ˜๋Š” QAํŒ€์˜ ์˜์—ญ์ด์ฃ .

์‚ฌ์‹ค์€ ์–ด๋–ค ์˜์—ญ์—์„œ๋„ ๋น„์Šทํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์–˜๊ธฐ ๊ฐ™๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒจ๋กœ๊ทธ์—์„œ๋„ ๊ทธ๋ ‡์ง€๋งŒ ์‚ด๋‹ค๋ณด๋ฉด ๊ฐ€๋”์€ ๋ฐฉ๋ฒ•๋ก ์— ๋„ˆ๋ฌด ์‹ฌ์ทจํ•œ ๋‚˜๋จธ์ง€ ๋ณธ์งˆ์ ์ธ ๋ถ€๋ถ„์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ณด์ด๊ฑฐ๋“ ์š”.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๋‹ด์ด์ง€๋งŒ
[๊ทธ๋ƒฅ ํŒ€์ด ํ•˜์ž๊ณ  ํ•˜๋ฉด ๋”ฐ๋ผ์„œ ํ–ˆ๊ณ  ์•ˆ ํ•˜๋ฉด ๋‚ด๊ฐ€ ํ•˜์ž๊ณ  ํ•˜๋Š” ์ฒญ๊ฐœ๊ตฌ๋ฆฌ ๊ฐ™์€ ๋†ˆ์ด์—ˆ๋‹ค. ๐Ÿคช]
๊ฒฐ๊ตญ (๊นŠ์ด์— ์ฐจ์ด๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ) ์–ด๋Š ํŒ€์—์„œ๋˜ TDD๋Š” ํ•˜์‹ ๊ฑฐ๋„ค์š”. TDD ํŒฌ๋ณด์ด ์ฒญ๊ฐœ๊ตฌ๋ฆฌ์ธ๊ฐ€์š”? ใ…Žใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 4์›” 24์ผ

์ œ๊ฐ€ 300๋ฒˆ์งธ ํ•˜ํŠธ๋ฅผ ์ฑ„์› ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 6์›” 9์ผ

์ทจ์—…์ดˆ์—” ์ฆ์ฐพํ•ด๋†“๊ณ  ๋ฌด์Šจ๋ง์ธ์ง€ ๋ชฐ๋ผ ๋Œ€์ถฉ๋ดค๋Š”๋ฐ

3๊ฐœ์›”๋งŒ์— ๋‹ค์‹œ๋ณด๋‹ˆ ์ €์—๊ฒŒ ๋‹คํ•„์š”ํ•œ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„๋“ค์ด๋„ค์š”

์ข‹์€๊ธ€ ๋งŽ์ด ์จ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 8์›” 9์ผ

๊ธ€์„ ์ฝ์–ด์„œ ์™€ ์ข‹์€ ์ •๋ณด๋‹ค ํ•˜๋ฉด ํ•ญ์ƒ ์ด๋ถ„์ด์‹œ๋„ค.. ์ž˜ ์ฝ์—ˆ์–ด์š”!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 2์›” 24์ผ

Read the article well! I came in after seeing an article about crawling....there are too many sweet articles.

https://mobisoftinfotech.com/services/cloud-development-services

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 4์›” 28์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 6์›” 30์ผ

๋„์›€์ด ๋งŽ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 12์›” 5์ผ

์ž˜์ฝ์—ˆ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 3์›” 13์ผ
๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 4์›” 5์ผ

Interesting piece of content thanks for sharing. https://clinicianapp.in/

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 12์›” 1์ผ

Helpful article!

We share AI knoledge without any cost.

https://www.freeskillshub.com/ai-and-the-evolution-of-sales-what-you-need-to-know/

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ