Mublo Framework v1.9.0 릴리즈 — 쇼핑몰 가격 공개 대상, 조건별 쿠폰 일괄 지급

wwiz 2026-10-28 11:12 조회 4 수정됨

Mublo Framework v1.9.0 을 릴리즈했습니다.

이번 릴리즈의 중심은 쇼핑몰입니다. 가격을 누구에게 보여줄지 정할 수 있게 됐고, 조건에 맞는 회원에게 쿠폰을 한꺼번에 줄 수 있게 됐습니다. 회원 쪽에는 가입 유형별 등급과 활동 기록이 들어왔습니다. 보안 수정이 4건 있으니 꼭 올려 주세요.

데이터베이스 마이그레이션이 2건 있습니다(Core 030_create_member_activity_logs.sql, Shop 037_shop_price_display.sql). 삭제할 파일은 없습니다. 이번에는 라우트 캐시를 비워야 하고, 패치에 vendor 파일이 포함돼 있습니다. 아래 업그레이드 항목을 먼저 읽어주세요.


쇼핑몰 가격을 누구에게 보여줄지 정하기

쇼핑몰 설정의 가격 / 할인 / 적립 탭에 가격 공개 대상이 생겼습니다. 회원 전용가로 운영하는 쇼핑몰에서 씁니다.

  • 모든 방문자: 기본값입니다. 지금과 같습니다.
  • 로그인 회원만: 비회원에게는 가격 대신 안내 문구를 보여줍니다.
  • 지정 등급 이상 회원만: 고른 등급 이상의 회원에게만 가격을 보여줍니다. 회원 인증 후 등급을 올려 주는 방식에 맞습니다.

공개 대상이 아니면 상품 목록·상세·기획전·상품 블록·통합 검색에서 가격 대신 안내 문구가 나오고, 찜·후기·문의 목록의 가격도 빠집니다. 장바구니·바로구매·주문은 서버에서 막습니다. 비회원에게 가격을 감추면 가격비교 사이트 피드도 내주지 않습니다. 관리자 화면과 이미 결제한 주문 내역에는 적용되지 않습니다.

설정을 저장하기 전에 Shop 마이그레이션 037 을 실행해야 합니다. 실행 전에는 새 컬럼이 없어 쇼핑몰 설정 저장이 실패합니다.


조건별 쿠폰 일괄 지급

관리자 쿠폰 목록에서 등급·가입일·구매 이력으로 회원을 골라 쿠폰을 한꺼번에 줄 수 있습니다. 정책별로 발급 내역과 사용·만료 상태도 볼 수 있습니다.

  • 대상은 현재 사이트의 정상 일반 회원입니다.
  • 한 번에 최대 5,000명씩 처리합니다. 남은 회원은 같은 조건으로 이어서 지급하면 됩니다.
  • 발행 기간과 총량·회원별 한도는 기존 관리자 발행과 똑같이 검사합니다.

쇼핑몰의 다른 새 기능

  • 마이쇼핑 배송지 관리: 회원이 마이쇼핑에서 배송지를 추가·수정·삭제하고 기본 배송지를 고를 수 있습니다.
  • 주문인 이메일: 기본 주문서에 주문인 이메일 입력칸(선택)이 생겼습니다. 암호화해 저장하고, 주문인 대상 이메일 알림이 켜져 있으면 이 주소로 보냅니다.
  • 관리자 상품 목록 정렬: 최신순·낮은가격순·높은가격순·조회순으로 볼 수 있고, 상품을 수정하고 돌아와도 정렬이 유지됩니다.
  • 카테고리 트리 접기·펼치기: 자식이 있는 카테고리를 접을 수 있습니다. 전체 펼치기·전체 접기도 됩니다.
  • 엑셀 다운로드: 관리자 회원 목록과 상품 목록을 검색 조건 그대로 엑셀로 받을 수 있습니다.

회원: 가입 유형별 등급, 닉네임 선택, 활동 기록

모두 관리자 → 사이트 설정에서 사이트별로 정합니다.

  • 가입 유형별 등급 (기본 설정 카드): 가입 화면의 선택·라디오형 추가필드에서 고른 값에 따라 신규 회원 등급을 다르게 줍니다. 예를 들어 "일반 / 사업자" 선택지마다 등급을 지정할 수 있습니다. 관리자 등급은 줄 수 없습니다.
  • 닉네임 입력 (기본 설정 카드): 필수·선택·사용 안 함 중에 고릅니다. 기본값은 지금과 같은 필수입니다. 사용 안 함이면 가입·내 정보 화면에서 닉네임 칸이 사라지고, 게시판에는 "회원 + 고유번호"로 표시됩니다.
  • 회원 활동 기록 (회원 활동 기록 카드): 켜면 로그인 회원이 본 프론트 페이지의 경로·제목·시각을 저장하고, 관리자 회원 수정 화면에 최근 30건을 보여줍니다. 로그인·가입·회원정보 화면은 기록하지 않습니다. 보관 기간은 30~365일입니다. Core 마이그레이션 030 이 필요합니다.

방문 통계(VisitorStats)는 이제 조회 기간을 날짜로 직접 지정할 수 있습니다(최대 366일).


보안 수정

  • 엑셀 처리 라이브러리 PhpSpreadsheet 를 5.10.0 으로 올렸습니다. 5.9.0 이하에는 업로드한 스프레드시트를 읽을 때의 XXE, SSRF 허용목록 우회, ODS 파일로 CPU·메모리를 소진시키는 취약점이 있었습니다(CVE-2026-108357~108360, 2026-10-27 공개). 쇼핑몰 송장 일괄 등록과 AI 문서 첨부가 업로드 파일을 이 라이브러리로 읽습니다.
  • 쿠폰 번호를 직접 보내 다른 사이트의 쿠폰이나 관리자·자동 발행용 쿠폰을 받아 갈 수 있던 문제를 막았습니다. 관리자 수동 발행과 프로모션 코드 등록도 현재 사이트의 쿠폰 정책만 처리합니다.
  • 요청의 메뉴 코드를 바꿔 주문 리포트 다운로드 권한을 우회할 수 있던 문제를 막았습니다. 이 수정 때문에 업데이트 전에 만든 리포트 다운로드 링크는 만료 전이라도 쓸 수 없습니다. 리포트를 다시 생성하세요.

그 밖에 고친 것

  • 팝업 링크: 관리자에서 넣은 링크 URL 이 프론트 팝업에 적용되지 않았습니다. 이제 팝업 본문을 누르면 그 링크로 이동합니다(닫기·보지 않기 버튼 제외). 새창 설정도 따릅니다.
  • 검색 소스가 모두 해제되던 문제: 검색 설정을 한 번도 저장하지 않은 사이트에서 다른 설정만 저장해도 검색 소스가 모두 꺼지고 전체 검색 결과가 나오지 않았습니다. 이미 이렇게 된 사이트도 업데이트만 하면 다시 동작합니다. 검색을 쓰지 않으려면 스킨에서 검색폼을 빼면 됩니다.
  • 약관 저장 오류: 약관 내용을 바꾸고 버전을 그대로 두면 "저장 중 오류가 발생했습니다" 가 떴습니다. 이제 버전을 올리라는 안내를 띄웁니다.
  • 탈퇴 회원의 배송지 주소록: 탈퇴해도 주소록이 남았습니다. 이제 탈퇴 완료 시 지웁니다. 주문에 기록된 배송지는 그대로 두고, 이미 탈퇴한 회원의 주소록은 소급해 지우지 않습니다.
  • 매뉴얼: Shop 매뉴얼에 가격 공개 대상 설명을 넣었습니다. 매뉴얼 화면에 처음 들어갈 때 Shop 매뉴얼의 기본 페이지가 새 내용으로 한 번 갱신됩니다. 기본 페이지를 직접 고쳐 쓰셨다면 그 내용은 덮어쓰입니다. 따로 추가한 페이지는 남습니다.

업그레이드

v1.8.0 에서: 패치 zip(mublo-1.8.0-to-1.9.0-patch.zip, 변경 파일 215개)을 설치 루트에 덮어씁니다. 삭제할 파일은 없고, .env 는 덮어쓰지 않습니다.

이번 패치에는 vendor/ 가 들어 있습니다. 보안 업데이트된 vendor/phpoffice/phpspreadsheet 와 자동 로딩 정보(vendor/composer) 99개입니다. composer 를 실행할 필요는 없습니다. vendor 를 빼고 덮어쓰면 보안 수정이 적용되지 않습니다.

★ 마이그레이션을 실행해야 합니다. 덮어쓴 뒤 바로 관리자 → 시스템 관리 → 데이터베이스 마이그레이션에서 미실행 마이그레이션 실행을 누르세요.

  • Core 030_create_member_activity_logs.sql: 회원 활동 기록 테이블
  • Shop 037_shop_price_display.sql: 가격 공개 대상 컬럼. 실행 전에는 쇼핑몰 설정 저장이 실패합니다.

★ 라우트 캐시를 비워야 합니다. storage/cache/routes 안의 파일을 지우세요. 마이쇼핑 배송지와 쿠폰 일괄 지급 주소가 새로 생겨, 비우지 않으면 404 가 납니다.

CSS·JS 가 바뀌었습니다. 적용 후 브라우저에서 강력 새로고침(Ctrl+F5)을 해 주세요. 시스템 관리 에서 버전이 1.9.0 인지도 확인하세요.

프론트 스킨 basic 파일이 바뀌었습니다 — Shop 의 상품 목록·상세, 장바구니·주문서, 기획전, 찜·후기·문의, 마이쇼핑, 상품 블록, 새 배송지 화면, 팝업 스킨, 그리고 회원가입·내 정보 화면입니다. 이 파일을 복사해 고쳐 쓰신다면 두 가지를 다 알아 두세요. 덮어쓰면 고친 내용이 사라집니다. 덮어쓰지 않으면 이번에 고친 것(특히 가격 숨김)이 그 스킨에 적용되지 않습니다. 차이를 직접 옮겨 주세요.

Shop 1.6.0 은 코어 1.9.0 이상이 필요합니다. 번들째 올리면 신경 쓸 일이 없습니다. Shop 만 따로 올리지는 마세요.

v1.8.0 미만에서 올라오는 경우에는 v1.8.0 까지 올린 뒤 이 패치를 적용하거나, 전체 배포본으로 교체하세요.


확장을 직접 만드셨다면

깨지는 계약은 없습니다. 새로 생긴 것과, 커스텀 스킨이 챙겨야 할 것이 있습니다.

  • 커스텀 Shop 스킨: 상품 데이터에 price_hidden·price_hidden_text 가 추가됐습니다. 가격 공개 대상이 아니면 price_hidden 이 true 이고 가격·적립 값은 비어 있습니다. 이 값을 먼저 확인해 가격 대신 price_hidden_text 를 보여주고 구매 버튼을 숨겨 주세요. 목록 화면에는 $priceHidden 도 전달됩니다. 찜·후기·문의 스킨도 가격 공개 여부를 반영해야 합니다. 대응하지 않은 스킨은 가격 자리가 비어 보입니다(구매는 서버가 막으므로 뚫리지는 않습니다).
  • Core\Report\Contract\MenuScopedReportInterface (신규): 리포트 정의에서 다운로드 권한을 검사할 메뉴를 지정합니다. 커스텀 리포트도 이 인터페이스를 구현해야 메뉴 코드를 바꾼 요청으로 권한을 우회하는 것을 막을 수 있습니다. 구현하지 않은 리포트는 예전처럼 동작합니다.
  • Contract\Member\MemberSegmentQueryInterface (신규): 사이트·등급·가입일 조건으로 회원 ID 를 조회합니다. 마지막 회원 ID 기준으로 페이지를 넘깁니다.

상세 변경 내역

포함된 PR: #92 · #93 · #94 · #95 · #96 · #97 · #98 · #99 · #100 · #101 · #102 · #103 · #104 · #105 · #106 · #107 · #108 · #109 · #110

글쓰기

댓글 0

등록된 댓글이 없습니다.