콘텐츠로 이동

Member

1. 한 줄 정의

계정 식별자(Member)와 역할별 프로필(Student / Teacher / Parent / Admin) + 역할 간 연결 관계(Connection)를 다루는 도메인. 인증·인가의 출발점.

2. 핵심 개념

  • Member — 계정 기본. DB는 단일 테이블 상속(member.DTYPE discriminator)으로 Student/Teacher/Parent/Admin을 한 테이블에 저장. 공통 필드: email(unique), password, name, nickname, role, phone_number, birth_date, profile, last_login_at, last_active_at
  • RoleROLE_STUDENT / ROLE_TEACHER / ROLE_PARENT / ROLE_ADMIN (DB enum). 회원가입 시 라디오로 1개 선택
  • StatusINACTIVE → ACTIVE → (선택) LOCKED / WITHDRAWN. 이메일 인증 완료 시 ACTIVE
  • Connection — 역할 간 연결. requester ↔ recipient 두 Member FK + state(승인 흐름) + accepted_date. 학생↔보호자 각 4명 제한
  • Onboarding — Teacher 전용 추가 정보(/api/teacher/onboarding)
  • 이름 정책 — 한글만, 2~5자 (실명 기준)
  • 비밀번호 정책 — 8자 이상, 영문/숫자 조합, 3회 연속 동일 문자/숫자 금지

3. 관련 코드

  • [mvp-back:domain/member](member.md) — Member, Student, Teacher, Parent, Connection 도메인 모델
  • [mvp-back:application/service/member](member.md) — 프로필/마이페이지 관리
  • mvp-back:application/service/connection — Teacher-Student/Parent 연결 승인 흐름
  • mvp-back:application/service/auth — 회원가입, 로그인, 소셜 로그인, JWT 발급
  • mvp-back:infrastructure/security — JwtTokenProvider, SecurityConfig
  • DDL: member, connection 테이블 (teams/engineering/infra/db-ddl)
  • mvp-front:src/app/(auth) — 로그인/회원가입, mvp-front:src/app/(profile) — 역할/프로필

4. 상태/생명주기

[가입 Step1 이메일 입력·중복체크]
   → [Step2 이메일 인증·비밀번호·약관]
   → [Step3 이름·역할 선택]
   → INACTIVE → (이메일 인증) → ACTIVE
   → (선택) LOCKED / WITHDRAWN

소셜 로그인 최초: ROLE_MEMBER(프로필 미완) → 프로필 완성 → ROLE_STUDENT|TEACHER|PARENT

Connection.state: PENDING → APPROVED | REJECTED | TERMINATED

회원가입은 3단계 Wizard. 인증된 사용자가 /register 접근 시 메인(/)으로 리다이렉트. 회원가입·인증코드 재발송·중복체크에 각각 레이트 리밋.

5. 외부 의존

6. UI 노출

  • 로그인: mvp-front/src/app/(auth)/login
  • 회원가입(3단계 Wizard): mvp-front/src/app/(auth)/register
  • 역할/프로필: mvp-front/src/app/(profile)
  • 마이페이지: GET /api/public/members/profile/{memberId}

7. 결정 이력

  • 헥사고날 아키텍처 — Member 도메인이 어댑터 패턴의 대표 예시 (teams/engineering/guides/backend-architecture)
  • 회원가입 시 역할 확정 단계는 MVP에서 보류, 본 배포에서 활성화 (FDD MS1)

8. 열린 질문 / TODO