회원 도메인 (Member)¶
1. 한 줄 정의¶
계정 식별자(Member)와 역할별 프로필(Student / Teacher / Parent / Admin) + 역할 간 연결 관계(Connection)를 다루는 도메인. 인증·인가의 출발점이며 모든 콘텐츠 접근 권한의 기준점.
2. 핵심 개념¶
- Member — 계정 기본.
member본 테이블에 공통 필드(emailunique·password·name·nickname·rolenative enum·phone_number·birth_date·profile·last_login_at·last_active_at)를 두고, 역할별 상세는 별도 테이블(teacher·student)이@OneToOne+@MapsId로member와 PK를 공유하는 조인 전략. 도메인 계층만 Java 상속(Teacher extends Member), DB는 단일 테이블 상속(DTYPE)이 아니다. - Role —
ROLE_STUDENT/ROLE_TEACHER/ROLE_PARENT/ROLE_ADMIN(DB enum). 회원가입 시 라디오로 1개 선택. 소셜 로그인 최초엔 프로필 미완 상태ROLE_MEMBER - Status —
INACTIVE → ACTIVE → (선택) LOCKED / WITHDRAWN. 이메일 인증 완료 시 ACTIVE - Connection — 역할 간 연결.
requester ↔ recipient두 Member FK +state(승인 흐름) +accepted_date.typeenum: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, SecurityConfigmvp-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. 외부 의존¶
- Kakao / Naver OAuth (소셜 로그인) → 소셜 로그인 개발 명세 (FRD)
- 계정 복구 흐름 → 계정 복구 개발 명세 (FRD)
- 이메일 인증 (
EMAIL_USER/EMAIL_PASSWORD환경변수 → infra) - 알림톡 (가입 환영, 비밀번호 변경 등 — 카카오 알림 개발 명세 (FRD))
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
- QNA —
STUDENT_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와 동기화