AI ๊ธฐ๋ฐ ์ปค๋ฆฌ์ด ์ฑ์ฅ ์ถ์ ํ๋ซํผ 'NaviK'์ ๋ฐฑ์๋ ์๋ฒ์ ๋๋ค!
NaviK์ ์ฃผ๋์ด ๊ฐ๋ฐ์๊ฐ ์์ ์ ์ฑ์ฅ์ ์ฒด๊ณ์ ์ผ๋ก ๊ธฐ๋กํ๊ณ , AI๋ฅผ ํ์ฉํด ์ญ๋์ ๋ถ์๋ฐ์ผ๋ฉฐ, ๋ง์ถคํ ์ฑ์ฉ ๊ณต๊ณ ์ ์คํฐ๋๋ฅผ ์ถ์ฒ๋ฐ์ ์ ์๋ ์ปค๋ฆฌ์ด ์ฑ์ฅ ํ๋ซํผ์ ๋๋ค.
๐ ์๋น์ค ๋ฐ๋ก๊ฐ๊ธฐ ย ยท ย ๐ API ๋ฌธ์ (Swagger)
- "๊ธฐ๋ก์ ๋ง์๋ฐ ์ ์ ์ญ๋์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ด์!"
- "๋์๊ฒ ์ด์ธ๋ฆฌ๋ ์ฑ์ฉ๊ณต๊ณ ๋ฅผ ์ฐพ๊ณ ์ถ์ด์!"
- "๋์ ์์น๋ฅผ ๊ฐ๊ด์ ์ผ๋ก ํ์ธํ๊ณ ์ถ์ด์!"
- "์ปค๋ฆฌ์ด์ ๋์นจ๋ฐ์ด ํ์ํด์!"
- ์ฑ์ฅ ๊ธฐ๋ก์ด ํํธํ๋์ด ์์ด ๋ณธ์ธ์ ์ญ๋ ๋ณํ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ง๋ฌด๋ณ ํต์ฌ ์ญ๋(KPI)๊ณผ ๋ด ํ์ฌ ์์ค์ ๊ฐญ์ ๊ฐ๊ด์ ์ผ๋ก ํ์ ํ ์ ์๋ ์ด๋ ค์์ด ์์ต๋๋ค.
- ์ฑ์ฉ ๊ณต๊ณ ยท์คํฐ๋๋ฅผ ์ง์ ์ฐพ์์ผ ํด์ ์๊ฐ์ด ๋ง์ด ๋ญ๋๋ค.
- ์ฑ์ฅ ๋ก๊ทธ๋ฅผ ์์ฑํ๋ฉด AI๊ฐ ์ง๋ฌด KPI ๊ธฐ์ค์ผ๋ก ํ๊ฐํด ์ ์๋ฅผ ๋งค๊ฒจ ๊ฐ๊ด์ ์ธ ๋์ ์์น๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ํฌํธํด๋ฆฌ์ค๋ฅผ ์ ๋ก๋ํ๋ฉด AI ๋ถ์์ ํตํด ๋ด๊ฐ ๊ฐ์ง ๊ฐ์ ยท์ฝ์ ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฒกํฐ ์๋ฏธ ์ ์ฌ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ด ์ญ๋์ ๋ง๋ ์ฑ์ฉ ๊ณต๊ณ ยท์คํฐ๋๋ฅผ ์๋ ์ถ์ฒํด๋๋ฆฝ๋๋ค.
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ์์คํ ์ํคํ ์ฒ
- ๊ธฐ์ ์คํ ๋ฐ ๋์ ์ด์
- ERD
- ์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ
- ์ฃผ์ API ๊ทธ๋ฃน
- ๊ธฐ์ ์ ์๋
- ๋ฐฐํฌ ๊ณผ์
- ํ์ ๊ตฌ์ฑ
src/main/java/navik/
โโโ NavikApplication.java
โโโ domain/ # ๋๋ฉ์ธ๋ณ ํจํค์ง
โ โโโ ability/ # ์ญ๋ ์๋ฒ ๋ฉ
โ โโโ board/ # ์ปค๋ฎค๋ํฐ ๊ฒ์ํ
โ โโโ departments/ # ๋ถ์ ๊ด๋ฆฌ
โ โโโ evaluation/ # ๋๋ฃ ํ๊ฐ
โ โโโ goal/ # ๋ชฉํ ๊ด๋ฆฌ
โ โโโ growthLog/ # ์ฑ์ฅ ๋ก๊ทธ + AI ํ๊ฐ Worker
โ โโโ job/ # ์ง๋ฌด ์ ๋ณด
โ โโโ kpi/ # KPI ์นด๋ยท์ ์
โ โโโ notification/ # ์๋ฆผ
โ โโโ portfolio/ # ํฌํธํด๋ฆฌ์ค ๋ถ์ Worker
โ โโโ recruitment/ # ์ฑ์ฉ ๊ณต๊ณ ์ถ์ฒ
โ โโโ study/ # ์คํฐ๋
โ โโโ term/ # ์ฝ๊ด
โ โโโ users/ # ์ฌ์ฉ์
โโโ global/ # ๊ณตํต ๋ชจ๋
โโโ apiPayload/ # ํ์ค ์๋ต / ์๋ฌ ์ฝ๋
โโโ auth/ # JWT + OAuth2 ์ค์
โโโ config/ # Security, CORS, Redis, S3, QueryDSL ๋ฑ
โโโ converter/ # ๋ฐ์ดํฐ ๋ณํ
โโโ entity/ # BaseEntity
โโโ enums/ # ๊ณตํต Enum
โโโ log/ # ๋ก๊น
โโโ s3/ # S3 ํ์ผ ์
๋ก๋
โโโ swagger/ # Swagger ์ ํธ
๊ฐ ๋๋ฉ์ธ ํจํค์ง๋ controller / service / repository / entity / dto / docs ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ
๋๋ค.
[Client] โโโ REST API โโโ [Spring Boot Application]
โ
โโโโโโโโโโโโโโโโโฌโโโโโโโโดโโโโโโโโฌโโโโโโโโโโโโโโโโ
โ โ โ โ
[Domain Layer] [Global Layer] [Worker Layer] [Crawler Layer]
(DDD Packages) (Auth/Config) (Redis Stream) (Redis Stream)
โ โ โ โ
โโโโโโโโโฌโโโโโโโโ โ โ
โ โ โ
[PostgreSQL] [Redis] โโโโโโโโโโโโ
+ pgvector + Stream
โ + Cache/Token
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
[AI Server]
(ํ๊ฐ/๋ถ์/OCR/ํฌ๋กค๋ง)
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| Language | Java 21 |
| Framework | Spring Boot 3.5.9 |
| Database | PostgreSQL + pgvector |
| Cache / Stream | Redis |
| ORM | Spring Data JPA + QueryDSL 5.1.0 |
| Auth | Spring Security + OAuth2 + JWT (JJWT 0.12.3) |
| Storage | AWS S3 |
| Vector Search | Hibernate Vector 6.6 |
| API Docs | springdoc-openapi 2.8.5 (Swagger UI) |
| Monitoring | Spring Actuator + Prometheus + Grafana |
| CI/CD | GitHub Actions โ AWS ECR โ EC2 |
| Container | Docker (eclipse-temurin:21-jre) |
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| Language | Java 21 |
| Framework | Spring boot 3.5.9 + SpringAI |
| Stream | Redis |
| ์ฑ์ฉ ๊ณต๊ณ ํฌ๋กค๋ง | Selenium + JSoup + Naver Clova OCR + OpenAI |
| ์ฑ์ฅ ๊ธฐ๋ก ๋ถ์ | Notion OAuth + Github API + Naver Clova OCR + OpenAI |
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| Language | Python 3.11 |
| Framework | FastAPI |
| ์ด๋ ฅ์ ๋ถ์ | OpenAI |
์ฃผ์ ์ญํ : ์๋น์ค ์ฌ์ฉ์์ ์ง์ ์ ์ธ ํธ๋ํฝ ์ฒ๋ฆฌ -> Public Subnet
์ฃผ์ ์ญํ : ์ธ๋ถ IO๊ฐ ํ์ํ ์์ (OpenAI, NaverOCR, ์ฑ์ฉ ๊ณต๊ณ ์คํฌ๋ํ)
> ์๋น์ค ์ฌ์ฉ์์ ํธ๋ํฝ์ ๋ด๋นํ์ง ์๊ณ Server to Server ์ด๋ฏ๋ก -> Private
| Category | Stack | ๋์ ์ด์ |
|---|---|---|
| Stream | ์ฌ์ฉ์์ Notion Token ์บ์ฑ, ํฌ๋กค๋ง๋ ์ฑ์ฉ๊ณต๊ณ ์ ๋ฒํผ๋ก ํ์ฉ |
| Category | Stack | ๋์ ์ด์ |
|---|---|---|
| Compute | Main ์๋ฒ์ ์์ฒญ์ ์ฃผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฆฌ์์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ์ฌ์ฉ |
์ฃผ์ ์ญํ : ํ์ผ ์ ํ์ด ๋์ด๋๋ ์๊ตฌ์ฌํญ์ ๋๋น, 'ํ์ผ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ'๊ฐ ํ๋ถํ ํ์ด์ฌ์ด ์ ํฉํ๋ค๊ณ ํ๋จ
> ์ธ๋ถ IO ์์ ๋ง ์ฒ๋ฆฌ (OpenAI) -> Private Subnet ---
| Category | Stack | ๋์ ์ด์ |
|---|---|---|
| Compute | Main ์๋ฒ์ ์์ฒญ์ ์ฃผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฆฌ์์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ์ฌ์ฉ |
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ์ฑ์ฅ ๋ก๊ทธ | ํ๋ยทํ์ตยท์ฑ๊ณผ๋ฅผ ๊ธฐ๋กํ๊ณ AI ํ๊ฐ(๋น๋๊ธฐ Worker)๋ฅผ ๋ฐ์ KPI ์ ์์ ๋ฐ์ (Text, PDF, Notion, Github PR ๋ถ์ ์ง์) |
| ํฌํธํด๋ฆฌ์ค ๋ถ์ | PDF/ํ ์คํธ ํฌํธํด๋ฆฌ์ค ์ ๋ก๋ โ AI ๋ถ์ โ ๊ฐ์ ยท์ฝ์ ๋ฆฌํฌํธ |
| KPI ์นด๋ | ์ง๋ฌด๋ณ ํต์ฌ ์ญ๋ ์นด๋์ ๋ ์ด๋ ์ฐจํธ๋ก ๋ด ์ญ๋ ์๊ฐํ |
| ์ฑ์ฉ ๊ณต๊ณ ์ถ์ฒ | pgvector ๊ธฐ๋ฐ ์๋ฏธ ์ ์ฌ๋๋ก ๋ด ์ญ๋์ ๋ง๋ ์ฑ์ฉ ๊ณต๊ณ ์๋ ๋งค์นญ |
| ์คํฐ๋ | ์คํฐ๋ ์์ฑยท์ฐธ์ฌยท๋๋ฃ ํ๊ฐ, KPI ์ ์ฌ๋ ๊ธฐ๋ฐ ์คํฐ๋ ์ถ์ฒ |
| ์ปค๋ฎค๋ํฐ | ์ง๋ฌด๋ณ ๊ฒ์ํ, ๋๊ธ, ์ข์์, ์ธ๊ธฐ๊ธ ๋ญํน |
| ์์ ๋ก๊ทธ์ธ | Google ยท Kakao ยท Naver OAuth2 ์ง์ |
Swagger UI๋ฅผ ํตํด ์ ์ฒด API ๋ช ์ธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ก์ปฌ: http://localhost:8080/swagger-ui/index.html
- ํ๋ก๋์ : https://api.navik.kro.kr/swagger-ui/index.html
| ๊ทธ๋ฃน | Prefix | ์ค๋ช |
|---|---|---|
| Auth | /v1/auth |
ํ ํฐ ๊ฐฑ์ , ๋ก๊ทธ์์ |
| Users | /v1/users |
ํ๋กํ, ์จ๋ณด๋ฉ, ๋ง์ดํ์ด์ง |
| Abilities | /v1/abilities |
์ญ๋ ์กฐํ |
| Growth Logs | /v1/growth-logs |
์ฑ์ฅ ๋ก๊ทธ CRUD + AI ํ๊ฐ |
| Portfolios | /v1/portfolios |
ํฌํธํด๋ฆฌ์ค ๋ฑ๋ก + AI ๋ถ์ |
| KPI Cards | /v1/kpi-cards |
KPI ์นด๋ ์กฐํ, Top/Bottom |
| KPI Scores | /v1/kpi-scores |
๋ ์ด๋ ์ฐจํธ ๋ฐ์ดํฐ |
| Boards | /v1/boards |
๊ฒ์๊ธ CRUD, ์ธ๊ธฐ๊ธ, ๊ฒ์ |
| Comments | /v1/comments |
๋๊ธ CRUD |
| Studies | /v1/studies |
์คํฐ๋ ์์ฑยท์ฐธ์ฌยท์ถ์ฒ |
| Evaluations | /v1/evaluations |
๋๋ฃ ํ๊ฐ |
| Recruitments | /v1/recruitments |
์ฑ์ฉ ๊ณต๊ณ ์ถ์ฒ |
| Goals | /v1/goals |
๊ฐ์ธ ๋ชฉํ ๊ด๋ฆฌ |
| Notifications | /v1/notifications |
์๋ฆผ ์กฐํ |
[Limit/Offset Query] = Count Query + Limit/Offset๋ก ์ธํ ์ฑ๋ฅ ์ ํ
- OrderBy์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ ํ์ฉํ์ฌ Cursor ์กฐํฉ, ์กฐํ ์ฑ๋ฅ ๊ฐ์
[Client] โ [Main API Server] โ [Redis Stream] โ [Worker] โ [AI Server] (I/O)
โ
[DB ๊ฒฐ๊ณผ ์ ์ฅ]
- ์ฑ์ฅ ๋ก๊ทธ ํ๊ฐ, ํฌํธํด๋ฆฌ์ค ๋ถ์์ Redis Stream ๊ธฐ๋ฐ ๋น๋๊ธฐ Worker๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค
- Worker๋ poll ๋ฐฉ์์ผ๋ก Stream์ ์๋นํ๋ฉฐ, claim ๋ฉ์ปค๋์ฆ์ผ๋ก ์คํจํ ๋ฉ์์ง๋ฅผ ์ฌ์ฒ๋ฆฌํฉ๋๋ค
[Crawler Server] โ [Redis Stream] โ [Main API Server]
โ
[DB ๊ฒฐ๊ณผ ์ ์ฅ]
- ์ถ์ถ <-> ์ ์ฌ์ ๋ถ๋ฆฌ๋ก ๋จ์ผ ์ฅ์ ํฌ์ธํธ ์ ๊ฑฐ
- JdbcTemplate์ ํตํด ์ง์ Batch Insert Query๋ฅผ ์์ฑํ์ฌ ์ ์ฌ ์๋ ๊ฐ์
[Client] โ [HIT: Redis Cache] โ [MISS: REST API]
โ
[DB ์กฐํ]
- ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ ์บ์ฑ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
[Spring Actuator] โ [Prometheus] โ [Grafana]
- API ์์ฒญ ๋ฐ ์๋ต ์๋ ์๊ฐํ, p95, p99, ์ฟผ๋ฆฌ ๊ฐ์ ๋ฑ์ ์ง์ ํ์ธํ๋ฉฐ ๋ณ๋ชฉ ์ง์ ํ์
- ์ํธ ๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ๋ก ๋ณ๋ชฉ ์ง์ ์ฌ์ ํ์ ๋ฐ ๊ฐ์
- Repository ์กฐํ ์ Projection์ ์ ์ฉํ์ฌ N+1์ ์์ธ ์ ๊ฑฐ
- QueryDSL์ ํ์ฉํ์ฌ ๋์ ๊ฒ์ ํํฐ ์ฒ๋ฆฌ + ์ปดํ์ผ ํ์ ์์ ์ฑ ํ๋ณด
GitHub Actions๋ฅผ ํตํด ์๋ ๋ฐฐํฌ๋ฉ๋๋ค.
| ์ํฌํ๋ก | ํธ๋ฆฌ๊ฑฐ | ๋์ |
|---|---|---|
integrate.yml |
develop ๋ธ๋์น PR |
ํ ์คํธ ์คํ + merge ์๋ฎฌ๋ ์ด์ ๊ฒ์ฆ |
deploy.yml |
main ๋ธ๋์น push |
JAR ๋น๋ โ Docker โ ECR push โ EC2 ๋ฐฐํฌ |
๋ฐฐํฌ ํ Discord ์นํ ์ผ๋ก ๊ฒฐ๊ณผ ์๋ฆผ์ด ์ ์ก๋ฉ๋๋ค.
| @kjhh2605 GitHub |
@bmh7190 GitHub |
@kfdsy0103 GitHub |
@hardwoong GitHub |
@LeeJaeJun1 GitHub |
| โข Social/Notion OAuth ์ธ์ฆ ์ฒ๋ฆฌ โข ์ฑ์ฅ ๋ก๊ทธ ๋ถ์ ์๋ฒ ๋ด๋น โข ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ ๋ฒจ๋ง ์ค๊ณ |
โข AWS ์ธํ๋ผ ๋ฐ CI/CD ๊ตฌ์ถ โข ์ฑ์ฅ ๋ก๊ทธ API ๋ด๋น โข ๋น๋๊ธฐ ์์ปค ๋ก์ง ์ค๊ณ |
(Lead) โข ์ฑ์ฉ ๊ณต๊ณ ๊ด๋ จ, ๋น๋๊ธฐ ์ถ์ถ/์ ์ฌ ํ์ดํ๋ผ์ธ โข ๋ชจ๋ํฐ๋ง ํ๊ฒฝ ๊ตฌ์ถ |
โข FastAPI ๋ถ์ ์๋ฒ ๋ด๋น โข Few-Shot ํ๋กฌํํธ ํ์ฉ ์ผ์น์จ ๊ฐ์ |
โข ์์
๊ธฐ๋ฅ ๋ด๋น โข Redis ์บ์ฑ ์ฒ๋ฆฌ โข ์นด์ดํธ ์์์ ์ ์ด |
- Issues: GitHub Issues
- Organization: UMC 9th - NaviK Team



