Skip to content

HangHae99Zzz/RoomEscape_BE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๊ฟˆ๊นจ

์˜จ๋ผ์ธ 3D ๋ฐฉํƒˆ์ถœ ๊ฒŒ์ž„ ์„œ๋น„์Šค ๐Ÿ˜ด



๐Ÿ’ญ About

โ€˜zzzโ€™ ๋Š” ๊ฟˆ์„ ๊พธ๋Š” ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•œ ๋‹จ์–ด์ด์ž, ๊ฒŒ์ž„ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค

โ€˜๊ฟˆโ€™ ์ด๋ผ๋Š” ๋งค์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์ƒํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ํ•ด๊ฒฐํ•˜์—ฌ ๋ฐฉํƒˆ์ถœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ณธ ๊ฒŒ์ž„์„ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค

๋‹น์‹ ์€ ๊ฟˆ ์†์—์„œ ์–ผ๋งˆ๋งŒํผ์˜ ์—ญ๋Ÿ‰์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š์œผ์‹ ๊ฐ€์š”?


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

  • 2022.2.25 ~ 2022.4.9
  • 1์ฐจ ๋ฐฐํฌ : 2022.3.30

๐ŸŽ‰ 5์ผ ๋™์•ˆ 550์—ฌ๋ช…์˜ ์œ ์ €๋“ค์ด 550์—ฌ๊ฐœ์˜ ๋ฐฉ์„ ๋งŒ๋“ค๊ณ , 375ํŒ€์ด ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜์˜€์œผ๋ฉฐ, 9ํŒ€์ด ํƒˆ์ถœ์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค!!


๐Ÿ“Œ ๋ฐ”๋กœ๊ฐ€๊ธฐ


๐Ÿ“‚ ๋ฐฑ์—”๋“œ์˜ ๊ณ ๋ฏผ๊ณผ ๊ณต๋ถ€ ๊ธฐ๋ก์€ โ†’ https://github.com/HangHae99Zzz/RoomEscape_BE/wiki

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

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

๐ŸŽ Team Member - BackEnd

๊น€๊ฐ€์€ ์ตœ๊ทœ์› ๋ฐ˜์›์žฌ
@Kim gaeun @Choi kyuwon @Ban wonjae

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




Tools


  • Java 1.8.0
  • Springboot 2.6.4
  • Gradle 7.4
  • MySQL 8.0.23
  • Node.js 16.14.0
  • Express 4.17.1
  • Socket.io 2.3.0
  • Nginx 1.14.0
  • Mockito 4.4.0

๐Ÿ•น Convention

Coding Convention ยท Commit Convention

Coding Convention

๐Ÿ“ ๋„ค์ด๋ฐ Convention

  • ํด๋”๋ช…์€ ์†Œ๋ฌธ์ž, Class๋ช…์€ ์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž
  • Method๋Š” lowerCamelCase์„ ์‚ฌ์šฉํ•˜๊ณ , ๋™์‚ฌ๋‚˜ ์ „์น˜์‚ฌ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ex) get/set, init, is/has/can, create, find, to, A-By-B โ€ฆ
  • JUnit Test Method : Method๋ช…_ํ…Œ์ŠคํŠธ์ƒํƒœ_๊ธฐ๋Œ€ํ–‰์œ„ ex) isAdult_AgeLessThan18_False
Commit Convention

๐Ÿ“ Commit Convention

โœ… ์œ ๋‹ค์‹œํ‹ฐ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ : ์ฐธ๊ณ 
โœ… ๋ณธ๋ฌธ์—๋Š” ๋ณ€๊ฒฝํ•œ class ์ด๋ฆ„๊ณผ ์–ด๋–ป๊ฒŒ, ๋ฌด์—‡์„, ์™œ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ์ž์„ธํžˆ ์ ๊ธฐ

์ปค๋ฐ‹ ํƒ€์ž…: ์ œ๋ชฉ
  //๋„์–ด์“ฐ๊ธฐ
 ๋ณธ๋ฌธ
  //๋„์–ด์“ฐ๊ธฐ
(๊ผฌ๋ฆฌ๋ง ํƒ€์ž…: #์ด์Šˆ ๋ฒˆํ˜ธ)

๐Ÿšจ ์ปค๋ฐ‹ ํƒ€์ž…

Docs: ๋ฌธ์„œ ์ž‘์—…
Feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Fix: ๋ฒ„๊ทธ๋ฅผ ๊ณ ์นœ ๊ฒฝ์šฐ
Refactor: ๋ฆฌํŒฉํ† ๋ง
Comment: ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
Rename: ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช… ์ˆ˜์ •, ๊ฒฝ๋กœ ๋ณ€๊ฒฝ
Remove: ํŒŒ์ผ ํ˜น์€ ๊ธฐ๋Šฅ ์‚ญ์ œ
Test: ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ž‘์—…
Resolve conflicts: ์ถฉ๋Œ ๋ฐœ์ƒ commit์—์„œ ์‚ฌ์šฉ(๋ณธ๋ฌธ, ๊ผฌ๋ฆฌ๋ง ์ƒ๋žต)

๐Ÿšจ ๊ผฌ๋ฆฌ๋ง ํƒ€์ž…

Fixes: ์ด์Šˆ ์ˆ˜์ •์ค‘(์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)
Resolves: ์ด์Šˆ ํ•ด๊ฒฐํ–ˆ์„ ๋•Œ
Ref: ์ฐธ๊ณ ํ•  ์ด์Šˆ๊ฐ€ ์žˆ์„ ๋•Œ

โš ๏ธ Error

Error ๊ด€๋ฆฌ

โœ… ๋ชจ๋“  ์—๋Ÿฌ๋Š” Error Code๋กœ ๊ด€๋ฆฌ

  • Error Code๋งˆ๋‹ค httpStatus / errorCode / errorMessage ์ž‘์„ฑ
  • ErrorCode๋Š” httpStatus๋งˆ๋‹ค ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ธ๋‹ค("httpStatus_number") ex) "400_3", "404_4"

โœ… Error Code ๋ณด๊ธฐ


๐Ÿพ Branch Strategy

๋ธŒ๋ Œ์น˜ ๊ด€๋ฆฌ

โœ… ๊ฐœ์ธ๋ณ„ ๋ธŒ๋ Œ์น˜(gaeun, kyuwon, wonjae)์—์„œ ์ž‘์—…

  • push ์ „์— ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
  • ํŒ€์›์—๊ฒŒ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ ๊ณต์œ  ํ›„ main์— PR
  • ๊ฐœ์ธ๋ณ„ ๋ธŒ๋ Œ์น˜๋Š” main์„ pullํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์ตœ์‹ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ

โœ… NodeJS๋Š” ๋ณ„๋„์˜ Repository์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, main์— ๋ฐ”๋กœ push/pull

โœ… ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ณ„๋„๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ƒˆ๋กœ์šด ๋ธŒ๋ Œ์น˜์—์„œ ์ž‘์—… : ์ดํ›„ ๋ฐ˜์˜ ์‹œ main์œผ๋กœ PR ํ›„ Close
  • springRTC ๋ธŒ๋žœ์น˜๋Š” spring์„ ๊ธฐ๋ฐ˜์œผ๋กœ webRTC๋ฅผ ๊ตฌํ˜„ํ•จ.
  • ๋‹ค๋งŒ 1๋Œ€1 P2P์—ฐ๊ฒฐ์€ ์„ฑ๊ณตํ•˜์˜€์œผ๋‚˜ N:N ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•จ.
  • ์ดํ›„์— Spring์ด ์•„๋‹Œ Node.js์˜ socket.io๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋จ.
  • redis ๋ธŒ๋žœ์น˜๋Š” redis๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•ด๋ณด๋Š” ๋ธŒ๋žœ์น˜์ž„.
  • ํŒ€ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ์ œํ•œ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ ์šฉํ•˜์ง€ ๋ชปํ•˜์˜€์œผ๋‚˜ spring์œผ๋กœ redis์— Clue๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ์„ฑ๊ณตํ•จ.

์ด์Šˆ ๊ด€๋ฆฌ

โœ… ์ƒˆ๋กœ์šด Issue๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋จผ์ € GitHub Issues์— ์ƒ์„ฑ

  • bug, feature ์ค‘ ํ•ด๋‹น๋˜๋Š” Issue template ์‚ฌ์šฉ
  • issue ์ž‘์„ฑ ๋‚ด์šฉ ์ค‘ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๊ธ€์— comment๋‚˜ ๋ณ„๋„ ์ด์Šˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์—…๋ฐ์ดํŠธ

โœ… ์™„๋ฃŒ๋œ ์ด์Šˆ๋Š” commit Resolves ์‚ฌ์šฉํ•ด์„œ Close

โœ… ๊ด€๋ จ๋œ ์ด์Šˆ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ์—๋Š” Milestones๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ฆฌ

๐Ÿ“บ Detail

์•„ํ‚คํ…์ฒ˜

ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

ERD
API ๋ช…์„ธ์„œ

๐Ÿšจ API ์„ค๊ณ„๊ทœ์น™

Rest API URI ์„ค๊ณ„๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.
  1. ํ›„ํ–‰ /๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๊ณ„์ธต๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ex) /rooms/{roomId}/quizzes/{quizType}
  3. ๊ธด path๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  4. ์–ธ๋”๋ฐ”(_)๋Š” URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  5. URI๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  6. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  7. ๋ชจ๋“  resource๋Š” ๋ณต์ˆ˜ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”จ Trouble Shooting

๊ณตํ†ต

๋ฉ”์ธํŽ˜์ด์ง€ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฌธ์ œ

โœ… ๋ฌธ์ œ์ƒํ™ฉ

๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ๋ณ€๊ฒฝ๋œ ๋ฐฉ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ Room ๋ฆฌ์ŠคํŠธ ์กฐํšŒํ•˜๊ธฐ api๋ฅผ ์š”์ฒญ(Polling)

๋ฉ”์ธํŽ˜์ด์ง€์— ์ ‘์†์ž๊ฐ€ ์ง‘์ค‘๋˜๋ฉด ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ฆ๊ฐ€ โ†’ ๋ฐฐํฌ ์ดํ›„ ๋ฉ”์ธํŽ˜์ด์ง€ 40๋ช… ์ •๋„ ์ ‘์†ํ•˜๋ฉด์„œ CPU 90%๋กœ ๊ธ‰์ฆ

๐Ÿ“ ์„œ๋ฒ„๋ฅผ t3.micro์œผ๋กœ ๋ณ€๊ฒฝ(CPU 1 โ†’ 2)ํ•˜์—ฌ ์šฐ์„  ์กฐ์น˜(๋ฉ”๋ชจ๋ฆฌ๋Š” Swap์œผ๋กœ ๋Š˜๋ ค๋†“์€ 3G๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํŒ๋‹จ)


๐Ÿ” ํ…Œ์ŠคํŠธ

๋ฉ”์ธํŽ˜์ด์ง€ ์ ‘์†์ž ์ˆ˜์— ๋”ฐ๋ฅธ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ง„ํ–‰

Client์˜ ๋ฉ”์ธํŽ˜์ด์ง€ ์ ‘์†์ž ์ˆ˜๋ฅผ 10 ๋‹จ์œ„๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์‹ค์‹œ๊ฐ„ ๊ด€์ฐฐ

โ‘  CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰์ฆ โ‘ก ์ „์ฒด 200 ์ค‘ 180%๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š” ์ง€์ ์„ ํ•œ๊ณ„๋กœ ๋ด„

๐Ÿ“‘ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ : api ์š”์ฒญ ๊ฐ„๊ฒฉ์„ 2์ดˆ๋กœ ๋Š˜๋ฆฌ๋ฉด ํ˜„์žฌ๋ณด๋‹ค 30๋ช… ๋” ์ ‘์† ๊ฐ€๋Šฅ

- api ์š”์ฒญ ๊ฐ„๊ฒฉ 1์ดˆ(ํ˜„์žฌ ์ƒํƒœ) : 70๋ช…
- api ์š”์ฒญ ๊ฐ„๊ฒฉ 1.5์ดˆ : 80๋ช…
- api ์š”์ฒญ ๊ฐ„๊ฒฉ 2์ดˆ : 100๋ช…

๐Ÿ“ api ์š”์ฒญ ๊ฐ„๊ฒฉ์„ 1์ดˆ๋กœ ์œ ์ง€ํ•˜์ž!

ํ˜„์žฌ ์„œ๋น„์Šค ์ˆ˜์ค€์—์„œ 70๋ช… ์ด์ƒ์ด ๋ฉ”์ธํŽ˜์ด์ง€์— ์ ‘์†ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๊ณ ,

์—…๋ฐ์ดํŠธ ๊ฐ„๊ฒฉ์„ 2์ดˆ๋กœ ๋Š˜๋ฆฌ๋ฉด ์˜คํžˆ๋ ค ์œ ์ € ๊ฒฝํ—˜์ด ์•ˆ์ข‹์•„ ์งˆ๊ฑฐ๋ผ๊ณ  ํŒ๋‹จ

์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ•œ๋‹ค๋ฉด, Polling์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ!


๋ฐฑ์—”๋“œ

WebRTC ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฌธ์ œ

โœ… P2P(signalling server) vs MCU/SFU

โ“ 4๋ช…๊นŒ์ง€ ๋ณด์ด์Šค ์ฑ„ํŒ…์ด ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

---> โ• signalling server๋ฅผ ๊ตฌ์ถ•ํ•˜์ž!


๐Ÿ“‘ ์˜ค๋””์˜ค๋งŒ ์‚ฌ์šฉํ•˜๊ณ , 4๋ช…๊นŒ์ง€๋งŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— signalling server๋กœ๋„ client ๋ถ€๋‹ด์ด ํฌ์ง€ ์•Š์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , MCU, SFU๋Š” ํ”„๋กœ์ ํŠธ ๊ธฐํ•œ ๋‚ด์— ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.


โœ… Springboot vs NodeJS

โ“ ๋‹ค๋Œ€๋‹ค WebRTC๋ฅผ ์œ„ํ•œ signalling server๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€?

---> โ• NodeJS์˜ Socket.io๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ signalling server๋ฅผ ๊ตฌํ˜„ํ•˜์ž!


๐Ÿ“‘ Springboot๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜๊ณ , ํŒ€์›๋“ค ๋ชจ๋‘๊ฐ€ ์ต์ˆ™ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฐธ๊ณ ์ž๋ฃŒ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค.

๐Ÿ“‘ NodeJS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Socket.io ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‚˜,

์„œ๋ฒ„๋ฅผ 2๊ฐœ ๊ด€๋ฆฌํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๊ด€๋ฆฌ์— ๋น„์šฉ์ด ๋” ์†Œ๋ชจ๋˜๊ณ , ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ“‘ Springboot๋กœ signalling server๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๊ณ ,

์ œํ•œ๋œ ์‹œ๊ฐ„ ์•ˆ์— ์„œ๋น„์Šค์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” NodeJS์˜ Socket.io๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ!


์œ ์ € disconnect ์ฒ˜๋ฆฌ ๋ฌธ์ œ

โœ… ๋ฌธ์ œ์ƒํ™ฉ

๐Ÿ“‘ ์œ ์ €๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด socket.io์˜ disconnect ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ

๐Ÿ“‘ Client๋Š” ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ€๋ฉด ์ƒˆ๋กœ์šด ๋ฐฉ์žฅ์„ ์•Œ์•„์•ผํ•œ๋‹ค(๋ฐฉ์žฅ๋งŒ ๊ฒŒ์ž„ ์‹œ์ž‘ ๊ฐ€๋Šฅ!)

๐Ÿ“‘ DB์—์„œ๋Š” disconnect๋œ ์œ ์ € ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๋ฐฉ์žฅ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ ํ•„์š”


ํ•ด๊ฒฐ๋ฐฉ์•ˆ 1๏ธโƒฃ nodeJS โ†’ Client โ†’โ† Spring

๐Ÿ“‘ nodeJS์—์„œ disconnect์‹œ event๋ฅผ ํ†ตํ•ด disconnect๋œ ์œ ์ €์˜ socket.id๋ฅผ Client๋กœ ๋ณด๋ƒ„

๐Ÿ“‘ Client๋Š” Spring์œผ๋กœ HTTP ํ†ต์‹ ์„ ํ†ตํ•ด socket.id๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ๋ฐฉ์žฅ์ด ๋ฐ”๋€ ๊ฒฝ์šฐ return ๊ฐ’์„ ๋ฐ›์Œ

๐Ÿ“‘ ์œ ์ €๊ฐ€ 1๋ช… ๋‚จ์•˜๋Š”๋ฐ disconnect๊ฐ€ ๋˜๋ฉด Client๊ฐ€ ์—†์œผ๋ฏ€๋กœ nodeJS์—์„œ DB๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ƒ„

โš ๏ธ Client์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์—…๋ฐ์ดํŠธ/์‚ญ์ œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜์—ฌ ์—๋Ÿฌ ๋ฐœ์ƒ!!

---โ†’ โ• DB์— ํ•œ ๋ฒˆ๋งŒ ์š”์ฒญํ•˜์ž!


ํ•ด๊ฒฐ๋ฐฉ์•ˆ 2๏ธโƒฃ disconnect์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  DB์ฒ˜๋ฆฌ๋Š” nodeJS์—์„œ ์ฒ˜๋ฆฌ

๐Ÿ“‘ disconnect์‹œ DB์— ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ/์‚ญ์ œ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๋ฐฉ์žฅ์ด ๋ณ€๊ฒฝ๋˜๋ฉด event๋กœ ํ•ด๋‹น ๋ฐฉ Client์—๊ฒŒ ์•Œ๋ ค์คŒ


๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ค‘ ๋™์‹œ์„ฑ ์ œ์–ด ๋ฌธ์ œ

โœ… ๋ฌธ์ œ์ƒํ™ฉ

๐Ÿ“‘ ๊ฒŒ์ž„ ์ค‘ ๋งž์ถ˜ ๋ฌธ์ œ ์ˆ˜(์Šค์ฝ”์–ด), ์ฐฌ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฐฉ Client ๋ชจ๋‘์—๊ฒŒ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ์–ด์•ผ ํ•จ


โ• Socket.io์˜ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ ์Šค์ฝ”์–ด๋‚˜ ์ฐฌ์Šค ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ๋ฐฉ์— ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌ์‹ค ์•Œ๋ ค์ฃผ์ž!

๐Ÿ“‘ HTTP ํ†ต์‹ ์—์„œ๋Š” Client ์š”์ฒญ ์—†์ด Server๊ฐ€ Response ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ socket ํ†ต์‹ ์„ ์ด์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ!

๐Ÿ“‘ ํ€ด์ฆˆ๋ฅผ ๋™์‹œ์— ๋ณด๊ณ  ์žˆ์„ ๋•Œ๋„ ํ•œ ๋ช…์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฏธ ํ‘ผ ๋ฌธ์ œ๋กœ ๋ณ€๊ฒฝ


CI/CD ์ ์šฉ

โœ… ๋ฌธ์ œ์ƒํ™ฉ

๐Ÿ“‘ ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ํ•ฉ์นœ ์ดํ›„ ์˜ˆ๊ธฐ์น˜ ๋ชปํ–ˆ๋˜ ๋งŽ์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ

๐Ÿ“‘ ์žฆ์€ ์—๋Ÿฌ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ์ˆ˜๋™ ๋ฐฐํฌ์— ๋“œ๋Š” ์‹œ๊ฐ„ ์†Œ๋ชจ๊ฐ€ ์ ์  ๋งŽ์•„์ ธ ์‹œ๊ฐ„ ์ ˆ์•ฝ์„ ์œ„ํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™” ํ•„์š”


โœ… Travis vs Github Actions

๐Ÿ“‘ Travis๋ฅผ ๋” ๋งŽ์ด ์“ฐ๊ณ  ๋ธ”๋กœ๊ทธ ์ž๋ฃŒ๋„ ๋งŽ์•˜์ง€๋งŒ ๋”ฐ๋กœ ์„œ๋ฒ„ ์„ค์น˜๋ฅผ ํ•ด์•ผํ•จ

๐Ÿ“‘ Github Actions๋Š” ๋ณ„๋„์˜ ์„œ๋ฒ„ ์„ค์น˜์—†์ด Github์„ ํ†ตํ•ด ๋ฐ”๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•จ

๐Ÿ“‘ ๊ธฐ๊ฐ„์ด ํ•œ์ •๋˜์–ด ์žˆ์–ด์„œ ๋ฐฐํฌ ์ž๋™ํ™” ๊ตฌ์ถ•์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์Ÿ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค


โœ… Github Actions๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ 

๐Ÿ“‘ Travis๋ฅผ ์‚ฌ์šฉํ•  ๋งŒํผ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š๊ณ  ์„œ๋ฒ„ ์„ค์น˜์— ๋Œ€ํ•œ ์‹œ๊ฐ„์ œ์•ฝ, ๊ทธ๋ฆฌ๊ณ  Github์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๋งˆ์Œ์ด ์žˆ์–ด์„œ Github Actions๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ ์šฉ

โœ… ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋„์ž…ํ•œ ์ด์œ !

๐Ÿ“‘ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ๋„์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋“ค์ด ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์–ด ์ฐจํ›„์— ๋ฌธ์ œ ํŒŒ์•… ์–ด๋ ค์›€์ด ์กด์žฌ.

---> ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์ „ ๊ฒ€์ฆ์˜ ํ•„์š”์„ฑ ์กด์žฌ.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ฝ”๋“œ ์ž‘์„ฑ์‹œ์— ๊ณ ๋ คํ•˜์ง€ ๋ชปํ–ˆ๋˜ case์— ๋Œ€ํ•œ ํ™•์ธ๊ณผ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅ.

๋ฆฌํŒฉํ† ๋ง์‹œ์— ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆ ๊ฐ€๋Šฅ.


โœ… ๋ฌธ์ œ์ƒํ™ฉ

๐Ÿ“‘ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(QuizServiceTimeTest)์—์„œ ClueRepository์™€ QuizRepository๋ฅผ @Mock์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ.

๐Ÿ“‘ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ DI ๋ฐฉ๋ฒ•์œผ๋กœ @RequiredArgsConstructor๋ฅผ ํ†ตํ•œ ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์ด ์ ์šฉ ์•ˆ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ.


โœ… ๋ฌธ์ œ ์›์ธ

๐Ÿ“‘ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์‹œ์— ์‹ค์ œ Quizservice์— ์กด์žฌํ•˜๋Š” quizRepository.save(roomId)๊ณผ clueRepository.findAllByRoomId(room.getId())๋•Œ๋ฌธ.

@Mock์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด when().thenReturn()๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ํ…Œ์ŠคํŠธ์‹œ ์ •ํ™•ํ•œ RoomId๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ.

---> when().thenReturn() ๋ฉ”์„œ๋“œ ์ž‘๋™ ์•ˆํ•จ.

๐Ÿ“‘ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ DI ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹(@RequiredArgsConstructor)์•ˆ๋˜๋Š” ์ด์œ ๋Š” difference in autowire handling between Spring and Spring integration with JUnit๋•Œ๋ฌธ.

์ฆ‰, JUNIT5๊ฐ€ DI๋ฅผ ์Šค์Šค๋กœ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๋‚˜ lombok ๋ฐฉ์‹์œผ๋กœ DI๊ฐ€ ๋˜์งˆ ์•Š์Œ.


โœ… ํ•ด๊ฒฐ๋ฐฉ์•ˆ

๐Ÿ“‘ ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ ๋”ฐ๋ผ์„œ @Spy๋ฅผ ํ†ตํ•ด์„œ Stubbing ํ•˜์ง€ ์•Š์€ ์‹ค์ œ ๊ฐ์ฒด๋“ค์„ @InjectMocks๋ฅผ ํ†ตํ•ด์„œ quizService์— ์ฃผ์ž…์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ.

--->๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ ์ด ํ€ด์ฆˆ ์ƒ์„ฑ ์‹œ๊ฐ„ ์ธก์ •์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Mock์ด ์•„๋‹Œ ์‹ค์ œ ๊ฐ์ฒด๋“ค๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋” ๋‚ซ๋‹ค ํŒ๋‹จ(์‹ค์ œ๋กœ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ธก์ • ๊ฐ€๋Šฅ).

๐Ÿ“‘ ํ†ตํ•ฉํ…Œ์ŠคํŠธ์—์„œ DI ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹๋ง๊ณ  @Autowired ๋ฐฉ์‹ ์„ ํƒ.


Quiz ๋žœ๋ค ๋ฌธ์ œ

โœ… ์š”๊ตฌ์‚ฌํ•ญ

๐Ÿ“‘ ๊ฒŒ์ž„์„ฑ์„ ์œ„ํ•ด ๋™์ผํ•œ Quiz๋ผ๋„ Quiz์˜ ๋‹ต์ด ๋žœ๋ค์œผ๋กœ ์ •ํ•ด์ง€๊ฒŒ ํ•˜์ž!

๐Ÿ“‘ ๊ทธ๋ ‡์ง€๋งŒ ํ•ด๋‹น ๋ฐฉ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ณด์—ฌ์•ผ ํ•จ


โœ… ๋ฌธ์ œ์ƒํ™ฉ

๐Ÿ“‘ ๋ฐฉ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ Quiz๊ฐ€ ๊ตฌ์„ฑ๋˜๋„๋ก ํ€ด์ฆˆ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— Random์„ ํฌํ•จํ•˜๋ฉด์„œ, Quiz ์กฐํšŒ API๊ฐ€ ์š”์ฒญ๋  ๋•Œ๋งˆ๋‹ค Quiz๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ โ†’ Quiz ํด๋ฆญ ์‹œ ๋งค๋ฒˆ Quiz๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

โ• ๋ฐฉ๋งˆ๋‹ค ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด๋ ค๋ฉด DB์— ์ €์žฅ ํ•„์š”!!


โœ… ํ•ด๊ฒฐ๋ฐฉ์•ˆ

๐Ÿ“‘ ๋ฐฉ ์•ˆ์—์„œ๋งŒ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋ฐฉ ๋งˆ๋‹ค ์ƒ์„ฑ๋œ Quiz๋ฅผ DB์— ์ €์žฅ

๐Ÿ“‘ Quiz๋ฅผ ์ƒ์„ฑํ•˜๋Š” API๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์€ ๋ฐฉ ๊ฐœ์„ค์ด ์•„๋‹Œ ๊ฒŒ์ž„ ์‹œ์ž‘ ์ดํ›„๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ

: ๋ฐฉ ๊ฐœ์„ค ๋•Œ Quiz ์ƒ์„ฑํ•˜๋ฉด ๋ฐฉ๋งŒ ๋งŒ๋“ค๊ณ  ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ํ•„์š”

๐Ÿ“‘ ๋ฐฉ์˜ ์œ ์ € ์ค‘ ํ•œ ๋ช…์ด Quiz ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ DB์— ํ•ด๋‹น Quiz๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ, ์žˆ์œผ๋ฉด ์กฐํšŒํ•˜๋„๋ก ๊ตฌํ˜„

: ์ด๋ฏธ ๊ฒŒ์ž„ ์‹œ์ž‘ ๋•Œ API๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์–ด์„œ ์š”์ฒญ์„ ๋ถ„์‚ฐ์‹œํ‚ค๊ธฐ ์œ„ํ•จ



๐Ÿ“‹ Review

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ ์•„์‰ฌ์›€์ด ๋‚จ์•˜๋˜ ๋ถ€๋ถ„๋“ค์„ ๊ธฐ๋กํ•œ๋‹ค. ํšŒ๊ณ ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ์ž˜ํ•˜์ž!

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

๐Ÿ“ข User Test

์˜ค๋ฅ˜์ œ๋ณด ์‚ฌ๋ก€

โš ๏ธ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ค‘ ๋งž์ถ˜ ๋ฌธ์ œ ์ˆ˜๋‚˜ ๋‚จ์€ ์ฐฌ์Šค ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ์ œ๋ณด

NodeJS์˜ undefined ์—๋Ÿฌ๋กœ ์ธํ•ด ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด์„œ ๊ฐ ๋ธŒ๋ผ์šฐ์ €์˜ roomID ์ดˆ๊ธฐํ™”

socket.io์˜ ๋ฐฉ ๊ตฌ๋ถ„ ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

๐Ÿ“ NodeJS์˜ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š๋„๋ก ์กฐ์น˜

๊ฐœ์„ ์‚ฌํ•ญ ์‚ฌ๋ก€

โœ๏ธ "๋งˆ์ดํฌ๋ฅผ ์ฐจ๋‹จํ–ˆ์„ ๋•Œ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ ํ˜€ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค."

๋ธŒ๋ผ์šฐ์ €์˜ ๋งˆ์ดํฌ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์ œํ•œํ•˜๋ฉด ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ๋ถˆ๊ฐ€

๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ๊ถŒํ•œ ํ—ˆ์šฉ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ์ฐฝ์„ ๋„์›Œ ๋‹ค์‹œ ์„œ๋น„์Šค ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋‚ด


๐Ÿ”ง Fight

ban wonjae

1๏ธโƒฃ Trouble Shooting์—์„œ ์œ ์ € disconnect ํ•ด๊ฒฐ๋ฐฉ์•ˆ 1๊ณผ ๊ด€๋ จ๋œ ์‚ฝ์งˆ

๐Ÿ“‘ ์ฒ˜์Œ์— node.js๋Š” ๋ณด์ด์Šค ์ฑ„ํŒ…๋งŒ ๋‹ค๋ฃจ๊ณ  ๋‚˜๋จธ์ง€ ์—ญํ• ์€ spring์—์„œ ๋‹ด๋‹นํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ์Œ  
-> ์Šคํ”„๋ง์—์„œ ํ•œ ๋ฐฉ์˜ ์ธ์›๋“ค์ด ์ „๋ถ€ ๋กœ๋”ฉ์ด ๋‹ค ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌ.

๐Ÿ“‘ ํด๋ผ์ด์–ธํŠธ๋“ค์ด ๊ฐ์ž ๊ฒŒ์ž„ ๋กœ๋”ฉ์ด ๋‹ค ์™„๋ฃŒ๋˜๋ฉด spring์— request๋ฅผ ๋ณด๋ƒ„  
->spring์—์„œ๋Š” request๊ฐ€ ์˜ฌ๋•Œ๋งˆ๋‹ค count๋ฅผ ์„ธ์„œ count๊ฐ€ ํ˜„์žฌ ํ•œ ๋ฐฉ์˜ ์ธ์›๋“ค์˜ ์ˆซ์ž์™€ ๊ฐ™์•„์ง€๋ฉด ๊ฒŒ์ž„์„ ์‹œ์ž‘.

๐Ÿ“‘ ์—ฌ๊ธฐ์„œ ๋กœ๋”ฉ์ค‘์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๊ฐ€๋ฉด ๋ฌดํ•œ๋Œ€๊ธฐํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ.  
์™œ๋ƒํ•˜๋ฉด ๋‚˜๊ฐ„ ์‚ฌ๋žŒ์€ ์˜์›ํžˆ spring์— ๋กœ๋”ฉ์ด ๋‹ค ๋˜์—ˆ๋‹ค๋Š” request๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

๐Ÿ“‘ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹น์‹œ ๋…ธ๋“œ socket์—์„œ ์œ ์ € disconnect๊ฐ€ ๋ฐœ์ƒ  
-> ์Šคํ”„๋ง์—์„œ 1. ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ„ ๊ฒฝ์šฐ: ์ƒˆ๋กœ์šด ๋ฐฉ์žฅ userId response.	2. ์ผ๋ฐ˜์ธ์ด ๋‚˜๊ฐ„ ๊ฒฝ์šฐ: null response.
-> ๊ทธ๋ฆฌ๊ณ  ๋‚˜๊ฐ„ ์œ ์ €์˜ ์ •๋ณด DB์—์„œ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง ์‹คํ–‰.

๐Ÿ“‘ spring์—์„œ ๊ฒŒ์ž„ ๋กœ๋”ฉ ์ฒดํฌ  
-> 1. false response 2. ๋งˆ์ง€๋ง‰ ์ธ์›ํ•œํ…Œ๋Š” true response.

๐Ÿ“‘ ๋ฌธ์ œ๋Š” ์œ„์˜ ๋กœ์ง๋“ค์ด ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ  
-> ๊ฒŒ์ž„ ๋กœ๋”ฉ์ค‘์— ๋ฐฉ์žฅ์ด disconnect๊ฐ€ ๋œ๋‹ค๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ฐฉ์žฅ userId,   
๊ฒŒ์ž„ ๋ฌดํ•œ ๋Œ€๊ธฐ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ ์ธ์›๊นŒ์ง€ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” true๊ฐ’๋„ ๋ณด๋‚ด์ค˜์•ผํ•จ.

๐Ÿ“‘ ๋”ฐ๋ผ์„œ disconnect์‹œ responsedto์™€ ๊ฒŒ์ž„ ๋กœ๋”ฉ์ฒดํฌ responsedto๋Š” ๊ฐ™์•„์•ผํ•จ.  
์ฆ‰, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๊ฐ„๋‹ค๋ฉด userID๋งŒ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ userId์™€ true, false๊ฐ’์„ ๊ฐ™์ด ๋ณด๋‚ด์คŒ,  
๋ฐ˜๋Œ€๋กœ ๊ฒŒ์ž„ ๋กœ๋”ฉ์ค‘์—๋„ true, false๋ฟ๋งŒ ์•„๋‹ˆ๋ผ userId๊นŒ์ง€ ๋ณด๋‚ด์คŒ.

๐Ÿ“‘ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ”„๋ก ํŠธ์ชฝ์—์„œ true ๋˜๋Š” false๊ฐ’๋„ ๋ฐ›๋Š”๊ฒŒ ๊ฐ€๋Šฅ  
-> ๋ฌดํ•œ๋Œ€๊ธฐํ˜„์ƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค ์ƒ๊ฐํ•จ.

๐Ÿ“‘ ์ฆ‰, ์ƒํ™ฉ์— ๋”ฐ๋ผ 1. ๊ฒŒ์ž„๋กœ๋”ฉ X, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๊ฐ -> 1. ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ„๊ฒฝ์šฐ: {"userId" : "์ƒˆ๋กœ์šด ID", "check": null}  
2. ์ผ๋ฐ˜์ธ์ด ๋‚˜๊ฐ„๊ฒฝ์šฐ: {"userId": null, "check":   null}

๐Ÿ“‘ 2. ๊ฒŒ์ž„๋กœ๋”ฉ O, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๊ฐ -> 1. ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ”๊ณ  ๋‚˜๋จธ์ง€ ์ธ์› ์ „๋ถ€ ๋กœ๋”ฉ ์™„๋ฃŒ:{"userId": "์ƒˆ๋กœ์šดID", "check": "true"},  
2. ๋ฐฉ์žฅ์ด ๋‚˜๊ฐ”์ง€๋งŒ ๋‚˜๋จธ์ง€ ์ธ์›์ด ์ „๋ถ€ ๋กœ๋”ฉ X:  {"userId": "์ƒˆ๋กœ์šดID", "check":null},  
3. ์ผ๋ฐ˜์ธ์ด ๋‚˜๊ฐ”๋Š”๋ฐ ๋‚˜๋จธ์ง€ ์ „๋ถ€ ๋กœ๋”ฉ: {"userId" : null, "check": "true"},  
4. ์ผ๋ฐ˜์ธ์ด ๋‚˜๊ฐ”๋Š”๋ฐ ๋‚˜๋จธ์ง€ ์ „๋ถ€ ๋กœ๋”ฉX: {"userId" :   null, "check": "null"}

๐Ÿ“‘ 3. ์ผ๋ฐ˜์ ์ธ ๊ฒŒ์ž„ ๋กœ๋”ฉ  
--> 1. {"userId": null, "check": null} ... 2. ์ œ์ผ ๋งˆ์ง€๋ง‰ ์ธ์› ๋กœ๋”ฉ: {"userId": null, "check":"true"}๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•จ. 

๐Ÿ“‘ ํ•˜์ง€๋งŒ disconnect๊ฐ€ ๋ฐœ์ƒ -> ๋ฐฉ ์ „์ฒด ์ธ์›๋“ค์ด Spring์œผ๋กœ request๋ฅผ ๋ณด๋ƒ„  
-> disconnect ์œ ์ €๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฐฉ์žฅ์„ ๋งŒ๋“œ๋Š” ๋กœ์ง์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ์กด์žฌ.

๐Ÿ“‘ ๊ฒฐ๋ก ์ ์œผ๋กœ node์—์„œ socket disconnect์‹œ์— DB์—์„œ ์œ ์ € ํ•œ๋ฒˆ๋งŒ ์‚ญ์ œํ•˜๊ณ  ๋ฐฉ์žฅ ๋ณ€๊ฒฝ๊นŒ์ง€ ์ฒ˜๋ฆฌ.
    ๊ฒŒ์ž„ ๋กœ๋”ฉ๋„ node์—์„œ ์ง„ํ–‰.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •