







해커톤 팀 프로젝트 - 점진적 과부하와 공감 중점의 루틴 서비스
Habiglow는 해커톤 팀 프로젝트로 개발된 점진적 과부하와 공감 중점의 루틴 서비스입니다.
- 🏋️ 점진적 과부하 루틴 - 사용자 맞춤형 루틴 계획 생성 및 관리
- 🤝 공감 중점 소셜 기능 - 사용자 간 격려와 동기부여 시스템
- 🛡️ 안전한 소셜 인증 - OAuth2 기반 소셜 로그인 시스템
서비스 | URL | 용도 |
---|---|---|
🌐 Main API | http://localhost:8080 | REST API 서버 |
📚 Swagger | http://localhost:8080/api-docs | API 문서 |
🧪 Mock Login | http://localhost:8080/api/dev/auth/mock-login | 개발용 로그인 |
🗄️ Database | localhost:5432 | PostgreSQL (HabiDB) |
분류 | 기술 | 버전 | 역할 |
---|---|---|---|
Language | Java | 21 | 메인 개발 언어 |
Framework | Spring Boot | 3.5.5 | 백엔드 프레임워크 |
Security | Spring Security | 6.x | 보안 및 인증 |
Database | PostgreSQL | 15 | 메인 데이터베이스 |
ORM | JPA/Hibernate | - | 데이터 접근 계층 |
Build | Gradle | 8.5 | 빌드 도구 |
Container | Docker | - | 컨테이너화 |
Documentation | Swagger/OpenAPI | 3 | API 문서화 |
1. 클라이언트: 소셜 제공업체(Google/Naver/Kakao)에서 OAuth2 처리
2. 클라이언트: 소셜 액세스 토큰 획득
3. 클라이언트 → 서버: POST /api/auth/social/login (소셜 토큰 전송)
4. 서버: 소셜 토큰 검증 및 사용자 정보 추출
5. 서버: socialUniqueId 기반 회원 생성/조회
6. 서버: JWT 토큰 발급 (Access + Refresh)
7. 클라이언트: JWT 토큰으로 API 인증
habiglow/
├── 📁 src/main/java/com/groomthon/habiglow/
│ ├── 🚀 HabiglowApplication.java
│ ├── 📁 domain/
│ │ ├── 🔐 auth/ # 인증 도메인
│ │ │ ├── controller/ # 토큰 관리 API (AuthApiController, DevAuthController)
│ │ │ ├── service/ # 인증 비즈니스 로직 (AuthenticationService, RefreshTokenService 등)
│ │ │ ├── entity/ # RefreshToken, BlacklistedToken
│ │ │ ├── repository/ # 토큰 저장소 (RefreshTokenRepository, BlacklistedTokenRepository)
│ │ │ └── dto/ # 요청/응답 DTO (TokenResponse, MockLoginRequest, SocialLoginRequest)
│ │ │ ├── request/ # 요청 DTO
│ │ │ └── response/ # 응답 DTO
│ │ ├── 📅 daily/ # 일간 기록 도메인
│ │ │ ├── controller/ # 일간 기록 API (DailyRecordController)
│ │ │ ├── service/ # 일간 기록 비즈니스 로직
│ │ │ ├── entity/ # 일간 기록 엔티티
│ │ │ ├── repository/ # 일간 기록 저장소
│ │ │ ├── facade/ # 파사드 패턴 구현
│ │ │ ├── event/ # 도메인 이벤트
│ │ │ ├── exception/ # 도메인별 예외
│ │ │ └── dto/ # 일간 기록 DTO
│ │ │ ├── request/ # 요청 DTO (RoutinePerformanceRequest, SaveDailyRecordRequest)
│ │ │ ├── response/ # 응답 DTO (DailyRecordResponse)
│ │ │ └── error/ # 에러 DTO (InvalidRoutineError)
│ │ ├── 📊 dashboard/ # 대시보드 도메인
│ │ │ ├── controller/ # 대시보드 API
│ │ │ ├── service/ # 대시보드 비즈니스 로직
│ │ │ ├── entity/ # 대시보드 엔티티
│ │ │ ├── repository/ # 대시보드 저장소
│ │ │ ├── client/ # 외부 클라이언트 연동
│ │ │ ├── config/ # 대시보드 설정
│ │ │ ├── util/ # 유틸리티 클래스
│ │ │ └── dto/ # 대시보드 DTO
│ │ ├── 👤 member/ # 사용자 도메인
│ │ │ ├── controller/ # 사용자 CRUD API
│ │ │ ├── service/ # 사용자 비즈니스 로직
│ │ │ ├── entity/ # MemberEntity (socialUniqueId 포함)
│ │ │ ├── repository/ # 사용자 저장소
│ │ │ └── dto/ # 사용자 DTO
│ │ │ ├── request/ # 요청 DTO
│ │ │ └── response/ # 응답 DTO (MemberResponse)
│ │ ├── 🔔 notification/ # 알림 도메인
│ │ │ ├── controller/ # 알림 API
│ │ │ ├── service/ # 알림 비즈니스 로직
│ │ │ ├── entity/ # 알림 엔티티
│ │ │ ├── repository/ # 알림 저장소
│ │ │ ├── enums/ # 알림 관련 열거형
│ │ │ └── dto/ # 알림 DTO
│ │ │ ├── request/ # 요청 DTO
│ │ │ └── response/ # 응답 DTO
│ │ └── 🔄 routine/ # 루틴 도메인
│ │ ├── controller/ # 루틴 API
│ │ ├── service/ # 루틴 비즈니스 로직
│ │ │ └── strategy/ # 전략 패턴 구현
│ │ ├── entity/ # 루틴 엔티티
│ │ ├── repository/ # 루틴 저장소
│ │ ├── facade/ # 파사드 패턴 구현
│ │ ├── event/ # 도메인 이벤트
│ │ ├── common/ # 공통 유틸리티
│ │ └── dto/ # 루틴 DTO
│ │ ├── request/ # 요청 DTO
│ │ └── response/ # 응답 DTO
│ │ └── adaptation/ # 적응형 응답 DTO
│ └── 🌐 global/
│ ├── config/ # 글로벌 설정
│ │ └── properties/ # 설정 프로퍼티
│ ├── jwt/ # JWT 토큰 관리
│ ├── oauth2/ # OAuth2 소셜 로그인
│ │ ├── strategy/ # Google, Naver, Kakao 전략
│ │ ├── userInfo/ # 제공업체별 사용자 정보
│ │ ├── service/ # OAuth2 서비스
│ │ ├── entity/ # OAuth2 엔티티
│ │ └── dto/ # OAuth2 DTO
│ ├── security/ # 보안 설정
│ ├── response/ # 통합 응답 처리
│ ├── exception/ # 전역 예외 처리
│ │ └── jwt/ # JWT 관련 예외
│ ├── advice/ # 글로벌 어드바이스
│ ├── swagger/ # Swagger 설정
│ ├── fcm/ # FCM 푸시 알림
│ ├── entity/ # 글로벌 엔티티
│ ├── dto/ # 글로벌 DTO
│ └── util/ # 유틸리티 클래스
├── 📁 src/main/resources/
│ ├── application.yml # 메인 설정
│ ├── application-dev.yml # 개발환경 (Mock API 활성화)
│ └── application-prod.yml # 운영환경
├── 📁 api-docs/ # API 문서 디렉토리
│ ├── API_SPECIFICATION.md # 인증 API 명세서
│ └── ROUTINE_API_SPECIFICATION.md # 루틴 API 명세서
├── 🐳 docker-compose.yml # PostgreSQL + App 컨테이너
├── 📋 build.gradle # Gradle 빌드 설정
└── 📚 README.md # 프로젝트 문서
문서 | 설명 | 링크 |
---|---|---|
인증 API 명세서 | 소셜 로그인, JWT 토큰 관리 API | API_SPECIFICATION.md |
루틴 API 명세서 | 루틴 생성/관리, 성장 모드 API | ROUTINE_API_SPECIFICATION.md |
Swagger UI | 인터랙티브 API 테스트 | http://localhost:8080/api-docs |
커밋 메시지는 다음 규칙을 따릅니다:
타입(모듈): 메시지 내용
- 타입 (소문자):
- feat: 새로운 기능 추가
- fix: 버그 수정
- docs: 문서 수정
- style: 코드 포맷팅, 세미콜론 누락 등 (코드 변경 없음)
- refactor: 리팩토링 (기능 추가/변경 없음)
- test: 테스트 코드 추가/수정
- chore: 빌드 작업, 의존성 관리 등 기타 작업
예시:
feat(member): 회원 가입 API 구현
fix(auth): 토큰 만료 시간 오류 수정
docs(api): Swagger 문서 업데이트
브랜치는 이슈 번호와 연결하여 생성
형식: [이슈번호]-feature/설명, [이슈번호]-fix/설명 등
- 이슈 생성 -> development -> create a branch
예시:
23-feature/member-registration
45-hotfix/login-validation
67-chore/swagger-setup
// 클래스: PascalCase
public class UserApplicationService { }
// 메서드: camelCase (동사로 시작)
public void createUser() { }
public boolean isActive() { }
// 상수: UPPER_SNAKE_CASE
public static final String DEFAULT_ROLE = "USER";
// 패키지: 소문자 + 점
com.company.project.domain.user
// Request: 동사 + 도메인명 + Request
CreateUserRequest, UpdateUserRequest
// Response: 도메인명 + Response
UserResponse, UserListResponse
모든 API는 CommonApiResponse<T>
구조를 사용:
@Data
@AllArgsConstructor
public class CommonApiResponse<T> {
private String code; // 응답 코드 (성공: S###, 실패: E###)
private String message; // 사용자 친화적 메시지
private T data; // 실제 응답 데이터 (성공시), 에러 상세정보 (실패시)
}
성공 응답 예시:
{
"code": "S200",
"message": "성공",
"data": {
// 실제 응답 데이터
}
}
실패 응답 예시:
{
"code": "E400",
"message": "잘못된 입력값입니다",
"data": [
{
"key": "email",
"value": "invalid-email",
"reason": "올바른 이메일 형식이 아닙니다."
}
]
}
응답 코드 체계:
- S2xx: 성공 (S200, S201, S202 등)
- E4xx: 클라이언트 에러 (E400, E401, E404 등)
- E5xx: 서버 에러 (E500 등)
🌟 Habiglow - 해커톤 팀 프로젝트
점진적 과부하와 공감 중점의 루틴 서비스로 건강한 습관 형성을 돕는 플랫폼