Skip to content
/ THXSTORE Public

๐Ÿ”ฅSSAFY 4๊ธฐ FINAL ์ž์œจ PROJECT๐Ÿ”ฅ

Notifications You must be signed in to change notification settings

upswp/THXSTORE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

logo


Name ๋ฐ•๋Œ€ํ˜„ ์„ฑ์ •์šฑ ๋ฐ•์ƒ์šฐ ์ตœ๋™์‹ ํ™ฉ์˜์ค€
Profile image image image image ํ™ฉ์˜์ค€
Position Frontend & UI/UX Frontend & UI/UX ํŒ€์žฅ & Backend Develop Backend Develop & CI/CD Backend Develop & CI/CD
Git @daep93 @gluwein @upswp @pertus123 @junjun0905

ํ”„๋ ˆ์  ํ…Œ์ด์…˜1

  • THXSTORE Project๋ฅผ ํ•จ๊ป˜ํ•˜๋Š” ๊ฐ•์ฒ ์ฝ”๋”ฉํŒ€์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค !

    • [์—๋Ÿฌ์™€ ๋งค์ผ ๋ฐค ์‹ธ์šด๋‹ค.] ์ตœ๋™์‹ ๐Ÿ˜ค
      • ์ธ๊ฐ„ ๋””๋ฒ„๊น…์ด ๋ ๋•Œ๊นŒ์ง€ ๊ฐ•์ฒ  ๋ฉ˜ํƒˆ๋กœ ํ•ด๊ฒฐํ•ด๋‚˜์•„๊ฐ€๋Š” THE ๊ฐ•ํ•œ SSAFY์ธ์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™”์ดํŒ…!
    • [ํ•ญ์ƒ ์›ƒ์Œ์œผ๋กœ ์ธ์‚ฌํ•˜๋Š” ์นœ์ ˆํ•œ] ์„ฑ์ •์šฑ ๐Ÿ˜
      • ์˜จ ์ข…์ผ ์ฝ”๋”ฉํ•˜๋ฉด์„œ ๋งํ•  ์ผ์ด ์—†๋‹ค๋ณด๋‹ˆ ์Šคํฌ๋Ÿผ ๋ฏธํŒ…์‹œ๊ฐ„์ด ์ €์˜ ์œ ์ผํ•œ ํƒˆ์ถœ๊ตฌ ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„๋งŒํผ์€ ํŒ€์›๋“ค๊ณผ ์ฆ๊ธฐ๊ณ  ์‹ถ์–ด์š”!
    • [ํ”„๋กœ์ ํŠธ์˜ ์ตœ์ „๋ฐฉ์—์„œ ๋กœ์ง์„ ์„ค๊ณ„ํ•œ๋‹ค.] ํ™ฉ์˜์ค€ ๐Ÿง
      • ์ตœ์ ํ™”์™€ ์™„์„ฑ๋„๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค !
    • [์†”๋ฃจ์…˜์€ ๋‚˜์—๊ฒŒ ๋งก๊ฒจ๋ผ ํ”„๋ก ํŠธ ์ €๊ฒฉ์ˆ˜] ๋ฐ•๋Œ€ํ˜„ ๐Ÿคฉ
      • ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •์กฐ์ค€ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค!
    • [๋ฏธ์นœ ํ…์…˜์€ ๋‚˜๋ฅผ ์ด๋Œ์–ด] ๋ฐ•์ƒ์šฐ ๐Ÿ˜‹
      • ์ด๋ฒˆ ์ž์œจํ”„๋กœ์ฆ‰ํ…Œ๋กœ ๊ฐ€์žฅ ํฌ๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์—…๊ณผ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘๋ฅผ ์„ฑ๊ณตํ•˜๋Š” SSAFY์ธ์ด ๋˜๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•์ฒ ์ฝ”๋”ฉํŒ€์€ ์–ด๋–ป๊ฒŒ ํ˜‘์—…ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ ๊ฐ€์š”?! ์•„๋ž˜ ๋งํฌ๋กœ ์˜ค์„ธ์š”!


introduce



๐Ÿš€ ๋ฐฐํฌ ํ”Œ๋กœ์šฐ

๋ฐฐํฌํ”Œ๋กœ์šฐ

๐ŸŽฎ ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿ’ปBack-End

Back ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ”ฅ
  • ๊ธฐ์ˆ ์Šคํƒ โš™
  • Spring-Boot : 2.3.9
  • Spring-Boot-Data-JPA
  • spring-boot-starter-mail
  • Spring Security
  • spring-boot-starter-hateoas
  • spring-boot-starter-validation
  • spring-boot-starter-jdbc
  • modelmapper : 2.3.8
  • openvidu-java-client : 2.17.0
  • spring-boot-starter-security
  • jjwt : 0.9.1
  • lombok
  • mysql : 8.0.22
  • h2 : 1.4.200
  • pusher : 2.2.1
  • JUnitParams : 1.1.1
  • junit : 4.12
  • jersey-multipart : 1.19.4
  • spring-restdocs-asciidoctor : 2.0.3.RELEASE
  • spring-restdocs-mockmvc : 2.0.3.RELEASE
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๐Ÿ“š

โœจFront-End

Front ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ ๐ŸŒˆ
  • ๊ธฐ์ˆ ์Šคํƒ โš™
  • JS, HTML, CSS
  • SCSS
  • Vue.js @2.6.11
  • --------------------------------------------------------------------------------------
    • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๐Ÿ“š
    • axios @0.21.1 : Promise ๊ธฐ๋ฐ˜ HTPP ํด๋ผ์ด์–ธํŠธ
    • fontawesome @2.0.2 : ์•„์ด์ฝ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • openvidu-browser @2.17.0 : webRTC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • vue-awesome-swiper @4.1.1 : ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • eslint & prettier @6.7.2 : ํ˜‘์—…์„ ์œ„ํ•œ formatter ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • node-sass @5.0.0 : SASS/SCSS ์ ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • sass-loader @10.1.1 : SASS/SCSS ์ ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • vue-masonry-css @1.0.3 : masonry ๋””์ž์ธ ์ ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ถ”ํ›„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์˜ˆ์ •

    ๐ŸŒInfra

    ๊ฐœ๋ฐœ, CI/CD ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ”ฅ
    • AWS EC2 - Deploy Server
    • AWS S3 - Image(File) Server
    • AWS RDS - DB Server
    • Jenkins
    • GitLab
    • Docker

    โš™๏ธ Install and Usage

    ์‹œ์Šคํ…œ ํ™˜๊ฒฝ

    thxstore๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

    • Created on 17:39 p.m. May 18, 2021
    • OS : Ubuntu 20.04 LTS (GNU/Linux 4.15.0-72-generic x86_64)
    • Cpu ๋ชจ๋ธ : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
    • Total Memory: 16396056 kB
    • ๋ฌผ๋ฆฌ cpu ๊ฐœ์ˆ˜ : 4 cpu๋‹น ๋ฌผ๋ฆฌ ์ฝ”์–ด : 4 ๋…ผ๋ฆฌ ์ฝ”์–ด ์ˆ˜ : 32

    ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

    • jenkins 2.3
      • blueocean : ์ง€์†์  ๋ฐฐํฌ์™€ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” UI๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • docker
      • Backend์™€ Frontend๋ฅผ ์ปจํ…Œ์ด๋„ˆํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • docker-compose - jenkins
    • DB ์„œ๋ฒ„ : aws s3
    • ํŒŒ์ผ ์„œ๋ฒ„ : aws rds
    • WebRTC : openVidu 2.17

    ์ตœ์ข… ๋นŒ๋“œ์™€ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด jenkins ๋‹จ๊ณ„๋Š” ์ œ์™ธํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Ubuntu ๋ฒ„์ „ ์—… ๋ฐ ๊ธฐ๋ณธ ์„ค์น˜

    sudo apt-get update
    sudo apt-get install nodejs
    sudo apt-get install npm

    docker ์„ค์น˜

    frontend์™€ backend๋Š” ๊ฐ ๋„์ปค๋กœ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    # ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜
    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    # GPG Key ์ธ์ฆ
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    # docker repository ๋“ฑ๋ก
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    # ๋„์ปค ์„ค์น˜
    sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
    # ์‹œ์Šคํ…œ ๋ถ€ํŒ…์‹œ ๋„์ปค ์‹œ์ž‘
    sudo systemctl enable docker && service docker start
    # ๋„์ปค ํ™•์ธ
    sudo service docker status

    ๋„์ปค ๋ช…๋ น์–ด

    • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋ณด๋Š” ๋ฒ•
      • sudo docker ps -a
    • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
      • sudo docker rm <container_id>
    • ๋„์ปค ์ด๋ฏธ์ง€ ๋ณด๋Š” ๋ฒ•
      • sudo docker images
    • ๋„์ปค ์ด๋ฏธ์ง€ ์‚ญ์ œ
      • sudo docker rmi <image_id>
    • ๊ฐ•์ œ ์˜ต์…˜ -f (์‚ญ์ œ๊ฐ€ ์•ˆ๋  ๋•Œ,)
      • ex) docker rmi -f <image_id>
    • ๋„์ปค ๋กœ๊ทธ ํ™•์ธ
      • docker logs <image_id> : ๋„์ปค๊ฐ€ ๊บผ์ ธ์žˆ์–ด๋„(์ปจํ…Œ์ด๋„ˆ๊ฐ€) ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ธฐ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ์žก์„ ๋•Œ, ๋งค์šฐ ์œ ์šฉ)

    docker ๋„คํŠธ์›Œํฌ ์„ค์ •

    ๊ฐ™์€ Docker Host๋‚ด์—์„œ ์‹คํ–‰์ค‘์ธ Container๊ฐ„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋…ผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ๊ฐ™์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. nginx๋ฅผ ํ†ตํ•œ front, backend ํ†ต์‹ ์„ ์œ„ํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    sudo docker network create thxstorecicdnetwork

    HTTPS ํ‚ค ๋ฐœ๊ธ‰

    frontend์—์„œ๋Š” ssl์ด ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HTTPS ์ธ์ฆ์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

    sudo apt-get install letsencrypt
    # ๋งŒ์•ฝ nginx๋ฅผ ์‚ฌ์šฉ์ค‘์ด๋ฉด ์ค‘์ง€
    sudo systemctl stop nginx
    # ์ธ์ฆ์„œ ๋ฐœ๊ธ‰
    sudo letsencrypt certonly --standalone -d www์ œ์™ธํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„
    # ์ด๋ฉ”์ผ ์“ฐ๊ณ  Agree
    # ๋‰ด์Šค๋ ˆํ„ฐ no
    # ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜๋Š”๋ฐ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ‘์˜ ๊ฒฝ๋กœ์— ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ์žˆ์Šต๋‹ˆ๋‹ค.
     ssl_certificate /etc/letsencrypt/live/๋„๋ฉ”์ธ์ด๋ฆ„/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/๋„๋ฉ”์ธ์ด๋ฆ„/privkey.pem; 

    Docker ์ดˆ๊ธฐํ™”

    ์‹คํ–‰ ์ค‘์ธ ๋„์ปค ์ค‘, ์ด๋ฆ„์ด๋‚˜ ํฌํŠธ๊ฐ€ ๊ฒน์น  ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์ง€๋ฅผ ์‹œํ‚ต๋‹ˆ๋‹ค.

    # ๋„์ปค ์‹œ์ž‘ ์ „, ๊ธฐ์กด์— ์‹คํ–‰์ค‘์ธ ๋„์ปค๋ฅผ ๋ฉˆ์ถ”๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—….
    docker ps -f name=frontend -q | xargs --no-run-if-empty docker container stop
    docker ps -f name=backend -q | xargs --no-run-if-empty docker container stop
    
    # ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ
    docker container ls -a -f name=frontend -q | xargs -r docker container rm
    docker container ls -a -f name=backend -q | xargs -r docker container rm'
    
    # ๋„์ปค ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
    docker images -f dangling=true && docker rmi $(docker images -f dangling=true -q)

    frontend Dockerfile ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ๋นŒ๋“œ ์‹คํ–‰

    docker build -t frontend:latest ./frontend
    docker run -d --name frontend -p 80:80 -p 443:443 -v /etc/letsencrypt/live/๋„๋ฉ”์ธ์ด๋ฆ„/:/var/jenkins_home/workspace/thxstore-jenkins-cicd/sslkey/ -v /etc/localtime:/etc/localtime:ro --network thxstorecicdnetwork frontend:latest
    
    • ์—ฌ๊ธฐ์„œ /etc/letsencrypt/live/๋„๋ฉ”์ธ์ด๋ฆ„/ ๊ฒฝ๋กœ๋Š” SSL ์ธ์ฆ ํ‚ค๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค. vue.js ๋นŒ๋“œ์™€ nginx๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

    backend Dockerfile ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ๋นŒ๋“œ ์‹คํ–‰

    docker build -t backend:latest ./backend
    docker run -d --name backend --network thxstorecicdnetwork backend:latest
    
    • springboot Gradle Multi Module์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    ๐Ÿ“‚ ๊ฐœ๋ฐœ ์Šคํ”„๋ฆฐํŠธ

    ์Šคํ”„๋ฆฐํŠธโœŒ ๊ธฐ๊ฐ„๐Ÿ“š FE๐ŸŒˆ BE๐Ÿค–
    ํ”„๋กœ์ ํŠธ ๊ตฌ์ƒ ๋ฐ ์ฐฉ์ˆ˜ (v0.0.1) 2021.04.13
    ~
    2021.04.18
    - ๋ฐ˜์‘ํ˜• ์›น ๋…ผ์˜ ์ง„ํ–‰
    - JEST, Storybook ํ•™์Šต ์ง„ํ–‰ ๋ฐ ๋…ผ์˜
    - Database ERD ์ž‘์—… ์ง„ํ–‰
    - REST API ๋ฌธ์„œ ์ž‘์„ฑ
    - ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ•
    - ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ์„ค์ •
    ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    (v0.1.0)
    2021.04.19
    ~
    2021.05.07
    - ๋ฐ•๋Œ€ํ˜„
    - ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์†Œ์…œ SNS(์นด์นด์˜คํ†ก, ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ) ์—ฐ๋™
    - ์ด๋ฉ”์ผ ์ค‘๋ณต ๊ฒ€์‚ฌ์— debounce ์ ์šฉ
    - ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์†Œ์…œ SNS(์นด์นด์˜คํ†ก, ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ) ์—ฐ๋™
    - ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์นด์นด์˜ค ์ง€๋„, ๋‹ค์Œ ์ฃผ์†Œ ์ฐพ๊ธฐ API ์—ฐ๋™
    - ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๊ฐ€๊ฒŒ ์ •๋ณด ์ˆ˜์ • ํŽ˜์ด์ง€ ์ผ๋ถ€ ๊ตฌํ˜„
    - ์„ฑ์ •์šฑ
    - PrivacyPolicy develop(๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋ชจ๋‹ฌ์ฐฝ)
    - AdminPage develop(๊ด€๋ฆฌ์žํŽ˜์ด์ง€)
    - StoreEnrollmentPage develop(์Šคํ† ์–ด ์‹ ์ฒญ ํŽ˜์ด์ง€)
    - FindPasswordPage develop(๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ)
    - async await/ Flex/ SCSS ํ•™์Šต ๋ฐ ์ ์šฉ
    - ๋ฐ•์ƒ์šฐ
    - THXSTORE Entity configure
    - signUp feature develop
    - multi gradle module configure
    - REST Docs configure
    - Spring Security configure
    - CORS Troubleshooting
    - get social member data feature develop
    - check exists by email feature develop
    - ์ตœ๋™์‹
    - ์„œ๋ฒ„ ์ธํ”„๋ผ ๊ตฌ์ถ•
    - ํŒŒ์ผ ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐ ์—ฐ๊ฒฐ
    - ์ž๋™ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ์„ค์ •
    - ์Šคํ† ์–ด ๋กœ์ง ๊ฐœ๋ฐœ
    - ํ™ฉ์˜์ค€
    - ๊ทธ๋ž˜๋“ค ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ๊ตฌ์„ฑ
    - ์ฃผ๋ฌธ ๋กœ์ง ๊ฐœ๋ฐœ
    - ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋กœ์ง ๊ฐœ๋ฐœ
    ํ”„๋กœ์ ํŠธ ์‹ฌํ™” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    (v0.2.0)
    2021.05.08
    ~
    2021.05.16
    - ๋ฐ•๋Œ€ํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๊ฐ€๊ฒŒ ์ •๋ณด ์กฐํšŒ ๋ฐ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - ํœด๋ฌด์ผ, ์šด์˜์‹œ๊ฐ„, ์นดํ…Œ๊ณ ๋ฆฌ, ๊ฐ€๊ฒŒ ์†Œ๊ฐœ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๋ฉ”๋‰ด ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ๋ฉ”๋‰ด ๊ทธ๋ฃน ์กฐํšŒ, ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ๊ตฌํ˜„
    - ๊ทธ๋ฃน ๋ณ„ ๋ฉ”๋‰ด ์กฐํšŒ, ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ๊ตฌํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ํƒ€์ž„๋”œ ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ๋ฉ”๋‰ด ๊ด€๋ฆฌ ํŽ˜์ด์ง€์— ๋“ฑ๋กํ•œ ๋ฉ”๋‰ด๋“ค์„ ํƒ€์ž„๋”œ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๋™
    - ๋“ฑ๋กํ•  ๋ฉ”๋‰ด ๊ทธ๋ฃน๋“ค์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•„์ฝ”๋””์–ธ ๋””์ž์ธ ๊ตฌํ˜„
    - ํƒ€์ž„๋”œ ์˜ˆ์•ฝ ํ›„ ์‹œ์ž‘ ์ „๊นŒ์ง€ ํƒ€์ด๋จธ ๊ตฌํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ์˜ˆ์•ฝ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์˜ˆ์•ฝ ์กฐํšŒ ๋ฐ ์˜ˆ์•ฝ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    - pusher ๋“ฑ๋ก์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์˜ˆ์•ฝ ์ฃผ๋ฌธ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„
    - ์‹ค์‹œ๊ฐ„ ์˜ˆ์•ฝ ์ฃผ๋ฌธ์ด ์˜ฌ ๊ฒฝ์šฐ ์•Œ๋ฆผ์Œ์ด ๋“ค๋ฆฌ๋„๋ก ๊ตฌํ˜„
    - ํƒ€์ž„๋”œ ์ข…๋ฃŒ ์‹œ๊ฐ„๊นŒ์ง€ ํƒ€์ด๋จธ ๊ตฌํ˜„
    - ์„ฑ์ •์šฑ
    - ์Šคํ† ์–ด ์ˆ˜์ • ํŽ˜์ด์ง€ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ์ž ์Šน์ธ, ๋ฐ˜๋ ค ๋ชจ๋‹ฌ ์ถ”๊ฐ€
    - ์‚ฌ์šฉ์ž์šฉ ์Šคํ† ์–ด ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    (์Šคํ† ์–ด ์†Œ๊ฐœ ์ปดํฌ๋„ŒํŠธ, ๋ฉ”๋‰ด ์ปดํฌ๋„ŒํŠธ, ํƒ€์ž„๋”œ ์ปดํฌ๋„ŒํŠธ)
    - ์Šคํ† ์–ด๋“ฑ๋ก ์‹œ ์œ„๋„, ๊ฒฝ๋„ ์ขŒํ‘œ ๊ฐ’ ๊ณ„์‚ฐ
    (์นด์นด์˜ค๋งต API )
    - ์Šคํ† ์–ด ์†Œ๊ฐœํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž ์œ„์น˜์™€ ์Šคํ† ์–ด ์œ„์น˜ ๊ฐ’ ๋งˆ์ปค๋กœ ํ‘œ์‹œ
    (์นด์นด์˜ค๋งต API)
    - ๋ฐ•์ƒ์šฐ
    - ์ด๋ฉ”์ผ ์ธ์ฆ์„ ํ†ตํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ
    - ํšŒ์› ์œ„์น˜์ •๋ณด ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - ํšŒ์› ๊ธฐ๋ณธ์ •๋ณด ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - ํšŒ์› ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - ํšŒ์› ์ค‘๋ณตํ™•์ธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - Global Exception Handler ๊ฐœ๋ฐœ
    - REST Docs refactor ๋ฌธ์„œ๋‹จ์œ„๋กœ ์„ค์ •
    - ์ตœ๋™์‹
    - multimodule ์„œ๋ฒ„ ํ™˜๊ฒฝ ์„ค์ •
    - redis ์„œ๋ฒ„ ๊ตฌ์ถ•
    - ํŒ๋งค์ž ๊ด€์ ์˜ ์Šคํ† ์–ด ๊ฐœ๋ฐœ
    - ์Šคํ† ์–ด ๊ทธ๋ฃน ๊ด€๋ จ CRUD ๊ฐœ๋ฐœ
    - ํ™ฉ์˜์ค€
    - ์ฃผ๋ฌธ๊ด€๋ จ CRUD ์„ธ๋ถ€์‚ฌํ•ญ ๊ฐœ๋ฐœ
    - Pusher ์ฃผ๋ฌธ ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    - ํšŒ์› ํ† ํฐ์„ ํ†ตํ•œ ๊ถŒํ•œ ์ธ์ฆ ๊ฐœ๋ฐœ
    - ๋ฆฌ๋ทฐ,๋‹ต๋ณ€, ์žฌ๊ณ ์ฒ˜๋ฆฌ ๋“ฑ ์ถ”๊ฐ€์š”์†Œ์˜ ๊ฐœ๋ฐœ
    - ํ…Œ์ŠคํŠธ์ฝ”๋“œ RestDocs ์ผ๋ถ€ ๋กœ์ง์— ์ ์šฉ
    ํ”„๋กœ์ ํŠธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    (v0.3.0)
    2021.05.17
    ~
    2021.05.23
    - ๋ฐ•๋Œ€ํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - openvidu๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์˜์ƒ ์†ก์ถœ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    - openvidu๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„
    - ์‚ฌ์šฉ์ž์šฉ ํƒ€์ž„๋”œ ํ”ผ๋“œ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์œ„์น˜ ์„ค์ •์„ ์œ„ํ•ด์„œ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์™€ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž ์ขŒํ‘œ ์ž๋™ ์ˆ˜์ง‘ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    - ์ˆ˜์ง‘๋œ ์ขŒํ‘œ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ผ์ • ๊ฑฐ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ํƒ€์ž„๋”œ ์ง„ํ–‰ ๊ฐ€๊ฒŒ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ตฌํ˜„
    - swiper๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ์ง„ํ–‰๋˜๋Š” ํƒ€์ž„๋”œ ์ƒํ’ˆ ๋ชฉ๋ก๊ณผ ์ง„ํ–‰์ค‘์ธ ๊ฐ€๊ฒŒ ์ •๋ณด ํ‘œ์‹œ (์žฌ๊ณ ๊ฐ€ ๋–จ์–ด์งˆ ๊ฒฝ์šฐ๋„ ๋ฐ˜์˜)
    - ์‚ฌ์šฉ์ž์šฉ ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ๊ฐ€๊ฒŒ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ํƒ€์ž„๋”œ ๋“ฑ๋ก๋œ ๋ฉ”๋‰ด๋“ค ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - masonry ๋””์ž์ธ ๋„์ž…
    - ์žฌ๊ณ  ์—†์„ ๊ฒฝ์šฐ ์„ ํƒ ๋ถˆ๊ฐ€ ์ฒ˜๋ฆฌ
    - ๋ฉ”๋‰ด์ฐฝ๊ณผ ๋ฉ”๋‰ด ์ด๋ฏธ์ง€ ์—ฐ๋™ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์„ ํƒ๋งŒ์œผ๋กœ ๋ฉ”๋‰ด ์„ ํƒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ € ๋ผ์ด๋ธŒ๋ฅผ ์‹œ์ฒญ ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์‚ฌ์šฉ์ž๋Š” ์ง์ ‘ ๋ฐฉ์†ก์„ ์†ก์ถœํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •
    - ์ฑ„ํŒ… ์‹œ ์ฑ„ํŒ… ๊ธธ์ด์— ๋งž์ถฐ ์Šคํฌ๋กค ์ž๋™์œผ๋กœ ์ด๋™ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ( ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€์—๋„ ์ ์šฉ)
    - ๊ทธ ์™ธ ๊ธฐ๋Šฅ์€ ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ €์šฉ ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€์™€ ๊ฐ™์Œ
    - ๋ฆฌ๋ทฐ ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
    - ์‚ฌ์šฉ์ž ์ „์šฉ ๋ฆฌ๋ทฐ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๋ฐ ์ฃผ๋ฌธ ๋‚ด์—ญ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๋ณด์กฐ ๊ตฌํ˜„
    - ์„ฑ์ •์šฑ
    - ์‚ฌ์šฉ์ž ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ
    - ์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ ์œ ๋ฌด ํŒ๋ณ„ ๋ฐ ์กฐํšŒ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ
    - ์‚ฌ์žฅ๋‹˜ ๋ฆฌ๋ทฐ ์œ ๋ฌด ํŒ๋ณ„ ๋ฐ ์กฐํšŒ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ
    - ๋ฆฌ๋ทฐ ๋ณ„์  ๋„์‹ํ™”
    - UCC ๋งŒ๋“ค๊ธฐ
    - ๋ฐ•์ƒ์šฐ
    - ์œ ์ € ํ† ํฐ๊ด€๋ฆฌ ๋ฆฌํŒฉํ† ๋ง ์ž‘์—… ์ง„ํ–‰
    - ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ์ž๋ฃŒ ์ œ์ž‘
    - ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ์ง„ํ–‰
    - ํ”„๋กœ์ ํŠธ UCC ์ดฌ์˜
    - ์ตœ๋™์‹
    - ์Šคํ† ์–ด ์ƒํ’ˆ CRUD ๊ฐœ๋ฐœ
    - ์œ ์ € ๊ด€์ ์˜ ํƒ€์ž„๋”œ ๋กœ์ง ๊ฐœ๋ฐœ
    - spring scheduler ์ ์šฉ
    - ์‚ฌ์šฉ์ž ๊ด€์ ์˜ Store ๊ฐœ๋ฐœ
    - WebRTC - OpenVidu ์„œ๋ฒ„ ๊ตฌ์ถ•
    - ํ™ฉ์˜์ค€
    - ์ฃผ๋ฌธ๊ด€๋ จ CRUD Restdocs ๊ฐœ๋ฐœ
    - ์ฃผ๋ฌธ ์กฐํšŒ์‹œ ์นดํƒ€๊ณ ๋ฆฌ ํ•จ๊ป˜ ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    - ๊ทธ๋ž˜๋“ค ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ด€๋ จ ํ•™์Šต ๋‚ด์šฉ ๊ณต์œ 
    - ํ”„๋กœํ•„, ์Šคํ† ์–ด ์ด๋ฏธ์ง€ ์ƒํƒœ๋ณ„ ๋””ํดํŠธ ๊ฐ’ ์ถ”๊ฐ€
    - ๋ฆฌ๋ทฐ ์‹œ ์ฃผ๋ฌธํ•œ ๋‚ด์—ญ ์กฐํšŒ ์ถ”๊ฐ€
    ํ”„๋กœ์ ํŠธ ๋ฆฌํŽ™ํ† ๋ง
    (v1.0.0)
    2021.06.01
    ~
    2021.06.31
    - ๋ฐ•๋Œ€ํ˜„
    - ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๊ตฌ๋ฆ„ ๋””์ž์ธ ์ถ”๊ฐ€
    - ํšŒ์›๊ฐ€์ž… ์ด๋ฉ”์ผ ์ค‘๋ณต ์ฒดํฌ debounce ์ง์ ‘ ๊ตฌํ˜„ (lodash๋กœ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„ ์‚ญ์ œ)
    - ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋””์ž์ธ ๋ณ€๊ฒฝ ๋ฐ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
    - ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ € ์‹ ์ฒญ ๋ฐ ์ •๋ณด ์ˆ˜์ • ํŽ˜์ด์ง€ ๋””์ž์ธ ๋ณ€๊ฒฝ ๋ฐ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
    - ์‚ฌ์—…์ž ๋“ฑ๋ก์ฆ ์—…๋กœ๋“œ ์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ตฌํ˜„
    - ์‚ฌ์šฉ์ž ์ „์šฉ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ง€์—ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ root ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ž‘์—… ์ „์ฒด๋ฅผ ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ • (์Šคํ”ผ๋„ˆ๋Š” url์— ๋Œ€์‘ํ•˜๋Š” ํŽ˜์ด์ง€์˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋๋‚  ๊ฒฝ์šฐ ๋ฉˆ์ถ”๋„๋ก ์ˆ˜์ •)
    - ์‚ฌ์šฉ์ž์šฉ ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€ ์—ญ์‹œ ๋กœ๋”ฉ ์ง€์—ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€์˜ root ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋น„๋™๊ธฐ ์ž‘์—… ์ „์ฒด ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
    - ์‚ฌ์šฉ์ž์šฉ ๊ฐ€๊ฒŒ ๋งค๋‹ˆ์ € ๋ผ์ด๋ธŒ ์‹œ์ฒญ ํŽ˜์ด์ง€ ์˜ค๋ฅ˜ ์ˆ˜์ • ๋ฐ ๋””์ž์ธ ์ˆ˜์ •
    - ์žฌ์ ‘์† ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ์ˆ˜์ •
    - ์ฑ„ํŒ… ๋ฐ•์Šค UI ์กฐ์ • ๋ฐ ๋น„๋””์˜ค ํ•ด์ƒ๋„ ๋ณ€๊ฒฝ
    - ์„ฑ์ •์šฑ
    - ์ง„ํ–‰์ค‘
    - ๋ฐ•์ƒ์šฐ
    - ์ง„ํ–‰์ค‘
    - ์ตœ๋™์‹
    - ์ง„ํ–‰์ค‘
    - ํ™ฉ์˜์ค€
    - ์ง„ํ–‰์ค‘

    ๐Ÿ“œ Project ProgressStatus

    ๊ตฌ๋ถ„ ๋งํฌ
    Meeting Log๐Ÿ‘ฃ Meeting Log - wiki
    Convention๐Ÿค™ Convention - wiki
    JIRA๐Ÿ”ฅ SSAFY-JIRA
    GitLab๐ŸŒŸ SSAFY-GitLab
    Jenkins๐Ÿค“ SSAFY-Jenkins
    REST Docs๐Ÿ“š THXSTORE_RESTDocs
    • ์ผ๋ถ€ ๋งํฌ๋Š” ๋ณด์•ˆ๋ฌธ์ œ๋กœ ์—ด๋žŒ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ (tkddnsos@gmail.com)์„ ํ†ตํ•˜์—ฌ ์—ฐ๋ฝ์ฃผ์‹œ๋ฉด ์—ด๋žŒ๊ถŒํ•œ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.