feat(seo): changefreq Enum 도입 + 사이트맵 사전결함 테스트 정정

계획서 위임 항목(Q6·Q7·Q8) 마감.

Q8: sitemaps.org 폐쇄 어휘를 App\Enums\SitemapChangeFreq 로 도입해
저장(SitemapIndexer)·렌더(SitemapXmlRenderer) 두 경계에서 normalize 하고,
생산 지점(생성기 정적 URL·3 contributor·4 리스너) 리터럴을 enum case 로 치환.
규격에 없는 changefreq 가 사이트맵에 그대로 출력되던 것을 차단(대소문자·공백 흡수).

Q6: Upgrade_7_0_0_beta_3Test 의 "동결 TARGETS === 살아있는 config" 단언은
동결 규정과 충돌하는 무효 불변식(config 는 에서 정당하게 진화)이므로
의도적 divergence 를 검증하도록 재작성.

Q7: 코어 20건 사전 실패를 격리 실측으로 재분류 — 6클러스터는 전 스위트
OOM/싱글톤 누수 오염(격리 시 통과), GenericNotificationViaTest 는 readiness
게이트를 mock 하지 않아 빈 settings 로 mail 이 항상 제외되던 stale test 를 정정.
This commit is contained in:
HeuJung committed 2026-07-19 20:13:05 +09:00
1 parent 124433148c
commit 8fda5d31e1
17 files changed
+255 -30

No files matched your search

@@ -4,6 +4,7 @@ namespace Modules\Sirsoft\Board\Listeners;
use App\Contracts\Extension\CacheInterface;
use App\Contracts\Extension\HookListenerInterface;
use App\Enums\SitemapChangeFreq;
use App\Jobs\GenerateSitemapJob;
use App\Seo\Contracts\SeoCacheManagerInterface;
use App\Seo\SeoCacheRegenerator;
@@ -185,7 +186,7 @@ class SeoBoardCacheListener implements HookListenerInterface
$indexer->indexResource('board_post', $post->id, 'sirsoft-board', [[
'url' => "/board/{$slug}/{$post->id}",
'lastmod' => $post->updated_at?->toW3cString(),
'changefreq' => 'monthly',
'changefreq' => SitemapChangeFreq::Monthly->value,
'priority' => 0.5,
]]);
} else {
@@ -226,7 +227,7 @@ class SeoBoardCacheListener implements HookListenerInterface
$indexer->indexResource('board', $board->id, 'sirsoft-board', [[
'url' => "/board/{$board->slug}",
'lastmod' => $board->updated_at?->toW3cString(),
'changefreq' => 'daily',
'changefreq' => SitemapChangeFreq::Daily->value,
'priority' => 0.6,
]]);
} else {
@@ -2,6 +2,7 @@
namespace Modules\Sirsoft\Board\Seo;
use App\Enums\SitemapChangeFreq;
use App\Seo\AbstractSitemapContributor;
use Illuminate\Support\Facades\Log;
use Modules\Sirsoft\Board\Repositories\Contracts\BoardRepositoryInterface;
@@ -82,7 +83,7 @@ class BoardSitemapContributor extends AbstractSitemapContributor
if ($seoBoards) {
yield [
'url' => '/boards',
'changefreq' => 'weekly',
'changefreq' => SitemapChangeFreq::Weekly->value,
'priority' => 0.5,
'resource_type' => 'board_index',
'resource_id' => null,
@@ -100,7 +101,7 @@ class BoardSitemapContributor extends AbstractSitemapContributor
yield [
'url' => "/board/{$board->slug}",
'lastmod' => $board->updated_at?->toW3cString(),
'changefreq' => 'daily',
'changefreq' => SitemapChangeFreq::Daily->value,
'priority' => 0.6,
'resource_type' => 'board',
'resource_id' => (string) $board->id,
@@ -116,7 +117,7 @@ class BoardSitemapContributor extends AbstractSitemapContributor
yield [
'url' => "/board/{$board->slug}/{$post->id}",
'lastmod' => $post->updated_at?->toW3cString(),
'changefreq' => 'monthly',
'changefreq' => SitemapChangeFreq::Monthly->value,
'priority' => 0.5,
'resource_type' => 'board_post',
'resource_id' => (string) $post->id,
@@ -4,6 +4,7 @@ namespace Modules\Sirsoft\Ecommerce\Listeners;
use App\Contracts\Extension\CacheInterface;
use App\Contracts\Extension\HookListenerInterface;
use App\Enums\SitemapChangeFreq;
use App\Jobs\GenerateSitemapJob;
use App\Seo\Contracts\SeoCacheManagerInterface;
use App\Seo\SitemapIndexer;
@@ -145,7 +146,7 @@ class SeoCategoryCacheListener implements HookListenerInterface
$indexer->indexResource('category', $category->id, 'sirsoft-ecommerce', [[
'url' => "/{$routePath}/category/{$category->slug}",
'lastmod' => $category->updated_at?->toW3cString(),
'changefreq' => 'weekly',
'changefreq' => SitemapChangeFreq::Weekly->value,
'priority' => 0.6,
]]);
} else {
@@ -4,6 +4,7 @@ namespace Modules\Sirsoft\Ecommerce\Listeners;
use App\Contracts\Extension\CacheInterface;
use App\Contracts\Extension\HookListenerInterface;
use App\Enums\SitemapChangeFreq;
use App\Jobs\GenerateSitemapJob;
use App\Seo\Contracts\SeoCacheManagerInterface;
use App\Seo\SeoCacheRegenerator;
@@ -163,7 +164,7 @@ class SeoProductCacheListener implements HookListenerInterface
$indexer->indexResource('product', $product->id, 'sirsoft-ecommerce', [[
'url' => "/{$routePath}/products/{$product->id}",
'lastmod' => $product->updated_at?->toW3cString(),
'changefreq' => 'weekly',
'changefreq' => SitemapChangeFreq::Weekly->value,
'priority' => 0.8,
]]);
} else {
@@ -2,6 +2,7 @@
namespace Modules\Sirsoft\Ecommerce\Seo;
use App\Enums\SitemapChangeFreq;
use App\Seo\AbstractSitemapContributor;
use Illuminate\Support\Facades\Log;
use Modules\Sirsoft\Ecommerce\Repositories\Contracts\CategoryRepositoryInterface;
@@ -79,7 +80,7 @@ class EcommerceSitemapContributor extends AbstractSitemapContributor
if ((bool) g7_module_settings('sirsoft-ecommerce', 'seo.seo_shop_index', true)) {
yield [
'url' => "/{$routePath}/products",
'changefreq' => 'daily',
'changefreq' => SitemapChangeFreq::Daily->value,
'priority' => 0.7,
'resource_type' => 'shop_index',
'resource_id' => null,
@@ -92,7 +93,7 @@ class EcommerceSitemapContributor extends AbstractSitemapContributor
yield [
'url' => "/{$routePath}/category/{$category->slug}",
'lastmod' => $category->updated_at?->toW3cString(),
'changefreq' => 'weekly',
'changefreq' => SitemapChangeFreq::Weekly->value,
'priority' => 0.6,
'resource_type' => 'category',
'resource_id' => (string) $category->id,
@@ -106,7 +107,7 @@ class EcommerceSitemapContributor extends AbstractSitemapContributor
yield [
'url' => "/{$routePath}/products/{$product->id}",
'lastmod' => $product->updated_at?->toW3cString(),
'changefreq' => 'weekly',
'changefreq' => SitemapChangeFreq::Weekly->value,
'priority' => 0.8,
'resource_type' => 'product',
'resource_id' => (string) $product->id,
@@ -4,6 +4,7 @@ namespace Modules\Sirsoft\Page\Listeners;
use App\Contracts\Extension\CacheInterface;
use App\Contracts\Extension\HookListenerInterface;
use App\Enums\SitemapChangeFreq;
use App\Jobs\GenerateSitemapJob;
use App\Seo\Contracts\SeoCacheManagerInterface;
use App\Seo\SitemapIndexer;
@@ -137,7 +138,7 @@ class SeoPageCacheListener implements HookListenerInterface
$indexer->indexResource('page', $page->id, 'sirsoft-page', [[
'url' => "/page/{$page->slug}",
'lastmod' => $page->updated_at?->toW3cString(),
'changefreq' => 'monthly',
'changefreq' => SitemapChangeFreq::Monthly->value,
'priority' => 0.5,
]]);
} else {
@@ -2,6 +2,7 @@
namespace Modules\Sirsoft\Page\Seo;
use App\Enums\SitemapChangeFreq;
use App\Seo\AbstractSitemapContributor;
use Illuminate\Support\Facades\Log;
use Modules\Sirsoft\Page\Repositories\Contracts\PageRepositoryInterface;
@@ -60,7 +61,7 @@ class PageSitemapContributor extends AbstractSitemapContributor
yield [
'url' => "/page/{$page->slug}",
'lastmod' => $page->updated_at?->toW3cString(),
'changefreq' => 'monthly',
'changefreq' => SitemapChangeFreq::Monthly->value,
'priority' => 0.5,
'resource_type' => 'page',
'resource_id' => (string) $page->id,