/CommB-Vue-Springboot-Web-SNS-Project

๐Ÿ“” ์ฑ…์— ์ง‘์ค‘ํ•œ ์›น SNS ๊ฐœ๋ฐœ (210712-210820)

Primary LanguageJava

CommB ๐Ÿ“š

Vue์™€ SpringBoot๋ฅผ ํ™œ์šฉํ•œ ๋…์„œ ๊ด€๋ จ ์›น SNS ๊ฐœ๋ฐœ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๐ŸŒˆ About

  • ๊ฐœ๋ฐœ ์–ธ์–ด

    • Vue.js 2.6.11 | vue/cli 4.5.0
    • Springboot 2.5.2 | Gradle 6.8.3
  • ํŒ€์› ์ •๋ณด ๋ฐ ์—…๋ฌด ๋ถ„๋‹ด

    image-20210824151052994

๐ŸŒŸ Overview

  • Communication with Books

    • '์ฑ…'์„ ์ค‘์‹ฌ์œผ๋กœ ์†Œํ†ตํ•˜๋Š” ์›น SNS ํ”„๋กœ์ ํŠธ

๐Ÿš€ Service

1. ๋ชจ๋ฐ”์ผ ์‚ฌ์ด์ฆˆ์— ์ง‘์ค‘ํ•œ ์›น ๋””์ž์ธ

  • CommB๋Š” ๋ชจ๋ฐ”์ผ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์›น SNS์ž…๋‹ˆ๋‹ค.

    • ๊ธฐ์กด SNS ํ”Œ๋žซํผ์˜ ๊น”๋”ํ•œ UI์— CommB๋งŒ์˜ ๊ท€์—ฌ์šด ํฌ์ธํŠธ๋ฅผ ๋”ํ•ด UI ๋””์ž์ธ์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

    image-20210824151442394

2. ๋‹ค์–‘ํ•œ ์ฑ… ์ •๋ณด์™€ ๊ด€๋ จ ๊ธฐ๋Šฅ

  • ์นด์นด์˜ค ์ฑ… ๊ฒ€์ƒ‰ API์™€์˜ ์—ฐ๋™์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ฑ… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ฑ…๊ณผ ๊ด€๋ จํ•œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

    image-20210824151835062

3. ๊พธ์ค€ํ•œ ๋…์„œ ๊ถŒ์žฅ์„ ์œ„ํ•œ ์ฑŒ๋ฆฐ์ง€

  • ์‚ฌ์šฉ์ž๋“ค์˜ ๊พธ์ค€ํ•œ ๋…์„œ๋ฅผ ๊ถŒ์žฅํ•˜๊ธฐ ์œ„ํ•ด ์œ„ํด๋ฆฌ/๋ฐ์ผ๋ฆฌ ์ฑŒ๋ฆฐ์ง€๋ฅผ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

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

    image-20210824151928170

๐Ÿ‘€ Project Review in FE

GOOD ๐Ÿ‘

  • JWT ํ† ํฐ ์ธ์ฆ๊ณผ ์„œ๋ฒ„ ์—๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ axios interceptor๋ฅผ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋ฌธ์„œ

    • ์ธํ„ฐ์…‰ํ„ฐ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ 500 Server Error ํ•ธ๋“ค๋ง, access tokenยทrefresh token ์ €์žฅ ๋ฐ header์— ์ถ”๊ฐ€, ํ† ํฐ ๋งŒ๋ฃŒ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ถ”ํ›„ ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ ์ถ”ํ›„ ์ž‘์—…์€ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ ,
      • access token๋งŒ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, refresh token์„ header์— ์ถ”๊ฐ€ํ•ด ๊ธฐ์กด ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋ฐœ๊ธ‰๋ฐ›์€ token์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ
      • refresh token๊นŒ์ง€ ๋ชจ๋‘ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๋„๋ก ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ, vue-router ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋ฌธ์„œ

  • ํ”ผ๋“œ์™€ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ์ •๋ฐฉํ˜• ์‚ฌ์ด์ฆˆ๋กœ cropํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ , ๋ชจ๋ฐ”์ผ์—์„œ ํ™œ์šฉ์ด ๊ฐ€์žฅ ์‰ฝ๋‹ค๊ณ  ํŒ๋‹จํ•œ vue croppa๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋ฌธ์„œ

  • ๊ฒŒ์‹œ๋ฌผ์ด๋‚˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ์ธํ”ผ๋‹ˆํŠธ ์Šคํฌ๋กค์„ ์ ์šฉํ–ˆ์œผ๋ฉฐ, ๊ทธ ๊ณผ์ •์—์„œ Lazy load ํšจ๊ณผ๋ฅผ JS๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ์ธํ”ผ๋‹ˆํŠธ ์Šคํฌ๋กค์˜ ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ์ด ํ™”๋ฉด ํ•˜๋‹จ๊ณผ ๊ฐ€๊นŒ์›Œ์กŒ์„ ๋•Œ ๋‹ค์Œ ํŽ˜์ด์ง€ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๊ตฌ์„ฑํ–ˆ๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ฝ˜ํ…์ธ ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์„ ๋ฉˆ์ถ”๋Š” ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
    • scroll ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด ์‚ฌ์ด์ฆˆ์™€ ๊ฒŒ์‹œ๋ฌผ์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ opacity์™€ translateY๋ฅผ ์กฐ์ •ํ•ด lazy load ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์นด์นด์˜ค API๋ฅผ ์ด์šฉํ•œ ์ฑ… ๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ, space๊ฐ€ ํฌํ•จ๋˜์—ˆ์„ ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ์„ ์ธ์ง€ํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

    • input ๋‹จ์–ด์—์„œ space๊ฐ€ ํฌํ•จ๋  ๊ฒฝ์šฐ +๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ•ด ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก fixํ–ˆ์Šต๋‹ˆ๋‹ค.

Need to Improve ๐Ÿšง

  • ์—ฌ๋Ÿฌ ๋ช…์ด ํ•จ๊ป˜ํ•˜๋Š” ์ฒซ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•œ ์•„์‰ฌ์›€๊ณผ ํ•จ๊ป˜ ํ˜‘์—… ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ๋งŽ์ด ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

      • ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ์•„์‰ฌ์›€์ด ๋‚จ์•„ ์ดํ›„ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ์ ์„ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด,
      1. UI ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ๋””์ž์ธ๋ฟ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์—ฌ ํŒ€ ๋‚ด ํ•ฉ์˜๋„๋ฅผ ๋†’์—ฌ์•ผ ์ƒํ˜ธ ๊ฐ„์˜ ์ž‘์—…์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
      2. ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” CSS ์ฝ”๋“œ๋Š” ์ดˆ๋ฐ˜๋ถ€ ์ž‘์—…๊ณผ ๊ฐ™์ด ์Šคํƒ€์ผ์‹œํŠธ๋กœ ์ •๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
      3. ๋™์ผํ•˜๊ฑฐ๋‚˜ ์œ ์‚ฌํ•œ ๋กœ์ง์˜ method, computed๊ฐ€ ๋ณด์ด๋Š”๋ฐ ์ด ์—ญ์‹œ vuex๋ฅผ ์ข€ ๋” ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
      4. ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ํ”ผ๋“œ๋ฐฑํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์กฐ๊ธˆ ๋” ๋‘˜ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ํ˜ผ์„ ์ด ์ ์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
    • API ํ†ต์‹ ์„ ํ•˜๋ฉฐ, ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋„ค์ŠคํŒ…์ด ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, response.data.data์˜ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ Object์— ์•„์ดํ…œ์ด ํ•˜๋‚˜๋ฟ์ธ๋ฐ response.data.<Object>.<key>๋กœ ํ•œ ๋ฒˆ ๋” ๊นŠ์ด ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ api ์„ค๊ณ„๋ฅผ ์กฐ๊ธˆ ๋” ๊ผผ๊ผผํ•˜๊ฒŒ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.