Skip to content

Latest commit

Β 

History

54 Commits

Folders and files

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

Repository files navigation

User Service

πŸ“‹ ν”„λ‘œμ νŠΈ κ°œμš”

User ServiceλŠ” API Gateway μ•„ν‚€ν…μ²˜μ—μ„œ μ‚¬μš©μž 인증 및 관리 κΈ°λŠ₯을 λ‹΄λ‹Ήν•˜λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

πŸ—οΈ μ•„ν‚€ν…μ²˜

API Gatewayμ™€μ˜ μ—­ν•  λΆ„λ‹΄

  • API Gateway: JWT 토큰 검증, νŒŒμ‹±, 헀더 μΆ”κ°€
  • User Service: 토큰 생성, μ‚¬μš©μž 관리, λ‘œκ·Έμ•„μ›ƒ 처리

μ£Όμš” κΈ°λŠ₯

  • μ‚¬μš©μž νšŒμ›κ°€μž…/둜그인
  • JWT 토큰 λ°œκΈ‰ (μ•‘μ„ΈμŠ€ 토큰 + λ¦¬ν”„λ ˆμ‹œ 토큰)
  • μ‚¬μš©μž ν”„λ‘œν•„ 쑰회
  • λ‘œκ·Έμ•„μ›ƒ 처리 (Redis 기반 토큰 λ¬΄νš¨ν™”)

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

1. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

# env.example νŒŒμΌμ„ .env둜 볡사
cp env.example .env

# .env νŒŒμΌμ—μ„œ μ‹€μ œ κ°’μœΌλ‘œ μˆ˜μ •
# 특히 JWT μ‹œν¬λ¦Ώ ν‚€λŠ” λ°˜λ“œμ‹œ λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€!

2. JWT μ‹œν¬λ¦Ώ ν‚€ 생성 (μ€‘μš”!)

# 개발 ν™˜κ²½μš© μ‹œν¬λ¦Ώ ν‚€ 생성 (Base64 인코딩)
echo -n "your-dev-secret-key-here-minimum-32-characters-long" | base64

# 운영 ν™˜κ²½μš© μ‹œν¬λ¦Ώ ν‚€ 생성 (Base64 인코딩)
echo -n "your-production-secret-key-here-minimum-32-characters-long" | base64

# μƒμ„±λœ ν‚€λ₯Ό .env 파일의 JWT_SECRET_KEY_DEV, JWT_SECRET_KEY_PROD에 μ„€μ •

3. 인프라 μ„œλΉ„μŠ€ μ‹€ν–‰

# Docker Compose둜 MySQL, Redis μ‹€ν–‰
docker-compose up -d

# μ„œλΉ„μŠ€ μƒνƒœ 확인
docker-compose ps

4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

방법 1: 슀크립트 μ‚¬μš© (ꢌμž₯)

# .env νŒŒμΌμ„ μžλ™μœΌλ‘œ λ‘œλ“œν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰
./run-with-env.sh

방법 2: Gradle 직접 μ‹€ν–‰

# ν™˜κ²½ λ³€μˆ˜λ₯Ό μˆ˜λ™μœΌλ‘œ λ‘œλ“œ ν›„ μ‹€ν–‰
export $(cat .env | grep -v '^#' | xargs) && cd user-service && ./gradlew bootRun

방법 3: IDEμ—μ„œ μ‹€ν–‰

  • VSCode: F5 ν‚€ λ˜λŠ” Run and Debug νŒ¨λ„μ—μ„œ "UserServiceApplication" 선택
  • IntelliJ IDEA: Run/Debug Configurationsμ—μ„œ "UserServiceApplication" 선택

πŸ’‘ μ°Έκ³ : IDE μ„€μ •μ—μ„œ .env 파일이 μžλ™μœΌλ‘œ λ‘œλ“œλ˜λ„λ‘ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

5. ν™˜κ²½ λ³€μˆ˜ ν…ŒμŠ€νŠΈ

# KeyTest 클래슀둜 ν™˜κ²½ λ³€μˆ˜κ°€ μ œλŒ€λ‘œ λ‘œλ“œλ˜λŠ”μ§€ 확인
export $(cat .env | grep -v '^#' | xargs) && java -cp user-service/build/classes/java/main com.deefacto.user_service.dummy.KeyTest

βš™οΈ ν™˜κ²½ λ³€μˆ˜ μ„€μ •

ν•„μˆ˜ ν™˜κ²½ λ³€μˆ˜

λ³€μˆ˜λͺ… μ„€λͺ… κΈ°λ³Έκ°’ μ˜ˆμ‹œ
SERVER_PORT μ„œλ²„ 포트 8081 8081
DB_HOST MySQL 호슀트 localhost localhost
DB_PORT MySQL 포트 3306 3306
DB_NAME λ°μ΄ν„°λ² μ΄μŠ€ 이름 deefacto_db deefacto_db
DB_USERNAME λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžλͺ… deefacto deefacto
DB_PASSWORD λ°μ΄ν„°λ² μ΄μŠ€ λΉ„λ°€λ²ˆν˜Έ - your_password
REDIS_HOST Redis 호슀트 localhost localhost
REDIS_PORT Redis 포트 6379 6379
JWT_SECRET_KEY_DEV 개발 ν™˜κ²½ JWT μ‹œν¬λ¦Ώ ν‚€ (Base64) - your_secret_key_dev
JWT_SECRET_KEY_PROD 운영 ν™˜κ²½ JWT μ‹œν¬λ¦Ώ ν‚€ (Base64) - your_secret_key_prod

선택적 ν™˜κ²½ λ³€μˆ˜

λ³€μˆ˜λͺ… μ„€λͺ… κΈ°λ³Έκ°’
JWT_REFRESH_TOKEN_EXPIRES_IN λ¦¬ν”„λ ˆμ‹œ 토큰 만료 μ‹œκ°„ (초) 86400 (24μ‹œκ°„)
JWT_ACCESS_TOKEN_EXPIRES_IN μ•‘μ„ΈμŠ€ 토큰 만료 μ‹œκ°„ (초) 900 (15λΆ„)
SPRING_PROFILES_ACTIVE ν™œμ„± ν”„λ‘œν•„ dev
FLYWAY_ENABLED Flyway ν™œμ„±ν™” μ—¬λΆ€ false
LOGGING_LEVEL_USER_SERVICE 둜그 레벨 info

개발 ν™˜κ²½ μ „μš© λ³€μˆ˜

λ³€μˆ˜λͺ… μ„€λͺ… κΈ°λ³Έκ°’
DEV_SHOW_SQL SQL 쿼리 둜그 좜λ ₯ true
DEV_FORMAT_SQL SQL ν¬λ§·νŒ… true
DEV_HIBERNATE_DDL_AUTO Hibernate DDL μžλ™ 생성 update

πŸ”§ IDE μ„€μ •

VSCode μ„€μ •

  • .vscode/settings.json: .env 파일 μžλ™ λ‘œλ“œ μ„€μ •
  • .vscode/launch.json: 디버깅 μ‹œ .env 파일 μ‚¬μš© μ„€μ •

IntelliJ IDEA μ„€μ •

  • .idea/workspace.xml: μ‹€ν–‰ 섀정에 .env 파일 μ—°κ²°

Spring Boot μ„€μ •

  • application.yml: .env 파일 μžλ™ λ‘œλ“œ μ„€μ • 포함

πŸ“‘ API μ—”λ“œν¬μΈνŠΈ

인증 κ΄€λ ¨ API (곡개)

  • POST /auth/register - μ‚¬μš©μž νšŒμ›κ°€μž…
  • POST /auth/login - μ‚¬μš©μž 둜그인 (JWT 토큰 λ°œκΈ‰)

μ‚¬μš©μž κ΄€λ ¨ API (인증 ν•„μš”)

  • POST /auth/logout - μ‚¬μš©μž λ‘œκ·Έμ•„μ›ƒ
  • GET /user/info/search? - μ‚¬μš©μž ν”„λ‘œν•„ 쑰회
  • POST /user/delete - νšŒμ› μ‚­μ œ
  • POST /user/info/password - λΉ„λ°€λ²ˆν˜Έ λ³€κ²½

ν—¬μŠ€μ²΄ν¬ API

  • GET /actuator/health - μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœ 확인

🌐 μ£Όμš” URL

μœ ν˜• URL
Swagger http://localhost:8081/swagger-ui.html
Actuator http://localhost:8081/actuator/health
Grafana (운영 ν™˜κ²½) ν™˜κ²½ λ³€μˆ˜ μ°Έμ‘°

πŸ”§ 기술 μŠ€νƒ

  • Framework: Spring Boot 3.5.4
  • Language: Java 17 (Amazon Corretto)
  • Database: MySQL 8.0
  • Cache: Redis 7
  • Security: Spring Security + JWT
  • Build Tool: Gradle
  • Container: Docker & Docker Compose
  • Environment: .env 파일 지원 (IDE μžλ™ λ‘œλ“œ)
  • MSA: λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜
  • CI/CD: Jenkins + Docker + ArgoCD (μ˜ˆμ •)

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

Backend-UserService/
β”œβ”€β”€ user-service/                    # Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”œβ”€β”€ src/main/java/com/deefacto/user_service/
β”‚   β”‚   β”œβ”€β”€ config/                 # μ„€μ • 클래슀
β”‚   β”‚   β”œβ”€β”€ controller/             # REST API 컨트둀러
β”‚   β”‚   β”œβ”€β”€ service/                # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”œβ”€β”€ domain/                 # 도메인 λͺ¨λΈ
β”‚   β”‚   β”‚   β”œβ”€β”€ Entitiy/           # JPA μ—”ν‹°ν‹°
β”‚   β”‚   β”‚   β”œβ”€β”€ Enum/              # μ—΄κ±°ν˜•
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/               # 데이터 전솑 객체
β”‚   β”‚   β”‚   └── repository/        # 데이터 μ ‘κ·Ό 계측
β”‚   β”‚   β”œβ”€β”€ secret/jwt/            # JWT κ΄€λ ¨ 클래슀
β”‚   β”‚   β”œβ”€β”€ common/                # 곡톡 클래슀
β”‚   β”‚   β”œβ”€β”€ advice/                # μ˜ˆμ™Έ 처리 및 검증
β”‚   β”‚   └── dummy/                 # ν…ŒμŠ€νŠΈμš© 클래슀
β”‚   β”œβ”€β”€ src/main/resources/
β”‚   β”‚   β”œβ”€β”€ application.yml        # κΈ°λ³Έ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ application-dev.yml    # 개발 ν™˜κ²½ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ application-prod.yml   # 운영 ν™˜κ²½ μ„€μ •
β”‚   β”‚   └── db/migration/          # λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
β”‚   └── build.gradle               # λΉŒλ“œ μ„€μ •
β”œβ”€β”€ docker-compose.yml             # 인프라 μ„œλΉ„μŠ€ μ„€μ •
β”œβ”€β”€ env.example                    # ν™˜κ²½ λ³€μˆ˜ μ˜ˆμ‹œ
β”œβ”€β”€ .env                          # μ‹€μ œ ν™˜κ²½ λ³€μˆ˜ (gitignore됨)
β”œβ”€β”€ run-with-env.sh               # ν™˜κ²½ λ³€μˆ˜ λ‘œλ“œ 슀크립트
β”œβ”€β”€ .vscode/                      # VSCode μ„€μ •
β”œβ”€β”€ .idea/                        # IntelliJ IDEA μ„€μ •
└── README.md                     # ν”„λ‘œμ νŠΈ λ¬Έμ„œ

πŸ”’ λ³΄μ•ˆ 고렀사항

  1. ν™˜κ²½ λ³€μˆ˜ μ‚¬μš©: λ―Όκ°ν•œ μ •λ³΄λŠ” ν™˜κ²½ λ³€μˆ˜λ‘œ 관리
  2. JWT μ‹œν¬λ¦Ώ ν‚€:
    • 운영 ν™˜κ²½μ—μ„œλŠ” κ°•λ ₯ν•œ 랜덀 ν‚€ μ‚¬μš©
    • Base64 인코딩 ν•„μˆ˜
    • μ΅œμ†Œ 32자 이상 ꢌμž₯
  3. λ°μ΄ν„°λ² μ΄μŠ€ λΉ„λ°€λ²ˆν˜Έ: ν™˜κ²½λ³„λ‘œ λ‹€λ₯Έ λΉ„λ°€λ²ˆν˜Έ μ‚¬μš©
  4. CORS μ„€μ •: ν—ˆμš©λœ λ„λ©”μΈλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ μ„€μ •
  5. .env 파일: μ ˆλŒ€ Git에 μ»€λ°‹ν•˜μ§€ μ•ŠμŒ
  6. μΈμ¦μ„œ 파일: src/main/resources/certs/ λ“± 민감 νŒŒμΌμ€ git에 컀밋 κΈˆμ§€
  7. ν™˜κ²½ λ³€μˆ˜/λΉ„λ°€ν‚€: 운영 μ„œλ²„ λ˜λŠ” CI/CDμ—μ„œ μ•ˆμ „ν•˜κ²Œ μ£Όμž…

πŸ› 문제 ν•΄κ²°

일반적인 λ¬Έμ œλ“€

  1. ν™˜κ²½ λ³€μˆ˜κ°€ null둜 λ‚˜μ˜€λŠ” 경우:

    # .env 파일이 μ œλŒ€λ‘œ λ‘œλ“œλ˜λŠ”μ§€ 확인
    source .env && echo $JWT_SECRET_KEY_DEV
    
    # λ˜λŠ” 슀크립트 μ‚¬μš©
    ./run-with-env.sh
  2. 포트 좩돌: SERVER_PORT ν™˜κ²½ λ³€μˆ˜λ‘œ 포트 λ³€κ²½

  3. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ‹€νŒ¨: Docker Compose μ„œλΉ„μŠ€ μƒνƒœ 확인

  4. Redis μ—°κ²° μ‹€νŒ¨: Redis μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인

둜그 확인

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그
./gradlew bootRun

# Docker μ»¨ν…Œμ΄λ„ˆ 둜그
docker-compose logs mysql
docker-compose logs redis

πŸ“ 개발 κ°€μ΄λ“œ

μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€

  1. 도메인 λͺ¨λΈ μ •μ˜ (domain/ νŒ¨ν‚€μ§€)
  2. μ„œλΉ„μŠ€ 둜직 κ΅¬ν˜„ (service/ νŒ¨ν‚€μ§€)
  3. REST API μ—”λ“œν¬μΈνŠΈ μΆ”κ°€ (controller/ νŒ¨ν‚€μ§€)
  4. ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±

ν™˜κ²½λ³„ μ„€μ •

  • 개발 ν™˜κ²½: application-dev.yml μ‚¬μš©
  • 운영 ν™˜κ²½: application-prod.yml μ‚¬μš©
  • ν™˜κ²½ λ³€μˆ˜: .env 파일 λ˜λŠ” μ‹œμŠ€ν…œ ν™˜κ²½ λ³€μˆ˜ μ‚¬μš©

πŸ“ 폴더 ꡬ쑰 및 μ„€μ • κ·œμΉ™

  • λͺ¨λ“  섀정은 application.yml 파일 μ‚¬μš© (.properties ❌ κΈˆμ§€)
  • μƒˆλ‘œμš΄ μ„€μ • ν΄λž˜μŠ€λŠ” XXConfig.java 넀이밍 μ‚¬μš©
    예: MqttConfig.java, KafkaConfig.java

βš™οΈ ν™˜κ²½ λ³€μˆ˜ 및 민감 정보 관리

  • λͺ¨λ“  민감 μ •λ³΄λŠ” ν™˜κ²½ λ³€μˆ˜ λ˜λŠ” .env 파일둜 관리
  • μ£Όμš” ν™˜κ²½ λ³€μˆ˜ μ˜ˆμ‹œ:
    • AWS_IAM_ACCESS_KEY, AWS_IAM_SECRET_KEY
    • GRAFANA_URL_OUTER
    • spring.datasource.*, spring.kafka.* λ“±

πŸ§ͺ ν…ŒμŠ€νŠΈ

  • ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” src/test/java 디렉터리에 μž‘μ„±
  • JUnit 5 기반 μœ λ‹›/톡합 ν…ŒμŠ€νŠΈ ꡬ성

πŸ§‘β€πŸ’» 컀밋 λ©”μ‹œμ§€ μ»¨λ²€μ…˜ (| κ΅¬λΆ„μž μ‚¬μš©)

[type] | sprint | JIRA-KEY | κΈ°λŠ₯ μš”μ•½ | λ‹΄λ‹Ήμž
  • type: feat, fix, docs, config, refactor, test, chore, style λ“±
  • sprint: sprint0, sprint1, ...
  • JIRA-KEY: JIRA 이슈 번호 λ˜λŠ” μ—†μŒ
  • κΈ°λŠ₯ μš”μ•½: 핡심 λ³€κ²½ λ‚΄μš©
  • λ‹΄λ‹Ήμž: μ‹€λͺ… λ˜λŠ” λ‹‰λ„€μž„

πŸ“Œ μ˜ˆμ‹œ

feat    | sprint0 | μ—†μŒ     | μ„Όμ„œ 등둝 API κ΅¬ν˜„         | KIM
feat    | sprint0 | IOT-123  | μ„Όμ„œ 등둝 API κ΅¬ν˜„         | KIM
fix     | sprint1 | IOT-210  | MQTT μˆ˜μ‹  μ‹€νŒ¨ μ˜ˆμ™Έ 처리   | RAFA
config  | sprint0 | IOT-001  | H2 DB μ„€μ • μΆ”κ°€            | MO
docs    | sprint1 | IOT-999  | README μ΄ˆμ•ˆ μž‘μ„±           | JONE

βœ… μΆ”μ²œ 컀밋 μ˜ˆμ‹œ (λ³΅λΆ™μš©)

git commit -m "feat    | sprint1 | IOT-112 | μž‘μ—…μž μ„Όμ„œ 쑰회 API μΆ”κ°€ | KIM"
git commit -m "fix     | sprint0 | IOT-009 | H2 μ—°κ²° 였λ₯˜ μˆ˜μ •         | RAFA"
git commit -m "config  | sprint0 | IOT-000 | Spring Boot 3.4.4 적용    | MO"
git commit -m "chore   | sprint1 | IOT-999 | 컀밋 μ»¨λ²€μ…˜ README 정리   | JONE"

🚧 기타 운영 μ°Έκ³ 

  • Jenkins 및 ArgoCD 연동은 Jenkinsfile μ°Έμ‘°
  • μ‹ κ·œ μ„€μ • 파일 μΆ”κ°€ μ‹œ λ°˜λ“œμ‹œ XXConfig.java 넀이밍 μœ μ§€

πŸ“„ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

Generated from SF-DeeFacto/Backend