# TSP 뉴스레터 페이지 지도

이 문서는 현재 `page.tsx` 화면의 목적과 접근 조건을 요약한 운영 지도입니다. `[id]`, `[campaignUuid]`, `[subscriberUuid]`는 실제 값을 문서에 적지 않은 라우트 패턴입니다. 주소록 이름, 뉴스레터 ID, 구독자 정보, 발송 데이터, 비밀값은 포함하지 않습니다.

## 접근 규칙

- `/login`을 제외한 관리자 화면은 로그인한 관리자 세션이 필요합니다. 실제 권한은 각 화면의 공통 `(admin)` 레이아웃이 검사하고, 세션이 없거나 만료되면 로그인 흐름으로 이동합니다.
- 관리자 세션과 이 문서는 별개입니다. 문서를 읽는 것만으로 관리자 권한이 생기지 않습니다.
- 공개 화면은 로그인 없이 열 수 있지만, 공개 데이터와 폼의 서버 검증을 그대로 따릅니다.
- `/subscription/[campaignUuid]/[subscriberUuid]`는 `page.tsx`가 아닌 공개 구독 취소 route handler입니다. 구독자의 실제 URL을 추측하거나 ID를 수집하지 마세요.
- `/campaign/[campaignUuid]/[subscriberUuid]/px.png`는 메일 추적 픽셀 route handler입니다. 페이지 화면이 아니며 개인 활동 데이터를 조회하는 방법으로 사용하지 마세요.

## 화면 라우트

| 경로 | 구분 | 용도와 현재 동작 |
| --- | --- | --- |
| `/` | 진입 | `/dashboard`로 redirect합니다. |
| `/login` | 공개 진입 | 관리자 로그인. 이미 로그인한 관리자는 `/dashboard`로 이동할 수 있습니다. 초기 설정·자격 증명 변경 안내가 표시될 수 있습니다. |
| `/dashboard` | 관리자 | 발송 분석, 최근 뉴스레터, 초안 수를 보는 Dashboard입니다. |
| `/newsletters` | 관리자 | Contents 목록. 초안 검색·정렬·페이지 이동·새 Contents 생성·복제·삭제를 합니다. 상세 사용법은 [`contents.md`](./contents.md)를 읽으세요. |
| `/newsletters/[id]` | 관리자 | 특정 뉴스레터 초안을 편집하는 Contents editor입니다. 상세 사용법은 [`contents.md`](./contents.md)를 읽으세요. |
| `/archive` | 관리자 | 발송 기록 Archive 목록과 검색·정렬·상태 확인입니다. |
| `/archive/[id]` | 관리자 | 특정 발송 기록의 저장 본문·발송 결과·수신자 활동 상세입니다. |
| `/subscribers` | 관리자 | 주소록 목록·생성·관리 화면입니다. |
| `/subscribers/[id]` | 관리자 | 주소록 하나의 구독자 조회·가져오기·내보내기 등 관리 화면입니다. `id`는 주소록 식별자 패턴입니다. |
| `/templates` | 관리자 | 섹션 템플릿 목록과 슬래시 명령어 요약입니다. |
| `/templates/[id]` | 관리자 | 재사용할 섹션 템플릿 편집 화면입니다. 뉴스레터 Contents와 별도의 저장 대상입니다. |
| `/subscription` | 관리자 | 공개 구독 설정과 환영 메일 설정입니다. |
| `/subscription/welcome/[id]` | 관리자 | 구독 신청 후 사용할 환영 메일 템플릿 편집 화면입니다. 뉴스레터 Contents와 별도의 메일 템플릿입니다. |
| `/settings` | 관리자 | 관리자 계정, 메일 발신·연결·테스트 수신자 설정입니다. |
| `/settings/test-send` | 관리자 | 저장된 메일 설정을 확인하고 테스트 메일을 보내는 화면입니다. 일반 뉴스레터 발송과 별도입니다. |
| `/letters` | 공개 | 공개 허용된 발송 뉴스레터 Archive. 제목·날짜 검색과 페이지 이동이 있습니다. |
| `/letters/[id]` | 공개 | 공개 허용된 뉴스레터 한 편을 읽습니다. 저장된 발송 HTML을 표시합니다. |
| `/subscribe` | 공개 | 이메일·선택 이름·동의로 공개 구독을 신청합니다. 서버가 주소와 동의를 검증합니다. |
| `/unsubscribe` | 공개 | 수신거부 폼입니다. `preview=1`은 쓰기 없는 미리보기 흐름에 사용됩니다. 실제 취소 요청은 서버 검증을 거칩니다. |
| `/terms` | 공개 | 뉴스레터 구독·이용 약관 초안입니다. |

## 화면 밖의 공개·관리 경로

화면 지도에 포함된 페이지와 별도로 `web/app/api/*` 아래에는 인증, Contents 저장·복제, 미리보기, 이미지, 주소록, 설정, Archive, 발송·예약·테스트 발송 API가 있습니다. API를 직접 호출하거나 DOM을 우회해 작업하지 말고, 로그인한 브라우저에서 현재 접근 가능한 화면과 안정적인 접근성 라벨을 사용하세요. API 경로와 내부 ID를 추측해 권한을 우회할 수 없습니다.

## AI 작업 원칙

“사이트에 들어가 글을 써 달라”는 요청은 로그인한 관리자 브라우저 세션으로 `/newsletters`에서 초안을 만들고 `/newsletters/[id]`에서 편집·저장·미리보기하는 범위로 해석합니다. 사용자 요청이 없는 한 지금 발송·예약 발송·공개·구독자 데이터 변경을 하지 않습니다. 사용자가 발송을 요청하면 Contents 안내의 발송 전 조건과 확인 대화상자를 먼저 따릅니다.
