Skip to content

UMC9th-NaviK/NaviK-BE-Spring

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

944 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

NaviK Backend

AI ๊ธฐ๋ฐ˜ ์ปค๋ฆฌ์–ด ์„ฑ์žฅ ์ถ”์  ํ”Œ๋žซํผ 'NaviK'์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค!

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

NaviK์€ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์˜ ์„ฑ์žฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ , AI๋ฅผ ํ™œ์šฉํ•ด ์—ญ๋Ÿ‰์„ ๋ถ„์„๋ฐ›์œผ๋ฉฐ, ๋งž์ถคํ˜• ์ฑ„์šฉ ๊ณต๊ณ ์™€ ์Šคํ„ฐ๋””๋ฅผ ์ถ”์ฒœ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ปค๋ฆฌ์–ด ์„ฑ์žฅ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

img_4.png img_3.png

๐Ÿš€ ์„œ๋น„์Šค ๋ฐ”๋กœ๊ฐ€๊ธฐ ย  ยท ย  ๐Ÿ“˜ API ๋ฌธ์„œ (Swagger)

๐Ÿงญ ์ด๋Ÿฐ ๋ถ„์—๊ฒŒ NaviK์„ ์ถ”์ฒœํ•ด์š”!

  • "๊ธฐ๋ก์€ ๋งŽ์€๋ฐ ์ €์˜ ์—ญ๋Ÿ‰์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”!"
  • "๋‚˜์—๊ฒŒ ์–ด์šธ๋ฆฌ๋Š” ์ฑ„์šฉ๊ณต๊ณ ๋ฅผ ์ฐพ๊ณ ์‹ถ์–ด์š”!"
  • "๋‚˜์˜ ์œ„์น˜๋ฅผ ๊ฐ๊ด€์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์‹ถ์–ด์š”!"
  • "์ปค๋ฆฌ์–ด์˜ ๋‚˜์นจ๋ฐ˜์ด ํ•„์š”ํ•ด์š”!"

๐Ÿ” Why?

  • ์„ฑ์žฅ ๊ธฐ๋ก์ด ํŒŒํŽธํ™”๋˜์–ด ์žˆ์–ด ๋ณธ์ธ์˜ ์—ญ๋Ÿ‰ ๋ณ€ํ™”๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ์ง๋ฌด๋ณ„ ํ•ต์‹ฌ ์—ญ๋Ÿ‰(KPI)๊ณผ ๋‚ด ํ˜„์žฌ ์ˆ˜์ค€์˜ ๊ฐญ์„ ๊ฐ๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฑ„์šฉ ๊ณต๊ณ ยท์Šคํ„ฐ๋””๋ฅผ ์ง์ ‘ ์ฐพ์•„์•ผ ํ•ด์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

๐Ÿ” What?

  • ์„ฑ์žฅ ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด AI๊ฐ€ ์ง๋ฌด KPI ๊ธฐ์ค€์œผ๋กœ ํ‰๊ฐ€ํ•ด ์ ์ˆ˜๋ฅผ ๋งค๊ฒจ ๊ฐ๊ด€์ ์ธ ๋‚˜์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด AI ๋ถ„์„์„ ํ†ตํ•ด ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฐ•์ ยท์•ฝ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒกํ„ฐ ์˜๋ฏธ ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด ์—ญ๋Ÿ‰์— ๋งž๋Š” ์ฑ„์šฉ ๊ณต๊ณ ยท์Šคํ„ฐ๋””๋ฅผ ์ž๋™ ์ถ”์ฒœํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ“š ๋ชฉ์ฐจ

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

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 ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ›  ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

img.png

์ „์ฒด ํ๋ฆ„๋„

[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/ํฌ๋กค๋ง)

1. Main API ์„œ๋ฒ„ (Public Subnet)

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
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)

2. ์ฑ„์šฉ ๊ณต๊ณ  ํฌ๋กค๋ง ๋ฐ ์„ฑ์žฅ ๊ธฐ๋ก ๋ถ„์„ ์„œ๋ฒ„ (Private Subnet)

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
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

3. ์ด๋ ฅ์„œ ๋ถ„์„ ์„œ๋ฒ„ (Private Subnet)

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
Language Python 3.11
Framework FastAPI
์ด๋ ฅ์„œ ๋ถ„์„ OpenAI

๐Ÿง  ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ๋„์ž… ์ด์œ 

1. Main API ์„œ๋ฒ„ (Public Subnet)

์ฃผ์š” ์—ญํ•  : ์„œ๋น„์Šค ์‚ฌ์šฉ์ž์˜ ์ง์ ‘์ ์ธ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ -> Public Subnet


Category Stack ๋„์ž… ์ด์œ 
Web Framework Spring MVC REST API ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Security Spring Security JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐ ์—ญํ• ๋ณ„ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Authentication JWT ๋ฌด์ƒํƒœ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Category Stack ๋„์ž… ์ด์œ 
RDBMS PostgreSQL ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •ํ•ฉ์„ฑ์„ ๊ฐ–์ถ˜ DB, ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™•์žฅ์œผ๋กœ ์˜๋ฏธ ๊ธฐ๋ฐ˜ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Cache/Stream Redis ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑ, I/O ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Stream ์ž๋ฃŒ๊ตฌ์กฐ ํ™œ์šฉ
Category Stack ๋„์ž… ์ด์œ 
Compute AWS EC2 ์„œ๋น„์Šค ์‚ฌ์šฉ์ž์˜ ํŠธ๋ž˜ํ”ฝ ์ฃผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ์‚ฌ์šฉ
Database Amazon RDS ์•ˆ์ •์ ์ธ ์šด์˜๊ณผ ๋ฐฑ์—…/๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋„์ž…
Object Storage AWS S3 Presigned URL์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ ฅ์„œ๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Category Stack ๋„์ž… ์ด์œ 
Reverse Proxy Nginx HTTPS ์ฒ˜๋ฆฌ ๋ฐ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์„ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Container Docker ํ™˜๊ฒฝ ์ฐจ์ด ์—†์ด ๋™์ผํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ
CI/CD GitHub Actions ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
Monitoring Grafana ์„œ๋ฒ„ ์ž์›๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Metrics Prometheus ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜์—ฌ ์„ฑ๋Šฅ ์ด์ƒ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ธฐ์— ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…

2. ์ฑ„์šฉ ๊ณต๊ณ  ํฌ๋กค๋ง ๋ฐ ์„ฑ์žฅ ๊ธฐ๋ก ๋ถ„์„ ์„œ๋ฒ„ (Private Subnet)

์ฃผ์š” ์—ญํ•  : ์™ธ๋ถ€ IO๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—… (OpenAI, NaverOCR, ์ฑ„์šฉ ๊ณต๊ณ  ์Šคํฌ๋ž˜ํ•‘)


> ์„œ๋น„์Šค ์‚ฌ์šฉ์ž์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š๊ณ  Server to Server ์ด๋ฏ€๋กœ -> Private
Category Stack ๋„์ž… ์ด์œ 
Web Framework Spring MVC REST API ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
AI Framework Spring AI ์Šคํ”„๋ง ํ™˜๊ฒฝ์—์„œ ๊ฐ„ํŽธํ•œ ์ ์šฉ์œผ๋กœ LLM ๋ฐ Embedding ํ™œ์šฉ์„ ์œ„ํ•จ
Category Stack ๋„์ž… ์ด์œ 
Library Selenium ์ฑ„์šฉ ๊ณต๊ณ  ์‚ฌ์ดํŠธ์˜ ๋™์  ํฌ๋กค๋ง ์ž‘์—…์„ ์œ„ํ•จ
External API OpenAI ๋น„์šฉ์„ ์šฐ์„  ๊ณ ๋ ค, ๋ถ„์„ ํ’ˆ์งˆ ๋Œ€๋น„ ๋น„์šฉ ํšจ์œจ์ด ์ค€์ˆ˜ํ•œ '4.1-mini' ์‚ฌ์šฉ, ์ž„๋ฒ ๋”ฉ์€ 'small' ๋ชจ๋ธ ์‚ฌ์šฉ
External API Naver Clova OCR ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ํ™•์žฅ์ž์— ๋Œ€ํ•œ OCR ๊ธฐ๋Šฅ์„ ์ œ๊ณต
Category Stack ๋„์ž… ์ด์œ 
Stream Redis ์‚ฌ์šฉ์ž์˜ Notion Token ์บ์‹ฑ, ํฌ๋กค๋ง๋œ ์ฑ„์šฉ๊ณต๊ณ ์˜ ๋ฒ„ํผ๋กœ ํ™œ์šฉ
Category Stack ๋„์ž… ์ด์œ 
Compute AWS EC2 Main ์„œ๋ฒ„์˜ ์š”์ฒญ์„ ์ฃผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ์‚ฌ์šฉ
Category Stack ๋„์ž… ์ด์œ 
Container Docker ํ™˜๊ฒฝ ์ฐจ์ด ์—†์ด ๋™์ผํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ
CI/CD GitHub Actions ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

3. ์ด๋ ฅ์„œ ๋ถ„์„ ์„œ๋ฒ„ (Private Subnet)

์ฃผ์š” ์—ญํ•  : ํŒŒ์ผ ์œ ํ˜•์ด ๋Š˜์–ด๋‚˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€๋น„, 'ํŒŒ์ผ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒํƒœ๊ณ„'๊ฐ€ ํ’๋ถ€ํ•œ ํŒŒ์ด์ฌ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ


> ์™ธ๋ถ€ IO ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌ (OpenAI) -> Private Subnet ---
Category Stack ๋„์ž… ์ด์œ 
Web Framework FastAPI ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์—์„œ REST API ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
External API OpenAI ๋น„์šฉ์„ ์šฐ์„  ๊ณ ๋ ค, ๋ถ„์„ ํ’ˆ์งˆ ๋Œ€๋น„ ๋น„์šฉ ํšจ์œจ์ด ์ค€์ˆ˜ํ•œ '4.1-mini' ์‚ฌ์šฉ, ์ž„๋ฒ ๋”ฉ์€ 'small' ๋ชจ๋ธ ์‚ฌ์šฉ
Category Stack ๋„์ž… ์ด์œ 
Compute AWS EC2 Main ์„œ๋ฒ„์˜ ์š”์ฒญ์„ ์ฃผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ์‚ฌ์šฉ
Category Stack ๋„์ž… ์ด์œ 
Container Docker ํ™˜๊ฒฝ ์ฐจ์ด ์—†์ด ๋™์ผํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ
CI/CD GitHub Actions ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

๐Ÿงฉ ERD

img_2.png

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ ์†Œ๊ฐœ

๊ธฐ๋Šฅ ์„ค๋ช…
์„ฑ์žฅ ๋กœ๊ทธ ํ™œ๋™ยทํ•™์Šตยท์„ฑ๊ณผ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  AI ํ‰๊ฐ€(๋น„๋™๊ธฐ Worker)๋ฅผ ๋ฐ›์•„ KPI ์ ์ˆ˜์— ๋ฐ˜์˜ (Text, PDF, Notion, Github PR ๋ถ„์„ ์ง€์›)
ํฌํŠธํด๋ฆฌ์˜ค ๋ถ„์„ PDF/ํ…์ŠคํŠธ ํฌํŠธํด๋ฆฌ์˜ค ์—…๋กœ๋“œ โ†’ AI ๋ถ„์„ โ†’ ๊ฐ•์ ยท์•ฝ์  ๋ฆฌํฌํŠธ
KPI ์นด๋“œ ์ง๋ฌด๋ณ„ ํ•ต์‹ฌ ์—ญ๋Ÿ‰ ์นด๋“œ์™€ ๋ ˆ์ด๋” ์ฐจํŠธ๋กœ ๋‚ด ์—ญ๋Ÿ‰ ์‹œ๊ฐํ™”
์ฑ„์šฉ ๊ณต๊ณ  ์ถ”์ฒœ pgvector ๊ธฐ๋ฐ˜ ์˜๋ฏธ ์œ ์‚ฌ๋„๋กœ ๋‚ด ์—ญ๋Ÿ‰์— ๋งž๋Š” ์ฑ„์šฉ ๊ณต๊ณ  ์ž๋™ ๋งค์นญ
์Šคํ„ฐ๋”” ์Šคํ„ฐ๋”” ์ƒ์„ฑยท์ฐธ์—ฌยท๋™๋ฃŒ ํ‰๊ฐ€, KPI ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ์Šคํ„ฐ๋”” ์ถ”์ฒœ
์ปค๋ฎค๋‹ˆํ‹ฐ ์ง๋ฌด๋ณ„ ๊ฒŒ์‹œํŒ, ๋Œ“๊ธ€, ์ข‹์•„์š”, ์ธ๊ธฐ๊ธ€ ๋žญํ‚น
์†Œ์…œ ๋กœ๊ทธ์ธ Google ยท Kakao ยท Naver OAuth2 ์ง€์›

๐Ÿ“š ์ฃผ์š” API ๊ทธ๋ฃน

Swagger UI๋ฅผ ํ†ตํ•ด ์ „์ฒด API ๋ช…์„ธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฃน 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 ์•Œ๋ฆผ ์กฐํšŒ

๐Ÿ›  ๊ธฐ์ˆ ์  ์‹œ๋„

1. Cursor ๊ธฐ๋ฐ˜ ์กฐํšŒ ์ฟผ๋ฆฌ

[Limit/Offset Query] = Count Query + Limit/Offset๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜
  • OrderBy์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์„ ํ™œ์šฉํ•˜์—ฌ Cursor ์กฐํ•ฉ, ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„ 

2. ๋น„๋™๊ธฐ Worker ์•„ํ‚คํ…์ฒ˜

[Client] โ†’ [Main API Server] โ†’ [Redis Stream] โ†’ [Worker] โ†’ [AI Server] (I/O) 
                                                    โ†“
                                              [DB ๊ฒฐ๊ณผ ์ €์žฅ]
  • ์„ฑ์žฅ ๋กœ๊ทธ ํ‰๊ฐ€, ํฌํŠธํด๋ฆฌ์˜ค ๋ถ„์„์€ Redis Stream ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ Worker๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค
  • Worker๋Š” poll ๋ฐฉ์‹์œผ๋กœ Stream์„ ์†Œ๋น„ํ•˜๋ฉฐ, claim ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‹คํŒจํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์žฌ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค

3. ์ฑ„์šฉ ๊ณต๊ณ  ๋น„๋™๊ธฐ ์ถ”์ถœ&์ ์žฌ ํŒŒ์ดํ”„๋ผ์ธ

[Crawler Server] โ†’ [Redis Stream] โ†’ [Main API Server]
                                           โ†“
                                      [DB ๊ฒฐ๊ณผ ์ €์žฅ]
  • ์ถ”์ถœ <-> ์ ์žฌ์˜ ๋ถ„๋ฆฌ๋กœ ๋‹จ์ผ ์žฅ์•  ํฌ์ธํŠธ ์ œ๊ฑฐ
  • JdbcTemplate์„ ํ†ตํ•ด ์ง์ ‘ Batch Insert Query๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ ์žฌ ์†๋„ ๊ฐœ์„ 

4. Redis ์บ์‹ฑ์„ ํ™œ์šฉํ•œ ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„ 

[Client] โ†’ [HIT: Redis Cache] โ†’ [MISS: REST API]
                                       โ†“
                                    [DB ์กฐํšŒ]
  • ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ 

5. ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„ ๊ตฌ์ถ•

[Spring Actuator] โ†’ [Prometheus] โ†’ [Grafana]
  • API ์š”์ฒญ ๋ฐ ์‘๋‹ต ์†๋„ ์‹œ๊ฐํ™”, p95, p99, ์ฟผ๋ฆฌ ๊ฐœ์ˆ˜ ๋“ฑ์„ ์ง์ ‘ ํ™•์ธํ•˜๋ฉฐ ๋ณ‘๋ชฉ ์ง€์  ํŒŒ์•…

6. ๊ทธ ๋ฐ–์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์‹œ๋„

  • ์ƒํ˜ธ ๊ฐ„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋กœ ๋ณ‘๋ชฉ ์ง€์  ์‚ฌ์ „ ํŒŒ์•… ๋ฐ ๊ฐœ์„ 
  • 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 ์บ์‹ฑ ์ฒ˜๋ฆฌ
โ€ข ์นด์šดํŠธ ์›์ž์  ์ œ์–ด

Support

Credits

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages