๋ค์ํ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ IT ์ ๊ณ ํธ๋ ๋์ ๋ํ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ์ง๋ฅํ ์์ด์ ํธ
Spring Boot ๊ธฐ๋ฐ ์ธ์ฆ, ํ์ , ๋์๋ณด๋, AI ์ฐ๋ ํ๋ธ
ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2024.07.10 ~ 2025.06.04
๊ธ๋ณํ๋ ๊ธฐ์ ํ๊ฒฝ ์์์ ์ค์๊ฐ์ผ๋ก ์์์ง๋ ๋ฐฉ๋ํ ์ ๋ณด๋ค์ ํ๋์ ํ์ ํ๊ณ , ๋น์ฆ๋์ค ๋ณํ์ ์ ์ํ๊ฒ ๋์ํ๋ ๊ฒ์ ๋ชจ๋ ๊ธฐ์ ์ ์ค์ํ ๊ณผ์ ์ ๋๋ค. TRENDB๋ ์ด๋ฌํ ํ์์ฑ์ ๋ฐ๋ผ ์์ง์๋ค์ด ์ต์ IT ํธ๋ ๋๋ฅผ ๋์น์ง ์๊ณ , ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ์ฌ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ฑ์ ์ค์ ํ ์ ์๋๋ก ์ง์ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค.
TRENDB๋ ๊ธฐ์กด ๊ฑฐ๋ ์ธ์ด ๋ชจ๋ธ(LLM)์ ํ๊ณ์ธ ํ๊ฐ ํ์์ ์ค์ด๊ณ , ์ ๋ขฐํ ์ ์๋ ์ต์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ํต์ฌ ๋ชฉํ๋ก ์ผ์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ฐ์ดํฐ ์์ง ํ์ดํ๋ผ์ธ, AI ์์ด์ ํธ ์๋ฒ, ๋ฉ์ธ API ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ ๊ตฌ์กฐ๋ก ์๋น์ค ์ ๋ฐ์ ์ค๊ณํ์ต๋๋ค.
์ด ์ค server ๋ ํฌ๋ Spring Boot ๊ธฐ๋ฐ์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ก์, ์ฌ์ฉ์์ ์ธ์ฆ๊ณผ ๊ถํ ๊ด๋ฆฌ๋ถํฐ ํ ํ์
, ํ์ผ ๊ณต์ , ์ธ์ฌ์ดํธ ๋์๋ณด๋ ๋ฐ์ดํฐ ์ ๊ณต, ๊ทธ๋ฆฌ๊ณ FastAPI ๊ธฐ๋ฐ AI ์์ด์ ํธ ์๋ฒ์์ ์ฐ๋๊น์ง ๋ด๋นํฉ๋๋ค.
์ฌ์ฉ์๋ ์ด ์๋ฒ๋ฅผ ํตํด ํ๋์ ์๋น์ค ์์์ ๋ค์ ํ๋ฆ์ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด๊ฐ ์ ์์ต๋๋ค.
- ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ ํ ๊ฐ์ธ ๋ฐ ํ ๋จ์๋ก ์๋น์ค ์ด์ฉ
- ๊ตญ๋ด์ธ ๋ด์ค ์ธ์ฌ์ดํธ ๋์๋ณด๋ ํ์
- AI ์ฑ๋ด๊ณผ์ ์คํธ๋ฆฌ๋ฐ ๋ํ ๋ฐ ํ๋ฅด์๋ ์ ํ
- ํ ๋ฌธ์ ์ ๋ก๋, ๊ณต์ , ๋ฌธ์ ๊ธฐ๋ฐ ์ง์์๋ต ์ํ
server๋ ํฌ๋ Spring Boot ๊ธฐ๋ฐ์ ๋ฉ์ธ API ์๋ฒ์ ๋๋ค.- ์ฌ์ฉ์ ์ธ์ฆ๊ณผ JWT ๋ฐ๊ธ, ํ/๋ฉค๋ฒ ๊ถํ ๊ด๋ฆฌ, ํ์ผ ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ, ์ธ์ฌ์ดํธ API๋ฅผ ๋ด๋นํฉ๋๋ค.
- AI ์๋ต ์์ฑ๊ณผ ์ธ๋ถ ๊ฒ์ ๋๊ตฌ ์คํ์ FastAPI ์์ด์ ํธ ์๋ฒ๊ฐ ์ํํ๊ณ , ๋ณธ ์๋ฒ๋ ์ด๋ฅผ ํ๋ก ํธ์๋์ ์ฐ๊ฒฐํ๋ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ํ์ดํ๋ผ์ธ์ด ์ ์ฌํ ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก, ์ธ์ฌ์ดํธ ๋์๋ณด๋์ ํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค.
- ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฐ ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ์์ด๋ ์ฐพ๊ธฐ, ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- JWT ๊ธฐ๋ฐ ์ธ์ฆ ํ๋ฆ์ ์ฌ์ฉํ๋ฉฐ ์ก์ธ์ค ํ ํฐ, ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ๋ฐ๊ธ API๋ฅผ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
- ํ์๊ฐ์ ์ ์ธ์ฆ๋ฒํธ ๋ฐ์ก ๋ฐ ์ธ์ฆ๋ฒํธ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ํตํด ์ด๋ฉ์ผ ์์ ๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ง์ดํ์ด์ง์์ ํ๋กํ ์กฐํ ๋ฐ ์์ , ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
|
|
| ๋ก๊ทธ์ธ ํ๋ฉด | ํ์๊ฐ์ ํ๋ฉด |
|
|
| ์ธ์ฆ๋ฒํธ ์ ๋ ฅ ํ๋ฉด | ํ์๊ฐ์ ์ด๋ฉ์ผ ์ธ์ฆ ๋ฐ์ก ์์ |
- ์ฌ์ฉ์๋ณ ๋์๋ณด๋์์ ๊ฐ์ธ ์ฑํ ๋ฐฉ๊ณผ ํ ์ฑํ ๋ฐฉ์ ํจ๊ป ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฑ๋ด ์ง์๋ SSE ๊ธฐ๋ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋๋ฉฐ, Spring ์๋ฒ๊ฐ FastAPI ์์ด์ ํธ ์๋ฒ์ ์๋ต์ ํ๋ก์ํฉ๋๋ค.
- ๊ธฐ๊ฐ๋ณ ํธ๋ ๋ ๋ถ์, ๊ฒฝ์์ฌ ๋น๊ต ๋ถ์ ๋ฑ ๋ณตํฉ ์ง์์ ๋ํด ์์ด์ ํธ ๋๊ตฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
- ๊ธฐ๋ณธ ํ๋ฅด์๋์ ์ฌ์ฉ์ ์ ์ ํ๋ฅด์๋๋ฅผ ํจ๊ป ๊ด๋ฆฌํด ๋ํ ์คํ์ผ๊ณผ ์์คํ ํ๋กฌํํธ๋ฅผ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
- ๋ต๋ณ๊ณผ ํจ๊ป ์ถ์ฒ๋ฅผ ์ ๊ณตํด ์ฌ์ฉ์๊ฐ ๊ฒฐ๊ณผ์ ๊ทผ๊ฑฐ๋ฅผ ๋ฐ๋ก ๊ฒ์ฆํ ์ ์๋๋ก ํ์ต๋๋ค.
๊ธฐ๊ฐ๋ณ ํธ๋ ๋ ๋ถ์ ์คํธ๋ฆฌ๋ฐ
|
|
| ํ๋ฅด์๋ ๊ด๋ฆฌ | ๋ต๋ณ ์ถ์ฒ ์ ๊ณต |
- ํน์ ๋ ์ง ๊ธฐ์ค์ ๊ตญ๋ด์ธ ์ข ํฉ ์ธ์ฌ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฃผ๊ฐ ์ธ๊ธฐ ํค์๋, ์ฐ๊ด ๊ฒ์์ด, ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ธฐ์ฌ ํ์, ๊ฐ์ฑ ๋ถ์ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Elasticsearch์ PostgreSQL์ ์ ์ฌ๋ ๋ด์ค ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๊ฐํ์ฉ ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์๋์ ์ ๊ณตํฉ๋๋ค.
์ธ์ฌ์ดํธ ํธ๋ ๋ ํค์๋ ํ์
|
|
| ๊ตญ๋ด ์ธ์ฌ์ดํธ ๋์๋ณด๋ | ํด์ธ ์ธ์ฌ์ดํธ ๋์๋ณด๋ |
- ํ ์์ฑ, ์์ , ์ญ์ ์ ํ ๋ฉค๋ฒ ์ด๋ ๋ฐ ์ญํ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ํ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ๋ฌธ์๋ฅผ ์ ๋ก๋ํ๋ฉด S3์ ์๋ณธ ํ์ผ์ ์ ์ฅํ๊ณ DB์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ ๋ก๋๋ ํ์ผ์ ์ธ๋ถ AI ์๋ฒ์ ์ฐ๊ณ๋์ด ๋ฌธ์ ๊ธฐ๋ฐ ์ง์์๋ต(RAG)์ ํ์ฉ๋ฉ๋๋ค.
- ์ถ์ฒ ํ์ผ, ํ์ผ๋ช ๊ฒ์, ๋จ์ ์คํ ๋ฆฌ์ง ์กฐํ, ํ์ผ ๋ค์ด๋ก๋/์ญ์ ๊ธฐ๋ฅ๊น์ง ํฌํจํด ํ์ ํ ๋ฌธ์ ์ ์ฅ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
|
|
| ํ์ ์ถ๊ฐ ํ๋ฉด | ํ ์คํ ๋ฆฌ์ง ํ๋ฉด |
| ๊ตฌ๋ถ | ๊ธฐ์ | ์์ธ ์ค๋ช |
|---|---|---|
| Backend | Java 17, Spring Boot 3.3.4, Spring Web, Spring WebFlux |
REST API ์ ๊ณต, ์ธ๋ถ AI ์๋ฒ์์ ๋น๋๊ธฐ ํต์ |
| Security | Spring Security, JWT, BCrypt |
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐ ์ฌ์ฉ์ ๊ถํ ๊ด๋ฆฌ |
| Database | PostgreSQL, Spring Data JPA |
์ฌ์ฉ์, ํ, ์ฑํ , ํ์ผ ๋ฉํ๋ฐ์ดํฐ ๋ฑ ํต์ฌ ์๋น์ค ๋ฐ์ดํฐ ๊ด๋ฆฌ |
| Search & Cache | Elasticsearch, Redis |
๋ด์ค ๊ฒ์ ๋ฐ ์ง๊ณ, ์บ์ ์ฒ๋ฆฌ |
| Storage | Amazon S3 |
ํ ํ์ผ ์๋ณธ ์ ์ฅ์ |
| Docs & Monitoring | Swagger(OpenAPI), Spring Boot Actuator |
API ๋ฌธ์ํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ํ์ธ |
| AI Integration | FastAPI, Milvus |
AI ์์ด์ ํธ ์ฐ๋, ์คํธ๋ฆฌ๋ฐ ์๋ต ํ๋ก์, ๋ฌธ์ ์๋ฒ ๋ฉ ๊ฒ์ ์ฐ๊ณ |
| Communication | SMTP |
ํ์๊ฐ์ ์ด๋ฉ์ผ ์ธ์ฆ ๋ฐ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋ฉ์ผ ๋ฐ์ก |
TRENDB๋ ์ญํ ๋ณ๋ก ๋ถ๋ฆฌ๋ ์ ์ฅ์๋ค์ด ํจ๊ป ๋์ํ๋ ๊ตฌ์กฐ์ ๋๋ค.
- ๋ฉ์ธ API ์๋ฒ (Spring Boot): ํ์ฌ ์ ์ฅ์. ์ฌ์ฉ์ ์ธ์ฆ, ํ/ํ์ผ ๊ด๋ฆฌ, ์ธ์ฌ์ดํธ API, AI ์๋ฒ ์ฐ๋์ ๋ด๋นํฉ๋๋ค.
- AI ์์ด์ ํธ ์๋ฒ (FastAPI): langchain-trend-agent - LangChain ๊ธฐ๋ฐ AI ์์ด์ ํธ์ ๋ด์ค/์น/์ปค๋ฎค๋ํฐ/์ ํ๋ธ ๋ฑ ๋๊ตฌ ์คํ, ๋ฌธ์ ๊ธฐ๋ฐ ์ง์์๋ต, ์คํธ๋ฆฌ๋ฐ ์๋ต ์์ฑ์ ๋ด๋นํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ํ์ดํ๋ผ์ธ (Python Scripts & Jenkins): global-it-news-analysis - ๊ตญ๋ด์ธ IT ๋ด์ค ์์ง, ํค์๋/๊ฐ์ฑ ๋ถ์, ๋ฐ์ดํฐ ์ ์ฌ ์๋ํ๋ฅผ ๋ด๋นํฉ๋๋ค.
AI ์์ด์ ํธ ์๋ต ์ฒ๋ฆฌ ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์น ํ๋ฉด ๋๋ ํด๋ผ์ด์ธํธ ์ฑ์์ ์ธ์ฆ ํ API๋ฅผ ํธ์ถํฉ๋๋ค.
- Spring Boot ์๋ฒ๋ JWT๋ฅผ ๊ฒ์ฆํ๊ณ ์ฌ์ฉ์, ํ, ํ์ผ ์ ๊ทผ ๊ถํ์ ํ๋ณํฉ๋๋ค.
- ์ผ๋ฐ ๋น์ฆ๋์ค ์์ฒญ์ PostgreSQL, Elasticsearch, Redis, S3์ ์ง์ ํต์ ํด ์ฒ๋ฆฌํฉ๋๋ค.
- AI ์ฑํ ์ด๋ ํ ๋ฌธ์ ์ง์์๋ต ์์ฒญ์ FastAPI ์๋ฒ๋ก ์ ๋ฌํ๊ณ , ์๋ต์ SSE๋ก ๋ค์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
- ํ๋ก ํธ์๋๋ ์ด ์๋ฒ๊ฐ ์ ๊ณตํ๋ ์ธ์ฌ์ดํธ ๋ฐ์ดํฐ์ ํ์ ๊ธฐ๋ฅ์ ๋ฐํ์ผ๋ก ํตํฉ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ตฌ์ฑํฉ๋๋ค.
- PostgreSQL: ํ์, ํ, ์ฑํ ๋ฐฉ, ๋ฉ์์ง, ํ์ผ/ํด๋ ๋ฉํ๋ฐ์ดํฐ
- Elasticsearch: ๋ด์ค ๊ธฐ์ฌ ๊ฒ์, ํค์๋ ๋ฐ ๊ฐ์ฑ ๋ถ์ ๊ธฐ๋ฐ ์กฐํ
- Redis: ์บ์ ๋ฐ ๋น ๋ฅธ ์ ๊ทผ์ด ํ์ํ ๋ฐ์ดํฐ ์ ์ฅ
- Amazon S3: ํ ๊ณต์ ๋ฌธ์ ์๋ณธ ํ์ผ ์ ์ฅ
- Milvus: ํ ๋ฌธ์ ์๋ฒ ๋ฉ ์ ์ฅ ๋ฐ RAG ๊ฒ์
| HTTP Method | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
POST |
/api/signup |
ํ์๊ฐ์ ๋ฐ ์ด๋ฉ์ผ ์ธ์ฆ ๋ฐ์ก |
POST |
/api/login |
๋ก๊ทธ์ธ ๋ฐ JWT ๋ฐ๊ธ |
POST |
/api/token |
์ก์ธ์ค ํ ํฐ ์ฌ๋ฐ๊ธ |
GET |
/api/mypage |
๋ด ์ ๋ณด ์กฐํ |
PATCH |
/api/update-profile |
ํ๋กํ ์์ |
PATCH |
/api/update-password |
๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ |
| HTTP Method | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
GET |
/api/chatbot/dashboard |
์ฑํ ๋์๋ณด๋ ์กฐํ |
POST |
/api/chatbot/chatroom |
์ฑํ ๋ฐฉ ์์ฑ |
GET |
/api/chatbot/chatroom/{chatroomId}/messages |
๋ฉ์์ง ์กฐํ |
POST |
/api/chatbot/chatroom/{chatroomId}/agent-query |
AI ์์ด์ ํธ ์คํธ๋ฆฌ๋ฐ ์ง์ |
GET |
/api/persona |
ํ๋ฅด์๋ ๋ชฉ๋ก ์กฐํ |
POST |
/api/persona |
์ฌ์ฉ์ ํ๋ฅด์๋ ์์ฑ |
| HTTP Method | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
POST |
/api/teams |
ํ ์์ฑ |
GET |
/api/teams/my-teams |
๋ด๊ฐ ์ํ ํ ๋ชฉ๋ก ์กฐํ |
POST |
/api/teams/{teamId}/members |
ํ ๋ฉค๋ฒ ์ถ๊ฐ |
POST |
/api/teams/{teamId}/folders |
ํ ํด๋ ์์ฑ |
POST |
/api/teams/{teamId}/folders/{folderId}/files |
ํ์ผ ์ ๋ก๋ |
GET |
/api/teams/{teamId}/files/{fileId} |
ํ์ผ ๋ค์ด๋ก๋ |
POST |
/api/teams/{teamId}/files/query |
ํ ๋ฌธ์ ๊ธฐ๋ฐ ์ง์์๋ต |
| HTTP Method | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
GET |
/api/insight |
๋ ์ง ๊ธฐ์ค ์ข ํฉ ์ธ์ฌ์ดํธ ์กฐํ |
GET |
/api/insight/weekly |
์ฃผ๊ฐ ์ธ๊ธฐ ํค์๋ ์กฐํ |
GET |
/api/insight/search |
๊ธฐ๊ฐ ๋ด ๊ธฐ์ฌ ๊ฒ์ |
GET |
/api/insight/sentiment-analysis |
ํค์๋ ๊ฐ์ฑ ๋ถ์ |
GET |
/api/insight/competitors/mentions |
๊ฒฝ์์ฌ ์ธ๊ธ๋ ๋ถ์ |
GET |
/api/insight/competitors/sentiment |
๊ฒฝ์์ฌ ๊ฐ์ฑ ๋ถ์ |
์ ์ฒด API๋ Swagger UI์์๋ ํ์ธํ ์ ์์ต๋๋ค.
Java 17Gradle WrapperPostgreSQLRedisElasticsearchAWS S3 ์ ๊ทผ ์ ๋ณดFastAPI ์์ด์ ํธ ์๋ฒ
์คํ ์ src/main/resources/application.yml ๋๋ ๋ฐฐํฌ ํ๊ฒฝ ์ค์ ์์ ์๋ ํญ๋ชฉ๋ค์ ํ๊ฒฝ์ ๋ง๊ฒ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
| ํญ๋ชฉ | ์์ ํค |
|---|---|
| ๋ฐ์ดํฐ๋ฒ ์ด์ค | spring.datasource.url, spring.datasource.username, spring.datasource.password |
| ๋ฉ์ผ ์ธ์ฆ | spring.mail.host, spring.mail.username, spring.mail.password |
| JWT | jwt.issuer, jwt.secret |
| AI ์๋ฒ ์ฐ๋ | fastapi.url |
| ๊ฒ์/์บ์ | spring.elasticsearch.uris, spring.redis.host, spring.redis.password |
| ํ์ผ ์ ์ฅ์ | aws.access.key, aws.secret.key, aws.region, aws.s3.bucket |
./gradlew bootRun์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ ๊ธฐ๋ณธ ์ ๊ทผ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ:
http://localhost:8080/ - Swagger UI:
http://localhost:8080/swagger-ui.html - Actuator:
http://localhost:8080/actuator
main: ์์ ํ๋ ์ด์ ๋ฒ์ ๊ด๋ฆฌ ๋ธ๋์นdevelop: ๋ค์ ๋ฐฐํฌ ๋ฒ์ ์ ํตํฉ ๊ฐ๋ฐํ๋ ๋ธ๋์นfeature/*: ๊ธฐ๋ฅ ๋จ์ ๊ฐ๋ฐ ๋ธ๋์น












