Skip to content

yunhalee05/walkerholic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

231 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation


๐ŸŒณ Walkerholic

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

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






๐Ÿš€ Shortcut




๐Ÿ‘ Improvement

  • โœ”๏ธ Refactoring

    • Challenge :

      ํ”„๋กœ์ ํŠธ๋‹จ์œ„๊ฐ€ ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์ด ์š”๊ตฌ๋˜์–ด์กŒ์Šต๋‹ˆ๋‹ค.

    • Solution :

      ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์˜ ํŠน์ง•์ธ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ™•์žฅ์„ฑ์„ ๋„“ํžˆ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ”„๋กœ์ ํŠธ ์™„๋ฃŒ ํ›„ 2021๋…„ 12์›”๋ถ€ํ„ฐ ๊พธ์ค€ํžˆ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. static์˜ ์‚ฌ์šฉ์ง€์–‘, Wrapperํด๋ž˜์Šค์˜ ํ™œ์šฉ, ๋„๋ฉ”์ธ์œผ๋กœ ๋น„์ง€๋‹ˆ์Šค๋กœ์ง ์ด๋™, ์ธ๋ฑ์Šค ์„ค๊ณ„๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ์‚ญ์ œ ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ํ™•์ธํ•˜๊ธฐ

  • โœ”๏ธ AWS EC2 ๋ฐฐํฌ (๋ง๋ถ„๋ฆฌ)

    • Challenge :

      ๋ˆ„๊ตฌ๋‚˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜จ๋ผ์ธ ์ƒ์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜์˜€์œผ๋‚˜ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„ ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ์š”๊ตฌ๋˜์–ด์กŒ์Šต๋‹ˆ๋‹ค.

    • Solution :

      ๋ณด์•ˆ์„ ์œ„ํ•ด Bastion ์„œ๋ฒ„๋ฅผ ๋‘๋„๋ก ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ์›น์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค๋ง, ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด๋ถ€๋ง์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. AWS EC2๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ง์„ ๋ฐฐํฌํ•˜์—ฌ ๋„๋ฉ”์ธ์„ ์ด์šฉํ•œ ์‚ฌ์ดํŠธ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.๋ง ๊ตฌ์„ฑ ๋ฐ ๋ฐฐํฌ ํ™•์ธํ•˜๊ธฐ

  • โœ”๏ธ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ, ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๋ฐ ์„ฑ๋Šฅ๊ฐœ์„ 

    • Challenge :

      ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฐํฌํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ธก์ •ํ•œ ๊ฒฐ๊ณผ ์„ฑ๋Šฅ ์ ์ˆ˜๋Š” 76์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์Ÿ ์›น์‚ฌ์ดํŠธ(๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ, ๋„ค์ด๋ฒ„ ์‡ผํ•‘, ํ‹ฐ์Šคํ† ๋ฆฌ)์˜ ํ‰๊ท  ๊ฒฐ๊ณผ ๊ฐ’์ธ 79์ ๋ณด๋‹ค ๋‚ฎ์€ ์ ์ˆ˜๋กœ ์„ฑ๋Šฅ์˜ ๊ฐœ์„ ์ด ์š”๊ตฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • Solution :

      ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€๋ถ„์—์„œ๋Š” ProgressiveImages๋ฅผ ์ด์šฉํ•˜์—ฌ FirstView ์‹œ๊ฐ„์„ ์ค„์—ฌ๋ณด๊ณ ์ž ํ•˜์˜€๊ณ , ์„œ๋ฒ„์—์„œ๋Š” Redis์บ์‹œ ๋ฐ ์™ธ๋ถ€ API์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ๋ฅผ ์ ์šฉํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•˜์—ฌ http2์„ ์ด์šฉํ•œ ๋ณด์•ˆ์„ฑ ํ–ฅ์ƒ, gzip ์••์ถ• ๋ฐ ์บ์‹ฑ์˜ ํ™œ์šฉ, ๋ถ€ํ•˜๋ถ„์‚ฐ์„ ํ†ตํ•ด ์›น์„ ๊ฐ€์†ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ DB์˜ replication์„ ์ด์šฉํ•˜์—ฌ DB๋กœ์˜ ์š”์ฒญ์„ GET์€ slaveDB๋กœ ๊ทธ์™ธ์˜ ์š”์ฒญ์€ Master DB๋กœ ๋ณด๋‚ด๋„๋กํ•˜์—ฌ DB๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์ ์ˆ˜(76 -> 89), FirstByte( 1.239S -> 1.062S), FirstView(19.320S -> 5.492S), FCP(3.557S -> 2.555S), SI(7.766S -> 5.009S), LCP(9.887S -> 5.595S), TotalByte(9,153KB -> 1,824KB)์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ค„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ๊ฐœ์„  ํ™•์ธํ•˜๊ธฐ

  • โœ”๏ธ Flyway์˜ ์ ์šฉ

    • Challenge :

      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ •์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋งค๋ฒˆ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ ‘์†ํ•˜์—ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • Solution :

      Flyway๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ์˜ ๋ณ€๊ฒฝ์ด๋ ฅ์„ ๋‚จ๊ธฐ๋„๋ก ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋„๋ก ๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง

    • Challenge :

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

    • Solution :

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

  • โœ”๏ธ API ๋ฌธ์„œํ™”(Spring Rest Docs)

    • Challenge :

      ํ”„๋กœ์ ํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ API๋ฅผ ๋ฌธ์„œํ™”ํ•˜์—ฌ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • Solution :

      API๋ฅผ ๋ฌธ์„œํ™” ํ•˜๊ธฐ์œ„ํ•ด Spring Rest Docs๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. spring-restdocs-asciidoctor์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ snippets์„ ์ด์šฉํ•ด ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” API ๋ฌธ์„œํ™”๋ฅผ ํ†ตํ•ด API๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ์˜ API์— ๋Œ€ํ•˜์—ฌ Request, Response๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ

  • โœ”๏ธ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ(Acceptance Test)

    • Challenge :

      ํ”„๋กœ๊ทธ๋žจ์ด ์›ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์ด ์š”๊ตฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • Solution :

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

  • โœ”๏ธ OAuth2

    • Challenge :

      ์‚ฌ์šฉ์ž์˜ ํŽธ๋ฆฌ์„ฑ์„ ์œ„ํ•˜์—ฌ ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค์˜ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • Solution :

      Spring Security OAuth๋ฅผ ํ†ตํ•˜์—ฌ Rest API๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. WebSecurityConfig์—์„œ OauthLogin์˜ URI์„ค์ •์„ ํ•ด์ฃผ๊ณ  ์„ค์ •๋œ ์ฃผ์†Œ๋กœ OAuth2UserRequestํƒ€์ž…์˜ ์ธ์ฆ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด CustomOAuth2UserService์—์„œ ์†Œ์…œํƒ€์ž…๋ณ„๋กœ ์„ค์ •ํ•ด๋†“์€ OAuth2UserInfo๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ ๋’ค, ํšŒ์› ๋“ฑ๋ก ํ˜น์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์— ์„ฑ๊ณตํ•œ๋‹ค๋ฉด OAuth2SuccessHandler๋ฅผ ํ†ตํ•ด ๋“ฑ๋ก๋œ ํšŒ์›์˜ ํ† ํฐ์„ HttpCookieOAuth2AuthorizationRequestRepository๋ฅผ ์ด์šฉํ•ด ๋“ค์–ด์˜จ ์ฃผ์†Œ์™€ ํ† ํฐ์„ ํ•จ๊ป˜ ๋˜๋Œ๋ ค ์ฃผ๋„๋ก ํ•˜๊ณ , ์‹คํŒจํ•œ๋‹ค๋ฉด OAUth2AuthenticationFailureHandler๋ฅผ ํ†ตํ•ด error ์š”์ธ๊ณผ ํ•จ๊ป˜ ์ด์ „ ์ฃผ์†Œ๋กœ ๋˜๋Œ๋ ค ๋ณด๋‚ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ SpringData JPA

    • Challenge :

      ๊ธฐ์กด์—๋Š” Crud repository๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ๋งŒ์œผ๋กœ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

    • Solution :

      SpringData JPA๋Š” ๊ฐœ๋ฐœ์‹œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ž‘์„ฑํ•˜๋ฉด ์‹คํ–‰ ์‹œ์ ์— ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—(๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐฉ์ง€), ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋“ฑ๋ก๋œ column๋ช…์„ ์ด์šฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ๋งŒ์œผ๋กœ๋„ ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํŽธ๋ฆฌํ•˜๊ฒŒ repository๊ณ„์ธต์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Amazon S3

    • Challenge :

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

    • Solution :

      AWS S3๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜๊ณ  AmazonS3Utils์„ ๋งŒ๋“ค์–ด amazonS3Client๋ฅผ ์ด์šฉํ•œ ์›๊ฒฉ์œผ๋กœ์˜ ํŒŒ์ผ์—…๋กœ๋“œ, ํŒŒ์ผ ์‚ญ์ œ, ํด๋” ์‚ญ์ œ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ JavaMailSender (Simple Mail Message)

    • Challenge :

      ๊ตฌ๋งค์ž๊ฐ€ ์ฃผ๋ฌธ์„ ์™„๋ฃŒํ•œ ๋’ค, ๊ตฌ๋งค์ž์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ฐœ์†กํ•˜๋„๋ก ์„œ๋ฒ„์ธก์—์„œ ๋ฉ”์ผ๋ฐœ์†ก์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • Solution :

      smtp์„ค์ •์„ ๋„ค์ด๋ฒ„ ๋ฉ”์ผ host๋ฅผ ์ด์šฉํ•˜์—ฌ JavaMailSender(spring-boot-starter-mail)์„ ์ด์šฉํ•ด SimpleMailMessageํƒ€์ž…์˜ ๋ฉ”์ผ์ด ์ „์†ก๋˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




โšก๏ธ Challenges

  • โœ”๏ธ JPA delete ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฌธ์ œ

    • Reason :

      ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์‹œ์— ๊ฒŒ์‹œ๋ฌผ ์ด๋ฏธ์ง€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•˜์—ฌ JPA repository๋ฅผ ์ด์šฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ช…์„ ์ž‘์„ฑํ•˜์˜€์œผ๋‚˜ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ๋Š” JPA Repository ๋ชฉ๋ก ์•ˆ์— deleteBy ํ˜•ํƒœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. (EntityManager opne -> SELECT ์ฟผ๋ฆฌ ์‹คํ–‰ -> EntityManager closed -> DELETE ์ฟผ๋ฆฌ ์˜ˆ์™ธ ๋ฐœ์ƒ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

    • Solution :

      ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” deleteBy์ธํ„ฐํŽ˜์ด์Šค ๋ช…์— @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” DTO ์ž‘์„ฑ ๋ฌธ์ œ

    • Reason :

      ์—ฐ๊ด€๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ DTO๋ฅผ ํ†ตํ•ด์„œ ๋ณด๋‚ด๊ณ ์ž ํ•  ๋•Œ, ์—ฐ๊ด€๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด๋ ค๊ณ  ํ•˜๋ฉด ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์„œ๋กœ๋ฅผ ๋ถ€๋ฅด๋ฉฐ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • Solution :

      ํ•ด๋‹น๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น DTO์•ˆ์— ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€ ํ›„ ์—ฐ๊ด€๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ ์ •๋ณด ์ค‘ ๋ณด๋‚ด์•ผํ•˜๋Š” ์„ ํƒ๋ถ€๋ถ„๋งŒ(์—ฐ๊ด€๊ด€๊ณ„๋ถ€๋ถ„ ์ œ์™ธ) ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ๋„ฃ๋„๋ก ์„ค์ •ํ•˜์—ฌ ์ฐธ์กฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




๐Ÿ”ฆ Product Infrastructure




๐Ÿ›  Tech Stack Used

  • Frontend

  • Backend

  • Deploy

  • Testing & Monitoring




๐Ÿซ Implementation

  • โœ”๏ธ SpringBoot, React, MySQL & MVC pattern

    ํ”„๋กœ์ ํŠธ๋Š” StpringBoot(์ž๋ฐ”๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ), React(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ), MySQL(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด์กŒ์œผ๋ฉฐ react๋ฅผ ์ด์šฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  SpringBoot๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ๊ตฌ์ถ• ํ›„ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•˜์—ฌ ์ ์ ˆํ•œ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด์ด๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ MVC pattern

    Model, View, Controller ์˜ ํŒจํ„ด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Authenticaton & Authorization (JWT & Spring Security)

    ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ณ„๋„์˜ ์ €์žฅ์†Œ๋ฅผ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” JWTํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ์ธ์ฆ, ๋ฐœ๊ธ‰์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ด๋ฃจ์–ด์ง€๋„๋ก ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ๋ถ€์—ฌ(์ธ๊ฐ€)๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋Š” Custom Router, ๋ฐฑ์—”๋“œ๋Š” Spring Security(springboot-starter-security)๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ์—ญํ• (ROLE)์— ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ์—ฌ๋ถ€๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ TDD (Test Driven Development)

    FIRST(Fast, Independent, Repeatable, Self Validating, Timely), given-when-then ๊ทœ์น™์— ๋ถ€ํ•ฉํ•˜๋„๋ก Repository๊ณ„์ธต๊ณผ Service๊ณ„์ธต์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ์•ฑ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Pagination & Sort

    ํ•œ๋ฒˆ์— ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์š”๊ตฌํ•˜๋Š” ๊ฒƒ(์„œ๋ฒ„ ๋ถ€ํ•˜)์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ repository์—์„œ countQuery๋ฅผ ์ด์šฉํ•˜์—ฌ pagination๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Sort๊ธฐ๋Šฅ์€ @Query ์–ด๋…ธํ…Œ์ด์…˜์—์„œ ORDER BY๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Pageable์„ ์ƒ์„ฑ์‹œ์— Sort.by๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์ค€์„ ์ •ํ•ด ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ—ค ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ AWS EC2 Deployment

    frontend-maven-plugins๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํ”„๋ง๋ถ€ํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๋™์‹œ์— ์‹คํ–‰์‹œํ‚ค๋Š” .jarํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค AWS EC2๋ฅผ ํ†ตํ•œ ๋ฐฐํฌ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Infinite Scrolling

    Pagination๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก ๋ถ€๋ถ„(PostThumb)์—์„œ๋Š” Intersection Observer์™€ useRef๋ฅผ ์ด์šฉํ•œ ๋ฌดํ•œ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ผ์ • ๋ถ€๋ถ„์ด ํ™”๋ฉด์— ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Redux

    ๋ฆฌ๋•์Šค๋ฅผ ํ†ตํ•˜์—ฌ View์—์„œ๋Š” action๋งŒ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ด ์•ก์…˜์€ dispatcher๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋Š” store๋ฅผ ํ†ตํ•ด์„œ View๋กœ ์ „๋‹ฌ์ด ๋˜๋„๋ก ํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Constant๋ฅผ ์ง€์ •ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์•ก์…˜์— ์š”์ฒญ, ์„ฑ๊ณต, ์‹คํŒจ์˜ ๊ฒฝ์šฐ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ •์˜ํ•˜์˜€๊ณ  ๊ฐ๊ฐ์˜ ์•ก์…˜์€ ๋ชจ๋‘ ์ €์žฅ๋˜์–ด ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Payment

    ์†Œ๋น„์ž๊ฐ€ ๋ฌผํ’ˆ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด 'react-paypal-button-v2'์˜ Paypal๋ฒ„ํŠผ์„ ์ด์šฉํ•˜์—ฌ ํŽ˜์ดํŒ”์„ ํ†ตํ•œ ์‹ค์ œ ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • โœ”๏ธ Masonary Layout

    ๊ธฐ์กด์˜ ๊ทœ๊ฒฉํ™” ๋˜์–ด์žˆ๋Š” ๊ทธ๋ฆฌ๋“œ ํ˜•์‹์ด ์•„๋‹Œ ๋ฒฝ๋Œ์‹ค ๋ ˆ์ด์•„์›ƒ ํƒ€์ž…์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก(PostThumb)๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




๐Ÿชต Features

๐Ÿฅ• ์‚ฌ์šฉ์ž, ๊ฒŒ์‹œ๋ฌผ, ์ƒํ’ˆ, ์•กํ‹ฐ๋น„ํ‹ฐ์— ๋Œ€ํ•œ CRUD(Create, Read, Update, Delete) ๊ฐ€๋Šฅ

๐Ÿฅ• ์‚ฌ์šฉ์ž์˜ ์•กํ‹ฐ๋น„ํ‹ฐ, ๊ฒŒ์‹œ๋ฌผ, ์ƒํ’ˆ ๋“ฑ๋ก ๊ฐ€๋Šฅ(์—ฐ๊ด€๊ด€๊ณ„)

๐Ÿฅ• ์ƒํ’ˆ ๋“ฑ๋ก ๋‚ ์งœ, ๋ฆฌ๋ทฐ์ˆœ, ๊ธˆ์•ก์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

๐Ÿฅ• ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก ๋‚ ์งœ, ๋ฆฌ๋ทฐ์ˆœ, ๊ธˆ์•ก์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

๐Ÿฅ• Json Web Token์„ ์ด์šฉํ•œ ์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ

๐Ÿฅ• ์‚ฌ์šฉ์ž์˜ ์•Œ๋ฆผ ์„ค์ •์— ๋”ฐ๋ผ JavaMailSender๋ฅผ ์ด์šฉํ•œ ์ฃผ๋ฌธ๋‚ด์—ญ ํ™•์ธ ์ด๋ฉ”์ผ ์ˆ˜์‹  ํ˜น์€ CoolSMS๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ž ์ˆ˜์‹ ๊ฐ€๋Šฅ

๐Ÿฅ• ๋‚ด ๊ฒŒ์‹œ๋ฌผ๊ณผ ํ•จ๊ป˜ ํŒ”๋กœ์šฐ ํ•˜๋Š” ํšŒ์›์˜ ๊ฒŒ์‹œ๋ฌผ๊ณผ ํ˜น์€ ๋‚ด๊ฐ€ ํŒ”๋กœ์šฐ ํ•˜์ง€ ์•Š์€ ํšŒ์›์˜ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿฅ• ๋‚ด๊ฐ€ ์ข‹์•„์š” ํ•œ ๊ฒŒ์‹œ๋ฌผ ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿฅ• ๊ด€๋ฆฌ์ž๋Š” ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ, ์‚ฌ์šฉ์ž๋ฆฌ์ŠคํŠธ, ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ ํ™•์ธ ๊ฐ€๋Šฅ


แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฉ”์ธํŽ˜์ด์ง€

์‚ฌ์šฉ์ž, ํฌ์ŠคํŠธ, ๋ฌผํ’ˆ๋ณ„๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฉ”์ธํŽ˜์ด์ง€

์ตœ๊ทผ ๋“ฑ๋ก ๋ฌผํ’ˆ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฉ”์ธํŽ˜์ด์ง€

๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ํฌ์ŠคํŠธ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฉ”์ธํŽ˜์ด์ง€

์‚ฌ์ด๋“œ๋ฐ” ๊ธฐ๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

ํ”„๋กœํ•„ ํŽ˜์ด์ง€

์ข‹์•„์š” ๋ˆ„๋ฅธ ํฌ์ŠคํŠธ, ์ž์‹ ์˜ ํฌ์ŠคํŠธ, ํ”„๋กœํ•„ ํ™•์ธ, ํ”„๋กœํ•„ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฐ˜์‘ํ˜• ์›นํŽ˜์ด์ง€

ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์›นํŽ˜์ด์ง€ ์„ค๊ณ„.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์‚ฌ์šฉ์ž ์•กํ‹ฐ๋น„ํ‹ฐ ํŽ˜์ด์ง€

์ž์‹ ์˜ ์•กํ‹ฐ๋น„ํ‹ฐ ๋“ฑ๋ก,์‚ญ์ œ ๋ฐ ์ ์ˆ˜ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์•กํ‹ฐ๋น„ํ‹ฐ ํŽ˜์ด์ง€

์•กํ‹ฐ๋น„ํ‹ฐ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์•กํ‹ฐ๋น„ํ‹ฐ ๋ชฉ๋ก ํŽ˜์ด์ง€

๊ด€๋ฆฌ์ž๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ CRUD ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก ํŽ˜์ด์ง€

๊ฒŒ์‹œ๋ฌผ ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰, ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ธฐ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์‚ฌ์šฉ์ž ๊ฒŒ์‹œ๋ฌผ ํŽ˜์ด์ง€

ํŒ”๋กœ์šฐํ•˜๋Š” ์‚ฌ์šฉ์ž์™€ ์ž์‹ ์˜ ๊ฒŒ์‹œ๋ฌผ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๊ฒŒ์‹œ๋ฌผ ํŽ˜์ด์ง€

์‚ฌ์šฉ์ž ์ž์‹ ์˜ ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€

ํ‚ค์›Œ๋“œ, ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€

์ œํ’ˆ ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ. ์นดํŠธ์— ๋‹ด๊ธด ์ƒํ’ˆ๋„ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€

๋ฆฌ๋ทฐ ํ™•์ธ, ๋“ฑ๋ก ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ฃผ๋ฌธ ํŽ˜์ด์ง€

์ƒํ’ˆ ๋ชฉ๋ก ํ™•์ธ, ํŽ˜์ดํŒ” ๊ฒฐ์ œ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ฃผ๋ฌธ ์ƒ์„ธ ํŽ˜์ด์ง€

์ž์‹ ์˜ ์ฃผ๋ฌธ ์ƒ์„ธ๋‚ด์—ญ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€

๊ด€๋ฆฌ์ž๋Š” ๋ชจ๋“  ์ฃผ๋ฌธ, ์ƒํ’ˆ, ์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ํ™•์ธ ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ œํ’ˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€

๊ด€๋ฆฌ์ž์™€ ํŒ๋งค์ž๋Š” ์ƒํ’ˆ ์ˆ˜์ • ๊ฐ€๋Šฅ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23

์ฃผ๋ฌธ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€

๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ์ฃผ๋ฌธ ๋ฆฌ์ŠคํŠธ ํ™•์ธ ๊ฐ€๋Šฅ.




๐Ÿชœ ERD(Entity Relationship Diagram)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-02 แ„‹แ…ฉแ„’แ…ฎ 6 48 23




About

๐Ÿฅ‘ SpringBoot, React, MySQL์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จํ•œ ํฌ์ŠคํŠธ, ๊ตฟ์ฆˆํŒ๋งค, ์•กํ‹ฐ๋น„ํ‹ฐ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ์ดํŠธ

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors