3.4 KiB
3.4 KiB
UML[맥락] - 사용자 메일 관리 시스템
프로젝트 배경
추진 이유
- 팀장 지시로 POP3 구현 필요
- IMAP 허용 여부 확인 대기 중
- 두 프로토콜 모두 구현 후 비교하여 최적 솔루션 채택
핵심 기술 결정 사항
1. 페이지 등록 방식: 하드코딩
선택: 하드코딩 (AdminPageRenderer.tsx에 직접 등록)
사유:
- 컴포넌트 레지스트리에 추가할 권한 없음
- 간단한 추가 작업으로 빠른 구현 가능
구현:
// AdminPageRenderer.tsx에 2줄 추가
{path: '/mail/imap', label: '메일(IMAP)', component: () => <IMapPage /> },
{path: '/mail/pop3', label: '메일(POP3)', component: () => <Pop3Page /> },
2. 저장소: PostgreSQL (Admin 메일과 완전 분리)
선택: PostgreSQL user_mail_accounts 테이블
사유:
- Admin 메일 시스템(JSON 파일 기반)과 완전 독립
- 사용자별 격리 용이 (user_id 기반)
- 확장성 및 성능 이점
결과:
- 기존 Admin 메일: JSON 파일 유지
- 신규 사용자 메일: PostgreSQL 관리
3. POP3 메일 삭제 정책: 서버 유지
선택: DELE 명령 미호출 (서버 메일 유지)
사유:
- 데이터 손실 방지
- 사용자 실수로 인한 피해 최소화
- 벡스플로우는 조회만 수행
구현:
userMailPop3Service.ts에서 RETR 후 DELE 호출 안 함- 서버의 자동 정리 정책에 의존
4. 페이지별 프로토콜 고정
선택: 페이지당 프로토콜 1개로 제한
구현:
/mail/imap→ IMAP 계정만 표시/관리/mail/pop3→ POP3 계정만 표시/관리
사유:
- UI 단순화
- 프로토콜별 메일 구조 차이 처리 용이
- 사용자 혼동 최소화
관련 기존 코드 참조
mailReceiveBasicService.ts
- IMAP 연결 및 메일 조회 로직
- 메일 파싱 및 저장 방식
- Error handling 패턴
참조 사항:
// IMAP 연결 구조, 메일 검색 쿼리, 메일 수신 처리 방식
encryptionService.ts
- 비밀번호 암호화/복호화
- DB 저장 시 암호화, 조회 시 복호화
사용 방식:
// 저장: encryptionService.encrypt(password)
// 조회: encryptionService.decrypt(encrypted_password)
AdminPageRenderer.tsx
- 기존 페이지 하드코딩 구조
- 페이지 등록 형식 및 라벨 지정 방식
추가 위치:
// 기존 페이지 목록에 /mail/imap, /mail/pop3 추가
기술 스택 및 패키지
기존 패키지 (재활용)
| 패키지 | 버전 | 용도 |
|---|---|---|
imap |
- | IMAP 연결 |
mailparser |
- | 메일 파싱 |
pg |
- | PostgreSQL 클라이언트 |
신규 패키지
| 패키지 | 버전 | 용도 |
|---|---|---|
node-pop3 |
latest | POP3 연결 |
핵심 고려 사항
보안
- 메일 계정 비밀번호는 항상 암호화 상태로 저장
- 사용자 격리: user_id 기반 접근 제어
- 외부 서버 연결 정보는 민감: 환경변수 활용
성능
- 메일 조회는 페이지네이션 처리
- 연결 테스트는 별도 API (현재 메일 검색과 분리)
- 대량 메일 처리 시 비동기 처리
에러 처리
- 네트워크 오류: 재시도 로직
- 인증 실패: 명확한 에러 메시지 제공
- DB 오류: 트랜잭션 롤백
변경 이력
| 날짜 | 내용 |
|---|---|
| 2026-03-27 | 초안 작성 |