Skip to content

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

Notifications You must be signed in to change notification settings

Trys-Ketch/trys-ketch-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๋ˆˆ์น˜ ์ฝ”์น˜ ์บ์น˜ : 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