[๐Ÿ† 2024 ๊ณต๊ฐœSW ๊ฐœ๋ฐœ์ž๋Œ€ํšŒ ์ผ๋ฐ˜๋ถ€ ๋™์ƒ] A0175 HearusํŒ€

SangYeon Minยท2024๋…„ 11์›” 14์ผ
0

PROJECT-HEARUS

๋ชฉ๋ก ๋ณด๊ธฐ
12/12
post-thumbnail

๐Ÿ† 2024 ๊ณต๊ฐœSW ๊ฐœ๋ฐœ์ž๋Œ€ํšŒ ์ผ๋ฐ˜๋ถ€ ๋™์ƒ

2021๋…„ ๊ฑด๊ตญ๋Œ€ํ•™๊ต ๊ต๋‚ด ์žฅ์• ์ธ ์„œํฌํ„ฐ์ฆˆ ํ™œ๋™์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์•„ ์ด๋Ÿฐ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์„ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ์ฒญ๊ฐ์žฅ์•  ํ•™์šฐ๋ถ„๋“ค๊ณผ ์„œํฌํ„ฐ์ฆˆ ๋ถ„๋“ค ๋ชจ๋‘ ํŽธํ•˜๊ฒ ๋‹ค ๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ 

์ด๋ฅผ ๊ตฌ๋ฆ„ KDT์—์„œ ์ž์—ฐ์–ด์ฒ˜๋ฆฌ ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ํ˜‘์—…ํ•˜์—ฌ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ์ˆ˜์ƒ์„ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ 

๊ทธ ํ›„๋กœ๋„ ๊ณ„์†, ์•ฝ 11๊ฐœ์›”๋™์•ˆ ์‹œํ—˜๊ธฐ๊ฐ„์—๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•˜๊ณ , ๋Œ€์™ธ์ ์œผ๋กœ๋„ ์—ฌ๋Ÿฌ ํ™œ๋™์„ ๊ฑฐ๋“ญํ•œ ๊ฒฐ๊ณผ

์ผ๋ฐ˜๋ถ€์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ๊ณต๊ฐœSW ๊ฐœ๋ฐœ์ž๋Œ€ํšŒ์—์„œ ๋™์ƒ์„ ์ˆ˜์ƒํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•™์ƒ๋ถ€๊ฐ€ ์•„๋‹˜์—๋„ ์ผ๋ฐ˜๋ถ€๋กœ ์ง€์›ํ•œ ์ด์œ ๋Š” ๊ฐ™์€ ๊ตฌ๋ฆ„ KDT ์ถœ์‹ ์˜ FE ํŒ€์›๋ถ„๊ณผ ์ฐธ๊ฐ€ํ•˜๊ณ  ์ผ๋ฐ˜๋ถ€์˜ ์ˆ˜์ค€ ๋†’์€ ์ฐธ๊ฐ€์ž ๋ถ„๋“ค๊ณผ ์‹ค๋ ฅ์„ ๊ฒจ๋ฃจ๊ณ  ์„ฑ์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ์ด์œ  ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

2ํ•™๊ธฐ ์ค‘๊ฐ„๊ณ ์‚ฌ ์ผ์ •๊ณผ ๋ผ์ด์„ ์Šค ๊ฒ€์ฆ, ๊ธฐ๋Šฅ ๊ฒ€์ฆ, ๋ฉ˜ํ† ๋ง ๋“ฑ์˜ ์ผ์ •์ด ๊ฒน์ณ ํž˜๋“ค์—ˆ์ง€๋งŒ ์ข‹์€ ํŒ€์›๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ํ•œ ๋•๋ถ„์— ์•ฝ 1๋…„๋™์•ˆ์˜ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฐ์‹ค์„ ๋งบ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค

์•ฝ 5๊ฐœ์›”๋™์•ˆ ๋‹ค์–‘ํ•œ ํŒŒํŠธ์—์„œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์กด์žฌํ–ˆ๊ธฐ์—, 2์ฃผ๋ฅผ ํ•˜๋‚˜์˜ SPRINT๋กœ ์„ค์ •ํ•˜๊ณ  ๊ณผ์ œ๋ฅผ ๋ฐฐ์ •ํ•˜์—ฌ ๊ฐ ํŒŒํŠธ๋ณ„๋กœ ๊ฐœ๋ฐœ, ๊ฒ€์ฆ, ๊ณ ๋„ํ™” ๊ณผ์ •์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜

ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

React, Spring Boot, FastAPI ์„ธ ๊ฐœ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ

ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฒฝ์šฐ ์ตœ์‹  React Hooks ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์•„ํ† ๋ฏน ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ฐจ์šฉํ•˜์˜€๋‹ค.

๋˜ํ•œ Spring Boot ๊ธฐ๋ฐ˜์˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์œผ๋ฉฐ RESTful API๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณด์•ˆ ๋ฐ ์ธ์ฆ ์‹œ์Šคํ…œ์„ JWT Token์„ ํ†ตํ•ด ํ†ตํ•ฉํ•˜์˜€๋‹ค.

FastAPI์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ ์‹ค์‹œ๊ฐ„ ์Œ์„ฑ์ธ์‹์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๊ธฐ ์œ„ํ•ด API ๊ธฐ๋ฐ˜์˜ LLM AI Model Serving LangChain์„ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค.

์ธํ”„๋ผ ๊ตฌ์„ฑ

ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์™€ ๊ฐ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Git Workflow, Github Action, Jenkins๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์™„์ „ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค.

๋˜ํ•œ ์—ฌ๋Ÿฌ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด MariaDB์™€ MongoDB๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด AWS RDS๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ์„œ๋ฒ„์— DB๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜์˜€์œผ๋ฉฐ

GPT API๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋Œ€์‹  AMI, Spot Instance๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์—ฌ MAU 1์ฒœ๋ช… ๊ธฐ์ค€ GPT API ๋Œ€๋น„ 60%, On-Demand ๋Œ€๋น„ 80%์ •๋„ ๋” ๊ฒฝ์ œ์ ์ธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ์ค‘ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ๊ฐํ•˜๊ธฐ ์œ„ํ•ด CloudWatch, Lambda, Step Function์„ ํ™œ์šฉํ•ด ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

์‹ค์‹œ๊ฐ„ ์Œ์„ฑ-ํ…์ŠคํŠธ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์€ ์Œ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ Socket.io, WebSocket์„ ํ†ตํ•ด OpenAI Whisper ๋ชจ๋ธ์— ์ „๋‹ฌํ•˜๊ณ , ๋ณ€ํ™˜ ๊ฒฐ๊ณผ์˜ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด llama3 ๋ชจ๋ธ์„ ํ†ตํ•ด ๋ฌธ๋งฅ๊ณผ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

์ค‘์š” ๋‹จ์–ด ํ•˜์ด๋ผ์ดํŒ… ๊ธฐ๋Šฅ์—์„œ๋Š” llama3 ๋ชจ๋ธ์ด ๋ณ€ํ™˜์ด ์™„๋ฃŒ๋œ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ์™€ ์ค‘์š” ๊ฐœ๋…์„ ํ•˜์ด๋ผ์ดํŒ…ํ•œ ํ›„ ๋ฌธ๋‹จ ํ˜•ํƒœ๋กœ ์žฌ๊ตฌ์กฐํ™” ํ•œ๋‹ค.

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

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

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ณ ๋“ฑ๊ต์œก ๊ธฐ๊ด€์˜ ์žฅ์•  ํ•™์šฐ๋“ค์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ณ€ํ™˜๋œ ๊ฐ•์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ๊ฐ„ํ‘œ ํ˜•์‹์œผ๋กœ ์ง๊ด€์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ผ์ด์„ ์Šค

Hearus๋ฅผ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ์„œ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ๋ฐœ์ „์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด ์™„ํ™”๋œ ๋ผ์ด์„ ์Šค๋ฅผ ์ฑ„ํƒํ•˜์˜€๋‹ค.

๋˜ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ๊ธฐ์—ฌ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•ด, ๊ฐ ํ”„๋กœ์ ํŠธ Repository ๋ณ„๋กœ ์œ„์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋“ฑ๊ณผ ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•˜๋Š” Wiki ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๊ณ 

๋˜ํ•œ ๋ฐฑ์—”๋“œ Repository์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•œ RESTful API ์š”์ฒญ, ์‘๋‹ต์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ๋‚ด์šฉ์„ ๊ธฐ์žฌํ•จ์œผ๋กœ์„œ ๋”์šฑ ์›ํ™œํ•œ ๊ธฐ์—ฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜์˜€๋‹ค.

ํŒ€์› ์†Œ๊ฐœ

์ด 6๋ช…์˜ ํŒ€์›๋“ค์ด ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
๊ฐ ํŒŒํŠธ ๋ชจ๋‘ ๋งค์ฃผ 2ํšŒ์”ฉ ์ง„ํ–‰๋˜๋Š” Scrum์—์„œ ์ง„ํ–‰ ์‚ฌํ•ญ์„ ๊ณต์œ ํ•˜๊ณ  ๋ฐฉํ–ฅ์„ฑ์„ ํ™•๋ฆฝํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

์‹œ์—ฐ ์˜์ƒ

์‹œ์—ฐ์˜์ƒ์ฃผ์š” ๊ธฐ๋Šฅ ์‹œ์—ฐ์˜์ƒ
https://youtu.be/lB3ca2H8BLohttps://youtu.be/Du9uL2UWUPo

Github Repository

HEARUS-REACT-FRONTENDHEARUS-SPRING-BACKENDHEARUS-AI-SERVING
https://github.com/TEAM-Hearus/HEARUS-REACT-FRONTENDhttps://github.com/TEAM-Hearus/HEARUS-SPRING-BACKENDhttps://github.com/TEAM-Hearus/HEARUS-AI-SERVING

0๊ฐœ์˜ ๋Œ“๊ธ€