๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/HandTris

[HandTris] #6. Failed to send message to ExecutorSubscribableChannel[clientInboundChannel] - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

seungineer = seungwoo + engineer 2024. 7. 8. 03:52

message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]

๐Ÿ˜‡ ๊ฒฐ๋ก 

์ œ๋ชฉ์˜ ์—๋Ÿฌ๋Š” ์„œ๋ฒ„์˜ Interceptor์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์—๋Ÿฌ์ด๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ '๊ฐ™์€ token์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž ๊ฐ„ socket ํ†ต์‹ ์„ ํ•˜๊ณ ์ž' ํ•˜์—ฌ Interceptor์—์„œ throwerrorํ•œ ์ผ€์ด์Šค์˜€๋‹ค. ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ STOMP Message๋ฅผ Publishํ•˜์˜€์œผ๋‚˜ ๋ณธ์ธ์„ ์ œ์™ธํ•œ Subscriber๊ฐ€ ์—†์—ˆ๊ธฐ์— ์„œ๋ฒ„์˜ Interceptor์—์„œ error๋กœ throw๋œ ๊ฒƒ์ด๋‹ค. ์†Œ์ผ“ ํ†ต์‹  ์ค‘ ์œ„ ์—๋Ÿฌ๋ฅผ ๊ฒช๋Š”๋‹ค๋ฉด ์„œ๋ฒ„ Interceptor์—์„œ ์ฒดํฌํ•˜๋Š” ๋ฌด์–ธ๊ฐ€(!)๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์„œ๋ฒ„ ๋กœ์ง

์„œ๋ฒ„์—์„œ๋Š” STOMP ๋ฉ”์‹œ์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Publishingํ•˜๋ฉด ๋ฉ”์‹œ์ง€ ํ—ค๋”์˜ token์„ ํ†ตํ•ด ์–ด๋–ค ์œ ์ €๊ฐ€ ๋ณด๋ƒˆ๋Š”์ง€ ์‹๋ณ„ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์‹๋ณ„ํ•œ ํ›„์— Publisher ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  Subscriber๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์–ด๋–ค Subscriber๋„ ์—†๋Š” ๊ฒฝ์šฐ .orElseThrow() ํ•จ์ˆ˜๋กœ Exception๋ฐœ์ƒํ•œ๋‹ค.

...
private GameMemberEssentialDTO findOtherUser(Set<GameMemberEssentialDTO> cachedUser, String nickname) {
        return cachedUser.stream()
                .filter(dto -> !dto.nickname().equals(nickname))
                .findFirst()
                .orElseThrow(MemberNotFoundException::new);
    }

...

    if (destinationUrl.equals("/app/" + roomCode + "/tetris")) {
                // Sender๊ฐ€ ์•„๋‹Œ ์œ ์ € ์ฐพ๊ธฐ
                GameMemberEssentialDTO otherUser = findOtherUser(cachedUser, nickname);
                accessor.setHeader("otherUser", otherUser.nickname());
        }
...

GameMemberEssentialDTO๋ฅผ ๋ณด๋ฉด, nickname์ด ๊ฐ™์€ ๊ฒฝ์šฐ .filter() ํ•˜์—ฌ ๊ฑฐ๋ฅธ ํ›„์— .findFirst()๋กœ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” Subscriber๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค. ๋ชป ์ฐพ์œผ๋ฉด .orElseThrow()๋กœ Exception ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋งค์šฐ ๋งค์šฐ ์ž๋ช…ํ•œ ์—๋Ÿฌ์ด์ง€๋งŒ, ์ด ์—๋Ÿฌ์˜ ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ํŒŒํŠธ์—์„œ Interceptor๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ ์ฃผ์†Œ์— UUID๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ์ž‘์—…์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์กŒ๊ณ , ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ์—์„œ๋„ ์ด API์— ๋งž์ถฐ ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณ€์ธ์ด ๋งŽ์œผ๋‹ˆ ์–ด๋–ค ๊ฒŒ ๋ฌธ์ œ์ผ์ง€ ๊ฐ์ด ์•ˆ ์™”๋‹ค.

๐Ÿ› ๋ฒ„๊ทธ์˜ ์›์ธ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •

0. ์ž˜ ๋˜๋˜ ์†Œ์ผ“ ํ†ต์‹ !

๊ธฐ์กด์˜ STOMP ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด Publishing, Subcribing ํ•˜๋Š” ์ฃผ์†Œ์—๋Š” {roomCode}์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ์—†์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ '/user/queue/tetris'์™€ ๊ฐ™์ด ์„ค์ •๋˜์–ด ์žˆ์—ˆ๋‹ค. ์ด์— ๋‹ค๋ฅธ ๋ฐฉ์—์„œ ํ”Œ๋ ˆ์ดํ•˜๊ณ  ์žˆ๋”๋ผ๋„ Publishing ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ค‘๊ฐ„๋ฐœํ‘œ๋ฅผ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋˜ ๊ฒƒ์œผ๋กœ, ๋ฐฉ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ Pub, Sub ๋˜๋„๋ก ์ˆ˜์ • ์ž‘์—…์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด์—ˆ๋‹ค.

  • Interceptor๊ฐ€ ์—†์Œ
  • Pub, Sub ์ฃผ์†Œ์— {roomCode}๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Œ
  • arc ๋ธŒ๋ผ์šฐ์ € ์Šคํ”Œ๋ฆฟ ๋ทฐ๋กœ ํ…Œ์ŠคํŠธ ์ค‘ ์ •์ƒ ์ž‘๋™

1. ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ ์ƒํ™ฉ

๋ฐฉ๋ณ„๋กœ Pub, Sub ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฐฑ์—”๋“œ ๋‹จ์—์„œ๋Š” ์ด ์‹œ์ ๋ถ€ํ„ฐ Interceptor๋ฅผ ๋„์ž…ํ•˜์˜€๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๋‹จ์—์„œ๋Š” ์ด ์‹œ์ ๋ถ€ํ„ฐ Server์—๊ฒŒ ๋ฐ›์€ UUID๋ฅผ ํด๋ผ์ด์–ธํŠธ session storage์— ์ €์žฅํ•˜์—ฌ STOMP ๊ตฌ๋… ์ฃผ์†Œ์— {roomCode}๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

์ด๋ ‡๊ฒŒ ์„ธํŒ…์„ ๋งˆ์นœ ํ›„์— ์„œ๋ฒ„ ํ†ต์‹  ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ 'Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]'๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  • Interceptor๊ฐ€ ์žˆ์Œ
  • Pub, Sub ์ฃผ์†Œ์— {roomCode}๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Œ
  • arc ๋ธŒ๋ผ์šฐ์ € ์Šคํ”Œ๋ฆฟ ๋ทฐ๋กœ ํ…Œ์ŠคํŠธ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ

2. ์—”๋“œํฌ์ธํŠธ, ๋ฉ”์‹œ์ง€ ํ˜•์‹ ๋“ฑ ์žฌํ™•์ธ

๋ฐฑ์—”๋“œ ํŒŒํŠธ์—์„œ๋Š” Interceptor, Pub, Sub ์ฃผ์†Œ ๋“ฑ์„, ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ์—์„œ๋Š” roomCode, Pub, Sub ์ฃผ์†Œ ๋“ฑ์„ ๋‹ค์‹œ ์žฌํ™•์ธํ–ˆ๋‹ค. ์ด๋•Œ๊นŒ์ง€๋งŒ ํ•ด๋„ token์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํ”Œ๋ฆฟ ๋ทฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ์ฐฝ์—์„œ ๋”ฐ๋กœ ๋กœ๊ทธ์ธ์„ ํ–ˆ๊ธฐ์— token ๊ฐ’์ด ๋‹ค๋ฅผ ๊ฒƒ์ด๋ผ ์ถ”์ธกํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. ๋ฐฑ์—”๋“œ ํŒŒํŠธ์™€ ํ•จ๊ป˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ†ต์ œํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ๐Ÿค”

AS-IS TO-BE
- ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ + ๋ฐฐํฌ ์„œ๋ฒ„
- ๋ฐฑ์—”๋“œ ํด๋ผ์ด์–ธํŠธ + ๋กœ์ปฌ ์„œ๋ฒ„
- ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ + ๋ฐฐํฌ ์„œ๋ฒ„
- ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ + ๋กœ์ปฌ ์„œ๋ฒ„

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

4. ์•„ํฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์˜์‹ฌ

์ถœ์ฒ˜: Arc

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

5. ๋ธŒ๋ผ์šฐ์ €๋ณ„ Stomp Header๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ์— ์˜ํ•œ ์ฐจ์ด?

ChatGPT

์•„ํฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋กœ ํ† ํฐ์— ์˜ํ•œ ๊ฒƒ์ด๋ผ๋Š” ํŒ๋‹จ์ด ๋ฐ”๋กœ ์„œ์ง€ ์•Š์•˜๋‹ค. ์ฒ˜์Œ์—๋Š” Socket ํ†ต์‹  ์‹œ ํ—ค๋”๋ฅผ ํŒŒ์‹ฑ ํ•˜์—ฌ Server๋กœ ๋ณด๋‚ผ ๋•Œ ํŒŒ์‹ฑ ์‹œ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ฐฉ์‹๊ณผ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ธ ์ค„ ์•Œ์•˜๋‹ค. ChatGPT์— ๋ฌผ์–ด๋ดค์„ ๋•Œ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

6. Fiddler

๊ตฌ์ฒด์ ์œผ๋กœ ์•„ํฌ์™€ ํฌ๋กฌ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์‚ฌ์ด์ฆˆ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด์ „์— ์„ค์น˜ํ•ด๋’€๋˜ Fiddler๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. Fiddler์—์„œ Proxy ๋ชจ๋“œ๋กœ Server๋กœ ๋ณด๋‚ด๋Š” ๋ชจ๋“  ํŒจํ‚ท์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™•์ธ ๊ฒฐ๊ณผ, Message Pack์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์—ˆ๋‹ค. Fiddler์—์„œ ์ƒˆ๋กœ์šด ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฏธ์ง€ ์šฐ์ธก๊ณผ ๊ฐ™์ด arc ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ†ต์‹ ํ•œ ๊ฒฐ๊ณผ์—๋Š” 'Reason: ProtocolError (03-EA)' ์—๋Ÿฌ๋ฅผ Client๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

7. ์ธํ„ฐ์…‰ํ„ฐ

๋ฐฑ์—”๋“œ ํŒŒํŠธ์— ์ด๋ฅผ ๊ณต์œ ํ•˜์ž, Interceptor์—์„œ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ์‹ฌ์ง€์–ด Interceptor๋Š” { roomCode }๋ฅผ ์ฃผ์†Œ์— ์‚ฌ์šฉํ•˜๋ฉฐ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๊ธฐ์— ์œ ๋ ฅ ํ›„๋ณด์˜€๋‹ค. ์—ฌ๋Ÿฌ .throwError() ๋ฉ”์จ๋“œ ์ค‘ token์„ ํ™œ์šฉํ•˜์—ฌ nickname์„ ์ฐพ์•„๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ '์„ค๋งˆ ๊ฐ™์€ ํ”Œ๋ ˆ์ด์–ด๋กœ ์ธ์‹ํ–ˆ๋Š”๊ฐ€?' ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์ด๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„ํฌ ๋ธŒ๋ผ์šฐ์ €์˜ ์Šคํ”Œ๋ฆฟ ๋ทฐ ์ƒํƒœ์—์„œ ๊ฐ๊ฐ์˜ ์ฐฝ์—์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  token ๊ฐ’์„ ํ™•์ธํ•˜์˜€๋‹ค.

์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋™์ผํ•œ token์ด ๋‹ด๊ฒจ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

๊ฒฐ๊ณผ๋Š” ์ •๋‹ต์ด์—ˆ๋‹ค. Arc ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œํฌ๋ฆฟ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ผœ์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ ๋‹ค๋ฅธ token ๊ฐ’์ด ์ €์žฅ๋˜๋ฉฐ ์ •์ƒ์ ์œผ๋กœ ์†Œ์ผ“ ํ†ต์‹ ์ด ๋˜์—ˆ๋‹ค. ์• ๊ฟŽ์€ Arc ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํƒ“ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. Token์ด ๊ฐ™์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์˜€๋Š”๋ฐ.. ๐Ÿ˜… ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ์ค‘๋ณต ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

8. ๋งˆ๋ฌด๋ฆฌ

๊ธธ๊ณ  ๊ธด ์˜์‹ฌ๊ณผ ๊ฒ€์ฆ์„ ๋์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฐ€์„ค์„ ์„ธ์šฐ๊ณ , ์ด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋˜ ๋ฐœ๊ฒฌํ•œ ์‚ฌ์‹ค์—์„œ ๊ฐ€์„ค์„ ์„ธ์šฐ๊ณ , ๋ฐ˜๋ณต.. ์ด๋Ÿฐ ๊ณผ์ • ์†์—์„œ ๋งŽ์ด ์ฐพ์•„๋ณด๊ณ , ๋ฐฐ์šฐ๊ณ , ๊นจ๋‹ซ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

'๐Ÿงญ KAIST JUNGLE > HandTris' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[HandTris] #8. WebSocket์ด ์ค‘๋ณต ์—ฐ๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿค” - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (4) 2024.07.23
[HandTris] #7. ์ƒ๋Œ€ ํ™”๋ฉด์— ๋ธ”๋Ÿญ ์ž”์ƒ์ด ๋‚จ๋Š” ์ด์Šˆ ํ•ด๊ฒฐ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.07.12
[HandTris] #5. .env ์ ์šฉ์ด ์•ˆ ๋  ๋•Œ.. - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.07.04
[HandTris] #4. ์›น์บ  ํ™”๋ฉด์„ ๊ฐ€๋ ค ๋ณด์ž - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.06.30
[HandTris] #3. TypeError: Cannot read properties of undefined - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.06.24