This commit is contained in:
ondal
2025-02-13 18:42:46 +09:00
parent ba3405bff3
commit d7ca5994b4
48 changed files with 1071 additions and 7 deletions
+18
View File
@@ -0,0 +1,18 @@
서비스명|회원|회원
마이크로서비스 이름|Member|Member
유저스토리 ID|USR-005|USR-015
유저스토리 제목|로그인|로그아웃
Controller 이름|MemberController|MemberController
API 목적|사용자 로그인|로그아웃
API Method|POST|POST
API 그룹 Path|/api/auth|/api/auth
API Path|/login|/logout
Path <변수유형> <변수명>||
Query Key||
Query <변수유형> <변수명>||
Request DTO 이름|LoginRequest|LogoutRequest
Request DTO 배열 여부|No|No
Request DTO 구조|String userId; String password|String userId
Response DTO 이름|JwtTokenDTO|LogoutResponse
Response DTO 배열 여부|No|No
Response DTO 구조|String accessToken; String refreshToken|String message
+17
View File
@@ -0,0 +1,17 @@
!theme mono
title Member Service - 데이터 모델
entity "Members" as members {
* userId: varchar(50) <<PK>>
--
userName: varchar(100)
password: varchar(255)
roles: varchar(255)
createdAt: timestamp
updatedAt: timestamp
}
note right of members
roles는 ARRAY 또는 JSON 타입으로
['USER', 'ADMIN'] 형태로 저장
end note
+72
View File
@@ -0,0 +1,72 @@
!theme mono
title 회원 서비스 - 내부 시퀀스 다이어그램
actor Client
participant "회원 컨트롤러\n(MemberController)" as Controller
participant "회원 서비스\n(MemberService)" as Service
participant "JWT 토큰 제공자\n(JwtTokenProvider)" as TokenProvider
participant "비밀번호 인코더\n(PasswordEncoder)" as PwEncoder
database "회원 DB" as DB
' 로그인 flow
Client -> Controller: POST /api/auth/login\n[로그인]
activate Controller
Controller -> Service: login(LoginRequest)
activate Service
Service -> DB: findByUserId(userId)
activate DB
DB --> Service: Member
deactivate DB
Service -> PwEncoder: matches(rawPassword, encodedPassword)
activate PwEncoder
PwEncoder --> Service: matched result
deactivate PwEncoder
alt 인증 성공
Service -> TokenProvider: createToken(member)
activate TokenProvider
TokenProvider --> Service: access/refresh tokens
deactivate TokenProvider
Service --> Controller: TokenResponse
else 인증 실패
Service --> Controller: throw InvalidCredentialsException
end
Controller --> Client: HTTP Response\n(tokens or error)
deactivate Service
deactivate Controller
' 로그아웃 flow
Client -> Controller: POST /api/auth/logout\n[로그아웃]
activate Controller
Controller -> Service: logout(LogoutRequest)
activate Service
Service --> Controller: LogoutResponse
Controller --> Client: HTTP Response\n(success message)
deactivate Service
deactivate Controller
note right of Controller
1. 요청 유효성 검증
2. 서비스 계층 호출
3. 응답 변환 및 반환
end note
note right of Service
1. 비즈니스 로직 처리
2. 사용자 인증
3. 토큰 관리
end note
note right of TokenProvider
1. JWT 토큰 생성
2. 토큰 검증
3. 토큰 무효화
end note
+89
View File
@@ -0,0 +1,89 @@
!theme mono
title Member Service - Class Diagram
package "com.unicorn.lifesub.member" {
package "domain" {
class Member {
-userId: String
-userName: String
-password: String
-roles: Set<String>
+Member(userId: String, userName: String, password: String, roles: Set<String>)
}
}
package "service" {
interface MemberService {
+login(request: LoginRequest): JwtTokenDTO
+logout(request: LogoutRequest): LogoutResponse
}
class MemberServiceImpl {
-memberRepository: MemberRepository
-passwordEncoder: PasswordEncoder
-jwtTokenProvider: JwtTokenProvider
+login(request: LoginRequest): JwtTokenDTO
+logout(request: LogoutRequest): LogoutResponse
}
}
package "controller" {
class MemberController {
-memberService: MemberService
+login(request: LoginRequest): ResponseEntity<ApiResponse<JwtTokenDTO>>
+logout(request: LogoutRequest): ResponseEntity<ApiResponse<LogoutResponse>>
}
}
package "dto" {
class LoginRequest {
-userId: String
-password: String
}
class LogoutRequest {
-userId: String
}
class LogoutResponse {
-message: String
}
}
package "repository" {
package "jpa" {
interface MemberRepository {
+findByUserId(userId: String): Optional<MemberEntity>
}
}
package "entity" {
class MemberEntity {
-userId: String
-userName: String
-password: String
-roles: Set<String>
+toDomain(): Member
+fromDomain(member: Member): MemberEntity
}
}
}
package "config" {
class SecurityConfig {
-jwtTokenProvider: JwtTokenProvider
+securityFilterChain(http: HttpSecurity): SecurityFilterChain
+corsConfigurationSource(): CorsConfigurationSource
+passwordEncoder(): PasswordEncoder
}
class JwtTokenProvider {
-algorithm: Algorithm
-accessTokenValidityInMilliseconds: long
-refreshTokenValidityInMilliseconds: long
+createToken(member: MemberEntity): JwtTokenDTO
+validateToken(token: String): boolean
+getAuthentication(token: String): Authentication
}
}
}