https://github.com/gnuboard/g7/issues/125 — 상품 상세설명을 HTML 로 저장할 때 HTMLPurifier 가 모듈 vendor 폴더 안에 정의 캐시를 만들려다 실패해 저장이 매번 500 으로 끝나던 문제를 고친다. vendor 를 읽기 전용으로 두는 표준 배포에서 그 쓰기는 예외가 아니라 PHP 경고로 나오고 Laravel 이 이를 ErrorException 으로 승격시킨다. 캐시는 설정 해시당 1회만 기록되므로 캐시가 영영 생기지 않아 재시도해도 같은 결과였다. 캐시 경로를 storage 아래로 옮기고, 그 경로마저 확보하지 못하면 캐시만 끄고 정화는 그대로 수행한다 — 캐시는 성능 장치이고 정화는 보안 장치라, 전자의 실패가 후자를 건너뛰게 만들면 안 된다. 저장은 성공하므로 운영자에게 도달하는 흔적이 로그 하나뿐이라 error 수준으로 남긴다 (출하 기본 로그 수준이 error 라 warning 은 기본 설치 상태에서 파일에 남지 않는다). 그 과정에서 갈라져 있던 두 축을 코어 한 곳으로 모은다. - 쓰기 디렉토리 확보: 억제 생성·chmod·setgid·소유권 상속·쓰기 판정 절차가 정적 게시와 정의 캐시 두 곳에 서로 다른 하드닝으로 복제돼 있었다(억제 mkdir·setgid·clearstatcache 가 사본마다 한쪽씩 빠져 있었다). FilePermissionHelper 의 ensureWritableDirectory 와 hardenDirectory 로 통합하고, 실패 사유는 out 파라미터로 올려 정책(조용한 성능 저하 대 시끄러운 실패)은 호출부가 정하게 둔다. - 확장 저장 경로: storage_path('app/modules/…') 손조립이 30곳에 흩어져 있어 테스트 격리 분기를 넣으려면 사본마다 복제해야 했고, 한 곳만 빠뜨려도 그 확장의 테스트가 운영 설정 파일을 덮어쓴다. 디스크 root 를 단일 출처로 읽는 ExtensionStoragePath 로 전환하고 테스트 분기는 config/filesystems.php 한 줄에서 끝낸다. 함께 고친 것 - 테스트가 운영 라우트 캐시로 부팅해 확장 allowlist 가 라우트 축에서 통째로 무력화되던 문제. 삭제가 아니라 경로를 돌린다 — 라우트 캐시는 확장 작업 전까지 재생성되지 않아, 삭제하면 운영 사이트가 그때까지 라우트 파일 스캔 경로로 떨어진다. - PHPUnit 프로세스가 확장 vendor 의 제3자 composer 패키지를 오토로드하지 않아 그 패키지를 쓰는 코드 경로가 통째로 테스트 불가였던 문제. 확장 자신의 오토로더를 그대로 쓰면 활성 디렉토리가 _bundled 를 이기고 base path 유추까지 깨지므로, 생성된 맵에서 제3자 항목만 골라 별도 로더로 등록한다. - 게시 폴더가 setgid 를 갖지 않아, 명령줄과 웹이 번갈아 만든 하위 폴더를 다른 쪽이 쓰지 못하던 문제. - 관리자 템플릿이 HTML 정화 라이브러리를 직접 지정하지 않아 전이 의존으로 딸려온 구버전이 쓰이던 문제. 동반 산출물 - 규정 표(·AGENTS.md) 6행 + storage-driver/service-repository/testing-guide 문서 - audit 룰 2종 + coverage 6항목. 저장소가 이미 전량 전환돼 전수 실행이 공허 통과하므로 판정식은 픽스처 36건이 잠근다 - INSTALL.md 에 설치 후 파일 권한 절 추가 (vendor 쓰기 권한 불요를 명시)
29 KiB
29 KiB
Changelog
이 프로젝트의 모든 주요 변경사항을 기록합니다. 형식은 Keep a Changelog를 따르며, Semantic Versioning을 준수합니다.
[1.1.0] - 2026-08-24
Added
- 페이지를 공유할 때의 미리보기 이미지(og:image)가 본문의 첫 이미지로 채워집니다. 이전에는 페이지에 공유 이미지를 공급할 방법이 전혀 없어 미리보기 카드가 항상 이미지 없이 표시되었습니다. 외부 주소의 이미지는 사용하지 않으며, 기존 페이지는 모듈 업데이트 시 자동 반영됩니다. (#22 @abc101 님께서 제보해주셨습니다.)
Fixed
- 페이지 공유 미리보기의 설명(og:description)이 항상 비어 있던 문제를 수정했습니다. 이제 페이지 SEO 설정의 설명이 사용됩니다.
Changed
- 코어 최소 요구 버전을 7.0.10 으로 상향
[1.0.3] - 2026-08-19
Security
- 미발행(초안) 페이지에 붙은 이미지 첨부의 미리보기가 주소만 알면 누구에게나 열리던 문제를 수정했습니다. 다운로드는 이미 발행 상태를 확인하고 있었지만 미리보기는 확인하지 않아, 발행 전 콘텐츠의 이미지가 새어 나갈 수 있었습니다. 이제 미리보기도 다운로드와 같은 기준을 적용해, 발행된 페이지의 첨부는 누구나, 미발행 페이지의 첨부는 페이지 조회 권한이 있는 관리자만 미리볼 수 있습니다. 권한이 있는 관리자 화면(편집·상세·미발행 미리보기)의 초안 첨부 썸네일은 한시적으로만 유효한 서명 주소로 전달되어, 보호를 유지한 채 종전처럼 정상 표시됩니다. (KISA 측에서 제보해주셨습니다 — KVE-2026-1914)
- 페이지 일괄 발행/발행취소와 첨부파일 삭제·순서 변경에 담당 범위 제한을 적용했습니다. 페이지를 하나씩 여는 화면에는 이 확인이 있었지만 목록에서 여러 건을 한 번에 처리하는 경로와 첨부 관리 경로에는 없어, "본인이 만든 페이지만" 으로 범위를 좁혀 위임받은 관리자가 담당 밖 페이지까지 발행 상태를 바꾸거나 첨부를 지울 수 있었습니다. 이제 대상마다 같은 기준으로 확인하며, 범위 밖 대상이 섞이면 요청 전체를 거부하고 아무것도 변경하지 않습니다. 범위 제한 없이 위임받은 관리자의 작업은 종전처럼 정상 동작합니다. (KVE-2026-1919)
- 페이지 통합 검색 결과의 제목·본문 미리보기에서 검색어 강조 처리가 원문을 그대로 실어 보내던 것을, 안전하게 변환한 뒤 강조하도록 바로잡았습니다. (sir.kr 커뮤니티의 Xbuilder 님께서 제보해주셨습니다.)
Added
- 페이지 작성 중 파일만 올리고 저장하지 않은 채 나간 임시 첨부를 매일 자동 정리합니다. 파일을 지운 뒤 남는 빈 폴더까지 함께 정리하므로 저장소에 흔적이 남지 않습니다. 종전에는 이런 파일이 서버에 계속 쌓여도 회수할 방법이 없었습니다.
Changed
- 첨부 개수 상한 초과 안내 문구를 만드는 시점이 응답을 만드는 시점과 어긋나 있던 것을 맞췄습니다. 표시되는 문구와 상태는 종전과 동일합니다.
- 코어 최소 요구 버전을 7.0.7 로 상향했습니다.
Fixed
- 페이지를 발행하거나 미발행으로 바꿔도(발행 버튼·일괄 발행/미발행) 검색엔진용 미리 생성 캐시와 사이트맵이 갱신되지 않던 문제를 수정했습니다. 편집 화면에서 저장하는 경우에만 갱신이 걸려 있어, 발행 상태만 바꾸면 검색엔진에 이전 상태(미발행 안내 또는 이전 콘텐츠)가 계속 노출되고 사이트맵에도 반영되지 않았습니다. 이제 모든 발행 경로에서 동일하게 갱신됩니다.
- 통합검색에서 페이지 검색이 실패하면 "검색 결과 없음" 이 아니라 오류 안내로 구분해 표시되도록 실패 정보를 응답에 싣습니다. 실패 원인은 서버 기록에 상세히 남습니다. (#103 @Tuwasduliebst 님께서 제보해주셨습니다.)
- 페이지 첨부 파일의 최대 개수·용량·허용 형식 설정이 저장해도 반영되지 않던 문제를 수정했습니다. 설정값을 읽어 오는 경로 자체가 없어 항상 내장 기본값이 쓰였습니다. (#109 @Tuwasduliebst 님께서 제보해주셨습니다.)
- 페이지 목록에서 항목을 선택한 뒤 검색하거나 페이지를 넘기면, 화면에서 사라진 항목이 선택된 채로 남아 일괄 발행·발행 취소 대상에 포함되던 문제를 수정했습니다. 이제 일괄 처리 대상은 언제나 화면에 보이면서 체크된 항목뿐입니다.
- 관리자 페이지 편집 화면에서 저장이 실패했을 때 실패 사유 대신 일반 안내 문구만 표시되던 문제를 수정했습니다. 이제 서버가 알려준 사유가 그대로 안내됩니다.
[1.0.2] - 2026-08-10
Security
- 페이지 첨부파일의 최대 개수·용량·허용 형식 설정이 실제 업로드에 적용되도록 수정했습니다. 이전에는 설정을 바꿔도 반영되지 않고 화면에 고정된 값(10MB, 확장자 16종)이 쓰였으며, 개수 제한은 어디에서도 적용되지 않아 설정값을 넘겨 첨부할 수 있었습니다. 허용 형식은 설정의 파일 형식 목록을 그대로 따르며, 목록을 비우면 형식을 제한하지 않습니다. 이미 상한을 넘겨 등록된 기존 첨부는 그대로 두고 신규 등록만 차단합니다. (#81 @jiwonpapa 님께서 제보해주셨습니다.)
Added
- 사이트맵에 담을 페이지 수의 안전 상한을 지원합니다. 상한을 설정하면 그 수를 넘지 않으며, 상한에 걸려 일부가 빠진 경우 기록으로 남습니다.
- 페이지를 발행/미발행하거나 삭제하면 사이트맵에 해당 항목만 자동으로 반영됩니다. 전체를 다시 만들지 않고 바뀐 부분만 갱신하므로 페이지가 많은 사이트에서도 빠르게 최신 상태가 유지됩니다.
Changed
- 통합 검색의 페이지 결과를 최신순·오래된순으로 볼 때 이어보기 방식으로 뒤쪽 페이지를 이동할 수 있습니다.
- 플러그인으로 다른 검색엔진을 연결하면 페이지 검색에도 그 엔진이 적용됩니다. 이전에는 연결한 엔진과 무관하게 기본 방식으로만 검색됐습니다.
- 사이트맵을 만들 때 페이지를 한 번에 모두 메모리에 올리지 않고 나눠서 읽도록 바꿨습니다. 페이지가 많은 사이트에서 사이트맵 생성 중 메모리가 부족해 실패하던 문제가 줄어듭니다.
- 페이지 목록을 뒤쪽 페이지에서도 빠르게 열 수 있도록 조회 방식을 바꿨습니다. 예전에는 페이지가 뒤로 갈수록 건너뛰는 항목의 본문까지 함께 읽어 느려졌지만, 이제 현재 페이지의 항목만 본문을 읽습니다. 화면에 보이는 내용은 이전과 동일합니다. (#74 @jiwonpapa 님께서 제보해주셨습니다.)
- 관리자 페이지 목록을 열 때 페이지 본문을 데이터베이스에서 읽지 않습니다. 목록은 제목·주소·발행 여부만 쓰는데 본문까지 함께 읽고 있었습니다. 본문이 긴 페이지가 많은 사이트일수록 목록을 여는 속도와 서버 메모리 사용이 개선되며, 화면에 보이는 내용은 이전과 동일합니다. (#76 @jordy-bitree 님께서 제보해주셨습니다.)
- 발행 페이지 목록과 통합검색의 페이지 탭 정렬에 필요한 색인을 추가했습니다. 기존 사이트도 업데이트 시 자동으로 반영됩니다.
- 페이지 검색이 조건에 맞는 페이지 전체를 읽어 온 뒤 화면에 보일 만큼만 잘라 내던 방식을 바꿨습니다. 이제 필요한 페이지 분량만 조회하므로, 페이지가 많은 사이트에서 검색이 빨라지고 메모리 사용량이 줄어듭니다.
- 검색 결과가 아주 많으면 총 건수를 "N건 이상" 으로 표시하고, 다음 페이지 이동은 끝까지 열어 둡니다.
- 페이지 검색 탭의 배지 숫자도 세지 못한 건수를 정확한 것처럼 표시하지 않습니다. 배지를 표시하지 않는 화면에서는 그 숫자를 세는 작업 자체를 건너뜁니다.
- 관리자 페이지 목록의 총 건수도 일정 규모까지만 정확히 세고 그보다 많으면 "N건 이상" 으로 표시합니다. 페이지 이동은 끝까지 열려 있습니다.
- 개선된 사이트맵 생성 기능을 사용하기 위해 이 모듈은 이제 코어 7.0.6 이상이 필요합니다.
- 첨부파일 저장 디스크 설정 항목을 제거했습니다. 설정 파일 자체가 그 디스크에 저장되는 구조라 값을 바꿔도 반영될 수 없는 항목이었습니다(기존에도 항상 기본값으로 동작). 저장 위치는 서버 파일 저장소 설정으로 관리합니다. (#81 @jiwonpapa 님께서 제보해주셨습니다.)
Fixed
- 데이터베이스에서 일부 컬럼의 설명이 비어 있던 문제를 바로잡았습니다. 회원·작성자 등 다른 표를 가리키는 컬럼이 대상이며, 업그레이드하면 이미 운영 중인 데이터베이스에도 설명이 채워집니다(직접 적어 넣은 설명은 그대로 둡니다).
- 관리자 페이지 목록에서 상세나 수정 화면에 다녀오면 보고 있던 페이지와 검색 조건이 사라지고 1페이지로 되돌아가던 문제를 수정했습니다. (#75 @jiwonpapa 님께서 제보해주셨습니다.)
- 페이지 활동 로그에서 "제목"·"내용" 변경 항목의 이름이 비어 보이던 문제를 수정했습니다.
- 다른 페이지의 주소로 특정 페이지의 이전 버전 내용을 열람할 수 있던 문제를 수정했습니다.
- 다른 페이지에 속한 버전으로 복원을 시도하면 "복원에 실패했습니다" 라는 서버 오류가 나던 문제를 수정했습니다. 이제 열람과 동일하게 "찾을 수 없음" 으로 안내합니다.
- 관리자 목록에서 검색·필터·정렬을 바꿀 때 표가 다시 그려지는 동안 로딩 표시가 나오지 않던 문제를 수정했습니다. 응답이 늦으면 아무 반응이 없는 것처럼 보여 같은 조작을 반복하게 되던 상황이 사라집니다.
- 통합검색에서 페이지 제목으로 찾을 수 없던 문제를 수정했습니다. 한국어·영어 어느 쪽 제목으로도, 제목의 일부만 입력해도 검색됩니다.
- 통합검색의 페이지 결과에서 같은 시각에 등록된 페이지가 여러 건일 때 목록 순서가 흔들리던 문제를 수정했습니다.
- 페이지 관리 목록에서 뒤쪽 페이지를 보던 중 정렬을 바꾸면 이전 페이지 번호에 그대로 머물러 엉뚱한 구간이 보이던 문제를 수정했습니다. 이제 정렬을 바꾸면 첫 페이지부터 보여줍니다.
- 페이지 관리 목록에서 페이지가 아주 많아 총 건수를 끝까지 세지 못하면 "1페이지뿐" 으로 표시되어 뒤쪽 페이지를 볼 수 없던 문제를 수정했습니다.
[1.0.1] - 2026-07-08
Fixed
- 페이지를 삭제한 뒤 같은 슬러그(주소)로 새 페이지를 다시 만들 수 있도록 수정했습니다. 이전에는 삭제한 페이지의 슬러그가 남아 "이미 사용 중"으로 표시되어 동일 주소로 페이지를 다시 만들 수 없었습니다.
- 페이지 등록 / 수정 화면에서 첨부파일을 한 번에 여러 개 올릴 때, 올린 순서대로 첨부가 저장되도록 정리했습니다. 이전에는 여러 파일을 동시에 올릴 때 순서가 뒤섞여 저장되는 경우가 있었습니다. 저장된 첨부의 순서 변경은 수정 화면에서 드래그로 즉시 반영됩니다.
- 페이지를 수정하다가 새 페이지 등록 화면으로 이동했을 때, 직전 페이지의 첨부파일·제목·슬러그와 "사용 가능한 슬러그입니다" 안내가 등록 화면에 그대로 남아 보이던 문제를 수정했습니다.
- 새 페이지 등록 화면에서 슬러그를 입력하기 전 주소 미리보기가 "/page/{{slug}}" 처럼 표시되던 문제를 수정했습니다. 이제 입력 전에는 "/page/example" 로 보이고, 입력하면 입력한 주소로 즉시 바뀝니다.
- 관리자 페이지 상세 화면에서 첨부 이미지 미리보기(썸네일)가 표시되지 않고 다운로드 버튼도 보이지 않던 문제를 수정했습니다. 이제 발행 여부와 관계없이 썸네일이 표시되고, 다운로드 버튼으로 첨부파일을 내려받을 수 있습니다. 미발행 페이지의 첨부파일 다운로드는 페이지 조회 권한이 있는 관리자에게만 허용되며, 비로그인 사용자와 일반 회원에게는 이전과 동일하게 차단됩니다.
- 사용자 페이지 화면의 첨부파일 목록에서도 이미지 첨부는 썸네일로 미리 볼 수 있도록 했습니다. 이전에는 이미지도 파일 아이콘으로만 표시되었습니다.
- 페이지를 수정·삭제하거나 이전 버전으로 복원한 직후 해당 페이지 상세 화면의 검색엔진용 캐시가 즉시 갱신되도록 수정했습니다. 이전에는 일부 캐시가 갱신되지 않아 변경 전 내용이 검색엔진에 남는 경우가 있었습니다.
- 페이지 목록에서 여러 페이지를 한 번에 발행 / 미발행할 때 활동 이력에 발행 여부가 기록되지 않던 문제를 수정했습니다. 이제 일괄 처리에서도 페이지별로 발행 / 미발행 기록이 남습니다.
- 페이지 관리 목록에서 검색 조건 '전체'로 슬러그를 검색해도 결과가 나오지 않던 문제를 수정했습니다 — '전체'는 제목과 슬러그를 함께 검색하고, '제목'을 고르면 제목만 검색됩니다.
- 페이지 관리 목록의 페이지당 표시 개수 기본값이 화면 표시(20건)와 실제 조회(15건) 간에 어긋나던 문제를 수정했습니다 — 기본값을 20건으로 통일했습니다.
- 페이지 관리 목록에서 아주 긴 검색어를 입력하면 오류 화면이 뜨던 문제를 수정했습니다 — 검색어 길이를 100자로 제한해 안내 메시지로 처리합니다.
- 페이지 상세의 버전 이력에서 "변경내역" 항목이
title·content같은 영문 필드명으로 표시되던 문제를 수정했습니다 — 이제 "제목", "내용", "SEO 정보" 처럼 알아보기 쉬운 이름으로 표시됩니다. - 관리자가 발행 전 페이지를 사용자 화면에서 미리 확인할 수 있게 되었습니다. 미리보기 화면에는 미발행 상태임을 알리는 안내가 표시되며, 비로그인 사용자와 일반 회원에게는 이전과 동일하게 노출되지 않습니다.
- 페이지 첨부파일을 올릴 때 허용 용량을 초과하거나 허용되지 않은 형식의 파일을 선택하면 안내 메시지가 표시됩니다 — 이전에는 업로드가 조용히 막히기만 하고 이유를 알 수 없었습니다.
- 모바일 화면의 페이지 목록에서 검색어를 입력하고 검색해도 검색이 적용되지 않고 전체 목록이 그대로 나오던 문제를 수정했습니다. 이제 모바일에서도 입력한 검색어로 정상 검색됩니다.
- 페이지 등록 / 수정 화면에서 취소를 눌렀을 때 이동 위치가 일정하지 않던 문제를 수정했습니다 — 수정 화면에서는 해당 페이지 상세로, 새 페이지 등록 화면에서는 목록으로 돌아갑니다.
Changed
- 페이지 관리 화면(목록·상세·등록/수정)의 버튼·선택 상자·카드 여백 등 전반적인 구성을 다른 관리 화면과 통일해 정돈했습니다. 상세 화면의 첨부파일 목록은 처음부터 펼쳐져 보이고, 어두운 화면(다크 모드)에서 첨부 항목과 카드가 더 또렷하게 구분됩니다.
[1.0.0] - 2026-07-01
Changed
- 페이지 등록 / 수정 화면의 입력 행(슬러그·발행여부 그리드, 제목, 내용, SEO 3개 항목)을 sirsoft-admin_basic 표준 시맨틱과 정합 — 라벨↔입력칸 간격이 한 폼 안에서 균일해지고, SEO 보조 라벨의 톤이 일관되며, 슬러그 안내문구의 위쪽 간격이 자연스럽게 정돈됩니다.
- 페이지 관리 화면의 발행 상태 필터(전체 / 발행 / 미발행)를 좌측 별도 카드에서 목록 상단 도구막대의 선택 메뉴로 통합 — 정렬·페이지 크기 선택과 같은 결의 드롭다운으로 정돈되어 한 줄에서 필터·정렬·페이지 크기를 함께 다룰 수 있습니다.
- 페이지 등록 / 수정 화면의 발행 상태·SEO 섹션에서 라벨과 입력칸 사이에 옅은 회색 분리선과 세로 간격이 끼어 보이던 회귀를 수정했습니다 — 라벨과 입력칸이 한 필드로 시각적으로 응집됩니다.
Added
- 레이아웃 편집기에서 페이지 화면을 샘플 데이터로 미리보고 편집할 수 있도록 편집 스펙을 추가했습니다. 페이지 상세와 약관·개인정보 안내가 샘플 데이터로 표시되며, 게시됨/초안 미리보기 상태도 전환해 볼 수 있습니다.
- 레이아웃 편집기의 화면 상태 미리보기에 관리자 페이지 폼(신규/수정/검증 실패)을 추가해 편집기에서 전환해 미리볼 수 있도록 했습니다.
- 레이아웃 편집기 데이터 소스 목록에서 이 확장이 제공하는 데이터 소스가 친화 명칭으로 표시되고, 어느 확장이 제공했는지 출처가 함께 표시됩니다.
Changed
- 페이지 등록 / 수정 화면의 입력 행 컨테이너를 sirsoft-admin_basic 표준 시맨틱 (.row-stack) 과 정합 — 행 사이 옅은 회색 구분선(1px) 이 자동 적용되어 페이지 폼의 행 묶음 가독성 개선.
[1.0.0-beta.3] - 2026-05-11
Changed
- 관리자 화면 좌우 정렬 컨테이너(섹션 헤더 · 액션바 · 카드 상단부 등) 외형을 표준 시맨틱(.flex-between)으로 정리 — 시각 변경 없음, 향후 톤 조정이 한 곳에서 가능.
- 페이지 등록 / 수정 화면의 입력 박스 외형을 관리자 표준 외형으로 정렬 — 다른 관리자 화면과 동일한 모양으로 보이도록 일관화.
- 페이지 목록의 발행 / 미발행 상태 배지 외형을 표준 배지 시맨틱으로 정리.
- 페이지 등록 / 수정 화면의 취소·저장 버튼을 페이지 상단에서 화면 하단 고정(스티키) 으로 이전 — 페이지 타이틀은 일반 흐름으로 정리되고, 첨부 / SEO 섹션을 스크롤하는 동안 저장 버튼이 항상 화면에 보이도록 일관화.
- 페이지 등록 / 수정 화면의 입력 행 컨테이너를 sirsoft-admin_basic 표준 시맨틱 (.row-stack) 과 정합 — 자식 행의 잔존 수직 패딩 / 마진이 표준 간격으로 정돈되고, 입력 박스 인라인 외형 토큰도 표준 입력 자산 (.input) 정의가 우선 표시되도록 정리.
- 페이지 관리 화면 (목록 · 상세 · 등록 / 수정) 의 콘텐츠 카드 / 패널 외형(흰 배경 · 테두리 · 라운드) 을 표준 시맨틱 (.admin-card) 과 정합 — 다른 관리자 화면과 같은 결로 통일하고, 패딩 · 외곽 마진 등 호출처별 변형 토큰만 보존.
- 페이지 관리 화면의 콘텐츠 카드 padding 을 표준 카드 외형 정의로 흡수 — 호출처가 들고 있던 padding 토큰(컴팩트 / 와이드 변형 등) 이 제거되고 모든 카드가 동일한 외형으로 통일.
- 페이지 관리 화면의 콘텐츠 카드 호출처를 표준 카드 자산 (.admin-card) 단독으로 일원화 — 외곽 마진 등 카드별 추가 토큰을 제거하고 모든 카드가 동일한 외형으로 표시.
- 페이지 관리 화면 곳곳의 본문 텍스트 (.text-body) 자산 정의를 실제 호출처 raw 패턴까지 흡수 — 텍스트 톤이 한 곳에서 일괄 조정 가능.
- 페이지 상세 화면의 카드 섹션 헤더 (펼침 / 접힘 가능한 영역 포함) 의 하단 분리선을 sirsoft-admin_basic 표준 헤더 외형 (.panel-header) 자산과 정합 — 직전 시맨틱 정리 과정에서 분리선이 흐려져 헤더 / 본문 경계가 모호하게 보이던 회귀를 해소.
Added
- 페이지 수정 시 슬러그를 변경할 수 있도록 개선 (중복 확인 후 저장) (#16 @movielee2020 님께서 건의해주셨습니다.)
- 관리자 목록에서 슬러그 및 URL 텍스트 클릭 시 유저 화면으로 이동하는 링크 추가 (새 탭으로 열림) (#16 @movielee2020 님께서 건의해주셨습니다.)
- 활동 로그의 페이지 액션 라벨을 페이지 모듈 다국어 파일에서 관리하도록 정리 — 모듈 라벨이 자기 영역에서 자기설명되며, 일본어 등 추가 언어팩이 키 누락 없이 동기화
Fixed
- 키워드 검색 결과의 전체 건수가 발행된 모든 페이지 수로 부풀려지던 문제 수정
- 페이지 발행/발행 취소 활동 로그의 "액션" 열에
page.publish/page.unpublish가 번역되지 않은 키 그대로 노출되던 문제 수정 - 레이아웃 편집기 라우트 트리에서 페이지 관련 라우트 4건(목록·등록·수정·상세)의 라벨이 경로 마지막 세그먼트(
pages/create/edit/:id)로만 표시되던 문제 수정. 한국어/영어 라벨이 정상 표시됩니다.
[1.0.0-beta.2] - 2026-04-20
Changed
- 코어 최소 요구 버전을 7.0.0-beta.2 로 상향
- 페이지 편집 다국어 탭을 동적 생성으로 전환
- 페이지 에디터를 확장 포인트(extension_point)로 변환
Fixed
- 사용자 화면 버전 배지가 잘못된 형식으로 표시되던 문제 수정 (#4 @laelbe 님께서 제보해주셨습니다.)
- 존재하지 않는 컬럼을 참조하던 draft/archived 배지 코드 제거
[1.0.0-beta.1] - 2026-04-01
Changed
- 오픈 베타 릴리즈
[0.3.4] - 2026-03-30
Fixed
- 관리자 다크모드 레이아웃 수정 — 2개 파일에서 누락된
dark:variant 약 7건 추가 (focus:ring, hover:bg 등) - 페이지 목록에서 다른 페이지로 이동 후 돌아올 때 이전 검색어가 Input에 유지되던 문제 수정 —
_global상태를_local로 전환 (admin_page_list.json)
[0.3.3] - 2026-03-30
Fixed
- Scout
query()콜백 내orWhere('slug', ...)조건이queryScoutModelsByIds()재실행 시 total=0을 반환하던 버그 수정 (PageRepository) - BulkChangePageStatusRequest 다국어 키 매핑 오류 수정 —
ids.min,ids.integer키 경로 불일치 (BulkChangePageStatusRequest, validation.php) - PageListRequest
search.max다국어 키가slug.max를 재사용하던 문제 수정 (PageListRequest, validation.php)
Changed
- 일괄발행/일괄발행해제 모달에 스피너 처리 추가 — sequence 핸들러, 버튼 비활성화, Icon spinner, onSuccess 순서 수정(closeModal 마지막), onError 리셋 (admin_page_list.json)
- 목록 DataGrid 선택 카운트 텍스트 비활성화 —
selectedCountText: ""(admin_page_list.json)
[0.3.2] - 2026-03-30
Fixed
- 슬러그 중복 확인 API 응답의
exists값을 무시하고 항상 사용 가능으로 표시되던 버그 수정 (admin_page_form.json) - 슬러그 중복 확인 요청 시
exclude_page_id→exclude_id파라미터명 불일치 수정 (admin_page_form.json) - FormRequest
messages()다국어 키 경로에 잘못된page.접두사가 포함되어 번역이 되지 않던 버그 수정 (CheckSlugRequest, StorePageRequest, UpdatePageRequest, PageListRequest, ChangePageStatusRequest, BulkChangePageStatusRequest) - 목록 검색 시
filters배열 형식이 백엔드에서 처리되지 않던 버그 수정 — PageListRequest에 filters 검증 추가, PageRepository에 normalizeSearchFilters 변환 로직 추가 - 목록 페이지네이션 응답 경로 불일치 수정 —
pagination→meta(admin_page_list.json) - 목록 fallback 데이터 구조가 API 응답 구조와 불일치하던 버그 수정 (admin_page_list.json)
[0.3.1] - 2026-03-30
Changed
- PageRepository의 검색을 Laravel Scout
Page::search()파이프라인으로 전환 — DBMS별 검색 분기를 엔진 내부에서 처리 applyTitleKeywordSearch()를DatabaseFulltextEngine::whereFulltext()정적 헬퍼로 전환 — 다중 DBMS 호환searchIndexShouldBeUpdated()훅 기반 전환 — 검색 플러그인이 Page 인덱스 업데이트 제어 가능- 마이그레이션 FULLTEXT 인덱스 생성을
DatabaseFulltextEngine::addFulltextIndex()정적 헬퍼로 전환
[0.3.0] - 2026-03-30
Added
- FULLTEXT 인덱스(ngram) 추가 — pages(title, content) 총 2개
- Page 모델에 Laravel Scout
Searchable트레이트 +FulltextSearchable인터페이스 적용
Changed
- 페이지 검색 쿼리를
LIKE '%keyword%'에서MATCH...AGAINST IN BOOLEAN MODE로 전환 — title, content 검색 성능 향상
[0.2.0] - 2026-03-25
Added
- PageActivityLogListener: 페이지/페이지첨부파일 전체 로깅
- 활동 로그 다국어 키 10개 정의 (resources/lang/ko/activity_log.php, en/activity_log.php)
- $activityLogFields 메타데이터: Page 모델
- ActivityLog 샘플 시더 (database/seeders/ActivityLogSampleSeeder.php)
- ActivityLogDescriptionResolver: 활동 로그 표시 시점에 페이지 제목을 ID에서 해석하는 필터 훅 리스너
Fixed
- 활동 로그 description에 번역 키가 원문으로 노출되는 문제 수정 — src/lang 번역 파일 동기화, description_params 불일치 수정
[0.1.9] - 2026-03-23
Changed
- API Resource: creator.id / updater.id → creator.uuid / updater.uuid 전환 (PageResource, PageVersionResource)
[0.1.8] - 2026-03-21
Fixed
- 공개 페이지 API 라우트 throttle을 60/분에서 600/분으로 상향 — 게시판 모듈과 동일 카운터 공유로 인한 429 Too Many Requests 방지
[0.1.7] - 2026-03-18
Changed
SeoPageCacheListener— 페이지 변경 시search/index무효화 추가
[0.1.6] - 2026-03-16
Changed
- 마이그레이션 통합 — 증분 마이그레이션을 테이블당 1개 create 마이그레이션으로 정리
- 라이선스 프로그램 명칭 정비
[0.1.5] - 2026-03-11
Added
- manifest에 license 필드 및 LICENSE 파일 추가
Fixed
- Page 모델
$fillable에created_by,updated_by누락 수정 — 페이지 생성 시 생성자/수정자 ID가 DB에 저장되지 않던 문제 해결 PageRepositorySearchTest헬퍼에서 하드코딩된 user ID를 팩토리 생성 유저로 변경
Changed
ModuleTestCase에$migrated플래그 추가 — 마이그레이션 체크를 프로세스당 1회로 최적화
[0.1.4] - 2026-03-11
Added
PageCollection에HasAbilityChecktrait 추가 — Collection-level abilities (can_create, can_update, can_delete) 반환PageService에 scope 검증 추가 —getPage,updatePage,deletePage,changePublishStatus,restoreVersion메서드에서PermissionHelper::checkScopeAccess()호출PageController에AccessDeniedHttpExceptioncatch 추가 — scope 위반 시 403 응답- 목록 화면: "페이지 추가" 버튼, 일괄 발행/미발행 버튼에 abilities 기반 disabled 제어
- 폼 화면: computed
isReadOnly패턴 적용 — 수정 권한 없을 시 읽기전용 배너 표시 및 모든 폼 필드 비활성화 - 상세 화면: DS
pageerrorHandling (403/404) 추가, 수정/삭제/발행/복원 버튼 abilities 기반 disabled 제어 - 다국어: 읽기전용 배너 메시지 추가 (ko/en)
- 백엔드 테스트: Collection abilities 응답 구조, per-item abilities, Service-level scope 검증 (AccessDeniedHttpException) 테스트 추가
- 프론트엔드 테스트: 권한 기반 UI 제어 검증 테스트 추가 (목록/폼/상세 각 레이아웃)
[0.1.3] - 2026-03-10
Changed
- 권한 카테고리에
resource_route_key,owner_key스코프 메타데이터 추가 (pages) - 라우트 미들웨어
except:owner:page옵션 제거 (scope_type 데이터 기반 시스템으로 전환) - Repository 목록 조회에
PermissionHelper::applyPermissionScope()적용 (Page) PermissionBypassable인터페이스 및getBypassUserId()제거 (Page, PageVersion, PageAttachment 모델)
[0.1.2] - 2026-03-10
Changed
- API 리소스 권한 플래그 키
permissions→abilities로 변경 (코어 표준화) permissionMap()→abilityMap()메서드명 변경
Fixed
- 페이지 생성/수정 요청에서 제목(title) 다국어 필드에
array검증 규칙 누락 수정
[0.1.1] - 2026-02-27
Added
- 코어 페이지 관리 기능을 독립 모듈로 분리
- 페이지 CRUD (생성, 조회, 수정, 삭제)
- 발행/미발행 토글 및 일괄 발행 기능
- 슬러그 기반 페이지 URL 및 중복 확인
- 버전 관리 시스템 (이력 조회, 상세, 복원)
- 첨부파일 시스템 (업로드, 삭제, 순서 변경, 다운로드, 미리보기)
- 공개 페이지 API (슬러그 기반 조회, 첨부파일 다운로드/미리보기)
- 통합검색 연동 (PageSearchListener)
- 관리자 레이아웃 3종 (목록, 등록/수정, 상세)
- 다국어 지원 (ko, en)
- 권한 4종 (read, create, update, delete)
- 관리자 메뉴 등록
Changed
status(draft/published/archived) Enum →publishedboolean 단순화type(content/policy) 구분 제거- 단일 테이블 패턴 적용 (동적 테이블 → 정적 테이블)