MD-18 · 컨텐츠 편집 개선

컨텐츠 편집 개선 (순서 지정·엑셀 업로드·드래그 오토스크롤)

메인 컨텐츠·퀵메뉴의 상품 순서를 드래그 외에 엑셀 업로드와 위치 지정(첫/N번째)으로 편집하고, 품절·미노출·중복 순번을 등록 시 경고한다.

🟡 준비 필요 상품 편성 엑셀 업로드 전 페이지 공통
➕ 기능 추가
무엇 — 메인 컨텐츠·퀵메뉴의 상품 순서를 드래그 외에 엑셀 업로드와 위치 지정(첫/N번째)으로 편집하고, 품절·미노출·중복 순번을 등록 시 경고한다.📍 위치: 운영관리 › 메인 컨텐츠 관리 › 상품 편성

핵심 결정

편집 방식
기존 드래그엑셀 순서 업로드·위치 지정 삽입(첫/N번째/마지막) 추가
오토스크롤
드래그 중 화면 상·하단 근접 시 휠 커서 자동 스크롤전 페이지 공통 적용
경고 대상
품절(sold_out)·장기품절·미노출(usable=false)·순번 중복/빈칸 코드 등록 시 경고
등록 허용
[가정] 품절·미노출 코드도 등록은 허용하되 저장 전 경고 확인(막지 않음)
데이터
main_content_product.sort_order·usable 재사용, 순번은 저장 시 1..N 재채번
01

화면 — 먼저 보기

이 티켓이 실제로 어떤 화면이 되는지 먼저 봅니다

세부 규칙(품절·미노출 코드 등록 허용 여부, 경고 강도)은 구두 확인 후 확정 — 본 기획은 합리적 기본값 기준이다.
현행 화면 · 실제 캡처
현행 「메인 컨텐츠」 — 편집(순서 지정) 개선 대상
현행 「메인 컨텐츠」 — 편집(순서 지정) 개선 대상
변경안 · 제안 화면
🔍 통합검색관리자 ▾
📊 대시보드
📦 상품관리
🧾 주문관리
🏬 재고관리
🎯 프로모션
💳 정산
⚙️ 설정
운영관리 › 메인 컨텐츠 관리 › 상품 편성기능 추가
노출 상태 ▾🔍 히어로코드·상품명 검색엑셀로 순서 업로드엑셀 양식 다운로드상품 추가
순서상태히어로코드상품명노출뱃지관리
1정상HERO-102934대파 1단(국산)노출인기
2⚠️ 품절HERO-889201청양고추 100g노출·
3⚠️ 미노출HERO-451007깐마늘 1kg미노출특가
총 128건 · 20/page123

▲ 컨텐츠 상품 편성 편집 목록 — 바뀌는 컬럼은 🆕 로 표시(예시 데이터)

1
컨텐츠 상품 편성 진입 — 메인 컨텐츠 관리에서 컨텐츠를 열면 편성된 상품 목록이 순번(sort_order) 오름차순으로 표시된다. 각 행에 실시간 '상태' 뱃지(품절/장기품절/미노출)가 뜬다.
2
드래그로 순서 변경 + 오토스크롤 — 항목을 잡아 위/아래로 끌면 리스트 경계에서 휠 커서로 자동 스크롤된다. 긴 목록도 스크롤 병행 없이 이동 가능(전 페이지 공통).
3
상품 추가 — 위치 지정 — '상품 추가'에서 히어로코드를 고르고 삽입 위치(첫번째·N번째·맨 뒤)를 지정한다. 지정 위치 이후 순번은 자동으로 밀린다.
4
엑셀로 순서 일괄 업로드 — 양식(히어로코드·순번·노출)을 내려받아 편집 후 업로드하면 편성이 전체 치환된다. 순번 중복·빈칸은 자동 정규화된다.
5
등록 경고 확인 — 품절·미노출·미존재 코드가 감지되면 저장 전 경고 요약이 뜬다. 관리자가 확인하면 저장, 무시 시 warning_count로 로그에 기록.
6
저장·재채번·감사 — 저장 시 컨텐츠 단위로 순번을 1..N 재채번하고, 편집 스냅샷을 sort_log에 남겨 되돌리기와 감사를 지원한다.
02

정책 / 정의

용어를 못 박고, 규칙을 명확히

용어 정의
용어정의
메인 컨텐츠앱 홈에 노출되는 상품 전시 섹션. main_content 1건 = 섹션 1개, 하위에 편성 상품(main_content_product) N개를 가진다.
상품 편성한 컨텐츠 안에 어떤 히어로코드를 어떤 순서로 노출할지 정하는 작업. MD-18의 핵심 대상.
순서(sort_order)컨텐츠 내 상품 노출 순번(작을수록 앞). 기존 정수 컬럼을 그대로 사용하며 저장 시 1..N으로 재채번한다.
위치 지정 삽입상품 추가 시 맨 뒤가 아니라 첫번째·N번째·맨 뒤 중 선택해 끼워 넣는 기능. 이후 순번은 자동 밀림.
엑셀 순서 업로드히어로코드+순번(+노출)을 담은 엑셀로 편성을 일괄 갱신하는 방식. 양식 다운로드 → 편집 → 업로드.
미노출편성에는 있으나 앱에 표시하지 않는 상태. main_content_product.usable=false. 품절과는 별개.
오토스크롤(휠 커서)드래그로 항목을 옮길 때 리스트 상·하단 경계에 닿으면 자동으로 스크롤되는 UX. 전 편집 페이지 공통 적용.
정책 (규칙)
#규칙비고
1저장 시 컨텐츠 단위로 sort_order를 1..N으로 재채번한다.엑셀/삽입/드래그 무엇으로 편집해도 순번 중복·빈칸을 원천 제거. renumber_main_content_product() 참조.
2엑셀 업로드에 순번 중복·빈칸이 있으면 저장 전 검증 결과를 요약해 보여준다.중복=행 순서 기준 자동 배열, 빈칸=맨 뒤로 배치 후 재채번(기본값). [가정] 구두 확인 필요.
3품절·장기품절·미노출 히어로코드는 등록을 막지 않되 저장 전 경고를 표시한다.[가정] 진열 목적상 예약 노출이 필요할 수 있어 하드 블록 대신 소프트 경고. 최종은 구두 확정.
4품절 판정은 seller_product.sold_out / long_term_sold_out을 실시간 조회한다.편성 시점이 아니라 노출 시점 상태가 중요 — 목록에 '상태' 뱃지로 실시간 반영.
5위치 지정 삽입 시 지정 위치 이후 상품의 순번은 +1씩 자동 밀린다.'첫번째'=1, 'N번째'=지정값, '맨 뒤'=max+1. 삽입 직후 재채번으로 정합성 유지.
6엑셀 업로드는 해당 컨텐츠의 편성을 전체 치환(replace) 방식으로 적용한다.[가정] 부분 병합(merge)이 필요하면 옵션 분기. 업로드 전 '전체 교체' 경고 모달 노출.
7드래그 오토스크롤은 메인 컨텐츠·퀵메뉴 등 순서 편집 전 페이지에 공통 컴포넌트로 적용한다.quick_menu.sort 편집 화면 포함. 프론트 공통 훅으로 구현, 화면별 중복 구현 금지.
8엑셀 업로드·위치삽입 등 대량 재정렬은 main_content_product_sort_log에 스냅샷을 남긴다.오조작 되돌리기·감사용. warning_count로 경고 무시 여부 추적.
9존재하지 않는 히어로코드가 엑셀에 있으면 해당 행은 건너뛰고 실패 목록으로 반환한다.seller_product에 없는 코드는 편성 불가 — 성공/실패 건수 리포트.
03

ERD

데이터 구조 · 관계 · DDL

main_content READ
idPK varchar(100)
namevarchar(30)
typevarchar(30)
sort_orderinteger
usableboolean
메인 컨텐츠(전시 섹션) 마스터. 섹션 자체의 노출·순서 소스.
main_content_product WRITE
content_idPK varchar(100)
hero_product_codePK varchar(100)
sort_orderinteger
usableboolean
badgejsonb
created_byvarchar(20)
컨텐츠 내 상품 편성. MD-18 편집 대상(순서·노출).
seller_product READ
hero_product_codeFK varchar(100)
sold_outboolean
long_term_sold_outboolean
is_original_displayedboolean
상품 상태 소스. 품절/장기품절 경고 판정에 실시간 조회.
quick_menu READ
menu_idPK bigint
namevarchar(255)
sortinteger
content_idFK varchar(255)
퀵메뉴 노출 관리. 동일한 순서 편집·오토스크롤 공통 적용 대상.
main_content_product_sort_log 신규
idPK bigserial
content_idFK varchar(100)
edit_typevarchar(20)
payloadjsonb
warning_countinteger
[가정] 순서 편집 감사·되돌리기용 스냅샷 로그(신규 최소).
main_content.id 1 : N main_content_product.content_id
main_content_product.hero_product_code N : 1 seller_product.hero_product_code (품절·미노출 판정)
quick_menu.content_id N : 1 main_content.id
main_content_product_sort_log.content_id N : 1 main_content.id
-- ============================================================
-- MD-18 컨텐츠 편집 개선
-- 순서 편집은 기존 컬럼(main_content_product.sort_order, quick_menu.sort)을
-- 재사용한다. 스키마 신규는 감사/되돌리기용 로그 1개만 최소로 추가한다.
-- ============================================================

-- (1) 기존 컬럼 재사용 확인용 참고 (변경 아님)
--   main_content_product.sort_order  integer NOT NULL DEFAULT 0  → 상품 노출 순서
--   main_content_product.usable      boolean NOT NULL DEFAULT true → 노출/미노출
--   PK (content_id, hero_product_code) → 동일 컨텐츠 내 중복 코드 방지(이미 보장)

-- (2) [가정] 엑셀 업로드/위치삽입 대량 재정렬 감사 로그 (신규, 최소)
CREATE TABLE main_content_product_sort_log (
    id            bigserial   PRIMARY KEY,                 -- 로그 PK
    content_id    varchar(100) NOT NULL,                   -- 대상 컨텐츠(main_content.id)
    edit_type     varchar(20)  NOT NULL,                   -- 'EXCEL_UPLOAD' | 'INSERT_AT' | 'DRAG'
    payload       jsonb        NOT NULL,                    -- 적용 전/후 (hero_product_code, sort_order) 스냅샷
    warning_count integer      NOT NULL DEFAULT 0,          -- 등록 시 감지된 경고(품절/미노출/중복/빈칸) 수
    created_by    varchar(20)  NOT NULL,                    -- 편집 관리자
    created_on    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE  main_content_product_sort_log IS '컨텐츠 상품 순서 편집(엑셀/위치삽입/드래그) 감사 및 되돌리기용 스냅샷';
COMMENT ON COLUMN main_content_product_sort_log.edit_type IS '편집 방식: EXCEL_UPLOAD/INSERT_AT/DRAG';
CREATE INDEX ix_mcp_sort_log_content ON main_content_product_sort_log (content_id, created_on DESC);

-- (3) [가정] 저장 시 순번 정규화(1..N 재채번) 보조 함수 — 중복/빈칸 방지
--   업로드/삽입/드래그 확정 시 컨텐츠 단위로 sort_order를 1부터 재채번한다.
--   (애플리케이션 트랜잭션에서 호출; 참고 구현)
CREATE OR REPLACE FUNCTION renumber_main_content_product(p_content_id varchar)
RETURNS void AS $$
BEGIN
    WITH ranked AS (
        SELECT hero_product_code,
               ROW_NUMBER() OVER (ORDER BY sort_order, hero_product_code) AS rn
        FROM main_content_product
        WHERE content_id = p_content_id
    )
    UPDATE main_content_product m
    SET sort_order = r.rn
    FROM ranked r
    WHERE m.content_id = p_content_id
      AND m.hero_product_code = r.hero_product_code;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION renumber_main_content_product(varchar) IS '컨텐츠 단위 sort_order 1..N 재채번(빈칸/중복 순번 정규화)';
04

화면 상세 — 세부 표·규칙

목록 외 품목표·모달·규칙 등 세부 화면

상품 추가 모달 — 위치 지정
히어로코드상품명현재 상태삽입 위치
HERO-773451양파 3kg 망정상첫번째 ▾
HERO-990112감자 1kg(수미)품절3 번째 ▾
HERO-120039애호박 개정상맨 뒤 ▾
삽입 위치=첫번째/N번째/맨 뒤. 품절·미노출 코드 선택 시 행에 경고 배지, 저장 시 확인 모달. 미존재 코드는 선택 불가.
예외·경고 처리 규칙표
케이스감지 시점기본 동작비고
순번 중복엑셀/저장행 순서대로 자동 배열 후 1..N 재채번하드블록 아님
순번 빈칸엑셀/저장맨 뒤로 배치 후 재채번[가정] 구두 확정
품절·미노출 코드등록/저장등록 허용 + 경고 확인로그에 warning_count 기록
미존재 히어로코드엑셀 업로드행 건너뜀 + 실패목록 반환seller_product 없음
'전 페이지 공통' 규칙: 퀵메뉴 노출 관리(quick_menu.sort)에도 동일한 순번 정규화·오토스크롤 적용.