Skip to content

Do1K/brAIn

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๐Ÿง  brAIn

๐Ÿ’ก ๊ฐœ์š”

ํ•ญ๋ชฉ ๋‚ด์šฉ
๐Ÿ•’ ๊ธฐ๊ฐ„ 2024-07 ~ 2024-08
๐Ÿ‘ฅ ์ธ์› 6๋ช…
๐Ÿ›  ์‚ฌ์šฉ ๊ธฐ์ˆ 
๐ŸŽฏ ๋‹ด๋‹น ์—ญํ•  1) WebSocket, STOMP, RabbitMQ๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๊ตฌ์ถ• (๋ฐฑ์—”๋“œ)
๐Ÿ“– ๊ฐœ์š” AI์™€ ํ•จ๊ป˜ํ•˜๋Š” ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ ํšŒ์˜ ์„œ๋น„์Šค

โœ๐Ÿป ๊ธฐํš ๋ฐฐ๊ฒฝ:

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

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

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด AI๋ฅผ ํšŒ์˜์— ์ง์ ‘ ์ฐธ์—ฌ์‹œํ‚ค๊ณ , ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๋…ผ์˜๋ฅผ ์ด‰์ง„ํ•˜๋Š” ์—ญํ• ์„ ๋งก๊ธฐ๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. AI๊ฐ€ ํŒ€์˜ ์ผ์›์œผ๋กœ์„œ ์‹ค์‹œ๊ฐ„ ํ˜‘์—…์„ ๊ฐ•ํ™”ํ•จ์œผ๋กœ์จ, ํšŒ์˜์˜ ์ง‘์ค‘๋„์™€ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ์ฐธ์—ฌ์ž๋“ค์ด ์ž์œ ๋กญ๊ณ  ํŽธ์•ˆํ•˜๊ฒŒ ์•„์ด๋””์–ด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์กฐ์„ฑํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“› ์„œ๋น„์Šค๋ช… : brAIn

๐Ÿ… ๋ชฉํ‘œ:

  • ์ฐฝ์˜์ ์ธ ์•„์ด๋””์–ด ๋„์ถœ: ๋ผ์šด๋“œ ๋กœ๋นˆ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ ๊ณจ๊ณ ๋ฃจ ์˜๊ฒฌ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฅ๋ คํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋” ์ฐฝ์˜์ ์ด๊ณ  ๋‹ค์–‘ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค.

  • AI์™€ ์ธ๊ฐ„์˜ ํ˜‘์—… ๊ฐ•ํ™”: AI๊ฐ€ ํšŒ์˜์˜ ์ผ์›์œผ๋กœ์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋…ผ์˜์˜ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ธ๊ฐ„ ์ฐธ์—ฌ์ž๋“ค๊ณผ์˜ ํ˜‘์—…์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ํšจ์œจ์ ์ธ ํšŒ์˜ ์šด์˜: AI์™€ ๋ผ์šด๋“œ ๋กœ๋นˆ ๊ธฐ๋ฒ•์˜ ๊ฒฐํ•ฉ์œผ๋กœ ํšŒ์˜๊ฐ€ ์ค‘๋‹จ ์—†์ด ํšจ์œจ์ ์œผ๋กœ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์ฐธ์—ฌ์ž์˜ ์ง‘์ค‘๋ ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋ณด๋‹ค ๋งŽ์€ ์ฐฝ์˜์  ์•„์ด๋””์–ด๋ฅผ ์ด๋Œ์–ด๋‚ด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.


โญ ๋ฉค๋ฒ„

ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฑ์—”๋“œ ๋ฐฑ์—”๋“œ ๋ฐฑ์—”๋“œ & ์ธํ”„๋ผ ๋ฐฑ์—”๋“œ & AI
๊น€์ƒ์ˆ˜ ์ฐจ๋ฏผํ˜ ๊น€ํ˜ธ์ค€ ๊ฐ•๋„์› ์ •๊ฒฝ์› ๋ฐ•๋ณ‘์ค€

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

์ต๋ช…์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ํšŒ์˜ ์ง„ํ–‰

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

์‹ค์‹œ๊ฐ„ ๊ณต๋™ ์•„์ด๋””์–ด ๋ณด๋“œ ์‚ฌ์šฉ ๋ฐ ํˆฌํ‘œ

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

ํšŒ์˜ ์ข…๋ฃŒ ํ›„ ์š”์•ฝ๋ณธ ์ฆ‰์‹œ ํ™•์ธ

  • ํšŒ์˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ฆ‰์‹œ ํšŒ์˜ ์š”์•ฝ๋ณธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด, ํšŒ์˜ ๋‚ด์šฉ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ํ›„์† ์ž‘์—…์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

webRTC๋ฅผ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ํ™”์ƒ ํšŒ์˜

  • webRTC ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์›ํ™œํ•œ ํ™”์ƒ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ, ์›๊ฒฉ์ง€์—์„œ๋„ ํšจ์œจ์ ์ธ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ ํšŒ์˜ ๊ธฐ๋ก ๊ด€๋ฆฌ

  • ๋ชจ๋“  ํšŒ์˜ ๊ธฐ๋ก์€ ์ž๋™์œผ๋กœ ์ €์žฅ๋˜์–ด, ํ•„์š”์‹œ ์–ธ์ œ๋“ ์ง€ ๊ณผ๊ฑฐ ํšŒ์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ๊ธฐ๋Œ€ ํšจ๊ณผ

  • ํšจ์œจ์ ์ธ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ: AI์˜ ์‹ค์‹œ๊ฐ„ ์ฐธ์—ฌ๋กœ ํšŒ์˜ ํ๋ฆ„์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ์ง€์†๋˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋Š์ž„์—†์ด ๋„์ถœ๋ฉ๋‹ˆ๋‹ค. AI๋Š” ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ์ ์ ˆํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ํšŒ์˜์˜ ์ง„ํ–‰์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐฝ์˜๋ ฅ ์ฆ๋Œ€: AI๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ด€์ ๊ณผ ์ธ๊ฐ„์˜ ์ฐฝ์˜๋ ฅ์ด ๊ฒฐํ•ฉ๋˜์–ด ํŒ€ ์ „์ฒด์˜ ์ฐฝ์˜๋ ฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. AI๋Š” ์ƒˆ๋กœ์šด ์‹œ๊ฐ์—์„œ์˜ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋Š” ์ธ๊ฐ„ ์ฐธ์—ฌ์ž์˜ ์‚ฌ๊ณ ๋ฅผ ์ž๊ทนํ•˜์—ฌ ๋” ๋…์ฐฝ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ง‘์ค‘๋ ฅ ์œ ์ง€: AI๊ฐ€ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ฃผ์š” ๋…ผ์ ์„ ์š”์•ฝํ•˜๊ฑฐ๋‚˜, ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•œ ์ฃผ์ œ๋ฅผ ์ œ์‹œํ•จ์œผ๋กœ์จ ์ฐธ์—ฌ์ž๋“ค์˜ ์ง‘์ค‘๋ ฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํšŒ์˜์˜ ์งˆ์„ ๋†’์ด๊ณ , ๋ณด๋‹ค ๋งŽ์€ ์˜๊ฒฌ์ด ํšจ์œจ์ ์œผ๋กœ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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


๐Ÿ“บ ์„œ๋น„์Šค ํ™”๋ฉด

๋ฉ”์ธ ํ™”๋ฉด

main.png

ํšŒ์› ๊ฐ€์ž… ํ™”๋ฉด

join.png

๋กœ๊ทธ์ธ ํ›„ ๋ฉ”์ธ ํ™”๋ฉด

start.png

๋งˆ์ดํŽ˜์ด์ง€ ํ™”๋ฉด

mypage.png

ํšŒ์˜ ๊ธฐ๋ก ํ™”๋ฉด

history.png

์•„์ด๋””์–ด ๋„์ถœ ํ™”๋ฉด

opinion.png

์•„์ด๋””์–ด ํˆฌํ‘œ ํ™”๋ฉด

vote.png

์•„์ด๋””์–ด ์ฝ”๋ฉ˜ํŠธ ํ™”๋ฉด

comment.png

ํšŒ์˜๋ก & ํ™”์ƒ ํšŒ์˜ ํ™”๋ฉด

finalscreen.png

๐Ÿงฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ

arcitecture.png


๐Ÿ”ฅ ๋‚˜์˜ ๊ธฐ์—ฌ

1๏ธโƒฃWebSocket, STOMP, RabbitMQ๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๊ตฌ์ถ•

1. ๊ฐœ์š”

ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด WebSocket์„ ๊ธฐ๋ฐ˜์œผ๋กœ, STOMP ํ”„๋กœํ† ์ฝœ๊ณผ RabbitMQ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • WebSocket: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ํ†ต๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • STOMP: WebSocket ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ๋กœ, ๋ฉ”์‹œ์ง€์˜ ๋ฐœํ–‰(Pub)-๊ตฌ๋…(Sub) ๋ชจ๋ธ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
  • RabbitMQ: ์™ธ๋ถ€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค(Message Broker)๋กœ์„œ, ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๋ฐ ์ „ํŒŒํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜

๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์€ 4๊ฐœ์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. Client (Web Browser): ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•˜๋Š” UI. WebSocket/STOMP ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  2. Spring Boot Server: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„. STOMP ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ RabbitMQ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. RabbitMQ: ๋ฉ”์‹œ์ง€ ํ. Spring Boot ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‹ ์†ํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ „ํŒŒ(Broadcast)ํ•ฉ๋‹ˆ๋‹ค.
  4. Redis: ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ๊ด€๋ฆฌ ์ €์žฅ์†Œ. ํšŒ์˜ ์ฐธ๊ฐ€์ž ์ˆœ์„œ, ํ˜„์žฌ ์ง„ํ–‰ ์ƒํƒœ ๋“ฑ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Redis์— ์ €์žฅํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฉ”์‹œ์ง€ ํ๋ฆ„ ์ƒ์„ธ ๋ถ„์„

์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€(ํฌ์ŠคํŠธ์ž‡ ์ œ์ถœ ๋“ฑ)๋ฅผ ๋ณด๋‚ด๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๊ณต์œ ๋˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๋‹จ๊ณ„: ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ๋ฐ ๋ธŒ๋กœ์ปค ์„ค์ •

๊ฐ€์žฅ ๋จผ์ € ํด๋ผ์ด์–ธํŠธ๊ฐ€ WebSocket ์—ฐ๊ฒฐ์„ ๋งบ์„ ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ(_**/ws**_)๋ฅผ ์—ด์–ด์ค๋‹ˆ๋‹ค. ์ดํ›„ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์„ค์ •์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„, ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€ ๋ธŒ๋กœ์ปค(RabbitMQ) ๊ฐ„์˜ ํ†ต์‹  ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ ์„ค์ • (WebSocketConfig.java)

  • setApplicationDestinationPrefixes("/app"): ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ(Publish) ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค. /app์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋Š” ์„œ๋ฒ„์˜ @MessageMapping ๋ฉ”์„œ๋“œ๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค.
  • enableStompBrokerRelay: Spring์˜ ๋‚ด์žฅ ๋ธŒ๋กœ์ปค ๋Œ€์‹  ์™ธ๋ถ€ RabbitMQ๋ฅผ STOMP ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ์˜ ์ฑ…์ž„์„ RabbitMQ์— ์œ„์ž„ํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

Java

// WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // ...
        config.setApplicationDestinationPrefixes("/app")
              .enableStompBrokerRelay("/topic", "/queue", "/exchange", "/amq/queue")
              .setRelayHost("rabbitmq")
              .setRelayPort(61613)
              // ...
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*");
    }
}

2๋‹จ๊ณ„: ์„œ๋ฒ„ ์ˆ˜์‹  ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ /app ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด, @MessageMapping ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

MessageController๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ํ›„, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์ด ๋‹ด๊ธด MessageService๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ์ถœ๋œ ํฌ์ŠคํŠธ์ž‡ ๋‚ด์šฉ์„ Redis์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ฐœํ‘œ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

// MessageController.java
@Controller
public class MessageController {

    private final RabbitTemplate rabbitTemplate;
    private final MessageService messageService;
    ///...

    // ... ์ƒ์„ฑ์ž ...

    @MessageMapping("step1.submit.{roomId}")
    public void submitPost(RequestGroupPost groupPost, @DestinationVariable String roomId, StompHeaderAccessor accessor) {
        // 1. JWT ํ† ํฐ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ
        String token=accessor.getFirstNativeHeader("Authorization");
        String nickname=jwtUtilForRoom.getNickname(token);

        //...

        // 2. MessageService๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ (Redis์— ๋ฐ์ดํ„ฐ ์ €์žฅ ๋“ฑ)
        messageService.sendPost(Integer.parseInt(roomId), groupPost, nickname);

        ///...

        // 3. ์‘๋‹ต ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ
        ResponseGroupPost aiResponseGroupPost=makeResponseGroupPost(aiGroupPost,Integer.parseInt(roomId),nextUser);


        // 4. ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ RabbitMQ๋กœ ์ „์†กํ•˜์—ฌ ๋ชจ๋“  ๊ตฌ๋…์ž์—๊ฒŒ ์ „ํŒŒ
        rabbitTemplate.convertAndSend("amq.topic","room." + roomId, aiResponseGroupPost);
    }
}

3๋‹จ๊ณ„: RabbitMQ๋ฅผ ํ†ตํ•œ ๊ฒฐ๊ณผ ์ „ํŒŒ (Broadcast)

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, RabbitTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ RabbitMQ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฉ”์‹œ์ง€๋Š” amq.topic ์ด๋ผ๋Š” ๊ธฐ๋ณธ Topic Exchange๋กœ ๋ณด๋‚ด์ง€๋ฉฐ, room.{roomId} ํ˜•ํƒœ์˜ ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

RabbitMQ๋Š” ์ด ๋ผ์šฐํŒ… ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด(์˜ˆ: /topic/room/123)์„ ๊ตฌ๋…(Subscribe)ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ RabbitMQ๊ฐ€ ์ „๋‹ดํ•˜๋ฏ€๋กœ ์„œ๋ฒ„๋Š” ๋‹ค์Œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ฃผ์š” ๊ธฐ์ˆ ์  ๊ฒฐ์ •: ๋™์  Binding๊ณผ Queue ๊ด€๋ฆฌ

์ผ๋ฐ˜์ ์ธ RabbitMQ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ๋Š” Exchange, Queue, Binding์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณธ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋‹ค์ˆ˜์˜ ์ฑ„ํŒ…๋ฐฉ์ด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์‹œ๋กœ ์ž…์žฅ/ํ‡ด์žฅํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ •์  ์„ค์ •์ด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ STOMP ํ”„๋กœํ† ์ฝœ์˜ ํŠน์„ฑ๊ณผ RabbitMQ์˜ STOMP ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๋™ํ™”๋œ ํ/๋ฐ”์ธ๋”ฉ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ์ฃผ์ œ(์˜ˆ: /topic/room/123)๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด, RabbitMQ์˜ STOMP ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๋งŒ์„ ์œ„ํ•œ ์ž„์‹œ ํ(Temporary Queue)๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ฃผ์ œ์— ๋งž๊ฒŒ Exchange์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ์ •๋ฆฌ: ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด, ์ƒ์„ฑ๋˜์—ˆ๋˜ ์ž„์‹œ ํ์™€ ๋ฐ”์ธ๋”ฉ์€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

โœจ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด, ์ˆ˜๋™์œผ๋กœ ํ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ๋™์ ์ธ Pub/Sub ํ™˜๊ฒฝ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

5. ๊ฒฐ๋ก 

WebSocket, STOMP, RabbitMQ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ์ถ•ํ•จ์œผ๋กœ์จ, ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์ˆ˜ํ‰ ํ™•์žฅ์ด ์šฉ์ดํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์™ธ๋ถ€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ๋„์ž…ํ•˜์—ฌ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ , STOMP ํ”„๋กœํ† ์ฝœ์˜ ์žฅ์ ์„ ํ™œ์šฉํ•ด ๋™์ ์ธ Pub/Sub ํ™˜๊ฒฝ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ ๊ฒฝํ—˜์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์–ป๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 46.0%
  • JavaScript 40.1%
  • CSS 11.9%
  • Python 1.6%
  • Other 0.4%