약관 관리 API 변경 사항

Branch: MD-455 | Base: MD-341-디스탯-CMS | 작성일: 2026-03-19

1. 변경 요약

핵심 변경: 기존 type (약관명) 필드 1개가 → serviceType (서비스 구분) + termsType (약관 유형) 2개로 분리됨

2. Enum 값 정의

termsGroup (약관 그룹) CHANGE

Value 표시명
SERVICE 서비스
MARKETING 마케팅

기존: DSTAT, MARKETING, LULU_STAT, BIZ_STAT

serviceType (서비스 구분) NEW

Value 표시명
DSTAT 디스탯
LULU_STAT 룰루스탯
DR_STAT 대화형 AI
BIZ_STAT 비즈스탯

termsType (약관 유형) CHANGE

Value 표시명
TERM_SERVICE 서비스 이용약관
PRIVACY_POLICY 개인정보 처리방침 안내
PERSONAL_AGREE 개인정보 수집 및 이용 안내
THIRD_AGREE 개인정보 제3자 제공 동의
SENSITIVE_AGREE 민감정보 수집 및 이용 동의
SENSITIVE_THIRD_AGREE 민감정보 제3자 제공 동의
LULU_TERM_SERVICE 대화형 AI 서비스 이용약관
LULU_PERSONAL_AGREE 대화형 AI 개인정보 수집 및 이용 동의
BIZ_THIRD_AGREE 비즈스탯 제3자 제공 동의
BIZ_SENSITIVE_AGREE 비즈스탯 민감정보 제3자 제공 동의
MARKETING_AGREE 마케팅정보 수신 동의
MARKETING_INFO_AGREE 마케팅 목적의 개인정보 수집 및 이용 동의
AD_INFO_AGREE 광고성 정보 수신 동의

필드명만 type → termsType으로 변경. Enum 값은 동일

requireType (필수 여부) — 변경 없음

Value 표시명
REQUIRED 필수
OPTIONAL 선택
NONE 해당 없음

3. API 별 상세 변경

POST /v1/terms/list

약관 목록 조회

Request Body 변경

상태 필드명 타입 필수 설명
termsGroupArr String[] N 약관 그룹 필터 ["SERVICE", "MARKETING"]
NEW serviceTypeArr String[] N 서비스 구분 필터 ["DSTAT", "LULU_STAT", "DR_STAT", "BIZ_STAT"]
CHANGE termsTypeArr String[] N 약관 유형 필터 (기존 typeArr)
isActive Boolean N 노출 여부
periodOption String Y EFFECTIVE / IN / UP
period Object Y { startDt, endDt } (yyyy-MM-dd)
page Integer Y 페이지 번호
size Integer Y 페이지 크기
keyword String N 검색 키워드
Request Body Diff
"typeArr": ["TERM_SERVICE"]
"serviceTypeArr": ["DSTAT"]
 
"termsTypeArr": ["TERM_SERVICE"]

Response 변경 (data.contents[])

상태 필드명 타입 설명
seq Long 약관 고유 번호
termsGroup String 약관 그룹 코드
termsGroupName String 약관 그룹 표시명
NEW serviceType String 서비스 구분 코드
NEW serviceTypeName String 서비스 구분 표시명 (예: "디스탯")
CHANGE termsType String 약관 유형 코드 (기존 type)
CHANGE termsTypeName String 약관 유형 표시명 (기존 typeName)
effectiveDt String 시행일 (yyyy-MM-dd)
isActive String "노출" / "비노출"
inDtm String 등록일시 (yyyy-MM-dd HH:mm:ss)
inId String 등록자 ID
upDtm String 수정일시 (yyyy-MM-dd HH:mm:ss)
upId String 수정자 ID

Response 예시

{
  "result": "SUCCESS",
  "data": {
    "contents": [
      {
        "seq": 1,
        "termsGroup": "SERVICE",
        "termsGroupName": "서비스",
        "serviceType": "DSTAT",            // NEW
        "serviceTypeName": "디스탯",       // NEW
        "termsType": "TERM_SERVICE",       // CHANGE (기존 type)
        "termsTypeName": "서비스 이용약관", // CHANGE (기존 typeName)
        "effectiveDt": "2026-06-01",
        "isActive": "노출",
        "inDtm": "2026-01-01 00:00:00",
        "inId": "[email protected]",
        "upDtm": "2026-01-15 10:30:00",
        "upId": "[email protected]"
      }
    ],
    "pagination": { ... }
  }
}
GET /v1/terms/{seq}

약관 상세 조회

Response 변경 (data)

상태 필드명 타입 설명
seq Long 약관 고유 번호
termsGroup String 약관 그룹 코드
termsGroupName String 약관 그룹 표시명
NEW serviceType String 서비스 구분 코드
NEW serviceTypeName String 서비스 구분 표시명
CHANGE termsType String 약관 유형 코드 (기존 type)
CHANGE termsTypeName String 약관 유형 표시명 (기존 typeName)
title String 약관 제목
content String 약관 내용 (HTML)
effectiveDt String 시행일 (yyyy-MM-dd)
isActive Boolean 노출 여부
requireType String 필수 여부 코드
requireTypeName String 필수 여부 표시명
sortOrder Integer 정렬 순서
inId String 등록자
inDtm String 등록일시
upId String 수정자
upDtm String 수정일시

Response 예시

{
  "result": "SUCCESS",
  "data": {
    "seq": 1,
    "termsGroup": "SERVICE",
    "termsGroupName": "서비스",
    "serviceType": "DSTAT",
    "serviceTypeName": "디스탯",
    "termsType": "TERM_SERVICE",
    "termsTypeName": "서비스 이용약관",
    "title": "디스탯 서비스 이용약관",
    "content": "<p>약관 내용...</p>",
    "effectiveDt": "2026-06-01",
    "isActive": true,
    "requireType": "REQUIRED",
    "requireTypeName": "필수",
    "sortOrder": 1,
    "inId": "[email protected]",
    "inDtm": "2026-01-01 00:00:00",
    "upId": "[email protected]",
    "upDtm": "2026-01-15 10:30:00"
  }
}
POST /v1/terms

약관 등록

Request Body 변경

상태 필드명 타입 필수 설명 Validation
termsGroup String Y 약관 그룹 SERVICE, MARKETING
NEW serviceType String Y 서비스 구분 DSTAT, LULU_STAT, DR_STAT, BIZ_STAT
CHANGE termsType String Y 약관 유형 (기존 type) Enum 값 참조
effectiveDt String Y 시행일 (yyyy-MM-dd) 현재 이후 날짜만 허용
isActive Boolean Y 노출 여부
requireType String Y 필수 여부 REQUIRED, OPTIONAL, NONE
title String Y 약관 제목 빈 문자열 불가
content String Y 약관 내용 (HTML) 빈 문자열 불가

Request 예시

{
  "termsGroup": "SERVICE",
  "serviceType": "DSTAT",           // NEW - 필수
  "termsType": "TERM_SERVICE",     // CHANGE (기존 type)
  "effectiveDt": "2026-06-01",
  "isActive": true,
  "requireType": "REQUIRED",
  "title": "디스탯 서비스 이용약관",
  "content": "<p>약관 내용</p>"
}
중복 체크 정책 변경: 동일한 termsGroup + serviceType + termsType + effectiveDt 조합이 이미 존재하면 409 Conflict 에러가 발생합니다. (기존: termsGroup + type + effectiveDt)
PATCH /v1/terms/{seq}

약관 수정

Request Body 변경

등록 API와 동일한 구조입니다.

상태 필드명 타입 필수 설명
termsGroup String Y 약관 그룹
NEW serviceType String Y 서비스 구분
CHANGE termsType String Y 약관 유형 (기존 type)
effectiveDt String Y 시행일
isActive Boolean Y 노출 여부
requireType String Y 필수 여부
title String Y 약관 제목
content String Y 약관 내용

4. 필드 매핑 요약 (Before → After)

이 표를 기준으로 기존 FE 코드의 필드명을 일괄 변경하세요.
위치 Before (기존) After (변경) 비고
목록 조회 Request typeArr serviceTypeArr 새로운 필터 (서비스 구분)
termsTypeArr 새로운 필터 (약관 유형)
목록 조회 Response type serviceType + termsType 1개 → 2개로 분리
typeName serviceTypeName + termsTypeName 1개 → 2개로 분리
termsGroup termsGroup Enum 값 변경 (DSTAT→SERVICE 등)
termsGroupName termsGroupName 표시명 변경 (디스탯→서비스 등)
상세 조회 Response type / typeName serviceType / serviceTypeName 추가
termsType / termsTypeName 기존 type을 rename
등록/수정 Request type serviceType 새로운 필수 필드
termsType 기존 type을 rename

5. FE 개발 체크리스트

공통

목록 페이지

등록/수정 폼

상세 페이지