Git Product home page Git Product logo

trys-ketch-server's Introduction

๋ˆˆ์น˜ ์ฝ”์น˜ ์บ์น˜ : TRY'S KETCH !

๋ˆˆ์ฝ”์บ ๋ฐฐ๊ฒฝ


โœจ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๐ŸŽค ๋ณด์ด์Šค ์ฑ„ํŒ…๊ณผ ํ•จ๊ป˜ ์ฆ๊ธฐ๋Š” ๐ŸŽจ ๋“œ๋กœ์ž‰ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค !!

  1. ๋– ์˜ค๋ฅด๋Š” ๋ฌธ์žฅ ๋˜๋Š” ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !
    ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์œ ์ €๋“ค์€ ๋‹ค๋ฅธ์‚ฌ๋žŒ์ด ๊ทธ๋ฆด ๋ฌธ์žฅ ๋˜๋Š” ๋‹จ์–ด๋ฅผ ์ œ์ถœํ•ด ์ฃผ์„ธ์š”.
    ๋– ์˜ค๋ฅด๋Š”๊ฒŒ ์—†์œผ์…”๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ๋žœ๋คํ•˜๊ฒŒ ๋“œ๋ฆฌ๋‹ˆ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์…”๋„ ๐Ÿ‘Œ
  2. ์ œ์‹œ์–ด๋ฅผ ๋ฐ›์œผ๋ฉด ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์š”!
    ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ์ œ์ถœํ•œ ์ œ์‹œ์–ด๋ฅผ ๋ณด๊ณ  ๋‚˜๋งŒ์˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ํ‘œํ˜„ํ•ด์ฃผ์„ธ์š”.
  3. ๊ทธ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ์ œ์‹œ์–ด๋ฅผ ์ž…๋ ฅํ•ด์š”!
    ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์„ ๋ณด๊ณ  ์—ฌ๋Ÿฌ๋ถ„์ด ๋Š๋ผ์‹  ๊ทธ๋Œ€๋กœ ์ ์–ด์ฃผ์„ธ์š”.
  4. ๋ชจ๋“  ๋ผ์šด๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด...?
    ๊ฒŒ์ž„์ด ์ง„ํ–‰๋˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฌผ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋˜๋Š”์ง€ ํ•จ๊ป˜ ๋ณด๋ฉด์„œ ์ฆ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ˜†

๐Ÿ” ์ฃผ์š” ๊ธฐ๋Šฅ

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

๐Ÿ“† ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

2022.12.30 ~ 2023.02.10 / ์„œ๋น„์Šค ๋Ÿฐ์นญ : 2023.01.30



๐ŸŽฎ ์‹ค์ œ ํ”Œ๋ ˆ์ด ํ™”๋ฉด

ingame

result


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

FRONT-END


BACK-END



๐Ÿงฑ ERD

Trys-ketch-ERD


๐Ÿ—๏ธ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

์„œ๋น„์Šค ์•„ํ‚คํ…์ณ


๐Ÿค”๏ธ ๊ธฐ์ˆ ์  ์˜์‚ฌ ๊ฒฐ์ •

์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค !
์š”๊ตฌ ์‚ฌํ•ญ ์„ ํƒ์ง€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
WebRTC๋ฅผ ์ด์šฉํ•œ
์‚ฌ์šฉ์ž ์Œ์„ฑ ์—ฐ๊ฒฐ
- Mesh(p2p)
- SFU
- SFU๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋ฅผ ๋” ๊ตฌ์ถ•ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์— ๋งž์ง€ ์•Š์Œ
- ์˜์ƒ ์—†์ด ์Œ์„ฑํ†ต์‹ ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์˜ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ
- Mesh๋ฐฉ์‹์˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์ด ๊ฐ€์žฅ ๋งŽ์•„ ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๊ธฐ ํŽธํ–ˆ์Œ
๊ฒŒ์ž„ ๋กœ๋น„์—์„œ ์‹ค์‹œ๊ฐ„
๋ฐฉ ์ •๋ณด ์กฐํšŒ
- Polling
- Long Polling
- SSE
- WebSocket
- ๋ฆฌ์†Œ์Šค์™€ ์‹ค์‹œ๊ฐ„์„ฑ ๋‘๊ฐ€์ง€ ์ธก๋ฉด ๊ณ ๋ ค ํ•„์š”
- ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผํ•˜๋ฏ€๋กœ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ์ ์–ด์•ผํ•จ
- polling์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‚˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์„œ๋ฒ„์— ์งง์€ ๊ฐ„๊ฒฉ์œผ๋กœ ์š”์ฒญ์„ ํ•˜๋ฉด ๋˜๋‚˜ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง
- Long Polling์€ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌํ˜„์ด ๋ฒˆ๊ฑฐ๋กœ์›€
- ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ ๋ถˆํ•„์š”, ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ๋งŒ
ํ•„์š”ํ•œ ์ผ€์ด์Šค์ด๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ์ธก๋ฉด ๊ณ ๋ คํ•˜์—ฌ SSE๋ฐฉ์‹์„ ์ฑ„ํƒ
๊ฒŒ์ž„ ์ง„ํ–‰ ๊ณผ์ •์—์„œ
๊ฐ„๋‹จํ•œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ
- Canvas API
- WebGL
- WebGL์€ ๋ณต์žกํ•œ 3D ๋ Œ๋”๋ง์— ๋” ์„ ํ˜ธ๋˜๊ณ  Canvas API๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 2D
๋ Œ๋”๋ง์— ๋” ์„ ํ˜ธ๋จ
- ๊ฐ„๋‹จํ•œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด WebGL์€ ๋„ˆ๋ฌด๋‚˜ ๋งŽ์€ ๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ํ•„์š”๋กœ ํ•จ
- ๋”ฐ๋ผ์„œ ์ œ๋กœ๋ฒ ์ด์Šค์—์„œ ๊ธˆ๋ฐฉ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” Canvas API๋ฅผ ์ฑ„ํƒํ•˜์˜€์Œ
๊ทธ๋ฆผ ์ด๋ฏธ์ง€
ํŒŒ์ผ ๊ด€๋ฆฌ
- Spring Scheduler
- Spring Batch
- Scheduler quartz
- ๊ทธ๋ฆผ์„ DB์— ์ €์žฅํ•˜์—ฌ ๊ฒŒ์ž„ ์ค‘ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ํ•„์š”์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ
์ฃผ๊ธฐ์ ์œผ๋กœ ์—†์• ๊ธฐ ์œ„ํ•ด ์Šค์ผ€์ค„๋ง ํ•„์š”
- ์ด๋ฒคํŠธ ์ผ์ •์— ๋ณ€๋™์ด ์—†์œผ๋ฉฐ ์ด๋ฒคํŠธ ์‹œ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์ด ๋‹จ์ˆœํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋งž๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ Spring Scheduler ์‚ฌ์šฉ
๋น„ํšŒ์› ์ •๋ณด ๊ด€๋ฆฌ - MySQL
- Redis
- Memcached
- Redis๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ๊ณผ ์‚ญ์ œ๊ฐ€ MySQL์— ๋น„ํ•ด์„œ 10๋ฐฐ์ •๋„ ๋น ๋ฆ„
- ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋Œ€์‹  ๋ฐ์ดํ„ฐ์˜
๊ณ ์† ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ์Œ
- Redis๋Š” Memcached ์™€ ๋‹ฌ๋ฆฌ ๋‹จ์ˆœํ•œ key/value ์ž๋ฃŒ๊ตฌ์กฐ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ง€์›
- ํ•˜๋‚˜์˜ ๋น„ํšŒ์› ์ •๋ณด์— โ€œ๊ณ ์œ ๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„, ์ด๋ฏธ์ง€URLโ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ์ €์žฅ์ด ๊ฐ€๋Šฅ
- Redis ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • ๊ฐ€๋Šฅ

๐Ÿ› ๏ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

FRONT-END

webRTC ์—ฐ๊ฒฐ ๊ด€๋ จ ์ด์Šˆ

์ง„ํ–‰ ์ˆœ์„œ ๋‚ด์šฉ
๐Ÿ˜ฑ ๋ฌธ์ œ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์„ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€ ํ˜น์€ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„ ๊ฒŒ์ž„์„ ์ œ๋Œ€๋กœ ์ง„ํ–‰์ด
๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๋‚ด ์†Œ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ ๋“ค์„ ์ˆ˜ ์—†์œผ๋‚˜ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์†Œ๋ฆฌ๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ
๐Ÿค” ์›์ธ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์š”์ฒญํ•  ๋•Œ ์ฝ”๋“œ์˜ ํ๋ฆ„์ด ์ •์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ
์†Œ์ผ“ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์Œ
๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ ๊ถŒํ•œ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ rtc์—ฐ๊ฒฐ์„ ์š”์ฒญ์‹œ ๋‚˜์˜ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์ด
undefined ์ƒํƒœ์ด๋ฏ€๋กœ ์ƒ๋Œ€์˜ ์Œ์„ฑ์€ ๋“ค๋ฆฌ๋‚˜ ๋‚˜์˜ ์Œ์„ฑ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ
๐Ÿ˜ญ ์‹œ๋„ โ€ข getUserMedia()๋ฅผ ๋ณ„๊ฐœ์˜ useEffect๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์†Œ์ผ“๊ณผ rtc๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋กœ์ง์— ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ๊ตฌํ˜„
์ด ๊ฒฝ์šฐ ๋ฏธ๋””์–ด์ŠคํŠธ๋ฆผ์„ ํ—ˆ๊ฐ€ํ•˜๊ธฐ ์ „์— rtc์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋ฏ€๋กœ ๋‚ด ๋กœ์ปฌ์ŠคํŠธ๋ฆผ์ด undefined ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ
โ€ข getUserMedia()ํ•จ์ˆ˜๋ฅผ ์†Œ์ผ“ ์—ฐ๊ฒฐ ์ดํ›„์— ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝํ•จ. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ rtc์—ฐ๊ฒฐ์„
์š”์ฒญํ–ˆ์„ ๋•Œ๋งˆ์ดํฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฉด ๋‚˜์˜ ๋ฏธ๋””์–ด์ŠคํŠธ๋ฆผ์ด undefined ์ธ
๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋‚˜์˜ ๋ง์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋“ค์„ ์ˆ˜๊ฐ€ ์—†์Œ
๐Ÿ˜„ ํ•ด๊ฒฐ โ€ข getUserMedia()ํ•จ์ˆ˜๋ฅผ ๋ณ„๊ฐœ์˜ useEffect๋ฅผ ์ด์šฉํ•ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ ๋‘ 
โ€ข ์š”์ฒญ์„ ๋ฐ›์•„ rtc์—ฐ๊ฒฐ์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ๋‚ด๊ฐ€ ์ƒˆ๋กœ์šด rtc์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ดํฌ ์‚ฌ์šฉ์„
ํ—ˆ๊ฐ€/๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ฉด ๋ฐ˜๋ณต๋ฌธ๊ณผ ํ•จ๊ป˜ Promise, setTimeOut์œผ๋กœ ๊ตฌํ˜„ํ•œ sleepํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ์˜
ํ๋ฆ„์„ ๋ง‰์Œ
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ดํฌ ์‚ฌ์šฉ์„ ํ—ˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์—ฐ๊ฒฐ์„ ์ง„ํ–‰ํ•จ, ์‚ฌ์šฉ์„ ๊ฑฐ๋ถ€ํ•œ ๊ฒฝ์šฐ ๋ณธ์ธ์˜ ๋งˆ์ดํฌ๋Š” ์‚ฌ์šฉ์ด
๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํŠน๋ณ„ํžˆ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Œ

ํŠน์ • ์˜์—ญ์„ ํ•œ ๊ฐ€์ง€ ์ƒ‰์œผ๋กœ ์ƒ‰์น ํ•˜๋Š” floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜

์š”๊ตฌ ์‚ฌํ•ญ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
๐Ÿ˜ฑ ๋ฌธ์ œ floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์•„ ์ƒ‰์„ ์น ํ•˜๋Š”๋ฐ ์ง€๋‚˜์น˜๊ฒŒ ์˜ค๋žœ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ
์„ ์„ ๊ทธ์—ˆ์„ ๋•Œ ํ…Œ๋‘๋ฆฌ์˜ rgba๊ฐ’์ด ์„ ์˜ rgba๊ฐ’๊ณผ ์•„์ฃผ ์ž‘์€ ์ฐจ์ด๊ฐ€ ์žˆ์–ด floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด ์ œ๋Œ€๋กœ
์ ์šฉ๋˜์ง€ ์•Š์Œ
๐Ÿค” ์›์ธ ์„ ์„ ๊ทธ์—ˆ์„ ๋•Œ ํ…Œ๋‘๋ฆฌ๊ฐ€ ํ”ฝ์…€์˜ ์ค‘๊ฐ„์— ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ Canvas API์—์„œ ์ž๋™์œผ๋กœ ๋ณด์ •ํ•˜์—ฌ ํ”ฝ์…€์˜ ์ƒ‰์ƒ์ด
๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด์„œ floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์ง€ ์•Š์Œ
floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ๊ฐœ์˜ ํ”ฝ์…€์„ ๋Œ€์ƒ์œผ๋กœ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋‚˜
์‹œ๊ฐ„๋ณต์žก๋„์— ํฐ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋จ ๋”ฐ๋ผ์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์—ญ์‹œ ์ตœ์ ํ™” ๋˜์–ด์•ผํ•จ
๐Ÿ˜ญ ์‹œ๋„ โ€ข ์žฌ๊ท€ ํ˜•ํƒœ์˜ floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ stack์˜ pop๊ณผ push๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜์œผ๋‚˜ pop๊ณผ push๋ฉ”์†Œ๋“œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ
์ธํ•ด ๋งŒ์กฑํ• ๋งŒํ•œ ์„ฑ๋Šฅ์„ ๋‚ด์ง€ ๋ชปํ–ˆ์Œ
โ€ข rgba๊ฐ’์— tolerance๋ฅผ ์ฃผ์–ด rgba๊ฐ’์˜ ์ฐจ์ด๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ธ์‹ํ•˜๊ณ  floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ ์šฉ์„
๋ฐ›๊ฒŒ ๊ตฌํ˜„ํ•จ
โ€ข rgb๊ฐ’์„ string์„ ์ด์šฉํ•ด ๊ตฌํ•˜๊ณ ์ž ํ–ˆ์œผ๋‚˜ ์ด๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Œ. ๋˜ํ•œ ํ•ด๋‹น ํ”ฝ์…€์˜
rgb๊ฐ’์ด tolerance ๋ฒ”์œ„ ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด Math.abs() ํ˜น์€ rgb๊ฐ’์˜ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ
์ด์šฉํ•ด tolerance์™€ ๋น„๊ตํ•˜์˜€์Œ ๊ทธ๋Ÿฌ๋‚˜ ์ด ์—ญ์‹œ ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด
๐Ÿ˜„ ํ•ด๊ฒฐ โ€ข pop๊ณผ push๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์— x์™€ y์˜ ํ”ฝ์…€ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋‹ด์•„ ํ˜„์žฌ์˜ ํ”ฝ์…€์„ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์˜
์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด์œผ๋กœ์„œ ํŠน์ •ํ•˜๊ณ  ํ•ด๋‹น ํ”ฝ์…€์— ๋Œ€ํ•œ floodfill ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋ƒ„
โ€ข rgba๊ฐ’์„ ์ถ”์ถœํ•ด๋‚ด๊ธฐ ์œ„ํ•ด unsigned int๋กœ ํ‘œํ˜„๋œ rgba๊ฐ’์˜ ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ์— ๋น„ํŠธ์—ฐ์‚ฐ์ž &๋กœ ๋งˆ์Šคํ‚นํ•˜์—ฌ
rgba๊ฐ’์„ ์ถ”์ถœํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์œผ๋กœ shiftํ•˜์—ฌ rgba๊ฐ’์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•จ
โ€ข tolerance์™€ ํ˜„์žฌ rgba๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์ฐจ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ tolerance๊ฐ’๊ณผ ์ผ์ผ์ด
๋น„๊ตํ•จ ๋‹ค๋ฅธ ๋ฐฉ์‹๋ณด๋‹ค ์ด ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋นจ๋ž์Œ

๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์ƒ์„ฑ๋œ ํ† ์ŠคํŠธ๊ฐ€ ๋™์ผํ•œ ํƒ€์ž„์•„์›ƒ์„ ๊ณต์œ ํ•˜๋Š” ๋ฌธ์ œ

์š”๊ตฌ ์‚ฌํ•ญ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
๐Ÿ˜ฑ ๋ฌธ์ œ ํ† ์ŠคํŠธ์—์„œ ์ƒ์„ฑ์‹œ 3์ดˆ๋’ค์— ์‚ญ์ œ๋˜๋Š” ํƒ€์ž„์•„์›ƒ์„ ์ ์šฉํ•ด๋†“์Œ
๊ฐ๊ฐ์˜ ํ† ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฃŒ ์‹œ์ ์„ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ๋ชจ๋‘ ๊ฐ™์€ ์ข…๋ฃŒ์‹œ์ ์„ ๊ฐ€์ง
๐Ÿค” ์›์ธ rerendering ๋˜๋ฉด์„œ ํƒ€์ž„์•„์›ƒ๋„ ์žฌ์„ค์ •๋จ
๐Ÿ˜ญ ์‹œ๋„ โ€ข react devtools render highlight
๋””๋ฒ„๊น…์„ ์œ„ํ•ด ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜์ด๋ผ์ดํŠธํ•ด์ฃผ๋Š” react devtools ๊ธฐ๋Šฅ ์‚ฌ์šฉ โ‡’ ๋””๋ฒ„๊น… ๊ฒฐ๊ณผ ํ† ์ŠคํŠธ๊ฐ€
์ƒ์„ฑ๋  ๋•Œ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ† ์ŠคํŠธ๋“ค๋„ ํ•จ๊ป˜ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌ
๐Ÿ˜„ ํ•ด๊ฒฐ โ€ข ํ† ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ์— memo ์ ์šฉ
โ€ข ํ† ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜ props์— useCallback ์ ์šฉ
์œ„ ๋‘๊ฐ€์ง€๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ๋ฆฌ๋ Œ๋”๋งํ•ด์•ผํ•  ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹ํ•˜์ง€ ์•Š์•„์„œ ๊ฐ๊ฐ์˜ ํƒ€์ž„์•„์›ƒ์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Œ
BACK-END

Redis @Indexed ์˜ ์ฐธ์กฐ๊ฐ’ ์‚ญ์ œ ๋ฌธ์ œ

์š”๊ตฌ ์‚ฌํ•ญ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
๐Ÿ˜ฑ ๋ฌธ์ œ ๋ ˆ๋””์Šค์—์„œ ํ‚ค๊ฐ’์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋˜ @Indexed ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ
์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ์ค˜์•ผ์ง€๋งŒ key ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋น„ํšŒ์› ์ •๋ณด์˜ ๊ฒ€์ฆ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€
์˜ˆ)์ƒˆ๋กœ์šด ๋น„ํšŒ์›์ด ์ƒ๊ธฐ๋ฉด guest:10001 ์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ์ƒ๊ธฐ๊ณ  ๋™์‹œ์— guest:10001:idx ๋ผ๋Š” ์ƒˆ๋กœ์šด
ํŒŒ์ผ์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด ํŒŒ์ผ์ด ๋งŒ๋ฃŒ์‹œ ์‚ญ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
๐Ÿค” ์›์ธ @Indexed ๋กœ ์ธํ•ด ๊ฐ™์ด ์ƒ์„ฑ๋œ ์ฐธ์กฐ๊ฐ’๋“ค์€ ๋งŒ๋ฃŒ์‹œ ์ž๋™์œผ๋กœ ์‚ญ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.
๐Ÿ˜ญ ์‹œ๋„ โ€ข ๊ฐ•์ œ ์ง€์ • (redistemplate.expire)
์ฐธ์กฐ๊ฐ’์ด ์ƒ์„ฑ๋  ๋•Œ ์ƒ๊ธฐ๋Š” ์ด๋ฆ„์€ ๋™์ผํ•œ ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์— RedisTemplate ์—์„œ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ํ•ด๋‹น ํŒŒ์ผ์ด
์ƒ์„ฑ๋˜๋ฉด ๋ฐ”๋กœ ๊ฐ™์ด ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋Š” ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ๋ฒ•์ด ์•„๋‹ˆ์—ฌ์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„
๋” ์ฐพ์•„๋ณด๊ธฐ๋กœ ๊ฒฐ์ •
โ€ข @Id ๋งŒ์„ ์‚ฌ์šฉ
๋ ˆ๋””์Šค๋ฅผ ํ†ตํ•ด ๋น„ํšŒ์›์ •๋ณด ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— @Id ์–ด๋…ธํ…Œ์ด์…˜ ๋งŒ์œผ๋กœ๋Š” ์ฐพ๋Š” ๋น„ํšŒ์›์ •๋ณด๋ฅผ
์ฐพ์„์ˆ˜๊ฐ€ ์—†์–ด์„œ @Indexed ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ์ง€
๐Ÿ˜„ ํ•ด๊ฒฐ @EnableRedisRepositories(enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP)
์œ„์ฒ˜๋Ÿผ RedisRepo ์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฐ๊ณผ Server ๊ฐ€ ๋‚ด๋ ค๊ฐ„ ์‚ฌ์ด Redis ์—์„œ ์‚ญ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€
์•„๋‹Œ ์ด์ƒ ์‚ญ์ œ์‹œ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ด์„œ ์ฐธ์กฐ๊ฐ’๋„ ํ•จ๊ป˜ ์ž˜ ์‚ญ์ œ๊ฐ€ ๋˜๋Š”๊ฒƒ์„ ํ™•์ธ

SSE ์—ฐ๊ฒฐ ๊ด€๋ จ ์ด์Šˆ

์š”๊ตฌ ์‚ฌํ•ญ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
๐Ÿ˜ฑ ๋ฌธ์ œ emitter์˜ ๊ฐ์ฒด ์‹œ๊ฐ„์„ ๊ธธ๊ฒŒ ์„ค์ •ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๋Œ€๋กœ ์ „์†กํ•˜์ง€ ๋ชปํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š”
IOException : Broken Pipe ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
๐Ÿค” ์›์ธ JPA ์‚ฌ์šฉ์‹œ open in view ์„ค์ •์ด ๊ธฐ๋ณธ์œผ๋กœ true๋กœ ์„ค์ •๋จ. true๋กœ ์„ค์ •๋˜๋ฉด HTTP Connection์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ
DB Connection๋„ ๊ฐ™์ด ์—ด๋ ค์žˆ๊ฒŒ ๋จ.
๋ณดํ†ต์€ HTTP ํ˜ธ์ถœ์ด ๋๋‚˜๊ณ  DB ์ปค๋„ฅ์…˜๋„ ์ข…๋ฃŒ๋˜๋‚˜, SSE ์‚ฌ์šฉ์‹œ์—๋Š” ๊ฐ์ฒด๊ฐ€ ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ DB
์ปค๋„ฅ์…˜์ด ์—ด๋ ค ๊ณ ๊ฐˆ๋˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜€์Œ
๐Ÿ˜ญ ์‹œ๋„ ๊ฐ์ฒด์˜ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ • ํ•ด๋ด„ โ†’ ๊ฐ์ฒด์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ์žฌ์—ฐ๊ฒฐ๋˜๊ณ  ์ด๋Š” ๊ฒฐ๊ตญ ๋ฆฌ์†Œ์Šค์˜ ๋‚ญ๋น„๋กœ
์ด์–ด์ ธ SSE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์— ๋งž์ง€์•Š์Œ
๐Ÿ˜„ ํ•ด๊ฒฐ DB ์ปค๋„ฅ์…˜์„ ๊ณ„์† ๋ฌผ๊ณ  ์žˆ์ง€ ์•Š๋„๋ก OSIV ์„ค์ •์„ ๋”. โ†’ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค๋Š”
๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ โ†’ @OneToMany์˜ fetch join ํƒ€์ž…์„ Eager๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด๊ฒฐ

๊ฒŒ์ž„ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋™์‹œ์„ฑ ์ œ์–ด(synchronized, DB Lock)

์š”๊ตฌ ์‚ฌํ•ญ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์„ ํƒํ•œ ์ด์œ  ๋ฐ ๊ทผ๊ฑฐ
๐Ÿ˜ฑ ๋ฌธ์ œ ์ œํ•œ ์‹œ๊ฐ„์„ ๋„˜์–ด ๋ฏธ์ฒ˜ ์ œ์ถœํ•˜์ง€ ๋ชปํ•œ ์œ ์ €์˜ ํ‚ค์›Œ๋“œ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์ผ๊ด„ ์ž๋™ ์ œ์ถœ ๋˜์—ˆ์„ ๋•Œ DB์— ์ œ๋Œ€๋กœ
๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹ค์Œ ๋ผ์šด๋“œ๋กœ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•จ.
๐Ÿค” ์›์ธ ํ˜„์žฌ ๋กœ์ง์ƒ save โ†’ find์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— ์ž๋™์ œ์ถœ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ ๋™์‹œ์— ๋™์ผํ•œ ์ž์›์— ์ ‘๊ทผํ•˜๋ ค
ํ•˜๋Š” ๊ฒƒ์„ ์›์ธ์œผ๋กœ ํŒ๋‹จ.
๐Ÿ˜ญ ์‹œ๋„ โ€ข synchronized
์ œ์ถœ๋กœ์ง์˜ Controller method ์— synchronized ์ ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”ํ•จ. ์˜๋„๋Œ€๋กœ ๋™์ž‘ ํ–ˆ์œผ๋‚˜,
์„ฑ๋Šฅ ์ƒ ์†๋„ ์ €ํ•˜ ์ด์Šˆ ๋ฐœ์ƒํ•จ.
โ€ข Thread Scheduler
์ œ์ถœ ์ธ์›์„ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ๋…๋ฆฝ์‹œ์ผœ์„œ thread๋ฅผ ๋งŒ๋“ค๊ณ , ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋” ๊ตฌํ˜„ํ•จ.
๊ทธ๋Ÿฌ๋‚˜ DB์— ์ฝ๊ธฐ ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ œ์–ด ํ•˜์ง€ ๋ชปํ•ด ๋™์ผํ•œ ๋ฌธ์ œ ๋ฐœ์ƒํ•จ.
โ€ข Optimistic Lock
์ œ์ถœ ๋กœ์ง ํŠน์„ฑ ์ƒ ๋นˆ๋ฒˆํ•œ ์ถฉ๋Œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กค๋ฐฑ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ Optimistic Lock ๋ฏธ์ ์šฉ.
โ€ข Pessimistic Lock
์ œ์ถœ ์ธ์›์„ ํ•˜๋‚˜์˜ column์œผ๋กœ ๊ฐ–๋Š” table์„ ์ƒ์„ฑํ•˜๊ณ , row level lock ์ ์šฉ, update์šฉ find method๋ฅผ ๊ตฌํ˜„ ๋ฐ,
ํ•ด๋‹น method์— @Lock ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•จ.
์ œ์ถœ ์ธ์›์„ ์ˆ˜์ •ํ•  ๋•Œ write lock์ด ๊ฑธ๋ฆฌ๊ณ  transaction์ด ๋๋‚˜์•ผ lock์ด ํ’€๋ฆฌ๋Š” ๊ฒƒ์„ ์ด์šฉํ•จ.
๐Ÿ˜„ ํ•ด๊ฒฐ ๊ฒŒ์ž„์˜ ์ตœ๋Œ€ ์ธ์›์ด 8๋ช…์œผ๋กœ ํ…Œ์ŠคํŠธ ํ–ˆ์„ ๋•Œ, ๋น„๊ต์  ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์—†๋˜ Pessimistic Lock์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด
์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด ๋„์ž…ํ•จ.

โ€๐Ÿง‘โ€๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ฉค๋ฒ„

๐Ÿ”ฐ์žฅ์‹ ์› ์ด๋ฏผ๊ทœ ๐Ÿ”ฐ์•ˆ์€์†” ๊น€์žฌ์˜ ์„œํ˜์ˆ˜ ํ™ฉ๋ฏธ๊ฒฝ ์กฐ๋ฌธ์ •
์žฅ์‹ ์› ์ด๋ฏผ๊ทœ ์•ˆ์€์†” ๊น€์žฌ์˜ ์„œํ˜์ˆ˜ ํ™ฉ๋ฏธ๊ฒฝ ์กฐ๋ฌธ์ •
FRONT-END FRONT-END BACK-END BACK-END BACK-END BACK-END DESIGN

trys-ketch-server's People

Contributors

beautifulseoul avatar code0613 avatar eunsol-an avatar shsus1122 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

trys-ketch-server's Issues

GameService ๋ฆฌํŒฉํ† ๋ง

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • GameService ๋‚ด๋ถ€ ์ค‘๋ณต์ฝ”๋“œ ๋ถ„๋ฆฌ
  • ์ฃผ์„ ์ˆ˜์ • ๋ฐ ์ œ๊ฑฐ
  • ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋กœ๊ทธ ์ œ๊ฑฐ

getAllGameRoom ๋ฐ˜ํ™˜์ •๋ณด ์ˆ˜์ •

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • getAllGameRoom ๋ฐ˜ํ™˜์ •๋ณด ์ˆ˜์ •

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๊ธฐ์กด gameRoomList๋งŒ ๋ฐ˜ํ™˜ํ•˜๋˜ getAllGameRoom ๋ฉ”์†Œ๋“œ๊ฐ€ gameRoomList์™€ LasgPage๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ

๊ตฌ๊ธ€ Oauth2 ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ตฌ๊ธ€ ๊ณ„์ •์„ ์ด์šฉํ•œ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ์ฒดํฌ

ํšŒ์› ์ •๋ณด ์กฐํšŒ API ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ํšŒ์› ๊ณ ์œ  ๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„, ํšŒ์› ํ”„๋กœํ•„ ์กฐํšŒ API ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํ™”๋ฉด์— ์ž˜ ๋ณด์—ฌ์ง€๋Š”์ง€ ํ™•์ธ

๊ฒŒ์ž„์ค‘ ์ œ์ถœ์ธ์› ํ‘œ์‹œ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„ ์ค‘์— ์ œ์ถœ์„ ํ•œ ์ธ์›๋“ค์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํ”„๋ก ํŠธ์™€ ํ…Œ์ŠคํŠธ ํ•ด์„œ ์ •์ƒ์ž‘๋™ ํ™•์ธ

๋ฐฉ์žฅ์˜ ๊ฐ•ํ‡ด ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๋ฐฉ์žฅ์˜ ๊ฒฝ์šฐ์—๋Š” ์œ ์ €๋“ค์„ ๊ฐ•ํ‡ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํ”„๋ก ํŠธ์™€ ๋งž์ถฐ๋ณด๊ธฐ
  • ๊ฐ•ํ‡ด์‹œ ์žฌ์ž…์žฅ ๋ถˆ๊ฐ€๋Šฅ

S3 ๊ด€๋ จ - ๊ทธ๋ฆผ ์ข‹์•„์š” ์ทจ์†Œ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ httpservlet๋กœ ๋ณ€๊ฒฝ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์ข‹์•„์š” ์ทจ์†Œ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ๋น„ํšŒ์› ํ™•์ธ ์œ„ํ•ด userdetailsimpl -> httpservlet์œผ๋กœ ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ

WebRTC ๋‹ค๋Œ€๋‹ค ์—ฐ๊ฒฐ ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • Signaling Server๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋‹ค๋Œ€๋‹ค ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

SignalingHandler ๋ฆฌํŒฉํ† ๋ง

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ์— ์ค‘๋ณต๋˜๋Š” ๋‚ด์šฉ์ด ๋งŽ์•„ type์„ ์ค„์ด๊ณ  ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์•ˆ์—์„œ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

[FIX] ๊ฒŒ์ž„ ์ค‘ ํ‡ด์žฅํ•˜๋”๋ผ๋„ ์ •์ƒ ์ง„ํ–‰๋˜๋„๋ก ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„ ์ค‘ ์—ฐ๊ฒฐ ๋Š๊ธฐ๋”๋ผ๋„ ์ •์ƒ ์ง„ํ–‰๋˜๋„๋ก ๊ตฌํ˜„
  • ์ด๋ฏธ์ง€ ๋ผ์šด๋“œ์—์„œ ์ œ์ถœํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ, DB์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฏธ์ œ์ถœ ์ด๋ฏธ์ง€ ๋œจ๋„๋ก ํ•จ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์„œ๋ฒ„ ๋ฐฐํฌํ•˜์—ฌ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค

OAuth2.0 ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • OAuth2.0 ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋ฐœ๊ธ‰๋ฐ›์€ access Token์œผ๋กœ email, nickname ์ž˜ ์ฐํžˆ๋Š”์ง€ ํ™•์ธ
  • ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ

๋กœ๊ทธ์ธ ๊ด€๋ จ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์„œ๋ฒ„ ๋ฐฐํฌ ํ›„ ์นด์นด์˜คํ†ก redirect URI ๋ณ€๊ฒฝ
  • ๋„๋ฉ”์ธ ์ฃผ์†Œ๋กœ ์ ‘๊ทผ ์‹œ redirect ํ•˜๊ธฐ ์ „์— token ๋ฐ›์•„์˜ค๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํ”„๋ก ํŠธํŒ€๊ณผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋งˆ์นจํ‘œ ์ œ๊ฑฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

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

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์‹ค ์„œ๋น„์Šค์—์„œ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€์— ๋งˆ์นจํ‘œ๊ฐ€ ์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธ

๋‹‰๋„ค์ž„, ๋ฐฉ์ œ๋ชฉ ์ •๊ทœ์‹ ์ ์šฉ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๋ฐฉ์ œ๋ชฉ ์ •๊ทœ์‹ ์ ์šฉ (์•ŒํŒŒ๋ฒณ ๋Œ€์†Œ๋ฌธ์ž, ํ•œ๊ธ€, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž, 2~25์ž)
  • ๋‹‰๋„ค์ž„ ์ •๊ทœ์‹ ์ ์šฉ (์•ŒํŒŒ๋ฒณ ๋Œ€์†Œ๋ฌธ์ž, ํ•œ๊ธ€, ์ˆซ์ž, 2~12์ž)

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํฌ์ŠคํŠธ๋งจ ํ™•์ธํ•˜๊ธฐ

Redis ๋ฅผ ์ด์šฉํ•œ ์›น์†Œ์ผ“ ์ฑ„ํŒ… ๊ตฌํ˜„

Redis ๋ฅผ MessageBroker ๋กœ ํ™œ์šฉํ•ด์„œ ์ฑ„ํŒ… ๊ตฌํ˜„

  • ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ pub/sub ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด์„œ Redis ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž‘์—…

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • Redis ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉ ํ–ˆ๋Š”๊ฐ€

[FIX] ์žฌ๊ฒŒ์ž„์‹œ ๋ฐฉ์žฅ ์—ฌ๋ถ€ ๋ฏธ์ „๋‹ฌ ๋ฒ„๊ทธ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„์ด ์žฌ์‹œ์ž‘ ํ•  ๋•Œ, ์‚ฌ์šฉ์ž ์‹œ์ ์— ๋ฐฉ์žฅ๋งŒ์ด ๋ณด์ด๋Š” ๊ฒŒ์ž„์‹œ์ž‘ ๋ฒ„ํŠผ์ด ๋ณด์ด์ง€ ์•Š๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋ฐฑ์—”๋“œ ์ฝ”๋“œ ์ˆ˜์ •๋งŒ์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€ ํ”„๋ก ํŠธ์™€ ํ•จ๊ป˜ ํ™•์ธ

WebSocket ๊ฒŒ์ž„ ์ค€๋น„๋ฐฉ ์—ฐ๊ฒฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„ ์ค€๋น„๋ฐฉ์—์„œ WebSocket ์—ฐ๊ฒฐ๋กœ ์ „์ฒด ์ฐธ์—ฌ ์œ ์ €๊ฐ€ ์ž˜ ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ถ€ ์ˆ˜์ •

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

๋ฐฉ ๋‚˜๊ฐ€๊ธฐ api ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • EXIT Game Room api ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ผ๋ฐ˜

  • ํ•œ ์œ ์ €๋Š” ํ•œ ๋ฐฉ์—๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€
  • ๋ฐฉ์žฅ์ด ๊ฒŒ์ž„์‹œ์ž‘์ „ ์— ๋‚˜๊ฐ”์„ ๋•Œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ( ๋‹ค์Œ ๋ฐฉ์žฅ ์„ ์ • )
  • ๋‹ค์Œ ๋ฐฉ์žฅ ์„ ์ • โ†’ gameroom์˜ ๋ฐฉ์žฅ์ •๋ณด ์—…๋ฐ์ดํŠธ
  • ์ผ๋ฐ˜์œ ์ €๊ฐ€ ๋‚˜๊ฐ”์„๋•Œ์˜ ์ฒ˜๋ฆฌ
  • ์œ ์ €๊ฐ€ ๋‚˜๊ฐ”์„๋•Œ ๋ฐฉ์˜ ์ธ์›์ด 0๋ช…์ด๋ฉด gameroom ๋„ ์ œ๊ฑฐ

๊ฒŒ์ž„์‹œ์ž‘์ค‘

  • ๋ฐฉ์žฅ์ด ๊ฒŒ์ž„์‹œ์ž‘์ค‘ ์— ๋‚˜๊ฐ”์„ ๋•Œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ( ๋‹ค์Œ ๋ฐฉ์žฅ ์„ ์ • )
  • ์œ ์ €๊ฐ€ ๋‚˜๊ฐ”์„๋•Œ ๋ฐฉ์˜ ์ธ์›์ด 3๋ช… ์ดํ•˜๋ฉด ๊ฒŒ์ž„ ๊ฐ•์ œ ์ข…๋ฃŒ

๊ฒฐ๊ณผ์ฐฝ ๋ฐฉ์žฅ์ด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๋ฐฉ์žฅ์ด ์œ ์ €๋“ค์—๊ฒŒ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์—ฌ์ค„ ๋•Œ ๋ผ์šด๋“œ๋ณ„๋กœ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํ”„๋ก ํŠธ์™€ ํ…Œ์ŠคํŠธ
  • ์ฝ”๋“œ ๋‹ค์ด์–ดํŠธ

ํ•ด๋‹น ๋ฐฉ์˜ ๋””ํ…Œ์ผ ์กฐํšŒ API ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ์˜ title ๊ณผ randomCode๋ฅผ ์„œ๋ฒ„์ชฝ์—์„œ API๋กœ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

S3 ์ด๋ฏธ์ง€์—…๋กœ๋“œ ๊ด€๋ จ - ๊ฒŒ์ž„์ง„ํ–‰์‹œ ์ผ๋ถ€์•„๋‹Œ ์ „์ฒด ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋กœ ๋กœ์ง ๋ณ€๊ฒฝ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ธฐ์กด์—๋Š” ๊ทธ๋ฆผ์„ ์ข‹์•„์š” ๋ˆ„๋ฅผ ๊ฒฝ์šฐ์—๋งŒ S3์— ์ €์žฅ๋˜๋Š” ๋กœ์ง์ด์—ˆ๋Š”๋ฐ, ์ข‹์•„์š”์™€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ERD, API ์ˆ˜์ •ํ•„์š”
  • ํฌ์ŠคํŠธ๋งจ ํ™•์ธํ•„์š”

๊ฒŒ์ž„ ๋ฉ”์ธ ๋กœ์ง WebSocket STOMP ์ ์šฉ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ํ˜„์žฌ RESTful API ๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋ฅผ WebSocket STOMP ๋ฅผ ์ ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

Redis ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์—ฐ๊ด€๋œ ๋กœ์ง ๋ณ‘ํ•ฉ

Redis ๋ฅผ ํ™œ์šฉํ•œ ๋น„ํšŒ์› ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์—ฐ๊ด€๋œ ๋กœ์ง ๋ณ‘ํ•ฉ

  • Redis ๋ฅผ ํ™œ์šฉํ•œ ๋น„ํšŒ์›์˜ ๊ฒฝ์šฐ๋Š” ์ด์ œ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋น„ํšŒ์› PK ์ƒ์„ฑ๋ฐฉ๋ฒ• ๋ณด์™„ํ•˜๊ธฐ
  • Redis ๊ด€๋ จ ํšŒ์›, ๋น„ํšŒ์› ์™„๋ฃŒ
  • gameRoomService ์˜ ๋ชจ๋“ˆํ™”์— ์ ์šฉ ์™„๋ฃŒ

WebRTC Signaling Server ๊ตฌ์ถ•

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • WebRTC ๋ฅผ ์œ„ํ•œ Signaling Server ๊ตฌ์ถ•

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์„œ๋ฒ„ ๋ฐฐํฌ ํ›„ ํด๋ผ์ด์–ธํŠธ ํ…Œ์ŠคํŠธ
  • ์Œ์„ฑ, ์ฑ„ํŒ… ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธ

webSessionId๋กœ ๋ณ€๊ฒฝ, WebRTC ๊ด€๋ จ Security CORS ์„ค์ •

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • game_room_user ์—์„œ websession_id๋ฅผ web_session_id๋กœ ๋ณ€๊ฒฝ
  • GameRoomUser์˜ websessionId๋ฅผ webSessionId๋กœ ๋ณ€๊ฒฝ
  • WebRTC ๊ด€๋ จ Security CORS ์„ค์ •
  • WebRtcConfig ํด๋ž˜์Šค์˜ setAllowedOrigins -> setAllowedOriginPatterns ๋กœ ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

OAuth2.0 ๋กœ๊ทธ์ธ ์‹œ ๋žœ๋ค ๋‹‰๋„ค์ž„ ๋ถ€์—ฌ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • OAuth2.0 ๋กœ๊ทธ์ธ ์‹œ ๋žœ๋ค ๋‹‰๋„ค์ž„ ๋ถ€์—ฌ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • DB ์ž˜ ์ €์žฅ๋˜๋Š”์ง€ ํ™•์ธํ•„์š”
  • ํ† ํฐ์— ๋‹‰๋„ค์ž„ ์ž˜ ๊ฐ€์ง€๊ณ ์žˆ๋Š”์ง€ ํ™•์ธํ•„์š”
  • ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ํ™•์ธํ•„์š”

Scheduler ์ด์šฉํ•ด์„œ ์ข‹์•„์š” ์•ˆ๋ˆŒ๋ฆฐ S3์˜ ๊ทธ๋ฆผ ์‚ญ์ œํ•˜๊ธฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์ข‹์•„์š” ์•ˆ ๋ˆŒ๋ฆฐ ๊ทธ๋ฆผ ์Šค์ผ€์ค„๋Ÿฌ ์ด์šฉํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • S3์—์„œ๋„ ์ž˜ ์ง€์›Œ์กŒ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
  • ํฌ์ŠคํŠธ๋งจ์—์„œ ํ™•์ธํ•˜๊ธฐ

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๊ธฐ์กด ๋„๋ฉ”์ธ ๊ธฐ์ค€ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๊ณ„์ธตํ˜•์œผ๋กœ ๋ณ€๊ฒฝ

์ดˆ๋Œ€์ฝ”๋“œ ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์ดˆ๋Œ€์ฝ”๋“œ ๋ฐœ๊ธ‰ ์œ„ํ•œ ๋žœ๋คํ•œ ๋ฌธ์ž์—ด ์ƒ์„ฑ ๋ฐ ๊ฒŒ์ž„ ์ž…์žฅ์‹œ ์ ์šฉ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํฌ์ŠคํŠธ๋งจ ํ™•์ธ ์™„๋ฃŒ

๊ฒŒ์ž„ ์ค‘ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ํ•ด๋‹น ๊ฒŒ์ž„ ๋ฐฉ์˜ ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ€๊ณ  ๋‘๋ฒˆ์งธ ์ž…์žฅํ•œ ์œ ์ €๊ฐ€ ๋ฐฉ์žฅ์ด ๋˜์—ˆ์„ ๋•Œ, ๊ทธ ์œ ์ €์˜ readyStatus๊ฐ€ true๊ฐ€ ๋˜๋„๋ก ๋ณ€๊ฒฝ
  • ๊ฒŒ์ž„ ๋‚˜๊ฐ€๊ธฐ ์˜ค๋ฅ˜ ์ƒ๊ธธ ์‹œ ๋ฐฉ ๋žœ๋ค ์ฝ”๋“œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • postman ํ…Œ์ŠคํŠธ
  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

Redis ์บ์‹œ ์ ์šฉ ํ•˜๊ธฐ

Redis ์บ์‹œ ์ ์šฉ ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ

  • Redis ์บ์‹œ๋ฅผ ์ ์šฉํ•ด์„œ ์ฝ์–ด๋“ค์ด๋Š” ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋น„ํšŒ์› ๊ด€๋ จ Repo ์— ์ ์šฉํ•˜๊ธฐ
  • ํ™•์žฅํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์— ์ ์šฉํ•˜๊ธฐ

๋™์‹œ์„ฑ ์ œ์–ด

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์—ฌ๋Ÿฌ๋ช…์ด ๋™์‹œ์— ๋ฐฉ์ž…์žฅ์„ ํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ๋น ๋ฅธ ์œ ์ € 1๋ช…๋งŒ ์ •์ƒ ์ฒ˜๋ฆฌ๋˜๊ณ  ๋‹ค๋ฅธ ์œ ์ €๋“ค์€ ์ž…์žฅ์ด ๋˜์ง€์•Š๊ณ  DB์—๋„ ์ €์žฅ๋˜์ง€ ์•Š์Œ
  • ๊ทธ์™€์ค‘์— ๋ฐฉ์—๋Š” ๋“ค์–ด๊ฐ€์ ธ์„œ ์ฑ„ํŒ…์€ ๊ฐ€๋Šฅ

WebRTC ํ†ต์‹ ์— ๊ฒŒ์ž„๋ฐฉ ๋กœ์ง ์—ฐ๊ฒฐ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„๋ฐฉ ์ƒ์„ฑ, ๊ฒŒ์ž„๋ฐฉ ์ž…์žฅ ๋“ฑ ๊ตฌํ˜„ ํ•ด๋†“์€ ๋กœ์ง์— ์†Œ์ผ“ ํ†ต์‹  ์—ฐ๊ฒฐ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํด๋ผ์ด์–ธํŠธ์™€ ํ…Œ์ŠคํŠธ

์›น์†Œ์ผ“, STOMP ์ ์šฉํ•œ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ํ”„๋ก ํŠธ์—์„œ ์ง์ ‘ ์Šคํ†ฐํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•จ์œผ๋กœ ์ธํ•ด ๊ด€๋ จ ๋ถˆํ•„์š” ์ฝ”๋“œ ์ฃผ์„์ฒ˜๋ฆฌ

๊ฒŒ์ž„ ์ค‘ ์ค‘๋ณต ์ œ์ถœ ๊ด€๋ จ ์ด์Šˆ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ฒŒ์ž„์„ ์ง„ํ–‰ ํ•˜๋ฉด์„œ ์ค‘๋ณต ์ œ์ถœ์ด ๋˜์–ด ๋‹ค์Œ ๋ผ์šด๋“œ๋กœ ๊ฐ•์ œ ์ด๋™ ๋˜๋Š” ์ด์Šˆ ๋ฐœ์ƒ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ •์ƒ ์ œ์ถœ ๋˜์–ด ๊ฒŒ์ž„ ๋ฃฐ์— ๋งž๊ฒŒ ๋ผ์šด๋“œ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ ํ™•์ธ

๊ฒŒ์ž„ ์ค€๋น„, ๊ฒŒ์ž„ ์‹œ์ž‘ ๋กœ์ง ๊ตฌํ˜„

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ์œ ์ €๊ฐ€ ๊ฒŒ์ž„ ๋ฐฉ์— ์ž…์žฅํ•œ ํ›„ ๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ ๊ฒŒ์ž„ ์ค€๋น„๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ๋ฐฉ์žฅ์ด ๊ฒŒ์ž„์‹œ์ž‘์„ ๋ˆŒ๋Ÿฌ์„œ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ง ๊ตฌํ˜„

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ฐธ์—ฌ์ž๊ฐ€ ๊ฒŒ์ž„ ์ค€๋น„๋ฅผ ํ–ˆ์„ ๋•Œ, ๋ณธ์ธ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ฐธ์—ฌ์ž์—๊ฒŒ ๊ฒŒ์ž„ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋ณด์—ฌ์ง€๋Š”์ง€ ํ™•์ธ
  • ๋ชจ๋“  ์ฐธ์—ฌ์ž์˜ ์ƒํƒœ๊ฐ€ ์ค€๋น„๋กœ ๋ฐ”๋€Œ๋ฉด ๋ฐฉ์žฅ์ด ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ธฐ๋ณธ ๋ผˆ๋Œ€ ์—…๋กœ๋“œ

ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ธฐ๋ณธ ๋ผˆ๋Œ€ ์—…๋กœ๋“œ

  • ์ด์Šˆ ๋‚ด์šฉ ์š”์•ฝ ์„ค๋ช…

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์™„๋ฃŒ
  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์™„๋ฃŒ
  • MySQL ์ด์šฉํ•œ RefreshToken ์ ์šฉ ์™„๋ฃŒ

S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฐ ์กฐํšŒ

์ด์Šˆ ์ƒ์„ธ ๋‚ด์šฉ

  • ๊ทธ๋ฆผ์— ์ข‹์•„์š” ๋ฒ„ํŠผ ํด๋ฆญ์‹œ S3์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ
  • ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ข‹์•„์š” ๋ˆ„๋ฅธ ์ด๋ฏธ์ง€ ์กฐํšŒ ๊ธฐ๋Šฅ

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • S3์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ž˜ ๋˜๋Š” ์ง€ ํ™•์ธ
  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ DB์—๋„ ๋ฐ์ดํ„ฐ ์ž˜ ๋“ค์–ด๊ฐ€๋Š” ์ง€ ํ™•์ธ
  • ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ๋ชจ๋“  ๊ณผ์ • ํ™•์ธ ํ•„์š”

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.