Skip to content

๐Ÿ†HOMEDONG : ๋ชจ๋‘๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์ง‘์—์„œ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์šด๋™ ๊ฒŒ์ž„ - SSAFY 5๊ธฐ ๊ณตํ†ต ํ”„๋กœ์ ํŠธ ์šฐ์ˆ˜์ƒ(2021.08.20)

yesfordev/homedong

Repository files navigation

๐Ÿ’ช HomeDong ( ๋ชจ๋‘๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์ง‘์—์„œ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์šด๋™ ๊ฒŒ์ž„ )

๐Ÿ‘‡ํ™ˆ๋™ ์†Œ๊ฐœ ๋ฐ ์‹œ์—ฐ ์˜์ƒ๐Ÿ‘‡

ํ™ˆ๋™ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๐Ÿ‘‰์—ฌ๊ธฐ๐Ÿ‘ˆ์—์„œ ๋” ์ž์„ธํžˆ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจOverview

1์ผ 1์ปค๋ฐ‹์˜ ์—ดํ’์ด ๋ถˆ๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ๊ฑด๊ฐ•์€ ๊ดœ์ฐฎ์œผ์‹ ๊ฐ€์š”? ๋ชจ๋‘์˜ ๊ฑด๊ฐ•์„ ์ฑ…์ž„์ง€๊ธฐ ์œ„ํ•ด ์ €ํฌ HomeDong์ด ์™”์Šต๋‹ˆ๋‹ค โœŒ1์ผ 1ํ™ˆ๋™(ํ™ˆ ํŠธ๋ ˆ์ด๋‹ ์šด๋™)์˜ ์‹œ์ž‘์„ ํ™ˆ๋™๊ณผ ํ•จ๊ป˜ํ•˜๊ณ  ๊ฑด๊ฐ•์„ ์ง€์ผœ๋ณด์„ธ์š”!

โœจํ™ˆ๋™์˜ ๋ชจํ† 

์–ธ์ œ ์–ด๋””์„œ๋‚˜ ๊ฑด๊ฐ•์„ ์ฑ™๊ธฐ๋ฉฐ ํ•จ๊ป˜ ์ฆ๊ธด๋‹ค!

๐Ÿ†์ˆ˜์ƒ - SSAFY 5๊ธฐ ๊ณตํ†ต ํ”„๋กœ์ ํŠธ ์šฐ์ˆ˜์ƒ

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ - 2021.07.12 ~ 2021.08.20

๐Ÿ‘€ํ™ˆ๋™ ์„œ๋น„์Šค ํ™”๋ฉด

๊ฒŒ์ž„ - ์Šค์ฟผํŠธ

์Šค์ฟผํŠธ

๊ฒŒ์ž„ - ๋ฒ„ํ”ผ

๋ฒ„ํ”ผ

๊ฒŒ์ž„ - ํŒ”๊ตฝํ˜€ํŽด๊ธฐ

ํ‘ธ์‹œ์—…

๊ฒŒ์ž„ - ์ฑ„ํŒ…

์ฑ„ํŒ…

๊ฒŒ์ž„์ด ๋๋‚ฌ์„ ๋•Œ - ํš๋“ ๋ฑƒ์ง€ ๋ฐ ๋žญํ‚น

๊ฒŒ์ž„๋

๋งˆ์ดํŽ˜์ด์ง€ - ๋ฑƒ์ง€ ๋ฆฌ์›Œ๋“œ, ์šด๋™ ์ผ์ผ ๊ธฐ๋ก, ์šด๋™์ผ ์ˆ˜

๋งˆ์ดํŽ˜์ด์ง€๋ฆฌ์›Œ๋“œ

๋งˆ์ดํŽ˜์ด์ง€ - ํ”„๋กœํ•„ ๋ณ€๊ฒฝ

ํ”„๋กœํ•„ ๋ณ€๊ฒฝ

๋žญํ‚น

๋žญํ‚น

ํŠœํ† ๋ฆฌ์–ผ

ํŠœํ† ๋ฆฌ์–ผ

ํšŒ์›๊ฐ€์ž… - ์ด๋ฉ”์ผ ์ธ์ฆ

ํšŒ์›๊ฐ€์ž…

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ


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

๐Ÿ–ฅ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ


๐Ÿ–ฑBackend

  • IntelliJ
  • spring boot 2.4.5
  • spring-boot-jpa
  • Spring Security
  • Java 8
  • AWS EC2
  • mysql
  • redis

๐Ÿ–ฑFrontend

  • Visual Studio Code
  • React.js 17.0.2
  • styled-components 5.3.0
  • Material-UI
  • redux-toolkit 1.6.1
  • redux 4.1.0

๐Ÿ–ฑWeb RTC

  • openvidu 2.19.0

๐Ÿ–ฑPose Detection

  • Teachable Machine

๐Ÿ–ฑCI/CD

  • aws ec2
  • docker
  • nginx
  • jenkins

๐Ÿ’ซ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜


์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

โœจJenkins๋ฅผ ์ด์šฉํ•œ CD ๊ตฌ์ถ• ๋ฐ SSL ์ธ์ฆ์„œ ์ ์šฉ


์ œ๊ฐ€ ๋‹ด๋‹นํ•˜์—ฌ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์™€ ๊ฐ™์ด, Jenkins์˜ pipeline์„ ์ด์šฉํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Gitlab webhook์„ ์„ค์ •ํ•˜์—ฌ Jenkins์— ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์„ค์ •ํ–ˆ๊ณ , ์ด์— ๋”ฐ๋ผ Gitlab์—์„œ master ๋ธŒ๋žœ์น˜์— pushํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์ถ•ํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐฐํฌ๋กœ ์ธํ•œ ์‹œ๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ์ธ React.js๋Š” Nginx์™€ ํ•จ๊ป˜ docker image๋กœ ๋นŒ๋“œํ•˜์—ฌ ๋ฐฐํฌํ•˜์˜€๊ณ , ๋ฐฑ์—”๋“œ ๋ฐ redis, openvidu ๋˜ํ•œ docker container๋กœ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Nginx์™€ letsencrypt๋ฅผ ์ด์šฉํ•˜์—ฌ ssl ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•˜์˜€๊ณ , ํ”„๋ก ํŠธ์—”๋“œ๋Š” 443(https)๋กœ ํ”„๋ก์‹œ๋กœ ๋ถ„๊ธฐ์‹œ์ผฐ๊ณ  ๋ฐฑ์—”๋“œ๋Š” /api ๊ฒฝ๋กœ๋กœ ํ”„๋ก์‹œ๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐฐํฌ ๋ฐฉ๋ฒ•์€ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์€ ์•„๋‹™๋‹ˆ๋‹ค.(๋‹จ์ˆœ ๋ฐฐํฌ ๋ฐฉ๋ฒ•)

โœจ๊ธฐ์ˆ  ํŠน์ด์ 


  • Teachable Machine

์ž์„ธ๋ฅผ ํ•™์Šต์‹œ์ผœ pose detection์„ ํ†ตํ•œ ๋ชจ์…˜ ์ธ์‹์œผ๋กœ ์ž์„ธ ์ธ์‹์„ ํ†ตํ•ด ์œ ์ €๊ฐ€ ๊ฐ ์šด๋™ ์ข…๋ชฉ์„ ์ž˜ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ฒดํฌํ–ˆ๊ณ , ์šด๋™ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ‹ฐ์ฒ˜๋ธ”๋จธ์‹ 

์ด๋Ÿฐ ์‹์œผ๋กœ Teachable Machine์œผ๋กœ ํ•™์Šต์„ ์‹œํ‚ค๋ฉด ์ž์„ธ๋ณ„๋กœ ๋„์ถœ๋œ ๊ฐ’์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถ”์ถœ๋œ ์ฝ”๋“œ์™€ ๊ฐ’์œผ๋กœ ํ™ˆ๋™ ์„œ๋น„์Šค์— ๋งž๊ฒŒ ๊ฐ€๊ณตํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • WebRTC (Openvidu)

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

  • Redis

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

  • redux-toolkit

ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„์‹œ์—๋Š” React์™€ redux-toolkit์„ ์ด์šฉํ•˜์—ฌ Ducks Pattern ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๋ฐฐํฌ

๋„์ปค, Nginx, Jenkins๋ฅผ ์ด์šฉํ•œ ์ž๋™ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋ฅผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌํ•˜์˜€๊ณ , ํ”„๋ก ํŠธ๋กœ Nginx์™€ ํ•จ๊ป˜ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง ํ˜‘์—… ํˆด


  • Git
  • Jira
  • Notion
  • Mattermost
  • Webex

๐Ÿ’ญ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ


์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ

๐ŸŽจ ํ™”๋ฉด ์„ค๊ณ„์„œ


ํ™”๋ฉด์„ค๊ณ„์„œ1

ํ™”๋ฉด์„ค๊ณ„์„œ2

โœจ์ฝ”๋“œ ์ปจ๋ฒค์…˜


- ์˜๋ฏธ ์—†๋Š” ๋ณ€์ˆ˜๋ช… X
	โ‡’ ์œ ์ง€๋ณด์ˆ˜ ํž˜๋“ค๊ณ , ์•Œ์•„๋ณด๊ธฐ ํž˜๋“œ๋‹ˆ ๋ฐ˜๋“œ์‹œ ์ง€์–‘! ex) text1, test2

- ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋™์‚ฌ๋กœ ์ง€์œผ๋ฉด ์ข‹๋‹ค! ex) getName()

- ๋ณ€์ˆ˜๋ช…, ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ์นด๋ฉœ์ผ€์ด์Šค๋กœ ์ง€์–ด์ฃผ์„ธ์š”

- ํด๋ž˜์Šค ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

ํ•ด๋‹น Code Convention ๊ฐ€์ด๋“œ, ๋„ค์ด๋ฐ ๊ทœ์น™๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจGit ์ปจ๋ฒค์…˜


FEAT:    ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ
FIX:     ๋ฒ„๊ทธ๋ฅผ ๊ณ ์นœ ๊ฒฝ์šฐ
STYLE:   ์ฝ”๋“œ ํฌ๋งท ๋ณ€๊ฒฝ, ๊ฐ„๋‹จํ•œ ์ˆ˜์ •, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
REFATOR: ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
DOCS:    ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ(ex> Swagger)
Rename:  ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช… ์ˆ˜์ • ๋ฐ ์ด๋™
Remove:  ํŒŒ์ผ ์‚ญ์ œ
CHORE:    ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •(ex> dependency ์ถ”๊ฐ€)
์ปค๋ฐ‹ ํƒ€์ž…: ๋‚ด์šฉ ์ž์„ธํžˆ ์ ์–ด์ฃผ๊ธฐ [#์ง€๋ผ์ด์Šˆ๋„˜๋ฒ„]
ex) FEAT: ๋กœ๊ทธ์ธ rest api ์ถ”๊ฐ€ [#์ง€๋ผ์ด์Šˆ๋„˜๋ฒ„]

ํ•ด๋‹น Git ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค

๐Ÿ’กGit Flow ๋ธŒ๋žœ์น˜ ์ „๋žต


  • Git Flow model์„ ์‚ฌ์šฉํ•˜๊ณ , Git ๊ธฐ๋ณธ ๋ช…๋ น์–ด ์‚ฌ์šฉํ•œ๋‹ค.

  • Git Flow ์‚ฌ์šฉ ๋ธŒ๋žœ์น˜

    • feature - ๊ธฐ๋Šฅ
    • develop - ๊ฐœ๋ฐœ
    • master - ๋ฐฐํฌ
    • hotfix - ๊ธ‰ํ•œ ์—๋Ÿฌ ์ˆ˜์ •
  • Git Flow ์ง„ํ–‰ ๋ฐฉ์‹

    1. feature ๋ธŒ๋žœ์น˜๊ฐ€ ์™„์„ฑ๋˜๋ฉด develop ๋ธŒ๋žœ์น˜๋กœ pull request๋ฅผ ํ†ตํ•ด mergeํ•œ๋‹ค.

      โ‡’ pull request๊ฐ€ ์š”์ฒญ๋˜๋ฉด, ๋ชจ๋“  ํŒ€์›๋“ค์ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ mergeํ•œ๋‹ค.

    2. ๋งค ์ฃผ๋งˆ๋‹ค develop ๋ธŒ๋žœ์น˜๋ฅผ master ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

  • feature ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ๋ช…๋ช… ๊ทœ์น™

    • feature/[front or back]/[๊ธฐ๋Šฅ ์ด๋ฆ„]

      ex) feature/front/login

      ex) feature/webrtc

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง Jira


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

  • Epic : backend, frontend, webrtc๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • story : ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝ ํ•œ๋‹ค์™€ ๊ฐ™์ด ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • subtask : ๋ถ€์ž‘์—…์„ ๋‚˜๋ˆ„์–ด ์„ธ์„ธํ•˜๊ฒŒ ์—…๋ฌด ๊ด€๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด ์™ธ์—, subtask์— ์˜ˆ์ƒ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ด ๋” ์„ธ์„ธํ•˜๊ฒŒ ์ผ์ • ๊ด€๋ฆฌ๋ฅผ ํ–ˆ๊ณ  ํ˜‘์—… ๋ฉ”์‹ ์ €(Mattermost)์— ์•Œ๋žŒ์„ ๋“ฑ๋กํ•˜์—ฌ ์ž‘์—… ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง Notion


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

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง Scrum


๋งค์ผ ์•„์นจ 9์‹œ์— ์–ด์ œ ํ–ˆ๋˜ ์ผ, ์˜ค๋Š˜ ํ•  ์ผ, ์ด์Šˆ๋ฅผ ๊ฐ์ž ์ •๋ฆฌํ•ด์„œ 5~10๋ถ„ ๋™์•ˆ ์„œ๋กœ ๊ณต์œ ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. Scrum์„ ํ†ตํ•ด ํŒ€์›๋“ค์˜ ํ˜„์žฌ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๊พธ์ค€ํžˆ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ผ ์ง„ํ–‰ํ–ˆ๋˜ Scrum ํšŒ์˜๋ก์€ Notion์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจ ER Diagram


erd

  • ์ •๊ทœํ™”๋ฅผ ๊ฑฐ์นœ Diagram ์ž…๋‹ˆ๋‹ค.

โœจ EC2 ํฌํŠธ ์ •๋ฆฌ


PORT ์ด๋ฆ„
443 HTTPS
80 HTTP - HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(ํ”„๋ก ํŠธ ํŽ˜์ด์ง€์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ)
8443 Openvidu
8379 Redis
3306 MySQL
8081 Jenkins
8080 Spring boot Docker Container
3000 React, NginX Docker Container

๐Ÿ˜ƒ ํŒ€์› ์—ญํ• 


  • ํŒ€์›1
    • openvidu๋ฅผ ํ†ตํ•œ WebRTC ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • ๋ฐฑ์—”๋“œ ๋ฐฉ ๊ด€๋ฆฌ API ๊ตฌํ˜„(๋ฐฉ ๋งŒ๋“ค๊ธฐ/๋น ๋ฅธ ์‹œ์ž‘/๋ฐฉ ์ฐพ๊ธฐ/๋ฐฉ ๋‚˜๊ฐ€๊ธฐ/๋ฐฉ์žฅ ๋ถ€์—ฌ)
    • ๋ฐฑ์—”๋“œ ๊ด€๋ฆฌ์ž API ๊ตฌํ˜„
    • ์˜คํ”ˆ๋น„๋‘ ์„œ๋ฒ„ ๋ฐฐํฌ
    • styled-component์™€ material-ui๋ฅผ ํ†ตํ•œ css ์Šคํƒ€์ผ๋ง
  • ํŒ€์›2
    • react์™€ redux-toolkit์„ ํ™œ์šฉํ•˜์—ฌ SPA ๊ตฌํ˜„
    • ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ(ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํšŒ์›์ •๋ณด ์ˆ˜์ •, ๋ฉ”์ธ ํ™”๋ฉด, ๋žญํ‚น, ํŠœํ† ๋ฆฌ์–ผ, ๋งˆ์ดํŽ˜์ด์ง€, ๋ฐฉ๋งŒ๋“ค๊ธฐ, ๋ฐฉ์ฐพ๊ธฐ๋“ฑ, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ตฌํ˜„)
    • styled-components์™€ material-ui๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„ ๋ฐ css ์Šคํƒ€์ผ๋ง
  • ํŒ€์›3
    • Teachable Machine์„ ํ†ตํ•œ ์šด๋™ ์ธ์‹ ๊ตฌํ˜„
    • ์šด๋™๋ณ„ ๋กœ์ง์„ ํ†ตํ•œ ์šด๋™ ์นด์šดํŠธ ๊ธฐ๋Šฅ ๋ฐ ํŠœํ† ๋ฆฌ์–ผ ๊ตฌํ˜„
    • Openvidu๋ฅผ ํ†ตํ•œ ๊ฒŒ์ž„ ๋‚ด๋ถ€ ์ •๋ณด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
    • ๊ฒŒ์ž„ ์‹œ์ž‘, ์ข…๋ฃŒ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋žญํ‚น, ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • styled-component์™€ material-ui๋ฅผ ํ†ตํ•œ css ์Šคํƒ€์ผ๋ง
  • ํŒ€์žฅ(๋ณธ์ธ)
    • Spring security, JWT, JPA๋ฅผ ์ด์šฉํ•œ ์ด๋ฉ”์ผ ์ธ์ฆ(ํผ ๊ตฌํ˜„)ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (์ธ์ฆ, ์ธ๊ฐ€)
    • JWT, Redis ์บ์‹ฑ์„ ์ด์šฉํ•œ ๋žญํ‚น ์กฐํšŒ ์ •๋ณด ์บ์‹ฑ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
    • JWT, Redis๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์•„์›ƒ๋œ ํ† ํฐ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ, ํšŒ์› ์ •๋ณด CRUD ๊ตฌํ˜„
    • ์—ฐ์† ์šด๋™์ผ ์ˆ˜ ์กฐํšŒ, 1์ผ 1ํ™ˆ๋™ ์กฐํšŒ, ๋ฐฉ์žฅ ๊ฒŒ์ž„ ์‹œ์ž‘ ๊ธฐ๋Šฅ, ๊ฒŒ์ž„ ๋ ๊ธฐ๋Šฅ, ๋žญํ‚น ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ, ์ตœ๊ณ  ๊ธฐ๋ก ์กฐํšŒ, ๋ฑƒ์ง€ ์กฐํšŒ ๋“ฑ์˜ Spring Boot ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • Jenkins, Docker๋ฅผ ์ด์šฉํ•œ CD ๊ตฌํ˜„ - Docker๋กœ nginx+react container, spring boot container ์ƒ์„ฑํ•˜์—ฌ ๋ฐฐํฌ
    • Nginx ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์„ค์ • ๋ฐ ๋ฐฑ์—”๋“œ ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ url ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ (/, /api/**)
    • react๋ฅผ ์ด์šฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœํ•„ ์„ค์ • ๋ฐ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ, ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ๋ฐ 1์ผ 1ํ™ˆ๋™ ํ˜ธ๋ฒ„ ํˆดํŒ ๊ตฌํ˜„
    • ๊ฒŒ์ž„ ๋ฐ ์ฑ„ํŒ… ๊ธฐ๋Šฅ javascript โ†’ react๋กœ migration
    • styled-component๋ฅผ ํ†ตํ•œ css ์Šคํƒ€์ผ๋ง

โ‰HomeDong์˜ ๊ฐœ๋ฐœ ๊ณผ์ •์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด?!


๐Ÿ‘‰HomeDong ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ๐Ÿ‘ˆ

๐ŸฃHomedong์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‚œ ํ›„์˜ ํšŒ๊ณ 


  • ์•ˆ๋˜๋Š” ๊ฒƒ์€ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ผผ๊ผผํžˆ ํ•˜์ž
  • ๊ธ์ •์ ์ธ ๋ง๋กœ ํŒ€ ๋ถ„์œ„๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€์ž
  • ๋ฌธ์„œํ™”๋ฅผ ์ž˜ ํ•˜์ž!

์ž์„ธํ•œ ํšŒ๊ณ ๋Š” ๋ธ”๋กœ๊ทธ์—์„œ ์ž์„ธํžˆ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

๐Ÿ†HOMEDONG : ๋ชจ๋‘๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์ง‘์—์„œ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์šด๋™ ๊ฒŒ์ž„ - SSAFY 5๊ธฐ ๊ณตํ†ต ํ”„๋กœ์ ํŠธ ์šฐ์ˆ˜์ƒ(2021.08.20)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published