/beauduck_project

๐Ÿฅ๋ทฐํ‹ฐ ๋•ํ›„๋ฅผ ์œ„ํ•œ WebRTC ๊ธฐ๋ฐ˜ ๋ทฐํ‹ฐ ์ปจํ…์ธ  ์ œ๊ณต ์„œ๋น„์Šค๐ŸŽจ

Primary LanguageJavaScript

๋ทฐ๋• - BeauDuck ๋ทฐํ‹ฐ ์„œ๋น„์Šค

bd

๋ทฐํ‹ฐ ๋•ํ›„๋ฅผ ์œ„ํ•œ Web RTC ๊ธฐ๋ฐ˜ ๋ทฐํ‹ฐ ์ปจํ…์ธ  ์ œ๊ณต ์„œ๋น„์Šค

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



๐Ÿฅ ์†Œ๊ฐœ ์˜์ƒ ๋ณด๊ธฐ : https://youtu.be/O0s7edaADMQ



๐Ÿฅ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ธฐ๊ฐ„

2023.01.02(์›”) ~ 2023.02.17(๊ธˆ) (์ด 7์ฃผ๋™์•ˆ ์ง„ํ–‰)

SSAFY 8๊ธฐ 2ํ•™๊ธฐ ๊ณตํ†ต ํ”„๋กœ์ ํŠธ - BeauDuck



๐Ÿฅ BeauDuck - ๋ฐฐ๊ฒฝ

๋ทฐํ‹ฐ์˜ ์ฃผ์ฒด๊ฐ€ โ€œ๋‚จโ€์—์„œ โ€œ๋‚˜โ€๋กœ ์˜ฎ๊ฒจ๊ฐ€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋‚จ๋“ค์ด ๋งŽ์ด ์ž…๋Š” ์ฝ”๋””, ๋‚จ๋“ค์ด ์ž์ฃผ ํ•˜๋Š” ๋ฉ”์ดํฌ์—…์ด ์•„๋‹Œ ๋‚˜์—๊ฒŒ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์ฝ”๋””์™€ ๋ฉ”์ดํฌ์—…์„ ์š”๊ตฌํ•˜๋Š”, ํผ์Šค๋„ ๋ทฐํ‹ฐ์˜ ์‹œ๋Œ€๊ฐ€ ๋„๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค!

๋‚˜๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ๋‚˜์—๊ฒŒ ๊ผญ ๋งž๋Š” ๋ฉ”์ดํฌ์—…์„ ์ฐพ๊ณ  ์‹ถ์ง€ ์•Š์œผ์‹ ๊ฐ€์š”?? ๋น„๋Œ€๋ฉด ๋ฌด๋ฃŒ ํผ์Šค๋„ ์ปฌ๋Ÿฌ ์ง„๋‹จ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ๋ฉ”์ดํฌ์—… ์ฝ˜ํ…์ธ ์™€ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค ํ”Œ๋žซํผ **โ€œ๋ทฐ๋•(Beauduck)โ€**์— ๋ชจ๋‘ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.



๐Ÿฅ BeauDuck - ๊ฐœ์š”

โ€œ๋ทฐํ‹ฐ ๋•ํ›„๋„, ๋•ํ›„๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šคโ€

๋ทฐ๋•์€ ๋ทฐํ‹ฐ ๋•ํ›„์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

๋ทฐ๋•์˜ ํ•ต์‹ฌ ์ปจ์…‰์€ ๋น„์šฉ ๋ถ€๋‹ด ์—†์ด ํผ์Šค๋„ ์ปฌ๋Ÿฌ ์ง„๋‹จ, ๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ ๋“ฑ ๋ทฐํ‹ฐ ์ปจํ…์ธ ๋ฅผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

image



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

1๏ธโƒฃ Web RTC๋ฅผ ์ด์šฉํ•œ ํผ์Šค๋„์ปฌ๋Ÿฌ ์ง„๋‹จ

2๏ธโƒฃ ๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ ์ƒ์„ฑ ๋ฐ ์ฒดํ—˜

3๏ธโƒฃ AI๋ฅผ ์ด์šฉํ•œ ๋‹ฎ์€ ๊ผด ๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ ์ถ”์ฒœ

4๏ธโƒฃ ์œ ์ € ์‹ค์‹œ๊ฐ„ ์†Œํ†ต ์„œ๋น„์Šค ๋ฐ ์ž์œ  ๊ฒŒ์‹œํŒ



๐ŸŽจ ๋„์™€๋•

ํผ์Šค๋„ ์ปฌ๋Ÿฌ ์ง„๋‹จ

โ–ซ ํผ์Šค๋„ ์ปฌ๋Ÿฌ๋ฅผ ๋ฌด๋ฃŒ๋กœ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ง„๋‹จ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



โ–ซ ์ง„๋‹จ์„ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ์œ ์ €(ํ˜ธ์ŠคํŠธ)์˜ ํ™”๋ฉด ๋ฐฐ๊ฒฝ์ด 3์ดˆ๋งˆ๋‹ค ๋ฐ”๋€๋‹ˆ๋‹ค.

โ–ซ ๋‹ค์ˆ˜์˜ ํ‰๊ฐ€๋‹จ์ด ํ˜ธ์ŠคํŠธ์˜ ํ™”๋ฉด์„ ๋ณด๊ณ  ์ƒ‰์ƒ์ด ์–ด์šธ๋ฆฌ๋Š”์ง€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.



โ–ซ ๋ชจ๋“  ํ‰๊ฐ€๋‹จ์˜ ํˆฌํ‘œ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ํผ์Šค๋„ ์ปฌ๋Ÿฌ ์ง„๋‹จ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค.


โ–ซ ํ˜ธ์ŠคํŠธ๋Š” ํ‰๊ฐ€ ๊ฒฐ๊ณผ ์ง„๋‹จ์„œ๋ฅผ ํ‰๊ฐ€ ์ข…๋ฃŒ ์งํ›„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋ทฐํ‹ฐ ๊ด€๋ จ ์ •๋ณด ์ œ๊ณต

โ–ซ ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰ API๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง์„ ํ†ตํ•ด ํผ์Šค๋„ ์ปฌ๋Ÿฌ, ๋ฉ”์ดํฌ์—… ๋“ฑ ๋ทฐํ‹ฐ ๊ด€๋ จ ํ‚ค์›Œ๋“œ์˜ ๊ธฐ์‚ฌ, ๋ธ”๋กœ๊ทธ, ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โ–ซ ํ•ด๋‹น ์ •๋ณด๋ฅผ ํด๋ฆญํ•˜๋ฉด ์›๋ณธ ๋งํฌ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.







โœจ ๋”ฐ๋ผํ•ด๋•

๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ

โ–ซ ์ƒ์œ„ 10๊ฐœ ๋ฉ”์ดํฌ์—…, ๋žœ๋ค ์ถ”์ฒœ ๋ฉ”์ดํฌ์—…, AI ์ถ”์ฒœ ๋ฉ”์ดํฌ์—…, ์ „์ฒด ๋ฉ”์ดํฌ์—… ๋ฆฌ์ŠคํŠธ ๋“ฑ ํ™”๋ฉด ๋‚ด ์œ ์ €๊ฐ€ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



โ–ซ ๋ฉ”์ดํฌ์—… ๋Œ€ํ‘œ์‚ฌ์ง„, ๊ฐ ์„ธ๋ถ€ ๊ณผ์ •์— ๋Œ€ํ•œ ์ƒ์„ธ์„ค๋ช…, ์‚ฌ์šฉ ์ƒ‰์ƒ, ๊ฐ€์ด๋“œ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โ–ซ facemesh๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ €์˜ ์–ผ๊ตด ์ขŒํ‘œ์— ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.



โ–ซ ๋ฉ”์ดํฌ์—…์„ ์™„์„ฑํ•œ ๋ชจ์Šต์„ ํ™”๋ฉด ์บก์ณ๋ฅผ ํ†ตํ•ด ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , โ€œ๋งˆ์ดํŽ˜์ด์ง€ > ๊ฐค๋Ÿฌ๋ฆฌโ€ ํƒญ์—์„œ ๋ชจ์•„๋ณด๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.



โ–ซ ๋ฉ”์ดํฌ์—…์ด ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ๋ฉ”์ดํฌ์—…์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์ ๊ณผ ์กฐํšŒ์ˆ˜๊ฐ€ ๋†’์œผ๋ฉด ํ™”๋ฉด ์ƒ๋‹จ๋ถ€์ธ TOP10 ์— ๋…ธ์ถœ๋˜์–ด ๋” ๋งŽ์€ ์œ ์ €๊ฐ€ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋ฉ”์ดํฌ์—… ์ปจํ…์ธ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

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

โ–ซ ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ดˆ๋ณด์ž๋„ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์‹œ๊ฐํ™”๋œ UI๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.




โ–ซ ์™„์„ฑํ•œ ๊ฐ ์ปจํ…์ธ ๋Š” ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๋ชจ์•„๋ณด๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋‹ฎ์€๊ผด ๋ฉ”์ดํฌ์—… ์ถ”์ฒœ

โ–ซ ์‚ฌ์šฉ์ž์˜ ์ •๋ฉด ์–ผ๊ตด ์‚ฌ์ง„์„ ๋“ฑ๋กํ•˜์—ฌ ๋‹ฎ์€๊ผด ํšŒ์›๋“ค์ด ๋งŒ๋“  ๋ฉ”์ดํฌ์—…์„ ์ถ”์ฒœํ•ด์ค๋‹ˆ๋‹ค.

โ–ซ โ€œ๋งˆ์ดํŽ˜์ด์ง€>์ด๋ฏธ์ง€ ์ €์žฅโ€ ํƒญ์—์„œ ํ™”๋ฉด ์บก์ณ๋ฅผ ํ†ตํ•ด ์ •๋ฉด ์‚ฌ์ง„์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–ซ ์ด๋•Œ ์ €์žฅ๋œ ์ด๋ฏธ์ง€๋Š” ์ถ”์ฒœ์„ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ–ซ ์ตœ๋Œ€ 5๊ฐœ์˜ ๋ฉ”์ดํฌ์—…์„ ์ถ”์ฒœํ•ด์ฃผ๋ฉฐ ๋‹ฎ์€ ํšŒ์›์ด ์—†์„ ๊ฒฝ์šฐ ์ถ”์ฒœ ๋ฉ”์ดํฌ์—…์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง ํˆฌ๊ฒŒ๋•

์‹ค์‹œ๊ฐ„ ํ™”์ƒ ์ฑ„ํŒ…

โ–ซ WebRTC๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ ์ €๋“ค๊ณผ ์ž์œ ๋กญ๊ฒŒ ํ™”์ƒ์œผ๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–ซ Openvidu ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ Customํ•˜์˜€์Šต๋‹ˆ๋‹ค.





๐Ÿคผโ€โ™‚๏ธ ์‘ฅ๋•์‘ฅ๋•

๊ฒŒ์‹œํŒ

โ–ซ ๋ทฐํ‹ฐ์™€ ๊ด€๋ จ๋œ ์ •๋ณด, ์‚ฌ๋‹ด ๋“ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ–ซ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ •๋ณด ๊ฒŒ์‹œํŒ๊ณผ ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ–ซ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.





๐Ÿ  ๋งˆ์ดํŽ˜์ด์ง€

๋ฉ”์ดํฌ์—…

โ–ซ ๋”ฐ๋ผํ•ด๋•์—์„œ ์‹คํ–‰ํ•œ ๋ฉ”์ดํฌ์—…๊ณผ ๋งŒ๋“  ๋ฉ”์ดํฌ์—… ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๊ฐค๋Ÿฌ๋ฆฌ

โ–ซ ๋ฉ”์ดํฌ์—… ํŠœํ† ๋ฆฌ์–ผ ์ข…๋ฃŒ ํ›„ ์ €์žฅํ•œ ์‚ฌ์ง„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



์‚ฌ์ง„ ์ €์žฅ

โ–ซ ๋ฉ”์ดํฌ์—… ์ถ”์ฒœ์— ์‚ฌ์šฉ๋˜๋Š” ์–ผ๊ตด ์‚ฌ์ง„์„ ์ดฌ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




๐Ÿฅ ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿง™โ€โ™‚๏ธ FrontEnd

  • React ๋ฒ„์ „ : 18.2.0
  • node.js 18.13.0
  • ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • react-redux v8.0.5
    • redux-tool-kit 1.9.1
  • router v6.6
  • JSX
  • WebRTC
    • openvidu
  • Facemesh ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • SCSS

๐Ÿ‘ทโ€โ™‚๏ธ BackEnd

  • Intellij 2022.3.1
  • Spring boot 2.7.7
  • Java 1.8
  • Gradle 7.6
  • Spring Data JPA
  • Swagger 2.0
  • Spring Security
  • Lombok
  • flask

DB

  • MySQL 8.0.31
  • Redis 7.0.8

OS

  • Ubuntu
  • Docker 23.0.1
  • Jenkins LTS

๊ธฐํƒ€ ํŽธ์˜ ํˆด

  • Postman
  • Termius



๐Ÿฅ ์‚ฐ์ถœ๋ฌผ

ERD

์™€์ด์–ดํ”„๋ ˆ์ž„

API ๋ฌธ์„œ

์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

ํฌํŒ… ๋งค๋‰ด์–ผ


๐Ÿ“Œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„

๋ทฐ๋• ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„