Skip to content

๐Ÿ” ํ™”์ƒ, ์Œ์„ฑ, ํ…์ŠคํŠธ ์ฑ„ํŒ…์œผ๋กœ ์ฆ๊ธฐ๋Š” ํ€ด์ฆˆ๊ฒŒ์ž„ ๋‚˜๋ชฐ๋‹ญ

Notifications You must be signed in to change notification settings

namoldak/Backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๋‚˜๋ชฐ๋‹ญ๊นƒํ—™์ƒ๋‹จ์ด๋ฏธ์ง€



๐Ÿ” ๋‚˜๋งŒ ๋ชจ๋ฅธ ๋‹ญ

๋‚ด ๋จธ๋ฆฌ์— ์žˆ๋Š” ๊ฑฐ ๋ญ์•ผ? ๋‚˜๋งŒ ๋ชฐ๋ผ?
โ€์–‘์„ธ์ฐฌ ๊ฒŒ์ž„โ€ ํ˜น์€ โ€œ์ฝœ ๋งˆ์ด ๋„ค์ž„โ€์œผ๋กœ ๋ถˆ๋ฆฌ๋Š” ํ‚ค์›Œ๋“œ ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„!
์Šค๋ฌด๊ณ ๊ฐœ์ฒ˜๋Ÿผ ์ƒ๋Œ€ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ์งˆ๋ฌธํ•˜๋ฉด์„œ ๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ๋งž์ถฐ๋ณด์„ธ์š”๐Ÿค
์ตœ๋Œ€ํ•œ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋‹ต๋ณ€ํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ๋‚ ์นด๋กญ๊ฒŒ ์งˆ๋ฌธํ•˜์„ธ์š”!

๋‚˜๋ชฐ๋‹ญ์ƒ๋‹จ์ด๋ฏธ์ง€



๐Ÿ”— ๋‚˜๋งŒ ๋ชจ๋ฅธ ๋‹ญ ์„œ๋น„์Šค ๋ฐ ๋…ธ์…˜



๐Ÿ“ข ์ฃผ์š” ์„œ๋น„์Šค ๊ธฐ๋Šฅ

  • ๋Ÿฐ๋‹๋งจ์— ๋‚˜์˜จ ์–‘์„ธ์ฐฌ ๊ฒŒ์ž„(aka. call my name game)์„ ์˜จ๋ผ์ธ์—์„œ๋„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๊ฒŒ ์›น์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ญ๐Ÿ”
  • ํ…์ŠคํŠธ ์ฑ„ํŒ…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Œ์„ฑ/ํ™”์ƒ ์ฑ„ํŒ…์œผ๋กœ๋„ ์„œ๋กœ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋ฉฐ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ญ๐Ÿ”
  • ๊ฒŒ์ž„๋„ ํ•˜๊ณ  ๊ฒŒ์‹œํŒ์„ ์ด์šฉํ•ด ๋‹ค๋ฅธ ์œ ์ €๋“ค๊ณผ ์†Œํ†ต๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ญ๐Ÿ”
  • ์†Œ์…œ ๋กœ๊ทธ์ธ์ด ์žˆ์–ด ๋ณ„๋„์˜ ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ญ๐Ÿ”



๐Ÿ“ฝ ์‹œ์—ฐ ์˜์ƒ

800px



โš™๏ธ ์„œ๋น„์Šค ์•„ํ‚คํ…์ณ

๋‚˜๋ชฐ๋‹ญ-์•„ํ‚คํ…์ณ2



๐Ÿ–Œ ERD

ERD

๋‚˜๋ชฐ๋‹ญERD์ตœ์ข…



๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์ˆ 

  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ์œ„ํ•œ Web Socket
    • ํ™”์ƒ ๋ฐ ์Œ์„ฑ ์ฑ„ํŒ…์„ ์œ„ํ•œ WebRTC
    • ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ SockJS
    • pub/sub ๊ธฐ๋ฐ˜์˜ ํŽธ๋ฆฌํ•œ ์›น์†Œ์ผ“ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์„ธ์ง• ํ”„๋กœํ† ์ฝœ STOMP
  • Refresh Token์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ์˜ Redis ์‚ฌ์šฉ
  • Github Actions/AWS CodeDeploy๋ฅผ ํ†ตํ•œ ์ž๋™ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • Intersection-observer API๋ฅผ ์‚ฌ์šฉํ•œ ๋Œ“๊ธ€ ๋ฌดํ•œ ์Šคํฌ๋กค
  • OAuth 2.0 ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•œ ํŽธ๋ฆฌํ•œ ์ ‘๊ทผ์„ฑ



๐Ÿ“ ๊ธฐ์ˆ ์  ์˜์‚ฌ ๊ฒฐ์ •

๊ธฐ์ˆ ์  ์˜์‚ฌ ๊ฒฐ์ •
๊ธฐ์ˆ  ๋„์ž… ์ด์œ  ํ›„๋ณด๊ตฐ ์˜๊ฒฌ ์กฐ์œจ ๋ฐ ๊ธฐ์ˆ  ๊ฒฐ์ •
Web Socket ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ๋„์ž… Polling / Long Polling / Web Socket - ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์ด๋ฏ€๋กœ ํ•œ์ชฝ์—์„œ ์†ก์‹ ์„ ํ•˜๋ฉด ๋ฐ˜๋Œ€์ชฝ์—์„œ๋Š” ์ˆ˜์‹ ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” Polling ๋ฐ Long Polling์€ Web Socket์— ๋น„ํ•ด ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋–จ์–ด์ง.
- Web Socket์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์— ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•จ(= ์ „ ์ด์ค‘ ํ†ต์‹ , ์–‘๋ฐฉํ–ฅ ํ†ต์‹  (Full-Duplex)). ์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋จผ์ € ์š”์ฒญํ•˜์ง€ ์•Š์•„๋„ ์„œ๋ฒ„๊ฐ€ ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ  ์ƒ๋Œ€๋ฐฉ์˜ ์†ก์‹  ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ. ๋•Œ๋ฌธ์— 30์ดˆ์˜ ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ๋งŽ์€ ์งˆ๋ฌธ์ด ์˜ค๊ฐ€๋Š” ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์ด ์ค‘์š”ํ•œ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— Web Socket์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ
WebRTC (Mesh) ์‹ค์‹œ๊ฐ„ ํ™”์ƒ ๋ฐ ์Œ์„ฑ ์ฑ„ํŒ… Mesh / SFU / MCU - ์‹ค์‹œ๊ฐ„์„ฑ์ด ๊ฐ€์žฅ ๋‚ฎ๊ณ  ์ค‘์•™ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ํ˜ผํ•ฉ ๋ฐ ๊ฐ€๊ณต์— ๋งŽ์€ ๋น„์šฉ์ด ์š”๊ตฌ๋˜๋Š” MCU๋Š” ์ œ์™ธํ•˜๊ณ  Mesh์™€ SFU ๋ฐฉ์‹์„ ๋†“๊ณ  ๊ณ ๋ฏผ
- ์„œ๋น„์Šค ํŠน์„ฑ ์ƒ, ํ•œ ๊ฒŒ์ž„๋ฃธ์˜ ์ตœ๋Œ€ ์ธ์›์ด 4๋ช…์ธ ์ ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ peer๊ฐ„์˜ ์ง์ ‘ ์—ฐ๊ฒฐ์ด ํด๋ผ์ด์–ธํŠธ์— ๋ถ€ํ•˜๋ฅผ ์‹ฌํ•˜๊ฒŒ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๊ณ , ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š” ์ผ ์—†์ด ๋ฐ”๋กœ peer๋ผ๋ฆฌ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒŒ์ž„ ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ
Redis Refresh Token์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DB ์„ ์ • Redis / MySQL - ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„ ๋งŒ๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” Refresh Token์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„(time to live)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” Redis์— ์ €์žฅํ•˜๋Š” ๊ฒŒ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ
- ํ† ํฐ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ์— ์šฉ์ดํ•œ Redis๋ฅผ Refresh Token ์ „์šฉ ์„œ๋ธŒ DB๋กœ ์„ ์ •
Github Action & AWS CodeDeploy ์ง€์†์  ํ†ตํ•ฉ๊ณผ ์ง€์†์  ๋ฐฐํฌ๋ฅผ ํ†ตํ•œ ์—…๋ฌด ํšจ์œจ ์ƒ์Šน์„ ์œ„ํ•ด ๋„์ž… Jenkins /
Github Action / Travis CI
- ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ๊นƒํ—ˆ๋ธŒ๋ฅผ ํ†ตํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ณ , ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์ด๊ณ  ์ถ”๊ฐ€์ ์ธ ์„ค์น˜ ๊ณผ์ • ์—†์ด Github์—์„œ ์ œ๊ณตํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ CI ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Github Action์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•  ๊ฑฐ๋ผ ์ƒ๊ฐํ•จ
- ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์ดˆ๊ธฐ ์„ค์ •์ด ์ ๊ณ  ํŽธ์˜์„ฑ์ด ๋†’์•„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰. ๋”ฐ๋ผ์„œ Github Action๊ณผ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” Code Deploy๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋™ํ™” ๋ฐฐํฌ๋ฅผ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •
Refresh Token ์œ ์ € ์ •๋ณด ๋ณด์•ˆ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ(local storage vs cookie) / ์„œ๋ฒ„์— ์ €์žฅ - ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋œ๋‹ค๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ์žฅ์ ์ธ ๋ณด์•ˆ์ ์ธ ์ด์ ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๊ณ , ์•ก์„ธ์Šค ํ† ํฐ ๋งŒ์œผ๋กœ๋„ ์„œ๋ฒ„์— ๋ฆฌํ”„๋ ˆ์‹œ ๋ฐœ๊ธ‰ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•œ ๋กœ์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—๋งŒ ์ €์žฅํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์˜๊ฒฌ ์กฐ์œจ
- ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์„œ๋ฒ„(Redis)์— ์ €์žฅํ•˜๊ณ , ์•ก์„ธ์Šค ํ† ํฐ ๋งŒ๋ฃŒ 10๋ถ„ ์ „์— ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” api๋ฅผ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋‹ด์•„ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„
STOMP & SockJS ํ…์ŠคํŠธ ์ฑ„ํŒ… ๋ฐ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ผ๊ด€์„ฑ Only WebSocket / SockJS + STOMP - ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ์— SockJS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋ฐฉ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ๋ฐฉ๋งˆ๋‹ค์˜ ์ฑ„ํŒ…์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Topic์„ ๊ตฌ๋…ํ•จ์œผ๋กœ ๋ณ„๋„์˜ ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”์—†๋Š” STOMP๋ฅผ ์‚ฌ์šฉํ•ด ์ฑ„ํŒ…์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์˜๊ฒฌ ์กฐ์œจ
- WebSocket Configuration์—์„œ Endpoint์— SockJS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๊ณ , ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ํ†ตํ•ด pub/sub ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜์—ฌ url๋กœ ๊ฐ„๋‹จํžˆ ๊ณต๊ธ‰๊ณผ ๊ตฌ๋…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•จ. ๋˜ํ•œ ๋Œ€์ƒ Topic(๊ฒŒ์ž„ ๋ฐฉ)์„ ๊ตฌ๋…ํ•œ ์‚ฌ๋žŒ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ๊ฒŒ์ž„ ์ง„ํ–‰์— ๊ด€๋ จํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ๊ณต๊ธ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„


โšฝ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

์ž๋™ํ™” ๋ฐฐํฌ ์‹œ jar ํŒŒ์ผ ์‹คํ–‰ ์ด์Šˆ
  • ๋ฌธ์ œ ์ƒํ™ฉ

    • EC2 ์ธ์Šคํ„ด์Šค์— ๋ฐฐํฌ ํŒŒ์ผ์ด ๋“ค์–ด๊ฐ€๋‚˜ ์‹คํ–‰๋˜์ง€ ์•Š์Œ, ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„์— ๋“ค์–ด๊ฐ„ ๋ฐฐํฌ ํŒŒ์ผ์„ ์ˆ˜๋™ ์‹คํ–‰์‹œ์ผœ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
  • ์ด์œ 

    • EC2 ๋กœ๊ทธ์™€ Github Actions, Code Deploy๋‚ด์—ญ, S3์— ์ •์ƒ์ ์ธ ์ €์žฅ์„ ๋ชจ๋‘ ์ •์ƒ ์ž‘๋™ ํ™•์ธํ–ˆ์œผ๋‚˜ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๋กœ๊ทธ์—์„œ ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค ID๊ฐ€ ์•ˆ ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์—ฌ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ์ธ์‹. ํ™•์ธ์„ ์œ„ํ•ด ์ž๋™ ๋ฐฐํฌ๋œ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Œ. local์—์„œ buildํ•œ ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์˜ฌ๋ ค ๋Œ๋ ธ์„ ๋• ์ •์ƒ ์ž‘๋™ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ํŒŒ์ผ ์ฒ˜๋ฆฌ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๊ฑฐ๋ผ ์ถ”์ธก
    • ๋ฐฐํฌ ๋กœ์ง์„ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•ด ๋ณด๋‹ˆ Github secret์— ๋“ค์–ด๊ฐ„ properties ํŒŒ์ผ์ด ๋นŒ๋“œ ์ „ ๋“ค์–ด๊ฐ”์–ด์•ผ ํ•˜๋Š”๋ฐ ์ˆœ์„œ๊ฐ€ ๋นŒ๋“œ ํ›„ ์ ์šฉ์œผ๋กœ ๋ฐ€๋ ค ์žˆ์–ด์„œ ๋ฐฐํฌํ•  ํŒŒ์ผ์— properties๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค. ๋‹น์—ฐํžˆ properties์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ‚ค๋“ค์ด ์ ์šฉ์ด ์•ˆ ๋˜์–ด ์šฐ๋ถ„ํˆฌ์— ์žˆ๋Š” ๋ฐฐํฌ ํŒŒ์ผ์„ ์ˆ˜๋™ ์‹คํ–‰์‹œ์ผœ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋–ด์Œ
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • steps ์ˆœ์„œ๋ฅผ ๋นŒ๋“œ ์ „ github secret์— ์žˆ๋Š” properties๊ฐ€ ๋จผ์ € ์ ์šฉ๋˜๊ฒŒ ๋ณ€๊ฒฝ

๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•œ Pessimistic Lock
  • ๋ฌธ์ œ ์ƒํ™ฉ

    • ์ตœ๋Œ€ ์ธ์›์ด 4๋ช…์ธ ๊ฒŒ์ž„ ๋ฐฉ์—์„œ ํ•œ ์ž๋ฆฌ๊ฐ€ ๋‚จ์•˜์„ ๋•Œ ๋™์‹œ์ ์œผ๋กœ ์ž…์žฅํ•˜๊ธฐ๋ฅผ ํ•˜๋ฉด ์ตœ๋Œ€ ์ธ์›์„ ๋„˜์–ด์„œ ์ž…์žฅํ•˜๋Š” ์ด์Šˆ ๋ฐœ์ƒ
  • ์ด์œ 

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์ ์œผ๋กœ DB์— ์ ‘๊ทผ ํ›„, ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‹คํ–‰๋๊ธฐ ๋•Œ๋ฌธ
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์œ„ํ•ด์„œ select for update ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ ROW์— ๋Œ€ํ•ด Pessimistic Lock์„ ๊ฑธ์–ด ํ•ด๊ฒฐ
    • Optimistic Lock๋„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ Optimistic Lock์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์ด ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ด๋ฒˆ ์ด์Šˆ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ

๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ ์‹œ ์ƒˆ๋กœ์šด ๋ฐฉ์žฅ์ด ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š” ์ด์Šˆ
  • ๋ฌธ์ œ ์ƒํ™ฉ

    • ๋ฐฉ์žฅ์ด ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์œผ๋กœ ๋ฐฉ์„ ๋‚˜๊ฐ”์„ ๋•Œ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๋ฐฉ์žฅ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š” ์ด์Šˆ
  • ์ด์œ 

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

    • ํ”„๋ก ํŠธ์—์„œ ๋ฐฉ์žฅ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์š”์ฒญ์ด DB์— ์ €์žฅ๋˜๋Š” ๋กœ์ง๋ณด๋‹ค ์„ ํ–‰๋˜๋„๋ก ์ฝ”๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
    • ์ƒ์œ„ ๋ฉ”์†Œ๋“œ์— @Transactional์„ ๋ถ™์—ฌ์ฃผ์–ด ํ•˜์œ„ ๋ฉ”์†Œ๋“œ์— ๋ฐฉ์žฅ์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณ€๊ฒฝ



๐Ÿ—จ๏ธ ์œ ์ € ํ”ผ๋“œ๋ฐฑ

์œ ์ € ํ”ผ๋“œ๋ฐฑ

  1. ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ
    • ๊ธฐ์กด์— ๋‹‰๋„ค์ž„์„ cookie ์— ๋‹ด์•„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ api๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋‹‰๋„ค์ž„์„ ์ฃผ๊ธฐ๋กœ ํ•จ
  2. ์นด๋ฉ”๋ผ ๊ธฐ๋ณธ ์ƒํƒœ off๋กœ ์„ค์ •
    • ๊ฐ๊ฐ์˜ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ์ฒด๋กœ์„œ ์ €์žฅํ•˜์—ฌ ์š”์†Œ๋กœ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์— ์œ ์ € ๊ฐ์ฒด๋ฅผ ์ฒ˜์Œ ํ• ๋‹นํ•  ๋•Œ ์นด๋ฉ”๋ผ On/Off๋ฅผ ์„ค์ •ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ true์—์„œ false๋กœ ๋ณ€๊ฒฝ
  3. ๊ฒŒ์ž„ ์ข…๋ฃŒ ์‹œ ํ‚ค์›Œ๋“œ ์•Œ๋ฆผ
    • ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ scope์— ํ‚ค์›Œ๋“œ๋ฅผ ์ €์žฅํ•  let ๋ณ€์ˆ˜ ์„ ์–ธ ํ›„ ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ํ‚ค์›Œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ๊ฒŒ์ž„์ข…๋ฃŒ์‹œ ํ•ด๋‹น ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค์›Œ๋“œ ํ™”๋ฉด์— ์ถœ๋ ฅ
  4. ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€ ์นดํ…Œ๊ณ ๋ฆฌ ์„ค์ • ๋ฐฉ์‹ ๋ณ€๊ฒฝ
    • ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ฒฝ์šฐ [์ž์œ ๊ฒŒ์‹œํŒ]๊ณผ [๋‚ด๊ฐ€ ์“ด ํ”ผ๋“œ๋ฐฑ]์€ drop down์œผ๋กœ, [๋‚ด๊ฐ€ ์“ด ๊ฒŒ์‹œํŒ]์˜ ๊ฒฝ์šฐ์—” ๋ฒ„ํŠผ์œผ๋กœ ๋”ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์–ด์„œ ๋ถˆํŽธํ•˜๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์Œ
    • ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ drop down์œผ๋กœ ๋ณ€๊ฒฝ
  5. ์นด์นด์˜คํ†ก ํšŒ์›ํƒˆํ‡ด (์„œ๋น„์Šค ์—ฐ๊ฒฐ ๋Š๊ธฐ)
    • ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์‹œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ์ „๋‹ฌํ•˜๋Š” ํ† ํฐ์— ์นด์นด์˜ค access token์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์นด์นด์˜คํ†ก ์—ฐ๊ฒฐ ๋Š๊ธฐ api๋กœ ํ•ด๋‹น ํ† ํฐ์„ ์ „์†กํ•˜์—ฌ ์„œ๋น„์Šค ์—ฐ๊ฒฐ ๋Š๊ธฐ ์š”์ฒญ
  6. ๋ฒ„ํŠผ ์ค‘๋ณต ํด๋ฆญ ๋ฐฉ์ง€
    • debounce์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์„œ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆŒ๋ €์„ ๋•Œ ํŠน์ • ์‹œ๊ฐ„(0.3์ดˆ)๋™์•ˆ ์•ก์…˜์ด ์—†๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ๋ณ€๊ฒฝ
  7. ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์‹œ ํšจ๊ณผ์Œ
    • howler.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฝ์ž…ํ•œ src๊ฐ€ ํ”Œ๋ ˆ์ด๋˜๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์„œ ๊ฒŒ์ž„ ์ค‘ ํšจ๊ณผ์Œ์ด ๋‚˜์˜ค๋„๋ก ๋ณ€๊ฒฝ
  8. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์ด์šฉ์‹œ ๊ฒŒ์ž„๋ฃธ ์ž…์žฅ์ด ์•ˆ๋˜๊ณ  โ€˜๋งŒ๋ฃŒ๋œ JWT ํ† ํฐ์ž…๋‹ˆ๋‹ค โ€™ ๋ผ๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ํŠ•๊ธฐ๋Š” ์˜ค๋ฅ˜
    • ์นด์นด์˜ค ๋กœ๊ทธ์ธ์‹œ ์ด๋ฉ”์ผ ํ—ˆ์šฉ์„ ํ•˜์ง€ ์•Š์€ ์œ ์ €๋“ค์—๊ฒŒ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ
    • kakao developers ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์นด์นด์˜ค๋กœ๊ทธ์ธ - ๋™์˜ํ•ญ๋ชฉ ์—์„œ email ์„ค์ •์„ ํ•„์ˆ˜์„ ํƒ์œผ๋กœ ์ˆ˜์ •



โŒ› ์‹œ๊ฐ„์ด ๋” ์žˆ์—ˆ๋‹ค๋ฉด ๋„์ „ํ–ˆ์„ ๊ธฐ์ˆ ๋“ค

  • ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ
  • ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์‹ค์‹œ๊ฐ„ ๋ฐฉ ๋ฆฌ์ŠคํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ SSE
  • ์ถ”๊ฐ€์ ์ธ ์†Œ์…œ ๋กœ๊ทธ์ธ(๋„ค์ด๋ฒ„, ๊ตฌ๊ธ€)
  • docker๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ scale-out
  • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

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

Backend Tech Stack




Infrastructure





Team Collaboration Tool




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ & ์กฐ์›

โœ”๏ธ 2022.12.30 - 2022.02.09
โœ”๏ธ ๋ฉค๋ฒ„ ์ด๋ฆ„ ํด๋ฆญ ์‹œ, ํ•ด๋‹น ๋ฉค๋ฒ„์˜ ๊นƒํ—ˆ๋ธŒ๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊น€์•„์˜ ์กฐ์†Œ์˜ ์ฐจ์ด์ง„ ํ™์œค์žฌ
๋‚ด์บ๋ฆญํ„ฐ ์†Œ์˜๋‹˜์บ๋ฆญํ„ฐ ์ด์ง„๋‹˜์บ๋ฆญํ„ฐ ์œค์žฌ๋‹˜์บ๋ฆญํ„ฐ
SPRING SPRING SPRING SPRING




About

๐Ÿ” ํ™”์ƒ, ์Œ์„ฑ, ํ…์ŠคํŠธ ์ฑ„ํŒ…์œผ๋กœ ์ฆ๊ธฐ๋Š” ํ€ด์ฆˆ๊ฒŒ์ž„ ๋‚˜๋ชฐ๋‹ญ

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •