diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..24af5b2 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,8 @@ +# 커밋 메시지 (Generate Commit Message 포함) + +커밋 메시지는 **반드시 한글**로 작성한다. + +- 형식: `feat: 내용`, `refactor: 내용`, `test: 내용` 등 +- 내용은 한글로, 제목 한 줄, 변경 의도가 드러나게 간결하게 + +예: `feat: 회원 가입 폼 유효성 검사 추가`, `refactor: 결제 모듈 상태 관리 로직 분리` diff --git a/layers/server/plugins/nitroPlugin.ts b/layers/server/plugins/nitroPlugin.ts index e5919c6..0303285 100644 --- a/layers/server/plugins/nitroPlugin.ts +++ b/layers/server/plugins/nitroPlugin.ts @@ -19,7 +19,7 @@ export default defineNitroPlugin(nitroApp => { // 헬스체크 경로 체크 함수 추가 const isHealthCheck = (path: string): boolean => { - return path === '/health' + return path === '/health' || path === '/api/healthz' } nitroApp.hooks.hook('request', event => { @@ -33,22 +33,23 @@ export default defineNitroPlugin(nitroApp => { const method = event.method || '' const headers = JSON.stringify(event.node.req.headers, null, 2) const requestId = generateRequestId() + const domain = event.node.req.headers.host || 'unknown' - if (process.env.NODE_ENV !== 'development') { + // if (process.env.NODE_ENV !== 'development') { console.log( - `Request Info {"requestId":"${requestId}", "type":"request","method":"${method}","url":"${event.path}","userIp":"${getIpAddress(event)}","userAgent":"${userAgent}", "headers" : "${headers}" }` + `Request Info {"requestId":"${requestId}", "type":"request","method":"${method}","domain":"${domain}","url":"${event.path}","userIp":"${getIpAddress(event)}","userAgent":"${userAgent}", "headers" : "${headers}" }` ) // 요청 완료 후 응답 상태 코드 로깅 event.node.res.on('finish', () => { console.log( - `Response Info {"requestId":"${requestId}","type":"response","method":"${method}","url":"${event.path}","statusCode":${event.node.res.statusCode},"responseTime":"${Date.now() - startTime}ms","userIp":"${getIpAddress(event)}","userAgent":"${userAgent}","statusMessage":"${event.node.res.statusMessage}","responseHeader": ${JSON.stringify(event.node.res.getHeaders(), null, 2)}}` + `Response Info {"requestId":"${requestId}","type":"response","method":"${method}","domain":"${domain}","url":"${event.path}","statusCode":${event.node.res.statusCode},"responseTime":"${Date.now() - startTime}ms","userIp":"${getIpAddress(event)}","userAgent":"${userAgent}","statusMessage":"${event.node.res.statusMessage}","responseHeader": ${JSON.stringify(event.node.res.getHeaders(), null, 2)}}` ) console.log( '===========================================================================================================================================================================================================================================================' ) }) - } + // } }) nitroApp.hooks.hook('error', error => { diff --git a/layers/server/routes/robots.txt.ts b/layers/server/routes/robots.txt.ts index ffb5192..7eb49b0 100644 --- a/layers/server/routes/robots.txt.ts +++ b/layers/server/routes/robots.txt.ts @@ -11,32 +11,31 @@ type RobotsConfig = { export default defineEventHandler(async event => { const host = (getHeader(event, 'host') || getRequestHost(event)).toString() || '' - const baseDomain = process.env.BASE_DOMAIN || '.onstove.com' + const baseDomain = process.env.BASE_DOMAIN const isGameAliasExtractable = host.includes(baseDomain) let gameAlias = '' if (isGameAliasExtractable) { - gameAlias = host.split('.')[0] + gameAlias = host.split('.')[0].replace(/-dev$/, '') } - // if (gameAlias && gameAlias !== "www") { - // event.context.gameAlias = gameAlias; - // } - // } - // robots 설정을 직접 가져오기 (미들웨어 context 사용) - let config: RobotsConfig try { - // robots 설정 추출 + const staticUrl = process.env.STATIC_URL + const runType = process.env.RUN_TYPE + + // gameAlias가 있을 때만 sitemap 포함 + const sitemapUrl = gameAlias + ? [`${staticUrl}/${runType}/template/${gameAlias}/sitemap.xml`] + : undefined + config = { userAgent: '*', allow: ['/'], - disallow: ['/error', '/inspection/', '/inspection/*', '/html/*'], - sitemap: [ - `https://static-pubcomm.gate8.com/local/template/${gameAlias}/sitemap.xml`, - ], - host: `${gameAlias}.onstove.com`, + disallow: ['/error', '/inspection/*', '/html/*'], + sitemap: sitemapUrl, + host: gameAlias ? `${gameAlias}.onstove.com` : undefined, cache: { sMaxAge: 300, staleWhileRevalidate: 600 }, } } catch (error) { @@ -46,7 +45,7 @@ export default defineEventHandler(async event => { config = { userAgent: '*', allow: ['/'], - disallow: ['/error', '/inspection/', '/inspection/*', '/html/*'], + disallow: ['/error', '/inspection/*', '/html/*'], cache: { sMaxAge: 300, staleWhileRevalidate: 600 }, } }