예약 광고 서비스 「어바웃픽」 상품·서비스 기획서 v1.8


0. 한 장 요약

선주가 월 정액으로 「어바웃픽」 등급(A·B·C) 구독 시 아래 세 가지를 한 번에 위탁 가능.

  1. 지면 광고 — 고객웹 새소식 홈·출조 탭·검색·탐색 지도·선박 상세의 12개 지면에 AD 표시와 함께 노출. 고객이 이미 무언가를 정한 순간에 노출: 날씨 확인 시(이 바다로 나가는 배), 날짜 선택 시(이번 주 남은 자리), 마감 확인 시(같은 바다로 나가는 배), 검색 결과가 적은 경우(하루만 옮기면). 화면은 8월통합 디자이너가 제작해 둔 광고 컴포넌트(AD 표시 · 가로 배너 · 검색 추천리스트)와 선박 카드 그대로 사용. 등급 차이는 노출 지면 수와 묶음 내 노출 순서.
  2. SNS 홍보·광고 대행 — 어바웃피싱 인스타그램 게시·릴스, 카카오 채널 출조 소식, 메타 광고 집행 대행, 네이버 키워드광고 운영 대행, 블로그·유튜브 체험 콘텐츠. 광고 대행 수수료와 체험 콘텐츠도 등급 혜택에 포함(광고비 자체는 선주 부담).
  3. 운영 지원 — 선박 사진 촬영, 조황 업로드 대행, 선박 소개 정비, 상품·출조 일정 등록 대행.

12개월을 한 번에 결제하는 「연간 일시 계약」은 추가 할인 5%p · 노출 30일 연장 · 선박 사진 촬영 · 다음 해 자리 우선 확보 추가 제공(2.5).

광고비는 정산금 지급 시 차감이 디폴트(기본값), 정산 이력이 없거나 정산정보가 없는 선주는 계좌 선입금. 세금계산서는 회사가 청구 회차마다 별도 발행.

선주 측 화면은 최소화. 1단계 판매는 영업이 오프라인으로 설명·계약 후 어드민에서 대리 등록, 첫 회차(또는 총액)를 계약금으로 계좌 선수취. 선주 앱 신청 흐름은 2단계로 연기(D-26).

1단계 오픈 목표일은 2027-01-05(화). 개발은 11/2 착수, 광고 서비스 이용약관은 12차 개정에 포함해 11/14 공고·12/14 시행 후 판매 개시.

공수는 프론트엔드 41.0일(고객웹 18.5 · 선주 6.5 · 어드민 12.5 · QA 수정 3.5) · 백엔드 53.5일 · 디자인 6일 · QA 9.5일(맨데이). 선주 측에서 줄인 공수를 고객웹으로 이동 배분. 개발 기간(11/2~12/11, 영업일 30일) 내 완료를 위해 외부 백엔드 1명(D-19)과 외부 프론트 1명 14.0일(D-34) 필요. 외부 프론트 10/30까지 미확보 시 조황 카드(P8)·지도 사진 마커 등을 2/15로 연기하는 절단안(프론트 34.5일 · 백엔드 50.0일 · 지면 10개)으로 착수.

반드시 지키는 원칙 네 가지.


1. 왜 하는가

1.1 수익 구조

1.2 공급 쪽 문제

1.3 선주가 낼 만한가

1.4 시장·경쟁에서 확인한 것

대상 확인한 내용 출처
어신 파트너스 예약 수수료 3%(카드수수료 포함), 설치비·연회비 0원. 광고 상품은 [미확인] us-in.io/app/partners
더피싱 「회원추천선박」 지면, 홈페이지 제작 문의 메뉴. 가격 비공개 thefishing.kr
선상24·물때와날씨·바다타임 공개 광고 상품 페이지 없음 [미확인] —
배민 우리가게클릭 클릭당 50~1,000원(2025-03-04~), 울트라콜 월 8.8만원 정액은 2025년 4월 종료 머니투데이 2025-02-11
야놀자·여기어때 광고비의 10~29%를 고객 쿠폰으로 지급하는 결합 상품, 월 100~300만원 한국경제 2025-08-13
배민사진관 무료 메뉴 촬영 3년간 160개 가게, 참여 가게 주문 수 평균 +15% 사장in 2024-06-20

정리: 낚시 예약 분야에는 공개된 광고 상품 가격표 없음. 가격의 앱 내 공개 자체가 차별점.

1.5 법·정책에서 지켜야 할 것

항목 내용 이 기획의 대응
광고 쿠폰 비용 전가 공정위 2025-08-12 제재(거래상 지위 남용), 2026-05-20 기소, 2026-09-17 첫 공판 등급 상품에서 쿠폰 제외(D-06)
검색 결과 광고 구분 전자상거래법 전부개정안의 「광고 구분 표시 의무」는 2024-05-29 폐기. 현행 직접 조항은 [미확인]. 2014 공정위 모범거래기준은 광고 문구·배치로 구분 권고 AD 표시(8월통합 AD-mark) + 광고 안내 바텀시트 공개(CW-58). 「AD」 표기의 충분성은 법무 확인(D-36)
다크패턴 전자상거래법 다크패턴 6유형 2025-02-14 시행(반복 팝업 등) 출조 탭 첫 진입 플로팅 카드 제외(D-05), 광고 모달·플로팅 없음
「추천」 표기 2017 공정위, 숙박앱이 광고 숙소를 「추천」으로 표시한 건 제재 「추천」 단독 사용 금지, 사용 시 같은 줄에 AD 표시(3.8)
순위 조작 2024 공정위, 쿠팡 검색 순위에 자체 상품 우대(과징금 1,628억원) 광고는 별도 묶음, 일반 목록 노출 순서·개수 불변(3.1)
맞춤형 광고 개인정보보호법상 행태정보 이용 고지와 거부 수단 필요(맞춤형 광고 가이드라인) 예약 이력을 사용하는 지면만 맞춤형으로 간주, 처리방침 「맞춤형 광고」 항목 + CW-61 끄기(D-28)
SNS 경제적 이해관계 표시 추천·보증 심사지침 2024-12-01 시행: 제목 또는 본문 첫 부분에 표시 모든 SNS 게시물 첫 줄 「광고」 또는 「협찬」
광고성 메시지 카카오 친구톡은 2025-12-31 종료, 브랜드 메시지로 대체. 발송 08:00~20:50, 「(광고)」 표시·수신거부 안내 필수 출조 소식 발송은 수신 동의 고객 대상 08:00~20:50인 경우에 한함
정산 상계와 세금계산서 선주 매출은 총액 기준, 광고 용역은 회사가 별도 세금계산서 발행. 상계 예규는 [미확인] 회차마다 세금계산서 발행, 차감은 지급 단계에서만 [세무 확인 필요]
거래 약관 선주와의 광고 거래를 규율하는 조항이 현 약관에 없음 「광고 서비스 이용약관」 신설(12차 편입)

2. 상품 구성

2.1 등급과 가격

업종은 선박 정보로 자동 구분. 유선 = 최대 탑승 22인 이상 대형 선박(전국 약 20척), 그 외는 유어선. 가격은 부가세 별도 [결정 필요 D-02].

유어선(월 금액, 원)

약정 A등급 B등급 C등급
1개월 600,000 400,000 250,000
3개월 600,000 400,000 250,000
6개월 570,000 (5%) 380,000 (5%) 250,000
9개월 510,000 (15%) 360,000 (10%) 237,500 (5%)
12개월 450,000 (25%) 340,000 (15%) 225,000 (10%)

유선(월 금액, 원)

약정 A등급 B등급 C등급
1개월 1,000,000 700,000 500,000
3개월 1,000,000 700,000 500,000
6개월 900,000 (10%) 630,000 (10%) 475,000 (5%)
9개월 800,000 (20%) 595,000 (15%) 450,000 (10%)
12개월 650,000 (35%) 525,000 (25%) 400,000 (20%)

2.2 등급별로 받는 것

구분 항목 A B C
카드 광고 카드 모양 8월통합 카드 그대로(등급 무관 동일) 동일 동일
지면 P1 출조 탭 「이번 주 함께하는 배」 ● — —
지면 P2 출조 탭 「이번 주 남은 자리」 ● ● ●
지면 P3 출조 탭 「내일 새벽 출항」 ● ● —
지면 P4 검색 결과 「이 조건으로 나가는 배」 ● ● ●
지면 P13 검색 결과 「하루만 옮기면」 ● ● ●
지면 P12 통합검색 「지금 예약 열린 배」 ● ● ●
지면 P5 선박 상세 「같은 항구에서 나가는 배」 ● ● ●
지면 P17 선박 상세 마감일 「같은 바다로 나가는 배」 ● ● ●
지면 P6 새소식 홈 「이 바다로 나가는 배」 ● ● —
지면 P7 새소식 홈 「다음 출조, 이 배는 어때요?」 ● ● —
지면 P8 새소식 홈 「선장님 조황 소식」 ● ● —
지면 P14 탐색 지도 사진 마커 ● ● —
지면 수 1단계 12개 중 12 11 6
SNS(회차마다) S1 인스타그램 게시 2건 1건 —
SNS(회차마다) S2 인스타그램 릴스 1건 — —
SNS(회차마다) S3 카카오 채널 출조 소식 칸 2칸 1칸 —
운영(회차마다) O2 조황 업로드 대행 8건 4건 2건
운영 O3 선박 소개 정비 계약 시 1회 계약 시 1회 계약 시 1회
광고 대행(회차마다) S7 네이버 키워드광고 운영 대행 대행 수수료 무료 대행 수수료 무료 대행 수수료 50%
광고 대행 S4 메타 광고 집행 대행 회차마다 1건 대행 수수료 무료 3회차마다 1건 대행 수수료 무료 —
체험 콘텐츠 S5 블로그 체험 후기 6개월 이상 약정 시 1건 12개월 약정 시 1건 —
운영(회차마다) O4 상품·출조 일정 등록 대행 1회 1회 —
운영 O1 선박 사진 촬영 6개월 이상 약정 시 1회 12개월 약정 시 1회 연간 일시 계약 시 1회

2.3 단건 홍보 상품 (등급 없이도 구매 가능)

코드 상품 가격(부가세 별도) [제안] 소요 결과물
S1 인스타그램 게시 50,000원 자료 수령 후 5영업일 어바웃피싱 계정 피드 1건(사진 3~5장 + 소개 글, 첫 줄 「광고」)
S2 인스타그램 릴스 100,000원 7영업일 15~30초 영상 1편(선주 제공 영상·사진 편집)
S3 카카오 채널 출조 소식 30,000원 다음 발송일 매주 목요일 10시 발송 묶음에 1칸
S4 메타 광고 집행 대행 광고 예산 + 대행 수수료 15% (최소 예산 300,000원) 집행 7~30일 우리 메타 광고 계정에서 선박 상세로 연결하는 광고, 종료 후 결과 보고
S5 블로그 체험 후기 150,000원 + 선주 제공 탑승 1석 탑승 후 10영업일 블로거 후기 1건(첫 줄 「협찬」)
S6 유튜브 체험 영상 상담 후 견적 협의 제휴 크리에이터 탑승 영상 1편(「유료 광고 포함」 표시)
S7 네이버 키워드광고 운영 대행 월 광고비(200,000원 이상, 10,000원 단위) + 대행 수수료 15%(최소 30,000원) 신청 후 3영업일 내 집행 시작, 1회차 = 1개월 우리 네이버 검색광고 계정에서 선박 상세로 연결하는 키워드 광고(지역·항구·어종 키워드 20개 안팎), 월말 결과 보고
O1 선박 사진 촬영 200,000원 (인천·경기·충남, 그 외 출장비 별도 견적) 촬영 후 5영업일 대표 이미지 1장 + 업체 이미지 최대 10장 교체
O2 조황 업로드 대행 5건 묶음 50,000원 사진 수령 다음 영업일 조황 글 5건 등록
O3 선박 소개 정비 50,000원 3영업일 소개문(200자)·대표 어종·서비스·편의시설·상세 위치 안내 정리
O4 상품·출조 일정 등록 대행 30,000원 / 1회 자료 수령 다음 영업일 선주가 보낸 일정표(사진·엑셀)로 상품·출조 일정 최대 30일분 등록·수정

2.5 연간 일시 계약 [결정 필요 D-38]

12개월 약정 총액을 한 번에 계좌로 선입금하는 계약(billing_type = U, months = 12). 1단계는 영업이 AD-82에서 「연간 일시 계약」 선택 후 대리 등록.

혜택 내용
추가 할인 12개월 약정 할인율에 5%p 추가 할인
노출 연장 프로모션 일수 30일 디폴트 부여(운영자 추가분 합산 최대 60일)
선박 사진 촬영 O1 1회(모든 등급). A등급은 7회차에 1회 추가(재촬영)
다음 해 자리 우선 확보 종료일 60일 전까지 같은 지역·등급으로 연장 계약 등록 시, 해당 슬롯을 대기 계약보다 우선 승계

유어선(월 금액 · 총액, 원, 부가세 별도)

등급 12개월 월결제 연간 일시 월 금액 연간 일시 총액
A 450,000 (25%) 420,000 (30%) 5,040,000
B 340,000 (15%) 320,000 (20%) 3,840,000
C 225,000 (10%) 212,500 (15%) 2,550,000

유선(월 금액 · 총액, 원, 부가세 별도)

등급 12개월 월결제 연간 일시 월 금액 연간 일시 총액
A 650,000 (35%) 600,000 (40%) 7,200,000
B 525,000 (25%) 490,000 (30%) 5,880,000
C 400,000 (20%) 375,000 (25%) 4,500,000

2.4 1단계에서 빼는 것

항목 이유
출조 탭 첫 진입 플로팅 카드 탭 진입마다 화면을 가리는 오버레이는 다크패턴(반복 팝업) 소지, 결제 진입 직전 방해
쿠폰 선박 모듈·등급별 할인 쿠폰 선주 부담 쿠폰은 금지(추석 이벤트 결정 R8), 숙박 플랫폼 기소 사례
「어바웃피싱 인증」 뱃지 유료로 받는 표시를 「인증」으로 부를 경우 오인 소지
24시간 전담 운영 지원 운영 인력 없음
외부 광고주(용품 브랜드·지자체) 9/28 일정 지시에서 1단계 제외
클릭당 과금·입찰 월 등급제로 결정(10/1)
선주 앱 신청 흐름(SJ-90E 신청·SJ-91·92·92C·93), 연장·해지 요청 바텀시트(SJ-94R), 단건 상품 앱 신청(SJ-98) 1단계 판매는 영업 오프라인 계약 + 어드민 대리 등록 + 계약금 선수취로 충분(10/1 지시). 2단계에서 오픈(D-26)
2·3단계 지면(3.7) 1단계 12개 지면의 노출·클릭·예약 확인 후 오픈

3. 지면 노출 정책

이번 개정의 중심은 고객웹 노출임. 아이디어 215건(지면 53 · 카드 32 · 맥락 35 · 콘텐츠 29 · 해외 사례 28 · 기발한 것 30 · 법 검토 39) 수집 후 고객 가치 · 선주 가치 · 표시 의무 · 공수 기준으로 선별, 1단계 12개 지면, 2단계 7개, 3단계 6개로 구분함.

설계 원칙 다섯 가지.

  1. 고객이 이미 무언가를 정한 순간에 노출. 날씨 조회 시, 날짜 선택 시, 마감 확인 시, 다음 출조 검토 시.
  2. 광고는 「목록 사이에 끼우지 않고」 별도 묶음으로 구성. 일반 목록의 노출 순서와 개수는 유지.
  3. 광고 화면은 새로 그리지 않음. 8월통합 디자이너가 만들어 둔 광고 컴포넌트와 카드를 그대로 사용(3.5). 등급 차이는 노출 지면 수와 묶음 내 노출 순서로 구분.
  4. 모든 유료 노출에 광고 표시(고객웹 AD 표시, SNS 「광고」) 필수. 모듈 이름은 「~하는 배」처럼 상황을 설명하는 형태로 작성.
  5. 맥락(바다·날짜·어종·위치)은 조건으로만 사용하고, 노출 순서는 광고비(등급)와 무작위로만 결정. 「맥락 점수 순」 같은 숨은 순위 생성 금지.

3.1 공통

3.2 지면별 (1단계, 2027-01-05 오픈)

코드 모듈 이름(기본값) 화면·지면 칸 등급 조건과 동작
P1 이번 주 함께하는 배 CW-50 출조 탭, 전시관리 섹션 015 지역 탭마다 최대 6 A 출조 홈 「인기 선박 모음」 모듈을 그대로 복제(제목 + AD 표시 · 텍스트 탭 · Card/Ship/Common 177 · [더보기]). A 계약 선박이 있는 지역만 탭으로 노출. 탭 정렬 기준: 위치 동의 시 가까운 지역 우선, 미동의 시 고정 순서(인천·경기·충남·전남·경남·전북·강원·경북·제주). 맞춤 광고가 켜진 로그인 고객은 최근 1년 예약 지역을 첫 탭으로 배치
P2 이번 주 남은 자리 CW-50, 섹션 016 날짜 탭마다 최대 6 A·B·C 「인기 선박 모음」과 같은 모듈, 날짜 탭 = 내일부터 5일. 그날 남은 좌석 1~5석 상품이 있는 선박을 Card/Ship/Common의 상품 줄(상품명 · 물때 + Badge/Seats left)로 노출. 물때는 위치 동의 시 가까운 지역의 표기법(부록 B)으로 표기, 미동의 시 제외. 카드는 해당 날짜를 resDt로 전달. 카드의 상품 = 그날 남은 좌석 1~5석 상품 중 출항이 가장 이른 상품(상품명과 「잔여 N석」 배지를 카드에 표기). 광고 선박이 없는 날짜 탭은 미노출, 전체가 비면 모듈 미노출
P3 내일 새벽 출항 CW-50, 섹션 017 최대 6줄 A·B 같은 모듈 머리 + 날짜 탭 1개(내일) + Card/List(사진 114) 세로 목록, 4개까지 노출 후 [더보기]. 내일 출항하는 예약 가능 상품이 있는 광고 선박을 선택해 출항 시각 순으로 노출, 상품 줄 「04:30 출항 주꾸미 종일 1부」 + 「잔여 N석」. 줄 탭 시 CW-30(&resDt=내일) 진입. 3척 미만 시 모듈 미노출. 「출항 확정」 표시는 2단계(선장 확인)
P4 이 조건으로 나가는 배 CW-51 검색 결과 목록 위 최대 3 A·B·C 검색 조건(검색어·날짜·인원·지역·어종)을 그대로 적용해 선택한 광고 선박을 목록 위 [광고]추천리스트(디자이너 컴포넌트: 회색 상자 · 키워드 머리 줄 + AD · 검색결과 카드 · 「예약 가능 상품 N건」)로 노출. 일반 결과에서 제외하지 않으며 중간 삽입 없음. 정렬 기준 변경 시에도 묶음은 최상단 유지. 「N건의 검색 결과」는 일반 결과 수만 산정. 프론트는 검색 응답 수신 후 P4 응답을 최대 300ms 추가 대기한 뒤 함께 렌더링, 이후 도착한 P4 응답은 폐기(목록 밀림 방지 목적, 노출 이벤트도 없음)
P13 하루만 옮기면 CW-51 결과 최하단(결과 5건 미만 시 바로 아래, 0건 시 「결과 없음」 아래) 최대 2 A·B·C 날짜 입력 후 검색했으나 일반 결과가 5건 미만인 경우에 한함. 같은 검색어·지역·어종·인원 기준으로 선택한 날짜 다음 날(D+1)을 우선 조회, 없으면 전날(D−1, 내일보다 이르면 제외)에 예약 가능한 광고 선박. 한 선박에 날짜 하나. P4와 같은 추천리스트 상자, 머리 줄 「하루만 옮기면 / 1. 23(토) 4석 / 어종」(세로선으로 구분). 탭 시 CW-30(&resDt=그 날짜) 진입
P12 지금 예약 열린 배 CW-27 통합검색 첫 화면, 디자이너가 만든 AD 배너 지면(「지금 인기있는 선박」 아래) 1 A·B·C 검색어 입력 전 화면. 위치 동의 시 가까운 지역(해당 지역 광고 선박이 0척이면 전국), 미동의 시 전국. Card/Horizontal-banner Box 1장 「지금 예약 열린 배, / 1. 21(목) 3석 남았어요」
P5 같은 항구에서 나가는 배 CW-30 선박 상세, 「이런 곳은 어때요?」 위 별도 모듈 최대 3 A·B·C 선박상세 모듈 머리(「최신 조황」과 동일) + AD 표시 + Card/Small 115. 현재 조회 중인 선박과 같은 항구의 광고 선박(현재 선박 제외). 같은 항구로 3칸을 채우지 못하면 같은 지역(9지역)으로 채움(제목은 같은 항구가 1척 이상이면 「같은 항구에서 나가는 배」, 0척이면 「같은 바다에서 나가는 배」). 「이런 곳은 어때요?」 목록은 유지
P17 같은 바다로 나가는 배 CW-30 예약 달력 → CW-59 바텀시트 최대 5 A·B·C 고객이 선택한 날짜의 상품이 모두 마감됐거나 해당 선박이 「전화 예약」 선박인 경우(선박의 전화 예약 구분 값 [확인 필요: 필드명]) 날짜 선택 시점에 프론트가 P17을 한 번 호출, 광고 선박이 1척 이상이면 날짜 머리 아래에 Card/Horizontal-banner 배너 「1월 22일(금)은 마감됐어요 / 같은 바다로 나가는 배가 있어요 · 인천 4척 보기 ›」 노출(0척이면 AD 없는 같은 배너로 일반 검색 안내). CW-59는 해당 응답 재사용(재호출 없음). 바텀시트에 같은 지역에서 그날 남은 좌석이 있는 광고 선박 + 최하단 이날 출항하는 배 모두 보기
P6 이 바다로 나가는 배 CW-01 새소식 홈, 디자이너가 만든 AD 배너 지면(이벤트 위) 1 A·B 프론트는 날씨 카드 장소의 place_code만 전달. 서버는 장소 → 시도 → 9지역(ad_region_map)으로 변환, 해당 지역 광고 선박을 3.1 순서로 조회해 「앞으로 5일 중 지역 예보 일 최대 파고(ad_region_wave) 1.5m 이하이면서 예약 가능한 날」이 있는 첫 선박 1척 선택. 날짜는 해당 조건의 날 중 파고가 가장 낮은 날, 동일 시 이른 날. Card/Horizontal-banner Box: 「1. 22(금) 파고 0.5m, / 영흥도 진두항 바다로 나가요 · 인천 황금어장호 ›」. 바다가 아닌 장소(민물)는 프론트 호출 없음. 고객이 카드의 장소 변경 시 재호출
P7 다음 출조, 이 배는 어때요? CW-01, D-day 카드 지면 1 A·B 로그인 + 앞으로 남은 예약 0건 + 지난 예약 1건 이상 + 맞춤 광고 켬인 경우에 한함. 마지막 결제 예약(취소 제외)의 상품 어종과 하나 이상 겹치고 같은 9지역인 광고 선박을 3.1 순서로 조회, 앞으로 14일 내 예약 가능한 첫 선박을 Card/Horizontal-banner Box 1장(「지난번 주꾸미, / 이번엔 드래곤호에서 · 1월 21일(목) 잔여 2석 ›」)으로 노출(해당 선박의 가장 이른 예약 가능 상품). 남은 예약이 있으면 기존 D-day 카드 노출
P8 선장님 조황 소식 CW-01, 전시관리 섹션 018(디폴트(기본값) 노출 순서 = 퀵메뉴 바로 아래) 앞 3칸 A·B 출조 홈 「실시간 조황」과 같은 Card/Catch 177 2열. 앞 3장 = last_catch_at이 72시간 이내인 광고 선박의 최근 조황(어종 오른쪽 AD 표시). 그 뒤 = 최근 24시간 일반 조황 카드, 최신순(광고 아님, 앞 3장에 노출된 선박은 제외). 탭 시 CW-60 선장님 조황 보기 진입
P14 지도 사진 마커 CW-40 탐색 지도, 선박 레이어 화면 안 최대 3 A·B 선박 레이어 활성화 시 광고 선박의 항구 위치에 기존 지도 마커와 같은 흰 알약 마커(사진 원 22 · 선박명 · AD 표시) 노출. 기존 항구 마커는 유지. 마커 탭 시 기존 「선박 정보」 바텀시트(머리 AD 표시)에 해당 항구 광고 선박 Card/List 줄 노출, 줄 탭 시 CW-30 진입. 같은 항구 광고 선박이 여럿이면 마커 1개에 「+N」 표기. 최대 3은 마커 수 기준으로 산정. 노출은 마커 노출 시 대표 선박(3.1 순서 첫 선박) 1건, 나머지 선박은 바텀시트 줄 노출 시 산정. 지도 이동 시 0.5초 정지 후 재호출

3.3 판매 상한 (재고)

3.4 광고 안내 시트(CW-58) 문구

제목: 광고 선박 안내 본문: - 「AD」 표시가 붙은 선박은 선주님이 비용을 내고 노출하는 광고입니다. - 광고 묶음 안의 순서는 광고 등급 순서이고, 같은 등급 안에서는 무작위로 정해집니다. 평점·조황·가격과는 관계가 없습니다. - 광고는 검색 결과와 목록의 순서·개수를 바꾸지 않습니다. 광고가 아닌 선박은 고객님이 고른 정렬 기준(거리순·인기순·가격순)을 따릅니다. - 일부 광고는 지금 보시는 바다·날짜·검색 조건에 맞춰 고릅니다. 예약 이력으로 고르는 광고는 맞춤 광고 설정에서 끌 수 있습니다. - 광고 선박도 예약·결제·취소·환불 기준은 다른 선박과 똑같습니다. 버튼: [확인] · 텍스트 버튼 [맞춤 광고 설정] → CW-61 진입: 현재 주소에 &sheet=ad-info 추가. 뒤로가기·[확인]·바깥 영역 탭 시 닫힘.

3.5 광고 화면 구성 — 8월통합 디자이너 컴포넌트 그대로

광고 화면은 새로 그리지 않음. 8월통합 파일에 디자이너가 이미 만들어 둔 광고 컴포넌트와 선박 카드를 그대로 사용. 등급에 따른 카드 모양 변경 없음. 등급 차이는 노출 지면 수(A 12 · B 11 · C 6, 2.2)와 묶음 내 노출 순서(A → B → C)로 구분.

디자이너 컴포넌트(Figma) 규격 사용 지면
AD-mark(11774:8006) 25×14 · 「AD」 11.5 Bold · 테두리 검정 30% · 모서리 4. 검색 추천리스트 안은 테두리 #EEEEEE · 글자 #AAAAAA 모든 지면의 광고 표시. 탭 시 CW-58 진입
Card/Horizontal-banner Box(15736:31575) 361×96 · 흰 바탕 · 모서리 4 · 그림자 0 1 2 4% · 사진 68 · 제목 16 SemiBold 두 줄 · 보조 줄 12.5 Medium #767676 › · AD 오른쪽 아래 P6(새소식 기존 AD 배너 지면) · P7(D-day 지면) · P12(통합검색 기존 AD 배너 지면) · P17(마감 날짜)
[광고]추천리스트(15736:84993) 상자 #F8F8F8 · 모서리 4 · 머리 줄 키워드 3개 14 SemiBold(세로선 1×12 #E7E7E7) + AD · 검색결과 카드(선박명 17 · 지역 거리 13.5 · 가격 15 Bold · 태그 · 사진 98) · 선 · 「예약 가능 상품 N건 ⌄」 13 SemiBold #919191 P4 · P13
출조 홈 「인기 선박 모음」 모듈 제목 16 Bold · 텍스트 탭 14.5 · Card/Ship/Common 177 가로 넘김 · [더보기] P1 · P2 · P3(머리 오른쪽에 AD만 추가)
Card/Ship/Common(15884:23176) Medium 177(사진 177×140) · Small 115 · Holizontal(Card/List, 사진 114). 선박명 15 SemiBold · 상품 줄 13 Medium + Badge/Seats left · 지역 13 #767676 + 거리 13 #BBBBBB · 가격 15 Bold · 어종 배지 · 할인쿠폰 P1 · P2 · P3 · P5 · P14 바텀시트 · CW-59
Card/Catch(14881:25257) 사진 177×177 · 어종 15 SemiBold(옆에 AD) · 선박 아바타 22 + 12 SemiBold, 2열 P8
선박상세 모듈 머리 제목 17 SemiBold · 좌우 20 P5(오른쪽 AD)

3.6 맥락 데이터와 선택 엔진

모든 지면은 서빙 API 하나(10장 POST /usr/ads/slots)를 호출, 지면별 조건은 서버의 모듈 규칙 표(ad_module_rule)로 관리. 새 지면 오픈 시 프론트 모듈 + 규칙 1행 추가.

맥락 원천 사용 지면 1단계 처리
날짜·남은 좌석 상품(날짜별 잔여석) [확인됨] 전 지면 10분 배치가 ad_boat_context.products_by_date = {날짜: [{product_idx, depart_time, seats, fish_codes}]}(내일부터 30일) 생성. 예약 가능한 날 = seats ≥ max(1, 요청 인원)인 상품이 1개 이상인 날. near_seat = 가장 이른 예약 가능한 날과 그날 seats 최댓값
물때 음력 날짜 P2 ad_lunar_day(양력 날짜 → 음력 일)에 2026~2028년 적재, 부록 B 표기 표로 9지역 표기법(서해 인천·경기·충남·전북 = 7물때식, 그 밖 = 8물때식)에 맞춰 변환. 항구별 조석 지점 연결은 2단계 [D-30]
파고 날씨 카드가 쓰는 예보 API의 9지역 대표 지점 [확인 필요: 지점 코드] P6, P3 3시간 배치가 ad_region_wave(region_code, fcst_date, wave_max)에 내일부터 5일 일 최대 파고 적재. 6시간 넘게 갱신 실패 시 wave를 빈 값으로 전달, P6는 미노출, P3는 파고 칸 접힘 처리
조황 선주 조황 글(작성일·사진) [확인됨] P8 선장님 조황 소식 10분 배치로 선박별 catch_days_7(오늘을 마지막 칸으로 하는 참/거짓 7개) · last_catch_at · 최근 사진 3장
예약 이력 회원 예약 내역 [확인됨] P7, P1 탭 순서 맞춤 광고 켬(디폴트 켬, CW-61에서 끔)인 경우에 한함
위치 위치 동의 [확인됨: 거리 표기] P1 탭 순서, P12 동의한 경우에 한함, 좌표 미저장
검색 조건 검색 요청 파라미터 P4·P13 기존 검색 조건 해석 그대로 사용
항구 선박 항구 정보 [확인됨] P5·P14 항구 좌표가 없는 선박은 P14에서 제외

3.7 2단계·3단계 지면 (1단계 성과를 보고 연다)

단계 코드 이름 지면 등급 선결 조건
2단계(2027-03) P9 15초 바다 새소식 홈 세로 영상 줄 A 릴스(S2) 제작 영상 재사용, 영상 저장·전송 [D-31]
2단계 P10 피드 속 선장 조황 팔로잉 활동 피드 5번째 뒤 1칸 A·B 피드 API에 광고 슬롯 확보
2단계 P11 시군구 대표 배 출조 탭 지역 아코디언 펼친 칸 위 1줄 A·B·C 시군구 코드 정리
2단계 P15 이 바다로 가는 배 회원 조과 상세 하단 「요즘 핫한 선박」 위 A·B 조과 좌표 → 가까운 항구
2단계 P16 이 항구 배 탐색 지도 항구 바텀시트 선박 탭 최상단 · CCTV 바텀시트 아래 A·B·C 항구 시트 API
2단계 P18 선장 소개 블록 자기 선박 상세 히어로 아래(자기 페이지 꾸밈) A 카드 소재 영상
2단계 P3+ 출항 확정 표시 「내일 새벽 출항」 줄에 「출항 확정」 A·B 18시 알림톡 버튼으로 선장이 확정 [D-29]
3단계 — 같은 물때 다시 보기 지난 예약 날짜와 같은 물때가 오는 날 알림 A·B 맞춤 광고 동의 + 광고성 정보 수신 동의
3단계 — 손맛 지수 출조 탭 지역 탭 옆 지수 + 그 지역 광고 배 A·B 조과 데이터 축적
3단계 — 지역×어종 페이지 「인천 쭈꾸미 배낚시」 검색 유입 페이지 상단 A·B·C 페이지 생성·SEO
3단계 — 첫 조황 알림 관심 어종 시즌 첫 조황 등록 시 웹 푸시 A 수신 동의 · 「(광고)」 · 야간 21~08시 별도 동의
3단계 — 바다 여권 다녀온 항구 도장 + 다음 항구 배 A·B 예약 이력 · 맞춤 광고
3단계 — 주말 바다 예보 금요일 주말 예보 카드 하단 「이번 주말 나가는 배」 A·B 예보 콘텐츠 운영
보류 P19 결항 다시 잡기 예약 내역 취소 탭(기상 결항 건) A·B·C 취소 구간 광고 금지 원칙과 충돌 여부 법무 확인 [D-32]

3.8 표시 규칙 (모든 지면)

항목 규칙
광고 표시 8월통합 AD-mark 컴포넌트(25×14 · 「AD」). 모듈은 머리 오른쪽, 배너는 오른쪽 아래, 추천리스트는 상자 머리 오른쪽, 조황 카드는 어종 오른쪽, 지도 마커는 선박명 오른쪽. 탭 시 CW-58 진입. 스크린리더는 「광고」로 읽음
모듈 제목 같은 화면의 기존 모듈 머리와 동일(출조 홈 16 Bold · 좌우 16, 선박상세 17 SemiBold · 좌우 20) + 오른쪽 AD 표시
디자인 8월통합 디자이너 광고 컴포넌트(AD-mark · Card/Horizontal-banner · [광고]추천리스트)와 선박 카드 그대로 사용
이름 「~하는 배」 꼴. 「추천」 사용 시 같은 줄에 AD 표시 필수
순서 공개 광고 묶음은 순번 미표기(1·2·3 숫자 없음)
맞춤 예약 이력을 쓰는 지면(P7, P1 탭 순서)은 CW-61 맞춤 광고 설정에서 해제 가능. 해제 시 다음 요청부터 반영
쿠폰 광고 카드에 선주 부담 쿠폰 미적용. 기존 「할인쿠폰」 배지(회사 쿠폰)는 일반 카드와 같은 규칙으로만 노출
거짓 희소성 「잔여 N석」은 실제 잔여석. 타이머·「마감 임박」 문구를 광고 카드에 별도 생성하지 않음

4. 홍보·운영 작업 정책

4.1 작업 흐름

상태(코드) 선주 표기 뜻 다음 단계 전환 조건
접수(REQ) 접수됨 이용권 사용 또는 단건 신청으로 생성된 상태 운영자가 담당자 지정 시 「자료 요청」 또는 「제작 중」
자료 요청(MAT) 자료를 올려 주세요 사진·영상·내용을 선주에게 받는 중 선주 자료 업로드 시 「제작 중」. 14일 내 미업로드 시 「취소(자료 미제출)」 — 이용권은 사용 처리, 단건은 청구 취소
제작 중(WIP) 만드는 중 운영팀 작업 결과물 업로드 시 「선주 확인」
선주 확인(REV) 확인해 주세요 결과물 승인 또는 수정 요청 대기 [이대로 올려 주세요] → 「게시 준비」. [수정 요청] → 「제작 중」(무료 1회). 72시간 내 응답 없으면 자동 승인 → 「게시 준비」
게시 준비(APV) 게시 준비 중 선주 승인 후 실제 게시·발송·반영 대기(카카오 소식은 다음 목요일 발송까지) 운영자가 결과 링크 입력 후 [완료 처리] → 「완료」
완료(DONE) 완료 게시·등록·발송 완료 결과 링크 보관
취소(CXL) 취소됨 운영자 취소 또는 자료 미제출 단건: 청구 전이면 미청구, 청구 후면 청구 취소(차감·입금분 환급)

상품별 단계(ad_service_item.needs_material · needs_review)

코드 상품 자료 요청 선주 확인 비고
S1 인스타그램 게시 있음 있음
S2 인스타그램 릴스 있음 있음
S3 카카오 출조 소식 있음(사진 1장·한 줄 소개) 있음 승인 후 다음 목요일 발송까지 게시 준비
S4 메타 광고 대행 없음(선택 메모) 있음(광고 문구·이미지) 계좌 선입금 확인 후 시작
S5 블로그 체험 후기 없음 없음 후기는 블로거가 작성. 사실 오류에 한해 고객센터로 정정 요청
S6 유튜브 체험 영상 — — 1단계는 상담 신청만(작업 아님)
O1 선박 사진 촬영 없음 있음(사용할 사진 선택) 촬영일은 운영자가 입력
O2 조황 업로드 대행 있음(사진) 없음 즉시 등록, 선주는 조황관리(SJ-40)에서 수정·삭제
O3 선박 소개 정비 없음 있음(소개문)
S7 네이버 키워드광고 대행 없음(원하는 키워드 메모 선택) 있음(키워드 목록·광고 문구) 계좌 선입금 확인 후 시작. 회차마다 새 작업으로 생성
O4 상품·출조 일정 등록 대행 있음(일정표 사진·엑셀) 없음 등록 후 선주 상품관리에서 확인

4.2 처리 상한


5. 계약과 결제

5.1 계약 단위

5.2 계약 상태

상태(코드) 뜻 선주 표기 색
임시저장(DRF) 어드민에서 저장만 함, 선주에게 미노출 — —
확인 중(REQ) 선주 신청, 운영 확인 대기 확인 중 주황
대기(WAI) 지역·등급 슬롯 마감으로 대기 자리 대기 (N번째) 회색
반려(REJ) 운영 반려(사유 필수) 진행 불가 빨강
입금 대기(PAY) 승인, 계좌 선입금 대기 입금 대기 주황
집행 예정(SCH) 승인(정산 차감) 또는 입금 확인 후 시작일 전 시작 예정 파랑
집행 중(ACT) 시작일 00:00부터 종료일 23:59까지(해지일 지정 시 「해지 예정 M. D」 함께 노출) 광고 중 초록
일시정지(PAU) 정지 원인이 하나라도 있음 일시정지 빨강
만료(END) 종료일 경과 종료 회색
해지(TRM) 중도 해지(사유: 선주 요청·미납·등급 변경·회사 귀책·폐업) 해지 회색
취소(CXL) 선주가 확인 중·대기에서 직접 취소, 또는 입금 기한 경과 신청 취소 회색

상태 칩 색 토큰(글자/배경, 대비 4.5:1 이상): 초록 #00754A/#E6F7EF · 주황 #9A5200/#FFF4E5 · 빨강 #B3261E/#FDECEC · 파랑 #0041FF/#EBF0FF · 회색 #5F5F5F/#EFEFEF.

정지 원인 플래그(pause_flags): UNPAID(미납) · OPS(운영 정지, 사유 필수) · HIDDEN(선박 노출안함). 원인 전체 해소 시에만 집행 중으로 복귀. 정지 중에도 회차 청구 유지(회사 귀책 정지는 OPS 사유 「회사 사정」으로 기록, 프로모션 일수로 보상).

전이 규칙

출발 도착 조건·주체
(신청) 확인 중 / 대기 선주 신청 시 상한 여유 있으면 확인 중, 여유 없으면 대기
임시저장 확인 중 / 대기 운영자 신청으로 넘기기
임시저장 (삭제) 운영자 [삭제] — 임시저장만 실제 삭제, 이력은 admin_log에 기록
확인 중 대기 승인 시 AD4096 후 운영자 [대기로]
대기 확인 중 3.3 대기 승격 판정 통과 시 자동(AN16)
대기 취소 희망 시작일 + 30일까지 미승격 시 자동(AN21)
(등급 변경) 집행 예정 / 입금 대기 운영자 change-grade: 새 계약을 정산 차감이면 집행 예정, 계좌면 입금 대기로 생성 + 원 계약 terminate_date 설정
확인 중 입금 대기 운영 승인 + (pay_method = T 계좌 선입금 또는 first_cycle_upfront = true). 이때 1회차(계좌 일시 결제면 총액) 청구를 계좌로 생성, AN04
확인 중 집행 예정 운영 승인 + pay_method = D 정산 차감 + first_cycle_upfront = false(정산정보 등록 필수)
확인 중 반려 운영 반려(사유 코드 + 설명 10자 이상)
확인 중·대기 취소 선주 [신청 취소] 또는 운영자 취소
대기 반려 운영자 반려(사유 코드 + 설명 10자 이상)
입금 대기 집행 예정 운영 입금 확인(상한 재검사). 입금 확인 시점에 시작일 경과 시 시작일을 입금 확인 다음 날로 재설정, 회차·종료일·1회차 청구일 재계산(금액 동일)
입금 대기 대기 입금 확인 시 상한 초과 + 운영자 「대기 1번으로 두기」
입금 대기 취소 승인 후 168시간 경과(매시 배치), 1회차·일시 청구 VOID, AN18
집행 예정 집행 중 시작일 00:00 배치(시작일 ≤ 오늘이면서 미전환 건까지 처리)
집행 예정 일시정지 시작일 배치 시점에 정지 원인(미납·숨김·운영) 존재 시 즉시 일시정지
집행 예정 해지 운영자(선주 요청·폐업) — 수납액 전액 환급
집행 중 일시정지 정지 원인 발생(미납 자동·운영 수동·선박 노출안함 자동)
일시정지 집행 중 모든 원인 해소(자동)
집행 중·일시정지 만료 종료일 다음 날 00:00 배치
집행 중·일시정지 (해지일 지정) 운영자 해지 처리 시 terminate_date(오늘 이후) 저장. 해당일 23:59까지 현 상태로 노출
집행 중·일시정지 해지 terminate_date 다음 날 00:00 배치

5.3 기간과 회차

시작일 약정 회차 시작일 종료일(프로모션 0)
2027-01-05 3개월 01-05 · 02-05 · 03-05 2027-04-04
2027-01-31 3개월 01-31 · 02-28 · 03-31 2027-04-29 (4월 말일 30일에서 −1)
2028-02-29 1개월 02-29 2028-03-28
2027-03-31 1개월 03-31 2027-04-29

5.4 청구

5.5 정산금 차감

현행 정산 구조 [확인됨]: 정산은 예약 1건당 1행(accounts), 어드민 정산관리에서 운영자가 행 선택 후 [선택지급요청] 클릭 시 지급 진행. 선주 정산관리는 동일 행들을 정산 예정일 단위로 묶어 노출.

5.6 미납

경과(청구일 기준) 처리 알림
+14일 미수가 남아 있고, 계좌 결제이거나 해당 선박의 지급 전 정산 예정액이 미수보다 적은 경우 계좌 입금 요청 AN07(due_notice_at 기록, 한 번만)
+21일 정지 원인 UNPAID 추가, 진행 중 작업 보류 표시 AN08(overdue_at 기록, 한 번만)
미수 0원 UNPAID 해제, 다른 원인 없으면 재개 AN09
+60일 운영자가 해지(사유 미납) 후 채권 관리 —

5.7 중도 해지 [결정 필요 D-10]

5.8 세금계산서


6. 측정과 리포트

6.1 지표 정의

지표 정의
노출 광고 카드(목록 줄·조황 카드·사진 마커·바텀시트 줄 포함)가 화면에 50% 이상, 1초 이상 연속 노출 시 1회. 동일 세션 안에서 (지면, 선박) 조합은 1회만 집계(탭·날짜 탭이 달라도 1회). 지도 마커는 지도 화면 안에 마커 전체가 1초 이상 노출된 경우
클릭 광고 카드 본문 또는 카드 안 [예약하기] 탭 횟수. 중복 미제외. 찜·공유 버튼 탭은 클릭에서 제외. 조황 카드(P8)는 조황 보기 안 [이 배 예약하기], 지도 마커(P14)는 「선박 정보」 바텀시트 줄 탭 시 클릭(마커만 탭한 경우 클릭 아님)
클릭률 클릭 ÷ 노출 × 100, 소수 첫째 자리
광고로 들어온 예약 광고 클릭 후 168시간 안에 같은 회원이 같은 선박 상품을 결제 완료(결제 성공 + 예약 상태 02 예약대기 또는 03 예약완료 진입)한 예약. 같은 회원의 클릭이 여러 번이면 결제 시각 직전의 마지막 클릭(어느 계약의 클릭인지)에 귀속
광고로 들어온 결제액 위 예약의 실결제 금액(쿠폰 할인 후) 합
취소 위 예약이 06 취소완료로 변경 시 전환 상태를 CANCELED로 변경, 예약·결제액에서 제외, 「취소 N건」으로 별도 노출
광고비 대비 결제액 광고로 들어온 결제액 ÷ 그 기간 광고비 공급가액(일할), 소수 첫째 자리 「N.N배」

6.2 수집 방식

6.3 집계


7. 화면 목록과 경로

7.1 선주 모바일 (선주 모바일 라우트)

1단계는 「보고 맡기는」 화면만 제작. 신청·요청은 2단계(D-26).

ID 화면 경로 구분 단계
SJ-01 홈 — 「광고·홍보」 카드 / 변경 1
SJ-30 정산관리 — 「광고비 차감」 줄 /receipt 변경 1
SJ-60 마이 — 「광고·홍보 관리」 메뉴 /mypage 변경 1
SJ-90 광고·홍보 홈 — 계약 있음 /ads 신규 1
SJ-90E 광고·홍보 홈 — 계약 없음(1단계: 등급 소개 + [상담 요청]) /ads 신규 1
SJ-94 계약 상세(읽기) /ads/contracts/:id 신규 1
SJ-95 광고 성과 /ads/contracts/:id/stats 신규 1
SJ-96 홍보 맡기기(작업 목록) /ads/orders 신규 1
SJ-97 작업 상세 /ads/orders/:id 신규 1
SJ-97R 수정 요청 시트 ?portal=ad-revision 신규(바텀시트) 1
SJ-99 광고비 내역 /ads/invoices 신규 1
SJ-91 등급 고르기 /ads/plans 신규 2
SJ-92 광고 신청서 /ads/apply?grade= 신규 2
SJ-92C 신청 확인창 /ads/apply?portal=ad-apply-confirm 신규(모달) 2
SJ-93 신청 완료 /ads/apply/done/:id 신규 2
SJ-94R 연장·등급 변경·해지 문의 시트 ?portal=ad-request 신규(바텀시트) 2
SJ-98 홍보 상품 신청 /ads/shop 신규 2

7.2 고객웹

ID 화면 경로 지면 구분
CW-01 새소식 홈 / P6 · P7 · P8 변경
CW-50 출조 탭 /booking P1 · P2 · P3 변경
CW-27 통합검색(검색어 입력 전) 검색 오버레이 P12 변경
CW-51 선박 검색 결과 /booking/search/result P4 · P13 변경
CW-40 탐색 지도 — 선박 레이어 /map?layer=boat P14 변경
CW-30 선박 상세 ?boat={id}(&resDt=YYYY-MM-DD) P5 · P17 진입 변경
CW-59 같은 바다로 나가는 배 시트 &sheet=same-day&date= P17 신규(바텀시트)
CW-60 선장님 조황 보기 ?catch={catch_idx} P8 신규(조황 상세 구성)
CW-58 광고 안내 시트 &sheet=ad-info 전 지면 신규(바텀시트)
CW-61 알림 설정 — 맞춤 광고 줄 마이 > 알림 설정 — 변경

7.3 어드민 (메뉴: 파트너스 > 광고 관리)

ID 화면 경로 구분
AD-80 광고 계약 목록 /partners/ads/contracts 신규
AD-81 광고 계약 상세(「카드 소재」 탭: 선장 한마디·대표 사진 3장·노출 어종·검수) /partners/ads/contracts/:id 신규
AD-82 광고 계약 등록 팝업 (AD-80 위 모달) 신규
AD-83 청구·납부 관리 /partners/ads/invoices 신규
AD-84 홍보·운영 작업 보드 /partners/ads/orders 신규
AD-85 지면 현황·성과(1단계는 지역·등급 재고 현황만, 지면 성과는 운영 SQL 리포트) /partners/ads/placements 신규
AD-86 단가·상품·노출 설정 /partners/ads/settings 신규
AD-34 정산관리 — 「광고비 차감」·「최종 지급액」 열, 지급 요청 확인 팝업 /partners/payment/list 변경
AD-04 전시관리 — 섹션 유형 015~018, 연달아 배치 금지(전시 위치 「홈(H)」 = 출조 탭 /booking, 018은 새소식 홈) /member/exhibition/list 변경

7.4 화면 이동


8. 표기 규격

항목 선주 모바일 고객웹 어드민
날짜 2027. 1. 5(화) · 짧게 1. 5(화) 문장 1월 5일(화) · 탭·카드 1. 5(화) 2027.01.05
기간 2027. 1. 5 ~ 2027. 4. 4 — 2027.01.05 ~ 2027.04.04
일시 1. 5(화) 14:30 — 2027.01.05 14:30
금액 600,000원 90,000원~ 600,000
단가·월 금액 「월 600,000원 (부가세 별도)」 — 공급가액 열
청구·차감·입금 「660,000원 (부가세 포함)」 — 공급가액·부가세·합계 열
할인 「25% 할인 · 1,800,000원 아낌」 — 할인율 열
회차 「2회차 (2. 5 ~ 3. 4)」 — 2/3
남은 좌석 — 「잔여 3석」(Badge/Seats left, 1~5석인 경우에 한함) · 추천리스트 머리 줄 「1. 22 3석」 —
출항 시각 — 「04:30 출항」(24시, Card/List 상품 줄 13 Medium #363636) —
물때 — 「7물」·「조금」·「사리」(11px, #6433DF) —
파고 — 「파고 0.5m」(소수 첫째 자리, 1.5m 초과 시 미노출) —
요약 4칸 결제액 「135만원」(만원 단위, 만 미만 버림) — —
집계 기준 「1. 19(화)까지 집계」 — 「어제까지」
세금계산서 「1. 6(수) 발행」·「발행 전」 — 발행일
배수 「6.2배」 — 6.2
계약 번호 ADC-202701-0001 — 같음
빈 값 「-」 항목 미노출 「-」

청구 상태 표(모든 화면 공통)

코드 표기 색
(회차 미도래) 예정 회색
OPEN 미수 빨강
PART 일부 회수 주황
PAID 완납 초록
VOID 취소 회색

공통 상태(모든 신규 화면)

상태 선주 모바일 어드민
로딩 300ms 초과 시 스켈레톤 노출 표 영역 스피너
오류(5xx·네트워크) 「잠시 후 다시 시도해 주세요」 + [다시 시도] 토스트 「일시적인 오류입니다. 다시 시도해 주세요.」
없음(404) 「찾을 수 없는 화면이에요」 + [광고·홍보로] 「존재하지 않는 항목입니다.」 + 목록으로 이동
권한(AD4031) 「대표 계정만 할 수 있어요」 토스트 노출 후 이전 화면 이동 —
오류 문구 화면 정의서에 문구가 있으면 해당 문구, 없으면 서버 message 사용 같음

확인 팝업 공통: 가운데 모달(폭 293), 제목 좌측 정렬, 하단에 풀폭 주 버튼 + 그 아래 텍스트 버튼 취소. 문구에 조사가 붙는 변수(상품명 등) 뒤에는 조사를 쓰지 않도록 문장 구성(예: 「인스타그램 게시, 이대로 맡길까요?」).


9. 데이터 모델 (신규, 스키마 af_re)

테이블 용도 핵심 컬럼·제약
ad_price 등급 단가표 price_idx PK, boat_class(R/L), grade(A/B/C), months(1/3/6/9/12), base_price int, discount_rate numeric(5,2), annual_extra_rate numeric(5,2) default 5(연간 일시 추가 할인), monthly_price int, effective_from date, is_active, created_by, created_at · unique(boat_class, grade, months, effective_from)
ad_grade_benefit 등급별 혜택 grade, item_code, qty_per_cycle, every_n_cycles int(S4 B등급 3), first_cycle_only bool, min_months, fee_discount_rate numeric(5,2)(S7 C등급 50, 무료 100), annual_only bool(연간 일시 전용 혜택) · PK(grade, item_code, annual_only)
ad_region_map 시도 → 9지역 sido_code PK, region_code
ad_region 9지역 기준 정보 region_code PK, name, lat, lng(대표 좌표), tide_style(7/8 물때식), wave_station_code(예보 지점)
ad_cap 판매 상한 region_code(9지역 코드, 전국은 'ALL'), grade, cap · PK(region_code, grade)
ad_setting 전체 노출 스위치·처리 상한 key PK(예 ADS_ENABLED, CAP_S1_MONTHLY — 지면별 스위치는 ad_module_rule.enabled 하나), value, updated_by, updated_at
ad_contract 계약 원장 contract_idx PK, contract_no unique, terminate_date, company_idx, boat_idx, region_code, boat_class, grade, months, price_idx, monthly_price, total_price, is_manual_price, manual_reason, promo_days, start_date, end_date, pay_method(D 정산차감/T 계좌), first_cycle_upfront bool default true, upfront_off_reason, billing_type(M 월/U 일시 — 일시는 T 전용), annual_lump bool(12개월 일시 = 연간 일시 계약), priority_renewal bool(다음 해 슬롯 우선 확보 대상), tax_email, status, pause_flags text[], reject_code, reject_memo, terminate_reason, effective_end(생성 컬럼), promoted_at, requested_by_type(P/A), requested_by, approved_by, approved_at, pay_due_at, terms_version, consent_at, parent_contract_idx(연장·등급 변경 원계약), created_at, updated_at · index(boat_idx, status), index(region_code, grade, status)
ad_contract_history 상태·값 변경 이력 history_idx, contract_idx, from_status, to_status, field_changes jsonb, reason, actor_type(P/A/S), actor_id, created_at
ad_contract_request 선주 요청 request_idx, contract_idx, type(EXT/CHG/TRM), target_grade, memo, status(OPEN/DONE/REJ), handled_by, handled_at
ad_cycle 회차 contract_idx, cycle_no, start_date, end_date · PK(contract_idx, cycle_no)
ad_invoice 청구 invoice_idx PK, invoice_no unique, boat_idx, company_idx, contract_idx, cycle_no(일시 결제 0), service_order_idx, kind(CYC 회차/UPF 일시/SVC 단건/ADJ 조정), bill_date, due_date, supply_amount, vat_amount, total_amount, paid_amount, status(OPEN/PART/PAID/VOID), pay_method, due_notice_at, overdue_at, tax_invoice_no, tax_issued_at · unique(contract_idx, cycle_no, kind) where kind in (CYC,UPF) · unique(service_order_idx)
ad_payout 지급 묶음 payout_idx PK, boat_idx, gross_amount, deduction_amount, refund_amount, net_amount, preview_hash, requested_by, requested_at
ad_payout_item 지급 묶음 ↔ 정산 행 payout_idx, accounts_idx · PK(accounts_idx)
ad_deduction 정산 차감 deduction_idx PK, payout_idx, invoice_idx, amount, status(APPLIED/REVERSED), reversed_by, reversed_reason, created_at · unique(payout_idx, invoice_idx)
ad_deposit 계좌 입금 deposit_idx PK, invoice_idx, amount, depositor_name, deposited_on date, confirmed_by, confirmed_at, memo
ad_refund 환급 refund_idx PK, boat_idx, contract_idx, invoice_idx, supply_amount, vat_amount, amount, method(NEXT_PAYOUT/BANK), status(PENDING/APPLIED/DONE), payout_idx, switch_due_at(생성 + 30일), processed_by, processed_at · index(boat_idx, status)
ad_service_item 홍보·운영 상품 item_code PK, name, price, unit, lead_days, needs_review, needs_material, is_active, sort, fee_rate numeric(5,2)(S4·S7 대행 수수료율), min_fee int, min_budget int, recurring bool(S7 회차별 연속 작업)
ad_service_quota 회차별 이용권 quota_idx PK, contract_idx, cycle_no, item_code, granted(이번 회차 기본), carried_in(앞 회차에서 이월된 수, 재이월 불가), used, ops_shortfall(운영 사정으로 미사용된 수 = 다음 회차 carried_in) · unique(contract_idx, cycle_no, item_code) · 사용 처리는 UPDATE … SET used = used + 1 WHERE used < granted + carried_in
ad_service_order 홍보·운영 작업 order_idx PK, order_no unique, boat_idx, contract_idx, item_code, source(Q/B), quota_idx, status, assignee_admin, due_date, scheduled_at, owner_memo, material_due_at, review_due_at, result_url, result_note, disclosure_checked, revision_count, revision_memo, approved_at, auto_approved, cancel_reason(OPS/OWNER_TIMEOUT/OWNER_REQ/UNPAID), hold_flag, price, pay_method, invoice_idx, meta_budget, meta_period_start, meta_period_end, meta_result jsonb, created_at
ad_service_file 작업 파일 file_idx PK, order_idx, kind(M 자료/R 결과물), common_file_id, file_name, size, mime, uploaded_by_type, created_at
ad_event 노출·클릭 원천(월 파티션, 파티션 키 received_at) event_id uuid, type(I/C), placement(ad_module_rule에서 phase = 1인 지면에 한해 수신), contract_idx, boat_idx, position, card_tier, module_ctx jsonb, page_key, session_id, anon_id, query jsonb, occurred_at, received_at · index(anon_id, boat_idx, occurred_at) WHERE type = 'C'(전환 귀속) · event_id 유일성은 ad_event_dedup으로만 보장 · 13개월 뒤 파티션 삭제
ad_module_rule 지면 규칙(새 지면 = 1행) placement PK, screen, name_default, grades text[], max_slots, phase(1/2/3), uses_personal bool, condition_code, enabled, updated_by, updated_at
ad_creative 카드 소재(선박 단위, 계약 변경 시에도 유지) creative_idx PK, boat_idx, last_contract_idx, captain_note varchar(40), captain_photo_file_id, photo_file_ids int[3], fish_tags text[3], status(DRAFT/OK/REJ), reviewed_by, reviewed_at · unique(boat_idx) · 파일 컬럼은 common_file_id · 검수(OK) 전에는 captain_note만 미노출하고 사진은 노출, 사진 없을 시 선박 대표 이미지 노출
ad_boat_context 선박 맥락 캐시(10분 배치) boat_idx PK, port_idx, port_lat, port_lng, region_code, catch_days_7 bool7, last_catch_at timestamptz, catch_photos jsonb(최근 3장), products_by_date jsonb({날짜:[{product_idx, depart_time, seats, fish_codes}]}, 내일부터 30일), updated_at
ad_region_wave 지역 예보(3시간 배치) PK(region_code, fcst_date), wave_max numeric(3,1), fetched_at
ad_lunar_day 음력 일(물때 계산) solar_date PK, lunar_day smallint · 2026~2028년 적재
ad_user_pref 맞춤 광고 설정 user_id PK, personalized bool default true, updated_at
ad_identity 기기 ↔ 회원 연결 이력 identity_idx PK, anon_id, user_id, linked_at · index(anon_id, linked_at) · index(user_id) · 동일 (anon_id, user_id, KST 날짜)는 한 번만 기록
ad_event_dedup 이벤트 중복 제거(Redis 미사용 시) event_id PK, received_at · 48시간 뒤 삭제
ad_idempotency Idempotency-Key 저장(Redis 미사용 시) scope, idem_key, actor, response jsonb, created_at · PK(scope, idem_key) · 24시간 뒤 삭제
ad_daily_stat 일 집계(영구 보관) PK(stat_date, contract_idx, placement), boat_idx, impressions, clicks, bookings, booking_amount, canceled_bookings
ad_conversion 전환 귀속 reservation_idx PK, contract_idx, boat_idx, click_event_id, clicked_at, paid_at, amount, status(VALID/CANCELED), canceled_at
ad_notice_log 알림 발송 기록 log_idx, company_idx, code, target_id, kst_date, channel(ALIMTALK/SMS/INBOX), result, created_at · unique(company_idx, code, target_id, kst_date)
ad_consult 등급 상담(PLAN)·유튜브 상담(S6) 신청 consult_idx, boat_idx, item_code(PLAN/S6), contact_time, memo, status(OPEN/DONE), handled_by, created_at
ad_policy_notice 정책 변경 고지 notice_idx, title, body, effective_date, created_by, sent_at

기존 테이블·API 변경 - displays.section_code: 015 「광고-이번 주 함께하는 배」 · 016 「광고-이번 주 남은 자리」 · 017 「광고-내일 새벽 출항」 · 018 「광고-선장님 조황 소식」(새소식 홈) 추가(common_code SECTION). 버전은 신버전에 한함. - ad_contract에 first_cycle_upfront bool default true 추가(5.4 계약금 선수취). - partner_users.menu_permit: PTN_MENU에 「AD 광고·홍보」 추가(직원 조회 권한). - 기존 선박 검색 API는 변경 없음. 검색 결과 화면은 검색 API와 서빙 API(P4·P13)를 각각 호출. 서버는 검색 조건 해석 함수 공유. - 선박 노출 여부를 바꾸는 기존 API(어드민 선박정보수정·선주 노출 토글)에서 광고 계약 정지 원인 HIDDEN을 추가·제외하는 훅 호출. 5분 대사 배치로 누락 보정. - 정산 목록 API(선주 /ptn/boats/{id}/settlements, 어드민 정산 목록)에 ad_deduction(예정 또는 확정), final_payout 필드 추가. accounts 값은 변경 없음. - 어드민 [선택지급요청]에 미리보기(preview) 단계 추가: 선박별 gross·deduction·refund·net + preview_token 반환 → 토큰과 함께 확정 요청. - 어드민 정산 목록 엑셀에 「광고비 차감」「광고비 환급」「최종 지급액」 열 추가.


10. API

공통 - 형식: 기존 booking-api 응답 형식. 목록 = {list, total_count, page, limit}. 금액 = 원 정수. 날짜 = YYYY-MM-DD, 일시 = ISO 8601(+09:00). - 오류 코드: AD4097 미리보기 후 금액 변경 · AD4001 필수값 누락·형식 오류 · AD4031 권한 없음(직원·다른 업체 선박) · AD4091 기간 겹침 · AD4092 상태 불일치 · AD4098 이미 처리된 청구 · AD4099 같은 유형 요청 진행 중 · AD4093 월 처리 마감 · AD4094 이용권 없음 · AD4095 수정 횟수 초과 · AD4096 판매 상한 초과 · AD4221 날짜 오류 · AD5001 일시 오류. 응답 {code, message}. message는 화면에 그대로 노출 가능한 문장. 화면 정의서에 문구가 정해진 코드는 화면 정의서 문구 우선.

선주 모바일 | 메서드·경로 | 요청 | 응답 핵심 필드 | |---|---|---| | GET /ptn-m/ads/summary?boat_idx= | — | price_from{A,B,C}(업종별 1개월 단가), max_discount_rate, consult_open(boolean), boat{boat_idx,name,boat_class,region_code}, current_contract{contract_idx,contract_no,grade,status,pause_flags,start_date,end_date,cycle_no,cycle_start,cycle_end,next_bill_date,monthly_price}, other_contracts[{contract_idx,status,grade,start_date}], stats_cycle{impressions,clicks,ctr,bookings,booking_amount,roas,until_date}, quotas[{item_code,name,granted,used}], orders_open[{order_idx,item_code,status,due_date}], current_contract에 wait_order(조회 시 계산), pay_due_at, terminate_date, pay_method, billing_type 포함, warnings[{code:'NO_PRODUCT'|'UNPAID'|'HIDDEN'|'OPS',message}], unpaid_amount, open_orders_count, has_invoices, quotas[{item_code,name,granted,carried_in,used}], is_owner · unpaid_amount = 미납 판정 대상(CYC·UPF·ADJ) 미수(정지 경고 문구용), unpaid_total = 단건 포함 전체 미수(「광고비 내역 · 미수 N원」 줄용) | | GET /ptn-m/ads/plans?boat_idx=&start_date=&months=&grade=&billing_type= | start_date·months 미전달 시 min_start_date·3개월 기준 | boat_class, max_discount_by_grade, region_code, region_name, grades[{grade,monthly_by_months{1,3,6,9,12},discount_by_months,benefits[{item_code,label,qty}],placements[], remaining_slots, is_full}], min_start_date, has_settlement_info, tax_email_default, boat_visible, min_product_price(본전 계산 줄), terms_version, quote{grade, months, start_date, end_date, monthly_price, vat, bill_amount, total_price, saved_amount}(grade 전달 시 해당 등급, 미전달 시 B) · SJ-92에서 등급·약정·시작일·청구 방식 변경 시마다 재호출 | | POST /ptn-m/ads/contracts (헤더 Idempotency-Key) | {boat_idx, grade, months, start_date, pay_method:'D'|'T', billing_type:'M'|'U', tax_email, terms_version} | 201 {contract_idx, contract_no, status:'REQ'|'WAI', wait_order, start_date, end_date, monthly_price, vat, bill_amount, total_price} · AD4001 · AD4031 · AD4091 · AD4221(시작일 < min_start_date) · AD4001(pay_method D 선택 시 정산정보 없음 → message 「정산정보가 없어 계좌 입금만 고를 수 있어요」) | | GET /ptn-m/ads/contracts?boat_idx= | — | list[{contract_idx,contract_no,grade,months,status,start_date,end_date}] | | GET /ptn-m/ads/contracts/{id} | — | 계약 전체 + cycles[{cycle_no,start,end}] + invoices[] + history[{to_status,reason,created_at}] + requests[] + quotas_by_cycle | | POST /ptn-m/ads/contracts/{id}/cancel | — | 200 · AD4092(확인 중·대기 상태 아님) | | POST /ptn-m/ads/contracts/{id}/requests | {type:'EXT'|'CHG'|'TRM', target_grade?, memo(0~300자)} | 201 {request_idx} · AD4099(동일 유형 OPEN 요청 존재) · 일시 결제 계약의 CHG는 AD4092 | | GET /ptn-m/ads/contracts/{id}/stats?period=cycle|prev_cycle|all|custom&from=&to=&group=day|placement|month | group=day인 경우에 한해 최대 92일 | rows[], totals{impressions,clicks,ctr,bookings,booking_amount,canceled,ad_cost_supply,roas}, until_date | | GET /ptn-m/ads/contracts/{id}/conversions?page=&limit=20 | — | list[{paid_at,masked_name,people,amount,placement,status}] | | GET /ptn-m/ads/invoices?boat_idx=&status=&page= | — | list[{invoice_idx,invoice_no,kind,title,bill_date,due_date,supply,vat,total,paid,status,pay_method,deductions[{payout_date,amount}],deposits[{date,amount}],tax_issued_at}], refunds[{refund_idx, contract_no, invoice_idx, supply, vat, total, method:'NEXT_PAYOUT'|'BANK', status, created_at, payout_date, done_at}], unpaid_total, bank{name,account,holder,depositor_rule} | | GET /ptn-m/ads/service-items?boat_idx= | — | list[{item_code,name,price,unit,lead_days,desc,is_closed_this_month,quota_left}] | | POST /ptn-m/ads/service-orders (헤더 Idempotency-Key) | {boat_idx, item_code, source:'Q'|'B', memo(0~500), pay_method?, meta{budget,start,end}?} | 201 {order_idx, status, invoice?} · AD4093 · AD4094 · AD4001(S4 예산 300,000 미만·S4 정산 차감 선택) | | POST /ptn-m/ads/consults | {boat_idx, item_code:'PLAN'|'S6', contact_time(S6 필수 2~50자, PLAN 선택), memo(0~500)} | 201 · OP01 발송 · 동일 선박·item_code의 OPEN 상담 존재 시 AD4099 | | GET /ptn-m/ads/service-orders?boat_idx=&tab=open|done | — | list[{order_idx,order_no,item_code,name,status,source,due_date,scheduled_at,updated_at}] | | GET /ptn-m/ads/service-orders/{id} | — | 작업 전체 + files[{kind,url,thumb,mime}] + timeline[] + review_due_at | | POST /ptn-m/ads/service-orders/{id}/upload-urls | {files:[{name,size,mime}]} (최대 20개) | [{file_key, upload_url(서명 URL, 15분)}] · 크기·형식 초과 AD4001 | | POST /ptn-m/ads/service-orders/{id}/materials | {file_keys[], memo(0~500)} | 200, 상태 MAT → WIP | | POST /ptn-m/ads/service-orders/{id}/approve | — | 200 · AD4092 | | POST /ptn-m/ads/service-orders/{id}/revision | {memo 10~500자} | 200 · AD4095 |

고객웹 | 메서드·경로 | 요청 | 응답 | |---|---|---| | POST /usr/ads/slots | JSON 본문 {session_id, page_key(화면 1회 진입마다 uuid), placements:[표시 순서대로 예 'P1','P2','P3'], lat?, lng?, ctx:{P4·P13: 검색 파라미터 원본 · P5: boat_idx · P17: boat_idx, date · P6: place_code · P14: bbox 'sw_lat,sw_lng,ne_lat,ne_lng' · P7·P8·P12·P1~P3: 없음}}, 회원 토큰(있는 경우). Content-Type application/json | {slots:{지면코드:{title, items[{card, tier:'A'|'B'|'C'|'T'|'R'|'S'|'M', reason, res_dt?, ad{contract_idx, grade, label:'광고'}}], groups?(P1 지역 탭 · P2 날짜 탭 {key, label, tide?, items[]}), search_query?(P17: {area, reservation_dt}, items가 비어도 항상 반환)}}} · 해당 없는 지면은 items [] (프론트는 모듈 미노출) | | POST /usr/ads/identify | {anon_id} (회원 토큰 필수) | 204 | | POST /usr/ads/events | 인증 헤더 없음, 응답에 Access-Control-Allow-Origin, text/plain JSON {session_id, anon_id, events:[{event_id,type,placement,contract_idx,boat_idx,position,card_tier,module_ctx,page_key,occurred_at,query}]} 최대 50건 | 202 | | GET·PUT /usr/ads/pref | 회원 토큰 필수 · PUT {personalized:boolean} | {personalized} |

어드민 | 메서드·경로 | 설명 | |---|---| | GET /adm/ads/contracts?keyword=&status=&grade=&region=&pay_method=&boat_class=&date_type=REQ|START|END&start=&end=&page=&limit= | 계약 목록 {list[{contract_idx, contract_no, boat_name, company_name, region_name, grade, months, status, pause_flags, start_date, effective_end, pay_method, monthly_price, requested_at, wait_order}], total_count, counts{REQ, WAI, PAY, SCH, ACT, PAU, UNPAID}} | | GET /adm/ads/boats?keyword= | AD-82 선박 검색 [{boat_idx, name, company_name, region_name, boat_class, max_people, visible, products_30d, has_settlement_info, has_open_contract}] | | POST /adm/ads/contracts | 대리 등록 {…신청 필드, status:'DRF'|'REQ', is_manual_price, monthly_price, manual_reason, promo_days, annual_lump(true 시 months 12 · billing_type U · pay_method T 고정, 프로모션 30일 자동)} | | GET /adm/ads/contracts/{id} · PATCH /adm/ads/contracts/{id} | 상세·수정(DRF·REQ·WAI에 한해 조건 변경 가능, PAY·SCH·ACT에서는 promo_days·tax_email·memo만 변경 가능) | | POST /adm/ads/contracts/{id}/approve {start_date?, dry_run?} · /waitlist · /cancel {memo} · /reject {reject_code, memo} · /pause {memo, company_fault} · /resume · /terminate {reason, terminate_date, settle_preview:boolean} · /change-grade {target_grade, start_date, months, pay_method, tax_email?} · DELETE /adm/ads/contracts/{id}(임시저장 건에 한함) | 상태 변경. approve dry_run=true → {start_date, inventory{region_used, region_cap, nation_used, nation_cap}, capacity_warnings[{item_code, short_by}], overlap{conflict:boolean, contract_no?}}(시작일 지연으로 동일 선박의 다른 계약과 기간 중복 시 승인 팝업에 사전 노출). terminate settle_preview=true → {terminate_date, cycle_no, cycle_days, used_days, list_price_used, due_amount, collected_supply, voided_invoices[], diff, action:'ADJ'|'REFUND'|'NONE', refund_method} | | GET /adm/ads/invoices · POST /adm/ads/invoices/{id}/deposits {amount, depositor_name, deposited_on, on_cap_full:'WAIT'|'REFUND'} · POST /adm/ads/deductions/{id}/reverse {reason} · PATCH /adm/ads/invoices/{id}/tax {tax_invoice_no, tax_issued_at} · POST /adm/ads/invoices/{id}/void {memo} | 청구·입금·세금계산서. 목록 응답에 summary{billed, collected, unpaid, overdue_21} 포함 | | GET /adm/ads/refunds?status= · POST /adm/ads/refunds/{id}/complete {memo} | 환급 목록 {list[{refund_idx, boat_name, contract_no, supply, vat, total, method, status, created_at, switch_due_at, payout_date, done_at}]}·계좌 환급 완료 | | POST /adm/payouts/preview {accounts_idx[]} → {boats[{boat_idx,gross,deduction,refund,net}], preview_token} · POST /adm/payouts {accounts_idx[], preview_token} · AD4097 | 지급 요청 미리보기·확정(차감 포함) | | GET /adm/ads/consults · PATCH /adm/ads/consults/{id} | 상담 신청 | | GET /adm/ads/service-orders?status=&item_code=&assignee=&boat=&page= · PATCH /adm/ads/service-orders/{id} {status?, assignee_admin?, due_date?, scheduled_at?, cancel_reason?, ops_shortfall_inc?} · POST /adm/ads/service-orders/{id}/results {file_keys[], result_url, result_note, disclosure_checked} | 작업. 목록 응답에 counts{REQ, MAT, WIP, REV, APV, DONE, CXL, overdue} 포함 · POST /adm/ads/service-orders {boat_idx, item_code, pay_method, memo}(어드민 대리 주문) | | GET /adm/ads/placements/stats?from=&to= · GET /adm/ads/placements/inventory?region=&grade=&start=&months= | 지면 현황·재고(AD-82 잔여 슬롯은 기간 파라미터로 계산) | | POST /adm/ads/contracts/{id}/requests {type:'EXT'|'CHG'|'TRM', target_grade?, memo} · PATCH /adm/ads/requests/{id} {status:'DONE'|'REJ'} | 1단계: 전화·영업으로 접수된 선주 요청을 운영자가 기록·처리 | | GET·PUT /adm/ads/prices · /adm/ads/caps · /adm/ads/service-items · /adm/ads/settings | 단가·상한·단건·스위치 | | GET·PUT /adm/ads/module-rules | 지면 12개 이름·스위치(금지어 검사) | | GET·PUT /adm/ads/contracts/{id}/creative · POST …/creative/review {result:OK|REJ, memo} | 카드 소재 저장·검수 |


11. 배치 (전부 Asia/Seoul, 서버 여러 대여도 한 번만 실행되게 DB 잠금, 실패 시 구글챗 「알림_광고」 알림, 같은 날 재실행해도 결과가 같게)

배치 시각 내용
상태 전환 → 회차·청구(한 체인) 매일 00:00 집행 예정 → 집행 중 전환(시작일 ≤ 오늘, 정지 원인 존재 시 일시정지), 집행 중·일시정지 → 만료 전환(end_date < 오늘), terminate_date < 오늘인 계약 → 해지 + 해지 정산 확정, 이어서 시작일 ≤ 오늘이면서 미생성 회차(effective_end 이내)의 이용권(이월 포함)·청구 생성. 모든 처리가 「기준일 ≤ 오늘이면서 처리 안 된 건」 조회 방식이므로 하루 실패 시에도 다음 실행에서 누락분 처리
대기 승격 매일 00:20 + 상태 변경 직후 3.3 정렬 기준에 따라 모든 대기 계약 확인 후 통과 건에 한해 확인 중으로 전환(promoted_at 기록), AN16. 희망 시작일 + 30일 경과 대기는 취소, AN21
집계·전환 매일 00:30 전날 이벤트 집계, 전환 귀속, 취소 반영
미납 매일 09:00 +14일 AN07, +21일 UNPAID 정지 AN08
노출 대사 5분마다 선박 노출 상태 ↔ HIDDEN 정지 원인 보정, 노출 대상 캐시 갱신
맥락 캐시 10분마다 + 00:00 상태 전환 체인 끝 대상 = 집행 예정(시작일 ≤ 내일)·집행 중·일시정지 계약의 선박. ad_boat_context 갱신(catch_days_7·last_catch_at·사진 3장·products_by_date 30일), 대상에서 제외된 선박의 행은 같은 실행에서 삭제
지역 예보 3시간마다 9지역 대표 지점의 내일부터 5일 일 최대 파고 → ad_region_wave(같은 키 덮어쓰기). 6시간 초과 실패 시 구글챗 알림
작업 자동 처리 매시 05분 자료 요청 14일(336시간) 경과 시 취소, 선주 확인 72시간 경과 시 자동 승인, 입금 대기 계약 168시간 경과 시 취소, 계좌 단건 168시간 미입금 시 작업·청구 취소(AN20), NEXT_PAYOUT 환급 30일 경과 시 BANK 전환(OP01)
만료 안내 매일 10:00 종료 30일 전 AN10
월간 리포트 매월 3일 10:00 AN15
정책 고지 매일 10:00 적용일 30일 전 고지 대상 AN17
파티션·정리 매월 25일 · 매일 03:00 다음 달 ad_event 파티션 생성, 13개월 경과 파티션 삭제 · ad_event_dedup 48시간·ad_idempotency 24시간 경과 행 삭제
차감 대사 매주 월 08:00 지난주 차감·지급 묶음 합계 리포트 구글챗 발송

12. 알림 카탈로그

코드 시점 문구(변수) 버튼 → 연결
AN01 신청 접수 [어바웃피싱] {선박명} 어바웃픽 {등급}등급 신청을 받았습니다. 운영팀이 1영업일 안에 확인 후 알려 드립니다. 신청 내역 보기 → /ads/contracts/{id}?boat_idx={boat_idx}
AN02 승인 {선박명} 광고가 승인됐습니다. 시작일 {시작일}, 종료일 {종료일}, 월 {월금액}원(부가세 별도). 계약 보기 → /ads/contracts/{id}?boat_idx={boat_idx}
AN03 반려 {선박명} 광고 신청을 진행하지 못했습니다. 사유: {반려사유}. 궁금한 점은 고객센터 02-722-0365로 연락 주세요. 신청 내역 보기 → /ads/contracts/{id}?boat_idx={boat_idx}
AN04 입금 요청 {금액}원(부가세 포함)을 {입금기한}까지 {은행} {계좌번호}(예금주 주식회사 어바웃피싱)로 보내 주세요. 입금자명은 {입금자명}으로 해 주세요. 광고비 내역 → /ads/invoices?boat_idx={boat_idx}
AN05 집행 시작 오늘부터 {선박명} 광고가 시작됐습니다. 이번 달 홍보 작업 {N}건을 맡길 수 있습니다. 홍보 맡기기 → /ads/orders?boat_idx={boat_idx}
AN06 청구 발생 {회차}회차 광고비 {금액}원(부가세 포함)이 청구됐습니다. {결제방법 문구} 광고비 내역 → /ads/invoices?boat_idx={boat_idx}
AN07 미수 +14일 광고비 {미수금액}원이 아직 정산되지 않았습니다. {기한}까지 계좌로 보내 주시면 광고가 계속 나갑니다. 광고비 내역 → /ads/invoices?boat_idx={boat_idx}
AN08 미납 정지 광고비 {미수금액}원이 미납되어 오늘부터 광고 노출을 멈췄습니다. 입금이 확인되면 바로 다시 나갑니다. 광고비 내역 → /ads/invoices?boat_idx={boat_idx}
AN09 재개 {선박명} 광고 노출을 다시 시작했습니다. 광고·홍보 → /ads?boat_idx={boat_idx}
AN10 종료 30일 전 {선박명} 광고가 {종료일}에 끝납니다. 같은 조건으로 이어 가려면 담당자에게 연락 주세요(2단계: 연장을 신청해 주세요). 광고·홍보 → /ads?boat_idx={boat_idx}
AN11 만료 {선박명} 광고가 종료됐습니다. 광고 기간에 광고로 들어온 예약은 {N}건입니다. 성과 보기 → /ads/contracts/{id}/stats?boat_idx={boat_idx}
AN12 자료 요청 {작업명} 작업에 쓸 {요청자료}를 {기한}까지 올려 주세요. 자료 올리기 → /ads/orders/{id}?boat_idx={boat_idx}
AN13 결과 확인 요청 {작업명} 결과물이 준비됐습니다. {확인기한}까지 확인해 주세요. 답이 없으면 그대로 진행합니다. 결과 보기 → /ads/orders/{id}?boat_idx={boat_idx}
AN14 작업 완료 {작업명}이(가) 완료됐습니다. 결과 보기 → /ads/orders/{id}?boat_idx={boat_idx}
AN15 월간 성과 {월}월 {선박명} 광고 성과: 노출 {노출}회, 클릭 {클릭}회, 광고로 들어온 예약 {예약}건({결제액}원). 성과 보기 → /ads/contracts/{id}/stats?boat_idx={boat_idx}
AN16 대기 승격 {지역} {등급}등급 자리가 생겨 {선박명} 신청을 확인 중으로 바꿨습니다. 1영업일 안에 알려 드립니다. 신청 내역 보기 → /ads/contracts/{id}?boat_idx={boat_idx}
AN17 정책 변경 30일 전 어바웃픽 {변경항목}이(가) {적용일}부터 바뀝니다. 지금 계약은 종료일까지 기존 조건 그대로입니다. 내용 보기 → /ads?boat_idx={boat_idx}
AN18 입금 기한 경과 취소 입금이 확인되지 않아 {선박명} 광고 신청이 취소됐습니다. 다시 신청할 수 있습니다. 광고·홍보 → /ads?boat_idx={boat_idx}
AN19 해지 완료 {선박명} 광고가 {해지일}에 해지됐습니다. 정산 금액 {정산금액}원은 {정산방법}으로 처리합니다. 광고비 내역 → /ads/invoices?boat_idx={boat_idx}
AN20 계좌 단건 입금 기한 경과 입금이 확인되지 않아 {선박명} {작업명} 신청이 취소됐습니다. 다시 신청할 수 있습니다. 홍보 맡기기 → /ads/orders?boat_idx={boat_idx}
AN21 대기 기간 경과 취소 {지역} {등급}등급 자리가 나지 않아 {선박명} 대기 신청이 취소됐습니다. 다른 등급이나 시작일로 다시 신청할 수 있습니다. 광고·홍보 → /ads?boat_idx={boat_idx}
OP01 신청·상담 요청·대기 승격·요청 접수·해지 정산 변경·환급 계좌 전환 [광고] {선박명} {등급} {개월}개월 {이벤트} · {결제방법} (상담 요청은 [광고] {선박명} 등급 상담 요청 · 대표 연락처) 어드민 계약 상세 · 상담 신청 목록
OP02 자료 도착·수정 요청·자동 승인 [홍보] {선박명} {작업명} {이벤트} 작업 보드

13. 권한·감사·개인정보


14. 예외와 동시성

상황 처리
같은 지역·등급 마지막 1자리에 두 건 동시 승인 ad_cap의 ('ALL', 등급) 행 우선, 이어서 (지역, 등급) 행 SELECT … FOR UPDATE 후 겹치는 계약 수 재집계. 승인·입금 확인·대기 승격·change-grade·프로모션 연장 다섯 경로 모두 동일 순서로 잠금(다른 지역 두 건의 전국 마지막 슬롯 동시 통과 방지). 늦은 요청은 AD4096 → 어드민 「자리가 방금 찼습니다. 대기로 돌릴까요?」 노출
(2단계) 선주가 신청 버튼을 두 번 탭 요청 중 버튼 비활성(딤 처리). 같은 선박에 겹치는 계약 존재 시 서버에서 AD4091 반환
운영자 두 명이 같은 입금을 동시에 확인 청구 상태 조건부 갱신(OPEN·PART인 경우에 한함), 두 번째 요청은 AD4098 「이미 처리된 청구입니다」
지급 요청 동시 실행 선택 accounts 행 FOR UPDATE, ad_payout_item PK(accounts_idx)로 같은 행 이중 지급 차단, preview_token 불일치 시 AD4097
입금 확인과 지급 차감이 같은 청구를 동시에 처리 ad_invoice를 invoice_idx 오름차순으로 FOR UPDATE 잠금 후 paid_amount 갱신(교착 방지)
이용권 동시 사용 used < granted + carried_in 조건부 갱신 + Idempotency-Key(24시간)
작업 취소와 이용권 운영 사정(OPS) 취소 시 이용권 복원(used − 1). 선주 사유(자료 미제출·선주 요청) 취소 시 사용 처리. 이월분 우선 차감, 재이월 불가
등급 변경과 상한 change-grade 한 트랜잭션에서 새 계약 상한 검사·기존 계약 terminate_date 설정. 상한 초과 시 AD4096, 변경 사항 없음
같은 선박 동시 신청 EXCLUDE 제약으로 두 번째 INSERT 실패 → AD4091
차감 되돌리기 차감 REVERSED, 청구 paid_amount 복원, 사유 이력 기록
계약 중 선박을 노출안함으로 변경 HIDDEN 정지(훅 + 5분 대사), 노출 재설정 시 자동 재개, 기간 연장 없음
계약 중 제휴 해지·폐업 운영자 해지 처리(사유 폐업), 회사 귀책 아님
광고 선박 상품이 모두 마감 지면 조건 미충족, SJ-90 경고 NO_PRODUCT
노출 이벤트 전송 실패 최대 3회 재전송, 이후 폐기
광고 API 실패·지연 모듈 미노출(제목 포함). P6·P7은 해당 줄·카드만 미노출, 기존 날씨 카드·D-day 영역은 유지. P14는 마커만 미노출
카드 칸 데이터 없음 8월통합 카드 규칙에 따라 해당 칸만 미노출(잔여석 정보 없음 → Badge/Seats left 미노출, 쿠폰 없음 → 쿠폰 배지 미노출). 최근 72시간 조황 없는 선박은 P8에서 미노출
같은 날 같은 선박이 여러 지면에 노출 page_key 기준 한 화면 최대 2회 노출, 다른 화면은 제한 없음
관심장소가 바다가 아님(민물) P6 미노출
고객이 선택한 날짜가 마감이고 같은 지역 광고 선박 0척 AD 없는 동일 배너로 일반 검색 안내(광고 없음)
단가 변경일 신청 신청 시점 유효 단가(price_idx)로 고정
(2단계) 선주가 신청 중 다른 선박으로 변경 신청서는 선박 1척 기준, 선박 변경 시 SJ-91부터 재진행

15. 비기능 요건


16. 일정과 공수

16.1 일정

기간 할 일 담당
10/2~10/9 본 기획서 검토, 선주 인터뷰 5곳(광고 화면 시안 함께 제시, 등급별 지면 수 차이 체감 확인), D-01~D-08·D-20·D-26·D-27 결정 서현일 · 영업(유승옥·신다훈)
10/12~10/30 디자인 확정(고객웹 10화면 우선), 광고 약관 초안, 처리방침 「맞춤형 광고」 항목, 알림톡 템플릿 21종 등록 신청, D-09~D-21·D-28~D-30 결정 디자인(김현철) · 경영지원 · 기획
11/2~12/11 개발(백엔드 선행 1주: 단가·계약·서빙 API·이벤트 / 2주차부터 청구·차감 · 프론트는 어드민 AD-80~83 우선, 외부 프론트는 공용 패키지 우선) 최상수(BE) · 송창석(FE) · 외부 BE · 외부 FE
11/14 약관 12차 공고(광고 서비스 이용약관 포함) 경영지원
11/20 진척 점검, 1차 절단안 적용 여부 결정 서현일 · 최상수 · 송창석
11/27 계약 등록·승인·청구 생성·AN01 개발 완료(12/7 선QA 진입 조건) 최상수
12/7~12/11 계약 등록·승인·청구 생성·AN01 우선 QA 후 12/11 운영 배포(12/14 사전 접수용) 김채린 · 최상수
12/14 약관 시행, 영업팀 사전 접수 시작(오프라인 계약 → 어드민 대리 등록 → 계약금 계좌 입금, 시작일 1/5 이후) · 카드 소재(한마디·사진) 수집 영업 · 운영
12/14~12/24 QA 2회전(전체), 결함 수정 김채린 · 외부 BE
12/28~12/31 내부 선박으로 운영 리허설(청구·지급 차감·작업) 운영·경영지원
2027-01-05 오픈 —

16.2 공수 (맨데이)

개발 검토(프론트·백엔드 각 1명) 의견 반영 값임.

영역 항목 공수
백엔드 단가·혜택·상한(날짜별 최댓값 판정)·설정 3.0
백엔드 연간 일시 계약(추가 할인·혜택 이용권·슬롯 우선 확보·해지 정산 분기) · 광고 대행 수수료 혜택 · S7·O4 상품 1.5
백엔드 계약 상태 전이(계약금 선수취 포함)·EXCLUDE 제약·이력·대기 승격·등급 변경·해지 예정·요청 기록(어드민) 4.5
백엔드 회차·청구·계좌 입금(상한 재검사)·미납·해지 정산·환급 5.5
백엔드 지급 요청 차감(미리보기 토큰·확정·되돌리기)·지급 묶음·정산 API·엑셀 열 3.5
백엔드 서빙 API(여러 지면 일괄 호출 · 2회 제한)·지면 조건 12개·노출 대상 캐시와 60초 무효화·세션 해시 6.0
백엔드 맥락: products_by_date·조황 배치, 물때 표·ad_lunar_day, 지역 예보 연동(ad_region_wave), 검색 조건 해석 함수 분리(P4·P13), 지도 범위(P14), 예약 이력(P7), 성능 측정 4.0
백엔드 카드 소재 저장·검수 · 맞춤 광고 설정 1.0
백엔드 이벤트 수집(큐 또는 인박스)·identify·이틀 재집계·전환 귀속·파티션 5.0
백엔드 홍보·운영 작업(상품별 단계)·이용권·이월·서명 URL 업로드·상담(PLAN 포함) 3.0
백엔드 기존 API 훅(선박 노출 변경·전시 저장 검증 015~018·로그인 is_owner) 1.5
백엔드 알림 21+2종·발송 큐(08시)·발송 기록 1.5
백엔드 어드민 API(약 34개, 목록 집계·dry_run·해지 미리보기·환급·대리 주문·지면 설정·엑셀) 3.0
백엔드 테스트(배치 시각 주입·누락분 처리·동시성·지면 12종 조건과 대체 규칙)·배포 6.0
백엔드 QA 기간(12/14~12/24) 결함 수정(외부 3.0 · 최상수 1.5) 4.5
백엔드 합계 53.5
프론트(고객웹) 공용 패키지: AD 표시·배너·추천리스트 컴포넌트 연결·바텀시트·노출 추적(세션·관찰·identify·GA4) 5.0
프론트(고객웹) CW-50 P1·P2(상품 줄·물때)·P3(목록 줄) 3.0
프론트(고객웹) CW-51 P4·P13 · CW-27 P12 2.0
프론트(고객웹) CW-30 P5·P17(기존 달력 연결) · CW-59 2.0
프론트(고객웹) CW-01 P6·P7·P8 · CW-60 조황 보기 4.0
프론트(고객웹) CW-40 P14(네이버 지도 마커·묶음 카드) 1.5
프론트(고객웹) CW-58 개정 · CW-61 · 접근성 1.0
프론트(선주) SJ-90(계약 있음·없음 = 소개 + 상담 요청)·경고 · SJ-01·30·60 1.5
프론트(선주) SJ-94 읽기(1단계 버튼) · SJ-99 · 알림 링크 선박 동기화 1.0
프론트(선주) SJ-95 성과(화면 묶음 5개 · 일·월 묶음 · 일별 그래프) 1.5
프론트(선주) SJ-96·97·97R 작업·파일 업로드 2.0
프론트(어드민) AD-80·81(카드 소재 탭)·82(계약금 선수취·잔여 슬롯) · 팝업 5종 5.5
프론트(어드민) AD-83 청구·납부·환급 탭 · AD-34 지급 요청 팝업 2.5
프론트(어드민) AD-84 작업 보드(대리 주문 포함) 2.5
프론트(어드민) AD-86(지면 12개 이름·스위치·금지어) · AD-04(015~018, 기존 수정 화면 결함 수정 포함) 1.5
프론트(어드민·선주) AD-82 연간 일시 계약 선택·AD-86 추가 할인율 · SJ-90E·SJ-90·SJ-94 혜택 표기(광고 대행·연간 일시) 1.0
프론트 QA 기간 결함 수정(송창석 2.0 · 외부 프론트 1.0) · 외부 프론트 인수인계 0.5 3.5
프론트 합계 고객웹 18.5 · 선주 6.5 · 어드민 12.5 · QA 수정 3.5 41.0
디자인 고객웹 10화면(디자이너 광고 컴포넌트 배치·사진 마커) · 선주 11 · 어드민 9 6.0
QA 시나리오 47개 2회전(배치 시각 주입 포함) 9.5

인력 배치(본안 = 1단계 지면 12개 1/5 일괄 오픈) - 백엔드 53.5일 = 최상수 22.5일(계약·청구·차감·정산 연결·훅·알림·연간 일시 계약 21.0 + QA 수정 1.5, QA 수정은 12/14 이후) + 외부 백엔드 31.0일(서빙·맥락·이벤트·작업·어드민 API·테스트·QA 수정). 외부 계약 기간 11/2~12/24로 설정(온보딩 3일 제외 시 35일 중 31.0일). - 프론트 41.0일 = 송창석 27.0일(어드민 12.5 · 선주 6.5 · 고객웹 6.0 · QA 수정 2.0) + 외부 프론트 14.0일(공용 패키지 5.0 · CW-01·CW-60 4.0 · CW-50 P3 1.0 · CW-40 1.5 · CW-61 1.0 · QA 수정 1.0 · 인수인계 0.5, 계약 11/2~11/27 + QA 기간 1일). 송창석은 11/2~11/27에 AD-80~83 우선 완료 후 12/7 선QA 일정 대응, 외부 프론트는 11/2 첫 주에 공용 패키지 제작 [결정 필요 D-34]. - 착수 전 조건: D-19(백엔드 인력), D-34(프론트 인력), D-35(셸 공유·필드 확인), D-22(대표·직원 구분 컬럼), D-23(지급 후 이체 방식 실측), D-24(Redis 유무), D-25(업로드 저장소), D-28(맞춤형 광고 처리방침).

절단안(외부 프론트 미확보 시 적용, 11/2 확정) - 2/15(1.5단계)로 연기: P8 조황 카드와 CW-60(프론트 4.0 · 백엔드 0.5), P14 지도 사진 마커(프론트 1.5 · 백엔드 0.5), 성과 일별 그래프(프론트 1.0 · 백엔드 0.5), 메타 대행 결과 입력 화면(백엔드 1.0, 운영 시트), 월간 성과 알림 AN15(백엔드 1.0). - 결과: 프론트 34.5일(송창석 27.0 + 외부 프론트 7.5) · 백엔드 50.0일 · 1단계 지면 10개. 송창석 단독 진행 시 30영업일 초과로 절단안에서도 외부 프론트 필요.

17. 운영 체계

역할 담당 일
판매 영업 유승옥·신다훈 선주 상담, 어드민 대리 등록, 대기 관리
승인·계약 얼라이언스팀 [담당 미정] 신청 확인(1영업일), 승인·반려, 요청·해지 처리
홍보 작업 마케팅 [담당 미정] + 김진연(메타·네이버 대행) 인스타·릴스·카카오 소식·블로그·메타 광고·네이버 키워드광고
운영 작업 얼라이언스팀 [담당 미정] 조황 업로드, 소개 정비, 촬영 일정, 상품·일정 등록 대행
청구·세금계산서 경영지원 [담당 미정] 입금 확인, 세금계산서 발행, 미수·환급 관리

18. 결정 필요

ID 내용 권고 기한
D-01 도입 확정과 오픈일(2027-01-05) 진행. 선주 인터뷰 5곳 중 2곳 이상 B등급 이상 지불 의사 확인 시 확정 10/9
D-02 6월 단가 유지, 부가세 별도 유지, 부가세 별도 10/9
D-03 검색 결과 광고 목록 상단 [광고]추천리스트 최대 3(P4) + 결과 5건 미만인 경우에 한해 「하루만 옮기면」 최대 2(P13). 중간 삽입 없음, 일반 결과에서 제외하지 않음 10/9
D-04 선박 상세 광고 「이런 곳은 어때요?」는 유지, 그 상단에 「같은 항구에서 나가는 배」 최대 3(P5) + 마감일 배너·바텀시트(P17) 추가 10/9
D-05 플로팅 카드 제외 제외 10/9
D-06 쿠폰 선박 지면·등급 쿠폰 제외 제외 10/9
D-07 인증 뱃지 제외 제외 10/9
D-08 판매 상한 지역 A6·B10·C15 / 전국 A10·B20·C40 원안 유지 10/9
D-09 미납 기준 14일 안내·21일 정지·60일 해지 원안 유지 10/16
D-10 중도 해지 정산(사용 기간 정가, 원 총액 상한) 5.7안 10/16
D-11 홍보 작업 담당 실명과 월 처리 상한 4.2안 + 담당 지정 10/16
D-12 단건 가격표 2.3안 10/16
D-13 유튜브 체험 영상은 상담 신청으로 한정 원안 유지 10/16
D-14 지역 매핑(부산·서울 등) 3.3안 10/16
D-15 정산정보 미등록 선주는 계좌 선입금만 허용 원안 유지 10/16
D-16 광고 서비스 이용약관 12차 편입 편입(11/14 공고) 10/30
D-17 전환 기준 「클릭 후 168시간·마지막 클릭·결제 완료」 원안 유지 10/16
D-18 세금계산서 1단계 수동 발행 원안 유지, 2단계 API 발행 10/30
D-19 11~12월 백엔드 인력(외부 1명 확보 또는 오픈 연기) 외부 1명 10/16
D-20 같은 등급 내 노출 순서 무작위(입찰 없음) 원안 유지 10/9
D-21 S4 메타·S7 네이버 대행 과세 공급가액 범위 · 연간 일시 계약 총액 세금계산서 시점 · 광고 차감 상계 처리 세무사 확인 10/30
D-22 대표·직원 계정 구분 컬럼 확인 개발 확인(최상수) 10/9
D-23 지급 요청 후 실제 이체 방식(수동 엑셀 이체 / 은행 연동 여부) 실측 후 net_amount 반영 지점 확정(최상수·경영지원) 10/9
D-24 이벤트 큐용 Redis 보유 여부 미보유 시 인박스·dedup·idempotency 테이블 방식 10/9
D-26 선주 모바일 1단계 축소(신청·요청·단건 앱 구매 화면 2단계로 이관, 1단계 판매 = 영업 오프라인 계약 + 대리 등록 + 계약금 선수취) 축소 확정 10/9
D-27 1단계 고객웹 지면 12개와 등급 배정(2.2) · 카드 모양은 등급과 무관하게 동일(3.5) 원안 유지. 선주 인터뷰에서 등급별 지면 수 차이 체감 확인 10/9
D-28 맞춤형 광고 범위(예약 이력 사용 P7·P1 탭 순서로 한정)와 처리방침 항목·끄기 화면(CW-61) 법무 확인 후 처리방침 11/14 공고에 함께 반영 10/30
D-29 「내일 새벽 출항」 줄 「출항 확정」(18시 알림톡 버튼으로 선장 확정) 2단계 적용. 1단계는 「출항 예정」 시각만 노출 10/30
D-30 물때 표기: 1단계 지역별 표기법 계산(부록 B), 항구별 조석 지점 연결은 2단계 10/30까지 국립해양조사원 2027년 1~2월 물때표와 대조 후 부록 B 확정, 확정 전 QA 36 보류 10/30
D-31 15초 바다(P9) 영상 저장·전송 방식(릴스 원본 재사용, 저장소·용량) 2단계 착수 전 결정 2027-01-29
D-32 결항 다시 잡기(P19) — 취소 탭 광고 부착 가능 여부 법무 확인 전 보류 2027-01-29
D-33 출조 탭 광고 모듈과 커머스 핫딜 섹션의 노출 순서(동일 화면 노출 시) 광고 섹션 사이에 일반 섹션 1개 이상 배치(3.2 얼럿 규칙 준용) 10/16
D-34 외부 프론트 1명 14.0일(11/2~11/27 + QA 기간, 공용 패키지·새소식 홈·지도) 확보 또는 절단안(P8·P14를 2/15로 연기) 외부 1명 확보. 10/30까지 계약 미체결 시 절단안으로 착수 10/16
D-35 개발 확인 4건: 8월통합 셸과 원격 앱(/booking·/map)의 공용 패키지 공유 방식 · 선박 「전화 예약」 구분 필드 · 관심장소의 바다/민물 구분 필드 · 9지역 예보 지점 코드 송창석·최상수 확인 10/16
D-36 광고 표시 문구: 디자이너 AD-mark 「AD」 그대로 사용 여부 또는 같은 모양에 「광고」 글자 적용 여부 「AD」 그대로 사용, CW-58에서 의미 공개. 법무에서 「광고」 한글 표기 요구 시 같은 컴포넌트에서 글자만 변경 10/16
D-37 광고 대행·운영 지원의 등급 혜택 포함 범위(S7 A·B 수수료 무료·C 50%, S4 A 회차마다·B 3회차마다, S5·O1·O4)와 S7 가격(광고비 20만원 이상 + 수수료 15%, 최소 3만원) 원안 유지. 선주 인터뷰에서 광고 대행 수요 확인, 운영 인력(17) 확정 후 판매 10/16
D-38 연간 일시 계약 혜택(추가 5%p · 30일 연장 · 촬영 · 다음 해 슬롯 우선 확보)과 해지 시 혜택 회수 방식 원안 유지 10/16
D-25 작업 자료 업로드 저장소(기존 조황 이미지 경로 재사용 여부, 서명 URL·버킷 CORS·만료 재발급) 기존 저장소 재사용, 서명 URL 15분, 만료 시 upload-urls 재호출 10/16

19. 리스크

리스크 영향 대응
선주의 가격 부담 인식 계약 0건 오픈 1개월 프로모션 일수(최대 30일), 단건 상품으로 우선 경험 유도
광고 유입 예약 저조 재계약 실패 월간 성과 알림, 지면 판매 조건 유지, 홍보 작업으로 보완
화면 내 광고 과다 노출 고객 이탈 화면별 광고 모듈 상한(출조 3 · 홈 3 · 검색 2 · 상세 1+바텀시트), 한 화면 같은 선박 2회 이하, 연속 배치 금지, 지면별 스위치. 오픈 4주 후 화면별 이탈률을 광고 도입 전 4주와 비교
맥락 지면 공백 노출 지면 수 대비 노출 적음 조건 미충족 시 모듈 미노출로 빈 영역 방지. 운영 SQL 리포트로 지면별 「채워진 비율」 주 1회 확인
「추천처럼 보이는 광고」 오인 제재·신뢰 하락 3.8 표시 규칙, 금지 문구 목록, 오픈 전 법무 화면 검토
고객의 AD 표시 광고 미인지 광고 오인·제재 CW-58에서 의미 공개, 법무 확인(D-36), 오픈 4주 후 AD 표시 클릭률 확인
홍보 작업 지연 계약 불이행 월 처리 상한, 미이행분 이월, 담당 지정 전 판매 금지
정산 차감 오류 선주 신뢰 하락 지급 요청 미리보기, 차감 내역 공개, 주간 대사 리포트, 리허설
약관 시행 지연 판매 불가 11/14 공고 마감 엄수

20. 수용 기준 (QA 시나리오 요약 — 전체 47개는 QA 시트)

  1. 영업이 AD-82에서 A등급 3개월·정산 차감·계약금 선수취 활성 상태로 대리 등록 시 → 확인 중, AN01. 승인 시 → 입금 대기, 1회차 660,000원 계좌 청구, AN04.
  2. 입금 확인 → 집행 예정 → 시작일 00:00 집행 중 → 5분 이내 P1·P2·P3 등 A 지면 노출. 2회차 청구는 정산 차감 처리.
  3. 동일 지역 A 6건 집행 중 상태에서 신청 시 → 대기(1번째). 한 건 만료 시 → 다음 날 00:20 확인 중 전환, AN16.
  4. 직원 계정은 SJ-90E에 [상담 요청] 버튼 미노출, 상담 API를 직접 호출 시 AD4031 반환.
  5. 회차 청구 660,000원(부가세 포함) 상태에서 운영자가 해당 선박 지급액 300,000원 행으로 지급 요청 시 → 미리보기 차감 300,000 · 최종 0, 확정 시 → 청구 PART 300,000. 다음 지급 요청 500,000 시 → 차감 360,000 · 최종 140,000 → PAID.
  6. 지급 요청 두 번 클릭 시에도 차감은 한 번만 처리.
  7. 청구 21일 미수 시 → UNPAID 정지, 5분 이내 전체 지면에서 제외, 입금 확인 시 → 재개, AN09.
  8. P4: 검색어 「인천」, 일반 결과 38척(광고 A 2·B 3·C 2 포함) 시 → 목록 상단 묶음 A·A·B 노출(동일 세션 내 노출 순서 유지), 일반 목록은 광고 선박 포함 38척 그대로 유지, 「38건의 검색 결과」 노출. 정렬 기준을 가격순으로 변경해도 묶음은 최상단 유지, 일반 목록만 재정렬.
  9. P2: 내일 잔여 좌석 6석 상품만 있는 광고 선박은 내일 탭 미노출.
  10. 광고 카드 50% 노출 0.8초 후 스크롤로 화면 이탈 시 → 노출 0. 1.2초 시 → 노출 1. 동일 세션 내 재노출 시에도 1.
  11. 광고 클릭 후 167시간째 결제 시 → 전환 1. 169시간째 결제 시 → 0. 비로그인 클릭 후 동일 기기에서 로그인·결제 시 → 전환 1(클릭과 결제 사이 최초 연결 회원 기준). 로그인 상태로 앱 실행 후 클릭·결제 시 → 전환 1(앱 시작 시점 identify).
  12. 시작일 2027-01-31, 3개월 → 회차 01-31·02-28·03-31, 종료일 04-29.
  13. 해지 정산 예시(5.7) 금액과 화면 미리보기 금액 일치.
  14. 인스타 게시 작업: 결과물 「표시 확인」 체크 없이 「선주 확인」 단계로 전환 불가.
  15. 결과물 확인 요청 후 72시간 무응답 시 → 자동 승인 → 게시 준비 전환, OP02.
  16. 수정 요청 2번째 시 → AD4095 반환.
  17. 월 처리 상한 도달 후 단건 신청 시 → AD4093 반환, 마감 문구 노출.
  18. 선박 노출안함 처리 시 → 계약 일시정지(HIDDEN), 노출 재설정 시 → 재개.
  19. 서빙 API 1.5초 지연 시 → 해당 모듈만 미노출, 검색 결과·출조 탭·홈은 정상 유지. P6 실패 시 날씨 카드는 그대로 유지.
  20. 광고 안내 바텀시트 문구는 3.4와 일치, 뒤로가기 시 닫힘.
  21. 입금 대기 중 시작일 경과 후 입금 확인 시 → 시작일을 입금 확인 다음 날로 변경, 종료일·회차 재계산.
  22. 동일 선박에 기간이 겹치는 계약을 운영자 두 명이 동시 대리 등록 시 → 하나만 생성, 나머지 하나는 AD4091 반환.
  23. 지급 미리보기 후 다른 운영자가 입금 확인 시 → 확정 요청 AD4097 반환, 미리보기 재실행 시 줄어든 차감액 반영.
  24. 해지일을 오늘로 처리 시 → 오늘 23:59까지 노출, 다음 날 00:00 해지, 환급 금액은 5.7 예시와 일치.
  25. 인스타 게시 승인 시 → 「게시 준비 중」 → 운영자 링크 입력 후 [완료 처리] → 완료, AN14.
  26. 검색 결과 2페이지 이후 광고 미노출(묶음은 1페이지 상단에 한함).
  27. 인천 A 6/6 · 대기 2건(1번 4. 5 시작 3개월, 2번 2. 5 시작 1개월). 2. 5~3. 4에 한해 1자리 잔여 시 → 1번은 기간(4. 5~7. 4) 판정 실패, 2번은 기간이 1번과 겹치지 않아 판정 진행 후 통과 → 2번 확인 중 전환. 1번과 기간이 겹치는 후순번은 건너뜀. 그 사이 신규 신청은 대기로 진입. 대기에서 올라온 확인 중 계약이 있는 동안 동일 슬롯으로 다음 대기자 승격 불가.
  28. A → B 등급 변경(change-grade): 신규 계약 생성, 기존 계약 해지 예정 처리, 기존 계약 슬롯은 해지일 다음 날부터 빈 슬롯으로 처리되어 겹침 제약(AD4091) 대상 아님.
  29. 해지일을 다음 회차 시작일 이후로 지정 시 → 해당 회차 청구는 회차 시작일에 생성, 미리보기 「해지일 전 청구 예정」에 포함. 해지일 이후 회차 청구는 미생성. 해지 확정 시 미회수 청구는 취소, 일부 회수 청구는 감액 후 완납 처리, 차액만 조정 청구 또는 환급.
  30. 계좌 단건 신청 후 168시간 미입금 시 → 작업·청구 취소, AN20. 정산 차감 단건 미수 21일 경과 시 → 계약 정지 없이 작업만 보류 표시.
  31. 00:00 배치 하루 실패 시 → 다음 날 실행에서 전날 시작 예정이던 계약·회차·청구 일괄 처리.
  32. 운영 사정 취소 작업의 이용권은 복원, 자료 미제출 취소 작업의 이용권은 미복원. ops_shortfall 1 → 다음 회차 carried_in 1, 그다음 회차로는 이월 불가.
  33. 660,000원 청구 중 300,000원 회수 상태에서 해지 시 → 해당 청구는 300,000원(공급가액 272,728 · 부가세 27,272)으로 감액 완납, 차액은 기회수 공급가액 기준으로 계산.
  34. 대기 1번의 희망 시작일 경과 시에도 판정 기간을 오늘 + 2영업일부터 재설정. 희망 시작일 + 30일 경과 시 자동 취소, AN21. 서로 다른 지역 두 건이 전국 마지막 1자리를 동시 승인 시 하나만 성공.
  35. 계좌 결제로 등급 변경 시 → 신규 계약 입금 대기 168시간 경과로 취소 → 원 계약 해지 예정 해제, 집행 중 유지, 이력 change_grade_rollback, OP01.
  36. P2: 1. 22(금) 탭 하단에 지역 표기법(인천 = 7물때식) 기준 물때 노출, 카드 탭 시 → CW-30 진입, 달력 1. 22 선택 상태.
  37. P3: 내일 출항 상품이 있는 A·B 광고 선박 2척 시 → 모듈 미노출. 4척 시 → 출항 시각순 4줄 노출, 모듈 헤더에 AD 표시.
  38. P13: 날짜 1. 22로 「격포」 검색, 일반 결과 3건 시 → 결과 하단 「하루만 옮기면」 묶음 노출, 카드 「1. 23(토) 4석」 탭 시 → CW-30 &resDt=2027-01-23 진입. 일반 결과 5건 이상 시 묶음 미노출.
  39. P17: CW-30에서 마감된 1. 22 탭 시 → 날짜 하단 「같은 바다로 나가는 배」 배너 노출 → CW-59에 동일 지역 1. 22 잔여 좌석 광고 선박 노출(현재 선박 제외) → 카드 탭 시 → 해당 선박 CW-30(&resDt=2027-01-22) 진입. 광고 선박 0척 시 AD 없는 배너로 일반 검색 안내.
  40. P6: 관심장소 「영흥도」(인천), 예보 1. 21 1.8m · 1. 22 0.5m · 1. 23 1.0m, 광고 선박 잔여석 1. 21·1. 22 시 → 「1. 22(금) 파고 0.5m · N석」 노출. 5일 모두 1.5m 초과 시 배너 미노출(해당 지면은 기존 AD 배너 노출 또는 빈 영역 처리).
  41. P7: 남은 예약 있음 시 → D-day 카드 노출. 남은 예약 0 + 지난 예약(인천 쭈꾸미) 시 → 인천 쭈꾸미 광고 선박 「다음 출조, 이 배는 어때요?」 카드 노출. CW-61에서 맞춤 광고 해제 시 → 다음 요청부터 P7 미노출, P1 탭 노출 순서에서 예약 지역 우선 제외.
  42. P8: 광고 선박 4척이 72시간 이내 조황 등록 시 → 앞 3장만 광고(AD 표시), 4번째 광고 선박은 일반 카드에 최신순 노출(광고 표시 없음). 카드 탭 시 → CW-60 진입, [이 배 예약하기]만 클릭으로 집계.
  43. P14: 지도에 광고 항구 5곳이 노출된 화면 → 사진 마커 3개 노출. 지도 이동 시 재선정. 마커 탭만 한 경우 클릭 0, 「선박 정보」 바텀시트 행 탭 시 클릭 1.
  44. 출조 탭에서 placements=P1,P2,P3를 일괄 요청, 동일 선박이 세 모듈 조건에 모두 해당 시 P1·P2에 노출, P3에서는 제외 후 다음 후보로 채움. P2의 날짜 탭 5개에 동일 선박이 노출되어도 1번으로 집계. 동일 요청 재전송 시에도 결과 동일.
  45. 카드 모양: A·B·C 계약 선박이 동일 지면에 노출 시 카드 모양은 동일, 노출 순서만 A → B → C. AD 표시는 모든 경우 유지.
  46. 연간 일시 계약: 유어선 A로 대리 등록 시 → 승인 시점 총액 청구 5,544,000원(부가세 포함) 1건 생성, 종료일 = 12개월 + 30일, 1회차에 O1 이용권 1건, 7회차에 O1 1건 추가. 정산 차감 선택 불가.
  47. S7: C등급 계약 선박이 네이버 키워드광고 대행을 광고비 200,000원으로 신청 시 → 수수료 30,000원(15%, 최소 금액과 동일)에 50% 할인 = 15,000원, 청구 215,000원(부가세 별도). A등급은 수수료 0원.

부록 A. 아이디어 선별 (215건 → 1단계 12 · 2단계 7 · 3단계 6)

7개 작업으로 나눠 수집한 아이디어. 지면 53(PL) · 카드 32(CD) · 맥락 35(CX) · 콘텐츠 29(CT) · 해외·국내 사례 28(BM) · 기발한 것 30(WD) · 법 검토 39(LG). 선별 기준은 네 가지. ① 고객이 이미 무언가를 결정한 순간인지 여부 ② 선주가 「우리 배가 이렇게 나간다」고 체감하는지 여부 ③ 「광고」 표시를 첫 시선에 배치 가능한지 여부 ④ 1단계 공수 범위 내인지 여부.

A.1 채택

단계 지면 출처 아이디어 고른 이유
1 P6 이 바다로 나가는 배 PL-03 · CD-09 날씨 카드 꼬리 · CX-05 날씨 확인 시점이 출조 결정 직전임. 예보 데이터가 이미 화면에 있어 서버 추가 호출 없음
1 P7 다음 출조, 이 배는 어때요? PL-02 빈 D-day 현재 비어 있는 홈 지면 활용. 지난 예약 어종 기준 선정으로 적중 확률 높음
1 P8 선장님 조황 소식 CD-06 조황 스토리 줄 조황 사진은 고객 조회가 가장 많은 콘텐츠임. 기존 조황 카드와 동일 형식이라 거부감 적음
1 P1 이번 주 함께하는 배 CD-01 선장 한마디 · CD-04 7일 조황 막대 A등급만 노출되는 출조 탭 첫 광고 모듈. 모양은 「인기 선박 모음」 그대로 유지
1 P2 이번 주 남은 자리 CD-03 승선권 티켓 · CX 물때 표시 날짜 탭·물때·잔여석을 기존 마감임박 카드 구성으로 노출
1 P3 내일 새벽 출항 CD-02 출항 전광판 「내일 새벽」은 낚시 고객의 실제 결정 시점임. 모양은 출조 홈 목록 카드 유지, 출항 시각을 앞에 표기
1 P4 이 조건으로 나가는 배 현행 P4 개편 중간 삽입 폐지 후 별도 묶음으로 전환. 순위 조작 오인 해소 목적
1 P13 하루만 옮기면 PL-22 결과가 적어 이탈하려는 순간에 대안 제시. 고객 가치가 가장 분명함
1 P12 지금 예약 열린 배 BM 검색 탭 광고 사례 검색어 입력 전 빈 화면 활용. 검색 결과는 변경하지 않음
1 P5 같은 항구에서 나가는 배 현행 P5 개편 「이런 곳은 어때요?」는 그대로 두고 별도 모듈로 분리
1 P17 같은 바다로 나가는 배 PL-32 · CX-04 마감을 만난 고객 이탈 방지 목적. 같은 날·같은 바다라 대체 수요가 가장 강함
1 P14 지도 사진 마커 CD-11 · BM 지도 광고 핀 사례 기존 탐색 탭에 광고 지면 없음. 마커는 지도를 가리지 않음
2 P9 15초 바다 CT-02 · BM 동영상 광고 사례 릴스(S2) 제작 영상 그대로 활용. 영상 저장·전송 결정 선행 필요
2 P10 피드 속 선장 조황 PL-07 팔로잉 피드 API에 광고 슬롯 추가 필요
2 P11 시군구 대표 배 PL 지역 아코디언 시군구 코드 정리 후 진행
2 P15 이 바다로 가는 배(조과 상세) CT-04 조과 좌표 → 가까운 항구 연결 후 진행
2 P16 이 항구 배(항구 시트) PL 항구 시트 항구 시트 API 정리 후 진행
2 P18 선장 소개 블록 CD 선장 영상 카드 소재 영상 축적 후 진행
2 P3+ 출항 확정 표시 PL-15 18시 알림톡 버튼으로 선장 확정 처리(선주 앱 화면 없이)
3 같은 물때 다시 보기 CX-01 · PL-39 맞춤 광고 동의 + 광고성 정보 수신 동의 필요
3 손맛 지수 WD-01 조과 데이터 축적 후에야 지수 안정 확보 가능
3 지역×어종 페이지 CT-03 검색 유입 페이지 생성·운영 선행 필요
3 첫 조황 알림 PL-20 · PL-49 웹 푸시 · 「(광고)」 · 야간 동의
3 바다 여권 WD-05 예약 이력 기반 · 맞춤 광고
3 주말 바다 예보 WD-07 예보 콘텐츠 운영 체계 필요

A.2 보류·제외

아이디어 판단 이유
WD-02 랜덤 출조권 제외 결제 후 배를 정하는 구조라 환불·분쟁 소지 있음, 광고 상품과 결합 시 표시 불가
WD-03 꽝 위로 포인트 제외 포인트 비용을 선주에게 전가 시 쿠폰 전가 금지 원칙과 동일한 문제 발생
CT-05 쿠폰 복권 뒤 쓸 배 제외 회사 쿠폰과 광고 선박 결합 시 「할인 = 광고」 오인 소지, 선주 쿠폰 금지 원칙 근거
CT-06 이달의 명당 선박 제외 「명당」은 순위·인증으로 인식될 소지 있음(금지어 성격)
CT-07 핫스팟 깃발 P14로 흡수 조과 위치 그대로 노출 시 포인트 공개 반발 우려. 항구 기준 사진 마커로 대체
WD-04 선장 무전 보류 실시간 음성 검수·운영 부담
PL-27 저기 어떻게 가요? 보류 길찾기 화면 비가림 원칙과 충돌 소지
P19 결항 다시 잡기(WD-08 · CX-03) 보류(D-32) 취소 구간 광고 금지 원칙과 충돌 여부 법무 확인 선행 필요
CT-08 인스타에서 보신 그 배 보류 외부 유입 매칭 데이터 없음
검색 결과 10건마다 중간 삽입(현행 P4) 폐지 일반 목록 노출 순서·개수 변경으로 순위 조작 오인 소지(쿠팡 사례), 페이지 토큰 공수 부담
띠배너(현행 P3) 「내일 새벽 출항」 목록으로 교체 이미지 배너는 선주 소재 품질에 따른 편차가 크고 기억에 남지 않음

A.3 참고한 사례에서 가져온 것

사례 가져온 것 가져오지 않은 것
지도 앱 광고 핀 사진 마커·「선박 정보」 바텀시트(P14) 지도 첫 화면 전면 광고
숙박 예약 노출 부스터 등급 상향 시 카드에 슬롯이 추가로 열리는 구조(3.5) 금액에 따라 노출 순위를 올리는 방식
검색 탭 첫 화면 광고 검색어 입력 전 광고 줄(P12) 검색 결과 순위 개입
동영상 피드 광고 15초 바다(P9, 2단계) 소리 자동 재생
「보증」 배지 상품 반면교사 — 유료 배지에 「인증」「보증」 표기 금지 —

부록 B. 물때 표기 표 (P2)

음력 일 → 물때 이름. 서해(인천·경기·충남·전북)는 7물때식, 그 밖(전남·경남·경북·강원·제주)은 8물때식 적용. 서빙 API에서 tide 문구 생성. 「사리」는 7물때식 7물, 8물때식 8물 날에 표기 [확인 필요: 국립해양조사원 표기와 하루 차이 여부].

음력 일 7물때식(서해) 8물때식(남·동해)
1 · 16 7물 사리 8물 사리
2 · 17 8물 9물
3 · 18 9물 10물
4 · 19 10물 11물
5 · 20 11물 12물
6 · 21 12물 13물
7 · 22 13물 조금
8 · 23 조금 무시
9 · 24 무시 1물
10 · 25 1물 2물
11 · 26 2물 3물
12 · 27 3물 4물
13 · 28 4물 5물
14 · 29 5물 6물
15 · 30 6물 7물

부록 C. 피그마 섹션 노드

피그마 파일 「클로드 광고시스템」 페이지. 밴드 순서 OV(개요 15 + 흐름도 OV-16) → SJ(선주 모바일 17) → CW(고객웹 10 + 디자이너 핸드오프 HO-01) → AD(어드민 9). CW 목업은 8월통합 실컴포넌트 복제본(글꼴은 Noto Sans KR로 임시 교체, 디자이너가 Pretendard로 일괄 교체). 각 섹션 헤더 아래 진입·이탈 행의 화면 ID를 클릭 시 해당 섹션으로 이동.

ID 섹션 노드
OV-01 한 장 요약과 원칙 24408:4421
OV-02 상품 구성 24408:4536
OV-03 지면 노출 정책 24409:4421
OV-04 홍보·운영 작업 24410:4421
OV-05 계약과 결제 24410:4560
OV-06 측정과 표기 규격 24412:4421
OV-07 화면 목록·데이터 모델·API 24413:4421
OV-08 배치와 알림 24414:4421
OV-09 권한·예외·비기능 24414:4617
OV-10 일정·공수·운영·결정·리스크·QA 24415:4421
OV-11 사이트맵 — 진입 깊이 24417:4707
OV-12 전이 매트릭스 24417:4859
OV-13 화면 인벤토리와 범례 24417:5027
OV-14 알림 카탈로그 24417:5368
OV-15 아이디어 선별과 물때 표 24417:4421
OV-16 광고 성과 흐름 — 노출부터 정산까지 24393:4421
SJ-01 홈 — 광고·홍보 카드 24394:4421
SJ-30 정산관리 — 광고비 차감 줄 24394:4491
SJ-60 마이 — 광고·홍보 관리 메뉴 24394:4561
SJ-90 광고·홍보 홈 — 계약 있음 24396:4421
SJ-90E 광고·홍보 홈 — 계약 없음 24396:4604
SJ-91 등급 고르기 24396:4715
SJ-92 광고 신청서 24397:4421
SJ-92C 신청 확인창 24397:4569
SJ-93 신청 완료 24397:4641
SJ-94 계약 상세 24398:4421
SJ-94R 연장·등급 변경·해지 문의 시트 24398:4550
SJ-95 광고 성과 24398:4638
SJ-96 홍보 맡기기 — 작업 목록 24399:4421
SJ-97 작업 상세 — 자료 올리기·결과 확인 24399:4555
SJ-97R 수정 요청 시트 24399:4701
SJ-98 홍보 상품 신청 24400:4421
SJ-99 광고비 내역 24400:4542
CW-01 새소식 홈 — 광고 지면 3곳 24401:4421
CW-50 출조 탭 — 광고 모듈 3종 24401:4532
CW-27 통합검색 — 지금 예약 열린 배 24401:4651
CW-51 선박 검색 결과 — 광고 추천리스트 24402:4421
CW-40 탐색 지도 — 사진 마커 24402:4529
CW-30 선박 상세 — 마감일 배너·같은 항구 24402:4607
CW-59 같은 바다로 나가는 배 시트 24403:4421
CW-60 선장님 조황 보기 24403:4492
CW-58 광고 안내 시트 24403:4562
CW-61 알림 설정 — 맞춤 광고 24403:4632
HO-01 디자이너 핸드오프 스펙 24386:4291
AD-80 광고 계약 목록 24404:4421
AD-81 광고 계약 상세 24404:4539
AD-82 광고 계약 등록 팝업 24404:4751
AD-83 청구·납부 관리 24405:4421
AD-84 홍보·운영 작업 보드 24405:4545
AD-85 지면 현황·성과 24405:4698
AD-86 단가·상품·노출 설정 24406:4421
AD-34 정산관리 — 광고비 차감 24406:4528
AD-04 전시관리 — 광고 섹션 유형 24406:4597

21. 화면 정의서

화면 36개 · 번호는 Figma 정책 카드와 프로토타입 번호 영역과 같다(위 → 아래).

선주 모바일

SJ-01

홈 — 광고·홍보 카드

변경/프로토타입에서 보기 ↗
진입 하단 탭 [홈] · 로그인 직후여기서 이번 주 예상 정산 하단에서 광고 상태 확인 후 광고·홍보 홈 진입다음 SJ-90 광고·홍보 홈

선주 모바일 첫 화면. 기존 요약 카드와 확정 대기 목록 사이에 「광고·홍보」 카드 1장 추가. 그 외 요소는 변경 없음.

요소별 정의와 동작
  1. 1경고 줄
    정의: 정지 원인이 있거나 판매 상품이 없는 경우 카드 최상단에 노출되는 빨간 띠
    - UNPAID 「광고비 미납으로 노출이 멈췄어요」
    - HIDDEN 「선박이 숨김 상태라 광고가 나가지 않아요」
    - NO_PRODUCT 「판매 중인 상품이 없어 광고가 나가지 않고 있어요」
    - OPS 「운영팀이 광고를 잠시 멈췄어요」
    - 복수 해당 시 위 순서 기준 하나만 노출
  2. 2광고·홍보 카드 — 광고 중
    정의: 선택 선박의 현재 계약이 집행 중·일시정지인 경우의 카드
    - 제목 「어바웃픽 A등급 · 광고 중」(일시정지 시 「· 일시정지」)
    - 본문 「이번 회차 노출 12,480회 · 광고로 들어온 예약 9건」 — 현재 회차 시작일부터 어제까지 집계
    - 우측 [자세히 ›] 또는 카드 전체 영역 탭 → SJ-90
    - 직원 계정에도 노출(조회 권한)
  3. 3광고·홍보 카드 — 그 밖의 상태
    정의: 광고 중이 아닌 경우 상태별 한 줄 카드
    - 계약 없음: 「우리 배 홍보, 맡겨 주세요」 + 「광고 자리·인스타그램·조황 업로드까지 월 {price_from.C}원부터」(업종별, 유어선 250,000) + [알아보기 ›]
    - 확인 중 「신청을 확인하고 있어요」
    - 대기 「자리 대기 N번째예요」
    - 입금 대기: 「입금을 기다리고 있어요 · 1. 27(수)까지」
    - 시작 예정: 「2. 1(월)에 광고가 시작돼요」
    - 모든 경우 탭 → SJ-90
버튼을 누르면 생기는 일
  • 카드 탭 → SJ-90 (선택 선박 boat_idx 유지)
상태(빈 값·로딩·오류·권한)
  • 로딩: 카드 영역에 회색 스켈레톤 72px 노출
  • 오류: 카드 미노출(홈 나머지 영역은 유지)
표기 규격
항목형식예
노출 수#,##0회12,480회
예약N건9건
개발 메모
프론트 · 홈 기존 선박 드롭다운의 boat_idx로 GET /ptn-m/ads/summary 호출
프론트 · 요약 카드 바로 하단에 삽입, 기존 확정 대기 목록은 72px 아래로 이동
백엔드 · summary 응답 warnings[] 를 우선순위(UNPAID>HIDDEN>NO_PRODUCT>OPS) 순으로 정렬해 반환
API · GET /ptn-m/ads/summary?boat_idx=
SJ-30

정산관리 — 광고비 차감 줄

변경/receipt프로토타입에서 보기 ↗
진입 하단 탭 [정산관리]여기서 기간 정산 요약 및 정산 예정일별 카드에서 광고비 차감액과 최종 지급액 확인다음 SJ-99 광고비 내역

선박별·기간별 정산 화면. 광고비를 정산금에서 차감하는 선주에게 차감 금액과 최종 지급액 노출. 차감 계약이 없는 선주는 변경 없음.

요소별 정의와 동작
  1. 1기간 정산 요약 「광고비 차감」
    정의: 조회 기간 내 정산 예정일 카드들의 광고비 차감(예정+확정) 합계
    - 판매금액 · 수수료 · 정산 금액(= 판매금액 − 수수료) 하단에 「광고비 차감 −275,000원」(빨강) 노출
    - 마지막 줄 「최종 지급액」 = 정산 금액 − 광고비 차감
    - 차감 0원 시 광고비 줄·최종 지급액 줄 미노출, 기존 화면과 동일
  2. 2[광고비 내역 ›]
    정의: 정산목록 제목 줄의 텍스트 버튼(엑셀 버튼 좌측)
    - 광고 계약 또는 단건 청구 이력이 한 번이라도 있으면 노출
    - 누르면 SJ-99
  3. 3정산목록 카드 「광고비 차감」
    정의: 정산 예정일 카드 단위로 표시되는 광고비 차감
    - 카드 줄: 지급 예정액(차감 전) · 광고비 차감(예정) · 최종 지급액(우측 상단 큰 숫자)
    - 예정액 배분: 정산 예정일이 이른 카드부터, 청구일이 이른 미수부터 지급 예정액 한도 내에서 순차 배분
    - 예: 미수 275,000원 → 1. 24 카드(지급 예정 485,550원) 차감 275,000원·최종 210,550원, 1. 31 카드 차감 0원(줄 미노출)
    - 지급 요청 후에는 「광고비 차감」 확정값 노출
    - 카드 하단 회색 문구 「예정 금액은 지급 시점에 확정돼요」(예정 상태인 경우에 한함)
버튼을 누르면 생기는 일
  • [광고비 내역 ›] → SJ-99
  • [상세 내역 보기] → 기존 정산 상세(변경 없음)
상태(빈 값·로딩·오류·권한)
  • 차감 계약 없음: 기존 화면 유지
표기 규격
항목형식예
차감−#,##0원−275,000원
최종 지급액#,##0원210,550원
확인된 문제
  • 현행 정산 미노출 범위(선구매) 논의와 동일 화면이므로 함께 반영
결정 필요

D-15

개발 메모
프론트 · 정산 목록 응답의 ad_deduction{amount, is_estimated}, final_payout 필드 그대로 표시
백엔드 · 선주 정산 API에 정산 예정일 묶음별 ad_deduction(예정/확정)·final_payout 계산 추가 — 예정값은 조회 시점 미수 기준 배분
API · GET /ptn/boats/{id}/settlements (필드 추가)
SJ-60

마이 — 광고·홍보 관리 메뉴

변경/mypage프로토타입에서 보기 ↗
진입 헤더 프로필여기서 마이 메뉴에서 광고·홍보 진입다음 SJ-90

선주 마이. 마케팅 수신알림 카드와 제휴업체 정보 사이에 메뉴 한 줄 추가.

요소별 정의와 동작
  1. 1「광고·홍보 관리」 메뉴
    정의: 광고·홍보 홈으로 이동하는 메뉴 행
    - 우측 상태 텍스트: 광고 중이면 「A등급 광고 중」(초록), 확인 중이면 「확인 중」(주황), 해당 없으면 빈 값
    - 탭 시 SJ-90 진입(마지막으로 선택한 선박 기준)
버튼을 누르면 생기는 일
  • 메뉴 탭 → SJ-90
개발 메모
프론트 · 상태 텍스트는 summary API의 current_contract.status
API · GET /ptn-m/ads/summary
SJ-90

광고·홍보 홈 — 계약 있음

신규/ads프로토타입에서 보기 ↗
진입 SJ-01 카드 · SJ-60 메뉴 · 알림톡 버튼여기서 광고 계약·성과·이용권·진행 중 작업을 한 화면에서 확인 후 각 상세로 이동다음 SJ-94 · SJ-95 · SJ-96 · SJ-98 · SJ-99

선박 1척의 광고·홍보 현황판. 계약 상태가 확인 중·대기·입금 대기·집행 예정·집행 중·일시정지인 계약이 있으면 이 화면, 없으면 SJ-90E 노출.

요소별 정의와 동작
  1. 1선박 선택
    정의: 업체 보유 선박 중 하나를 선택하는 드롭다운(홈과 동일 컴포넌트)
    - 디폴트(기본값) = 홈에서 마지막으로 선택한 선박
    - 변경 시 화면 전체를 해당 선박 기준으로 재조회
    - 선박이 1척이면 드롭다운 대신 선박명만 노출
  2. 2경고 띠
    정의: 광고 미노출 사유를 안내하는 빨간 띠
    - UNPAID 「광고비 1,320,000원이 미납되어 노출이 멈췄어요」 + [입금 안내 ›] → SJ-99
    - HIDDEN 「선박이 숨김 상태라 광고가 나가지 않아요」
    - NO_PRODUCT 「판매 중인 상품이 없어 광고가 나가지 않고 있어요」 + [상품 등록 ›] → 상품관리
    - OPS 「운영팀이 광고를 잠시 멈췄어요. 고객센터 02-722-0365」
    - 해당 없으면 미노출
  3. 3계약 카드
    정의: 현재 계약 1건 요약
    - 「어바웃픽 A등급」 + 상태 칩(광고 중·시작 예정·일시정지·확인 중·자리 대기·입금 대기, 색상은 공통 표 기준)
    - 기간 「2027. 1. 5 ~ 2027. 4. 4」 · 「2회차 (2. 5 ~ 3. 4)」
    - 월 금액 「월 600,000원 (부가세 별도)」 · 결제 「정산금에서 차감」
    - 다음 계약이 있으면 하단 회색 줄 「다음 계약 B등급 · 4. 5 시작 예정」 노출
    - 카드 탭 → SJ-94
  4. 4이번 회차 성과
    정의: 현재 회차 시작일부터 어제까지 집계한 광고 성과
    - 노출 · 클릭 · 광고로 들어온 예약 · 결제액 4칸(결제액은 칸 폭 제약으로 만원 단위 표기, 만 미만 절사: 「135만원」)
    - 하단 「광고비 대비 결제액 6.2배」 — 결제액 ÷ 회차 광고비(일할)
    - 우측 상단 「1. 19(화)까지 집계」
    - 집행 전(시작 예정·확인 중)이면 영역 대신 「광고가 시작되면 성과가 여기에 보여요」 노출
    - [성과 자세히 ›] → SJ-95
  5. 5이번 회차 홍보 이용권
    정의: 현재 회차에 사용 가능한 등급 포함 작업 수
    - 행 = 작업명 · 「1 / 2건 사용」 · [맡기기]
    - 남은 이용권이 0이면 [맡기기] 대신 「다 썼어요」 노출
    - [맡기기] → 확인 팝업(제목 「인스타그램 게시 1건을 맡길까요?」 · 본문 「이용권 1건이 쓰여요.」 · 풀폭 [맡기기] · 텍스트 [취소]) → 작업 생성 → SJ-97
    - C등급은 조황 업로드 대행만 노출
    - 직원 계정은 [맡기기] 미노출
  6. 6진행 중인 작업
    정의: 완료·취소 상태가 아닌 작업 최대 3건
    - 행 = 작업명 · 상태 칩 · 「1. 12(화)까지」
    - 선주 할 일이 있는 작업(자료 요청·선주 확인)을 최상단에 정렬, 빨간 점 표시
    - [전체 보기 ›] → SJ-96
    - 없으면 「진행 중인 작업이 없어요」
  7. 7홍보 상품 배너
    정의: 등급 미포함 단건 홍보 상품으로 이동하는 띠
    - 2단계 오픈(1단계 미노출): 「메타·네이버 광고 대행, 블로그 체험도 맡길 수 있어요」 [홍보 상품 보기 ›] → SJ-98
  8. 8광고비 내역 링크
    정의: 청구·차감·입금 내역으로 이동하는 행
    - 우측: 미수가 있으면 「미수 660,000원」(빨강, summary.unpaid_total = 단건 포함 전체), 없으면 「›」만 노출
    - 누르면 SJ-99
버튼을 누르면 생기는 일
  • 계약 카드 → SJ-94
  • [성과 자세히] → SJ-95
  • [맡기기] → 확인 팝업 → 작업 생성(POST service-orders source=Q) → 토스트 「작업을 맡겼어요」 → SJ-97
  • [전체 보기] → SJ-96
  • [홍보 상품 보기] → SJ-98
  • 광고비 내역 → SJ-99
상태(빈 값·로딩·오류·권한)
  • 로딩: 섹션별 스켈레톤
  • 오류: 「정보를 불러오지 못했어요. 다시 시도해 주세요.」 + [다시 시도]
  • 권한(직원): 신청·맡기기 버튼 미노출
표기 규격
항목형식예
기간YYYY. M. D ~ YYYY. M. D2027. 1. 5 ~ 2027. 4. 4
회차N회차 (M. D ~ M. D)2회차 (2. 5 ~ 3. 4)
배수N.N배6.2배
기한M. D(요일)까지1. 12(화)까지
결정 필요

D-11

개발 메모
프론트 · GET summary 한 번 호출로 전체 구성
프론트 · 선박 선택 값은 localStorage af_boat_idx(홈과 공유)
백엔드 · summary는 계약 여러 건 중 current = ACT>PAU>SCH>PAY>REQ>WAI 우선 1건, 나머지는 other_contracts
API · GET /ptn-m/ads/summary
API · POST /ptn-m/ads/service-orders
SJ-90E

광고·홍보 홈 — 계약 없음

신규/ads프로토타입에서 보기 ↗
진입 SJ-01 카드 「알아보기」 · SJ-60여기서 어바웃픽 소개 확인 후 영업 담당자 상담 요청다음 상담 요청 확인창 · SJ-96 · SJ-99

광고 계약이 없는 선박의 광고·홍보 홈. 1단계는 상품 소개·가격 공개와 [상담 요청]만 제공. 계약은 영업 담당자가 대면 설명 후 어드민에서 대리 등록(D-26). 앱 신청 흐름(SJ-91~93)은 2단계.

요소별 정의와 동작
  1. 1선박 선택
    정의: SJ-90과 동일한 드롭다운
    - 선박별 계약 상태가 다르므로 변경 시 SJ-90/SJ-90E가 전환될 수 있음
  2. 2소개 머리
    정의: 어바웃픽 한 줄 소개
    - 제목 「빈자리, 광고로 채워 보세요」
    - 부제 「고객웹 12곳 광고 자리 · SNS 홍보 · 운영 지원을 한 번에 맡기는 월 정액 상품이에요」
  3. 3고객에게 이렇게 보여요
    정의: 광고 노출 형태 예시 3줄(디자이너 광고 컴포넌트 이름 + 예시 문구 + AD 표시)
    - 「새소식 홈 · 가로 배너」 「1. 22(금) 파고 0.5m, 영흥도 진두항 바다로 나가요」
    - 「검색 결과 · 추천리스트 상자」 「주꾸미 | 남항부두 | 1. 22 3석」 머리 줄 하단 선박 카드
    - 「출조 탭 · 인기 선박 모음 모듈」 「이번 주 남은 자리」 날짜 탭 + 선박 카드
    - 부제 「등급과 관계없이 같은 모양으로 나가고, 등급이 오를수록 나가는 자리가 늘어나요」
  4. 4등급 미리보기
    정의: A·B·C 1개월 단가와 핵심 혜택 한 줄 + 연간 일시 계약 안내
    - 「A등급 월 600,000원부터 · 광고 자리 12곳 + 인스타 2건·릴스 1건 · 메타·네이버 광고 대행 수수료 무료」
    - 「B등급 월 400,000원부터 · 광고 자리 11곳 + 인스타 1건 · 네이버 광고 대행 수수료 무료」
    - 「C등급 월 250,000원부터 · 광고 자리 6곳 + 조황 업로드 2건 · 네이버 광고 대행 수수료 50%」
    - 하단 「부가세 별도 · 6개월 이상 약정하면 최대 {max_discount_rate}% 할인 · 광고비(메타·네이버에 나가는 돈)는 별도」 — 업종별 값(유어선 25, 유선 35)
    - 그 하단 연보라 박스 「1년을 한 번에 결제하면 {max_annual}%까지 할인(5% 더) · 30일 더 노출 · 선박 사진 촬영 1회 · 다음 해 같은 자리 먼저 확보」 — 업종별 최대값(유어선 30, 유선 40), 탭 동작 없는 안내
  5. 5[상담 요청]
    정의: 하단 고정 주 버튼
    - 탭 시 확인 팝업 「영업 담당자가 1영업일 안에 전화드릴게요」 [요청하기][닫기] → 상담 요청 접수 → 토스트 「상담을 요청했어요」, 버튼 「상담 요청됨」 비활성(딤 처리)
    - 직원 계정은 「대표 계정으로 요청할 수 있어요」 회색 문구로 대체
  6. 6진행 중인 작업 · 광고비 내역 줄
    정의: 단건 작업이 있거나 미수가 남은 선박에 한해 노출되는 바로가기 2줄
    - 「진행 중인 작업 N건 ›」 → SJ-96
    - 「광고비 내역 · 미수 N원 ›」 → SJ-99
    - 둘 다 없으면 영역 미노출
버튼을 누르면 생기는 일
  • [상담 요청] → 확인 팝업 → POST /ptn-m/ads/consults
  • 진행 중인 작업 줄 → SJ-96
  • 광고비 내역 줄 → SJ-99
상태(빈 값·로딩·오류·권한)
  • 확인 중·대기·입금 대기 계약이 있으면 SJ-90 계약 카드 노출 화면으로 이동(이 화면 아님)
  • 이미 상담 요청이 열려 있으면(OPEN) 버튼 「상담 요청됨」 비활성
표기 규격
항목형식예
단가월 #,##0원부터월 250,000원부터
결정 필요

D-02 · D-26

개발 메모
프론트 · 단가는 GET /ptn-m/ads/summary 응답의 price_from(1개월 값)
프론트 · 광고 카드 미리보기는 고객웹 카드 컴포넌트를 정적 데이터로 재사용
백엔드 · summary에 price_from{A,B,C}, consult_open 추가
API · GET /ptn-m/ads/summary
API · POST /ptn-m/ads/consults
SJ-91

등급 고르기

신규 · 2단계/ads/plans프로토타입에서 보기 ↗
진입 SJ-90E [등급 고르기] · SJ-94 다시 신청여기서 약정 기간 선택 후 등급별 금액·혜택·남은 자리 비교, 신청할 등급 결정다음 SJ-92(grade 넘김)

등급 비교 화면. 금액은 선박 업종(유어선·유선)에 맞춰 서버가 내려 준 값만 노출.

요소별 정의와 동작
  1. 1선박 줄
    정의: 신청 대상 선박과 업종·지역
    - 「왕감자호 · 유어선 · 인천」
    - 업종 기준 안내 ⓘ: 「최대 탑승 22명 이상이면 유선 요금이 적용돼요」
  2. 2약정 기간 칩
    정의: 1·3·6·9·12개월 중 하나
    - 디폴트 3개월
    - 변경 시 하단 세 카드 금액 변경
    - 할인이 있는 칩 하단에 작은 글씨 「최대 25%」(해당 업종 A 기준)
  3. 3등급 카드 A
    정의: A등급 금액·혜택·남은 자리
    - 「A등급」 · 「월 450,000원 (부가세 별도)」 · 할인 시 「25% 할인 · 1개월 600,000원」 취소선
    - 광고 지면 칩: 새소식 홈 · 출조 탭 · 검색 · 지도 · 선박 상세(등급별 지면 수 A 12 · B 11 · C 6)
    - 홍보 목록: 인스타 게시 월 2건 · 릴스 월 1건 · 카카오 소식 월 2칸 · 조황 업로드 월 8건 · 상품·일정 등록 대행 월 1회 · 네이버 광고 대행 수수료 무료 · 메타 광고 대행 회차마다 1건 수수료 무료 · 소개 정비 1회 · 사진 촬영 1회(6개월 이상) · 블로그 체험 후기 1건(6개월 이상)
    - 12개월 선택 시 카드 하단 「한 번에 결제하면 월 420,000원 · 30일 더 · 사진 촬영」(연간 일시 계약)
    - 남은 자리 「인천 A등급 2자리 남음」, 0이면 「자리 마감 · 대기 신청 가능」
    - [A등급 신청] → SJ-92?grade=A
  4. 4등급 카드 B·C
    정의: B·C등급 카드(구성은 A와 동일)
    - B: 광고 지면 11곳(「이번 주 함께하는 배」 제외) · 인스타 1건 · 카카오 1칸 · 조황 4건 · 상품·일정 등록 대행 1회 · 네이버 광고 대행 수수료 무료 · 메타 광고 대행 3회차마다 1건 수수료 무료 · 소개 정비 · 사진 촬영·블로그 체험 1건(12개월)
    - C: 광고 지면 6곳(남은 자리 · 검색 3곳 · 선박 상세 2곳) · 조황 2건 · 네이버 광고 대행 수수료 50% · 소개 정비
    - 자리 마감 등급의 버튼은 [대기 신청] (흰 바탕)
  5. 5본전 계산 줄
    정의: 선박 최저가로 계산한 참고 문장
    - 「1인 90,000원 상품이면 A등급은 한 달에 7석을 더 팔면 광고비만큼이에요」 = ceil(월 금액 ÷ 최저 1인 요금)
    - 최저가가 없으면 미노출
  6. 6광고 자리 예시
    정의: 화면 5곳(새소식 홈·출조 탭·검색·지도·선박 상세)의 광고 예시를 펼쳐 확인하는 아코디언 영역
    - 디폴트 접힘 「광고는 이렇게 나가요 ⌄」
    - 펼침 시 지면별 작은 그림 + 한 줄 설명 노출
  7. 7유의사항
    정의: 가격·노출 원칙
    - 가격은 모두 부가세 별도, 이 화면에 공개된 금액 그대로 청구
    - 광고 지면 노출 순서는 등급 순, 동일 등급 내에서는 무작위
    - 광고 정책·가격 변경 시 30일 전 사전 고지, 기존 계약은 종료 시까지 기존 조건 유지
    - 판매 중인 상품이 없는 날은 광고 미노출
버튼을 누르면 생기는 일
  • [A/B/C등급 신청] → SJ-92 (grade, months 전달)
  • [대기 신청] → SJ-92 (동일 화면, 완료 시 대기로 접수)
상태(빈 값·로딩·오류·권한)
  • 로딩: 카드 스켈레톤 3장
  • 선박 노출안함: 상단 경고 「선박이 숨김 상태예요. 노출로 바꾼 뒤 신청해 주세요」, 버튼 비활성
표기 규격
항목형식예
월 금액월 #,##0원 (부가세 별도)월 450,000원 (부가세 별도)
할인N% 할인25% 할인
남은 자리{지역} {등급}등급 N자리 남음인천 A등급 2자리 남음
결정 필요

D-02 · D-08

개발 메모
프론트 · plans 응답 grades[].monthly_by_months[months] 사용, 화면 계산 금지
백엔드 · remaining_slots = 3.3 판정(선택한 시작일·약정 기간의 날짜별 최댓값, 지역·전국 중 작은 값). 동일 지역·등급 대기 계약이 있으면 0으로 간주하고 is_full=true
API · GET /ptn-m/ads/plans?boat_idx=
SJ-92

광고 신청서

신규 · 2단계/ads/apply?grade=프로토타입에서 보기 ↗
진입 SJ-91 등급 버튼여기서 약정·시작일·결제 방법 선택 후 금액 확인, 신청다음 SJ-92C 확인창 → SJ-93

광고 계약 신청 입력 화면. 대표 계정만 진입 가능(직원은 안내 후 뒤로 이동).

요소별 정의와 동작
  1. 1신청 내용 요약
    정의: 선박·등급(변경 가능)
    - 「왕감자호 · A등급」 + [등급 바꾸기] → SJ-91로 복귀(입력값 미유지)
  2. 2약정 기간
    정의: 1·3·6·9·12개월 칩
    - SJ-91에서 선택한 값이 디폴트
    - 변경 시 금액 요약 즉시 갱신
  3. 3시작일
    정의: 광고 시작일
    - 달력 바텀시트에서 선택
    - 선택 가능한 첫날 = min_start_date(신청일 + 2영업일)
    - 기본값 = min_start_date
    - 안내 「운영팀 확인이 늦어지면 승인 다음 날 시작으로 바뀔 수 있어요」
  4. 4결제 방법
    정의: 광고비 결제 방법
    - (•) 정산금에서 차감 — 「매 회차 광고비를 정산금 지급 때 빼고 드려요」
    - ( ) 계좌로 입금 — 하위 선택 [매월 입금] [한 번에 입금]
    - 정산정보가 없으면 정산 차감 비활성 + 「정산정보가 없어 계좌 입금만 고를 수 있어요」 노출
    - 한 번에 입금은 약정 총액을 승인 후 7일 이내 입금
  5. 5금액 요약
    정의: 서버 계산 금액
    - 월 금액(부가세 별도) 450,000원
    - 부가세 45,000원
    - 매월 청구 금액(부가세 포함) 495,000원
    - 약정 총액(부가세 포함) 5,940,000원 — 한 번에 입금 시 이 금액 1회 청구
    - 할인으로 아낀 금액 1,800,000원(부가세 별도)
    - 종료일 「2028. 1. 4까지」
  6. 6세금계산서 이메일
    정의: 광고비 세금계산서 수신 이메일
    - 디폴트 = 제휴업체 정보 이메일
    - 형식 오류 시 「이메일 형식을 확인해 주세요」 노출
  7. 7동의
    정의: 필수 동의 2개
    - [필수] 광고 서비스 이용약관 동의 [보기] → 약관 바텀시트
    - [필수] 광고비를 정산금에서 차감하는 것에 동의 — 정산 차감 선택 시에 한해 노출
    - 전체 체크 시 신청 버튼 활성
  8. 8[신청하기]
    정의: 하단 고정 주 버튼
    - 버튼 문구 「월 495,000원으로 신청하기」(한 번에 입금 시 「5,940,000원으로 신청하기」)
    - 약정·시작일 변경으로 재조회한 plans의 is_full이 true면 버튼 「대기로 신청하기」 + 버튼 상단 안내 「지금은 자리가 없어요. 자리가 나면 순서대로 확인해요」
    - 탭 시 SJ-92C 확인 팝업 노출
    - 요청 중 비활성(중복 신청 방지)
버튼을 누르면 생기는 일
  • [신청하기] → SJ-92C [신청] → POST contracts → 201 REQ → SJ-93 / 201 WAI → SJ-93(대기) / AD4091 얼럿 「이미 같은 기간에 신청한 계약이 있어요」 / AD4221 얼럿 「시작일을 다시 골라 주세요」 → 시작일 초기화 / AD4096 없음(신청은 대기로 접수)
상태(빈 값·로딩·오류·권한)
  • 필수 미입력: 버튼 비활성
  • 직원 계정 진입: 얼럿 「대표 계정만 신청할 수 있어요」 [확인] → 뒤로 이동
  • 나가기: 입력 중 뒤로가기 → 확인 팝업 「작성 중인 신청서가 사라져요. 나갈까요?」 [계속 작성][나가기]
표기 규격
항목형식예
금액#,##0원495,000원
종료일YYYY. M. D까지2028. 1. 4까지
결정 필요

D-02 · D-15 · D-16

개발 메모
프론트 · 금액 요약은 plans.quote 값으로 표시(등급·약정·시작일·청구 방식 변경 시마다 재호출, 화면 계산 없음), SJ-93은 신청 응답(monthly_price·vat·bill_amount·end_date) 그대로 사용
프론트 · 시작일 달력은 기존 공지 기간 달력 컴포넌트 재사용
프론트 · Idempotency-Key = 신청서 진입 시 생성한 uuid
백엔드 · 신청 시 price_idx 고정, 상한 도달 시 WAI + wait_order(조회 시 계산) 반환
API · GET /ptn-m/ads/plans?grade=&months=&start_date=&billing_type= (quote — 값이 바뀔 때마다)
API · POST /ptn-m/ads/contracts
SJ-92C

신청 확인창

신규(모달) · 2단계?portal=ad-apply-confirm프로토타입에서 보기 ↗
진입 SJ-92 [신청하기]여기서 신청 조건 최종 확인다음 SJ-93 · 닫기

신청 직전 확인 모달(중앙, 폭 293). 문구는 결제 방법에 따라 변경.

요소별 정의와 동작
  1. 1제목
    정의: 「이대로 신청할까요?」(좌측 정렬)
  2. 2본문
    정의: 신청 조건 3줄
    - 「A등급 · 12개월 · 2027. 1. 5 시작」
    - 정산 차감: 「매월 495,000원(부가세 포함)을 정산금에서 차감해요」 / 계좌: 「승인되면 입금 안내를 알림톡으로 보내 드려요」
    - 「운영팀이 1영업일 안에 확인한 뒤 시작돼요」
  3. 3[신청] · [취소]
    정의: 파란 [신청] 풀폭 + 하단 텍스트 [취소]
    - [신청] → 요청 → 성공 시 SJ-93
    - [취소] → 닫기, 입력값 유지
버튼을 누르면 생기는 일
  • [신청] → POST contracts
  • [취소] → 닫기
SJ-93

신청 완료

신규 · 2단계/ads/apply/done/:id프로토타입에서 보기 ↗
진입 SJ-92C [신청] 성공여기서 신청 접수 여부 확인다음 SJ-90

신청 결과 화면. 확인 중·대기 두 가지 결과 노출.

요소별 정의와 동작
  1. 1결과 머리
    정의: 결과 아이콘과 제목
    - 확인 중: 「신청을 받았어요」 · 「운영팀이 1영업일 안에 확인하고 알림톡으로 알려 드려요」
    - 대기: 「자리 대기 1번째로 신청했어요」 · 「인천 A등급 자리가 생기면 순서대로 확인해 드려요」
  2. 2신청 요약
    정의: 계약 번호·선박·등급·기간·결제 방법·금액
    - 계약 번호 ADC-202701-0012 · 「매월 495,000원(부가세 포함) · 정산금에서 차감」
  3. 3[광고·홍보 홈으로]
    정의: 주 버튼
    - 탭 시 SJ-90 진입(뒤로가기 시 SJ-92로 이동하지 않고 SJ-90 진입)
버튼을 누르면 생기는 일
  • [광고·홍보 홈으로] → SJ-90 (히스토리 교체)
개발 메모
프론트 · history.replace로 신청서 재진입 차단
API · GET /ptn-m/ads/contracts/{id}
SJ-94

계약 상세

신규/ads/contracts/:id프로토타입에서 보기 ↗
진입 SJ-90 계약 카드 · 알림톡여기서 계약 조건·회차·청구·이력 확인 후 연장·등급 변경·해지 문의 또는 신청 취소다음 SJ-94R · SJ-95 · SJ-99

계약 1건 상세. 상태에 따라 안내문과 하단 버튼 변경.

요소별 정의와 동작
  1. 1상태 머리
    정의: 상태 칩 + 계약 번호 + 상태 안내문
    - 확인 중 「운영팀이 확인하고 있어요. 1영업일 안에 알려 드려요」
    - 대기 「자리 대기 2번째예요」
    - 입금 대기: 「1. 12(화)까지 495,000원을 입금해 주세요」 + [입금 안내 ›]
    - 집행 예정: 「1. 5(화)에 시작해요」
    - 광고 중: 「2028. 1. 4까지 광고가 나가요」(해지일 확정 시 「2. 3(수)에 해지돼요」)
    - 일시정지: 「광고비 미납으로 멈췄어요」(원인별)
    - 반려 「진행하지 못했어요 · 사유: 판매 중인 상품이 없음」
    - 종료·해지·신청 취소: 「종료된 계약이에요」
  2. 2계약 정보
    정의: 계약 조건 표
    - 선박 · 업종 · 지역 · 등급 · 약정 · 기간(프로모션 일수 포함 시 「+30일 무료」) · 월 금액(부가세 별도) · 결제 방법 · 세금계산서 이메일
  3. 3회차
    정의: 회차별 기간과 청구 상태
    - 행 = 「2회차 2. 5 ~ 3. 4」 · 청구 금액(부가세 포함) · 상태 칩(공통 청구 상태 표: 예정·미수·일부 회수·완납·취소)
    - 4회차까지 노출, 나머지는 「외 N회차」
    - 탭 → SJ-99(해당 청구 위치로 스크롤)
  4. 4성과 바로가기
    정의: 광고 중·종료 계약에 한해 노출
    - 「광고로 들어온 예약 9건 · 6.2배」 [성과 보기 ›] → SJ-95
  5. 5이력
    정의: 상태 변경 기록 최신순
    - 「1. 3(일) 14:20 승인」 「1. 2(토) 09:11 신청」 — 처리자 이름 미노출
  6. 6하단 버튼
    정의: 상태별 버튼
    - 1단계 확인 중·대기·입금 대기: 회색 문구 「취소·변경은 영업 담당자에게 요청해 주세요」
    - 1단계 집행 예정·광고 중·일시정지: [연장·변경 문의] → 고객센터 전화 연결(02-722-0365)
    - 1단계 종료·해지·반려·취소: [상담 요청] → SJ-90E와 동일한 확인 팝업
    - 2단계: [신청 취소] · [연장·등급 변경·해지 문의] → SJ-94R · [다시 신청] → SJ-91
버튼을 누르면 생기는 일
  • 1단계 [연장·변경 문의] → 전화 연결
  • 1단계 [상담 요청] → 확인 팝업 → 상담 요청 접수
  • [입금 안내] → SJ-99
  • 2단계: [신청 취소] · [문의] → SJ-94R · [다시 신청] → SJ-91
상태(빈 값·로딩·오류·권한)
  • 직원 계정: 하단 버튼 미노출
표기 규격
항목형식예
일시M. D(요일) HH:mm1. 3(일) 14:20
결정 필요

D-10

개발 메모
프론트 · 상태 → 안내문 매핑은 프론트 상수
백엔드 · history는 선주 노출 대상 이벤트만 포함(관리자 메모 제외)
API · GET /ptn-m/ads/contracts/{id}
API · POST /ptn-m/ads/contracts/{id}/cancel
SJ-94R

연장·등급 변경·해지 문의 시트

신규(시트) · 2단계?portal=ad-request프로토타입에서 보기 ↗
진입 SJ-94 [문의] · AN10 버튼(type=EXT)여기서 운영팀에 연장·등급 변경·해지 요청다음 SJ-94

바텀시트. 선주는 요청만 하고 실제 처리는 운영팀 담당.

요소별 정의와 동작
  1. 1요청 유형
    정의: 라디오 3개
    - 연장 「지금 계약이 끝난 다음 날부터 같은 등급으로 이어 가요」
    - 등급 변경 「다음 회차부터 등급을 바꿔요」 → 등급 선택 칩 A·B·C(현재 등급 제외). 일시 결제 계약이면 이 항목 미노출
    - 해지 문의 「운영팀이 전화로 정산 금액을 안내한 뒤 처리해요」
  2. 2남길 말
    정의: 선택 입력 0~300자
    - placeholder 「통화 가능한 시간 등을 적어 주세요」
  3. 3[보내기]
    정의: 주 버튼
    - 탭 시 요청 → 바텀시트 닫힘 → 토스트 「요청을 보냈어요. 운영팀이 연락드릴게요」
    - 동일 유형 처리 중이면 서버 AD4099 → 얼럿 「이미 보낸 요청을 확인하고 있어요」
버튼을 누르면 생기는 일
  • [보내기] → POST requests
결정 필요

D-10

개발 메모
백엔드 · OP01 구글챗 발송
API · POST /ptn-m/ads/contracts/{id}/requests
SJ-95

광고 성과

신규/ads/contracts/:id/stats프로토타입에서 보기 ↗
진입 SJ-90 [성과 자세히] · SJ-94 · AN11·AN15여기서 기간별 노출·클릭·예약·결제액과 광고로 들어온 예약 목록 확인다음 —

계약 1건의 광고 성과. 원천은 자체 집계, 어제까지 반영.

요소별 정의와 동작
  1. 1기간 탭
    정의: 이번 회차 · 지난 회차 · 전체 기간
    - period = cycle · prev_cycle · all(group=month)
    - 디폴트 이번 회차
    - 아래 「1. 19(화)까지 집계」
    - 전체 기간이 92일 초과 시 그래프·표를 월별로 집계
  2. 2요약
    정의: 4칸 + 배수
    - 노출 12,480회 · 클릭 612회(클릭률 4.9%) · 광고로 들어온 예약 9건 · 결제액 1,350,000원
    - 「광고비 217,741원 대비 6.2배」(광고비 = 기간 일할 공급가액: 450,000 × 15 ÷ 31)
    - 취소 건이 있으면 「취소 1건 제외」 회색 글씨 노출
  3. 3일별 그래프
    정의: 날짜별 클릭(막대)과 예약(점)
    - 가로 스크롤, 최대 92일
    - 데이터 0이면 「아직 집계된 성과가 없어요」 노출
  4. 4광고 자리별
    정의: 지면별 표
    - 행 = 화면 묶음 5개: 새소식 홈(P6·P7·P8) · 출조 탭(P1·P2·P3) · 검색(P4·P12·P13) · 지도(P14) · 선박 상세(P5·P17)
    - 열 = 노출 · 클릭 · 예약
    - 행 탭 시 해당 묶음의 지면별 줄 펼침
    - 등급 미포함 지면은 줄 미노출
  5. 5광고로 들어온 예약
    정의: 귀속된 예약 목록 20건 단위 노출
    - 행 = 「1. 14(목) 결제 · 김*수 · 2명 · 180,000원 · 검색」
    - 취소된 예약은 회색 + 「취소」 칩 표시
    - [더 보기]
  6. 6다음 달로 넘어간 작업
    정의: 회사 사정으로 이월된 이용권
    - 해당 시에 한해 노출: 「인스타그램 게시 1건이 다음 회차로 넘어갔어요」
  7. 7집계 기준
    정의: 지표 정의 안내(접힘)
    - 노출: 광고 영역이 화면에 절반 이상, 1초 초과 노출된 경우 한 번으로 집계
    - 광고로 들어온 예약: 광고를 탭한 고객이 7일 이내 결제한 예약
    - 결제액: 쿠폰 할인 적용 후 실제 결제 금액
    - 취소된 예약은 집계에서 제외
버튼을 누르면 생기는 일
  • [더 보기] → 다음 20건
상태(빈 값·로딩·오류·권한)
  • 집행 전 계약: 「광고가 시작되면 성과가 여기에 보여요」
표기 규격
항목형식예
클릭률N.N%4.9%
예약자성*이름김*수
결정 필요

D-17

개발 메모
프론트 · 그래프는 기존 차트 라이브러리가 없으면 막대 div로 구현
백엔드 · period=cycle·prev_cycle·all·custom, group=day는 최대 92일, 전체 기간은 group=month, 회차 기간은 서버 계산
API · GET /ptn-m/ads/contracts/{id}/stats?period=cycle|prev_cycle|all|custom&group=day|placement|month (전체 기간 = all + month)
API · GET /ptn-m/ads/contracts/{id}/conversions
SJ-96

홍보 맡기기 — 작업 목록

신규/ads/orders프로토타입에서 보기 ↗
진입 SJ-90 [전체 보기] · AN05여기서 맡긴 작업의 진행 상태 확인 후 할 일이 있는 작업으로 진입다음 SJ-97 · SJ-98

선박 1척의 홍보·운영 작업 목록.

요소별 정의와 동작
  1. 1남은 이용권
    정의: 이번 회차 남은 등급 이용권 칩
    - 칩 = 「인스타 게시 1」「릴스 1」「카카오 소식 1」「조황 업로드 5」
    - 칩 탭 → SJ-90과 동일한 확인 팝업 → 작업 생성
    - 등급 계약이 없으면 영역 미노출
  2. 2탭
    정의: 진행 중 N · 완료 N
    - 진행 중 = 접수·자료 요청·제작 중·선주 확인·게시 준비
    - 완료 = 완료·취소
  3. 3작업 카드
    정의: 작업 1건
    - 작업명 · 출처 칩(「이용권」 회색 / 「단건 50,000원」 회색)
    - 상태 칩: 접수됨(회색) · 자료를 올려 주세요(빨강) · 만드는 중(파랑) · 확인해 주세요(빨강) · 게시 준비 중(파랑) · 완료(초록) · 취소됨(회색)
    - 보류: 정산 차감 단건 미수 21일 경과 시 상태 칩 옆 「광고비 확인 필요」(빨강 글자)
    - 하단 줄: 자료 요청 「1. 12(화)까지 자료를 올려 주세요」 / 선주 확인 「1. 8(금) 14:30까지 확인해 주세요」 / 사진 촬영 「촬영일 1. 15(금)」
    - 카드 탭 → SJ-97
  4. 4[홍보 상품 더 보기]
    정의: 하단 보조 버튼
    - 2단계 오픈(1단계 미노출) → SJ-98
버튼을 누르면 생기는 일
  • 작업 카드 → SJ-97
  • 칩 → 확인 팝업 → POST service-orders
  • [홍보 상품 더 보기] → SJ-98
상태(빈 값·로딩·오류·권한)
  • 빈 상태: 「맡긴 작업이 없어요」(1단계는 [홍보 상품 보기] 미노출, 2단계 오픈)
결정 필요

D-11

개발 메모
백엔드 · 목록 정렬: 선주 할 일(MAT·REV) → 기한 가까운 순
API · GET /ptn-m/ads/service-orders
SJ-97

작업 상세 — 자료 올리기·결과 확인

신규/ads/orders/:id프로토타입에서 보기 ↗
진입 SJ-96 카드 · AN12·AN13·AN14여기서 자료 업로드, 결과물 확인 후 승인 또는 수정 요청다음 SJ-97R · SJ-96

작업 1건 상세. 상태에 따라 중앙 영역(자료 올리기 / 결과 확인 / 완료) 변경.

요소별 정의와 동작
  1. 1진행 단계
    정의: 상품별 단계 막대(최대 접수 → 자료 → 제작 → 확인 → 게시 준비 → 완료)
    - 상품별 단계는 4.1 표 기준(자료 요청·선주 확인이 없는 상품은 해당 칸 미노출)
    - 현재 단계 파랑, 지난 단계 연파랑
    - 취소 시 막대 대신 「취소됨 · 자료가 기한 안에 오지 않았어요」(사유별 문구) 노출
  2. 2작업 정보
    정의: 작업명·출처·신청일·예정일
    - 「인스타그램 게시 · 이용권 · 1. 5(화) 신청」
    - 결과 예정 「자료를 받고 5영업일 안」
    - 사진 촬영은 「촬영일 1. 15(금) 10:00 · 장소 인천 연안부두」
  3. 3자료 올리기
    정의: 자료 요청 상태에서만 노출되는 입력 영역
    - 운영팀 요청 문구 박스 「선상 사진 3~5장과 이번 달 주력 어종을 알려 주세요」
    - 사진 추가(최대 20장, 장당 20MB, jpg·png·heic) · 영상 추가(1개, 300MB, mp4·mov)
    - 파일별 진행률 막대, 실패 시 「다시 올리기」 노출
    - 메모 0~500자
    - [자료 보내기] — 파일 1개 이상 또는 메모 1자 이상이면 활성
    - 업로드 중 뒤로가기 → 확인 팝업 「올리는 중인 자료가 있어요. 나갈까요?」
  4. 4결과 확인
    정의: 선주 확인 상태에서 노출되는 결과물
    - 이미지 캐러셀 또는 영상, 게시 문구 미리보기(첫 줄 「광고」 강조)
    - 안내 「SNS 게시물 첫 줄에는 법에 따라 '광고' 표시가 들어가요」
    - 기한 「1. 8(금) 14:30까지 답이 없으면 그대로 진행해요」(review_due_at)
  5. 5확인 버튼
    정의: 선주 확인 상태의 두 버튼
    - [수정 요청] → SJ-97R (이미 1번 요청한 경우 비활성 + 「수정 요청은 1번만 할 수 있어요」)
    - [이대로 올려 주세요] → 확인 팝업(「이대로 진행할까요?」 · 풀폭 [진행] · 텍스트 [취소]) → 토스트 「진행을 요청했어요」 → 상태 「게시 준비 중」(운영자 게시 후 완료 처리)
  6. 6완료 결과
    정의: 게시 준비·완료 상태의 안내와 결과 링크
    - 게시 준비: 「운영팀이 게시하고 있어요」(카카오 소식은 「1. 28(목) 10시에 발송돼요」)
    - 완료: [게시물 보기] 외부 링크 / 조황은 [조황관리에서 보기] → SJ-40
    - 메타 광고 대행: 집행 금액 · 노출 · 클릭 · 선박 상세 방문 표 (운영자 입력값, 「메타 광고 관리자 기준」)
버튼을 누르면 생기는 일
  • [자료 보내기] → 서명 URL 업로드 → POST materials → 토스트 「자료를 보냈어요」 → 상태 제작 중으로 변경
  • [이대로 올려 주세요] → POST approve
  • [수정 요청] → SJ-97R
상태(빈 값·로딩·오류·권한)
  • 직원 계정: 자료 올리기만 가능, 확인 버튼 미노출
  • 오류: 업로드 실패 파일에 한해 빨간 테두리 표시
표기 규격
항목형식예
기한M. D(요일) HH:mm까지1. 8(금) 14:30까지
개발 메모
프론트 · 파일별 POST upload-urls → PUT 서명 URL → 모두 끝나면 POST materials
프론트 · heic는 서버 변환 방식이므로 미리보기는 업로드 후 썸네일 URL로 표시
백엔드 · materials 저장 시 MAT→WIP, OP02 발송
API · GET /ptn-m/ads/service-orders/{id}
API · POST upload-urls
API · POST materials
API · POST approve
SJ-97R

수정 요청 시트

신규(시트)?portal=ad-revision프로토타입에서 보기 ↗
진입 SJ-97 [수정 요청]여기서 수정 요청 내용 작성 후 전송다음 SJ-97

바텀시트. 수정 요청은 작업별 무료 1회.

요소별 정의와 동작
  1. 1입력
    정의: 「무엇을 고칠까요?」 10~500자
    - 10자 미만 시 버튼 비활성 + 「10자 이상 적어 주세요」 노출
    - 안내 「수정 요청은 1번 할 수 있어요」
  2. 2[보내기]
    정의: 주 버튼
    - → 바텀시트 닫힘 → 토스트 「수정을 요청했어요」 → 상태 만드는 중으로 변경
    - AD4095 → 얼럿 「수정 요청은 1번만 할 수 있어요」
버튼을 누르면 생기는 일
  • [보내기] → POST revision
개발 메모
백엔드 · OP02 발송, review_due_at 초기화
API · POST /ptn-m/ads/service-orders/{id}/revision
SJ-98

홍보 상품 신청

신규 · 2단계/ads/shop프로토타입에서 보기 ↗
진입 SJ-90 배너 · SJ-90E · SJ-96여기서 등급 없이도 홍보·운영 작업을 건별로 의뢰다음 SJ-97

단건 홍보·운영 상품 목록과 신청 바텀시트. 가격 전체 공개.

요소별 정의와 동작
  1. 1상품 목록
    정의: SNS 홍보 · 광고 대행 · 운영 지원 세 묶음 카드
    - 카드 = 상품명 · 한 줄 설명 · 「50,000원 (부가세 별도)」 · 소요 「자료 받은 뒤 5영업일」
    - 이번 회차 남은 이용권이 있으면 「이용권 1건 있음」 칩 노출(탭 시 이용권으로 맡기기)
    - 월 처리 마감 시 카드 딤 처리 + 「이번 달 접수 마감」
    - 유튜브 체험 영상은 「상담 후 견적」 노출
    - 광고 대행 묶음 = 메타 광고 집행 대행(S4) · 네이버 키워드광고 대행(S7, 「월 광고비 + 수수료 15%」), 운영 지원 묶음에 상품·출조 일정 등록 대행(O4, 30,000원)
    - 계약 등급 혜택이 있으면 카드에 「A등급 수수료 무료」 칩 노출
  2. 2신청 시트
    정의: 카드 탭 시 바텀시트
    - 요청 사항 0~500자
    - 메타 광고 대행: 광고 예산(300,000원 이상, 10,000원 단위) · 기간(7~30일, 시작일 2영업일 뒤부터) → 금액 = 예산 + 수수료 15%
    - 네이버 키워드광고 대행: 월 광고비(200,000원 이상, 10,000원 단위) · 원하는 키워드(선택) → 금액 = 광고비 + 수수료 15%(최소 30,000원), 등급 혜택(A·B 무료, C 50%) 반영 · 안내 「키워드와 광고 문구는 집행 전에 확인을 받아요. 다른 업체 이름은 키워드로 쓰지 않아요」
    - 결제 방법(정산 차감 / 계좌 입금, 정산정보 없으면 계좌만 선택 가능)
    - 금액 요약(부가세 포함)
    - 메타·네이버 광고 대행은 계좌 입금만 가능(정산 차감 비활성 + 「광고비를 먼저 쓰는 상품이라 계좌로만 받아요」)
    - [신청하기] → 확인 팝업(「인스타그램 게시, 이대로 맡길까요?」 · 본문 정산 차감 「50,000원(부가세 별도) · 운영팀이 작업을 시작할 때 청구돼요」 / 계좌 입금 「55,000원(부가세 포함) · 신청하면 바로 청구돼요. 7일 안에 입금해 주세요」) → POST → SJ-97
  3. 3상담 신청(유튜브)
    정의: 상담 신청 바텀시트
    - 연락 가능한 시간(2~50자) · 원하는 내용(0~500자)
    - [상담 신청] → POST consults → 토스트 「상담을 신청했어요. 운영팀이 연락드릴게요」
버튼을 누르면 생기는 일
  • [신청하기] → POST service-orders source=B
  • AD4093 → 얼럿 「이번 달 접수가 마감됐어요. 다음 달 1일부터 신청할 수 있어요」
상태(빈 값·로딩·오류·권한)
  • 직원 계정: [신청하기] 미노출
표기 규격
항목형식예
가격#,##0원 (부가세 별도)50,000원 (부가세 별도)
결정 필요

D-12 · D-13 · D-21

개발 메모
백엔드 · 단건 청구: 정산 차감은 운영자가 작업을 시작할 때, 계좌 입금은 신청 즉시(기한 7일, 미입금 시 168시간 뒤 작업·청구 취소 AN20)
API · GET /ptn-m/ads/service-items
API · POST /ptn-m/ads/service-orders
API · POST /ptn-m/ads/consults
SJ-99

광고비 내역

신규/ads/invoices프로토타입에서 보기 ↗
진입 SJ-90 · SJ-30 · AN04·AN06~08·AN19여기서 청구·차감·입금 내역과 미수, 입금 계좌 확인다음 —

선박 1척의 광고비 청구 원장. 모든 금액은 부가세 포함 기준으로 노출.

요소별 정의와 동작
  1. 1미수 요약
    정의: 현재 남은 미수와 다음 청구
    - 「미수 660,000원」(0이면 「미수 없음」 초록)
    - 「다음 청구 2. 5(금) · 495,000원」
    - 미수가 있으면 [계좌로 입금하기 ⌄] 펼침: 은행·계좌번호·예금주 「주식회사 어바웃피싱」·입금자명 「왕감자호0012」(선박명+계약번호 끝 4자리) + [계좌번호 복사] → 토스트 「계좌번호를 복사했어요」
  2. 2필터
    정의: 전체 · 미수 · 완납
    - 디폴트 전체
  3. 3환급 줄
    정의: 해지·입금 확인 시 발생한 환급
    - 청구 카드 하단 「환급 154,356원 (부가세 포함) · 다음 지급 때」(대기, 다음 지급 때) / 「환급 154,356원 (부가세 포함) · 계좌로 보낼 예정」(대기, 계좌) / 「환급 154,356원 (부가세 포함) · 1. 31 지급에 포함」(적용, payout_date) / 「환급 154,356원 (부가세 포함) · 계좌로 2. 3 보냄」(완료)
    - 환급 줄은 응답 invoice_idx의 청구 카드 하단, 없으면 목록 최상단
    - 응답 refunds[]의 total(부가세 포함)
  4. 4청구 카드
    정의: 청구 1건
    - 제목 「A등급 2회차」 / 「인스타그램 게시」 / 「해지 정산」
    - 청구일 · 기한 · 금액 「495,000원 (부가세 포함)」 · 상태 칩(공통 청구 상태 표)
    - 아래 줄: 「1. 10 정산금에서 −300,000원」 「1. 17 정산금에서 −195,000원」 「1. 12 입금 495,000원」
    - 세금계산서 「1. 6(수) 발행」 또는 「발행 전」
버튼을 누르면 생기는 일
  • [계좌번호 복사] → 클립보드 → 토스트
상태(빈 값·로딩·오류·권한)
  • 빈 상태: 「광고비 내역이 없어요」
표기 규격
항목형식예
금액#,##0원 (부가세 포함)495,000원 (부가세 포함)
결정 필요

D-09 · D-18

개발 메모
백엔드 · 입금자명 규칙 = 선박명 + 계약번호 끝 4자리, 응답 bank.depositor_rule
API · GET /ptn-m/ads/invoices

고객웹

CW-01

새소식 홈 — 선장님 조황 소식·다음 출조·이 바다로 나가는 배

변경/프로토타입에서 보기 ↗
진입 하단 탭 [새소식] · 앱 첫 화면여기서 바로가기 하단 조황 카드, D-day 슬롯 배너, 디자이너 제작 AD 배너 지면에서 광고 선박 노출다음 CW-30 · CW-60 · CW-58

8월통합 새소식 홈 구성 유지. 광고는 디자이너 제작 컴포넌트만 사용. 바로가기 하단 「실시간 조황」과 동일한 조황 카드 모듈(P8), D-day 카드 슬롯에 Card/Horizontal-banner 배너(P7), 이벤트 상단 기존 AD 배너 지면에 동일 배너(P6). 광고 표시는 AD 표시(AD-mark) 컴포넌트 사용.

요소별 정의와 동작
  1. 1P8 선장님 조황 소식
    정의: 바로가기 하단 신규 모듈. 출조 홈 「실시간 조황」과 동일한 Card/Catch 2열(사진 177×177)
    - 모듈 제목 「선장님 조황 소식」(16 Bold)
    - 앞 3장 = 최근 72시간 내 조황 등록한 A·B 광고 선박. 카드 = 조황 사진 · 어종 + 우측 AD 표시 · 「인천 중구 3시간 전」 · 선박 아바타 22 + 선박명
    - 이후 = 최근 24시간 일반 조황 카드(AD 미노출), 앞 3장 선박 제외 후 최신순 정렬
    - 카드 탭 시 CW-60 선장님 조황 보기 진입, AD 표시 탭 시 CW-58 진입
    - 광고 조황 선박 0척 시 모듈 전체 미노출
    - 노출 위치는 전시관리 섹션 018 노출 순서 기준(디폴트(기본값) = 바로가기 바로 하단)
  2. 2P7 다음 출조, 이 배는 어때요?
    정의: D-day 카드 슬롯에 Card/Horizontal-banner Box(361×96) 1장
    - 조건: 로그인 · 예정 예약 0건 · 지난 예약 1건 이상 · 맞춤 광고 켬
    - 마지막 결제 예약(취소 제외)과 어종 하나 이상 일치 + 동일 지역인 A·B 광고 선박 중, 등급 순 기준 향후 14일 내 예약 가능한 첫 선박의 가장 이른 상품
    - 배너 = 사진 68 · 제목 두 줄 「지난번 주꾸미, / 이번엔 드래곤호에서」(16 SemiBold) · 보조 줄 「1월 21일(목) 잔여 2석 ›」(12.5 Medium) · 우측 하단 AD 표시
    - 배너 탭 시 선박 상세 + 해당 날짜로 진입
    - 예정 예약 존재 시 기존 D-day 카드 노출
    - 맞춤 광고 꺼짐 시 미노출
  3. 3P6 이 바다로 나가는 배
    정의: 디자이너 제작 새소식 AD 배너 지면(이벤트 상단)의 Card/Horizontal-banner Box
    - 날씨 카드 장소(예: 영흥도) → 지역(9지역)의 A·B 광고 선박 1척(등급 순 기준 조건 충족 첫 선박)
    - 향후 5일 중 지역 예보 일 최대 파고 1.5m 이하이면서 예약 가능한 날 중 파고 최저일(동일 시 이른 날)
    - 배너 = 제목 두 줄 「1. 22(금) 파고 0.5m, / 영흥도 진두항 바다로 나가요」 · 보조 줄 「인천 황금어장호 ›」 · AD 표시
    - 파고 1.5m 초과일만 있는 경우 해당 지면 미노출(빈 영역 처리)
    - 날씨 카드 장소 변경 시 재선정
    - 탭 시 선박 상세 + 해당 날짜로 진입
  4. 4그대로 두는 것
    정의: 롤링 배너 · 바로가기 · D-day · 날씨 카드 · 팔로잉 활동 · 이벤트 · 자사 배너(「어바웃피싱 예약이 처음이시라면!」)
    - 화면 내 광고 모듈 최대 3개(P6·P7·P8)
    - 모달·플로팅 광고 미운영
버튼을 누르면 생기는 일
  • P8 카드 → CW-60(?catch={catch_idx})
  • P7 배너 → ?boat={id}&resDt=YYYY-MM-DD
  • P6 배너 → ?boat={id}&resDt=YYYY-MM-DD
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 서빙 API 실패: P8 모듈 미노출, P7은 기존 D-day 슬롯 규칙 적용, P6 지면 미노출
  • 비로그인: P7 미노출, P6·P8은 노출
  • 관심장소 미설정: 날씨 카드 디폴트 장소(현행) 기준 P6 노출
표기 규격
항목형식예
P6 제목M. D(요일) 파고 N.Nm, / 항구 바다로 나가요1. 22(금) 파고 0.5m, / 영흥도 진두항 바다로 나가요
P7 제목지난번 어종, / 이번엔 선박명에서지난번 주꾸미, / 이번엔 드래곤호에서
배너 보조 줄M월 D일(요일) 잔여 N석 · 지역 선박명1월 21일(목) 잔여 2석
결정 필요

D-27 · D-28 · D-36

개발 메모
프론트 · 홈 진입 시 placements=P6·P7·P8을 일괄 요청, 화면 렌더링 대기 없음
프론트 · P6는 날씨 카드 장소의 place_code만 전달(파고는 서버에서 지역 예보 기준 계산), 민물 장소인 경우 P6를 제외하고 요청
프론트 · 배너는 Card/Horizontal-banner(Box), 조황 카드는 Card/Catch, 광고 표시는 AD-mark 컴포넌트 그대로 사용
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · P7: 회원 마지막 예약(상품 어종·선박 지역) 조회, 맞춤 광고 꺼짐 시 items [] 반환
백엔드 · P8: ad_boat_context.last_catch_at 기준 72시간 판정, 일반 카드는 기존 조황 피드 API 사용(앞 3장 선박 제외)
백엔드 · 배너 문구(title·sub)는 서버에서 완성 문구로 전달
API · POST /usr/ads/slots (placements=P6·P7·P8)
API · POST /usr/ads/events
CW-50

출조 탭 — 이번 주 함께하는 배·남은 자리·내일 새벽 출항

변경/booking프로토타입에서 보기 ↗
진입 하단 탭 [출조]여기서 출조 홈 「인기 선박 모음」과 동일 형태의 광고 모듈 3개에서 광고 선박 노출다음 CW-30 · CW-51 · CW-58

8월통합 출조 홈 구성 유지. 광고 섹션 유형 015·016·017이 P1·P2·P3을 렌더링. 세 모듈 모두 「인기 선박 모음」 모듈 그대로 복제(제목 16 Bold · 텍스트 탭 14.5 · Card/Ship/Common · [더보기]). 차이점은 제목 우측 AD 표시 하나.

요소별 정의와 동작
  1. 1P1 이번 주 함께하는 배
    정의: 지역 탭 + Card/Ship/Common 177 가로 스크롤 + [더보기]
    - 제목 = 전시관리 입력값(디폴트(기본값) 「이번 주 함께하는 배」) + 우측 AD 표시
    - 지역 탭: A 계약 선박 보유 지역에 한함. 위치 동의 시 가까운 지역 우선, 맞춤 광고 켬 + 로그인인 경우 최근 1년 예약 지역 최상단 정렬
    - 카드 = 「인기 선박 모음」 카드와 동일(사진 · 선박명 · 지역 거리 · 가격 · 어종 배지 · 할인쿠폰)
    - 카드 탭 → 선박 상세
  2. 2P2 이번 주 남은 자리
    정의: 날짜 탭 + Card/Ship/Common 177(상품 줄 켬) + [더보기]
    - 날짜 탭 「1월 21일(목)」… 내일부터 5일, 선박 없는 날짜 탭은 미노출
    - 카드 = Card/Ship/Common의 상품 줄 「주꾸미 종일 1부 · 6물」 + Badge/Seats left 「잔여 3석」. 물때는 위치 동의 시 가까운 지역 표기법(부록 B) 적용, 미동의 시 물때 제외
    - 상품 = 당일 잔여 1~5석 상품 중 출항 시각 가장 이른 상품
    - 카드 탭 → 선박 상세 + 해당 날짜
    - 전체 날짜 공란 시 모듈 미노출
  3. 3P3 내일 새벽 출항
    정의: 날짜 탭 1개(내일) + Card/List(사진 114) 세로 목록, 최대 4 + [더보기]
    - 제목 「내일 새벽 출항」 + AD 표시, 탭 「1월 21일(목)」
    - 행 = Card/List: 선박명 · 지역 거리 · 가격 · 상품 줄 「04:30 출항 주꾸미 종일 1부」 + 「잔여 3석」 · 어종 배지
    - A·B 광고 선박 중 내일 출항 상품 보유 선박, 출항 시각순 정렬
    - 3척 미만 시 모듈 미노출, 5척 이상 시 [더보기] 노출
    - 행 탭 → 선박 상세 + 내일 날짜
    - 「출항 확정」 표시는 2단계(D-29) 적용
버튼을 누르면 생기는 일
  • P1 카드 탭 → ?boat={id}
  • P2 카드 탭 → ?boat={id}&resDt=YYYY-MM-DD
  • P3 행 탭 → ?boat={id}&resDt=내일
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 서빙 API 1초 초과·오류·빈 응답: 섹션 제목 포함 미노출
  • 로딩: 섹션 높이만큼 스켈레톤 노출(1초까지)
  • 동일 선박 두 번 노출 시 P3에서 제외 후 다음 후보로 대체(3.1, 단일 요청 내 노출 순서 기준)
표기 규격
항목형식예
남은 좌석잔여 N석잔여 3석
날짜 탭M월 D일(요일)1월 22일(금)
P2 상품 줄상품명 · N물주꾸미 종일 1부 · 6물
P3 상품 줄HH:mm 출항 상품명04:30 출항 주꾸미 종일 1부
결정 필요

D-05 · D-20 · D-27 · D-29 · D-30 · D-33 · D-36

개발 메모
프론트 · display-v2 섹션 코드 015/016/017 → 광고 모듈 매핑, 화면에서 전시 순서대로 placements 일괄 요청 후 모듈별 분배
프론트 · 모듈은 「인기 선박 모음」 컴포넌트 재사용, 헤더에 AD-mark만 추가
프론트 · 카드는 Card/Ship/Common(상품 줄 켬/끔) · Card/List 그대로 사용
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · display-v2는 섹션 메타(제목·순서)만 담당, 콘텐츠는 서빙 API 제공
백엔드 · P2 groups[{key:날짜, label, tide, items}] · P1 groups[{key:지역, items}]
백엔드 · 물때 = 날짜 → 음력 → 지역 표기법 표 기준 변환
API · POST /usr/ads/slots (placements=P1·P2·P3)
API · POST /usr/ads/events
CW-27

통합검색 — 지금 예약 열린 배

변경검색 오버레이프로토타입에서 보기 ↗
진입 헤더 검색 · 출조 탭 검색 박스여기서 검색어 입력 전 첫 화면 최하단 디자이너 AD 배너 지면에서 광고 선박 노출다음 CW-30 · CW-51 · CW-58

8월통합 통합검색 첫 화면 구성 유지. 디자이너 제작 통합검색 AD 배너 지면(「지금 인기있는 선박」 하단)에 Card/Horizontal-banner Box 1장 추가. 검색어 입력 시작 시 미노출.

요소별 정의와 동작
  1. 1P12 지금 예약 열린 배
    정의: Card/Horizontal-banner Box 361×96, 1장
    - 배너 = 사진 68 · 제목 두 줄 「지금 예약 열린 배, / 1. 21(목) 3석 남았어요」 · 보조 줄 「인천 왕감자호 ›」 · AD 표시
    - 위치 동의 시 가까운 지역, 미동의 시 전국의 A·B·C 광고 선박(내일부터 14일 내 예약 가능) 중 등급 순 첫 선박
    - 배너 탭 → 선박 상세 + 해당 날짜
  2. 2그대로 두는 것
    정의: 최근 검색어 · 실시간 검색순위 · 검색 전시 섹션 · 지금 인기있는 선박(정렬 탭)
    - 「지금 인기있는 선박」 목록·정렬은 광고와 무관
    - 광고 선박의 「인기」 목록 추가·제외 없음
버튼을 누르면 생기는 일
  • 배너 탭 → ?boat={id}&resDt=
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 검색어 입력 시작 → 배너 미노출(자동완성 화면 광고 미노출)
  • 서빙 API 실패: 배너 지면 미노출
표기 규격
항목형식예
P12 제목지금 예약 열린 배, / M. D(요일) N석 남았어요지금 예약 열린 배, / 1. 21(목) 3석 남았어요
결정 필요

D-27 · D-36

개발 메모
프론트 · 오버레이 오픈 시 1회 호출, 재오픈 시 동일 세션 순서 유지
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · 위치 정보 없는 경우 전국 후보 대상 등급 → 해시 순 선정
API · POST /usr/ads/slots (placements=P12)
CW-51

선박 검색 결과 — 이 조건으로 나가는 배·하루만 옮기면

변경/booking/search/result프로토타입에서 보기 ↗
진입 출조 탭 검색 · 통합검색 · CW-59 [이날 출항하는 배 모두 보기]여기서 목록 상단 [광고]추천리스트, 결과 적은 경우 날짜를 하루 이동한 광고 선박 노출다음 CW-30 · CW-58

8월통합 검색결과 화면. 일반 결과는 기존 검색 API 그대로 사용, 광고로 인한 개수·순서 변경 없음. 광고는 디자이너 제작 [광고]추천리스트 컴포넌트 그대로 사용(회색 박스 · 키워드 헤더 줄 · AD 표시 · 검색결과 카드 · 「예약 가능 상품 N건」).

요소별 정의와 동작
  1. 1결과 수
    정의: 「17건의 검색 결과」
    - 일반 결과 수만 집계(광고 박스 제외)
    - 정렬(가까운순 등)은 일반 목록에만 적용
  2. 2P4 이 조건으로 나가는 배
    정의: 목록 상단 [광고]추천리스트, 최대 3박스
    - 박스 = 배경 #F8F8F8 · 모서리 4 · 헤더 줄 키워드 3개 「주꾸미 | 연안부두 | 1. 22(금) 5석」(14 SemiBold, 구분 세로선) + 우측 AD 표시
    - 카드 = 기존 검색결과 카드(선박명 17 · 지역 거리 · 가격 · 어종 태그 · 할인쿠폰 · 사진 98)
    - 하단 「예약 가능 상품 N건 ⌄」 → 펼침 시 당일 상품 줄 노출
    - 검색 조건(검색어·날짜·인원·지역·어종) 충족 A·B·C 광고 선박, 등급 순 → 세션 해시 정렬
    - 광고 선박도 일반 목록 내 기존 위치에 그대로 노출(AD 미노출)
    - 검색 응답 수신 후 P4 응답 최대 300ms 추가 대기 후 함께 렌더링. 이후 수신된 P4 응답은 폐기
  3. 3일반 결과
    정의: 기존 검색결과 목록
    - 변경 없음
  4. 4P13 하루만 옮기면
    정의: 날짜 지정 검색에서 일반 결과 5건 미만인 경우에 한함, 결과 하단에 동일 [광고]추천리스트 박스 최대 2
    - 헤더 줄 「하루만 옮기면 | 1. 23(토) 4석 | 문어」 + AD 표시
    - 동일 검색어·지역·어종·인원 기준 다음 날(D+1) 우선, 없으면 전날(D−1, 내일 이전이면 제외) 예약 가능한 A·B·C 광고 선박, 선박당 날짜 하나
    - 카드 탭 → 선박 상세 + 이동한 날짜
    - 일반 결과 5건 이상 또는 날짜 미지정 검색 시 미노출
버튼을 누르면 생기는 일
  • P4 박스 탭 → ?boat={id}(날짜 검색이면 &resDt)
  • 「예약 가능 상품 N건」 → 박스 내 펼침
  • P13 박스 탭 → ?boat={id}&resDt=옮긴 날짜
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 서빙 API 실패: 박스만 미노출, 일반 결과 유지
  • 광고 선박 0: 기존 화면과 동일
  • 2페이지 이후: 광고 미노출
표기 규격
항목형식예
결과 수N건의 검색 결과17건의 검색 결과
머리 줄어종 | 항구 | M. D(요일) N석주꾸미 | 연안부두 | 1. 22(금) 5석
P13 머리 줄하루만 옮기면 | M. D(요일) N석 | 어종하루만 옮기면 | 1. 23(토) 4석 | 문어
결정 필요

D-03 · D-36

개발 메모
프론트 · 검색 API와 서빙 API(P4) 병렬 호출, 일반 결과 수 5 미만 + 날짜 지정 시 P13 추가 호출
프론트 · [광고]추천리스트 컴포넌트 재사용, 헤더 키워드는 서버 reason_keys 사용
프론트 · 검색 조건 변경 시 page_key 신규 발급
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · 검색 조건 해석 함수는 검색 API와 공유, 서빙 API는 조건 통과 광고 선박만 선택
백엔드 · 슬롯별 reason_keys[3](어종·항구·날짜 잔여석) 및 예약 가능 상품 수 전달
API · 기존 선박 검색 API(변경 없음)
API · POST /usr/ads/slots (placements=P4)
API · 일반 결과 5건 미만이고 날짜가 있으면 POST /usr/ads/slots (placements=P13) — 2번 제한은 따로 센다
CW-40

탐색 지도 — 사진 마커

변경/map?layer=boat프로토타입에서 보기 ↗
진입 하단 탭 [탐색] → 레이어 [선박]여기서 지도 내 광고 선박 항구에 AD가 붙은 사진 마커 노출, 탭 시 「선박 정보」 바텀시트 노출다음 CW-30 · CW-58

8월통합 탐색 지도 선박 레이어에 광고 선박 사진 마커(P14) 추가. 마커는 기존 지도 마커와 동일한 흰색 알약 형태, 탭 시 기존 「선박 정보」 바텀시트(Card/List 줄) 오픈.

요소별 정의와 동작
  1. 1P14 사진 마커
    정의: 흰색 알약 마커 높이 28: 선박 사진 원 22 · 선박명 11 Bold · 「+N」 · AD 표시
    - 지도 화면(bbox) 내 A·B 광고 선박 항구에 최대 3개
    - 마커 위치 = 선박 항구 좌표, 동일 항구 광고 선박 복수인 경우 마커 1개에 「+1」 표기
    - 노출 집계는 마커 노출 시 대표 선박 1건, 나머지는 시트 행 노출 시
    - 지도 이동·확대 시 재선정(500ms 정지 후)
    - 기존 항구 마커와 겹치는 경우 사진 마커 상단 배치
  2. 2선박 정보 시트
    정의: 마커 탭 시 노출되는 기존 「선박 정보」 바텀시트
    - 헤더 「선박 정보」 18 Bold + AD 표시 + ×
    - 행 = Card/List 그대로(사진 114 · 선박명 · 지역 거리 · 가격 · 상품 줄 + 잔여석 · 어종 배지 · 할인쿠폰), 해당 항구 광고 선박 전체 노출
    - 행 탭 → 선박 상세
    - × 또는 지도 빈 영역 탭 → 바텀시트 닫힘
  3. 3그대로 두는 것
    정의: 레이어 칩(포인트·선박·조황·CCTV·낚시용품점) · 기존 항구 마커 · 하단 탭
    - 타 레이어에는 사진 마커 미노출
    - CCTV·물때·날씨 화면 가림 없음
버튼을 누르면 생기는 일
  • 마커 탭 → 선박 정보 바텀시트
  • 시트 행 탭 → ?boat={id}
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 서빙 API 실패: 마커만 미노출
  • 항구 좌표 없는 선박 제외
표기 규격
항목형식예
묶음 표시+N+1
결정 필요

D-27 · D-36

개발 메모
프론트 · 네이버 지도 커스텀 오버레이 마커, idle 이벤트 500ms 디바운스 후 bbox 재요청
프론트 · 마커 노출 = 마커 전체가 지도 내 1초 유지, 클릭 = 시트 행 탭
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · bbox 내 항구 좌표 필터 → 등급 → 해시 순 선정
API · POST /usr/ads/slots (placements=P14)
CW-30

선박 상세 — 마감일 다른 배·같은 항구에서 나가는 배

변경?boat={id}프로토타입에서 보기 ↗
진입 선박 카드 · 모든 광고(&resDt)여기서 선택 날짜 마감 시 배너로 동일 날짜 출항 타 선박 연결, 하단에서 동일 항구 광고 선박 연결다음 CW-59 · CW-30(다른 선박) · CW-58

8월통합 선박 상세 구성 유지. 광고 지면 두 곳 추가. 예약 달력에서 전 상품 마감 날짜 선택 시 날짜 헤더 하단 Card/Horizontal-banner 배너(P17 → CW-59), 상품 목록 하단 선박상세 모듈(「최신 조황」과 동일 헤더) 「같은 항구에서 나가는 배」(P5). 「이런 곳은 어때요?」는 변경 없음.

요소별 정의와 동작
  1. 1예약 달력 날짜 선택
    정의: resDt(YYYY-MM-DD)로 진입한 경우의 달력
    - 해당 날짜 선택 상태로 달력 오픈, 당일 상품 카드까지 스크롤
    - 전 상품 마감 날짜는 숫자 하단 「마감」(10 회색) 표기
    - 전달받은 날짜가 오늘 이전이거나 형식 오류인 경우 무시하고 기존 동작 유지
  2. 2P17 같은 바다로 나가는 배
    정의: 선택 날짜 전 상품 마감 또는 「전화 예약」 선박인 경우, 날짜 헤더 하단 Card/Horizontal-banner Box
    - 날짜 선택 시점에 당일 출항 광고 선박 한 번 조회(CW-59에서 해당 결과 재사용)
    - 배너 = 제목 두 줄 「1월 22일(금)은 마감됐어요 / 같은 바다로 나가는 배가 있어요」 · 보조 줄 「인천 4척 보기 ›」 · 사진 = 첫 광고 선박 · AD 표시 → 탭 시 CW-59 진입
    - 전화 예약 선박(전화 예약 구분 값 [확인 필요: 필드명])은 첫 줄 「이 배는 전화로 예약해요」 노출
    - 동일 지역 광고 선박 0척 시 AD 미포함 동일 배너 「이날 출항하는 배를 볼까요? / 이날 출항하는 배 모두 보기 ›」 노출(일반 검색)
  3. 3P5 같은 항구에서 나가는 배
    정의: 상품 목록 하단 모듈. 헤더 = 선박상세 「최신 조황」과 동일(17 SemiBold · 좌우 20) + AD 표시, Card/Ship/Common Small 115 가로 스크롤, 최대 3
    - 제목 「같은 항구에서 나가는 배」(동일 항구 0척 시 「같은 바다에서 나가는 배」)
    - 동일 항구 A·B·C 광고 선박(현재 선박 제외), 3슬롯 미충족 시 동일 지역으로 보충
    - 카드 = 「찜한 선박」과 동일한 Small 카드(사진 115 · 선박명 · 지역 거리 · 가격 · 어종 · 할인쿠폰)
  4. 4이런 곳은 어때요?
    정의: 기존 추천 이하 화면
    - 변경 없음(광고 선박 추가·제외 없음)
버튼을 누르면 생기는 일
  • P17 배너 → &sheet=same-day&date=YYYY-MM-DD
  • P5 카드 탭 → 타 선박 상세(패널 스택)
  • AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
  • 광고 API 실패: P5 모듈 미노출, P17은 AD 미포함 「이날 출항하는 배 모두 보기」 배너 노출
  • 마감 외 날짜: 기존 상품 카드 노출(가격 19 Bold 바이올렛 · [예약하기])
표기 규격
항목형식예
P17 제목M월 D일(요일)은 마감됐어요 / 같은 바다로 나가는 배가 있어요1월 22일(금)은 마감됐어요
P17 보조 줄지역 N척 보기인천 4척 보기
결정 필요

D-04 · D-36

개발 메모
프론트 · resDt 파라미터 기준 달력 선택(기존 예약 상품 진입 파라미터명 재사용)
프론트 · 날짜 선택 시 전 상품 마감(또는 전화 예약 선박)인 경우 해당 시점에 P17을 한 번 요청, CW-59는 해당 응답 재사용
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · P5: 선박 항구 → 동일 항구 광고 선박, 없으면 지역 기준
API · POST /usr/ads/slots (placements=P5)
API · POST /usr/ads/slots (placements=P17, ctx boat_idx·date)
CW-59

같은 바다로 나가는 배 시트

신규(시트)&sheet=same-day&date=프로토타입에서 보기 ↗
진입 CW-30 P17 배너여기서 마감된 당일, 동일 바다로 출항하는 타 선박 선택다음 CW-30(다른 선박) · CW-51 · CW-58

기존 「선박 정보」 바텀시트와 동일 구성(핸들 · 제목 18 Bold · × · Card/List 줄). 선택 날짜에 동일 지역 잔여석 있는 광고 선박 노출, 광고 외 전체 목록으로 이동 가능.

요소별 정의와 동작
  1. 1머리
    정의: 「1월 22일(금) 같은 바다로 나가는 배」 + AD 표시 + ×
    - 오픈 시 제목으로 포커스, 닫힘 시 호출한 배너로 포커스 복귀
  2. 2광고 줄
    정의: A·B·C 광고 선박 최대 5, Card/List 그대로 사용
    - 상품 줄은 해당 날짜 상품 및 잔여석 「쭈갑 종일 · 잔여 3석」
    - 현재 조회 중인 선박 제외
    - 행 탭 → 해당 선박 상세 + 해당 날짜(바텀시트 닫힘, 패널 스택)
  3. 3[이날 출항하는 배 모두 보기]
    정의: 바텀시트 최하단 회색 버튼
    - → CW-51(지역·날짜 입력된 일반 검색, 광고 규칙은 CW-51과 동일)
버튼을 누르면 생기는 일
  • 줄 탭 → ?boat={id}&resDt=
  • [이날 출항하는 배 모두 보기] → /booking/search/result?area=&reservation_dt=
  • × · 뒤로가기 · 외부 영역 탭 → 닫기
상태(빈 값·로딩·오류·권한)
  • 광고 0척 시 본 바텀시트 진입 불가(CW-30 배너 변경)
  • 로딩: 행 2개 스켈레톤 노출
표기 규격
항목형식예
머리M월 D일(요일) 같은 바다로 나가는 배1월 22일(금) 같은 바다로 나가는 배
결정 필요

D-04

개발 메모
프론트 · CW-30에서 수신한 P17 응답과 page_key 그대로 사용(재호출 없음)
프론트 · 노출·클릭 이벤트(placement, position, card_tier, module_ctx, page_key)
백엔드 · 당일 예약 가능(seats ≥ max(1, 인원)) · 동일 9지역 · 응답 search_query{area, reservation_dt}
API · POST /usr/ads/slots (placements=P17)
CW-60

선장님 조황 보기

신규(조황 상세 구성)?catch={catch_idx}프로토타입에서 보기 ↗
진입 CW-01 P8 조황 카드여기서 선장 등록 조황 사진·글 확인 후 해당 선박 예약으로 이동다음 CW-30 · 닫기

8월통합 조황 상세 화면 구성 유지(작성자 줄 → 사진 → 글 → 조황 정보 → 플로팅 버튼). 광고 카드에서 진입 시 작성자 줄 선박명 우측에 AD 표시 노출, 하단에 [이 배 예약하기] 버튼 노출.

요소별 정의와 동작
  1. 1머리·작성자 줄
    정의: ← · 공유 · × / 선박 아바타 40 · 선박명 16 + AD 표시 · 「3시간 전」 · 「주꾸미 | 인천 중구 남항부두」
    - AD 표시는 P8 광고 카드에서 진입한 경우에 한함
    - × 또는 ← → 닫기
  2. 2사진·글·조황 정보
    정의: 사진 240 가로 스크롤 · 본문 · 「조황 정보」 표(어종·조과·출항)
    - 기존 조황 상세와 동일 데이터(선장 조황 글)
    - 사진 로드 실패 시 해당 장 건너뜀
  3. 3[이 배 예약하기]
    정의: 하단 플로팅 보라 버튼(#32008C)
    - → 선박 상세
    - 광고 카드에서 진입한 경우 클릭으로 집계
버튼을 누르면 생기는 일
  • [이 배 예약하기] → ?boat={id}
  • ← · × → 닫기
상태(빈 값·로딩·오류·권한)
  • 조황 삭제 시 「삭제된 조황이에요」 노출 후 닫기
표기 규격
항목형식예
올린 시각N분 전 · N시간 전3시간 전
개발 메모
프론트 · 노출은 P8 카드 노출로 1회 집계, 본 화면에서 별도 집계 없음
프론트 · 클릭 = [이 배 예약하기]
API · 기존 조황 상세 API
API · POST /usr/ads/events
CW-58

광고 안내 시트

신규(시트)&sheet=ad-info프로토타입에서 보기 ↗
진입 모든 AD 표시여기서 광고 선박 정의 및 선정 방식 확인다음 닫기 · CW-61

기존 바텀시트(핸들 · 제목 18 Bold · ×)에 광고 표시 및 정렬·맞춤 기준 공개.

요소별 정의와 동작
  1. 1제목
    정의: 「광고 선박 안내」 + ×
  2. 2본문 5줄
    정의: 고정 문구(15, 줄 앞 점)
    - 「AD」 표시가 붙은 선박은 선주님이 비용을 내고 노출하는 광고입니다.
    - 광고 묶음 안의 순서는 광고 등급 순서이고, 같은 등급 안에서는 무작위로 정해집니다. 평점·조황·가격과는 관계가 없습니다.
    - 광고는 검색 결과와 목록의 순서·개수를 바꾸지 않습니다. 광고가 아닌 선박은 고객님이 고른 정렬 기준(거리순·인기순·가격순)을 따릅니다.
    - 일부 광고는 지금 보시는 바다·날짜·검색 조건에 맞춰 고릅니다. 예약 이력으로 고르는 광고는 맞춤 광고 설정에서 끌 수 있습니다.
    - 광고 선박도 예약·결제·취소·환불 기준은 다른 선박과 똑같습니다.
  3. 3[확인] · [맞춤 광고 설정]
    정의: 보라 주 버튼(#32008C) + 하단 텍스트 버튼
    - [확인] · 뒤로가기 · 외부 영역 탭 → 닫기
    - [맞춤 광고 설정] → CW-61(비로그인 시 로그인 후 진입)
버튼을 누르면 생기는 일
  • [확인] → 닫기
  • [맞춤 광고 설정] → 알림 설정
결정 필요

D-28 · D-36

개발 메모
프론트 · 셸에서 &sheet=ad-info 처리(주소에 쿼리 없으면 ?sheet=ad-info)
프론트 · 바텀시트 오픈 시 제목으로 포커스, 닫힘 시 호출한 버튼으로 포커스 복귀
CW-61

알림 설정 — 맞춤 광고

변경마이 > 알림 설정프로토타입에서 보기 ↗
진입 CW-58 [맞춤 광고 설정] · 마이 > 알림 설정여기서 예약 이력 기반 광고 켬/끔 설정다음 뒤로

8월통합 알림 설정 화면 최하단에 「광고」 그룹과 「맞춤 광고」 행 추가(동일 그룹 라벨 · 행 제목 17 SemiBold · 토글 52×32). 꺼짐 시 예약 이력 기반 지면(새소식 홈 「다음 출조」, 출조 탭 지역 노출 순서)에서 이력 미사용. 광고 자체는 유지.

요소별 정의와 동작
  1. 1맞춤 광고 토글
    정의: 「맞춤 광고」 + 「지난 예약의 지역·어종으로 광고를 골라요」, 디폴트(기본값) 켬, 스크린리더에서 스위치로 인식
    - 끄기 → 토스트 「맞춤 광고를 껐어요」, 다음 화면부터 반영
    - 켜기 → 토스트 「맞춤 광고를 켰어요」
  2. 2설명
    정의: 토글 하단 회색 텍스트(13)
    - 「꺼도 광고는 보이지만, 예약 이력과 관계없이 골라집니다. 위치는 위치 사용에 동의한 경우 그때 보고 있는 화면에만 쓰고 저장하지 않아요.」
    - [개인정보 처리방침 보기 ›] → 처리방침 「맞춤형 광고」 항목
버튼을 누르면 생기는 일
  • 토글 → PUT /usr/ads/pref
  • [개인정보 처리방침 보기] → 처리방침
상태(빈 값·로딩·오류·권한)
  • 비로그인: 그룹 미노출
  • 저장 실패: 토글 원복 + 토스트 「잠시 후 다시 시도해 주세요」
결정 필요

D-28

개발 메모
프론트 · 낙관적 갱신 후 실패 시 원복
백엔드 · ad_user_pref upsert, 서빙 API는 요청마다 조회(회원 캐시 1분)
API · GET·PUT /usr/ads/pref

어드민

AD-80

광고 계약 목록

신규/partners/ads/contracts프로토타입에서 보기 ↗
진입 LNB 파트너스 > 광고 관리 > 계약여기서 계약 검색 및 처리 대상 건(확인 중·대기·입금 대기·미납) 확인다음 AD-81 · AD-82

광고 계약 전체 목록. 상단 상태 카운터로 처리 대상 건 우선 노출.

요소별 정의와 동작
  1. 1상태 카운터
    정의: 처리 대상 건 수 칩 4개
    - 확인 중 N · 대기 N · 입금 대기 N · 미납 N
    - 칩 클릭 → 해당 상태로 필터 적용 후 조회
  2. 2검색 필터
    정의: 기존 필터 박스 형식
    - 검색어(선박명·업체명·계약번호)
    - 기간 기준(신청일·시작일·종료일) + 시작~종료 + [오늘][1주일][1개월][3개월][전체]
    - 상태 체크박스(확인 중·대기·입금 대기·집행 예정·집행 중·일시정지·만료·해지·반려·취소·임시저장)
    - 등급(전체·A·B·C) · 지역(9지역) · 업종(전체·유어선·유선) · 결제 방법(전체·정산 차감·계좌)
    - [초기화][조회]
  3. 3목록 머리
    정의: Total N · N개씩 보기 · [엑셀받기] · [계약 등록]
    - [계약 등록] → AD-82
    - [엑셀받기] → 현재 검색 조건 그대로 적용
  4. 4목록 표
    정의: 계약 1건 = 1행
    - 열: 번호 · 계약번호 · 선박명(업체명) · 지역 · 업종 · 등급 · 약정 · 기간 · 월 금액 · 결제 방법 · 상태 · 미수 · 신청일 · 상세
    - 상태 글씨 색 = 공통 상태 색
    - 미수 > 0 시 빨강 표시
    - 디폴트(기본값) 정렬: 신청일 최신순 / 상태 카운터로 진입 시 신청일 오래된 순
버튼을 누르면 생기는 일
  • [상세] → AD-81
  • [계약 등록] → AD-82
상태(빈 값·로딩·오류·권한)
  • 빈: 「검색 결과가 없습니다.」
표기 규격
항목형식예
기간YYYY.MM.DD ~ YYYY.MM.DD2027.01.05 ~ 2027.04.04
금액#,##0600,000
개발 메모
프론트 · 기존 목록 화면 컴포넌트 재사용
백엔드 · status 다중 값 콤마 구분
API · GET /adm/ads/contracts
AD-81

광고 계약 상세

신규/partners/ads/contracts/:id프로토타입에서 보기 ↗
진입 AD-80 · AD-83 · AD-84 · 구글챗 OP01여기서 계약 승인·반려·정지·재개·해지 처리 및 회차·청구·이용권·작업·성과·이력 확인다음 AD-83 · AD-84

계약 1건의 운영 화면. 상태별 처리 버튼 변경, 모든 처리는 사유와 함께 이력에 기록.

요소별 정의와 동작
  1. 1머리
    정의: 계약번호 · 상태 · 선박명 · 처리 버튼
    - 확인 중: [승인][반려]
    - 대기: 「대기 순서 N」 노출 + [취소][반려](슬롯 발생 시 자동으로 확인 중 전환)
    - 임시저장: [신청으로 넘기기][삭제]
    - 입금 대기: [입금 확인 →] AD-83
    - 집행 예정: [해지]
    - 집행 중: [일시정지][해지]
    - 일시정지: 원인 칩(미납·운영·숨김) + 운영 정지인 경우에 한해 [재개] 노출 + [해지]
  2. 2승인 팝업
    정의: [승인] 확인
    - 시작일 확인(희망일 경과 시 내일로 변경된 값 노출, 수정 가능)
    - 재고 「인천 A 5/6 · 전국 A 8/10」
    - 처리량 경고(부족 시 빨강 표시) 「이번 달 인스타 게시 처리량이 2건 모자랍니다」
    - [승인] → 계약금 선수취 사용 또는 계좌 결제 시 입금 대기 + 1회차(또는 일시) 청구 생성, 선수취 미사용 정산 차감 시 집행 예정 → 토스트 「승인했습니다」 / AD4096 → 얼럿 「자리가 방금 찼습니다. 대기로 돌릴까요?」 [취소][대기로] → POST waitlist
  3. 3반려 팝업
    정의: [반려] 입력
    - 사유 선택(재고 없음·판매 상품 없음·정산정보 미등록·선박 정보 부족·기타) + 설명 10자 이상
    - 설명이 선주 알림톡에 그대로 발송됨을 안내
  4. 4정지·해지 팝업
    정의: [일시정지]·[해지] 입력
    - 일시정지: 사유 10자 이상, 「회사 사정」 체크 시 보상 프로모션 일수 입력 안내
    - 해지: 사유(선주 요청·미납·회사 귀책·폐업) · 해지일(오늘 또는 이후, 디폴트 오늘, 당일 23:59까지 노출) · [정산 미리보기](terminate settle_preview) → 해지 회차·사용일·받아야 할 금액·이미 회수·취소될 미수 청구·조정 청구 또는 환급(방법) 노출 → [해지 확정] → 해지일 다음 날 00:00 배치에서 상태 「해지」 전환 + 정산 확정, 전환 전까지 상단에 「해지 예정 M.D」 노출
    - 예: 왕감자호 A 12개월, 1회차 1. 5~2. 4(31일), 1. 20 해지 → 사용일 16일 · 309,677원 · 회수 450,000원 → 환급 140,323원(다음 지급 시)
  5. 5계약 정보
    정의: 수정 가능한 필드 표
    - 확인 중·대기·임시저장: 등급·약정·시작일·결제 방법·청구 방식·월 금액(수동 체크+사유)·프로모션·이메일 수정 가능
    - 그 외 상태: 프로모션 일수·이메일·메모만 수정 가능
    - [저장] → 변경 전후 값 이력 기록
    - 프로모션 일수 증가 시 겹침(AD4091)·상한(AD4096) 재검사
  6. 6선박 확인
    정의: 승인 판단에 필요한 선박 정보
    - 노출 여부 · 30일 안 판매 상품 수 · 정산정보 등록 · 최대 탑승(업종 근거) · [선박 상세 →]
  7. 7회차·청구
    정의: 회차별 청구 표
    - 회차 · 기간 · 청구번호 · 합계 · 회수 · 상태 · 세금계산서
    - 청구번호 클릭 → AD-83 필터
  8. 8이용권·작업
    정의: 회차별 이용권 사용 현황 + 이 계약 작업 목록
    - 작업번호 클릭 → AD-84 상세
  9. 9성과 요약
    정의: 기간 전체 노출·클릭·예약·결제액·배수
  10. 10선주 요청
    정의: 연장·등급 변경·해지 문의(1단계는 전화·영업으로 접수한 내용을 운영자가 기록)
    - 행마다 [처리 완료] — 연장은 [새 계약 만들기](원 계약 값이 채워진 AD-82), 등급 변경은 [등급 변경 처리](대상 등급·시작일 = 다음 회차 시작일 확인 → change-grade 한 번에 새 계약 생성 + 기존 계약 해지 예정 처리)
  11. 11카드 소재 탭
    정의: 고객웹 광고 배너·마커에 사용할 사진과 SNS 소재
    - 대표 사진 3장(배너 사진 68 · 지도 마커 사진 · 추천리스트 사진 98에 첫 장 사용) · 노출 어종 최대 3
    - 선장 한마디(최대 40자) · 선장 얼굴 사진 1장 = 2단계 P18 선장 소개 블록과 SNS 소재용(1단계 고객웹 미사용)
    - 우측에 배너·추천리스트 미리보기 노출
    - [검수 완료] → 상태 OK, 고객웹 반영 5분 이내 / [반려](사유)
    - 미검수 시 선박 기본 대표 이미지로 노출, AD-80에 「소재 미검수 N」 카운터 노출
  12. 12이력
    정의: 상태·값 변경 기록
    - 일시 · 처리자 이름 · 변경 · 사유
버튼을 누르면 생기는 일
  • [승인]·[반려]·[일시정지]·[재개]·[해지]·[저장]·[검수 완료]
상태(빈 값·로딩·오류·권한)
  • 권한: 모든 관리자(현행 권한 등급 없음)
표기 규격
항목형식예
일시YYYY.MM.DD HH:mm2027.01.03 14:20
결정 필요

D-08 · D-10

개발 메모
프론트 · 상태별 버튼 표를 상수로 관리
프론트 · 승인 팝업은 approve dry_run 응답 기준으로 재고·처리량 표시
백엔드 · 승인 시 ad_cap 행 잠금, 처리량 계산
백엔드 · 해지 정산은 미리보기와 확정(배치)에 동일 함수 사용
API · GET /adm/ads/contracts/{id}
API · POST approve(dry_run)·waitlist·cancel·reject·pause·resume·terminate(settle_preview)·change-grade
API · PATCH /adm/ads/contracts/{id}
AD-82

광고 계약 등록 팝업

신규(모달)AD-80 위프로토타입에서 보기 ↗
진입 AD-80 [계약 등록] · AD-81 [새 계약 만들기]여기서 영업팀이 선주 대신 계약 등록다음 AD-81

대리 등록 모달. 서비스에 기등록된 선박만 선택 가능. 1단계에서는 모든 계약이 이 화면으로 유입(영업 오프라인 계약).

요소별 정의와 동작
  1. 1선박 검색
    정의: 선박명 검색 → 결과 라디오 1개 선택
    - 결과 = 선박명 · 선박번호 · 지역 · 업체 · 노출 여부 · 정산정보
    - 업종·지역은 선택 즉시 자동 노출
  2. 2계약 조건
    정의: 등급 · 약정 · 시작일 · 결제 방법 · 청구 방식 · 계약금 선수취
    - 시작일은 내일부터 선택 가능
    - 정산정보 미등록 시 정산 차감 비활성(딤 처리)
    - 「첫 회차 계좌 선수취」 체크(디폴트 켬): 체크 시 1회차(또는 총액)는 계좌로 선수취, 2회차부터 선택한 결제 방법 적용
    - 체크 해제 시 사유 10자 이상 필수
    - 우측에 해당 지역·등급 잔여 슬롯 노출 「인천 A 5/6 · 전국 A 8/10」
    - 「연간 일시 계약」 체크: 체크 시 약정 12개월 · 청구 일시 · 결제 계좌로 고정(변경 불가), 월 금액 = 12개월 할인율 + 5%p, 프로모션 30일 자동 입력, 승인 시 총액 청구 1건 생성
  3. 3금액
    정의: 자동 금액 + 수동 수정
    - 월 금액·총액 자동 계산
    - [수동 수정] 체크 시 입력칸 노란 배경 + 사유 10자 이상 필수
    - 프로모션 일수 0~60
  4. 4기타
    정의: 세금계산서 이메일 · 메모
  5. 5버튼
    정의: [임시저장] · [신청으로 등록]
    - 임시저장 = 선주에게 미노출, 필수값 누락 상태로도 저장 가능
    - 신청으로 등록 = 확인 중 상태로 생성 + 선주 알림 AN01 발송
    - 필수 누락 시 해당 입력칸 빨간 테두리 + 「필수 항목을 입력해 주세요」
버튼을 누르면 생기는 일
  • [임시저장] → DRF
  • [신청으로 등록] → REQ (슬롯 마감 시 대기로 등록 → 토스트 「대기 N번으로 등록했습니다」)
결정 필요

D-26

개발 메모
백엔드 · requested_by_type=A, first_cycle_upfront·upfront_off_reason 저장
API · POST /adm/ads/contracts
AD-83

청구·납부 관리

신규/partners/ads/invoices프로토타입에서 보기 ↗
진입 LNB · AD-81 · AD-34여기서 청구별 회수·미수 확인 및 입금 확인·세금계산서 입력·청구 취소 처리다음 AD-81

광고 청구 원장. 정산 차감과 계좌 입금을 모두 이 화면에서 관리.

요소별 정의와 동작
  1. 1요약
    정의: 이번 달 청구 · 회수 · 미수 · 연체(21일+) 금액
    - 합계는 부가세 포함 금액
  2. 2검색 필터
    정의: 기간(청구일·기한) · 상태(미수·일부·완납·취소) · 결제 방법 · 종류(회차·일시·단건·조정) · 검색어
    - [초기화][조회]
  3. 3목록 표
    정의: 청구 1건 = 1행
    - 열: 청구번호 · 종류 · 선박명 · 계약번호/작업번호 · 회차 · 청구일 · 기한 · 공급가액 · 부가세 · 합계 · 회수 · 미수 · 상태 · 세금계산서 · 처리
    - 처리: [입금 확인] [세금계산서] [차감 내역]
  4. 4입금 확인 팝업
    정의: 계좌 입금 기록
    - 금액(미수 이하) · 입금자명 · 입금일
    - [확인] → 회수 반영 → 입금 대기 계약인 경우 상한 재검사 후 집행 예정 전환(시작일 경과 시 입금 다음 날로 재설정) / AD4098 「이미 처리된 청구입니다」
    - 상한 초과 시 같은 팝업에 「자리가 찼습니다」 + [대기 1번으로 두기][환급] 선택
  5. 5세금계산서 팝업
    정의: 발행 정보 입력
    - 승인번호 · 발행일 · [저장]
  6. 6환급 탭
    정의: 목록 위 탭 「청구 | 환급」의 환급 목록
    - 열: 선박명 · 계약번호 · 금액(부가세 포함) · 방법(다음 지급 시 / 계좌) · 상태(대기·지급에 포함·완료) · 생성일 · 30일 전환 예정일 · 처리
    - 계좌 환급 대기 행에 [환급 완료] → 메모 입력 → POST refunds/{id}/complete → 완료 처리
    - 다음 지급 시 방식의 대기 행은 버튼 미노출(지급 요청 시 자동 적용)
  7. 7차감 내역 팝업
    정의: 이 청구에 붙은 지급 차감 목록
    - 지급 요청일 · 선박 · 금액 · 상태(적용·되돌림)
    - 행마다 [되돌리기] → 사유 10자 이상 입력 → 차감 REVERSED, 청구 미수 복원, 이력 기록
버튼을 누르면 생기는 일
  • [입금 확인]
  • [세금계산서]
  • [차감 내역]
  • [청구 취소](사유 필수)
표기 규격
항목형식예
금액#,##0495,000
결정 필요

D-09 · D-18

개발 메모
백엔드 · 입금 확인 시 조건부 갱신
API · GET /adm/ads/invoices
API · POST deposits
API · PATCH tax
API · POST void
API · GET /adm/ads/refunds
API · POST /adm/ads/refunds/{id}/complete
AD-84

홍보·운영 작업 보드

신규/partners/ads/orders프로토타입에서 보기 ↗
진입 LNB · AD-81 · 구글챗 OP02여기서 작업 담당자 배정 및 자료 요청·결과물 업로드·완료 처리다음 AD-81

SNS 홍보·운영 지원 작업 처리 화면. 상태 탭 + 표 + 우측 상세 패널.

요소별 정의와 동작
  1. 1상태 탭
    정의: 접수 · 자료 요청 · 제작 중 · 선주 확인 · 게시 준비 · 완료 · 취소 (각 건수)
    - 기한 경과 건은 탭 옆 빨간 숫자로 노출
  2. 2필터 · [대리 주문]
    정의: 상품 · 담당자 · 선박 · 기한 지남만 + 우측 [대리 주문] 버튼
    - 선박 검색 · 상품 · 결제 방법 · 메모 → POST /adm/ads/service-orders → 접수 상태 작업 생성(선주 앱 결제를 2월로 연기하는 경우의 대체 경로)
  3. 3작업 표
    정의: 작업 1건 = 1행
    - 열: 작업번호 · 선박명 · 작업 · 출처(이용권/단건 금액) · 상태 · 담당 · 기한 · 예정일 · 최근 변경
    - 행 클릭 → 우측 상세 패널 노출
  4. 4상세 패널 — 정보·자료
    정의: 작업 정보와 선주가 업로드한 자료
    - 선주 메모 · 파일 목록(내려받기) · 계약·이용권 정보
    - 담당자 지정 · 기한 · 예정일(촬영·발송·탑승일) 입력
  5. 5상세 패널 — 결과물
    정의: 결과물 업로드와 표시 확인
    - 파일 · 결과 링크 · 게시 문구
    - [표시 확인] 체크 — SNS 작업은 체크 시에만 다음 단계 버튼 활성(첫 줄 「광고」·「협찬」 확인)
    - 메타 대행: 집행 금액·노출·클릭·랜딩 방문 입력
    - 네이버 키워드광고 대행: 회차마다 키워드 수 · 광고비 소진 · 노출 · 클릭 · 평균 클릭 비용 · 선박 상세 방문 입력, 남은 광고비는 다음 회차 이월 표시
    - 상품·일정 등록 대행: 등록한 일정 기간(예: 2. 1~2. 28)과 상품 수 입력 후 [완료 처리]
  6. 6상세 패널 — 상태 버튼
    정의: 상태별 다음 단계 버튼
    - 버튼은 상품별 단계(4.1 표) 기준
    - 접수: [자료 요청](요청 문구 입력, 기한 디폴트 14일) 또는 [제작 시작] — 단건 정산 차감 시 이 시점에 청구 생성, 단건 계좌 시 입금 확인 전까지 비활성
    - 제작 중: [선주 확인 요청](확인 있는 상품) 또는 [완료 처리](확인 없는 상품: 조황 업로드)
    - 선주 확인: 대기(72시간 경과 시 자동 승인) · 수정 요청 내용 노출
    - 게시 준비: 결과 링크 입력 후 [완료 처리]
    - 공통: [작업 취소](사유 선택: 운영 사정 → 이용권 반환 / 선주 요청 → 이용권 소멸)
    - 이용권 작업을 처리 상한으로 이번 회차에 수용 불가 시 [운영 사정으로 다음 회차로](PATCH ops_shortfall_inc → 해당 회차 ops_shortfall + 1)
버튼을 누르면 생기는 일
  • 상태 버튼 → PATCH status + 알림(AN12·AN13·AN14) 발송
결정 필요

D-11

개발 메모
프론트 · 패널은 기존 모달 대신 우측 드로어로 구현
백엔드 · 결과물 업로드 = 서명 URL
API · GET /adm/ads/service-orders(counts 포함)
API · POST /adm/ads/service-orders(대리 주문)
API · PATCH
API · POST results
AD-85

지면 현황·성과

신규/partners/ads/placements프로토타입에서 보기 ↗
진입 LNB여기서 지역·등급별 잔여 슬롯과 지면별 성과 확인다음 AD-81

광고 재고와 성과 현황판.

요소별 정의와 동작
  1. 1요약
    정의: 집행 중 계약 수 · 이번 달 광고 매출(공급가액) · 노출 · 클릭 · 광고 경유 예약
  2. 2재고 표
    정의: 지역 9 × 등급 3
    - 칸 = 「5 / 6」(사용/상한) + 대기 수, 마감된 칸 빨강 표시
    - 전국 합계 행
    - 칸 클릭 → AD-80 해당 지역·등급 필터
  3. 3지면별 성과 표
    정의: 2월 화면(1단계는 운영 SQL 리포트)
    - 기간 선택 + 지면 12행(P1~P8·P12~P14·P17)
    - 열: 노출 · 클릭 · 클릭률 · 예약 · 결제액 · 채워진 비율(모듈이 실제로 노출된 화면 ÷ 진입 화면) · 노출 스위치 상태
버튼을 누르면 생기는 일
  • 칸 클릭 → AD-80
결정 필요

D-08

개발 메모
API · GET /adm/ads/placements/inventory
API · GET /adm/ads/placements/stats
AD-86

단가·상품·노출 설정

신규/partners/ads/settings프로토타입에서 보기 ↗
진입 LNB여기서 단가표·판매 상한·단건 상품·노출 스위치·정책 고지 관리다음 —

광고 상품 설정 화면. 단가 변경은 적용일 30일 이후부터, 정책 고지(AN17)와 함께 등록.

요소별 정의와 동작
  1. 1탭 단가표
    정의: 업종 × 등급 × 약정 표(현재 적용 + 예약된 단가)
    - [새 단가 등록] → 적용일(오늘+30일 이후) · 표 입력 · 고지 문구 → 저장 시 정책 고지 예약
    - 기존 계약에는 미적용 안내
    - 표 하단 「연간 일시 추가 할인」 입력(디폴트 5%p, 12개월 일시 결제 계약에 한해 적용)
  2. 2탭 판매 상한
    정의: 지역 × 등급 입력 + 전국 상한
    - 현재 사용 수보다 작게 입력 시 얼럿 「지금 계약 수보다 작게 줄일 수 없습니다」
  3. 3탭 지면 설정
    정의: 지면 전체·지면 12개 켜기/끄기 + 모듈 이름
    - 행: 코드 · 화면 · 모듈 이름(입력) · 참여 등급(조회 전용) · 칸 수 · 스위치
    - 모듈 이름에 금지어(인기·베스트·TOP·랭킹·1위·에디터 픽·프리미엄·인증·보증·추천 단독·AD·Sponsored·파트너·제휴·협찬) 포함 시 저장 불가 「광고 지면 이름에 쓸 수 없는 말이 있습니다」
    - 스위치 끄기 시 사유 필수, 확인 팝업(컨펌) 「지금 광고 중인 모든 선박의 노출이 멈춥니다」
    - 꺼진 시간 기록(보상 판단 목적)
  4. 4탭 홍보 상품
    정의: 상품별 가격·소요·월 처리 상한·판매 여부 + 광고 대행 수수료율·최소 수수료·최소 광고비
    - 가격 변경도 30일 고지 대상
    - 탭 하단 「등급 혜택」 표: 등급 × 상품(이용권 수 · 수수료 할인율 · 약정 조건) 편집
버튼을 누르면 생기는 일
  • [저장] → 이력 기록
결정 필요

D-02 · D-08 · D-12

개발 메모
백엔드 · ad_setting 변경 시 노출 캐시 즉시 무효화
API · GET·PUT prices·caps·service-items·settings
AD-34

정산관리 — 광고비 차감

변경/partners/payment/list프로토타입에서 보기 ↗
진입 LNB 파트너스 > 정산관리여기서 지급 요청 전 선박별 광고비 차감과 최종 지급액 확인다음 AD-83

기존 정산관리 목록과 [선택지급요청]. 목록에 열 2개 추가, 지급 요청에 미리보기 단계 추가.

요소별 정의와 동작
  1. 1목록 열 추가
    정의: 「광고비 차감(예정)」 · 「최종 지급액」
    - 정산지급금액 열 우측
    - 행별 예정액 = 정산 예정일 → 정산번호 순으로 미수를 채운 값
    - 차감 계약이 없는 선박은 「-」 표시
    - 엑셀받기에도 같은 열 + 「광고비 환급」 추가
  2. 2지급 요청 미리보기 팝업
    정의: [선택지급요청] 클릭 시 먼저 노출되는 팝업
    - 선박별 행: 선박명 · 선택 건수 · 지급액 · 광고비 차감 · 광고비 환급 · 최종 지급액
    - 예: 왕감자호 2건 485,550 · 차감 −275,000 · 최종 210,550
    - 합계 행
    - 안내 「광고비 차감은 오래된 청구부터 지급액 범위 안에서 적용됩니다」
    - [취소] [지급 요청] → 차감 확정 + 기존 지급 요청 처리 → 토스트 「지급 요청했습니다」 / AD4097 → 얼럿 「금액이 바뀌었습니다. 다시 확인해 주세요」 → 미리보기 재호출
버튼을 누르면 생기는 일
  • [선택지급요청] → POST /adm/payouts/preview → 팝업 → POST /adm/payouts
확인된 문제
  • 현행 정산 목록의 「지금처리 되었습니다」 오타는 별건 처리
개발 메모
백엔드 · 지급 요청 트랜잭션에서 accounts 행 잠금 후 차감
API · POST /adm/payouts/preview
API · POST /adm/payouts
AD-04

전시관리 — 광고 섹션 유형

변경/member/exhibition/list프로토타입에서 보기 ↗
진입 LNB 회원 > 전시관리여기서 광고 섹션 4종을 출조 탭·새소식 홈 노출 순서에 추가다음 —

기존 전시 등록·수정 폼의 섹션 유형 선택지에 광고 4종 추가. 광고 섹션은 선박 목록 입력 없음(광고 계약 기준 자동 구성).

요소별 정의와 동작
  1. 1섹션 유형 추가
    정의: 015 광고-이번 주 함께하는 배 · 016 광고-이번 주 남은 자리 · 017 광고-내일 새벽 출항 · 018 광고-선장님 조황 소식
    - 015~017은 위치 홈(H, 출조 탭)에 한함, 018은 새소식 홈에 한함, 버전은 신버전에 한함
    - 선택 시 선박 목록 표·파일첨부 행 미노출 + 「광고 계약 선박이 자동으로 들어갑니다」 안내
  2. 2연달아 배치 검증
    정의: 저장·순서 수정 시 검사
    - 광고 섹션 두 개가 노출 순서상 인접 시 얼럿 「광고 섹션은 연달아 둘 수 없습니다. 사이에 일반 섹션을 두세요.」
    - 같은 유형 광고 섹션은 하나만 허용
    - 광고 섹션 타이틀·서브 타이틀도 3.5 금지어로 검사, 「추천」 포함 + 「광고」 미포함 이름은 저장 불가
버튼을 누르면 생기는 일
  • [등록]·[수정]·[순서 수정] 저장 시 검증
확인된 문제
  • 전시 수정 화면이 기존 값을 불러오지 않는 결함(9/17 실측) 선수정 필요, 수정 후 광고 섹션도 안전하게 수정 가능
결정 필요

D-33

개발 메모
백엔드 · common_code SECTION 4건 추가, 저장 API에 검증 로직 추가
API · 기존 전시 등록·수정 API

22. 개발 검토 결과

검토는 프론트엔드·백엔드 시니어 관점 리뷰어 2명이 v1.5 기획서(spec_core), 화면 정의서 36개, 프로토타입 코드를 읽고 2회 검토했다. 판정 기준은 「이 문서만 보고 착수할 수 있는가」다.

영역 1차 2차 판정 남은 P0·P1
프론트엔드 66/100 84/100 착수 가능(인력 조건) 없음
백엔드 66/100 84/100 조건부 착수 가능 없음(아래 결정이 조건)

2차 지적은 모두 이 판에 반영했다.

영역 반영한 것
서빙 한 화면 지면을 표시 순서대로 한 번에 요청(POST /usr/ads/slots), 같은 선박 2번 제한을 요청 안에서 처리, 서버 상태 저장 없음 · P2 날짜 탭은 1번으로 셈 · P8 일반 칸은 앞 3칸 선박 제외
캐시·DB 노출 대상 메모리 캐시 60초 무효화(max(updated_at)) · 맥락 10분 · 서빙 중 DB 조회 4가지로 한정 · ad_region(대표 좌표·물때식·예보 지점) 추가
검색 P4는 검색 응답 뒤 최대 300ms만 기다림 · P13은 따로 호출 · P17 응답은 search_query를 항상 줌
물때 P2 탭 물때는 위치 동의 때만 · 부록 B 표기 표 정정(2027-01-22 = 6물, 01-23 = 7물 사리)
카드 광고 카드 = 8월통합 기존 컴포넌트 그대로, 등급별 줄 추가(C 빈자리 → B 7일 조황 → A 선장 한마디)
계약 계약금 선수취(first_cycle_upfront) 상태 전이 · 차감 대상은 청구의 pay_method = D로 판단
선주 SJ-01 price_from · SJ-96 1단계 숨김 · max_discount_rate · 1단계 알림톡 버튼 경로
QA FE 결함 수정 3.5일 · BE 결함 수정 4.5일 반영

착수 조건(기획서 밖 결정).

ID 내용 기한
D-19 외부 백엔드 1명(11/2~12/24) 10/16
D-34 외부 프론트 1명 14.0일, 못 구하면 절단안(프론트 33.5 · 백엔드 48.5 · 지면 10개) 10/16(계약 10/30)
D-35 개발 확인 4건: 셸 공용 패키지 공유 · 전화 예약 필드 · 바다/민물 필드 · 9지역 예보 지점 코드 10/16
D-22 대표·직원 계정 구분 컬럼 10/9
D-23 지급 요청 뒤 실제 이체 방식 실측 10/9
D-24 Redis 유무(이벤트 큐·중복 제거) 10/9
D-25 작업 자료 업로드 저장소 10/16

리뷰어가 다시 계산해 맞다고 확인한 숫자: 단가표와 월 금액, 회차 예시 4건, 해지 정산 예시 2건(조정 청구 290,322원 / 환급 154,356원 부가세 포함), 공수 합계(프론트 40.0 = 고객웹 18.5 + 선주 6.0 + 어드민 12.0 + QA 수정 3.5 · 백엔드 52.0 = 최상수 21.0 + 외부 31.0), 등급별 지면 수(A 12 · B 11 · C 6).