선생님 목록 개발 명세 (FRD)¶
공개 선생님·스터디룸 쇼케이스(/teachers, MVP-C)를 어떻게 구현하는지 정리한다. 신규 강사와 공개 스터디룸을 비로그인 공개 API로 내보내는데, 절대 어겨선 안 되는 두 가지가 있다 — 어떤 응답에도 이메일·전화번호 같은 개인정보를 싣지 않을 것, 그리고 visibility = PUBLIC 스터디룸만 돌려줄 것. 상위 기획은 prd에 있고, 거기서 우선순위·정렬·데이터 정책이 바뀌면 아래 API·데이터 절을 맞춘다.
기술 접근 · 아키텍처¶
- 클라이언트
/teachers진입(비로그인 허용). - 강사·스터디룸 공개 목록 API 병렬 조회.
- 정렬 파라미터(
NEWEST/OLDEST/ALPHABETICAL) 적용 — 미허용 값은 기본값NEWESTfallback. - PII 제거된 공개 DTO로 직렬화(화이트리스트로 email·phone 차단).
- 카드 렌더 — NEW 배지는
isNewTeacher(가입 30일 이내) 기반.
비공개(visibility != PUBLIC) 스터디룸은 쿼리 단계에서 필터해 권한 우회 노출을 차단한다.
API · 데이터 모델¶
| Method | Endpoint | 인증 | 설명 |
|---|---|---|---|
| GET | 공개 강사 목록 | 불필요(public) | 신규/전체 강사 목록 + 정렬 |
| GET | 공개 스터디룸 목록 | 불필요(public) | visibility=PUBLIC 스터디룸 목록 + 정렬 |
- 정렬 파라미터 ENUM:
NEWEST·OLDEST·ALPHABETICAL. 페이지네이션: Phase 1 최신순 기본, 고급 페이지네이션은 Phase 3. - 경로·role prefix 확정값은 BE 구현 시 member/studyroom 페이지에 반영(원본 §7은 메서드·필드만 정의, Endpoint 문자열 미작성).
공개 강사 응답 (PublicTeacherResponse):
| 필드 | 타입 | 비고 |
|---|---|---|
| id | Long | 강사 식별자 |
| name | String | 표시명 |
| nickname | String | 닉네임 |
| regDate | DateTime | 가입일 |
| isNewTeacher | Boolean | 가입 30일 이내 여부(NEW 배지) |
FE 확장 프로필(PublicTeacherProfile)은 추가로 profileImageUrl·bio·specialties(과목/학년)·experience·rating·reviewCount·studyRoomCount 노출 후보(상당수 Phase 2 평점·후기 연동 시 채워짐).
공개 스터디룸 응답 (PublicStudyRoomResponse):
| 필드 | 타입 |
|---|---|
| name / description | String |
| teacher (teacherId·teacherName) | (공개 강사 요약) |
| visibility | ENUM (PUBLIC만 노출) |
| capacity | Int |
| modality / classForm / subjectType | ENUM |
| schoolInfo | String/Object |
- 강사 = member(role TEACHER). 신규 판정
isNewTeacher= 가입일이 현재 기준 30일 이내. - 스터디룸 = studyroom, 노출 필터
visibility = PUBLIC. 매핑은 각 도메인 페이지 §관련 코드.
의존성 · 영향 범위¶
- member(강사 식별·가입일), studyroom(공개범위·수업 메타). 공개 응답 DTO는 양 도메인을 읽기 전용으로 조합.
- PII 주의: 원본 Java 스니펫의
PublicTeacherResponse.from()은email을 담지만, 데이터 정책(원본 §7 개인정보 미노출)이 우선 — 공개 응답에서 email·phone 제외(스니펫-정책 불일치는 구현 시 정책 기준으로 정정). 내부 식별/연락 정보 실값은 raw·DB에만 존재(본 문서 미기재).
테스트 계획¶
- 공개 API 비로그인 200 확인.
- PII 필드 부재 단언(email·phone 누출 금지, DTO 화이트리스트 강제).
- 비공개 스터디룸 미노출 단언(쿼리 필터).
- 정렬 ENUM별 정렬 검증, 미허용 값
NEWESTfallback. - 신규 판정 경계(가입 30일) 검증. 빈 목록 정상 응답(200, empty list).
- 공통 전략 qa-playbook.
작업 분해 (이슈 링크)¶
- 공개 강사 목록 API + DTO 화이트리스트 / 공개 스터디룸 목록 API + PUBLIC 필터 / 정렬 ENUM 처리 / FE 카드·정렬 UI / NEW 배지 판정. 이슈 링크는 status 참조.