인증 · 회원
누구인지 확인하고, 그 사람이 무엇을 살 수 있고 볼 수 있는지 정한다.
:8081:8080
클래스
46
포트
8
interface
엔드포인트
18
화면
9
가드레일
41
critical 20
이 도메인의 자리
100%휠로 확대 · 끌어서 이동
타입 구조 (46)
Spring 소스를 직접 읽어 그린다. 계층 사이 화살표만 그렸다 — 타입 하나하나를 이으면 읽을 수 없다. 파란 테두리가 포트(interface)다.
100%휠로 확대 · 끌어서 이동
app 8domain 13infrastructure 11security 4web 10포트 (8) — 도메인이 바깥에 요구하는 것
도메인은 DB 도 HTTP 도 모른다. 필요한 것을 인터페이스로 선언하고, infrastructure 가 그것을 구현한다. 의존이 뒤집히는 지점이다.
| 이름 | 하는 일 | 메서드 |
|---|---|---|
AdminAccountRepositorydomain | 관리자 계정 조회. | |
AdminMemberRepositorydomain | 관리자용 회원 조회·수정 포트. | |
AdminRepositorydomain | - | |
MemberRepositorydomain | 회원 조회 포트. | |
PasswordEncoderdomain | 비밀번호 해싱 포트. | |
SignLogRepositorydomain | 로그인 · 로그아웃 이력. | legacy() |
AdminJpaRepositoryinfrastructure | 최상위 인터페이스여야 한다 | |
MemberJpaRepositoryinfrastructure | - |
도메인 모델 (7)
AdminUserrecord | 관리자. |
Memberrecord | 회원. |
MemberFieldenum | 관리자가 고칠 수 있는 회원 항목. |
MemberSummaryrecord | 관리자 목록·상세가 보는 회원. |
PasswordPolicyclass | 비밀번호 규칙. |
ProfileChangerecord | 회원이 스스로 바꿀 수 있는 값. |
SignUpCommandrecord | 가입 입력. |
유스케이스 (8)
AdminAccountUseCase43줄 | 관리자 계정. list()setApproval() |
AdminLoginUseCase60줄 | 관리자 로그인. login() |
AdminMemberUseCase99줄 | 관리자 회원 관리. PageResult()search()detail()update()editableFields()FieldInfo() |
FindAccountUseCase47줄 | 아이디 찾기. requestByEmail()requestByPhone() |
LoginUseCase93줄 | 회원 로그인. login()logout() |
MemberProfileUseCase37줄 | 회원이 스스로 바꾸는 값. change() |
ResetPasswordUseCase76줄 | 비밀번호 재설정. issueToken()reset() |
SignUpUseCase49줄 | 회원 가입. isLoginIdTaken()signUp() |
엔드포인트 (18)
100%휠로 확대 · 끌어서 이동
| 메서드 | 경로 | 컨트롤러 |
|---|---|---|
GET | /api/identity/admin/accounts관리자 | AdminAccountController |
POST | /api/identity/admin/accounts/{id}/approval관리자 | AdminAccountController |
GET | /api/identity/admin/members관리자 | AdminMemberController |
GET | /api/identity/admin/members/fields관리자 | AdminMemberController |
GET | /api/identity/admin/members/{id}관리자 | AdminMemberController |
POST | /api/identity/admin/members/{id}관리자 | AdminMemberController |
GET | /api/identity/members/check-duplicate | IdentityController |
POST | /api/identity/members | IdentityController |
POST | /api/identity/members/find-id | IdentityController |
POST | /api/identity/members/reset-password | IdentityController |
POST | /api/identity/members/reset-password/confirm | IdentityController |
POST | /api/identity/admin/login관리자 | IdentityController |
POST | /api/identity/login | IdentityController |
POST | /api/identity/logout | IdentityController |
POST | /api/identity/token/refresh | IdentityController |
GET | /api/identity/me | IdentityController |
PATCH | /api/identity/members/me/name | IdentityController |
PATCH | /api/identity/members/me/english-name | IdentityController |
화면 흐름 (4개 화면)
이 도메인이 받는 화면끼리의 이동입니다. 다른 도메인으로 나가는 이동까지 함께 보려면 화면 흐름 → 인증 · 회원 으로 갑니다.
100%휠로 확대 · 끌어서 이동
이 도메인을 쓰는 화면 (9)
critical 가드레일 (20)
signin-log-long-login-id아이디가 길어도 로그인이 되어야 한다.login-success-not-reported-as-failure로그인에 성공하면 실패 메시지가 뜨면 안 된다.login-works-in-production-build프로덕션 빌드에서도 로그인과 세션 조회가 되어야 한다.jwt-secret-shared-between-servers인증 서버가 발급한 토큰을 API 서버가 검증할 수 있어야 한다.login-empty-password-account-blockedpw 가 빈 계정은 어떤 비밀번호로도 로그인되면 안 된다.login-token-has-no-secret토큰 페이로드에 비밀번호 해시 등 민감 정보를 담지 않는다.signup-no-duplicate-under-race같은 아이디로 동시에 가입해도 하나만 만들어져야 한다.signup-account-usable-after-race경합을 겪은 계정도 로그인·비밀번호 재설정이 되어야 한다.join-password-hashed비밀번호가 평문으로 저장되면 안 된다.join-no-entitlement-on-signup가입만으로 수강권 플래그가 켜지면 안 된다.find-id-sends-not-returns찾은 아이디를 응답에 실으면 안 된다. 메일 · 문자로만 보낸다.find-pw-screen-reaches-server비밀번호 찾기 화면의 요청이 실제로 서버까지 닿아야 한다. 화면은 /api/identity/auth/find-pw 를 부르는데 그 라우트가 없으면 Auth.js catch-all 이 400 으로 삼켜, 화면에는 그냥 실패로만 보인다.reset-link-only-by-mail재설정 링크는 메일로만 보내야 한다. 문자로 보내면 토큰이 통신사와 로그에 남는다.reset-token-single-use재설정 토큰은 한 번 쓰면 무효가 돼야 한다.reset-token-expires만료된 토큰으로 비밀번호를 바꿀 수 없어야 한다.admin-console-requires-login비로그인 상태로 어떤 관리자 화면에도 머무를 수 없어야 한다.admin-console-rejects-student수강생 계정으로는 로그인되지 않아야 한다.member-no-credential-fields비밀번호와 아이디를 고치는 길이 없어야 한다.member-field-whitelist열거형에 없는 컬럼은 수정 요청 자체가 거부돼야 한다.admin-account-no-password-exposure계정 목록 응답에 비밀번호가 실리면 안 된다.