딸깍팩 서버
Spring Boot 3.5 + Java 21, 헥사고날 아키텍처(포트 & 어댑터) 기반 멀티모듈 Gradle 프로젝트.
app-api → usecase, domain, infra
infra → usecase, domain
usecase → domain
domain → (없음)
| 모듈 |
역할 |
Spring |
domain |
순수 도메인 모델 (User, UserId, AuthProvider) |
금지 |
usecase |
비즈니스 로직 + 포트 인터페이스. @Service / @Transactional 금지 |
금지 |
infra |
포트 구현체 — JPA, Google OAuth, JWT 발급 |
허용 |
app-api |
실행 모듈 — REST 컨트롤러, Security, Composition Root |
허용 |
- Java 21, Spring Boot 3.5.10, Gradle
- DB: H2 인메모리 (MySQL 호환 모드) — local 프로파일
- 인증: Google OAuth 2.0 (ID Token 검증), JWT HS256 발급
- JWT 라이브러리: Nimbus-JOSE-JWT
| 변수 |
설명 |
AUTH_TOKEN_SECRET |
JWT 서명 키 (최소 32바이트) |
GOOGLE_CLIENT_ID |
Google OAuth 클라이언트 ID |
GOOGLE_CLIENT_SECRET |
Google OAuth 클라이언트 시크릿 |
# 컴파일 확인
./gradlew compileJava
# 로컬 프로파일로 실행
./gradlew :app-api:bootRun --args='--spring.profiles.active=local'
H2 콘솔: http://localhost:8080/h2-console
JDBC URL: jdbc:h2:mem:clickypackserver
| Method |
Path |
설명 |
POST |
/v0/auth/oauth/{provider}/login |
OAuth 로그인 / 회원가입 |
POST /v0/auth/oauth/google/login
{
"code": "4/0AfJohXn...",
"redirectUri": "com.clickypack:/oauth2redirect",
"codeVerifier": "..."
}
{
"accessToken": "eyJhbGci...",
"registered": true
}
com.clickypack
├── domain
│ └── user.model # User, UserId, AuthProvider
├── usecase
│ └── auth
│ ├── oauth
│ │ ├── command # OAuthLoginCommand
│ │ ├── port.in # OAuthLoginUseCase
│ │ ├── port.out # OAuthProviderClientPort, TokenIssuer
│ │ ├── result # OAuthLoginResult
│ │ └── service # OAuthLoginService
│ └── user.port.out # UsersRepositoryPort
├── infra
│ └── auth
│ ├── oauth # GoogleOAuthTokenClient, GoogleIdTokenVerifier
│ └── token # JwtTokenIssuer, AuthTokenProperties
└── appapi
├── auth # AuthController
├── config # UsecaseConfig (Composition Root)
└── security.config # SecurityConfig