미팅 매칭 서비스 미티의 서버
Kotlin + Spring Boot로 구축된 대학생 미팅 매칭 서비스 백엔드입니다.
| 영역 | 기술 |
|---|---|
| Language | Kotlin 1.9.22 |
| Framework | Spring Boot 3.2.3 |
| Database | PostgreSQL 16.2 |
| ORM | Spring Data JPA, Hibernate |
| Migration | Flyway |
| Security | Spring Security, JWT |
| Real-time | WebSocket (STOMP) |
| Push | Firebase Cloud Messaging (FCM) |
| API Docs | SpringDoc OpenAPI (Swagger UI) |
| Spring Mail (Gmail SMTP) |
src/main/kotlin/com/gcc/miti/
├── MitiApplication.kt # 애플리케이션 엔트리포인트
├── auth/ # 인증/인가 도메인
│ ├── controller/ # REST API 컨트롤러
│ ├── dto/ # 요청/응답 DTO
│ ├── entity/ # EmailVerification, RefreshToken
│ ├── repository/ # JPA 리포지토리
│ ├── security/ # JWT, Spring Security 설정
│ ├── service/ # 비즈니스 로직
│ └── utils/ # 유틸리티
├── user/ # 사용자 도메인
│ ├── entity/ # User, BannedUser, UserBlockList
│ └── ...
├── group/ # 미팅 그룹 도메인
│ ├── entity/ # Group, Party, PartyMember
│ └── ...
├── chat/ # 채팅 도메인
│ ├── entity/ # ChatMessage, LastReadChatMessage
│ └── ...
├── notification/ # 푸시 알림 도메인
│ ├── FCMConfig.kt # Firebase 설정
│ └── ...
├── report/ # 신고 도메인
├── archive/ # 아카이브 (삭제된 데이터 보관)
└── common/ # 공통 모듈
├── aop/ # AOP (로깅 등)
├── configuration/ # 설정 클래스
├── entity/ # BaseTimeEntity
├── exception/ # 예외 처리
└── webhook/ # 외부 연동
flowchart TB
subgraph Client["📱 클라이언트"]
Android["Android App"]
iOS["iOS App"]
end
subgraph Server["🖥️ Spring Boot Server"]
Controller["Controller Layer"]
Service["Service Layer"]
Repository["Repository Layer"]
Security["Security (JWT)"]
WebSocket["WebSocket (STOMP)"]
end
subgraph External["🌐 외부 서비스"]
FCM["Firebase Cloud Messaging"]
SMTP["Gmail SMTP"]
end
subgraph Database["🗄️ Database"]
PostgreSQL[(PostgreSQL 16.2)]
end
Android --> Controller
iOS --> Controller
Android <--> WebSocket
iOS <--> WebSocket
Controller --> Security
Security --> Service
Service --> Repository
Repository --> PostgreSQL
Service --> FCM
Service --> SMTP
erDiagram
User ||--o{ Group : "creates (leader)"
User ||--o{ PartyMember : "has"
User ||--o{ ChatMessage : "sends"
User ||--o{ UserBlockList : "blocks"
User ||--o| UserNotification : "has"
Group ||--o{ Party : "contains"
Group ||--o{ ChatMessage : "has"
Group ||--o{ LastReadChatMessage : "tracks"
Party ||--o{ PartyMember : "has"
Party }o--|| Group : "belongs to"
PartyMember }o--|| User : "refers to"
PartyMember }o--|| Party : "belongs to"
User {
string userId PK
string password
string nickname UK
string description
enum gender
enum height
enum weight
date birthDate
}
Group {
long id PK
string title
string description
int maxUsers
enum groupStatus
datetime meetDate
string meetPlace
}
Party {
long id PK
enum partyStatus
}
ChatMessage {
long id PK
string content
}
stateDiagram-v2
[*] --> OPEN: 그룹 생성
OPEN --> WAITING: 파티 신청
WAITING --> ACCEPTED: 리더가 수락
WAITING --> REJECTED: 리더가 거절
ACCEPTED --> CLOSE: 정원 도달
OPEN --> CLOSE: 정원 도달
CLOSE --> [*]: 미팅 완료
note right of WAITING
파티(Party)는 여러 사용자가
함께 미팅에 참여하기 위해
그룹에 신청하는 단위
end note
flowchart LR
subgraph Group["미팅 그룹"]
Leader["👑 리더"]
subgraph AcceptedParties["수락된 파티들"]
Party1["파티 A"]
Party2["파티 B"]
end
subgraph WaitingParties["대기중 파티들"]
Party3["파티 C"]
end
end
Leader --> |관리| AcceptedParties
Leader --> |수락/거절| WaitingParties
Member1["멤버 1"] --> Party1
Member2["멤버 2"] --> Party1
Member3["멤버 3"] --> Party2
서버 실행 후 Swagger UI에서 API 문서를 확인할 수 있습니다:
http://localhost:8080/swagger-ui.html
- Java 17 이상
- Docker (PostgreSQL 실행용)
-
저장소 클론
git clone https://github.com/GachonCodingClub/miti-backend.git cd miti-backend -
PostgreSQL 실행 (Docker)
docker-compose up -d
-
환경 변수 설정
-
서버 실행
./gradlew bootRun
| 변수명 | 설명 | 필수 |
|---|---|---|
DB_URL |
PostgreSQL 접속 URL | ✅ |
DB_PASSWORD |
데이터베이스 비밀번호 | ✅ |
PROFILE |
스프링 프로필 (dev, prod) |
✅ |
MAIL_URL |
Gmail 이메일 주소 | ✅ |
MAIL_PASSWORD |
Gmail 앱 비밀번호 | ✅ |
Note: Firebase 설정을 위해
firebase-admin서비스 계정 JSON 파일이 필요합니다.