mirror of
https://github.com/cna-bootcamp/lifesub.git
synced 2026-06-12 20:49:09 +00:00
release
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user