Skip to content

FlipNoteTeam/FlipNote-User

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

54 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“’ FlipNote β€” User Service

FlipNote μ„œλΉ„μŠ€μ˜ μœ μ € 도메인 λ°±μ—”λ“œ λ ˆν¬μ§€ν† λ¦¬μž…λ‹ˆλ‹€.

Spring Boot Java MySQL Redis Deploy


πŸ“‘ λͺ©μ°¨


πŸš€ μ‹œμž‘ν•˜κΈ°

사전 μš”κ΅¬μ‚¬ν•­

  • Java 21 이상
  • Gradle 8 이상
  • MySQL 8 이상
  • Redis 6 이상
  • Google OAuth2 ν΄λΌμ΄μ–ΈνŠΈ 생성 및 API ν‚€ λ°œκΈ‰
  • Resend 계정 생성 및 API ν‚€ λ°œκΈ‰

μ„€μΉ˜

# μ˜μ‘΄μ„± μ„€μΉ˜ 및 λΉŒλ“œ
./gradlew build -x test

πŸ” ν™˜κ²½ λ³€μˆ˜

application.ymlμ—μ„œ μ°Έμ‘°ν•˜λŠ” ν™˜κ²½ λ³€μˆ˜ λͺ©λ‘μž…λ‹ˆλ‹€. 둜컬 μ‹€ν–‰ μ‹œ .env λ˜λŠ” IDE μ‹€ν–‰ ꡬ성에 μ•„λž˜ λ³€μˆ˜λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

# ─── Database ───────────────────────────────────────────
DB_URL=jdbc:mysql://localhost:3306/flipnote_user
DB_USERNAME=
DB_PASSWORD=

# ─── Redis ──────────────────────────────────────────────
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=

# ─── JPA ────────────────────────────────────────────────
# create | create-drop | update | validate | none
DDL_AUTO=update

# ─── gRPC ───────────────────────────────────────────────
GRPC_PORT=9092

# ─── JWT ────────────────────────────────────────────────
JWT_SECRET=
# μ•‘μ„ΈμŠ€ 토큰 만료 μ‹œκ°„ (ms), κΈ°λ³Έκ°’ 900000 (15λΆ„)
JWT_ACCESS_EXPIRATION=900000
# λ¦¬ν”„λ ˆμ‹œ 토큰 만료 μ‹œκ°„ (ms), κΈ°λ³Έκ°’ 604800000 (7일)
JWT_REFRESH_EXPIRATION=604800000

# ─── Email (Resend) ─────────────────────────────────────
APP_RESEND_API_KEY=

# ─── Client ─────────────────────────────────────────────
# ν”„λ‘ νŠΈμ—”λ“œ URL (CORS, λ¦¬λ‹€μ΄λ ‰νŠΈμ— μ‚¬μš©)
APP_CLIENT_URL=http://localhost:3000

# ─── Google OAuth2 ──────────────────────────────────────
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

⚠️ 주의: ν™˜κ²½ λ³€μˆ˜ νŒŒμΌμ€ μ ˆλŒ€ git에 μ»€λ°‹ν•˜μ§€ λ§ˆμ„Έμš”. .gitignore에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ λ°˜λ“œμ‹œ ν™•μΈν•˜μ„Έμš”.


πŸ–₯️ μ‹€ν–‰ 및 배포

둜컬 개발 μ„œλ²„ μ‹€ν–‰

./gradlew bootRun

기본적으둜 http://localhost:8081μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. Swagger UIλŠ” http://localhost:8081/users/swagger-ui.htmlμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œλ•μ…˜ λΉŒλ“œ

./gradlew bootJar

build/libs/user-0.0.1-SNAPSHOT.jar 파일이 μƒμ„±λ©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μ‹€ν–‰

./gradlew test

Docker 이미지 λΉŒλ“œ 및 μ‹€ν–‰

# 이미지 λΉŒλ“œ
docker build -t flipnote-user .

# μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker run -p 8081:8081 \
  -e DB_URL=... \
  -e JWT_SECRET=... \
  flipnote-user

배포 (GitHub Actions)

main λΈŒλžœμΉ˜μ— push μ‹œ GitHub Actionsκ°€ μžλ™μœΌλ‘œ μ•„λž˜ 과정을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

CI (push / pull_request β†’ main)

  1. JDK 21 μ„€μΉ˜
  2. ./gradlew build -x test β€” λΉŒλ“œ 검증
  3. ./gradlew test β€” ν…ŒμŠ€νŠΈ μ‹€ν–‰
  4. Dependency-Check β€” 취약점 뢄석 리포트 생성

CD (push β†’ main)

  1. GitHub Container Registry(GHCR) 둜그인
  2. Docker 이미지 λΉŒλ“œ
  3. ghcr.io/dungbik/flipnote-user 이미지 Push

배포에 ν•„μš”ν•œ μ‹œν¬λ¦Ώ(ORG_PAT)은 GitHub Repository β†’ Settings β†’ Secrets and variables β†’ Actions에 등둝해야 ν•©λ‹ˆλ‹€.


πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

  • κ°„λž΅ν™” 버전

    src/main/java/flipnote/user/
    β”œβ”€β”€ domain/          # 도메인 λ ˆμ΄μ–΄ (μ—”ν‹°ν‹°, λ ˆν¬μ§€ν† λ¦¬, μ—λŸ¬μ½”λ“œ, 이벀트)
    β”œβ”€β”€ application/     # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆμ΄μ–΄ (μ„œλΉ„μŠ€, μ»€λ§¨λ“œ, κ²°κ³Ό 객체)
    β”œβ”€β”€ infrastructure/  # 인프라 λ ˆμ΄μ–΄ (JWT, Redis, 메일, OAuth, μ„€μ •)
    └── interfaces/      # μΈν„°νŽ˜μ΄μŠ€ λ ˆμ΄μ–΄ (HTTP, gRPC μ§„μž…μ )
    
FlipNote-User/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main/
β”‚   β”‚   β”œβ”€β”€ java/flipnote/user/
β”‚   β”‚   β”‚   β”œβ”€β”€ UserApplication.java
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€ domain/                                # 도메인 λ ˆμ΄μ–΄
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ common/                            # 도메인 곡톡
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ErrorCode.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ BizException.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── EmailSendException.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ entity/                            # JPA μ—”ν‹°ν‹°
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ User.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ OAuthLink.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── BaseEntity.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ repository/                        # λ ˆν¬μ§€ν† λ¦¬ μΈν„°νŽ˜μ΄μŠ€
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserRepository.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── OAuthLinkRepository.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ event/                             # 도메인 이벀트
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ EmailVerificationSendEvent.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── PasswordResetCreateEvent.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AuthErrorCode.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserErrorCode.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ImageErrorCode.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TokenClaims.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TokenPair.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ PasswordResetConstants.java
β”‚   β”‚   β”‚   β”‚   └── VerificationConstants.java
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€ application/                           # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆμ΄μ–΄
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ command/                           # μ„œλΉ„μŠ€ μž…λ ₯ μ»€λ§¨λ“œ (검증 μ–΄λ…Έν…Œμ΄μ…˜ μ—†μŒ)
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ SignupCommand.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ LoginCommand.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ChangePasswordCommand.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── UpdateProfileCommand.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ result/                            # μ„œλΉ„μŠ€ 좜λ ₯ κ²°κ³Ό 객체 (ν”„λ‘œν† μ½œ 무관)
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserRegisterResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MyInfoResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserInfoResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserUpdateResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TokenValidateResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ SocialLinkResult.java
β”‚   β”‚   β”‚   β”‚   β”‚   └── SocialLinksResult.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AuthService.java
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ OAuthService.java
β”‚   β”‚   β”‚   β”‚   └── UserService.java
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€ infrastructure/                        # 인프라 λ ˆμ΄μ–΄
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ config/                            # λ²”μš© μ„€μ • (App, JPA, Swagger, gRPC ν΄λΌμ΄μ–ΈνŠΈ)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jwt/                               # JWT λ°œκΈ‰/검증 + μ„€μ •
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ mail/                              # 메일 λ°œμ†‘ μ„œλΉ„μŠ€ + μ„€μ • + μ½”λ“œ 생성
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ oauth/                             # Google OAuth2 ν΄λΌμ΄μ–ΈνŠΈ + μ„€μ •
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ redis/                             # Redis μ €μž₯μ†Œ (토큰, μΈμ¦μ½”λ“œ λ“±)
β”‚   β”‚   β”‚   β”‚   └── listener/                          # 도메인 이벀트 λ¦¬μŠ€λ„ˆ
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   └── interfaces/                            # μΈν„°νŽ˜μ΄μŠ€ λ ˆμ΄μ–΄
β”‚   β”‚   β”‚       β”œβ”€β”€ http/                              # HTTP μ§„μž…μ 
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ AuthController.java            # 인증 (νšŒμ›κ°€μž…, 둜그인, λΉ„λ°€λ²ˆν˜Έ λ“±)
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ OAuthController.java           # μ†Œμ…œ 둜그인 (Google OAuth2)
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ UserController.java            # μœ μ € 정보 쑰회/μˆ˜μ •
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ dto/request/                   # HTTP Request DTO (@Valid 포함)
β”‚   β”‚   β”‚       β”‚   └── common/                        # ApiResponse, μ˜ˆμ™Έ 처리, μΏ ν‚€ μœ ν‹Έ
β”‚   β”‚   β”‚       └── grpc/                              # gRPC μ§„μž…μ 
β”‚   β”‚   β”‚           β”œβ”€β”€ GrpcUserQueryService.java      # μœ μ € 쑰회 gRPC μ„œλΉ„μŠ€
β”‚   β”‚   β”‚           └── GrpcExceptionHandlerImpl.java  # gRPC μ „μ—­ μ˜ˆμ™Έ 처리
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ proto/                                     # gRPC proto 파일
β”‚   β”‚   β”‚   β”œβ”€β”€ user_query.proto
β”‚   β”‚   β”‚   └── image.proto
β”‚   β”‚   β”‚
β”‚   β”‚   └── resources/
β”‚   β”‚       β”œβ”€β”€ application.yml
β”‚   β”‚       └── templates/email/                       # 이메일 HTML ν…œν”Œλ¦Ώ (Thymeleaf)
β”‚   β”‚           β”œβ”€β”€ email-verification.html
β”‚   β”‚           └── password-reset.html
β”‚   β”‚
β”‚   └── test/
β”‚       └── java/flipnote/user/
β”‚
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ build.gradle.kts
└── settings.gradle.kts

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors