Skip to content

Latest commit

Β 

History

464 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

TRYNA Backend

짧은 일정 속 λ§₯락을 μ΄ν•΄ν•˜κ³ , μ‹€μ œλ‘œ ν•„μš”ν•œ ν•  일을 μ œμ•ˆν•˜λŠ” 관계 기반 일정 관리 μ„œλΉ„μŠ€

πŸ“Œ About TRYNA

TRYNAλŠ” μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 짧은 일정 속 λ§₯락을 μ΄ν•΄ν•˜κ³ , 일정 전후에 μ‹€μ œλ‘œ ν•„μš”ν•œ ν•  일을 μ œμ•ˆν•˜λŠ” 일정 관리 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

같은 "회의"λΌλŠ” 일정이라도 전곡 νŒ€ν”Œ νšŒμ˜μ™€ 동아리 λ„€νŠΈμ›Œν‚Ή νšŒμ˜λŠ” μ‚¬μš©μžκ°€ μ€€λΉ„ν•΄μ•Ό ν•˜λŠ” 일이 λ‹€λ¦…λ‹ˆλ‹€.

TRYNAλŠ” μ΄λŸ¬ν•œ 차이λ₯Ό λ‹¨μˆœ ν‚€μ›Œλ“œ 맀칭으둜 μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
일정과 행동 μ‚¬μ΄μ˜ λ§₯락 관계λ₯Ό κ΅¬μ‘°ν™”ν•˜κ³ , 관계 기반으둜 후보λ₯Ό νƒμƒ‰ν•œ λ’€ μ‚¬μš©μžμ˜ κΈ°μ‘΄ 정보와 DB 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ‹€μ œλ‘œ ν•„μš”ν•œ ν•  일만 μ„ λ³„ν•©λ‹ˆλ‹€.

μ‚¬μš©μžλŠ” μΆ”μ²œλœ ν•  일을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  μˆ˜λ„ 있고, ν•„μš” μ—†λŠ” ν•­λͺ©μ„ μ‚­μ œν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ ν•­λͺ©μ„ 직접 μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘₯ Team

BE BE BE BE BE
κΉ€νƒœν˜„
@taehyeon1998
κΉ€νƒœλ¦Ό
@taerimiiii
윀예림
@yeremeee
μ„œλ™ν›ˆ
@hoondongseo
μœ λ‹€ν˜„
@Ubokchi

πŸ“š Tech Stacks

Type Tool
Language Java
Framework Spring Boot
ORM Spring Data JPA
Security Spring Security
Database PostgreSQL
API Documentation Swagger
In-Memory Store Valkey
Build Tool Gradle
Version Control Git GitHub
Collaboration Notion

πŸ‘₯ Roles

λ‹΄λ‹Ή μ˜μ—­ λ‹΄λ‹Ήμž λ‹΄λ‹Ή κΈ°λŠ₯
인증/μ‚¬μš©μž 사이먼/μ„œλ™ν›ˆ νšŒμ›Β·λΉ„νšŒμ› 인증, μ‚¬μš©μž 계정 관리, μ™ΈλΆ€μΊ˜λ¦°λ” 연동
일정/μΊ˜λ¦°λ” κ³€/κΉ€νƒœν˜„ 일정 CRUD, μΊ˜λ¦°λ” 쑰회, μžμ—°μ–΄ 일정 μž…λ ₯
뢄석/μΆ”μ²œ 레미/윀예림 일정 λ§₯락 뢄석, 관계 기반 μΆ”μ²œ, LLM 후보 μ •μ œ
μ€€λΉ„/μ‹€ν–‰ ν•­λͺ© 유볡치/μœ λ‹€ν˜„ μΆ”μ²œ ν•­λͺ© 관리, νƒœμŠ€ν¬ μ™„λ£Œ 처리, 라벨, μΌμ •Β·μΊ˜λ¦°λ” 연동
μ•Œλ¦Ό/외뢀연동/곡톡 라포/κΉ€νƒœλ¦Ό 일정 및 μ€€λΉ„/μ‹€ν–‰ν•­λͺ© μ•Œλ¦Ό, 인프라

✨ How It Works

μ‚¬μš©μž 일정 μž…λ ₯
       β”‚
       β–Ό
Rule Based Parser + Kiwi
       β”‚
       β”‚ 일정 정보 ꡬ쑰화
       β–Ό
Neo4j
       β”‚
       β”‚ 관계 기반 ν•  일 후보 탐색
       β–Ό
Upstage LLM
       β”‚
       β”‚ 쀑볡 톡합 및 λΆˆν•„μš”ν•œ 후보 제거
       β–Ό
μ‚¬μš©μž 맞좀 ν•  일 μ œμ•ˆ

1. 일정 μž…λ ₯

μ‚¬μš©μžκ°€ 짧은 일정 제λͺ©μ„ μž…λ ₯ν•©λ‹ˆλ‹€.

νŠΈλΌμ΄λ‚˜ 전체 λ―ΈνŒ…

2. 일정 λ§₯락 ꡬ쑰화

Rule Based Parser와 Kiwiλ₯Ό μ‚¬μš©ν•˜μ—¬ 짧은 일정 속 정보λ₯Ό κ΅¬μ‘°ν™”ν•©λ‹ˆλ‹€.

νŠΈλΌμ΄λ‚˜ β†’ ν”„λ‘œμ νŠΈ λ˜λŠ” κ·Έλ£Ή λ§₯락
λ―ΈνŒ…     β†’ 일정 μœ ν˜•
전체     β†’ λ―ΈνŒ…μ˜ λ²”μœ„

κ΅¬μ‘°ν™”λœ λ°μ΄ν„°λŠ” λ‹€μŒ λ‹¨κ³„μ˜ μΆ”μ²œ κ³Όμ •μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€.

{
  "title": "νŠΈλΌμ΄λ‚˜ 전체 λ―ΈνŒ…",
  "eventType": "meeting",
  "contextTags": [
    "group_meeting",
    "people_meeting"
  ],
  "project": "tryna",
  "date": null,
  "time": null,
  "location": null
}

3. 관계 기반 후보 탐색

κ΅¬μ‘°ν™”λœ 일정 μ •λ³΄λŠ” Neo4j κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

TRYNAλŠ” 일정과 행동 μ‚¬μ΄μ˜ 관계λ₯Ό κ·Έλž˜ν”„λ‘œ κ΄€λ¦¬ν•˜κ³ , ν˜„μž¬ 일정과 μ—°κ²°λœ ν•  일 후보λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ―ΈνŒ… μΌμ •μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 후보가 탐색될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆκ±΄ 정리
곡유 자료 μ€€λΉ„
회의둝 μ€€λΉ„
μž₯μ†Œ 확인
이동 μ‹œκ°„ 확인
κ΅ν†΅νŽΈ 확인
식당 후보 μ°ΎκΈ°
카페 후보 μ°ΎκΈ°
μ°Έμ„μž 확인

4. 후보 μ •μ œ

κ·Έλž˜ν”„μ—μ„œ νƒμƒ‰ν•œ λͺ¨λ“  후보λ₯Ό μ‚¬μš©μžμ—κ²Œ κ·ΈλŒ€λ‘œ λ³΄μ—¬μ£Όμ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

Upstage LLM이 λ‹€μŒ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ 후보λ₯Ό μ •μ œν•©λ‹ˆλ‹€.

  • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 일정 정보
  • μ‚¬μš©μžκ°€ 기쑴에 μž…λ ₯ν•œ 정보
  • DB에 μ €μž₯된 정보
  • Neo4jμ—μ„œ νƒμƒ‰λœ ν•  일 후보

이 κ³Όμ •μ—μ„œ μ˜λ―Έκ°€ κ²ΉμΉ˜λŠ” ν•­λͺ©μ„ λ¬Άκ³ , ν˜„μž¬ 일정에 λΆˆν•„μš”ν•œ ν•­λͺ©μ„ μ œκ±°ν•©λ‹ˆλ‹€.

5. ν•  일 μ œμ•ˆ

μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©μžκ°€ μ‹€μ œλ‘œ ν™œμš©ν•  κ°€λŠ₯성이 높은 λͺ‡ 개의 ν•  일만 μ œμ•ˆν•©λ‹ˆλ‹€.

β˜‘ λ―ΈνŒ… μ•ˆκ±΄ μ •λ¦¬ν•˜κΈ°
☐ μž₯μ†Œ 및 μ΄λ™μ‹œκ°„ 확인
☐ μ£Όλ³€ 식당 후보 μ„ μ •

μΆ”μ²œ κ²°κ³ΌλŠ” μžλ™μœΌλ‘œ κ°•μ œ μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μžλŠ” μΆ”μ²œλœ ν•  일을 자유둭게 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μΆ”μ²œ ν•­λͺ© μ‚¬μš©
  • ν•„μš” μ—†λŠ” ν•­λͺ© μ‚­μ œ
  • μƒˆλ‘œμš΄ ν•  일 직접 μΆ”κ°€

TRYNAλŠ” μΆ”μ²œμ„ μ •λ‹΅μœΌλ‘œ μ œμ‹œν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ‚¬μš©μžκ°€ λΆ€λ‹΄ 없이 받아듀이고 μˆ˜μ •ν•  수 μžˆλŠ” κ°€λ²Όμš΄ μ œμ•ˆμœΌλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.


πŸ”„ Recommendation Pipeline

Step Technology Responsibility
1 Rule Based Parser μΌμ •μ—μ„œ κ·œμΉ™ 기반 정보 μΆ”μΆœ
2 Kiwi ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ 뢄석 및 일정 λ§₯락 ꡬ쑰화
3 Neo4j 일정과 ν–‰λ™μ˜ 관계λ₯Ό 기반으둜 후보 탐색
4 Upstage LLM 쀑볡 후보 톡합 및 λΆˆν•„μš”ν•œ 후보 제거
5 TRYNA μ΅œμ’… ν•  일을 μˆ˜μ • κ°€λŠ₯ν•œ ν˜•νƒœλ‘œ 제곡

✨ Main Features

πŸ“… 일정 관리

  • μΊ˜λ¦°λ” 메인 쑰회
  • 일정 상세 쑰회
  • 일정 생성
  • 일정 μˆ˜μ •
  • 일정 μ‚­μ œ
  • μ‚¬μš©μžλ³„ 일정 관리

πŸ’¬ μžμ—°μ–΄ 일정 μž…λ ₯

  • 짧은 μžμ—°μ–΄ 일정 μž…λ ₯
  • 일정 μœ ν˜• 및 λ§₯락 뢄석
  • ν”„λ‘œμ νŠΈ 및 κ·Έλ£Ή 정보 μΆ”μΆœ
  • λ‚ μ§œ, μ‹œκ°„, μž₯μ†Œ 정보 ꡬ쑰화

πŸ•Έ 관계 기반 ν•  일 μΆ”μ²œ

  • 일정과 행동 μ‚¬μ΄μ˜ 관계 λͺ¨λΈλ§
  • Neo4j 기반 κ΄€λ ¨ ν•  일 후보 탐색
  • 일정 λ§₯락에 λ”°λ₯Έ 후보 ν™•μž₯
  • λ‹¨μˆœ ν‚€μ›Œλ“œ 맀칭을 λ„˜μ–΄μ„  관계 기반 μΆ”μ²œ

πŸ€– LLM 기반 후보 μ •μ œ

  • μ‚¬μš©μžμ˜ κΈ°μ‘΄ 정보 반영
  • DB 정보 기반 후보 μ •μ œ
  • μ˜λ―Έκ°€ κ²ΉμΉ˜λŠ” μΆ”μ²œ 톡합
  • λΆˆν•„μš”ν•œ μΆ”μ²œ 제거
  • μ‹€μ œ ν™œμš© κ°€λŠ₯성이 높은 ν•  일 선별

βœ… μ‚¬μš©μž ν”Όλ“œλ°±

  • μΆ”μ²œλœ ν•  일 μ‚¬μš©
  • λΆˆν•„μš”ν•œ μΆ”μ²œ μ‚­μ œ
  • ν•  일 직접 μΆ”κ°€
  • μΆ”μ²œ κ²°κ³Ό μˆ˜μ •
  • μ‚¬μš©μž λ³€κ²½ 정보 기둝

πŸ‘€ νšŒμ› 및 λΉ„νšŒμ› 지원

  • νšŒμ› μ‚¬μš©μž 인증 및 식별
  • λΉ„νšŒμ› μ‚¬μš©μž 식별
  • 인증 정보λ₯Ό 기반으둜 ν•œ 일정 쑰회 및 μ €μž₯
  • νšŒμ›Β·λΉ„νšŒμ› 곡톡 일정 API μ‚¬μš©

πŸ— Backend Architecture

img.png

Client
   β”‚
   β–Ό
Controller
   β”‚
   β–Ό
Service
   β”‚
   β”œβ”€β”€ 일정 관리
   β”œβ”€β”€ μ‚¬μš©μž 관리
   β”œβ”€β”€ μΆ”μ²œ κ²°κ³Ό 관리
   └── ν”Όλ“œλ°± 관리
   β”‚
   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β–Ό               β–Ό
Relational DB     Recommendation Pipeline
                   β”‚
                   β–Ό
            Rule Based Parser
                 + Kiwi
                   β”‚
                   β–Ό
                 Neo4j
                   β”‚
                   β–Ό
              Upstage LLM
                   β”‚
                   β–Ό
               ν•  일 μ œμ•ˆ

πŸ“‚ Package Structure

ν”„λ‘œμ νŠΈμ˜ κΈ°λ³Έ νŒ¨ν‚€μ§€ κ΅¬μ‘°λŠ” globalκ³Ό domain으둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

src/
└── main/
    β”œβ”€β”€ java/
    β”‚   └── ...
    β”‚       β”œβ”€β”€ global/
    β”‚       β”‚   β”œβ”€β”€ config/
    β”‚       β”‚   β”œβ”€β”€ exception/
    β”‚       β”‚   β”œβ”€β”€ response/
    β”‚       β”‚   β”œβ”€β”€ security/
    β”‚       β”‚   └── util/
    β”‚       β”‚
    β”‚       └── domain/
    β”‚           └── {domain}/
    β”‚               β”œβ”€β”€ controller/
    β”‚               β”‚   └── docs/
    β”‚               β”œβ”€β”€ service/
    β”‚               β”œβ”€β”€ repository/
    β”‚               β”œβ”€β”€ entity/
    β”‚               β”œβ”€β”€ enums/
    β”‚               └── dto/
    β”‚
    └── resources/
        β”œβ”€β”€ application.yaml
        β”œβ”€β”€ application-local.yaml
        β”œβ”€β”€ application-prod.yaml
        └── application-test.yaml

각 계측은 λ‹€μŒ 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

Layer Responsibility


Controller μš”μ²­ 및 응닡 처리 ControllerDocs Swagger API λ¬Έμ„œ μž‘μ„± Service λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 및 νŠΈλžœμž­μ…˜ 처리 Repository 데이터 μ ‘κ·Ό Entity 도메인 데이터 ν‘œν˜„ DTO API μš”μ²­ 및 응닡 데이터 전달


πŸ” Authentication

TRYNAλŠ” 인증 정보λ₯Ό 기반으둜 μ‚¬μš©μžλ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€.

Authorization: Bearer {token}

νšŒμ›κ³Ό λΉ„νšŒμ› λͺ¨λ‘ 인증 정보λ₯Ό 톡해 μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜λ©°, 일정 APIμ—μ„œλŠ” 인증된 μ‚¬μš©μž 정보λ₯Ό κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜κ³  μ €μž₯ν•©λ‹ˆλ‹€.


πŸ”— API Convention

API κ²½λ‘œλŠ” λ‹€μŒ ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

/api/v1/{resources}

λ¦¬μ†ŒμŠ€λͺ…은 λ³΅μˆ˜ν˜• λͺ…사λ₯Ό μ‚¬μš©ν•˜λ©°, λ™μž‘μ€ URL이 μ•„λ‹Œ HTTP Method둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

Method Purpose


GET 쑰회 POST 생성 PATCH 일뢀 μˆ˜μ • DELETE μ‚­μ œ


πŸ“¦ Common Response

Success

{
  "success": true,
  "code": "COMMON_200",
  "message": "μš”μ²­μ— μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "data": {}
}

Error

{
  "success": false,
  "code": "COMMON_400",
  "message": "잘λͺ»λœ μš”μ²­μž…λ‹ˆλ‹€.",
  "data": null
}

응닡 데이터가 μ—†λŠ” 경우 dataλŠ” null둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.


πŸ“– API Documentation

API λ¬Έμ„œλŠ” Swagger와 OpenAPIλ₯Ό 기반으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

μ‹€μ œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” Controller와 API λ¬Έμ„œλ₯Ό λ‹΄λ‹Ήν•˜λŠ” ControllerDocsλ₯Ό λΆ„λ¦¬ν•©λ‹ˆλ‹€.

domain/
└── {domain}/
    └── controller/
        β”œβ”€β”€ XxxController
        └── docs/
            └── XxxControllerDocs

APIκ°€ λ³€κ²½λ˜λ©΄ Controller와 ControllerDocsλ₯Ό ν•¨κ»˜ μˆ˜μ •ν•©λ‹ˆλ‹€.


βš™οΈ Environment Configuration

ν™˜κ²½λ³„ μ„€μ • νŒŒμΌμ€ λ‹€μŒκ³Ό 같이 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

application.yaml        # 곡톡 μ„€μ •
application-local.yaml  # 둜컬 ν™˜κ²½
application-prod.yaml   # 운영 ν™˜κ²½
application-test.yaml   # ν…ŒμŠ€νŠΈ ν™˜κ²½

민감 μ •λ³΄λŠ” ν™˜κ²½ λ³€μˆ˜ λ˜λŠ” λ³„λ„μ˜ 둜컬 μ„€μ • νŒŒμΌμ„ 톡해 κ΄€λ¦¬ν•˜λ©° Git에 μ»€λ°‹ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

⚠️ .env, 인증 정보, API Key, λ°μ΄ν„°λ² μ΄μŠ€ λΉ„λ°€λ²ˆν˜Έ λ“±μ˜ 민감 μ •λ³΄λŠ” μ €μž₯μ†Œμ— μ»€λ°‹ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


🌿 Git Convention

Branch Naming

type/nickname/issueNumber-task
feat/nickname/1-create-event
bug/nickname/2-calendar-response
docs/nickname/3-api-docs

Commit Message

type: subject
feat: 일정 생성 API μΆ”κ°€
bug: μΊ˜λ¦°λ” 쑰회 였λ₯˜ μˆ˜μ •
docs: README μž‘μ„±
refactor: 일정 μ„œλΉ„μŠ€ ꡬ쑰 κ°œμ„ 

Merge Flow

feat/*      ─┐
bug/*        β”‚
docs/*       β”‚
style/*      β”œβ”€β”€> develop ──> main
refactor/*   β”‚
chore/*     β”€β”˜

hotfix/* ──> main
         └─> develop

main λΈŒλžœμΉ˜μ—λŠ” 직접 μž‘μ—…ν•˜μ§€ μ•ŠμœΌλ©°, PR은 AI μ½”λ“œ 리뷰 확인 ν›„ λ³‘ν•©ν•©λ‹ˆλ‹€.


About

tryna spring boot repository

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages