diff --git a/.gitignore b/.gitignore index bea56b9b3..e6d65b496 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,7 @@ tsconfig.tsbuildinfo tsconfig.tsbuildinfo # Sentry Config File .env.sentry-build-plugin + +# next-sitemap 생성 파일 (postbuild) +public/sitemap*.xml +public/robots.txt diff --git a/.pnp.cjs b/.pnp.cjs index 5f6a69559..8d58376c4 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -71,6 +71,7 @@ const RAW_RUNTIME_STATE = ["koin_web_recode", "workspace:."],\ ["lottie-react", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:2.4.1"],\ ["next", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:15.5.18"],\ + ["next-sitemap", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:4.2.3"],\ ["postcss", "npm:8.5.14"],\ ["prettier", "npm:3.6.2"],\ ["react", "npm:19.2.6"],\ @@ -3649,6 +3650,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@corex/deepmerge", [\ + ["npm:4.0.43", {\ + "packageLocation": "./.yarn/cache/@corex-deepmerge-npm-4.0.43-390ed1175e-c9ac6163e9.zip/node_modules/@corex/deepmerge/",\ + "packageDependencies": [\ + ["@corex/deepmerge", "npm:4.0.43"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@csstools/css-parser-algorithms", [\ ["npm:2.5.0", {\ "packageLocation": "./.yarn/cache/@csstools-css-parser-algorithms-npm-2.5.0-b22abafd96-f03938d623.zip/node_modules/@csstools/css-parser-algorithms/",\ @@ -4836,6 +4846,13 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@next/env", [\ + ["npm:13.5.11", {\ + "packageLocation": "./.yarn/cache/@next-env-npm-13.5.11-7bdb393acd-2d34ec742e.zip/node_modules/@next/env/",\ + "packageDependencies": [\ + ["@next/env", "npm:13.5.11"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:15.5.18", {\ "packageLocation": "./.yarn/cache/@next-env-npm-15.5.18-43762b7e71-476db14578.zip/node_modules/@next/env/",\ "packageDependencies": [\ @@ -13475,6 +13492,7 @@ const RAW_RUNTIME_STATE = ["koin_web_recode", "workspace:."],\ ["lottie-react", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:2.4.1"],\ ["next", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:15.5.18"],\ + ["next-sitemap", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:4.2.3"],\ ["postcss", "npm:8.5.14"],\ ["prettier", "npm:3.6.2"],\ ["react", "npm:19.2.6"],\ @@ -14223,6 +14241,32 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["next-sitemap", [\ + ["npm:4.2.3", {\ + "packageLocation": "./.yarn/cache/next-sitemap-npm-4.2.3-463254c2cb-8e88c941b5.zip/node_modules/next-sitemap/",\ + "packageDependencies": [\ + ["next-sitemap", "npm:4.2.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:4.2.3", {\ + "packageLocation": "./.yarn/__virtual__/next-sitemap-virtual-6a6b56b1a7/0/cache/next-sitemap-npm-4.2.3-463254c2cb-8e88c941b5.zip/node_modules/next-sitemap/",\ + "packageDependencies": [\ + ["@corex/deepmerge", "npm:4.0.43"],\ + ["@next/env", "npm:13.5.11"],\ + ["@types/next", null],\ + ["fast-glob", "npm:3.3.2"],\ + ["minimist", "npm:1.2.8"],\ + ["next", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:15.5.18"],\ + ["next-sitemap", "virtual:921150aa31da2575af7c36f953e9f13b3419705f08359e02e507cdb46eef3a76096cce8027f1cca0709c04e91d009a713934e907c9c1efc1e28e5b528ec25863#npm:4.2.3"]\ + ],\ + "packagePeers": [\ + "@types/next",\ + "next"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["no-case", [\ ["npm:3.0.4", {\ "packageLocation": "./.yarn/cache/no-case-npm-3.0.4-12884c3d98-0b2ebc113d.zip/node_modules/no-case/",\ diff --git a/.yarn/cache/@corex-deepmerge-npm-4.0.43-390ed1175e-c9ac6163e9.zip b/.yarn/cache/@corex-deepmerge-npm-4.0.43-390ed1175e-c9ac6163e9.zip new file mode 100644 index 000000000..d4796689f Binary files /dev/null and b/.yarn/cache/@corex-deepmerge-npm-4.0.43-390ed1175e-c9ac6163e9.zip differ diff --git a/.yarn/cache/@next-env-npm-13.5.11-7bdb393acd-2d34ec742e.zip b/.yarn/cache/@next-env-npm-13.5.11-7bdb393acd-2d34ec742e.zip new file mode 100644 index 000000000..f943a0f42 Binary files /dev/null and b/.yarn/cache/@next-env-npm-13.5.11-7bdb393acd-2d34ec742e.zip differ diff --git a/.yarn/cache/next-sitemap-npm-4.2.3-463254c2cb-8e88c941b5.zip b/.yarn/cache/next-sitemap-npm-4.2.3-463254c2cb-8e88c941b5.zip new file mode 100644 index 000000000..f36df5429 Binary files /dev/null and b/.yarn/cache/next-sitemap-npm-4.2.3-463254c2cb-8e88c941b5.zip differ diff --git a/next-sitemap.config.js b/next-sitemap.config.js new file mode 100644 index 000000000..9493b1987 --- /dev/null +++ b/next-sitemap.config.js @@ -0,0 +1,64 @@ +/** + * next-sitemap 설정 + * 빌드 후 postbuild 스크립트로 실행되어 public/sitemap*.xml 과 public/robots.txt 를 생성한다. + * stage/prod 환경 분기는 NEXT_PUBLIC_API_PATH 에 'stage' 포함 여부로 판단 (src/static/url.ts 와 동일 규칙). + */ + +const IS_STAGE = process.env.NEXT_PUBLIC_API_PATH?.includes('stage'); +const SITE_URL = IS_STAGE ? 'https://stage.koreatech.in' : 'https://koreatech.in'; + +const PRIVATE_PATHS = [ + '/auth', + '/auth/*', + '/webview/*', + '/report/*', + '/callvan/add', + '/callvan/chat/*', + '/callvan/notifications', + '/callvan/*/participants', + '/callvan/*/report/*', + '/timetable/modify', + '/clubs/new', + '/clubs/edit/*', + '/clubs/recruitment/edit/*', + '/clubs/*/event/edit/*', + '/lost-item/edit/*', + '/lost-item/report/*', + '/lost-item/chat', + '/store/review/*', + '/store/review/edit/**', +]; + +/** @type {import('next-sitemap').IConfig} */ +export default { + siteUrl: SITE_URL, + generateRobotsTxt: true, + sitemapSize: 5000, + changefreq: 'daily', + priority: 0.7, + exclude: ['/404', '/_error', '/_app', '/_document', ...PRIVATE_PATHS], + robotsTxtOptions: { + policies: [ + { + userAgent: '*', + allow: '/', + disallow: [ + '/auth', + '/webview', + '/report', + '/callvan/add', + '/callvan/chat', + '/callvan/notifications', + '/timetable/modify', + '/clubs/new', + '/clubs/edit', + '/clubs/recruitment/edit', + '/lost-item/edit', + '/lost-item/report', + '/lost-item/chat', + '/store/review', + ], + }, + ], + }, +}; diff --git a/package.json b/package.json index 14c2bcfff..5eb593dae 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "scripts": { "start": "next dev", "start:serve": "next start", - "build": "tsc && next build", + "build": "tsc && next build && next-sitemap", "test": "test --coverage", "sourcemap:clean": "find ./build -name '*.map' -type f -delete", "lint": "yarn lint:eslint && yarn lint:stylelint", @@ -81,6 +81,7 @@ "eslint-plugin-react-hooks": "^7.0.1", "globals": "^16.4.0", "jest": "^29.7.0", + "next-sitemap": "^4.2.3", "postcss": "^8.5.11", "prettier": "^3.6.2", "sass": "^1.53.0", diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e9e57dc4d..000000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/yarn.lock b/yarn.lock index 1a79ae366..4c92b2644 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2176,6 +2176,13 @@ __metadata: languageName: node linkType: hard +"@corex/deepmerge@npm:^4.0.43": + version: 4.0.43 + resolution: "@corex/deepmerge@npm:4.0.43" + checksum: 10/c9ac6163e982e81e3216a9fc7c68cd60b9788ad3b23d7387c9e9741b0274b42dfc332ae74b993e550c95e4256be5ce68045fc55d363aa083344392dc95b50d8b + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^2.5.0": version: 2.5.0 resolution: "@csstools/css-parser-algorithms@npm:2.5.0" @@ -3162,6 +3169,13 @@ __metadata: languageName: node linkType: hard +"@next/env@npm:^13.4.3": + version: 13.5.11 + resolution: "@next/env@npm:13.5.11" + checksum: 10/2d34ec742e28b4da54b7bfe62eb27c1c90f927f0dfe387a0af8c1a535faf75d80475e58a33472bdf722bab02349be074935e2bdf512b5fd0a46dab364700dd3d + languageName: node + linkType: hard + "@next/eslint-plugin-next@npm:^16.0.0": version: 16.0.0 resolution: "@next/eslint-plugin-next@npm:16.0.0" @@ -10048,6 +10062,7 @@ __metadata: jest: "npm:^29.7.0" lottie-react: "npm:^2.4.1" next: "npm:15.5.18" + next-sitemap: "npm:^4.2.3" postcss: "npm:^8.5.11" prettier: "npm:^3.6.2" react: "npm:^19.2.6" @@ -10473,7 +10488,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -10658,6 +10673,23 @@ __metadata: languageName: node linkType: hard +"next-sitemap@npm:^4.2.3": + version: 4.2.3 + resolution: "next-sitemap@npm:4.2.3" + dependencies: + "@corex/deepmerge": "npm:^4.0.43" + "@next/env": "npm:^13.4.3" + fast-glob: "npm:^3.2.12" + minimist: "npm:^1.2.8" + peerDependencies: + next: "*" + bin: + next-sitemap: bin/next-sitemap.mjs + next-sitemap-cjs: bin/next-sitemap.cjs + checksum: 10/8e88c941b5e487584abaa21a31a94d888c8d37e95892cd6b5bdbc121f49435f75c279e97508a7a99d3de0010e833f3769d0c2d0888d9228be4dbd48e031b831c + languageName: node + linkType: hard + "next@npm:15.5.18": version: 15.5.18 resolution: "next@npm:15.5.18"