# UML[계획] - 사용자 메일 관리 시스템

## 개요

벡스플로우(Vexflow) 사용자 메일 관리 페이지 구현 프로젝트입니다. 외부 메일 서버(POP3/IMAP)와 연동하여 사용자가 본인의 메일 계정을 등록하고 벡스플로우 내에서 메일을 조회할 수 있는 기능을 제공합니다.

### 현재 동작
- Admin 메일 시스템만 존재
- JSON 파일 기반 저장소
- 사용자 구분 없음

### 변경 후 동작
- 사용자가 외부 메일 계정(IMAP 또는 POP3) 등록
- 벡스플로우에서 해당 계정의 메일 조회
- PostgreSQL 기반 계정 저장 및 관리
- 사용자별 격리(user_id 기반)

---

## 아키텍처

```
┌─────────────┐
│   사용자     │
│  (Frontend)  │
└──────┬──────┘
       │
       ├─→ /mail/imap 페이지
       └─→ /mail/pop3 페이지
              │
              ↓
       ┌──────────────────┐
       │   userMail.ts    │ (API 클라이언트)
       │  (lib/api/)      │
       └────────┬─────────┘
                │
                ↓
       ┌────────────────────────────┐
       │  /api/user-mail/* 라우트   │
       │  (userMailController)      │
       └────────┬───────────────────┘
                │
        ┌───────┴────────┐
        │                │
        ↓                ↓
   ┌────────────────┐  ┌──────────────┐
   │ userMailAccount│  │ userMailImap │
   │  Service       │  │ Service      │
   │ (PostgreSQL)   │  │ (IMAP)       │
   └────────────────┘  │              │
                       └──────────────┘
                              │
                              ↓
                       ┌──────────────────┐
                       │  외부 IMAP 서버   │
                       └──────────────────┘

   또는

                       ┌──────────────────┐
                       │ userMailPop3     │
                       │ Service          │
                       │ (POP3)           │
                       └──────────────────┘
                              │
                              ↓
                       ┌──────────────────┐
                       │  외부 POP3 서버   │
                       └──────────────────┘
```

---

## 신규 파일 목록

### 백엔드 (Node.js/Express)

| 파일 경로 | 역할 |
|----------|------|
| `src/services/userMailAccountService.ts` | DB 계정 관리 (생성, 조회, 삭제, 수정) |
| `src/services/userMailImapService.ts` | IMAP 프로토콜 연결 및 메일 조회 |
| `src/services/userMailPop3Service.ts` | POP3 프로토콜 연결 및 메일 조회 |
| `src/controllers/userMailController.ts` | API 엔드포인트 처리 |
| `src/routes/userMailRoutes.ts` | 라우트 정의 |

### 프론트엔드 (React/TypeScript)

| 파일 경로 | 역할 |
|----------|------|
| `frontend/lib/api/userMail.ts` | API 클라이언트 |
| `frontend/app/(main)/mail/imap/page.tsx` | IMAP 메일 관리 페이지 |
| `frontend/app/(main)/mail/pop3/page.tsx` | POP3 메일 관리 페이지 |

---

## 수정 파일 목록

| 파일 경로 | 변경 사항 |
|----------|---------|
| `src/runMigration.ts` | 마이그레이션 스크립트에 user_mail_accounts 테이블 추가 |
| `src/app.ts` | userMailRoutes 등록 |
| `src/components/AdminPageRenderer.tsx` | /mail/imap, /mail/pop3 페이지 하드코딩 등록 (2줄) |

---

## 데이터베이스 스키마

### user_mail_accounts 테이블

```sql
CREATE TABLE user_mail_accounts (
  id SERIAL PRIMARY KEY,
  user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  protocol VARCHAR(10) NOT NULL CHECK (protocol IN ('imap', 'pop3')),
  host VARCHAR(255) NOT NULL,
  port INT NOT NULL DEFAULT 993,
  use_tls BOOLEAN DEFAULT TRUE,
  username VARCHAR(255) NOT NULL,
  password TEXT NOT NULL, -- 암호화됨 (encryptionService 사용)
  status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'inactive')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  UNIQUE(user_id, protocol, host, username)
);
```

---

## 설계 원칙

### 1. 사용자 격리
- 모든 API 요청에서 현재 사용자의 user_id 검증
- 다른 사용자의 계정/메일 접근 불가

### 2. 프로토콜별 서비스 분리
- userMailImapService.ts: IMAP 전용
- userMailPop3Service.ts: POP3 전용
- 각 서비스는 독립적으로 동작

### 3. 기존 기능 재활용
- `encryptionService`: 비밀번호 암호화/복호화
- `mailparser`: 메일 본문 파싱
- `imap` 패키지: IMAP 연결(기존 mailReceiveBasicService 참조)

### 4. 기존 Admin 메일 시스템과 분리
- 새로운 테이블, 서비스, 라우트로 완전 독립
- JSON 파일 기반 방식 미사용

---

## 주요 API 엔드포인트

| 메서드 | 경로 | 설명 |
|--------|------|------|
| POST | `/api/user-mail/accounts` | 새 계정 등록 |
| GET | `/api/user-mail/accounts` | 사용자 계정 목록 |
| GET | `/api/user-mail/accounts/:id` | 계정 상세 조회 |
| PUT | `/api/user-mail/accounts/:id` | 계정 수정 |
| DELETE | `/api/user-mail/accounts/:id` | 계정 삭제 |
| POST | `/api/user-mail/accounts/:id/test` | 연결 테스트 |
| GET | `/api/user-mail/accounts/:id/mails` | 메일 목록 조회 |

---

## 변경 이력

| 날짜 | 버전 | 내용 |
|------|------|------|
| 2026-03-27 | v1.0 | 초안 작성 |
