예약 광고 서비스 「어바웃픽」 상품·서비스 기획서 v1.8
- 작성일: 2026-10-02 · 작성: 서현일(CPO) · 대상: 기획·디자인·프론트엔드·백엔드·QA·영업·경영지원
- 범위: 선주 모바일(신규) · 고객웹(8월통합) · 예약 어드민
- 화면 ID는 「8월통합 완벽 기획서」 기준(CW-·SJ-·AD-) 그대로 사용, 신규 화면만 새 번호(SJ-90~, CW-58~61, AD-80~) 부여. 화면별 요소·문구·버튼 동작은 「화면 정의서」(screens)와 Figma 정책 카드에 정리.
- 표기: [확인됨] 실측·문서 근거 · [제안] 이번 기획 제안값 · [미확인] 근거 없음 · [확인 필요] 개발·세무 확인 대상 · [결정 필요] D-번호
0. 한 장 요약
선주가 월 정액으로 「어바웃픽」 등급(A·B·C) 구독 시 아래 세 가지를 한 번에 위탁 가능.
- 지면 광고 — 고객웹 새소식 홈·출조 탭·검색·탐색 지도·선박 상세의 12개 지면에 AD 표시와 함께 노출. 고객이 이미 무언가를 정한 순간에 노출: 날씨 확인 시(이 바다로 나가는 배), 날짜 선택 시(이번 주 남은 자리), 마감 확인 시(같은 바다로 나가는 배), 검색 결과가 적은 경우(하루만 옮기면). 화면은 8월통합 디자이너가 제작해 둔 광고 컴포넌트(AD 표시 · 가로 배너 · 검색 추천리스트)와 선박 카드 그대로 사용. 등급 차이는 노출 지면 수와 묶음 내 노출 순서.
- SNS 홍보·광고 대행 — 어바웃피싱 인스타그램 게시·릴스, 카카오 채널 출조 소식, 메타 광고 집행 대행, 네이버 키워드광고 운영 대행, 블로그·유튜브 체험 콘텐츠. 광고 대행 수수료와 체험 콘텐츠도 등급 혜택에 포함(광고비 자체는 선주 부담).
- 운영 지원 — 선박 사진 촬영, 조황 업로드 대행, 선박 소개 정비, 상품·출조 일정 등록 대행.
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개)으로 착수.
반드시 지키는 원칙 네 가지.
- 기본 노출은 무료. 광고 미구매 선박의 기존 노출 위치와 노출 순서 변경 없음.
- 고객웹 유료 노출에는 전부 AD 표시(8월통합 AD-mark) 부착, SNS에는 「광고」 표기. 모듈 이름은 「이 바다로 나가는 배」처럼 상황을 설명하는 이름 사용, 「스폰서」「인기」「추천」 단독 같은 표현으로 대체 불가. 광고는 일반 목록 사이에 삽입하지 않고 별도 묶음으로 노출, 일반 목록의 노출 순서와 개수 변경 없음.
- 광고 상품에 선주 비용으로 만드는 할인 쿠폰 포함 불가. 숙박 플랫폼 두 곳이 광고 상품에 쿠폰 비용을 결합하고 짧은 유효기간으로 소멸시킨 건으로 과징금(2025-08-12 공정위 발표, 야놀자 5억4천만원·여기어때 10억원) 부과 후 2026-05-20 기소된 사례 근거(여기어때 부당이득 359억원으로 기재).
- 정책·단가 변경 시 30일 전 고지, 기존 계약은 만료일까지 원래 조건 보장.
1. 왜 하는가
1.1 수익 구조
- 9월 예약 손익(원장 9/1~9/29): 순거래액 3.16억원, 우리 몫 매출 1,936만원(수수료 815만원 · 선매입 686만원 · 대회 436만원), 광고비 5,479만원, 순손실 약 6,300만원 [확인됨: 48_9월_예약손익].
- 수수료 3%로는 거래액이 늘어도 적자 폭 축소 효과 미미. 사업성 채점에서 중개 모델은 18점 [확인됨: 8/21 사업성 채점].
- 선주에게 직접 받는 정액 매출 필요. 3개월 뒤 계약 선박 30척(A 5 · B 10 · C 15) 기준 월 1,075만원(부가세 별도)으로 9월 수수료 수익(815만원) 초과 [가정].
1.2 공급 쪽 문제
- 등록 선박 943척 중 상품을 한 번이라도 등록한 선박은 436척(47.9%), 8월 실제 결제 발생 선박은 167척 [확인됨: 2026-08-31 공급 퍼널 실측].
- 선주에게 「어바웃피싱에 올리면 고객이 온다」는 경험을 주는 장치 부재. 광고·홍보 대행은 이 경험을 유료로 확실하게 제공하는 수단.
- 운영 지원(사진·조황·소개 정비)은 상세 페이지 품질을 높여 광고를 사지 않은 고객 경험 개선에도 기여.
1.3 선주가 낼 만한가
- 선주에게 빈 좌석은 그대로 버려지는 매출. 1인 결제액 9만원 기준 A등급(유어선 월 60만원)은 월 약 7석, B등급(40만원)은 약 5석, C등급(25만원)은 약 3석 추가 판매 시 손익분기 [가정: 1인 9만원은 고객웹 카드 표기 「90,000원~」 수준].
- 선주 인터뷰 5곳으로 지불 의사와 등급 단가를 10/9 전 확인(D-01 근거).
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%) |
- 월 금액 = 1개월 단가 × (1 − 약정 할인율). 총 금액 = 월 금액 × 약정 개월 수. 원 단위 미만 버림.
- 부가세 = floor(공급가액 × 0.1). 청구 합계 = 공급가액 + 부가세.
- 프로모션 일수(무상 연장)는 운영자가 계약마다 0~60일 범위에서 부여 가능, 종료일에 추가. 프로모션 기간은 0원.
- 단가는 어드민 「단가·상품 관리」(AD-86)에서 변경, 변경 단가는 적용일 이후 신규 계약에만 적용. 적용일은 오늘로부터 30일 뒤부터 선택 가능.
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회 |
- 「회차」는 계약 시작일부터 한 달 단위(5.3). 이용권은 회차 시작일에 생성. O1·O3은 계약 첫 회차에만 생성.
- 선주 자료 미제출로 사용하지 못한 이용권은 해당 회차 종료 시 소멸. 회사 사정으로 처리하지 못한 이용권은 다음 회차로 한 번만 이월(carried_in), 성과 화면에 「다음 달로 넘어간 작업」으로 노출.
- 광고 대행(S4·S7)의 등급 혜택은 대행 수수료에 한함. 메타·네이버에 실제 집행되는 광고비는 등급과 관계없이 선주가 계좌로 선입금(최소 광고비는 2.3과 동일).
- S4 「3회차마다 1건」 = 3·6·9·12회차 시작일에 이용권 1건 생성. S5·O1은 약정 조건 충족 시 계약 첫 회차에 1건 생성.
- 유튜브 체험 영상(S6)은 등급에 미포함, 상담으로만 접수.
- 연간 일시 계약은 이 표에 2.5의 혜택 추가.
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일분 등록·수정 |
- S4·S7 과세 공급가액에 광고 예산 포함 여부(우리 계정에서 집행 후 재청구하는 구조) [세무 확인 필요 D-21]. 확인 전까지 예산 + 수수료 전체를 공급가액으로 간주.
- S7 운영 규칙: 키워드는 선박이 실제 출항하는 지역·항구·어종과 선박명만 사용. 타 업체 상호·타 플랫폼 이름은 키워드와 문구에 사용 불가. 광고 문구와 키워드 목록은 집행 전 선주 확인 필수. 해당 회차 미소진 광고비는 다음 회차로 이월, 해지 시 잔여 광고비 환불. 월말 결과 보고 = 노출 · 클릭 · 평균 클릭 비용 · 선박 상세 방문 · 광고로 들어온 예약(6.1 전환 기준).
- O4는 예약 어드민 상품관리에서 운영자가 대리 입력 [확인 필요: 어드민 상품 대리 등록 권한]. 선주는 등록 결과를 선주 모바일 상품관리에서 확인·수정.
- S6은 1단계에서 「상담 신청」만 접수(제휴 크리에이터 풀 확정 전) [결정 필요 D-13].
- 단건 상품도 정산 차감 또는 계좌 선입금으로 수납. 청구 시점은 5.4 기준(정산 차감 = 운영자 작업 시작 시, 계좌 입금 = 신청 즉시).
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 |
- 청구: 승인 시 총액 청구 1건(cycle_no = 0, kind UPF)을 계좌 결제로 생성. 예: 유어선 A = 5,040,000 + 부가세 504,000 = 5,544,000원. 세금계산서는 입금일에 총액 1장 [세무 확인 필요 D-21].
- 정산 차감 선택 불가(일시 결제는 계좌 선입금 전용, 5.4).
- 이용권(SNS·광고 대행·운영)은 일시 결제여도 회차 시작일마다 생성.
- 등급 변경 불가(연장·해지만 가능, 5.1).
- 다음 해 자리 우선 확보는 상한 판정 함수에서 「연간 일시 계약의 연장 계약」을 대기 계약보다 앞에 두는 방식으로만 처리. 상한 자체 초과 불가.
- 중도 해지(5.7): 받아야 할 금액 = min(사용 기간 정가, 연간 일시 총액) + 이미 받은 연간 전용 혜택의 단건 가격(촬영 1회 200,000원). 잔여 프로모션 일수 소멸.
- 연간 일시 단가는 AD-86 단가표에 「연간 일시 추가 할인율」(디폴트 5%p) 한 칸으로 관리.
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개로 구분함.
설계 원칙 다섯 가지.
- 고객이 이미 무언가를 정한 순간에 노출. 날씨 조회 시, 날짜 선택 시, 마감 확인 시, 다음 출조 검토 시.
- 광고는 「목록 사이에 끼우지 않고」 별도 묶음으로 구성. 일반 목록의 노출 순서와 개수는 유지.
- 광고 화면은 새로 그리지 않음. 8월통합 디자이너가 만들어 둔 광고 컴포넌트와 카드를 그대로 사용(3.5). 등급 차이는 노출 지면 수와 묶음 내 노출 순서로 구분.
- 모든 유료 노출에 광고 표시(고객웹 AD 표시, SNS 「광고」) 필수. 모듈 이름은 「~하는 배」처럼 상황을 설명하는 형태로 작성.
- 맥락(바다·날짜·어종·위치)은 조건으로만 사용하고, 노출 순서는 광고비(등급)와 무작위로만 결정. 「맥락 점수 순」 같은 숨은 순위 생성 금지.
3.1 공통
- 노출 대상 = 계약 상태 「집행 중」 + 선박 「노출중」 + 지면별 조건 충족.
- 「예약 가능」 = 고객웹 선박 상세에서 [예약하기] 탭이 가능한 상품(노출·판매 중·잔여 1석 이상). 당일 예약 미운영으로 날짜 조건은 내일부터 산정 [확인됨].
- 예약 가능한 상품이 없는 날은 전 지면 미노출, 해당 기간만큼 연장하지 않음. 선주 광고 홈(SJ-90)에 경고 노출.
- 선택 순서(모든 지면 동일): ① 지면 조건 통과 ② 지면 참여 등급 ③ 등급 순(A → B → C) ④ 같은 등급 내 해시 오름차순. 해시 = sha256(session_id + ':' + 지면코드 + ':' + 선박번호)의 앞 8바이트를 부호 없는 정수로 읽은 값, 동일 시 선박번호 오름차순. 같은 방문 동안 동일 순서 유지.
- 표시 순서는 지면별로 다를 수 있음. 「내일 새벽 출항」(P3)은 선택된 선박을 출항 시각 순으로 노출. 그 외 지면은 선택 순서 그대로 노출.
- 같은 모듈 내 동일 선박은 한 번만 노출. 단, P2는 날짜 탭별 재노출 가능, 아래 2번 제한에서는 탭 전체를 1번으로 산정.
- 한 화면에서 동일 선박의 광고 노출은 최대 2번. 프론트는 한 화면의 지면을 표시 순서대로 일괄 요청(10장 POST /usr/ads/slots의 placements), 서버는 그 순서대로 선택하면서 이미 2번 노출된 선박을 후보에서 제외하고 다음 후보로 채움. 별도 요청(CW-59 바텀시트, P13, 지도 이동 후 P14)은 각각 별도 산정. 서버에 상태 저장하지 않음.
- 3.1의 「일반 목록에서 빼지 않는다」의 예외는 P8 단독. P8 일반 칸에서는 앞 3칸에 노출된 광고 선박 제외(같은 조황 카드 중복 노출 방지 목적).
- 광고 묶음은 일반 목록 사이에 삽입하지 않음. 광고 선박도 일반 목록에서 제외하지 않음(일반 목록의 개수·순서·「N건」 표기가 광고로 인해 변경되지 않음).
- 광고 노출 차단 스위치: 어드민 AD-86에서 전체(ad_setting.ADS_ENABLED) · 지면별(ad_module_rule.enabled)로 차단. 서버 여러 대는 60초 내 반영(3.6 캐시). 차단 기간 동안 계약 기간 연장 없음, 24시간 이상이면 프로모션 일수로 보상.
- 미납·일시정지·만료·해지 시 60초 내 전 지면에서 제외(3.6 캐시). 선박 숨김은 훅 기준 60초, 훅 누락 시 5분 대사 배치 기준으로 제외.
- 광고 미구매 선박의 기존 모듈(인기선박·실시간 조황·기획전·「이런 곳은 어때요?」 등)의 노출 순서와 노출 여부는 유지.
- 광고 배치 제외 화면: 예약 주문서·결제 진행 중 · 취소·환불 신청 · 탈퇴 · 약관·FAQ·고객센터 · 조과 등록 폼 · CCTV·물때·날씨 화면을 가리는 모달. 광고는 모달·플로팅 형태로 노출하지 않음.
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초 정지 후 재호출 |
- 전시관리 섹션 유형: 015 「광고-이번 주 함께하는 배」 · 016 「광고-이번 주 남은 자리」 · 017 「광고-내일 새벽 출항」 · 018 「광고-선장님 조황 소식」(전시 위치 새소식 홈). 광고 섹션은 같은 전시 위치에서 연달아 배치 불가(저장 시 얼럿 「광고 섹션은 연달아 둘 수 없습니다. 사이에 일반 섹션을 두세요.」).
- 모듈 제목·부제는 전시관리 입력값 사용, 디폴트는 위 표 「모듈 이름」. 섹션이 없는 지면(P4·P5·P6·P7·P12·P13·P14·P17)은 AD-86에서 이름 변경.
- 한 화면의 광고 모듈 수 상한: 출조 탭 3 · 새소식 홈 3 · 검색 결과 2 · 선박 상세 1(+바텀시트 1).
3.3 판매 상한 (재고)
- 지역(출조 탭 9지역)별 상한: A 6 · B 10 · C 15. 전국 상한(1단계 운영 여력): A 10 · B 20 · C 40 [결정 필요 D-08].
- 지면이 늘어도 상한은 유지. 지면 증가분만큼 한 척이 받는 노출이 늘어나는 구조임. 2단계 지면 오픈 시 상한 재검토.
- 상한 판정 = 신청 기간의 날짜별 「입금 대기·집행 예정·집행 중·일시정지」 계약 수를 집계해 그 최댓값이 상한보다 작은지 여부. 앞뒤로 이어지는 계약(한 계약 종료 다음 날 다른 계약 시작)은 같은 날 겹치지 않으므로 1로 산정. 같은 선박의 연장 계약은 기존 계약과 겹치지 않으므로 자기 슬롯을 막지 않음.
- 같은 함수로 승인·입금 확인·대기 승격·영업 상담용 남은 슬롯(AD-82) 계산.
- 승인 시 초과하면 AD4096 → 운영자는 대기로 선택 가능. 입금 확인 시 초과하면 입금은 기록하고 확인 팝업(컨펌)에서 「대기 1번으로 두기」 또는 「환급」 선택.
- 상한 판정에 사용하는 계약 기간 종료일 = effective_end(= coalesce(terminate_date, end_date)). 해지 예정·등급 변경 계약의 슬롯은 해지일 다음 날부터 비워짐.
- 상한 계산에 「대기에서 올라온 확인 중」 계약(promoted_at 있음)도 포함. 운영자 처리 전 같은 슬롯으로 다음 대기자가 중복 승격되지 않도록 하기 위한 목적.
- 등록 시점에 이미 상한에 도달했거나 같은 지역·등급에 기간이 겹치는 대기 계약이 있으면 새 계약도 「대기」로 접수(먼저 대기한 선박을 앞지르지 않음).
- 대기 승격: 등급별로 대기 계약을 등록 시각 순으로 하나씩 확인, 해당 계약 기간의 지역·전국 판정을 모두 통과한 계약만 「확인 중」으로 승격 후 AN16을 발송. 다른 지역에서 전국 상한이 풀린 경우도 매 실행마다 전체 대기 계약을 확인하므로 반영됨. 승인은 운영자가 처리.
- 대기 판정 기간 = [max(희망 시작일, 오늘 + 2영업일), 같은 약정 개월].
- 앞 순번 실패 시 해당 앞 순번의 판정 기간과 겹치는 뒤 순번은 건너뜀(앞지르지 않음), 겹치지 않는 뒤 순번은 판정 진행.
- 희망 시작일 + 30일 경과 후에도 대기 상태면 자동 취소(CXL, 사유 「대기 기간 경과」) 및 AN21을 발송.
- 대기 순번은 저장하지 않고 조회 시점에 계산(같은 지역·등급 대기 중 등록 시각 순위).
- 상한 판정 함수는 exclude_contract_idx를 입력값으로 받음(대기에서 승격된 확인 중 계약 승인 시 자기 자신을 두 번 세지 않기 위한 목적). 반려·취소·[대기로] 시 promoted_at 삭제.
- 선박 지역 → 9지역 대응: 시도 기준. 부산·울산은 경남, 서울은 경기, 충북·세종·대전은 충남, 대구는 경북, 광주는 전남으로 처리 [결정 필요 D-14].
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) |
- 상품 줄(Card/Ship/Common의 「생새우 외수질 + 잔여」 줄)은 P2·P3·지도 바텀시트·CW-59에 한해 노출. P1·P5는 「인기 선박 모음」 「찜한 선박」처럼 미노출.
- 배너 문구는 서버가 완성 문구(title1 · title2 · sub)로 전달. 프론트에서 문구 생성하지 않음.
- 선장 한마디·대표 사진(AD-81 카드 소재)은 1단계 고객웹 카드에 미사용. 2단계 P18(선장 소개 블록)과 SNS 소재에 사용.
- 금지 문구(모듈 이름·배너 문구): 인기 · 베스트 · TOP · 랭킹 · 1위 · 에디터 픽 · 프리미엄 · 인증 · 보증 · 「추천」 단독 · Sponsored · 파트너 · 제휴 · 협찬. 「AD」는 AD 표시 컴포넌트에 한해 사용. 디자이너 추천리스트 머리 줄의 예시 문구(「어피 추천 | 인기선박 | 조황 좋음」)는 금지 문구에 해당하므로 어종·항구·날짜 키워드로 변경해 사용.
- 새 색·새 모양 생성 금지. 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.1 선택 순서(등급 → 해시).
- 캐시: 노출 대상 목록(집행 중 계약 · 등급 · 지역 · 항구 좌표 · ad_module_rule · ad_creative)은 서버 인스턴스 메모리에 보관, 60초마다 ad_contract·ad_setting·ad_module_rule·ad_creative의 max(updated_at) 변경 시 재조회(서버 여러 대 사이 무효화는 이 방식으로 단일화). 맥락(ad_boat_context·ad_region_wave)은 10분마다 재조회.
- 서빙 중 DB를 조회하는 대상은 네 가지에 한함: P7 회원의 마지막 결제 예약 1건, P1 회원의 최근 1년 결제 예약 지역 목록(최근 결제 순, 회원별 1분 캐시), ad_user_pref(회원별 1분 캐시), P5·P17 기준 선박 1건.
- 「가까운 지역」(P1 탭 순서·P12) = ad_region의 지역 대표 좌표와 고객 위치의 직선거리 순.
- P8 일반 칸은 프론트가 기존 조황 피드 응답에서 P8 응답의 선박을 제외하고 렌더링(기존 피드 API는 변경 없음). P4·P13의 검색 조건 해석은 검색 API와 같은 함수를 사용하되 광고 후보(최대 약 100척) 내에서만 필터링.
- 서빙 API 응답의 각 칸에 reason(화면에 쓰는 완성 문구, 예 「1. 22(금) 파고 0.5m · 3석」) 함께 전달. 프론트는 상품 줄·배너 문구를 reason으로 렌더링, res_dt로 선박 상세 날짜 전달. 프론트에서 문구 생성하지 않음.
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 | 상품·출조 일정 등록 대행 | 있음(일정표 사진·엑셀) | 없음 | 등록 후 선주 상품관리에서 확인 |
- 「자료 요청」이 없는 상품은 접수 → 제작 중, 「선주 확인」이 없는 상품은 제작 중 → 완료로 바로 전환.
- 카카오 출조 소식(S3)은 매주 목요일 10시 묶음 발송. 수요일 18시까지 「게시 준비」 상태가 된 작업에 한해 해당 주 발송에 포함. 수신 동의 고객 대상, 08:00~20:50에 한해 발송.
- SNS 게시물은 첫 줄에 「광고」(블로그는 「협찬」, 유튜브는 「유료 광고 포함」) 표기 필수. 운영자가 결과물 업로드 시 「표시 확인」 체크해야 「선주 확인」으로 전환 가능.
- 사진 촬영(O1)은 촬영 날짜를 운영자가 선주와 전화로 협의해 어드민에 입력(선주 화면에 날짜 노출). 결과 사진은 운영자가 어드민 선박 정보에 반영.
- 메타 광고 대행(S4)은 선주가 신청 시 예산·기간 입력, 입금 확인 후 운영자가 광고 문구·이미지를 「선주 확인」으로 전송해 승인되면 집행(게시 준비 = 집행 중). 종료 후 노출·클릭·랜딩 방문 수를 운영자가 메타 광고 관리자 수치로 입력해 결과 화면에 노출.
- 네이버 키워드광고 대행(S7)은 첫 회차에 키워드 목록과 광고 문구를 「선주 확인」으로 전송해 승인되면 집행(게시 준비 = 집행 중). 다음 회차부터는 같은 키워드로 유지, 변경 시에 한해 재확인. 회차 종료 시 운영자가 네이버 검색광고 관리자 수치(노출·클릭·평균 클릭 비용·광고비 소진)를 입력해 결과 화면에 노출.
- 블로그(S5)는 운영자가 블로거와 탑승 날짜를 협의해 어드민에 입력, 선주는 해당 날짜 1석 비워 둠(선주 모바일 「예약자 추가」로 직접 등록, 결제 0원).
4.2 처리 상한
- 월 처리 상한 [결정 필요 D-11]: 인스타그램 게시 45건 · 릴스 12건 · 카카오 소식 칸 주 15칸 · 조황 업로드 400건 · 사진 촬영 8회 · 블로그 10건 · 메타 대행 10건 · 네이버 키워드광고 대행 20건 · 상품·일정 등록 대행 60건.
- 이용권 이월 판정: 회차 종료 시 ops_shortfall(운영자가 처리 상한 초과로 접수를 받지 못했거나 운영 사정으로 미룬 수, 운영자가 작업 보드에서 기록)만 다음 회차 carried_in으로 이월. 선주 미사용 이용권은 소멸. 이월분은 다음 회차에서 우선 사용, 재이월 없음.
- 운영 사정 기록: AD-84 상세의 [운영 사정으로 다음 회차로] → 해당 회차 ops_shortfall + 1. 회차 종료 후 운영 사정으로 취소된 작업의 이용권은 다음 회차 carried_in으로 반환.
- 운영 사정으로 작업 취소 시 이용권 반환, 선주 사유(자료 미제출·선주 요청)로 취소 시 사용 처리.
- 조황 업로드(O2) 1건 = 업로드 1회(사진 최대 10장 + 조황 글 1건).
- 등급 이용권은 상한에서 우선 확보. 계약 승인 시 「이번 달 남은 처리량 ≥ 그 계약 이용권」 확인, 부족하면 승인 화면에 경고 노출(승인은 가능, 운영자 판단).
- 단건 신청 시 상한 도달 상태면 「이번 달 접수가 마감됐어요. 다음 달 1일부터 신청할 수 있어요.」 노출 후 신청 차단(AD4093).
5. 계약과 결제
5.1 계약 단위
- 계약 1건 = 선박 1척 × 등급 1개 × 약정 기간 1개. 동일 선박에 기간이 겹치는 계약은 하나만 허용(상태 확인 중·대기·입금 대기·집행 예정·집행 중·일시정지 기준).
- 1단계: 영업팀이 선주 대면 설명·계약 후 어드민(AD-82)에서 대리 등록. 선주 앱 SJ-90E에는 등급 소개와 [상담 요청]만 노출(ad_consult, item_code PLAN → OP01 → 영업 연락). 2단계: 선주 모바일 신청(SJ-91·92) 오픈(D-26).
- 신청·취소·요청·승인·수정 요청 가능한 계정: 업체 대표 계정(업체 로그인 계정). 직원 계정(partner_users)은 조회와 작업 자료 업로드만 가능 [확인 필요: 대표·직원 구분 컬럼]. 로그인 응답에 is_owner 전달.
- 모든 선주 API는 boat_idx의 로그인 업체 소속 여부 확인, 미소속 시 403 AD4031.
- 연장 = 새 계약. 시작일 = 기존 종료일 다음 날, 상태 확인 중 → 승인 시 집행 예정. 등급 변경 = 새 계약(다음 회차 시작일부터, 같은 트랜잭션에서 상한 검사, 초과 시 등급 변경 불가) + 기존 계약 terminate_date = 새 계약 시작일 전날(사유 등급 변경, 할인 반환 없음). 이 세 가지는 POST /adm/ads/contracts/{id}/change-grade 한 번에 한 트랜잭션으로 처리. 새 계약의 약정은 단가표 값(1·3·6·9·12) 중 운영자가 선택, 디폴트(기본값)는 원 계약 남은 개월 이하의 최댓값, 결제 방법은 원 계약 값(변경 가능), 청구 방식은 월 결제만 가능. 정산 차감이면 즉시 집행 예정, 계좌면 입금 대기 + 1회차 청구. 원 계약 마지막 회차의 ops_shortfall은 새 계약 1회차 carried_in으로 이관. 새 계약이 입금 기한 경과·반려로 취소되는 경우, 원 계약 해지일 미경과 시 같은 트랜잭션에서 원 계약의 terminate_date·terminate_reason 삭제(이력 change_grade_rollback) 후 OP01을 발송. 원 계약이 마지막 회차면 「다음 회차」가 없으므로 등급 변경은 AD4092로 차단, 다른 등급 연장(새 계약)으로 안내. 일시 결제 계약은 등급 변경 불가(연장·해지만 가능). 두 경우 모두 선주는 「요청」만 가능, 처리는 운영자 담당.
- 같은 선박 계약 기간 겹침은 DB에서 차단: btree_gist 확장 + EXCLUDE USING gist (boat_idx WITH =, daterange(start_date, effective_end, '[]') WITH &&) WHERE status IN (REQ,WAI,PAY,SCH,ACT,PAU). effective_end = coalesce(terminate_date, end_date) 생성 컬럼(STORED)으로, 겹침 제약·상한·대기 승격·노출 자격·회차 생성에 모두 이 값 사용. 프로모션 일수 증가 시 뒤 계약과의 겹침(AD4091)·상한 재검사.
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 기간과 회차
- 시작 희망일은 신청일 기준 2영업일 뒤부터 선택 가능(공휴일 제외, 기존 휴일 코드 사용). plans API에서 min_start_date 전달.
- 승인 시점이 시작 희망일 경과 후인 경우 승인일 다음 날로 자동 조정, AN02 문구에 변경된 날짜 표기.
- n회차 시작일 = 계약 시작일 + (n − 1)개월. 해당 월에 같은 날이 없으면 해당 월 말일. 앞 회차 날짜에서 누적 가산하지 않고 항상 계약 시작일 기준으로 계산.
- n회차 종료일 = (n+1)회차 시작일 − 1일. 마지막 회차 종료일 = 계약 시작일 + 약정 개월(같은 규칙) − 1일.
- 계약 종료일 = 마지막 회차 종료일 + 프로모션 일수.
| 시작일 | 약정 | 회차 시작일 | 종료일(프로모션 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 |
- 서버 날짜 계산은 KST 날짜(시간 없음)로만 처리. 라이브러리 기본 월 더하기(넘침 이월) 사용 금지.
5.4 청구
- 월 청구(기본): 회차 시작일에 해당 회차 청구 생성(00:00 체인 배치). 회차는 effective_end 범위 안에서만 생성(해지일 이후 시작하는 회차는 미생성). 금액 = 월 금액 + 부가세.
- 계좌 선입금: 승인 시점에 1회차 청구(월 결제) 또는 총액 청구(일시 결제, cycle_no = 0) 생성. 2회차부터는 회차 시작일 배치에서 생성.
- 계약금 선수취(1단계 기본): 대리 등록 시 「첫 회차 계좌 선수취」 디폴트 켜짐. 켜짐 상태면 결제 방법이 정산 차감이어도 1회차 청구는 계좌 입금(ad_invoice.pay_method = T)으로 생성, 승인 → 입금 대기 → 입금 확인 → 집행 예정 순으로 진행. 2회차부터는 선택한 결제 방법(정산 차감 또는 계좌) 적용. 운영자가 끄는 경우(사유 필수) 기존 규칙대로 정산 차감 계약은 승인 즉시 집행 예정. 이 값은 정산 차감 계약에서만 유효(계좌 계약은 원래 선입금). 연장·등급 변경으로 생성한 새 계약은 false로 생성. 정산 차감 대상은 계약이 아니라 청구의 결제 방법(ad_invoice.pay_method = D) 기준으로 판단. 컬럼 ad_contract.first_cycle_upfront bool · upfront_off_reason text.
- 청구 기한(due_date): 계좌 = 청구일 + 7일, 정산 차감 = 청구일 + 14일(미납 안내 기준일과 동일).
- 일시 결제는 계좌 선입금인 경우에 한해 선택 가능. 12개월 일시 결제 시 연간 일시 계약 혜택(2.5) 적용.
- 단건 홍보 상품: 정산 차감은 운영자가 작업을 접수 상태에서 다음 상태(자료 요청·제작 중)로 변경 시 1회 청구. 계좌 입금은 신청 즉시 청구(기한 7일), 운영자는 입금 확인 후 작업 시작. 계좌 단건이 7일(168시간) 안에 미입금 시 작업과 청구 함께 취소, AN20을 발송(매시 배치). 메타 광고 대행(S4)·네이버 키워드광고 대행(S7)은 회사가 광고비를 선집행하는 구조이므로 계좌 선입금만 허용. 등급 혜택으로 대행 수수료가 무료여도 광고비는 동일 방식으로 수납.
- 청구 번호: ADI-YYYYMM-NNNNN. unique(contract_idx, cycle_no) WHERE kind IN (CYC, UPF), unique(service_order_idx) WHERE service_order_idx IS NOT NULL.
5.5 정산금 차감
현행 정산 구조 [확인됨]: 정산은 예약 1건당 1행(accounts), 어드민 정산관리에서 운영자가 행 선택 후 [선택지급요청] 클릭 시 지급 진행. 선주 정산관리는 동일 행들을 정산 예정일 단위로 묶어 노출.
- 차감 시점 = 운영자의 [선택지급요청] 클릭 시. 같은 트랜잭션에서 선박별 차감액 계산 후 지급 묶음(ad_payout) 생성.
- 차감 대상 = 해당 선박의 결제 방법이 정산 차감인 미수 청구, 청구일 오래된 순.
- 차감액 = min(미수 합계, 이번에 지급 요청한 그 선박 행들의 지급액 합). 최종 지급액 = 지급액 합 − 차감액(0원까지 가능).
- 지급 요청 전 확인 팝업에 선박별 「지급액 · 광고비 차감 · 최종 지급액」 노출, [지급 요청] 클릭 시 확정.
- 지급 묶음 ad_payout: 선박별 1행. gross_amount(선택 행 지급액 합) · deduction_amount · refund_amount(환급 중 「다음 지급 때 돌려줌」 분) · net_amount = gross − deduction + refund. 선택한 정산 행은 ad_payout_item(payout_idx, accounts_idx unique)에 추가, 동일 행의 중복 묶음 포함 방지.
- 미리보기 → 확정: 미리보기 응답에 preview_token(선택 행·금액 해시, 10분 유효) 전달, 확정 요청 시 토큰 전송. 그 사이 미수나 행 금액 변경 시 409 AD4097 「금액이 바뀌었습니다. 다시 확인해 주세요」.
- 실제 이체 금액 기준은 net_amount. 현행 지급 요청 후 이체가 경영지원 수동 이체(어드민 엑셀)인지 은행 연동인지 [현행 실측 필요 — 10/9까지 최상수 확인]. 수동 이체인 경우 AD-34 엑셀에 「광고비 차감」「광고비 환급」「최종 지급액」 열 추가, 경영지원은 최종 지급액으로 이체.
- 지급 요청 취소 기능은 현행 미제공 [확인됨: 어드민 정산 화면 버튼 실측]. 1단계 미추가. 잘못 요청한 묶음은 운영자가 AD-83에서 차감 1건 되돌리기로 정정.
- 지급 완료 후 발생한 고객 취소는 기존 정산 로직대로 다음 정산에서 처리, 광고비 차감은 변경하지 않음.
- 선주 정산관리(SJ-30)는 정산 예정일 카드마다 「광고비 차감(예정)」 노출. 예정액 배분 = 정산 예정일이 이른 카드부터, 청구일이 이른 미수부터 카드의 「지급 예정액」(정산 금액) 한도 안에서 배분. 지급 요청 후에는 해당 카드가 「광고비 차감」 확정값으로 변경. 어드민 정산 목록의 행별 「광고비 차감(예정)」도 동일 순서(정산 예정일 → 정산번호 순)로 행 단위 배분한 값임.
- 예: 왕감자호 미수 275,000원(단건 청구 2건: 인스타그램 릴스 1편 추가 · 블로그 체험 후기), 1. 24 카드 지급 예정액 485,550원·1. 31 카드 332,500원 → 1. 24 카드 차감(예정) 275,000원·최종 210,550원, 1. 31 카드 차감 0원.
- 정산 차감 계약이나 지급할 정산이 계속 없는 경우 5.6 미납 규칙에 따라 계좌 입금 요청.
5.6 미납
| 경과(청구일 기준) | 처리 | 알림 |
|---|---|---|
| +14일 | 미수가 남아 있고, 계좌 결제이거나 해당 선박의 지급 전 정산 예정액이 미수보다 적은 경우 계좌 입금 요청 | AN07(due_notice_at 기록, 한 번만) |
| +21일 | 정지 원인 UNPAID 추가, 진행 중 작업 보류 표시 | AN08(overdue_at 기록, 한 번만) |
| 미수 0원 | UNPAID 해제, 다른 원인 없으면 재개 | AN09 |
| +60일 | 운영자가 해지(사유 미납) 후 채권 관리 | — |
- 미납 판정 대상은 회차·일시·조정 청구(CYC·UPF·ADJ)에 한함. AN07·AN08 금액과 SJ-90·SJ-01 경고 금액도 이 범위의 미수만 사용(SJ-99 미수 합계는 단건 포함 전체). 단건 청구(SVC) 미수로는 계약 미정지. 정산 차감 단건은 다음 지급 시 계속 차감, +21일 경과 시 해당 작업만 「보류」 표시(운영자가 게시 보류).
5.7 중도 해지 [결정 필요 D-10]
- 해지일 = 운영자가 해지 처리 시 지정(오늘 또는 이후, 디폴트 오늘). 해당일 23:59까지 노출, 다음 날 00:00 배치에서 상태를 해지로 변경 및 정산 확정.
- 해지일 지정 시 effective_end = 해지일, 해지일 이후 시작하는 회차·청구는 미생성.
- 미리보기(어드민 해지 팝업)는 해지일 기준으로 계산, 「이미 회수」(collected_supply)와 「취소·감액될 미수 청구」, 해지일 전 시작할 회차 청구 예정분 함께 노출. 확정 시 같은 공식으로 재계산, 미리보기와 다르면 OP01 「해지 정산 금액이 바뀜」 발송.
- 선주 요청 해지: 받아야 할 금액 = min(사용 기간 정가, 원 계약 총액).
- 사용 기간 정가 = 1개월 단가 × 끝난 회차 수 + floor(1개월 단가 × 해지 회차 사용일 ÷ 해지 회차 실제 일수). 사용일 = 해지 회차 시작일부터 해지일까지(해지일 포함). 프로모션 기간은 0원.
- 수동 단가 계약은 할인 반환 없이 「수동 월 금액 × 사용 기간」(같은 일할 규칙)으로 계산.
- 정산 순서: ① 해당 계약의 미수 청구 정리: 전혀 회수되지 않은 청구(OPEN)는 취소(VOID). 일부 회수된 청구(PART)는 회수액으로 감액 후 완납(PAID, 감액 이력) 처리. 감액 청구의 부가세 = floor(회수액 ÷ 11), 공급가액 = 회수액 − 부가세. 수정세금계산서는 이 값으로 발행 ② 차액 = 받아야 할 금액 − 이미 회수한 공급가액 ③ 양수면 조정 청구(ADJ) 발행, 음수면 환급(ad_refund) 생성.
- 환급 방법: 정산 차감으로 회수한 분은 다음 지급 시 환급(NEXT_PAYOUT → 지급 묶음 refund_amount로 APPLIED). 30일 안에 해당 선박 지급이 없으면 계좌 환급(BANK)으로 변경, OP01을 발송. 계좌로 수납한 분은 계좌 환급, 경영지원 이체 후 어드민에서 환급 완료 클릭.
- 예: 유어선 A 12개월(월 450,000, 총 5,400,000), 시작일 2027-02-05. 4회차(5. 5~6. 4, 31일) 중 5. 19 해지(사용일 15일) → 정가 = 600,000×3 + floor(600,000×15÷31)=290,322 → 2,090,322. 원 총액 미만이므로 2,090,322. 4회차까지 모두 회수(450,000×4 = 1,800,000) → 조정 청구 290,322원(부가세 별도).
- 회사 귀책 해지: 할인 반환 없이, 이미 청구한 회차의 해지일 다음 날부터 해당 회차 종료일까지 일할 환급(일시 결제면 남은 전체 기간).
- 등급 변경 해지: 할인 반환 없음.
- 조정 청구·환급의 부가세는 단일 식으로 계산: floor(최종 공급가액 × 0.1) − 이미 받은 부가세(양수면 조정 청구 부가세, 음수면 환급 부가세). 1원 차이 방지 목적으로 청구별 개별 계산 금지. 예: 1회차 해지 예시의 환급 = 공급가액 140,323 + 부가세 14,033(45,000 − 30,967) = 154,356원(부가세 포함). 금액 조정은 수정세금계산서로 처리.
- 예(1회차 진행 중 해지): 유어선 A 12개월, 1회차(1. 5~2. 4, 31일) 1. 20 해지 → 사용일 16일 → 정가 floor(600,000 × 16 ÷ 31) = 309,677원 → 1회차 회수 450,000원(정산 차감) → 환급 140,323원(부가세 별도, 다음 지급 시).
5.8 세금계산서
- 청구 건별로 회사가 광고 용역 세금계산서 발행(공급받는 자 = 선박 정산정보의 사업자, 없으면 제휴업체 사업자).
- 1단계는 경영지원이 홈택스에서 발행 후 어드민 청구·납부 관리(AD-83)에 발행일·승인번호 입력 [결정 필요 D-18].
- 수신 이메일: 신청서에서 입력(디폴트 = 제휴업체 정보의 이메일).
6. 측정과 리포트
6.1 지표 정의
| 지표 | 정의 |
|---|---|
| 노출 | 광고 카드(목록 줄·조황 카드·사진 마커·바텀시트 줄 포함)가 화면에 50% 이상, 1초 이상 연속 노출 시 1회. 동일 세션 안에서 (지면, 선박) 조합은 1회만 집계(탭·날짜 탭이 달라도 1회). 지도 마커는 지도 화면 안에 마커 전체가 1초 이상 노출된 경우 |
| 클릭 | 광고 카드 본문 또는 카드 안 [예약하기] 탭 횟수. 중복 미제외. 찜·공유 버튼 탭은 클릭에서 제외. 조황 카드(P8)는 조황 보기 안 [이 배 예약하기], 지도 마커(P14)는 「선박 정보」 바텀시트 줄 탭 시 클릭(마커만 탭한 경우 클릭 아님) |
| 클릭률 | 클릭 ÷ 노출 × 100, 소수 첫째 자리 |
| 광고로 들어온 예약 | 광고 클릭 후 168시간 안에 같은 회원이 같은 선박 상품을 결제 완료(결제 성공 + 예약 상태 02 예약대기 또는 03 예약완료 진입)한 예약. 같은 회원의 클릭이 여러 번이면 결제 시각 직전의 마지막 클릭(어느 계약의 클릭인지)에 귀속 |
| 광고로 들어온 결제액 | 위 예약의 실결제 금액(쿠폰 할인 후) 합 |
| 취소 | 위 예약이 06 취소완료로 변경 시 전환 상태를 CANCELED로 변경, 예약·결제액에서 제외, 「취소 N건」으로 별도 노출 |
| 광고비 대비 결제액 | 광고로 들어온 결제액 ÷ 그 기간 광고비 공급가액(일할), 소수 첫째 자리 「N.N배」 |
6.2 수집 방식
- 세션 ID: 고객웹 셸이 uuid v4로 생성해 sessionStorage
af_ad_sid에 저장. 앱이 30분 넘게 백그라운드 상태였다가 복귀 시 재생성. 원격 앱(/booking, /map)은 셸이 주입한 값 사용. - 기기 식별값 anon_id: localStorage
af_anon_id(uuid v4, 영구). 셸이 로그인 직후, 그리고 회원 토큰이 있는 상태로 앱·웹 실행 시(같은 기기·회원 조합은 하루 1회)POST /usr/ads/identify {anon_id}호출(회원 토큰 필수) → ad_identity에 연결 이력을 행 단위로 누적. 비로그인 클릭은 anon_id로 기록, 같은 기기에서 로그인 후 결제 시 연결. - 노출 측정: IntersectionObserver(threshold 0.5). 1초 타이머는 다음 중 하나에 해당 시 정지 및 초기화 — 카드가 최상위 패널에 있지 않음(위에 다른 패널이 쌓임), 바텀시트 열림, document.hidden. root 미지정(기본 = 화면). 가로 캐러셀 안에서 가려진 부분은 브라우저가 조상 스크롤 영역 기준으로 잘라 계산하므로, 화면 밖 모듈의 카드는 노출로 미집계. 이미 집계한 (세션, 지면, 선박)은 sessionStorage
af_ad_seen에 기록, 뒤로가기·새로고침 시에도 재집계하지 않음. - 전송: 이벤트를 모아 5초마다 또는 20건 도달 시
POST /usr/ads/events로 전송. 본문은 JSON 문자열, Content-Type text/plain, 인증 헤더 미첨부(다른 도메인이어도 사전 요청 미발생). 회원 연결은 identify로만 처리. pagehide·visibilitychange(hidden) 시 fetch keepalive로 잔여 이벤트 전송. 재전송은 네트워크 오류와 5xx인 경우에 한해 최대 3회, 4xx는 폐기. events 응답에 Access-Control-Allow-Origin(고객웹 도메인 목록과 정확히 일치) 추가. - 서버는 이벤트에 anon_id·session_id만 저장. 전환 귀속: 결제한 회원이 그 anon_id의 「클릭 시각 이전 마지막 연결 회원」이거나 「클릭과 결제 사이에 연결된 회원」이면 해당 클릭을 결제 회원의 클릭으로 간주(공유 기기에서 이전 회원이 연결돼 있어도 클릭 뒤 로그인한 결제 회원이 우선). contract_idx와 boat_idx 일치 여부, 지면 코드 일치 여부 검증. anon_id당 10분에 300건 초과 요청은 폐기.
- 중복 제거: Redis가 있으면 event_id를 24시간 보관, 없으면 ad_event_dedup(event_id PK) 테이블에 INSERT … ON CONFLICT DO NOTHING으로 필터링, 48시간 지난 행은 매일 삭제. 요청 수 제한은 Redis가 없는 경우 게이트웨이(nginx limit_req, IP당 초당 20건)에서 처리.
- GA4: 같은 시점에
af_ad_impression·af_ad_click(파라미터 placement, boat_idx, contract_idx, position, grade) 전송. GA4 권장 이벤트 이름(ad_impression)과의 중복 방지 목적으로 접두 추가. 원천은 자체 DB임. - position: 모듈 안 순번(1부터). 이벤트에 module_ctx(지면별 맥락 요약: P2 날짜, P6 장소 코드, P13 옮긴 날짜, P17 날짜)와 card_tier(A/B/C/L 목록 줄/F 조황 카드/M 마커) 함께 전송. 선주 성과 화면(SJ-95)의 「지면별」 표는 12개 지면을 화면 묶음 5개(새소식 홈 · 출조 탭 · 검색 · 지도 · 선박 상세)로 묶어 노출.
6.3 집계
- 매일 00:30 배치: occurred_at(KST) 기준 전날과 그 전날 이틀치를 재집계해 ad_daily_stat(PK stat_date, contract_idx, placement) 덮어쓰기(늦게 도착한 이벤트 반영). 전환 귀속은 전날 결제 완료된 예약 대상으로 168시간 창 안의 마지막 클릭 탐색. 전날 06 취소완료로 변경된 예약(선주가 예약대기에서 거절한 건 포함)은 CANCELED로 변경, 원래 결제일 행에서 예약·결제액 제외 및 취소 수 추가. 부분취소는 전환 금액을 「결제액 − 부분취소액」으로 수정.
- 선주 화면에는 「1. 19(화)까지 집계」처럼 어제 날짜 표기. 성과 조회는 period=cycle(이번 회차)·prev_cycle(지난 회차)·all(전체 기간)·custom(from·to)과 group=day·placement·month 지원. 92일 제한은 group=day에만 적용. 전체 기간은 group=month로 조회.
- 월간 성과 알림(AN15): 매월 3일 10시, 지난달 1일~말일.
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 |
- 1단계 SJ-90E [상담 요청] → 확인 팝업 「영업 담당자가 1영업일 안에 전화드릴게요」 → POST /ptn-m/ads/consults {item_code:'PLAN'}. SJ-94 하단 [연장·변경 문의]는 1단계에서 고객센터 전화 연결(02-722-0365)로 처리. AN10·AN18·AN20·AN21 버튼 링크는 1단계에서 SJ-90으로 연결.
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 화면 이동
- SJ-01 → SJ-90 · SJ-60 → SJ-90 · SJ-30 → SJ-99
- SJ-90 → SJ-94 · SJ-95 · SJ-96 · SJ-99 · (계약 없음) 상담 요청 확인 팝업
- SJ-94 → SJ-95 · SJ-99
- SJ-96 → SJ-97 → SJ-97R
- (2단계) SJ-90E → SJ-91 → SJ-92 → SJ-92C → SJ-93 → SJ-90 · SJ-94 → SJ-94R · SJ-96 → SJ-98
- 모든 고객웹 광고 카드·배너 → CW-30(날짜가 있는 지면은 &resDt) · AD 표시 → CW-58 → [맞춤 광고 설정] → CW-61
- CW-01 P8 조황 카드 → CW-60 → [이 배 예약하기] → CW-30
- CW-30 예약 달력 마감일 → 「같은 바다로 나가는 배 보기」 → CW-59 → 카드 → CW-30(다른 배, &resDt) · [이날 출항하는 배 모두 보기] → CW-51(지역·날짜)
- CW-40 사진 마커 → 「선박 정보」 바텀시트 줄 → CW-30
- CW-27 P12 카드 → CW-30 · CW-51 P13 카드 → CW-30(&resDt=옮긴 날짜)
- AD-80 → AD-81 · AD-82 · AD-83 → AD-81 · AD-84 → AD-81 · AD-85 → AD-81 · AD-34 → AD-83
- 알림톡 버튼 → 선주 모바일 경로(12장 표의 「연결」 열)
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 |
- 1단계 미개발 선주 API(2단계): GET /ptn-m/ads/plans · POST /ptn-m/ads/contracts · POST …/cancel · POST …/requests · GET /ptn-m/ads/service-items · POST /ptn-m/ads/service-orders의 source B(단건 앱 구매). 1단계 consults는 item_code 'PLAN'(등급 상담)과 'S6' 수신.
- 업로드 제한: 사진 jpg·png·heic(서버에서 jpg 변환) 장당 20MB, 최대 20장 / 영상 mp4·mov 1개 300MB. 파일별 서명 URL로 직접 업로드(저장소·common_file 연결 방식은 [확인 필요 — 기존 조황 이미지 업로드 경로 재사용]).
고객웹 | 메서드·경로 | 요청 | 응답 | |---|---|---| | 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} |
- card = 기존 선박 카드 필드(boat_idx, name, port_name, region_text, distance_km, min_price, fish_tags[최대 3], image) + near_seat{date, seats} · 상품 줄(P2·P3·P14·P17) {date, product_name, seats, product_idx, tide} · 목록 줄(P3) {depart_time, seats, wave} · 조황 카드(P8) {catch_idx, catch_photo, fish, catch_text, posted_at} · 마커(P14) {lat, lng, thumb} · 배너(P6·P7·P12·P17) banner{title1, title2, sub, image} · 추천리스트(P4·P13) {reason_keys[3], product_count}. 등급별 필드 차이 없음.
- 한 요청의 placements 내에서 서버가 노출 순서대로 선정, 동일 선박의 3번째 노출 차단(3.1). 서버는 page_key 미저장, 이벤트 묶음 키로만 사용.
- 제목: 섹션 지면(P1·P2·P3·P8)은 전시관리(display-v2) 타이틀 사용, 그 외 지면은 응답 title(ad_module_rule 이름) 사용.
- events.query는 P4·P13에 한해 검색 파라미터 원본 포함, 그 외 지면은 null.
- 지면 응답은 3.6의 캐시와 세션 해시로 생성(서빙 중 DB 조회는 3.6에 명시한 네 가지에 한함). 300ms 내 생성 실패한 지면은 items []로 응답.
- 맞춤 광고 해제 회원(또는 비회원)은 uses_personal 지면(P7)에서 items [], P1 탭 노출 순서에 예약 이력 미반영.
어드민 | 메서드·경로 | 설명 | |---|---| | GET /adm/ads/contracts?keyword=&status=&grade=®ion=&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 | 지난주 차감·지급 묶음 합계 리포트 구글챗 발송 |
- 00시대 배치 생성 알림톡은 발송 큐에 추가 후 08:00 발송(선주 앱 알림함은 즉시 반영).
- 테스트: dev·stage 환경에 한해 열리는 배치 실행 API
POST /dev/ads/batch/{name}?now=ISO일시로 기준 시각 변경 후 실행(운영 환경은 환경변수로 라우트 자체 미등록).
12. 알림 카탈로그
- 링크: 선주 모바일 링크 전체에 boat_idx 추가(예 /ads/invoices?boat_idx=6). id 기반 진입 화면은 응답의 boat_idx 기준으로 선택 선박 동기화.
- 수신 대상: 선주 = 업체 대표 휴대폰으로 알림톡(SOLAPI, 실패 시 문자 대체) + 선주 모바일 알림함(/alarm). 운영 = 구글챗 「알림_광고」 웹훅.
- 중복 방지: ad_notice_log unique(company_idx, code, target_id, kst_date). 미납 알림은 청구의 due_notice_at·overdue_at 기준 한 번만 발송.
- 템플릿 21종 카카오 비즈메시지 신규 등록(승인 3~5영업일, 10/30까지 신청). 1단계 템플릿의 버튼 경로는 1단계 화면으로 한정(AN10·AN18·AN21 → /ads, AN20 → /ads/orders). 2단계에서 신규 템플릿으로 변경.
| 코드 | 시점 | 문구(변수) | 버튼 → 연결 |
|---|---|---|---|
| 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. 권한·감사·개인정보
- 선주: 대표 계정 = 전체 기능 사용 가능(1단계 화면 + 2단계 신청 화면). 직원 계정 = 조회 + 자료 업로드만 가능. 직원 계정 미노출 버튼: SJ-90 이용권 [맡기기], SJ-90E 등급 고르기, SJ-91 등급 신청 버튼, SJ-92 전체(진입 시 「대표 계정만 신청할 수 있어요」 안내 후 이전 화면 이동), SJ-94 하단 버튼, SJ-96 이용권 칩(조회만 가능, 탭 시 반응 없음), SJ-97 [이대로 올려 주세요]·[수정 요청], SJ-98 [신청하기]·[상담 신청].
- 어드민: 관리자 권한 등급 부재(현행)로 모든 관리자 처리 가능. 상태 변경·단가 수정·수동 단가·입금 확인·청구 취소·지급 차감·해지 시 ad_contract_history(field_changes 포함)와 admin_log에 처리자·사유·변경 전후 값 기록.
- 맞춤형 광고: 예약 이력 기반으로 선택하는 지면(P7, P1 탭 순서)에 한해 맞춤형 광고로 분류. 개인정보 처리방침에 「맞춤형 광고」 항목(이용 정보: 예약 지역·어종, 목적, 거부 방법) 추가, CW-61에서 끄기 가능. 위치 정보는 동의한 경우에 한해 해당 요청에만 사용, 저장하지 않음. 화면 노출 장소·검색 조건 기반으로 선택하는 지면(P4·P6·P13·P17 등)은 맞춤형으로 분류하지 않음 [법무 확인 D-28].
- 개인정보: 광고 로그에는 회원번호·기기 식별값만 저장, 이름·연락처 미저장. 선주 화면의 「광고로 들어온 예약」은 예약자명 「김*수」 마스킹 처리, 연락처 미노출. 원천 로그 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. 비기능 요건
- 서빙 API(/usr/ads/slots) 응답 p95 200ms 이하(노출 대상 캐시 60초 무효화 + 맥락 10분 캐시 + 세션 해시). 새소식 홈은 P6·P7·P8을 일괄 호출, 화면 렌더링 대기 없음(응답 지연 시 해당 슬롯만 채움, 레이아웃 밀림 방지 목적으로 P8 줄 높이 96 사전 확보).
- 이벤트 수집 API는 202 즉시 응답 후 큐에 추가. Redis 존재 시 Redis Stream, 미존재 시 ad_event_inbox 테이블(수신 원본 그대로 적재 → 1분 배치로 ad_event 이관)로 대체 [D-24]. 하루 최대 50만 건 기준.
- 고객웹 광고 모듈 실패 시 모듈만 미노출, 화면은 정상 노출 유지(서빙 API 타임아웃 1초).
- 움직임: 광고 카드 자동 넘김·자동 재생 미적용(기존 가로 넘김은 수동 조작만 허용).
- 금액 계산은 서버에서만 처리. 화면은 서버 값 그대로 사용.
- 접근성: AD 표시에 스크린리더가 「광고」로 읽도록 aria-label 적용(화면 노출 글자는 AD). 바텀시트 열림 시 제목으로 초점 이동, 닫힘 시 바텀시트를 연 버튼으로 초점 복귀. 토글은 role="switch" 적용. 지도 마커는 「광고, {선박명}」으로 읽힘. AD 표시와 마커의 터치 영역은 44×44 이상(노출 크기 25×14, 터치 영역만 확장).
- 셸 공유: 노출 추적·AD 표시·광고 안내 바텀시트는 공용 패키지 하나로 구성, 셸과 원격 앱(/booking, /map)이 동일 인스턴스 사용(session_id·anon_id 공유) [확인 필요: 8월통합 셸의 원격 앱 공유 방식]. 주소에 쿼리가 없는 경우 바텀시트는 ?sheet=ad-info로 열림.
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영업일), 승인·반려, 요청·해지 처리 |
| 홍보 작업 | 마케팅 [담당 미정] + 김진연(메타·네이버 대행) | 인스타·릴스·카카오 소식·블로그·메타 광고·네이버 키워드광고 |
| 운영 작업 | 얼라이언스팀 [담당 미정] | 조황 업로드, 소개 정비, 촬영 일정, 상품·일정 등록 대행 |
| 청구·세금계산서 | 경영지원 [담당 미정] | 입금 확인, 세금계산서 발행, 미수·환급 관리 |
- 3개월 후 30척(A 5 · B 10 · C 15) 기준 월 작업량 = 조황 업로드 110건(A 40 · B 40 · C 30) · 인스타 게시 20건 · 릴스 5건 · 카카오 소식 칸 20칸 · 메타 대행 6건(A 5 + B 분기 1건 환산) · 네이버 키워드광고 계정 관리 15척(A 5 · B 10, C는 신청분) · 상품·일정 등록 15회 + 첫 회차 소개 정비 30건·촬영 최대 5회 [가정] → 1~1.5명분 필요. 네이버 키워드광고는 선박당 월 1~2시간(키워드·입찰가 조정, 월말 보고) 기준으로 산정.
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 시트)
- 영업이 AD-82에서 A등급 3개월·정산 차감·계약금 선수취 활성 상태로 대리 등록 시 → 확인 중, AN01. 승인 시 → 입금 대기, 1회차 660,000원 계좌 청구, AN04.
- 입금 확인 → 집행 예정 → 시작일 00:00 집행 중 → 5분 이내 P1·P2·P3 등 A 지면 노출. 2회차 청구는 정산 차감 처리.
- 동일 지역 A 6건 집행 중 상태에서 신청 시 → 대기(1번째). 한 건 만료 시 → 다음 날 00:20 확인 중 전환, AN16.
- 직원 계정은 SJ-90E에 [상담 요청] 버튼 미노출, 상담 API를 직접 호출 시 AD4031 반환.
- 회차 청구 660,000원(부가세 포함) 상태에서 운영자가 해당 선박 지급액 300,000원 행으로 지급 요청 시 → 미리보기 차감 300,000 · 최종 0, 확정 시 → 청구 PART 300,000. 다음 지급 요청 500,000 시 → 차감 360,000 · 최종 140,000 → PAID.
- 지급 요청 두 번 클릭 시에도 차감은 한 번만 처리.
- 청구 21일 미수 시 → UNPAID 정지, 5분 이내 전체 지면에서 제외, 입금 확인 시 → 재개, AN09.
- P4: 검색어 「인천」, 일반 결과 38척(광고 A 2·B 3·C 2 포함) 시 → 목록 상단 묶음 A·A·B 노출(동일 세션 내 노출 순서 유지), 일반 목록은 광고 선박 포함 38척 그대로 유지, 「38건의 검색 결과」 노출. 정렬 기준을 가격순으로 변경해도 묶음은 최상단 유지, 일반 목록만 재정렬.
- P2: 내일 잔여 좌석 6석 상품만 있는 광고 선박은 내일 탭 미노출.
- 광고 카드 50% 노출 0.8초 후 스크롤로 화면 이탈 시 → 노출 0. 1.2초 시 → 노출 1. 동일 세션 내 재노출 시에도 1.
- 광고 클릭 후 167시간째 결제 시 → 전환 1. 169시간째 결제 시 → 0. 비로그인 클릭 후 동일 기기에서 로그인·결제 시 → 전환 1(클릭과 결제 사이 최초 연결 회원 기준). 로그인 상태로 앱 실행 후 클릭·결제 시 → 전환 1(앱 시작 시점 identify).
- 시작일 2027-01-31, 3개월 → 회차 01-31·02-28·03-31, 종료일 04-29.
- 해지 정산 예시(5.7) 금액과 화면 미리보기 금액 일치.
- 인스타 게시 작업: 결과물 「표시 확인」 체크 없이 「선주 확인」 단계로 전환 불가.
- 결과물 확인 요청 후 72시간 무응답 시 → 자동 승인 → 게시 준비 전환, OP02.
- 수정 요청 2번째 시 → AD4095 반환.
- 월 처리 상한 도달 후 단건 신청 시 → AD4093 반환, 마감 문구 노출.
- 선박 노출안함 처리 시 → 계약 일시정지(HIDDEN), 노출 재설정 시 → 재개.
- 서빙 API 1.5초 지연 시 → 해당 모듈만 미노출, 검색 결과·출조 탭·홈은 정상 유지. P6 실패 시 날씨 카드는 그대로 유지.
- 광고 안내 바텀시트 문구는 3.4와 일치, 뒤로가기 시 닫힘.
- 입금 대기 중 시작일 경과 후 입금 확인 시 → 시작일을 입금 확인 다음 날로 변경, 종료일·회차 재계산.
- 동일 선박에 기간이 겹치는 계약을 운영자 두 명이 동시 대리 등록 시 → 하나만 생성, 나머지 하나는 AD4091 반환.
- 지급 미리보기 후 다른 운영자가 입금 확인 시 → 확정 요청 AD4097 반환, 미리보기 재실행 시 줄어든 차감액 반영.
- 해지일을 오늘로 처리 시 → 오늘 23:59까지 노출, 다음 날 00:00 해지, 환급 금액은 5.7 예시와 일치.
- 인스타 게시 승인 시 → 「게시 준비 중」 → 운영자 링크 입력 후 [완료 처리] → 완료, AN14.
- 검색 결과 2페이지 이후 광고 미노출(묶음은 1페이지 상단에 한함).
- 인천 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번과 기간이 겹치는 후순번은 건너뜀. 그 사이 신규 신청은 대기로 진입. 대기에서 올라온 확인 중 계약이 있는 동안 동일 슬롯으로 다음 대기자 승격 불가.
- A → B 등급 변경(change-grade): 신규 계약 생성, 기존 계약 해지 예정 처리, 기존 계약 슬롯은 해지일 다음 날부터 빈 슬롯으로 처리되어 겹침 제약(AD4091) 대상 아님.
- 해지일을 다음 회차 시작일 이후로 지정 시 → 해당 회차 청구는 회차 시작일에 생성, 미리보기 「해지일 전 청구 예정」에 포함. 해지일 이후 회차 청구는 미생성. 해지 확정 시 미회수 청구는 취소, 일부 회수 청구는 감액 후 완납 처리, 차액만 조정 청구 또는 환급.
- 계좌 단건 신청 후 168시간 미입금 시 → 작업·청구 취소, AN20. 정산 차감 단건 미수 21일 경과 시 → 계약 정지 없이 작업만 보류 표시.
- 00:00 배치 하루 실패 시 → 다음 날 실행에서 전날 시작 예정이던 계약·회차·청구 일괄 처리.
- 운영 사정 취소 작업의 이용권은 복원, 자료 미제출 취소 작업의 이용권은 미복원. ops_shortfall 1 → 다음 회차 carried_in 1, 그다음 회차로는 이월 불가.
- 660,000원 청구 중 300,000원 회수 상태에서 해지 시 → 해당 청구는 300,000원(공급가액 272,728 · 부가세 27,272)으로 감액 완납, 차액은 기회수 공급가액 기준으로 계산.
- 대기 1번의 희망 시작일 경과 시에도 판정 기간을 오늘 + 2영업일부터 재설정. 희망 시작일 + 30일 경과 시 자동 취소, AN21. 서로 다른 지역 두 건이 전국 마지막 1자리를 동시 승인 시 하나만 성공.
- 계좌 결제로 등급 변경 시 → 신규 계약 입금 대기 168시간 경과로 취소 → 원 계약 해지 예정 해제, 집행 중 유지, 이력 change_grade_rollback, OP01.
- P2: 1. 22(금) 탭 하단에 지역 표기법(인천 = 7물때식) 기준 물때 노출, 카드 탭 시 → CW-30 진입, 달력 1. 22 선택 상태.
- P3: 내일 출항 상품이 있는 A·B 광고 선박 2척 시 → 모듈 미노출. 4척 시 → 출항 시각순 4줄 노출, 모듈 헤더에 AD 표시.
- P13: 날짜 1. 22로 「격포」 검색, 일반 결과 3건 시 → 결과 하단 「하루만 옮기면」 묶음 노출, 카드 「1. 23(토) 4석」 탭 시 → CW-30 &resDt=2027-01-23 진입. 일반 결과 5건 이상 시 묶음 미노출.
- P17: CW-30에서 마감된 1. 22 탭 시 → 날짜 하단 「같은 바다로 나가는 배」 배너 노출 → CW-59에 동일 지역 1. 22 잔여 좌석 광고 선박 노출(현재 선박 제외) → 카드 탭 시 → 해당 선박 CW-30(&resDt=2027-01-22) 진입. 광고 선박 0척 시 AD 없는 배너로 일반 검색 안내.
- 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 배너 노출 또는 빈 영역 처리).
- P7: 남은 예약 있음 시 → D-day 카드 노출. 남은 예약 0 + 지난 예약(인천 쭈꾸미) 시 → 인천 쭈꾸미 광고 선박 「다음 출조, 이 배는 어때요?」 카드 노출. CW-61에서 맞춤 광고 해제 시 → 다음 요청부터 P7 미노출, P1 탭 노출 순서에서 예약 지역 우선 제외.
- P8: 광고 선박 4척이 72시간 이내 조황 등록 시 → 앞 3장만 광고(AD 표시), 4번째 광고 선박은 일반 카드에 최신순 노출(광고 표시 없음). 카드 탭 시 → CW-60 진입, [이 배 예약하기]만 클릭으로 집계.
- P14: 지도에 광고 항구 5곳이 노출된 화면 → 사진 마커 3개 노출. 지도 이동 시 재선정. 마커 탭만 한 경우 클릭 0, 「선박 정보」 바텀시트 행 탭 시 클릭 1.
- 출조 탭에서 placements=P1,P2,P3를 일괄 요청, 동일 선박이 세 모듈 조건에 모두 해당 시 P1·P2에 노출, P3에서는 제외 후 다음 후보로 채움. P2의 날짜 탭 5개에 동일 선박이 노출되어도 1번으로 집계. 동일 요청 재전송 시에도 결과 동일.
- 카드 모양: A·B·C 계약 선박이 동일 지면에 노출 시 카드 모양은 동일, 노출 순서만 A → B → C. AD 표시는 모든 경우 유지.
- 연간 일시 계약: 유어선 A로 대리 등록 시 → 승인 시점 총액 청구 5,544,000원(부가세 포함) 1건 생성, 종료일 = 12개월 + 30일, 1회차에 O1 이용권 1건, 7회차에 O1 1건 추가. 정산 차감 선택 불가.
- 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물 |
- 예: 2027-01-22(금)는 음력 12월 15일 → 서해 「6물」, 2027-01-23은 음력 16일 → 「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. 화면 정의서
선주 모바일
선주 모바일 첫 화면. 기존 요약 카드와 확정 대기 목록 사이에 「광고·홍보」 카드 1장 추가. 그 외 요소는 변경 없음.
요소별 정의와 동작
- 1경고 줄정의: 정지 원인이 있거나 판매 상품이 없는 경우 카드 최상단에 노출되는 빨간 띠- UNPAID 「광고비 미납으로 노출이 멈췄어요」- HIDDEN 「선박이 숨김 상태라 광고가 나가지 않아요」- NO_PRODUCT 「판매 중인 상품이 없어 광고가 나가지 않고 있어요」- OPS 「운영팀이 광고를 잠시 멈췄어요」- 복수 해당 시 위 순서 기준 하나만 노출
- 2광고·홍보 카드 — 광고 중정의: 선택 선박의 현재 계약이 집행 중·일시정지인 경우의 카드- 제목 「어바웃픽 A등급 · 광고 중」(일시정지 시 「· 일시정지」)- 본문 「이번 회차 노출 12,480회 · 광고로 들어온 예약 9건」 — 현재 회차 시작일부터 어제까지 집계- 우측 [자세히 ›] 또는 카드 전체 영역 탭 → SJ-90- 직원 계정에도 노출(조회 권한)
- 3광고·홍보 카드 — 그 밖의 상태정의: 광고 중이 아닌 경우 상태별 한 줄 카드- 계약 없음: 「우리 배 홍보, 맡겨 주세요」 + 「광고 자리·인스타그램·조황 업로드까지 월 {price_from.C}원부터」(업종별, 유어선 250,000) + [알아보기 ›]- 확인 중 「신청을 확인하고 있어요」- 대기 「자리 대기 N번째예요」- 입금 대기: 「입금을 기다리고 있어요 · 1. 27(수)까지」- 시작 예정: 「2. 1(월)에 광고가 시작돼요」- 모든 경우 탭 → SJ-90
버튼을 누르면 생기는 일
- 카드 탭 → SJ-90 (선택 선박 boat_idx 유지)
상태(빈 값·로딩·오류·권한)
- 로딩: 카드 영역에 회색 스켈레톤 72px 노출
- 오류: 카드 미노출(홈 나머지 영역은 유지)
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 노출 수 | #,##0회 | 12,480회 |
| 예약 | N건 | 9건 |
GET /ptn-m/ads/summary?boat_idx=선박별·기간별 정산 화면. 광고비를 정산금에서 차감하는 선주에게 차감 금액과 최종 지급액 노출. 차감 계약이 없는 선주는 변경 없음.
요소별 정의와 동작
- 1기간 정산 요약 「광고비 차감」정의: 조회 기간 내 정산 예정일 카드들의 광고비 차감(예정+확정) 합계- 판매금액 · 수수료 · 정산 금액(= 판매금액 − 수수료) 하단에 「광고비 차감 −275,000원」(빨강) 노출- 마지막 줄 「최종 지급액」 = 정산 금액 − 광고비 차감- 차감 0원 시 광고비 줄·최종 지급액 줄 미노출, 기존 화면과 동일
- 2[광고비 내역 ›]정의: 정산목록 제목 줄의 텍스트 버튼(엑셀 버튼 좌측)- 광고 계약 또는 단건 청구 이력이 한 번이라도 있으면 노출- 누르면 SJ-99
- 3정산목록 카드 「광고비 차감」정의: 정산 예정일 카드 단위로 표시되는 광고비 차감- 카드 줄: 지급 예정액(차감 전) · 광고비 차감(예정) · 최종 지급액(우측 상단 큰 숫자)- 예정액 배분: 정산 예정일이 이른 카드부터, 청구일이 이른 미수부터 지급 예정액 한도 내에서 순차 배분- 예: 미수 275,000원 → 1. 24 카드(지급 예정 485,550원) 차감 275,000원·최종 210,550원, 1. 31 카드 차감 0원(줄 미노출)- 지급 요청 후에는 「광고비 차감」 확정값 노출- 카드 하단 회색 문구 「예정 금액은 지급 시점에 확정돼요」(예정 상태인 경우에 한함)
버튼을 누르면 생기는 일
- [광고비 내역 ›] → SJ-99
- [상세 내역 보기] → 기존 정산 상세(변경 없음)
상태(빈 값·로딩·오류·권한)
- 차감 계약 없음: 기존 화면 유지
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 차감 | −#,##0원 | −275,000원 |
| 최종 지급액 | #,##0원 | 210,550원 |
확인된 문제
- 현행 정산 미노출 범위(선구매) 논의와 동일 화면이므로 함께 반영
결정 필요
D-15
GET /ptn/boats/{id}/settlements (필드 추가)선주 마이. 마케팅 수신알림 카드와 제휴업체 정보 사이에 메뉴 한 줄 추가.
요소별 정의와 동작
- 1「광고·홍보 관리」 메뉴정의: 광고·홍보 홈으로 이동하는 메뉴 행- 우측 상태 텍스트: 광고 중이면 「A등급 광고 중」(초록), 확인 중이면 「확인 중」(주황), 해당 없으면 빈 값- 탭 시 SJ-90 진입(마지막으로 선택한 선박 기준)
버튼을 누르면 생기는 일
- 메뉴 탭 → SJ-90
GET /ptn-m/ads/summary선박 1척의 광고·홍보 현황판. 계약 상태가 확인 중·대기·입금 대기·집행 예정·집행 중·일시정지인 계약이 있으면 이 화면, 없으면 SJ-90E 노출.
요소별 정의와 동작
- 1선박 선택정의: 업체 보유 선박 중 하나를 선택하는 드롭다운(홈과 동일 컴포넌트)- 디폴트(기본값) = 홈에서 마지막으로 선택한 선박- 변경 시 화면 전체를 해당 선박 기준으로 재조회- 선박이 1척이면 드롭다운 대신 선박명만 노출
- 2경고 띠정의: 광고 미노출 사유를 안내하는 빨간 띠- UNPAID 「광고비 1,320,000원이 미납되어 노출이 멈췄어요」 + [입금 안내 ›] → SJ-99- HIDDEN 「선박이 숨김 상태라 광고가 나가지 않아요」- NO_PRODUCT 「판매 중인 상품이 없어 광고가 나가지 않고 있어요」 + [상품 등록 ›] → 상품관리- OPS 「운영팀이 광고를 잠시 멈췄어요. 고객센터 02-722-0365」- 해당 없으면 미노출
- 3계약 카드정의: 현재 계약 1건 요약- 「어바웃픽 A등급」 + 상태 칩(광고 중·시작 예정·일시정지·확인 중·자리 대기·입금 대기, 색상은 공통 표 기준)- 기간 「2027. 1. 5 ~ 2027. 4. 4」 · 「2회차 (2. 5 ~ 3. 4)」- 월 금액 「월 600,000원 (부가세 별도)」 · 결제 「정산금에서 차감」- 다음 계약이 있으면 하단 회색 줄 「다음 계약 B등급 · 4. 5 시작 예정」 노출- 카드 탭 → SJ-94
- 4이번 회차 성과정의: 현재 회차 시작일부터 어제까지 집계한 광고 성과- 노출 · 클릭 · 광고로 들어온 예약 · 결제액 4칸(결제액은 칸 폭 제약으로 만원 단위 표기, 만 미만 절사: 「135만원」)- 하단 「광고비 대비 결제액 6.2배」 — 결제액 ÷ 회차 광고비(일할)- 우측 상단 「1. 19(화)까지 집계」- 집행 전(시작 예정·확인 중)이면 영역 대신 「광고가 시작되면 성과가 여기에 보여요」 노출- [성과 자세히 ›] → SJ-95
- 5이번 회차 홍보 이용권정의: 현재 회차에 사용 가능한 등급 포함 작업 수- 행 = 작업명 · 「1 / 2건 사용」 · [맡기기]- 남은 이용권이 0이면 [맡기기] 대신 「다 썼어요」 노출- [맡기기] → 확인 팝업(제목 「인스타그램 게시 1건을 맡길까요?」 · 본문 「이용권 1건이 쓰여요.」 · 풀폭 [맡기기] · 텍스트 [취소]) → 작업 생성 → SJ-97- C등급은 조황 업로드 대행만 노출- 직원 계정은 [맡기기] 미노출
- 6진행 중인 작업정의: 완료·취소 상태가 아닌 작업 최대 3건- 행 = 작업명 · 상태 칩 · 「1. 12(화)까지」- 선주 할 일이 있는 작업(자료 요청·선주 확인)을 최상단에 정렬, 빨간 점 표시- [전체 보기 ›] → SJ-96- 없으면 「진행 중인 작업이 없어요」
- 7홍보 상품 배너정의: 등급 미포함 단건 홍보 상품으로 이동하는 띠- 2단계 오픈(1단계 미노출): 「메타·네이버 광고 대행, 블로그 체험도 맡길 수 있어요」 [홍보 상품 보기 ›] → SJ-98
- 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. D | 2027. 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 /ptn-m/ads/summaryPOST /ptn-m/ads/service-orders광고 계약이 없는 선박의 광고·홍보 홈. 1단계는 상품 소개·가격 공개와 [상담 요청]만 제공. 계약은 영업 담당자가 대면 설명 후 어드민에서 대리 등록(D-26). 앱 신청 흐름(SJ-91~93)은 2단계.
요소별 정의와 동작
- 1선박 선택정의: SJ-90과 동일한 드롭다운- 선박별 계약 상태가 다르므로 변경 시 SJ-90/SJ-90E가 전환될 수 있음
- 2소개 머리정의: 어바웃픽 한 줄 소개- 제목 「빈자리, 광고로 채워 보세요」- 부제 「고객웹 12곳 광고 자리 · SNS 홍보 · 운영 지원을 한 번에 맡기는 월 정액 상품이에요」
- 3고객에게 이렇게 보여요정의: 광고 노출 형태 예시 3줄(디자이너 광고 컴포넌트 이름 + 예시 문구 + AD 표시)- 「새소식 홈 · 가로 배너」 「1. 22(금) 파고 0.5m, 영흥도 진두항 바다로 나가요」- 「검색 결과 · 추천리스트 상자」 「주꾸미 | 남항부두 | 1. 22 3석」 머리 줄 하단 선박 카드- 「출조 탭 · 인기 선박 모음 모듈」 「이번 주 남은 자리」 날짜 탭 + 선박 카드- 부제 「등급과 관계없이 같은 모양으로 나가고, 등급이 오를수록 나가는 자리가 늘어나요」
- 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[상담 요청]정의: 하단 고정 주 버튼- 탭 시 확인 팝업 「영업 담당자가 1영업일 안에 전화드릴게요」 [요청하기][닫기] → 상담 요청 접수 → 토스트 「상담을 요청했어요」, 버튼 「상담 요청됨」 비활성(딤 처리)- 직원 계정은 「대표 계정으로 요청할 수 있어요」 회색 문구로 대체
- 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/summaryPOST /ptn-m/ads/consults등급 비교 화면. 금액은 선박 업종(유어선·유선)에 맞춰 서버가 내려 준 값만 노출.
요소별 정의와 동작
- 1선박 줄정의: 신청 대상 선박과 업종·지역- 「왕감자호 · 유어선 · 인천」- 업종 기준 안내 ⓘ: 「최대 탑승 22명 이상이면 유선 요금이 적용돼요」
- 2약정 기간 칩정의: 1·3·6·9·12개월 중 하나- 디폴트 3개월- 변경 시 하단 세 카드 금액 변경- 할인이 있는 칩 하단에 작은 글씨 「최대 25%」(해당 업종 A 기준)
- 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등급 카드 B·C정의: B·C등급 카드(구성은 A와 동일)- B: 광고 지면 11곳(「이번 주 함께하는 배」 제외) · 인스타 1건 · 카카오 1칸 · 조황 4건 · 상품·일정 등록 대행 1회 · 네이버 광고 대행 수수료 무료 · 메타 광고 대행 3회차마다 1건 수수료 무료 · 소개 정비 · 사진 촬영·블로그 체험 1건(12개월)- C: 광고 지면 6곳(남은 자리 · 검색 3곳 · 선박 상세 2곳) · 조황 2건 · 네이버 광고 대행 수수료 50% · 소개 정비- 자리 마감 등급의 버튼은 [대기 신청] (흰 바탕)
- 5본전 계산 줄정의: 선박 최저가로 계산한 참고 문장- 「1인 90,000원 상품이면 A등급은 한 달에 7석을 더 팔면 광고비만큼이에요」 = ceil(월 금액 ÷ 최저 1인 요금)- 최저가가 없으면 미노출
- 6광고 자리 예시정의: 화면 5곳(새소식 홈·출조 탭·검색·지도·선박 상세)의 광고 예시를 펼쳐 확인하는 아코디언 영역- 디폴트 접힘 「광고는 이렇게 나가요 ⌄」- 펼침 시 지면별 작은 그림 + 한 줄 설명 노출
- 7유의사항정의: 가격·노출 원칙- 가격은 모두 부가세 별도, 이 화면에 공개된 금액 그대로 청구- 광고 지면 노출 순서는 등급 순, 동일 등급 내에서는 무작위- 광고 정책·가격 변경 시 30일 전 사전 고지, 기존 계약은 종료 시까지 기존 조건 유지- 판매 중인 상품이 없는 날은 광고 미노출
버튼을 누르면 생기는 일
- [A/B/C등급 신청] → SJ-92 (grade, months 전달)
- [대기 신청] → SJ-92 (동일 화면, 완료 시 대기로 접수)
상태(빈 값·로딩·오류·권한)
- 로딩: 카드 스켈레톤 3장
- 선박 노출안함: 상단 경고 「선박이 숨김 상태예요. 노출로 바꾼 뒤 신청해 주세요」, 버튼 비활성
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 월 금액 | 월 #,##0원 (부가세 별도) | 월 450,000원 (부가세 별도) |
| 할인 | N% 할인 | 25% 할인 |
| 남은 자리 | {지역} {등급}등급 N자리 남음 | 인천 A등급 2자리 남음 |
결정 필요
D-02 · D-08
GET /ptn-m/ads/plans?boat_idx=광고 계약 신청 입력 화면. 대표 계정만 진입 가능(직원은 안내 후 뒤로 이동).
요소별 정의와 동작
- 1신청 내용 요약정의: 선박·등급(변경 가능)- 「왕감자호 · A등급」 + [등급 바꾸기] → SJ-91로 복귀(입력값 미유지)
- 2약정 기간정의: 1·3·6·9·12개월 칩- SJ-91에서 선택한 값이 디폴트- 변경 시 금액 요약 즉시 갱신
- 3시작일정의: 광고 시작일- 달력 바텀시트에서 선택- 선택 가능한 첫날 = min_start_date(신청일 + 2영업일)- 기본값 = min_start_date- 안내 「운영팀 확인이 늦어지면 승인 다음 날 시작으로 바뀔 수 있어요」
- 4결제 방법정의: 광고비 결제 방법- (•) 정산금에서 차감 — 「매 회차 광고비를 정산금 지급 때 빼고 드려요」- ( ) 계좌로 입금 — 하위 선택 [매월 입금] [한 번에 입금]- 정산정보가 없으면 정산 차감 비활성 + 「정산정보가 없어 계좌 입금만 고를 수 있어요」 노출- 한 번에 입금은 약정 총액을 승인 후 7일 이내 입금
- 5금액 요약정의: 서버 계산 금액- 월 금액(부가세 별도) 450,000원- 부가세 45,000원- 매월 청구 금액(부가세 포함) 495,000원- 약정 총액(부가세 포함) 5,940,000원 — 한 번에 입금 시 이 금액 1회 청구- 할인으로 아낀 금액 1,800,000원(부가세 별도)- 종료일 「2028. 1. 4까지」
- 6세금계산서 이메일정의: 광고비 세금계산서 수신 이메일- 디폴트 = 제휴업체 정보 이메일- 형식 오류 시 「이메일 형식을 확인해 주세요」 노출
- 7동의정의: 필수 동의 2개- [필수] 광고 서비스 이용약관 동의 [보기] → 약관 바텀시트- [필수] 광고비를 정산금에서 차감하는 것에 동의 — 정산 차감 선택 시에 한해 노출- 전체 체크 시 신청 버튼 활성
- 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
GET /ptn-m/ads/plans?grade=&months=&start_date=&billing_type= (quote — 값이 바뀔 때마다)POST /ptn-m/ads/contracts신청 직전 확인 모달(중앙, 폭 293). 문구는 결제 방법에 따라 변경.
요소별 정의와 동작
- 1제목정의: 「이대로 신청할까요?」(좌측 정렬)
- 2본문정의: 신청 조건 3줄- 「A등급 · 12개월 · 2027. 1. 5 시작」- 정산 차감: 「매월 495,000원(부가세 포함)을 정산금에서 차감해요」 / 계좌: 「승인되면 입금 안내를 알림톡으로 보내 드려요」- 「운영팀이 1영업일 안에 확인한 뒤 시작돼요」
- 3[신청] · [취소]정의: 파란 [신청] 풀폭 + 하단 텍스트 [취소]- [신청] → 요청 → 성공 시 SJ-93- [취소] → 닫기, 입력값 유지
버튼을 누르면 생기는 일
- [신청] → POST contracts
- [취소] → 닫기
신청 결과 화면. 확인 중·대기 두 가지 결과 노출.
요소별 정의와 동작
- 1결과 머리정의: 결과 아이콘과 제목- 확인 중: 「신청을 받았어요」 · 「운영팀이 1영업일 안에 확인하고 알림톡으로 알려 드려요」- 대기: 「자리 대기 1번째로 신청했어요」 · 「인천 A등급 자리가 생기면 순서대로 확인해 드려요」
- 2신청 요약정의: 계약 번호·선박·등급·기간·결제 방법·금액- 계약 번호 ADC-202701-0012 · 「매월 495,000원(부가세 포함) · 정산금에서 차감」
- 3[광고·홍보 홈으로]정의: 주 버튼- 탭 시 SJ-90 진입(뒤로가기 시 SJ-92로 이동하지 않고 SJ-90 진입)
버튼을 누르면 생기는 일
- [광고·홍보 홈으로] → SJ-90 (히스토리 교체)
GET /ptn-m/ads/contracts/{id}계약 1건 상세. 상태에 따라 안내문과 하단 버튼 변경.
요소별 정의와 동작
- 1상태 머리정의: 상태 칩 + 계약 번호 + 상태 안내문- 확인 중 「운영팀이 확인하고 있어요. 1영업일 안에 알려 드려요」- 대기 「자리 대기 2번째예요」- 입금 대기: 「1. 12(화)까지 495,000원을 입금해 주세요」 + [입금 안내 ›]- 집행 예정: 「1. 5(화)에 시작해요」- 광고 중: 「2028. 1. 4까지 광고가 나가요」(해지일 확정 시 「2. 3(수)에 해지돼요」)- 일시정지: 「광고비 미납으로 멈췄어요」(원인별)- 반려 「진행하지 못했어요 · 사유: 판매 중인 상품이 없음」- 종료·해지·신청 취소: 「종료된 계약이에요」
- 2계약 정보정의: 계약 조건 표- 선박 · 업종 · 지역 · 등급 · 약정 · 기간(프로모션 일수 포함 시 「+30일 무료」) · 월 금액(부가세 별도) · 결제 방법 · 세금계산서 이메일
- 3회차정의: 회차별 기간과 청구 상태- 행 = 「2회차 2. 5 ~ 3. 4」 · 청구 금액(부가세 포함) · 상태 칩(공통 청구 상태 표: 예정·미수·일부 회수·완납·취소)- 4회차까지 노출, 나머지는 「외 N회차」- 탭 → SJ-99(해당 청구 위치로 스크롤)
- 4성과 바로가기정의: 광고 중·종료 계약에 한해 노출- 「광고로 들어온 예약 9건 · 6.2배」 [성과 보기 ›] → SJ-95
- 5이력정의: 상태 변경 기록 최신순- 「1. 3(일) 14:20 승인」 「1. 2(토) 09:11 신청」 — 처리자 이름 미노출
- 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:mm | 1. 3(일) 14:20 |
결정 필요
D-10
GET /ptn-m/ads/contracts/{id}POST /ptn-m/ads/contracts/{id}/cancel바텀시트. 선주는 요청만 하고 실제 처리는 운영팀 담당.
요소별 정의와 동작
- 1요청 유형정의: 라디오 3개- 연장 「지금 계약이 끝난 다음 날부터 같은 등급으로 이어 가요」- 등급 변경 「다음 회차부터 등급을 바꿔요」 → 등급 선택 칩 A·B·C(현재 등급 제외). 일시 결제 계약이면 이 항목 미노출- 해지 문의 「운영팀이 전화로 정산 금액을 안내한 뒤 처리해요」
- 2남길 말정의: 선택 입력 0~300자- placeholder 「통화 가능한 시간 등을 적어 주세요」
- 3[보내기]정의: 주 버튼- 탭 시 요청 → 바텀시트 닫힘 → 토스트 「요청을 보냈어요. 운영팀이 연락드릴게요」- 동일 유형 처리 중이면 서버 AD4099 → 얼럿 「이미 보낸 요청을 확인하고 있어요」
버튼을 누르면 생기는 일
- [보내기] → POST requests
결정 필요
D-10
POST /ptn-m/ads/contracts/{id}/requests계약 1건의 광고 성과. 원천은 자체 집계, 어제까지 반영.
요소별 정의와 동작
- 1기간 탭정의: 이번 회차 · 지난 회차 · 전체 기간- period = cycle · prev_cycle · all(group=month)- 디폴트 이번 회차- 아래 「1. 19(화)까지 집계」- 전체 기간이 92일 초과 시 그래프·표를 월별로 집계
- 2요약정의: 4칸 + 배수- 노출 12,480회 · 클릭 612회(클릭률 4.9%) · 광고로 들어온 예약 9건 · 결제액 1,350,000원- 「광고비 217,741원 대비 6.2배」(광고비 = 기간 일할 공급가액: 450,000 × 15 ÷ 31)- 취소 건이 있으면 「취소 1건 제외」 회색 글씨 노출
- 3일별 그래프정의: 날짜별 클릭(막대)과 예약(점)- 가로 스크롤, 최대 92일- 데이터 0이면 「아직 집계된 성과가 없어요」 노출
- 4광고 자리별정의: 지면별 표- 행 = 화면 묶음 5개: 새소식 홈(P6·P7·P8) · 출조 탭(P1·P2·P3) · 검색(P4·P12·P13) · 지도(P14) · 선박 상세(P5·P17)- 열 = 노출 · 클릭 · 예약- 행 탭 시 해당 묶음의 지면별 줄 펼침- 등급 미포함 지면은 줄 미노출
- 5광고로 들어온 예약정의: 귀속된 예약 목록 20건 단위 노출- 행 = 「1. 14(목) 결제 · 김*수 · 2명 · 180,000원 · 검색」- 취소된 예약은 회색 + 「취소」 칩 표시- [더 보기]
- 6다음 달로 넘어간 작업정의: 회사 사정으로 이월된 이용권- 해당 시에 한해 노출: 「인스타그램 게시 1건이 다음 회차로 넘어갔어요」
- 7집계 기준정의: 지표 정의 안내(접힘)- 노출: 광고 영역이 화면에 절반 이상, 1초 초과 노출된 경우 한 번으로 집계- 광고로 들어온 예약: 광고를 탭한 고객이 7일 이내 결제한 예약- 결제액: 쿠폰 할인 적용 후 실제 결제 금액- 취소된 예약은 집계에서 제외
버튼을 누르면 생기는 일
- [더 보기] → 다음 20건
상태(빈 값·로딩·오류·권한)
- 집행 전 계약: 「광고가 시작되면 성과가 여기에 보여요」
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 클릭률 | N.N% | 4.9% |
| 예약자 | 성*이름 | 김*수 |
결정 필요
D-17
GET /ptn-m/ads/contracts/{id}/stats?period=cycle|prev_cycle|all|custom&group=day|placement|month (전체 기간 = all + month)GET /ptn-m/ads/contracts/{id}/conversions선박 1척의 홍보·운영 작업 목록.
요소별 정의와 동작
- 1남은 이용권정의: 이번 회차 남은 등급 이용권 칩- 칩 = 「인스타 게시 1」「릴스 1」「카카오 소식 1」「조황 업로드 5」- 칩 탭 → SJ-90과 동일한 확인 팝업 → 작업 생성- 등급 계약이 없으면 영역 미노출
- 2탭정의: 진행 중 N · 완료 N- 진행 중 = 접수·자료 요청·제작 중·선주 확인·게시 준비- 완료 = 완료·취소
- 3작업 카드정의: 작업 1건- 작업명 · 출처 칩(「이용권」 회색 / 「단건 50,000원」 회색)- 상태 칩: 접수됨(회색) · 자료를 올려 주세요(빨강) · 만드는 중(파랑) · 확인해 주세요(빨강) · 게시 준비 중(파랑) · 완료(초록) · 취소됨(회색)- 보류: 정산 차감 단건 미수 21일 경과 시 상태 칩 옆 「광고비 확인 필요」(빨강 글자)- 하단 줄: 자료 요청 「1. 12(화)까지 자료를 올려 주세요」 / 선주 확인 「1. 8(금) 14:30까지 확인해 주세요」 / 사진 촬영 「촬영일 1. 15(금)」- 카드 탭 → SJ-97
- 4[홍보 상품 더 보기]정의: 하단 보조 버튼- 2단계 오픈(1단계 미노출) → SJ-98
버튼을 누르면 생기는 일
- 작업 카드 → SJ-97
- 칩 → 확인 팝업 → POST service-orders
- [홍보 상품 더 보기] → SJ-98
상태(빈 값·로딩·오류·권한)
- 빈 상태: 「맡긴 작업이 없어요」(1단계는 [홍보 상품 보기] 미노출, 2단계 오픈)
결정 필요
D-11
GET /ptn-m/ads/service-orders작업 1건 상세. 상태에 따라 중앙 영역(자료 올리기 / 결과 확인 / 완료) 변경.
요소별 정의와 동작
- 1진행 단계정의: 상품별 단계 막대(최대 접수 → 자료 → 제작 → 확인 → 게시 준비 → 완료)- 상품별 단계는 4.1 표 기준(자료 요청·선주 확인이 없는 상품은 해당 칸 미노출)- 현재 단계 파랑, 지난 단계 연파랑- 취소 시 막대 대신 「취소됨 · 자료가 기한 안에 오지 않았어요」(사유별 문구) 노출
- 2작업 정보정의: 작업명·출처·신청일·예정일- 「인스타그램 게시 · 이용권 · 1. 5(화) 신청」- 결과 예정 「자료를 받고 5영업일 안」- 사진 촬영은 「촬영일 1. 15(금) 10:00 · 장소 인천 연안부두」
- 3자료 올리기정의: 자료 요청 상태에서만 노출되는 입력 영역- 운영팀 요청 문구 박스 「선상 사진 3~5장과 이번 달 주력 어종을 알려 주세요」- 사진 추가(최대 20장, 장당 20MB, jpg·png·heic) · 영상 추가(1개, 300MB, mp4·mov)- 파일별 진행률 막대, 실패 시 「다시 올리기」 노출- 메모 0~500자- [자료 보내기] — 파일 1개 이상 또는 메모 1자 이상이면 활성- 업로드 중 뒤로가기 → 확인 팝업 「올리는 중인 자료가 있어요. 나갈까요?」
- 4결과 확인정의: 선주 확인 상태에서 노출되는 결과물- 이미지 캐러셀 또는 영상, 게시 문구 미리보기(첫 줄 「광고」 강조)- 안내 「SNS 게시물 첫 줄에는 법에 따라 '광고' 표시가 들어가요」- 기한 「1. 8(금) 14:30까지 답이 없으면 그대로 진행해요」(review_due_at)
- 5확인 버튼정의: 선주 확인 상태의 두 버튼- [수정 요청] → SJ-97R (이미 1번 요청한 경우 비활성 + 「수정 요청은 1번만 할 수 있어요」)- [이대로 올려 주세요] → 확인 팝업(「이대로 진행할까요?」 · 풀폭 [진행] · 텍스트 [취소]) → 토스트 「진행을 요청했어요」 → 상태 「게시 준비 중」(운영자 게시 후 완료 처리)
- 6완료 결과정의: 게시 준비·완료 상태의 안내와 결과 링크- 게시 준비: 「운영팀이 게시하고 있어요」(카카오 소식은 「1. 28(목) 10시에 발송돼요」)- 완료: [게시물 보기] 외부 링크 / 조황은 [조황관리에서 보기] → SJ-40- 메타 광고 대행: 집행 금액 · 노출 · 클릭 · 선박 상세 방문 표 (운영자 입력값, 「메타 광고 관리자 기준」)
버튼을 누르면 생기는 일
- [자료 보내기] → 서명 URL 업로드 → POST materials → 토스트 「자료를 보냈어요」 → 상태 제작 중으로 변경
- [이대로 올려 주세요] → POST approve
- [수정 요청] → SJ-97R
상태(빈 값·로딩·오류·권한)
- 직원 계정: 자료 올리기만 가능, 확인 버튼 미노출
- 오류: 업로드 실패 파일에 한해 빨간 테두리 표시
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 기한 | M. D(요일) HH:mm까지 | 1. 8(금) 14:30까지 |
GET /ptn-m/ads/service-orders/{id}POST upload-urlsPOST materialsPOST approve바텀시트. 수정 요청은 작업별 무료 1회.
요소별 정의와 동작
- 1입력정의: 「무엇을 고칠까요?」 10~500자- 10자 미만 시 버튼 비활성 + 「10자 이상 적어 주세요」 노출- 안내 「수정 요청은 1번 할 수 있어요」
- 2[보내기]정의: 주 버튼- → 바텀시트 닫힘 → 토스트 「수정을 요청했어요」 → 상태 만드는 중으로 변경- AD4095 → 얼럿 「수정 요청은 1번만 할 수 있어요」
버튼을 누르면 생기는 일
- [보내기] → POST revision
POST /ptn-m/ads/service-orders/{id}/revision단건 홍보·운영 상품 목록과 신청 바텀시트. 가격 전체 공개.
요소별 정의와 동작
- 1상품 목록정의: SNS 홍보 · 광고 대행 · 운영 지원 세 묶음 카드- 카드 = 상품명 · 한 줄 설명 · 「50,000원 (부가세 별도)」 · 소요 「자료 받은 뒤 5영업일」- 이번 회차 남은 이용권이 있으면 「이용권 1건 있음」 칩 노출(탭 시 이용권으로 맡기기)- 월 처리 마감 시 카드 딤 처리 + 「이번 달 접수 마감」- 유튜브 체험 영상은 「상담 후 견적」 노출- 광고 대행 묶음 = 메타 광고 집행 대행(S4) · 네이버 키워드광고 대행(S7, 「월 광고비 + 수수료 15%」), 운영 지원 묶음에 상품·출조 일정 등록 대행(O4, 30,000원)- 계약 등급 혜택이 있으면 카드에 「A등급 수수료 무료」 칩 노출
- 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상담 신청(유튜브)정의: 상담 신청 바텀시트- 연락 가능한 시간(2~50자) · 원하는 내용(0~500자)- [상담 신청] → POST consults → 토스트 「상담을 신청했어요. 운영팀이 연락드릴게요」
버튼을 누르면 생기는 일
- [신청하기] → POST service-orders source=B
- AD4093 → 얼럿 「이번 달 접수가 마감됐어요. 다음 달 1일부터 신청할 수 있어요」
상태(빈 값·로딩·오류·권한)
- 직원 계정: [신청하기] 미노출
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 가격 | #,##0원 (부가세 별도) | 50,000원 (부가세 별도) |
결정 필요
D-12 · D-13 · D-21
GET /ptn-m/ads/service-itemsPOST /ptn-m/ads/service-ordersPOST /ptn-m/ads/consults선박 1척의 광고비 청구 원장. 모든 금액은 부가세 포함 기준으로 노출.
요소별 정의와 동작
- 1미수 요약정의: 현재 남은 미수와 다음 청구- 「미수 660,000원」(0이면 「미수 없음」 초록)- 「다음 청구 2. 5(금) · 495,000원」- 미수가 있으면 [계좌로 입금하기 ⌄] 펼침: 은행·계좌번호·예금주 「주식회사 어바웃피싱」·입금자명 「왕감자호0012」(선박명+계약번호 끝 4자리) + [계좌번호 복사] → 토스트 「계좌번호를 복사했어요」
- 2필터정의: 전체 · 미수 · 완납- 디폴트 전체
- 3환급 줄정의: 해지·입금 확인 시 발생한 환급- 청구 카드 하단 「환급 154,356원 (부가세 포함) · 다음 지급 때」(대기, 다음 지급 때) / 「환급 154,356원 (부가세 포함) · 계좌로 보낼 예정」(대기, 계좌) / 「환급 154,356원 (부가세 포함) · 1. 31 지급에 포함」(적용, payout_date) / 「환급 154,356원 (부가세 포함) · 계좌로 2. 3 보냄」(완료)- 환급 줄은 응답 invoice_idx의 청구 카드 하단, 없으면 목록 최상단- 응답 refunds[]의 total(부가세 포함)
- 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
GET /ptn-m/ads/invoices고객웹
8월통합 새소식 홈 구성 유지. 광고는 디자이너 제작 컴포넌트만 사용. 바로가기 하단 「실시간 조황」과 동일한 조황 카드 모듈(P8), D-day 카드 슬롯에 Card/Horizontal-banner 배너(P7), 이벤트 상단 기존 AD 배너 지면에 동일 배너(P6). 광고 표시는 AD 표시(AD-mark) 컴포넌트 사용.
요소별 정의와 동작
- 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 노출 순서 기준(디폴트(기본값) = 바로가기 바로 하단)
- 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 카드 노출- 맞춤 광고 꺼짐 시 미노출
- 3P6 이 바다로 나가는 배정의: 디자이너 제작 새소식 AD 배너 지면(이벤트 상단)의 Card/Horizontal-banner Box- 날씨 카드 장소(예: 영흥도) → 지역(9지역)의 A·B 광고 선박 1척(등급 순 기준 조건 충족 첫 선박)- 향후 5일 중 지역 예보 일 최대 파고 1.5m 이하이면서 예약 가능한 날 중 파고 최저일(동일 시 이른 날)- 배너 = 제목 두 줄 「1. 22(금) 파고 0.5m, / 영흥도 진두항 바다로 나가요」 · 보조 줄 「인천 황금어장호 ›」 · AD 표시- 파고 1.5m 초과일만 있는 경우 해당 지면 미노출(빈 영역 처리)- 날씨 카드 장소 변경 시 재선정- 탭 시 선박 상세 + 해당 날짜로 진입
- 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
POST /usr/ads/slots (placements=P6·P7·P8)POST /usr/ads/events8월통합 출조 홈 구성 유지. 광고 섹션 유형 015·016·017이 P1·P2·P3을 렌더링. 세 모듈 모두 「인기 선박 모음」 모듈 그대로 복제(제목 16 Bold · 텍스트 탭 14.5 · Card/Ship/Common · [더보기]). 차이점은 제목 우측 AD 표시 하나.
요소별 정의와 동작
- 1P1 이번 주 함께하는 배정의: 지역 탭 + Card/Ship/Common 177 가로 스크롤 + [더보기]- 제목 = 전시관리 입력값(디폴트(기본값) 「이번 주 함께하는 배」) + 우측 AD 표시- 지역 탭: A 계약 선박 보유 지역에 한함. 위치 동의 시 가까운 지역 우선, 맞춤 광고 켬 + 로그인인 경우 최근 1년 예약 지역 최상단 정렬- 카드 = 「인기 선박 모음」 카드와 동일(사진 · 선박명 · 지역 거리 · 가격 · 어종 배지 · 할인쿠폰)- 카드 탭 → 선박 상세
- 2P2 이번 주 남은 자리정의: 날짜 탭 + Card/Ship/Common 177(상품 줄 켬) + [더보기]- 날짜 탭 「1월 21일(목)」… 내일부터 5일, 선박 없는 날짜 탭은 미노출- 카드 = Card/Ship/Common의 상품 줄 「주꾸미 종일 1부 · 6물」 + Badge/Seats left 「잔여 3석」. 물때는 위치 동의 시 가까운 지역 표기법(부록 B) 적용, 미동의 시 물때 제외- 상품 = 당일 잔여 1~5석 상품 중 출항 시각 가장 이른 상품- 카드 탭 → 선박 상세 + 해당 날짜- 전체 날짜 공란 시 모듈 미노출
- 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
POST /usr/ads/slots (placements=P1·P2·P3)POST /usr/ads/events8월통합 통합검색 첫 화면 구성 유지. 디자이너 제작 통합검색 AD 배너 지면(「지금 인기있는 선박」 하단)에 Card/Horizontal-banner Box 1장 추가. 검색어 입력 시작 시 미노출.
요소별 정의와 동작
- 1P12 지금 예약 열린 배정의: Card/Horizontal-banner Box 361×96, 1장- 배너 = 사진 68 · 제목 두 줄 「지금 예약 열린 배, / 1. 21(목) 3석 남았어요」 · 보조 줄 「인천 왕감자호 ›」 · AD 표시- 위치 동의 시 가까운 지역, 미동의 시 전국의 A·B·C 광고 선박(내일부터 14일 내 예약 가능) 중 등급 순 첫 선박- 배너 탭 → 선박 상세 + 해당 날짜
- 2그대로 두는 것정의: 최근 검색어 · 실시간 검색순위 · 검색 전시 섹션 · 지금 인기있는 선박(정렬 탭)- 「지금 인기있는 선박」 목록·정렬은 광고와 무관- 광고 선박의 「인기」 목록 추가·제외 없음
버튼을 누르면 생기는 일
- 배너 탭 → ?boat={id}&resDt=
- AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
- 검색어 입력 시작 → 배너 미노출(자동완성 화면 광고 미노출)
- 서빙 API 실패: 배너 지면 미노출
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| P12 제목 | 지금 예약 열린 배, / M. D(요일) N석 남았어요 | 지금 예약 열린 배, / 1. 21(목) 3석 남았어요 |
결정 필요
D-27 · D-36
POST /usr/ads/slots (placements=P12)8월통합 검색결과 화면. 일반 결과는 기존 검색 API 그대로 사용, 광고로 인한 개수·순서 변경 없음. 광고는 디자이너 제작 [광고]추천리스트 컴포넌트 그대로 사용(회색 박스 · 키워드 헤더 줄 · AD 표시 · 검색결과 카드 · 「예약 가능 상품 N건」).
요소별 정의와 동작
- 1결과 수정의: 「17건의 검색 결과」- 일반 결과 수만 집계(광고 박스 제외)- 정렬(가까운순 등)은 일반 목록에만 적용
- 2P4 이 조건으로 나가는 배정의: 목록 상단 [광고]추천리스트, 최대 3박스- 박스 = 배경 #F8F8F8 · 모서리 4 · 헤더 줄 키워드 3개 「주꾸미 | 연안부두 | 1. 22(금) 5석」(14 SemiBold, 구분 세로선) + 우측 AD 표시- 카드 = 기존 검색결과 카드(선박명 17 · 지역 거리 · 가격 · 어종 태그 · 할인쿠폰 · 사진 98)- 하단 「예약 가능 상품 N건 ⌄」 → 펼침 시 당일 상품 줄 노출- 검색 조건(검색어·날짜·인원·지역·어종) 충족 A·B·C 광고 선박, 등급 순 → 세션 해시 정렬- 광고 선박도 일반 목록 내 기존 위치에 그대로 노출(AD 미노출)- 검색 응답 수신 후 P4 응답 최대 300ms 추가 대기 후 함께 렌더링. 이후 수신된 P4 응답은 폐기
- 3일반 결과정의: 기존 검색결과 목록- 변경 없음
- 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(변경 없음)POST /usr/ads/slots (placements=P4)일반 결과 5건 미만이고 날짜가 있으면 POST /usr/ads/slots (placements=P13) — 2번 제한은 따로 센다8월통합 탐색 지도 선박 레이어에 광고 선박 사진 마커(P14) 추가. 마커는 기존 지도 마커와 동일한 흰색 알약 형태, 탭 시 기존 「선박 정보」 바텀시트(Card/List 줄) 오픈.
요소별 정의와 동작
- 1P14 사진 마커정의: 흰색 알약 마커 높이 28: 선박 사진 원 22 · 선박명 11 Bold · 「+N」 · AD 표시- 지도 화면(bbox) 내 A·B 광고 선박 항구에 최대 3개- 마커 위치 = 선박 항구 좌표, 동일 항구 광고 선박 복수인 경우 마커 1개에 「+1」 표기- 노출 집계는 마커 노출 시 대표 선박 1건, 나머지는 시트 행 노출 시- 지도 이동·확대 시 재선정(500ms 정지 후)- 기존 항구 마커와 겹치는 경우 사진 마커 상단 배치
- 2선박 정보 시트정의: 마커 탭 시 노출되는 기존 「선박 정보」 바텀시트- 헤더 「선박 정보」 18 Bold + AD 표시 + ×- 행 = Card/List 그대로(사진 114 · 선박명 · 지역 거리 · 가격 · 상품 줄 + 잔여석 · 어종 배지 · 할인쿠폰), 해당 항구 광고 선박 전체 노출- 행 탭 → 선박 상세- × 또는 지도 빈 영역 탭 → 바텀시트 닫힘
- 3그대로 두는 것정의: 레이어 칩(포인트·선박·조황·CCTV·낚시용품점) · 기존 항구 마커 · 하단 탭- 타 레이어에는 사진 마커 미노출- CCTV·물때·날씨 화면 가림 없음
버튼을 누르면 생기는 일
- 마커 탭 → 선박 정보 바텀시트
- 시트 행 탭 → ?boat={id}
- AD 표시 → &sheet=ad-info
상태(빈 값·로딩·오류·권한)
- 서빙 API 실패: 마커만 미노출
- 항구 좌표 없는 선박 제외
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 묶음 표시 | +N | +1 |
결정 필요
D-27 · D-36
POST /usr/ads/slots (placements=P14)8월통합 선박 상세 구성 유지. 광고 지면 두 곳 추가. 예약 달력에서 전 상품 마감 날짜 선택 시 날짜 헤더 하단 Card/Horizontal-banner 배너(P17 → CW-59), 상품 목록 하단 선박상세 모듈(「최신 조황」과 동일 헤더) 「같은 항구에서 나가는 배」(P5). 「이런 곳은 어때요?」는 변경 없음.
요소별 정의와 동작
- 1예약 달력 날짜 선택정의: resDt(YYYY-MM-DD)로 진입한 경우의 달력- 해당 날짜 선택 상태로 달력 오픈, 당일 상품 카드까지 스크롤- 전 상품 마감 날짜는 숫자 하단 「마감」(10 회색) 표기- 전달받은 날짜가 오늘 이전이거나 형식 오류인 경우 무시하고 기존 동작 유지
- 2P17 같은 바다로 나가는 배정의: 선택 날짜 전 상품 마감 또는 「전화 예약」 선박인 경우, 날짜 헤더 하단 Card/Horizontal-banner Box- 날짜 선택 시점에 당일 출항 광고 선박 한 번 조회(CW-59에서 해당 결과 재사용)- 배너 = 제목 두 줄 「1월 22일(금)은 마감됐어요 / 같은 바다로 나가는 배가 있어요」 · 보조 줄 「인천 4척 보기 ›」 · 사진 = 첫 광고 선박 · AD 표시 → 탭 시 CW-59 진입- 전화 예약 선박(전화 예약 구분 값 [확인 필요: 필드명])은 첫 줄 「이 배는 전화로 예약해요」 노출- 동일 지역 광고 선박 0척 시 AD 미포함 동일 배너 「이날 출항하는 배를 볼까요? / 이날 출항하는 배 모두 보기 ›」 노출(일반 검색)
- 3P5 같은 항구에서 나가는 배정의: 상품 목록 하단 모듈. 헤더 = 선박상세 「최신 조황」과 동일(17 SemiBold · 좌우 20) + AD 표시, Card/Ship/Common Small 115 가로 스크롤, 최대 3- 제목 「같은 항구에서 나가는 배」(동일 항구 0척 시 「같은 바다에서 나가는 배」)- 동일 항구 A·B·C 광고 선박(현재 선박 제외), 3슬롯 미충족 시 동일 지역으로 보충- 카드 = 「찜한 선박」과 동일한 Small 카드(사진 115 · 선박명 · 지역 거리 · 가격 · 어종 · 할인쿠폰)
- 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
POST /usr/ads/slots (placements=P5)POST /usr/ads/slots (placements=P17, ctx boat_idx·date)기존 「선박 정보」 바텀시트와 동일 구성(핸들 · 제목 18 Bold · × · Card/List 줄). 선택 날짜에 동일 지역 잔여석 있는 광고 선박 노출, 광고 외 전체 목록으로 이동 가능.
요소별 정의와 동작
- 1머리정의: 「1월 22일(금) 같은 바다로 나가는 배」 + AD 표시 + ×- 오픈 시 제목으로 포커스, 닫힘 시 호출한 배너로 포커스 복귀
- 2광고 줄정의: A·B·C 광고 선박 최대 5, Card/List 그대로 사용- 상품 줄은 해당 날짜 상품 및 잔여석 「쭈갑 종일 · 잔여 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
POST /usr/ads/slots (placements=P17)8월통합 조황 상세 화면 구성 유지(작성자 줄 → 사진 → 글 → 조황 정보 → 플로팅 버튼). 광고 카드에서 진입 시 작성자 줄 선박명 우측에 AD 표시 노출, 하단에 [이 배 예약하기] 버튼 노출.
요소별 정의와 동작
- 1머리·작성자 줄정의: ← · 공유 · × / 선박 아바타 40 · 선박명 16 + AD 표시 · 「3시간 전」 · 「주꾸미 | 인천 중구 남항부두」- AD 표시는 P8 광고 카드에서 진입한 경우에 한함- × 또는 ← → 닫기
- 2사진·글·조황 정보정의: 사진 240 가로 스크롤 · 본문 · 「조황 정보」 표(어종·조과·출항)- 기존 조황 상세와 동일 데이터(선장 조황 글)- 사진 로드 실패 시 해당 장 건너뜀
- 3[이 배 예약하기]정의: 하단 플로팅 보라 버튼(#32008C)- → 선박 상세- 광고 카드에서 진입한 경우 클릭으로 집계
버튼을 누르면 생기는 일
- [이 배 예약하기] → ?boat={id}
- ← · × → 닫기
상태(빈 값·로딩·오류·권한)
- 조황 삭제 시 「삭제된 조황이에요」 노출 후 닫기
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 올린 시각 | N분 전 · N시간 전 | 3시간 전 |
기존 조황 상세 APIPOST /usr/ads/events기존 바텀시트(핸들 · 제목 18 Bold · ×)에 광고 표시 및 정렬·맞춤 기준 공개.
요소별 정의와 동작
- 1제목정의: 「광고 선박 안내」 + ×
- 2본문 5줄정의: 고정 문구(15, 줄 앞 점)- 「AD」 표시가 붙은 선박은 선주님이 비용을 내고 노출하는 광고입니다.- 광고 묶음 안의 순서는 광고 등급 순서이고, 같은 등급 안에서는 무작위로 정해집니다. 평점·조황·가격과는 관계가 없습니다.- 광고는 검색 결과와 목록의 순서·개수를 바꾸지 않습니다. 광고가 아닌 선박은 고객님이 고른 정렬 기준(거리순·인기순·가격순)을 따릅니다.- 일부 광고는 지금 보시는 바다·날짜·검색 조건에 맞춰 고릅니다. 예약 이력으로 고르는 광고는 맞춤 광고 설정에서 끌 수 있습니다.- 광고 선박도 예약·결제·취소·환불 기준은 다른 선박과 똑같습니다.
- 3[확인] · [맞춤 광고 설정]정의: 보라 주 버튼(#32008C) + 하단 텍스트 버튼- [확인] · 뒤로가기 · 외부 영역 탭 → 닫기- [맞춤 광고 설정] → CW-61(비로그인 시 로그인 후 진입)
버튼을 누르면 생기는 일
- [확인] → 닫기
- [맞춤 광고 설정] → 알림 설정
결정 필요
D-28 · D-36
8월통합 알림 설정 화면 최하단에 「광고」 그룹과 「맞춤 광고」 행 추가(동일 그룹 라벨 · 행 제목 17 SemiBold · 토글 52×32). 꺼짐 시 예약 이력 기반 지면(새소식 홈 「다음 출조」, 출조 탭 지역 노출 순서)에서 이력 미사용. 광고 자체는 유지.
요소별 정의와 동작
- 1맞춤 광고 토글정의: 「맞춤 광고」 + 「지난 예약의 지역·어종으로 광고를 골라요」, 디폴트(기본값) 켬, 스크린리더에서 스위치로 인식- 끄기 → 토스트 「맞춤 광고를 껐어요」, 다음 화면부터 반영- 켜기 → 토스트 「맞춤 광고를 켰어요」
- 2설명정의: 토글 하단 회색 텍스트(13)- 「꺼도 광고는 보이지만, 예약 이력과 관계없이 골라집니다. 위치는 위치 사용에 동의한 경우 그때 보고 있는 화면에만 쓰고 저장하지 않아요.」- [개인정보 처리방침 보기 ›] → 처리방침 「맞춤형 광고」 항목
버튼을 누르면 생기는 일
- 토글 → PUT /usr/ads/pref
- [개인정보 처리방침 보기] → 처리방침
상태(빈 값·로딩·오류·권한)
- 비로그인: 그룹 미노출
- 저장 실패: 토글 원복 + 토스트 「잠시 후 다시 시도해 주세요」
결정 필요
D-28
GET·PUT /usr/ads/pref어드민
광고 계약 전체 목록. 상단 상태 카운터로 처리 대상 건 우선 노출.
요소별 정의와 동작
- 1상태 카운터정의: 처리 대상 건 수 칩 4개- 확인 중 N · 대기 N · 입금 대기 N · 미납 N- 칩 클릭 → 해당 상태로 필터 적용 후 조회
- 2검색 필터정의: 기존 필터 박스 형식- 검색어(선박명·업체명·계약번호)- 기간 기준(신청일·시작일·종료일) + 시작~종료 + [오늘][1주일][1개월][3개월][전체]- 상태 체크박스(확인 중·대기·입금 대기·집행 예정·집행 중·일시정지·만료·해지·반려·취소·임시저장)- 등급(전체·A·B·C) · 지역(9지역) · 업종(전체·유어선·유선) · 결제 방법(전체·정산 차감·계좌)- [초기화][조회]
- 3목록 머리정의: Total N · N개씩 보기 · [엑셀받기] · [계약 등록]- [계약 등록] → AD-82- [엑셀받기] → 현재 검색 조건 그대로 적용
- 4목록 표정의: 계약 1건 = 1행- 열: 번호 · 계약번호 · 선박명(업체명) · 지역 · 업종 · 등급 · 약정 · 기간 · 월 금액 · 결제 방법 · 상태 · 미수 · 신청일 · 상세- 상태 글씨 색 = 공통 상태 색- 미수 > 0 시 빨강 표시- 디폴트(기본값) 정렬: 신청일 최신순 / 상태 카운터로 진입 시 신청일 오래된 순
버튼을 누르면 생기는 일
- [상세] → AD-81
- [계약 등록] → AD-82
상태(빈 값·로딩·오류·권한)
- 빈: 「검색 결과가 없습니다.」
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 기간 | YYYY.MM.DD ~ YYYY.MM.DD | 2027.01.05 ~ 2027.04.04 |
| 금액 | #,##0 | 600,000 |
GET /adm/ads/contracts계약 1건의 운영 화면. 상태별 처리 버튼 변경, 모든 처리는 사유와 함께 이력에 기록.
요소별 정의와 동작
- 1머리정의: 계약번호 · 상태 · 선박명 · 처리 버튼- 확인 중: [승인][반려]- 대기: 「대기 순서 N」 노출 + [취소][반려](슬롯 발생 시 자동으로 확인 중 전환)- 임시저장: [신청으로 넘기기][삭제]- 입금 대기: [입금 확인 →] AD-83- 집행 예정: [해지]- 집행 중: [일시정지][해지]- 일시정지: 원인 칩(미납·운영·숨김) + 운영 정지인 경우에 한해 [재개] 노출 + [해지]
- 2승인 팝업정의: [승인] 확인- 시작일 확인(희망일 경과 시 내일로 변경된 값 노출, 수정 가능)- 재고 「인천 A 5/6 · 전국 A 8/10」- 처리량 경고(부족 시 빨강 표시) 「이번 달 인스타 게시 처리량이 2건 모자랍니다」- [승인] → 계약금 선수취 사용 또는 계좌 결제 시 입금 대기 + 1회차(또는 일시) 청구 생성, 선수취 미사용 정산 차감 시 집행 예정 → 토스트 「승인했습니다」 / AD4096 → 얼럿 「자리가 방금 찼습니다. 대기로 돌릴까요?」 [취소][대기로] → POST waitlist
- 3반려 팝업정의: [반려] 입력- 사유 선택(재고 없음·판매 상품 없음·정산정보 미등록·선박 정보 부족·기타) + 설명 10자 이상- 설명이 선주 알림톡에 그대로 발송됨을 안내
- 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계약 정보정의: 수정 가능한 필드 표- 확인 중·대기·임시저장: 등급·약정·시작일·결제 방법·청구 방식·월 금액(수동 체크+사유)·프로모션·이메일 수정 가능- 그 외 상태: 프로모션 일수·이메일·메모만 수정 가능- [저장] → 변경 전후 값 이력 기록- 프로모션 일수 증가 시 겹침(AD4091)·상한(AD4096) 재검사
- 6선박 확인정의: 승인 판단에 필요한 선박 정보- 노출 여부 · 30일 안 판매 상품 수 · 정산정보 등록 · 최대 탑승(업종 근거) · [선박 상세 →]
- 7회차·청구정의: 회차별 청구 표- 회차 · 기간 · 청구번호 · 합계 · 회수 · 상태 · 세금계산서- 청구번호 클릭 → AD-83 필터
- 8이용권·작업정의: 회차별 이용권 사용 현황 + 이 계약 작업 목록- 작업번호 클릭 → AD-84 상세
- 9성과 요약정의: 기간 전체 노출·클릭·예약·결제액·배수
- 10선주 요청정의: 연장·등급 변경·해지 문의(1단계는 전화·영업으로 접수한 내용을 운영자가 기록)- 행마다 [처리 완료] — 연장은 [새 계약 만들기](원 계약 값이 채워진 AD-82), 등급 변경은 [등급 변경 처리](대상 등급·시작일 = 다음 회차 시작일 확인 → change-grade 한 번에 새 계약 생성 + 기존 계약 해지 예정 처리)
- 11카드 소재 탭정의: 고객웹 광고 배너·마커에 사용할 사진과 SNS 소재- 대표 사진 3장(배너 사진 68 · 지도 마커 사진 · 추천리스트 사진 98에 첫 장 사용) · 노출 어종 최대 3- 선장 한마디(최대 40자) · 선장 얼굴 사진 1장 = 2단계 P18 선장 소개 블록과 SNS 소재용(1단계 고객웹 미사용)- 우측에 배너·추천리스트 미리보기 노출- [검수 완료] → 상태 OK, 고객웹 반영 5분 이내 / [반려](사유)- 미검수 시 선박 기본 대표 이미지로 노출, AD-80에 「소재 미검수 N」 카운터 노출
- 12이력정의: 상태·값 변경 기록- 일시 · 처리자 이름 · 변경 · 사유
버튼을 누르면 생기는 일
- [승인]·[반려]·[일시정지]·[재개]·[해지]·[저장]·[검수 완료]
상태(빈 값·로딩·오류·권한)
- 권한: 모든 관리자(현행 권한 등급 없음)
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 일시 | YYYY.MM.DD HH:mm | 2027.01.03 14:20 |
결정 필요
D-08 · D-10
GET /adm/ads/contracts/{id}POST approve(dry_run)·waitlist·cancel·reject·pause·resume·terminate(settle_preview)·change-gradePATCH /adm/ads/contracts/{id}대리 등록 모달. 서비스에 기등록된 선박만 선택 가능. 1단계에서는 모든 계약이 이 화면으로 유입(영업 오프라인 계약).
요소별 정의와 동작
- 1선박 검색정의: 선박명 검색 → 결과 라디오 1개 선택- 결과 = 선박명 · 선박번호 · 지역 · 업체 · 노출 여부 · 정산정보- 업종·지역은 선택 즉시 자동 노출
- 2계약 조건정의: 등급 · 약정 · 시작일 · 결제 방법 · 청구 방식 · 계약금 선수취- 시작일은 내일부터 선택 가능- 정산정보 미등록 시 정산 차감 비활성(딤 처리)- 「첫 회차 계좌 선수취」 체크(디폴트 켬): 체크 시 1회차(또는 총액)는 계좌로 선수취, 2회차부터 선택한 결제 방법 적용- 체크 해제 시 사유 10자 이상 필수- 우측에 해당 지역·등급 잔여 슬롯 노출 「인천 A 5/6 · 전국 A 8/10」- 「연간 일시 계약」 체크: 체크 시 약정 12개월 · 청구 일시 · 결제 계좌로 고정(변경 불가), 월 금액 = 12개월 할인율 + 5%p, 프로모션 30일 자동 입력, 승인 시 총액 청구 1건 생성
- 3금액정의: 자동 금액 + 수동 수정- 월 금액·총액 자동 계산- [수동 수정] 체크 시 입력칸 노란 배경 + 사유 10자 이상 필수- 프로모션 일수 0~60
- 4기타정의: 세금계산서 이메일 · 메모
- 5버튼정의: [임시저장] · [신청으로 등록]- 임시저장 = 선주에게 미노출, 필수값 누락 상태로도 저장 가능- 신청으로 등록 = 확인 중 상태로 생성 + 선주 알림 AN01 발송- 필수 누락 시 해당 입력칸 빨간 테두리 + 「필수 항목을 입력해 주세요」
버튼을 누르면 생기는 일
- [임시저장] → DRF
- [신청으로 등록] → REQ (슬롯 마감 시 대기로 등록 → 토스트 「대기 N번으로 등록했습니다」)
결정 필요
D-26
POST /adm/ads/contracts광고 청구 원장. 정산 차감과 계좌 입금을 모두 이 화면에서 관리.
요소별 정의와 동작
- 1요약정의: 이번 달 청구 · 회수 · 미수 · 연체(21일+) 금액- 합계는 부가세 포함 금액
- 2검색 필터정의: 기간(청구일·기한) · 상태(미수·일부·완납·취소) · 결제 방법 · 종류(회차·일시·단건·조정) · 검색어- [초기화][조회]
- 3목록 표정의: 청구 1건 = 1행- 열: 청구번호 · 종류 · 선박명 · 계약번호/작업번호 · 회차 · 청구일 · 기한 · 공급가액 · 부가세 · 합계 · 회수 · 미수 · 상태 · 세금계산서 · 처리- 처리: [입금 확인] [세금계산서] [차감 내역]
- 4입금 확인 팝업정의: 계좌 입금 기록- 금액(미수 이하) · 입금자명 · 입금일- [확인] → 회수 반영 → 입금 대기 계약인 경우 상한 재검사 후 집행 예정 전환(시작일 경과 시 입금 다음 날로 재설정) / AD4098 「이미 처리된 청구입니다」- 상한 초과 시 같은 팝업에 「자리가 찼습니다」 + [대기 1번으로 두기][환급] 선택
- 5세금계산서 팝업정의: 발행 정보 입력- 승인번호 · 발행일 · [저장]
- 6환급 탭정의: 목록 위 탭 「청구 | 환급」의 환급 목록- 열: 선박명 · 계약번호 · 금액(부가세 포함) · 방법(다음 지급 시 / 계좌) · 상태(대기·지급에 포함·완료) · 생성일 · 30일 전환 예정일 · 처리- 계좌 환급 대기 행에 [환급 완료] → 메모 입력 → POST refunds/{id}/complete → 완료 처리- 다음 지급 시 방식의 대기 행은 버튼 미노출(지급 요청 시 자동 적용)
- 7차감 내역 팝업정의: 이 청구에 붙은 지급 차감 목록- 지급 요청일 · 선박 · 금액 · 상태(적용·되돌림)- 행마다 [되돌리기] → 사유 10자 이상 입력 → 차감 REVERSED, 청구 미수 복원, 이력 기록
버튼을 누르면 생기는 일
- [입금 확인]
- [세금계산서]
- [차감 내역]
- [청구 취소](사유 필수)
표기 규격
| 항목 | 형식 | 예 |
|---|---|---|
| 금액 | #,##0 | 495,000 |
결정 필요
D-09 · D-18
GET /adm/ads/invoicesPOST depositsPATCH taxPOST voidGET /adm/ads/refundsPOST /adm/ads/refunds/{id}/completeSNS 홍보·운영 지원 작업 처리 화면. 상태 탭 + 표 + 우측 상세 패널.
요소별 정의와 동작
- 1상태 탭정의: 접수 · 자료 요청 · 제작 중 · 선주 확인 · 게시 준비 · 완료 · 취소 (각 건수)- 기한 경과 건은 탭 옆 빨간 숫자로 노출
- 2필터 · [대리 주문]정의: 상품 · 담당자 · 선박 · 기한 지남만 + 우측 [대리 주문] 버튼- 선박 검색 · 상품 · 결제 방법 · 메모 → POST /adm/ads/service-orders → 접수 상태 작업 생성(선주 앱 결제를 2월로 연기하는 경우의 대체 경로)
- 3작업 표정의: 작업 1건 = 1행- 열: 작업번호 · 선박명 · 작업 · 출처(이용권/단건 금액) · 상태 · 담당 · 기한 · 예정일 · 최근 변경- 행 클릭 → 우측 상세 패널 노출
- 4상세 패널 — 정보·자료정의: 작업 정보와 선주가 업로드한 자료- 선주 메모 · 파일 목록(내려받기) · 계약·이용권 정보- 담당자 지정 · 기한 · 예정일(촬영·발송·탑승일) 입력
- 5상세 패널 — 결과물정의: 결과물 업로드와 표시 확인- 파일 · 결과 링크 · 게시 문구- [표시 확인] 체크 — SNS 작업은 체크 시에만 다음 단계 버튼 활성(첫 줄 「광고」·「협찬」 확인)- 메타 대행: 집행 금액·노출·클릭·랜딩 방문 입력- 네이버 키워드광고 대행: 회차마다 키워드 수 · 광고비 소진 · 노출 · 클릭 · 평균 클릭 비용 · 선박 상세 방문 입력, 남은 광고비는 다음 회차 이월 표시- 상품·일정 등록 대행: 등록한 일정 기간(예: 2. 1~2. 28)과 상품 수 입력 후 [완료 처리]
- 6상세 패널 — 상태 버튼정의: 상태별 다음 단계 버튼- 버튼은 상품별 단계(4.1 표) 기준- 접수: [자료 요청](요청 문구 입력, 기한 디폴트 14일) 또는 [제작 시작] — 단건 정산 차감 시 이 시점에 청구 생성, 단건 계좌 시 입금 확인 전까지 비활성- 제작 중: [선주 확인 요청](확인 있는 상품) 또는 [완료 처리](확인 없는 상품: 조황 업로드)- 선주 확인: 대기(72시간 경과 시 자동 승인) · 수정 요청 내용 노출- 게시 준비: 결과 링크 입력 후 [완료 처리]- 공통: [작업 취소](사유 선택: 운영 사정 → 이용권 반환 / 선주 요청 → 이용권 소멸)- 이용권 작업을 처리 상한으로 이번 회차에 수용 불가 시 [운영 사정으로 다음 회차로](PATCH ops_shortfall_inc → 해당 회차 ops_shortfall + 1)
버튼을 누르면 생기는 일
- 상태 버튼 → PATCH status + 알림(AN12·AN13·AN14) 발송
결정 필요
D-11
GET /adm/ads/service-orders(counts 포함)POST /adm/ads/service-orders(대리 주문)PATCHPOST results광고 재고와 성과 현황판.
요소별 정의와 동작
- 1요약정의: 집행 중 계약 수 · 이번 달 광고 매출(공급가액) · 노출 · 클릭 · 광고 경유 예약
- 2재고 표정의: 지역 9 × 등급 3- 칸 = 「5 / 6」(사용/상한) + 대기 수, 마감된 칸 빨강 표시- 전국 합계 행- 칸 클릭 → AD-80 해당 지역·등급 필터
- 3지면별 성과 표정의: 2월 화면(1단계는 운영 SQL 리포트)- 기간 선택 + 지면 12행(P1~P8·P12~P14·P17)- 열: 노출 · 클릭 · 클릭률 · 예약 · 결제액 · 채워진 비율(모듈이 실제로 노출된 화면 ÷ 진입 화면) · 노출 스위치 상태
버튼을 누르면 생기는 일
- 칸 클릭 → AD-80
결정 필요
D-08
GET /adm/ads/placements/inventoryGET /adm/ads/placements/stats광고 상품 설정 화면. 단가 변경은 적용일 30일 이후부터, 정책 고지(AN17)와 함께 등록.
요소별 정의와 동작
- 1탭 단가표정의: 업종 × 등급 × 약정 표(현재 적용 + 예약된 단가)- [새 단가 등록] → 적용일(오늘+30일 이후) · 표 입력 · 고지 문구 → 저장 시 정책 고지 예약- 기존 계약에는 미적용 안내- 표 하단 「연간 일시 추가 할인」 입력(디폴트 5%p, 12개월 일시 결제 계약에 한해 적용)
- 2탭 판매 상한정의: 지역 × 등급 입력 + 전국 상한- 현재 사용 수보다 작게 입력 시 얼럿 「지금 계약 수보다 작게 줄일 수 없습니다」
- 3탭 지면 설정정의: 지면 전체·지면 12개 켜기/끄기 + 모듈 이름- 행: 코드 · 화면 · 모듈 이름(입력) · 참여 등급(조회 전용) · 칸 수 · 스위치- 모듈 이름에 금지어(인기·베스트·TOP·랭킹·1위·에디터 픽·프리미엄·인증·보증·추천 단독·AD·Sponsored·파트너·제휴·협찬) 포함 시 저장 불가 「광고 지면 이름에 쓸 수 없는 말이 있습니다」- 스위치 끄기 시 사유 필수, 확인 팝업(컨펌) 「지금 광고 중인 모든 선박의 노출이 멈춥니다」- 꺼진 시간 기록(보상 판단 목적)
- 4탭 홍보 상품정의: 상품별 가격·소요·월 처리 상한·판매 여부 + 광고 대행 수수료율·최소 수수료·최소 광고비- 가격 변경도 30일 고지 대상- 탭 하단 「등급 혜택」 표: 등급 × 상품(이용권 수 · 수수료 할인율 · 약정 조건) 편집
버튼을 누르면 생기는 일
- [저장] → 이력 기록
결정 필요
D-02 · D-08 · D-12
GET·PUT prices·caps·service-items·settings기존 정산관리 목록과 [선택지급요청]. 목록에 열 2개 추가, 지급 요청에 미리보기 단계 추가.
요소별 정의와 동작
- 1목록 열 추가정의: 「광고비 차감(예정)」 · 「최종 지급액」- 정산지급금액 열 우측- 행별 예정액 = 정산 예정일 → 정산번호 순으로 미수를 채운 값- 차감 계약이 없는 선박은 「-」 표시- 엑셀받기에도 같은 열 + 「광고비 환급」 추가
- 2지급 요청 미리보기 팝업정의: [선택지급요청] 클릭 시 먼저 노출되는 팝업- 선박별 행: 선박명 · 선택 건수 · 지급액 · 광고비 차감 · 광고비 환급 · 최종 지급액- 예: 왕감자호 2건 485,550 · 차감 −275,000 · 최종 210,550- 합계 행- 안내 「광고비 차감은 오래된 청구부터 지급액 범위 안에서 적용됩니다」- [취소] [지급 요청] → 차감 확정 + 기존 지급 요청 처리 → 토스트 「지급 요청했습니다」 / AD4097 → 얼럿 「금액이 바뀌었습니다. 다시 확인해 주세요」 → 미리보기 재호출
버튼을 누르면 생기는 일
- [선택지급요청] → POST /adm/payouts/preview → 팝업 → POST /adm/payouts
확인된 문제
- 현행 정산 목록의 「지금처리 되었습니다」 오타는 별건 처리
POST /adm/payouts/previewPOST /adm/payouts기존 전시 등록·수정 폼의 섹션 유형 선택지에 광고 4종 추가. 광고 섹션은 선박 목록 입력 없음(광고 계약 기준 자동 구성).
요소별 정의와 동작
- 1섹션 유형 추가정의: 015 광고-이번 주 함께하는 배 · 016 광고-이번 주 남은 자리 · 017 광고-내일 새벽 출항 · 018 광고-선장님 조황 소식- 015~017은 위치 홈(H, 출조 탭)에 한함, 018은 새소식 홈에 한함, 버전은 신버전에 한함- 선택 시 선박 목록 표·파일첨부 행 미노출 + 「광고 계약 선박이 자동으로 들어갑니다」 안내
- 2연달아 배치 검증정의: 저장·순서 수정 시 검사- 광고 섹션 두 개가 노출 순서상 인접 시 얼럿 「광고 섹션은 연달아 둘 수 없습니다. 사이에 일반 섹션을 두세요.」- 같은 유형 광고 섹션은 하나만 허용- 광고 섹션 타이틀·서브 타이틀도 3.5 금지어로 검사, 「추천」 포함 + 「광고」 미포함 이름은 저장 불가
버튼을 누르면 생기는 일
- [등록]·[수정]·[순서 수정] 저장 시 검증
확인된 문제
- 전시 수정 화면이 기존 값을 불러오지 않는 결함(9/17 실측) 선수정 필요, 수정 후 광고 섹션도 안전하게 수정 가능
결정 필요
D-33
기존 전시 등록·수정 API22. 개발 검토 결과
검토는 프론트엔드·백엔드 시니어 관점 리뷰어 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).