๐Ÿšง

ํฌํด ๋งŒ๋“œ๋Š”๋ฒ•

purpplee 2021. 10. 29. 10:27

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

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

 

๋ฌด์—‡์„ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€. ๊ฒŒ์‹œํŒ์€ ์ข‹์€ ์‹œ์ž‘์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ผญ ๊ฒŒ์‹œํŒ ์ด์–ด์•ผ ํ•  ์ด์œ ๋Š” ์—†์ง€๋งŒ, ๊ตฌ์ธ์„ ํ•˜๋Š”์ชฝ์ด๋‚˜ ๊ตฌ์ง์„ ํ•˜๋Š” ์ž…์žฅ์—์„œ ์„œ๋กœ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•œ ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹œ์ž‘์€ ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š๋Š” ๊ณต๊ฐœ๋œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ฒฝ๋ ฅ์ง์ด ์•„๋‹Œ ์ด์ƒ ์ฒ˜์Œ ์‚ฌํšŒ์ƒํ™œ์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ญ”๊ฐ€ ํ™”๋ คํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ์ผ๋‹ค๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์–ด๋А ์ •๋„์˜ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๊ฐ–์ถ”์—ˆ๋Š”์ง€, ์–ด๋А ์ •๋„ ์™„์„ฑ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ๊ทธ ํ•ฉ์ผ์ ์—์„œ๋Š” ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๋ณด๋‹ค๋Š” ๊ฒŒ์‹œํŒ์ด ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ž…์žฅ์œผ๋กœ ์ ‘๊ทผ์ด ์ข€ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ ฅ์„œ๋ฅผ ๋ณด๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ์‹œ๊ฐ„์€ ์ •๋ง ๊ธธ์–ด๋ด์•ผ 10๋ถ„ ์ด์ƒ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์–ด๋–ค ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์ง€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์กฐ๊ธˆ ์ƒ์„ธํ•˜๊ฒŒ ์ ์Šต๋‹ˆ๋‹ค.

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

์ฒ˜์Œ ๋ผˆ๋Œ€๋ฅผ ์žก์•„๋ณด๊ณ  ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€/๋ณ€ํ˜• ์‹œ์ผœ ๋‚˜๊ฐ€๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. 

 

์–ด๋–ค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ• ์ง€ Researchํ•˜๊ณ  ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์ •๋„์˜ ๊ธฐ์ˆ  ์„ ํƒ์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

  • RDBMS - Free database ์ค‘์—์„œ ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฑธ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • Backend language -  ๋ณธ์ธ์ด ๊ฐ€์žฅ ์ž์‹ ์žˆ์–ดํ•˜๋Š” ์–ธ์–ด ์ค‘์— ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • Frontend language - React, Angular, Vue ์ค‘์—์„œ ์ž์‹  ์žˆ๋Š” ๊ฒƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์œ„ ์„ธ๊ฐ€์ง€ ์ •๋„๋งŒ์„ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Github๊ณ„์ •์„ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๋ฌธ์„œ๋Š” Repository์•ˆ์— ํฌํ•จ๋˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

Github (https://github.com/)์— ๊ฐ€์„œ ๊ฒŒ์‹œํŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ Repository๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ์ฒ˜์Œ README.md์— ๋งŒ๋“ค ๊ฒŒ์‹œํŒ์— ๋Œ€ํ•œ ๊ฐœ๋žต์ ์ธ ์„ค๋ช…์„ ์ฑ„์›Œ ์ค๋‹ˆ๋‹ค. ์ฐจ๊ทผ ์ฐจ๊ทผ Frontend, Backend, DB scheme ์ž์„ธํ•œ ์„ค๊ณ„์‚ฌํ•ญ์„ README.md์— ์ฑ„์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ข‹์€ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ๊ณ ๋ฅด๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•

๊ตฌ๊ธ€๋ง์„ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฒƒ์ด๊ณ , github์—์„œ ๋งŽ์€ ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ๊ฐ€ ๋ ์ˆ˜๋„ ์žˆ๊ณ , ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•˜๋Š” ์ข‹์€ ์˜คํ”ˆ์†Œ์Šค์˜ ๊ธฐ์ค€์€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ Contributors๊ฐ€ repository์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋А๋ƒ ์ž…๋‹ˆ๋‹ค. ์ง‘๋‹จ ์ง€์„ฑ์ด๋ผ๋Š” ์ „์ œํ•˜์— ๋งŽ์€ ์ฐธ์—ฌ๋Š” ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

 

์ฒซ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋–ค ๊ธฐ์ˆ ์„ ์“ธ์ง€ ์ •ํ–ˆ๊ณ , Github repository๋„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘์ด ๋ฐ˜์ด๋‹ˆ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. 

๊ฐœ์ธ์ ์œผ๋กœ Backend๋Š” REST API๋กœ ๋งŒ๋“œ๋Š” ๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๋‚˜์ค‘์— ํ™•์žฅ์„ ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ ํŽธํ•˜๋ฏ€๋กœ ์ผ๋‹จ ์‹œ์ž‘์„ REST๋กœ ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์„ค๊ณ„๋ฅผ ์œ„ํ•ด์„œ๋Š” 3๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ง‘์ค‘์ ์œผ๋กœ ๊ณต๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

1. REST API์˜ Best practice

REST API ์›์น™์— ๋Œ€ํ•ด์„œ ์ตœ์†Œ 3~4 ์ผ ์ •๋„์˜ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์„œ ๋งŽ์€ ๋ฌธ์„œ๋“ค์„ ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. github์— ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค๋ฅผ ๋ณด๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๊ณ , ์œ ํŠœ๋ธŒ๋‚˜ ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋“ค์„ ์ƒ์„ธํžˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ ๋ช…ํ•œ ITํšŒ์‚ฌ์—์„œ OpenAPI Spec ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ํžŒํŠธ๋ฅผ ์–ป๋Š” ๊ฒƒ๋„ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๋ฌผ์€ ์ ์–ด๋„ ์–ด๋–ค endpoints๋“ค์ด ํ•„์š”ํ•œ์ง€ README.md์— ๋ฌธ์„œ๋กœ ์ž‘์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

 

2. Frontend์˜ Best practice

Frontend๋Š” HTML, CSS, Javascript๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ์œผ๋กœ Typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žฅ์ ์ธ์ง€, ์–ด๋–ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ Best practice๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด React๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋ฉด typescript์™€ redux pattern์„ ์‚ฌ์šฉํ•˜๊ณ , ํŒจํ„ด์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋ช‡์ผ ์ •๋„ ์ถฉ๋ถ„ํžˆ ๊ณต๋ถ€ํ•  ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฌธ์„œ๋ฅผ README.md์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

3. DB ์Šคํ‚ค๋งˆ ์„ค๊ณ„

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



Backend ๊ฐœ๋ฐœํ•˜๊ธฐ

์œ„์˜ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๋‚˜๋ฉด ๊ณต๋ถ€ํ–ˆ๋˜ ๋ฐฉ์‹๋Œ€๋กœ ์ตœ๋Œ€ํ•œ ํŒจํ„ด์— ๋งž๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. 

DB๋Š” stored procedure๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. 

 

Backend ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

  • Route๋Š” ๋™์‚ฌ๊ฐ€ ์•„๋‹Œ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ง๊ธ€์„ ๋‚จ๊ธด๋‹ค๋ผ๊ณ  ๋ดค์„ ๋•Œ, POST {domain}/v1/comments 
  • Controller-Service-Repository with dependency injection ํŒจํ„ด์„ ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. 
  • Unit tests๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋Š” ๋””์ž์ธ์ด ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • KISS, DRY, YAGNI, SOLID ์›์น™ ์ •๋„๋Š” ๊ฒ€์ƒ‰ํ•ด์„œ ์ตœ๋Œ€ํ•œ ์ •๋…์„ ํ•ด์„œ ์‚ดํŽด๋ณด๊ณ  ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•ด ๋ด…๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์–ธ๋“ฏ ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€๋Š” ์•Š์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ฒˆ ์ฝ๊ณ  ์ตœ๋Œ€ํ•œ ์ง€์ผœ๋ณด๋„๋ก ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. 
  • Design pattern ๊ด€๋ จ ์„œ์ ์„ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ, ๊ผญ ํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
  • Dependency injection framework์€ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. Decoupling๊ณผ ๋‚˜์ค‘์— Unit tests๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์žˆ์–ด์„œ ํฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
  • Unit tests๋ฅผ ์œ„ํ•ด์„œ Mocking framework๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DB๋Š” Stored procedure๋ฅผ ๋งŒ๋“ค๊ณ , ์ฝ”๋“œ๋‚ด์—์„œ stored procedure๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์˜ ์ด์œ ๋กœ SQL Injection๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ  ๊ผญ ์ง€ํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Unit tests

Unit tests๋Š” TDD๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. TDD๋Š” ์„ ํƒ์‚ฌํ•ญ์ด์ง€๋งŒ, Unit tests๋Š” ๊ฐœ๋ฐœ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ณผ์ •์ค‘์— ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์•„๋ฌด๋ฆฌ ๊ฐ•์กฐํ•ด๋„ ์ง€๋‚˜์น˜์ง€ ์•Š์ง€๋งŒ, ์ง€๊ธˆ ์ด ๊ธ€์—์„œ ๋ชจ๋“  ์žฅ์ ์„ ๋‚˜์—ดํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ ์–ด๋„ ๋‘๊ถŒ ์ด์ƒ์˜ TDD๋‚˜ ์œ ๋‹›ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์„œ์ ์„ ์ฝ์–ด ๋ณด๋Š” ๊ฒƒ์„ ๋งค์šฐ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ ํ™•์‹คํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Unit test๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋Š” ๋‚˜์œ ๋””์ž์ธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €์˜ ๊ฒฝ์šฐ๋Š” ๊ตฌ์ง์ž์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณผ ๋•Œ ์œ ๋‹›ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฑฐ์˜ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ๋งŽ์€ ํ”Œ๋Ÿฌ์Šค ์ ์ˆ˜๋ฅผ ์ค๋‹ˆ๋‹ค. 

์ด๊ฑด ์ผ์ข…์˜ ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์ผ์ข…์˜ ๋งˆ์Œ๊ฐ€์ง ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ์•„๊ฐ€๊ธฐ๋งŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์‚ฌ๋žŒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ์กฐ๊ธˆ ๋”๋””์ง€๋งŒ ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์‚ฌ๋žŒ์ธ๊ฐ€์˜ ์ฐจ์ด์ธ๋ฐ ์ด๊ฑด ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ์—์„œ๋Š” ํฐ ์ฐจ์ด๋กœ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. ์•„์ง์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์‹ค์ฒœ์„ ์ž˜ ํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํฌ์ธํŠธ๊ฐ€ ์ข‹์€ ํšŒ์‚ฌ์— ์ข‹์€ ์กฐ๊ฑด์œผ๋กœ ์ทจ์งํ•  ์ˆ˜ ์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ์š”๊ฑด์ด๋ผ๊ณ  ๊ฐํžˆ ์ด์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋‹ค๋‹ˆ๋Š” ํšŒ์‚ฌ์—์„œ๋„ ์กธ์—…์ž๋“ค์˜ ๋ฉด์ ‘์„ ๋งŽ์ด ๋ณด์ง€๋งŒ, ์œ ๋‹›ํ…Œ์ŠคํŠธ ๋งŒํผ์€ ๋‹น๋ฝ ์—ฌ๋ถ€์— ์žˆ์–ด์„œ ์•„์ฃผ ํฐ ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์ž‘๊ฒŒ ๋ณด์ง€ ๋ง๊ณ , ์ตœ๋Œ€ํ•œ Code coverage๊ฐ€ 100ํ”„๋กœ ๋  ๋•Œ ๊นŒ์ง€ ๋…ธ๋ ฅํ•ด ๋ณด๋ฉด ๋ณธ์ธ์˜ ์‹ค๋ ฅ ํ–ฅ์ƒ๊ณผ ์ทจ์ง์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. 

 

Frontend์˜ ๊ฐœ๋ฐœ๊ณผ Unit tests

Frontend ๊ฐœ๋ฐœ์กฐ์ฐจ ์ •ํ•ด์ง„ ํŒจํ„ด์— ๋งž๊ฒŒ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. React๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Action, Reducer, Container, View, Comopnent๋ฅผ ์ •ํ™•ํ•œ ์›์น™์œผ๋กœ ๋งŒ๋“ค์—ˆ๋А๋ƒ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. 

๋ฌผ๋ก  Frontend์˜ ๊ฒฝ์šฐ๋„ Unit tests๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค ์˜ˆ์ œ์— Unit tests๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ข€ ๊ฑธ๋ฆฌ์ง€๋งŒ, Interaction tests ( View, Component ) ๊นŒ์ง€ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋””์ž์ธ์€ ์ตœ๋Œ€ํ•œ ์‹ฌํ”Œํ•˜๊ฒŒ! ๊ทธ๋ฆฌ๊ณ  ๋ฐฐํฌํ•ด ๋ด…์‹œ๋‹ค.

๋งŒ๋“  ๊ฒŒ์‹œํŒ์˜ ๋ฐฐํฌํ•ด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ฒŒ์‹œํŒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์›ํ•œ ํฌ์ง€์…˜์ด ์›น ๋””์ž์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์ด์ƒ ๋””์ž์ธ์ด ํ™”๋ คํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. 

 

๊ฐœ๋ฐœ์ด ์™„๋ฃŒ ๋˜์—ˆ์œผ๋ฉด ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ๋ณด๊ฐ• ํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์€ ๋ฌธ์„œ ๋งŒ๋“ค๊ธฐ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋”ฑ ์™„๋ฃŒํ•˜๊ณ , ๊ธฐ๋Šฅ ์ž˜ ์ž‘๋™ ํ•˜๋‹ˆ ์† ํ„ธ๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒซ ์ธ์ƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž…์žฅ์—์„œ README.md์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ž˜ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ผ๋ฉด ๋งŽ์€ ํ”Œ๋Ÿฌ์Šค ์ ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์„ ํ† ๋Œ€๋กœ ์ €๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

  • ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ ์„ค๋ช…
  • Key summary
    • ํฌํŠธํด๋ฆฌ์˜ค์—์„œ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ๋“ค์„ ์ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ๋‹›ํ…Œ์ŠคํŠธ Code coverage๊ฐ€ 100%๋ผ๋ฉด ์ ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. 
  • Folder structure ์†Œ๊ฐœ
  • Backend architecture
    • Routes/Endpoints ์†Œ๊ฐœ
    • Controller, Service, Repository, Store procedure ๊ด€๊ณ„๋„
    • DB ์Šคํ‚ค๋งˆ
  • Frontend architecture
    • React๋ผ๋ฉด Redux pattern์˜ ์—ญํ•  ์†Œ๊ฐœ
  • ์„ค์น˜ ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ ๋ฐฉ๋ฒ•
  • ํ–ฅํ›„ ์ถ”๊ฐ€ ํ•  ๊ธฐ๋Šฅ๋“ค




 

์‚ฌ์‹ค ์œ„์—์„œ ๋งํ•œ ์ •๋„ ๋ผ๋„, ์ •ํ•ด์ง„ ํŒจํ„ด๊ณผ ๋ฒ„๊ทธ ์—†์ด ๋งŒ๋“ค๋ ค๊ณ  ํ•œ ์™„์„ฑ๋„ ๊ทธ๋ฆฌ๊ณ  ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋ฐ ๋ฌธ์„œ๊นŒ์ง€ ์™„์„ฑ๋œ๋‹ค๋ฉด ๋ฝ‘์„ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํฌํŠธํด๋ฆฌ์˜ค๋Š” ์ด๋ ฅ์„œ์— ํฌํ•จ์‹œ์ผœ์„œ, ๋‚˜์ค‘์— ์ด๋ ฅ์„œ๋ฅผ ๊ฒ€ํ† ํ•ด ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์ด github repository์— ๊ฐ”์„ ๋•Œ ๊ตฌ์ง์ž์˜ ์‹ค๋ ฅ๊ณผ ์Šคํƒ€์ผ์„ ํŒŒ์•…ํ•˜๋Š”๋ฐ ๋งŽ์€ ์ฐธ๊ณ ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚จ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐ๋Š” ํ•˜๋‚˜, ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋…น์—ฌ๋ณด๋ ค๊ณ  ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณธ์ธ์ด ์ง์ ‘ ๋งŒ๋“ค๊ณ  ์ดํ•ดํ•œ ๊ฒƒ์ด ์•„๋‹Œ ์ด์ƒ ๋ฉด์ ‘์„ ๋ณผ ๋•Œ ์ด๋ฏธ ํŒ๊ฐ€๋ฆ„์ด ๋‚ฉ๋‹ˆ๋‹ค.

 

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

 

  • ๋กœ๊ทธ์ธ/ํšŒ์› ๊ฐ€์ž… ๊ธฐ๋Šฅ ์ถ”๊ฐ€ 
  • Authentication/Authorization ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด JWT ( https://jwt.io/ )์™€ ๊ฐ™์€ Token์„ REST API์— ์ถ”๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ํฐ ๋ฒ”์œ„์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ์— ๊ด€๋ จ ์ง€์‹์„ ๋งŽ์ด ์š”๊ตฌํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์„ ์™„์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ์–ป๋Š” ๊ฒƒ๋„ ๋งŽ๊ณ , ํฐ ํ”Œ๋Ÿฌ์Šค ์ ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
  • HTTPS๋ฅผ ์œ„ํ•œ SSL ์ธ์ฆ์„œ
  • REST API์— Swagger ์ž…ํžˆ๊ธฐ
  • REST API์˜ ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋„ ์žˆ์ง€๋งŒ, ๋‹ค์–‘ํ•œ ์–ธ์–ด์˜ client๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Docker ์•ˆ์— frontend์™€ backend๋ฅผ ๋ชจ๋‘ ํฌํ•จ์‹œ์ผœ ๋ณด๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.
  • BDD ๊ธฐ๋ฐ˜์œผ๋กœ Selenium tests ์ž‘์„ฑ
  • Android/iOS, react native, flutter์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœSwagger๋ฅผ ์‘์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ REST client๋ฅผ ์‚ฌ์šฉํ•ด ๋ด…๋‹ˆ๋‹ค.
  • ์ด๋ฏธ REST API๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•ด ๋ณด๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋„ ์œ ๋‹›ํ…Œ์ŠคํŠธ๋Š” ๊ฐ™์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์„ฑ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์— ๋ˆ„๊ตฐ๊ฐ€ ๋ง๊ธ€์„ ๋‹ฌ๋ฉด Push notification์ด ๋ฐœ์†ก๋˜๋Š” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์•ฑ์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค๋ฉด Push notification์„ ๋ฐ›์„์ง€ ์•ˆ๋ฐ›์„์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • Firebase๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋งŽ์€ ์‚ฌ์šฉ์ž์™€ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜ ์ฆ๊ฐ€๋กœ ์ธํ•œ ์‹œ์Šคํ…œ Scaling์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋””์ž์ธ
  • ์ •๋ง ๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์ด ๋Š˜์–ด๋‚˜, ๋ง๊ธ€ Push notification์„ ์•„์ฃผ ๋งŽ์ด ๋ฐœ์†กํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋””์ž์ธ

 

์ œ ์˜๊ฒฌ์œผ๋กœ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์•„์ฃผ ๊ฑฐ์ฐฝํ•œ ๊ฒƒ์„ ๊ณ ๋ฏผํ•ด์•ผ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์€ ํšŒ์‚ฌ์˜ ๊ฒฝ์šฐ ์›น์ด์–ด์•ผ ํ•˜๋‚˜, ์•ฑ์ด์–ด์•ผ ํ•˜๋‚˜๋„ ์š”์ฆ˜์—๋Š” ํฌ๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €์˜ ๋…ผ์ ์€ ํšŒ์‚ฌ ์ž…์žฅ์—์„œ ์ œ๋Œ€๋กœ ๋œ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ฝ‘๋Š” ํ”„๋กœ์„ธ์Šค ๋ฐ ๋งˆ์ธ๋“œ๋ฅผ ๊ฐ–์ถ”์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด, ์‹ ์ž…์„ ๋ฝ‘๋Š”๋ฐ ์žˆ์–ด์„œ Frontend์™€ Backend์˜ ํฌ์ง€์…˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๊ณ ๋ฏผํ•˜์˜€๋Š”๊ฐ€, ๊ทธ ์™„์„ฑ๋„๋Š” ๊ธฐ๋Šฅ๊ณผ ์ƒ๊ด€์—†์ด ์–ผ๋งˆ๋‚˜ ํƒ„ํƒ„ํ•œ๊ฐ€. ํ•œ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์งœ๋”๋ผ๋„ ์ด ๋ถ€๋ถ„์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‹คํ–‰ํ•ด ์˜ฎ๊ฒผ๋А๋ƒ ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•