Backend
home
💼

요구사항 명세서

1. 프로젝트 개요

항목
내용
프로젝트명
DocuFlow
프로젝트 설명
PDF 파일 처리 기능을 REST API로 제공하는 SaaS 플랫폼
목표
TDD 기반 개발로 안정적인 PDF 처리 API 서비스 구축 및 수익화
기술 스택
Spring Boot 3.x, Java 17, PostgreSQL, JUnit5, Mockito, AWS S3
개발 기간
3개월 (MVP)

요금제 정의

티어
월 요금
일일 호출 한도
월간 호출 한도
파일 크기 제한
Free
0원
50회
500회
10MB
Basic
9,900원
500회
10,000회
50MB
Pro
29,900원
무제한
100,000회
100MB

2. Member 도메인

ID
기능명
우선순위
설명
MEM-001
회원가입
P0
이메일, 비밀번호로 회원가입
MEM-002
로그인
P0
이메일, 비밀번호로 로그인 후 JWT 발급
MEM-003
로그아웃
P0
토큰 무효화 처리
MEM-004
내 정보 조회
P1
본인 회원 정보 조회
MEM-005
내 정보 수정
P1
이름, 연락처 등 수정
MEM-006
이메일 인증
P1
가입 시 이메일 검증
MEM-007
비밀번호 재설정
P1
이메일 통한 재설정
MEM-008
소셜 로그인
P2
Google, GitHub OAuth
MEM-009
회원 탈퇴
P2
계정 삭제 (soft delete)

MEM-001: 회원가입

•
요구사항
항목
내용
설명
신규 사용자가 이메일과 비밀번호로 계정을 생성한다
선행 조건
없음
후행 조건
회원 정보 저장, 이메일 인증 메일 발송, Free 요금제 자동 적용
•
입력 데이터
필드
타입
필수
검증 규칙
email
String
O
이메일 형식, 최대 100자, 중복 불가
password
String
O
최소 8자, 영문+숫자+특수문자 포함
name
String
O
최소 2자, 최대 50자
•
비즈니스 규칙
◦
BR-001: 이미 가입된 이메일로는 가입 불가
◦
BR-002: 비밀번호는 BCrpyt로 암호화하여 저장
◦
BR-003: 가입 즉시 Free 요금제 자동 적용
◦
BR-004: 가입 완료 시 이메일 인증 메일 발송 (P1에서 구현)
•
API 엔드포인트
POST /api/v1/members/signup
JSON
복사
•
응답
◦
성공: 201 Created
◦
실패: 400 Bad Request(검증 실패), 409 Conflict(이메일 중복)

MEM-002: 로그인

•
요구사항
항목
내용
설명
가입된 사용자가 이메일과 비밀번호로 로그인하여 JWT 토큰을 발급받는다
선행 조건
회원가입 완료
후행 조건
Access Token, Refresh Token 발급
•
입력 데이터
필드
타입
필수
검증 규칙
email
String
O
이메일 형식
password
String
O
빈 값 불가
•
비즈니스 규칙
◦
BR-005: 이메일 또는 비밀번호 불일치 시 동일한 에러 메시지 반환 (보안)
◦
BR-006: 정지된 회원은 로그인 불가
◦
BR-007: Access Token 유효기간 30분, Refresh Token 유효기간 7일
•
API 엔드포인트
POST /api/v1/members/login
JSON
복사
•
응답
◦
성공: 200 OK (accessToken, refreshToken, expiresIn 반환)
◦
실패: 401 Unauthorized

MEM-003: 로그아웃

•
요구사항
항목
내용
설명
로그인된 사용자가 로그아웃하여 토큰을 무효화한다
선행 조건
로그인 상태
후행 조건
Refresh Token 무효화
•
비즈니스 규칙
◦
BR-008: RefreshToken 을 블랙리스트에 등록하여 재사용 방지
•
API 엔드포인트
POST /api/v1/members/logout Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패: 401 Unauthorized

MEM-004: 내 정보 조회

•
요구사항
항목
내용
설명
로그인한 사용자가 본인의 회원 정보를 조회한다
선행 조건
로그인 상태
후행 조건
없음
•
응답 데이터
필드
타입
설명
id
Long
회원 ID
email
String
이메일
name
String
이름
planType
String
현재 요금제 (FREE/BASIC/PRO)
emailVerified
Boolean
이메일 인증 여부
createdAt
DateTime
가입일시
•
API 엔드포인트
GET /api/v1/members/me Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패: 401 Unauthorized

MEM-005: 내 정보 수정

•
요구사항
항목
내용
설명
로그인한 사용자가 본인의 정보를 수정한다
선행 조건
로그인 상태
후행 조건
회원 정보 업데이트
•
입력 데이터
필드
타입
필수
검증 규칙
name
String
X
최소 2자, 최대 50자
currentPassword
String
X
비밀번호 변경 시 필수
newPassword
String
X
최소 8자, 영문 + 숫자 + 특수문자 포함
•
비즈니스 규칙
◦
BR-009: 비밀번호 변경 시 현재 비밀번호 확인 필수
◦
BR-010: 이메일 변경 불가 (변경 필요 시 별도 프로세스)
•
API 엔드포인트
PATCH /api/v1/members/me Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패: 400 Bad Request, 401 Unauthorized
나머지 기능들은 MVP 구현 완료 이후 진행할 예정

3. ApiKey (API 키) 도메인

ID
기능명
우선순위
설명
KEY-001
API Key 발급
P0
회원이 API Key를 생성한다
KEY-002
API Key 목록 조회
P0
본인의 API Key 목록을 조회한다
KEY-003
API Key 재발급
P1
기존 Key 폐기 후 신규 발급
KEY-004
API Key 비활성화
P1
특정 Key를 일시 중지한다
KEY-005
API Key 활성화
P1
비활성화된 Key를 다시 활성화한다
KEY-006
API Key 삭제
P1
Key를 영구 삭제한다

KEY-001: API Key 발급

•
요구사항
항목
내용
설명
로그인한 회원이 PDF API 호출에 사용할 API Key를 발급받는다
선행 조건
로그인 상태, 이메일 인증 완료 (P1 구현 후 적용)
후행 조건
새로운 API Key 생성 및 저장
•
입력 데이터
필드
타입
필수
검증 규칙
keyName
String
O
최소 1자, 최대 50자
•
비즈니스 규칙
◦
BR-011: 회원당 최대 5개의 API Key 발급 가능
◦
BR-012: API Key는 df_live_ 접두사 + 32자리 랜덤 문자열로 생성
◦
BR-013: API Key 원본은 발급 시점에만 노출, 이후에는 마스킹 처리 (df_live_xxxx...xxxx)
◦
BR-014: API Key는 SHA-256 해시로 저장
•
API 엔드포인트
POST /api/v1/api-keys Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 201 Created (최초 1회만 원본 Key 반환)
◦
실패: 400 Bad Request, 401 Unauthorized, 403 Forbidden (한도 초과)

KEY-002: API Key 목록 조회

•
요구사항
항목
내용
설명
로그인한 회원이 본인의 API Key 목록을 조회한다
선행 조건
로그인 상태
후행 조건
없음
•
응답 데이터 (목록 항목)
필드
타입
설명
id
Long
API Key ID
keyName
String
Key 별칭
maskedKey
String
마스킹된 Key (df_live_xxxx...xxxx)
status
String
상태 (ACTIVE / INACTIVE)
lastUsedAt
DateTime
마지막 사용 일시 (nullable)
createdAt
DateTime
생성 일시
•
비즈니스 규칙
◦
BR-015: API Key 원본은 절대 반환하지 않음 (마스킹 처리)
◦
BR-016: 삭제된 Key는 목록에 표시되지 않음
•
API 엔드포인트
GET /api/v1/api-keys Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패: 401 Unauthorized

KEY-003: API Key 재발급

•
요구사항
항목
내용
설명
기존 API Key를 폐기하고 동일한 이름으로 새 Key를 발급한다
선행 조건
로그인 상태, 해당 Key의 소유자
후행 조건
기존 Key 삭제, 신규 Key 생성
•
비즈니스 규칙
◦
BR-017: 재발급 시 기존 Key는 즉시 무효화
◦
BR-018: 재발급된 Key는 기존 keyName을 유지
◦
BR-019: 재발급 후 원본 Key는 최초 1회만 노출
•
API 엔드포인트
POST /api/v1/api-keys/{keyId}/regenerate Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK (새 원본 Key 반환)
◦
실패: 401 Unauthorized, 403 Forbidden (본인 Key 아님), 404 Not Found

KEY-004: API Key 비활성화

•
요구사항
항목
내용
설명
특정 API Key를 일시적으로 사용 중지한다
선행 조건
로그인 상태, 해당 Key의 소유자, Key 상태가 ACTIVE
후행 조건
Key 상태가 INACTIVE로 변경
•
비즈니스 규칙
◦
BR-020: 비활성화된 Key로 API 호출 시 401 에러 반환
◦
BR-021: 이미 비활성화된 Key는 재비활성화 불가 (400 에러)
•
엔드포인트
PATCH /api/v1/api-keys/{keyId}/deactivate Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패:
▪
400 Bad Request (이미 비활성)
▪
401 Unauthorized
▪
403 Forbidden
▪
404 Not Found

KEY-005: API Key 활성화

•
요구사항
항목
내용
설명
비활성화된 API Key를 다시 활성화한다
선행 조건
로그인 상태, 해당 Key의 소유자, Key 상태가 INACTIVE
후행 조건
Key 상태가 ACTIVE로 변경
•
비즈니스 규칙
◦
BR-022: 이미 활성화된 Key는 재활성화 불가 (400 에러)
•
API 엔드포인트
PATCH /api/v1/api-keys/{keyId}/activate Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 200 OK
◦
실패:
▪
400 Bad Request (이미 비활성)
▪
401 Unauthorized
▪
403 Forbidden
▪
404 Not Found

KEY-006: API Key 삭제

•
요구사항
항목
내용
설명
API Key를 영구적으로 삭제한다
선행 조건
로그인 상태, 해당 Key의 소유자
후행 조건
Key 영구 삭제 (Hard Delete)
•
비즈니스 규칙
◦
BR-023: 삭제된 Key는 복구 불가
◦
BR-024: 삭제된 Key로 API 호출 시 401 에러 반환
•
API 엔드포인트
DELETE /api/v1/api-keys/{keyId} Authorization: Bearer {accessToken}
JSON
복사
•
응답
◦
성공: 204 No Content
◦
실패: 401 Unauthorized, 403 Forbidden, 404 Not Found