콘텐츠로 이동
✍️ 수정가능누구나 고쳐도 됩니다. 고치면 하단 frontmatter의 갱신일·작성자·변경요약을 남겨 주세요.작성 Claude · 2026-06-05 · 본문 인라인 raw 출처 → source 이관

회원 도메인 (Member)

1. 한 줄 정의

계정 식별자(Member)와 역할별 프로필(Student / Teacher / Parent / Admin) + 역할 간 연결 관계(Connection)를 다루는 도메인. 인증·인가의 출발점이며 모든 콘텐츠 접근 권한의 기준점.

2. 핵심 개념

  • Member — 계정 기본. member 본 테이블에 공통 필드(email unique·password·name·nickname·role native enum·phone_number·birth_date·profile·last_login_at·last_active_at)를 두고, 역할별 상세는 별도 테이블(teacher·student)이 @OneToOne+@MapsIdmember와 PK를 공유하는 조인 전략. 도메인 계층만 Java 상속(Teacher extends Member), DB는 단일 테이블 상속(DTYPE)이 아니다.
  • RoleROLE_STUDENT / ROLE_TEACHER / ROLE_PARENT / ROLE_ADMIN (DB enum). 회원가입 시 라디오로 1개 선택. 소셜 로그인 최초엔 프로필 미완 상태 ROLE_MEMBER
  • StatusINACTIVE → ACTIVE → (선택) LOCKED / WITHDRAWN. 이메일 인증 완료 시 ACTIVE
  • Connection — 역할 간 연결. requester ↔ recipient 두 Member FK + state(승인 흐름) + accepted_date. type enum: PARENTS_STUDENT / STUDENT_TEACHER. 학생↔보호자 각 4명 제한
  • Onboarding — Teacher 전용 추가 정보·진행 단계(/api/teacher/onboarding). 5단계 스텝(스터디룸 만들기 → 학생 초대 등)을 completedSteps/nextStep/currentProgress로 추적
  • 이름 정책 — 한글만, 2~5자 (실명 기준)
  • 비밀번호 정책 — 8자 이상, 영문/숫자 조합, 3회 연속 동일 문자/숫자 금지

3. 관련 코드

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

주요 API

Method Path 설명 상태
POST /api/auth/sign-up 회원가입 진행 중
POST /api/auth/login 로그인 배포
POST /api/public/email-verifications{,/check-duplicate} 이메일 인증 코드 검증·발송 배포
GET /api/public/members/profile/{memberId} 마이페이지 조회 진행 중
GET·POST /api/teacher/onboarding 온보딩 조회·업데이트 개발 완료
POST /api/connections 연결 요청(recipientEmail+connectionType) → state=PENDING 생성 배포
GET /api/connections{,/requests/received,/requests/sent} 연결 목록·받은/보낸 요청 조회 진행 중
POST /api/connections/{id}/{accept,reject} 연결 수락·거절 작업 중

회원·연결 API 전체 인덱스는 frontmatter source 참조.

4. 상태/생명주기

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

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

Connection.state: PENDING → ACCEPTED | REJECTED | TERMINATED

회원가입은 3단계 Wizard. 인증된 사용자가 /register 접근 시 메인(/)으로 리다이렉트. 회원가입·인증코드 재발송·중복체크에 각각 레이트 리밋. 연결 요청 시 상대가 해당 관계 대상이 아니거나 이미 연결돼 있으면 400.

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. 역할별 접근 권한

모든 콘텐츠 접근 권한이 여기서 출발한다. 스터디룸·수업노트·과제·QnA 네 콘텐츠가 모두 이 축을 따른다(2026-05-03 정립). 권한 관련 판단이 갈릴 때 기준이 되는 곳이다.

역할 공통 권한 축
비회원 PUBLIC 스터디룸 목록·프리뷰·초대 링크(token)만. 나머지 콘텐츠 접근 불가
선생님 자신이 소유한 룸·콘텐츠 전권(CRUD + 공개 정책 설정)
학생 생성 불가(자기 QNA 제외). 소속·지정·공개 정책에 따라 열람
보호자 생성/수정/삭제 불가. 전용 진입점 없이 연결된 자녀를 통해 간접 접근. 일부 열람 + 일부 댓글

콘텐츠별 세부 정책:

  • 스터디룸PRIVATE/PUBLIC. 선생님만 생성, 학생은 초대로만 입장. → studyroom
  • 수업노트 — visibility 6단계. 학생/보호자 열람 여부가 정책별로 갈림. → teaching-note
  • 과제 — 공개정책 없이 배정(HomeworkStudent) 여부로 결정. 같은 과제의 다른 학생 제출 완료 답안 조회 가능. → homework
  • QNASTUDENT_ONLY(기본)/STUDENT_AND_PARENT. 보호자는 후자일 때만 자녀 QNA 조회. → qna

구현 메모: 권한 위반은 BusinessException + 도메인 ErrorCode. 보호자 간접 접근은 Connection(자녀 연결) 경유. 비회원 챌린지(/api/public/** permitAll)와의 정합은 challenge 참조.

8. 결정 이력 / TODO

  • 헥사고날 아키텍처 — 회원 도메인 (Member)이 어댑터 패턴의 대표 예시
  • 회원가입 시 역할 확정 단계는 MVP에서 보류 후 본 배포에서 활성화 (FDD MS1)
  • 인증은 현재 Access/Refresh + HttpCookie(Authorization·refresh-token) 방식, refresh는 in-memory(ConcurrentHashMap) 저장 — 구현 backend-architecture §5
  • Member 상속 계층(조인 테이블)이 deleteAll 타입 추론(targets.get(0).getClass())과 충돌 가능 — 검토 예정
  • ROLE_MEMBER 상태에서 챌린지 풀이 접근 가능 여부 → challenge와 동기화