Repository: Check-Data-Out/velog-dashboard-v2-fe
Pull request #30: [25.04.22 / TASK-173] Refactor - 센트리 소스맵 이슈 해결
Author: login: six-standard
Labels: name: bug
description: Something isn't working
Created: 2025-04-22T04:49:33Z | Merged: 2025-04-26T01:04:26Z

## 🔥 변경 사항
센트리에 소스맵이 업로드되지 않던 이슈를 해결하였습니다.
빌드 직후의 업로드를 위해 깃 액션 파일을 일부 수정하였습니다.

## 🏷 관련 이슈
- 관련 이슈: `#173`

## 📸 스크린샷 (UI 변경 시 필수)
X

## 📌 체크리스트
- [X] 기능이 정상적으로 동작하는지 테스트 완료
- [X] 코드 스타일 가이드 준수 여부 확인
- [X] 관련 문서 업데이트 완료 (필요 시)


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **신규 기능**
	- Sentry 오류 추적 도구가 프로덕션 환경에서만 활성화되도록 설정되었습니다.
	- 프로덕션 빌드 시 브라우저 소스맵이 자동으로 생성되고 관리됩니다.

- **버그 수정**
	- Sentry 관련 샘플링 비율 및 릴리즈 버전이 고정되어 환경에 상관없이 일관된 동작을 보장합니다.
	- 소스맵 업로드 후 자동 삭제 기능이 추가되어 빌드 용량 최적화가 이루어집니다.

- **문서화**
	- Sentry 설정에 대한 주석이 한글로 추가 및 보완되었습니다.

- **스타일**
	- 일부 설정 배열 및 옵션이 코드 내에서 더 간결하게 정렬되었습니다.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/next.config.mjs b/next.config.mjs
index 9b7a842..a1d38a1 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -5,13 +5,16 @@ const nextConfig = {
   reactStrictMode: true,
   experimental: { forceSwcTransforms: true },
   output: 'standalone',
-  hideSourceMaps: true,
-  productionBrowserSourceMaps: false,
+  productionBrowserSourceMaps: true,
   webpack: (config, options) => {
     config.module.rules.push({
       test: /\.svg$/i,
       use: [options.defaultLoaders.babel, { loader: '@svgr/webpack', options: { babel: false } }],
     });
+    if (!options.dev) {
+      config.devtool =
+        process.env.NODE_ENV === 'production' ? 'hidden-source-map' : 'inline-source-map';
+    }
 
     return config;
   },
@@ -23,42 +26,21 @@ const nextConfig = {
     ],
   },
 };
-export default withSentryConfig(nextConfig, {
-  // For all available options, see:
-  // https://github.com/getsentry/sentry-webpack-plugin#options
-
-  org: 'velog-dashboard',
-  project: 'velog-dashboard-fe',
-
-  // Only print logs for uploading source maps in CI
-  silent: !process.env.CI,
-
-  // For all available options, see:
-  // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/
 
-  // Upload a larger set of source maps for prettier stack traces (increases build time)
-  widenClientFileUpload: true,
-
-  // Automatically annotate React components to show their full name in breadcrumbs and session replay
-  reactComponentAnnotation: {
-    enabled: true,
-  },
+export default withSentryConfig(nextConfig, {
+  // 센트리 동작을 위한 기본값
+  authToken: process.env.NEXT_PUBLIC_SENTRY_AUTH_TOKEN,
+  org: 'velog-dashboardv2',
+  project: 'vd-fe',
 
-  // Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.
-  // This can increase your server load as well as your hosting bill.
-  // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-
-  // side errors will fail.
-  tunnelRoute: '/monitoring',
+  widenClientFileUpload: true, // 파일의 크기가 비교적 큰 대신, 더 상세한 정보를 포함하는 소스맵 파일 생성
+  sourcemaps: { deleteSourcemapsAfterUpload: true }, // 소스맵 파일 업로드 후 자동 제거
+  hideSourceMaps: true, // 클라이언트 대상의 소스맵 파일 은닉
 
-  // Hides source maps from generated client bundles
-  hideSourceMaps: true,
+  silent: !process.env.CI, // CI 진행시에만 로그가 표시되도록 강제
+  disableLogger: true, // 번들 사이즈 감소를 위해 센트리 기본 로그 메세지 트리셰이크
 
-  // Automatically tree-shake Sentry logger statements to reduce bundle size
-  disableLogger: true,
+  reactComponentAnnotation: { enabled: true }, // 세션 리플레이와 브레드크럼에서 상세한 컴포넌트명 표시
 
-  // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)
-  // See the following for more information:
-  // https://docs.sentry.io/product/crons/
-  // https://vercel.com/docs/cron-jobs
-  automaticVercelMonitors: true,
+  tunnelRoute: '/monitoring', // ad-blocker 우회를 위한 경로 (저희가 이전에 왜 생기는지 이유를 추측했던 그 경로 맞습니다..)
 });
diff --git a/sentry.client.config.ts b/sentry.client.config.ts
index 0ae106c..8dfe0e2 100644
--- a/sentry.client.config.ts
+++ b/sentry.client.config.ts
@@ -7,14 +7,13 @@ import { env } from '@/constants';
 
 Sentry.init({
   dsn: env.SENTRY_DSN,
+  release: 'production',
 
   // Add optional integrations for additional features
-  integrations: [
-    Sentry.replayIntegration({ maskAllText: false, blockAllMedia: false }),
-  ],
+  integrations: [Sentry.replayIntegration({ maskAllText: false, blockAllMedia: false })],
 
   // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
-  tracesSampleRate: env.NODE_ENV === 'production' ? 0.1 : 1,
+  tracesSampleRate: 0.1,
 
   // Define how likely Replay events are sampled.
   // This sets the sample rate to be 10%. You may want this to be 100% while
@@ -26,4 +25,5 @@ Sentry.init({
 
   // Setting this option to true will print useful information to the console while you're setting up Sentry.
   debug: false,
+  enabled: process.env.NODE_ENV === 'production',
 });
diff --git a/sentry.edge.config.ts b/sentry.edge.config.ts
index e76de79..78238d0 100644
--- a/sentry.edge.config.ts
+++ b/sentry.edge.config.ts
@@ -8,10 +8,12 @@ import { env } from '@/constants';
 
 Sentry.init({
   dsn: env.SENTRY_DSN,
+  release: 'production',
 
   // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
-  tracesSampleRate: env.NODE_ENV === 'production' ? 0.05 : 1,
+  tracesSampleRate: 0.05,
 
   // Setting this option to true will print useful information to the console while you're setting up Sentry.
   debug: false,
+  enabled: process.env.NODE_ENV === 'production',
 });
diff --git a/sentry.server.config.ts b/sentry.server.config.ts
index bac1d94..91dfd02 100644
--- a/sentry.server.config.ts
+++ b/sentry.server.config.ts
@@ -7,10 +7,12 @@ import { env } from '@/constants';
 
 Sentry.init({
   dsn: env.SENTRY_DSN,
+  release: 'production',
 
   // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
-  tracesSampleRate: env.NODE_ENV === 'production' ? 0.1 : 1,
+  tracesSampleRate: 0.1,
 
   // Setting this option to true will print useful information to the console while you're setting up Sentry.
   debug: false,
+  enabled: process.env.NODE_ENV === 'production',
 });


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>.github/workflows/docker-publish.yaml (1)</summary><blockquote>

`25-25`: **글로벌 설치 대신 `pnpm dlx` 사용을 고려해주세요.**

현재 `npm install -g @sentry/cli`로 Sentry CLI를 글로벌 설치하고 있는데, CI 속도를 위해 로컬로 설치하거나 `pnpm dlx @sentry/cli`를 활용하는 것이 좋습니다.  
- 글로벌 설치가 캐시되지 않아 워크플로우가 매번 동일 패키지를 다시 설치할 수 있습니다.  
- 특정 버전을 고정하려면 `@sentry/cli@버전` 형식으로 명시하세요.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 46d4b9d64c98db61f21c147e8c241b336f67010a and 7191e137794b0e114d919a1ec390d8439d8b9c29.

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `.github/workflows/docker-publish.yaml` (2 hunks)
* `next.config.mjs` (1 hunks)
* `sentry.client.config.ts` (2 hunks)
* `sentry.edge.config.ts` (1 hunks)
* `sentry.server.config.ts` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (11)</summary><blockquote>

<details>
<summary>next.config.mjs (3)</summary>

`7-7`: **프로덕션 환경에서 브라우저 소스맵 비활성화 설정 추가**

프로덕션 환경에서 브라우저 소스맵을 비활성화하는 `productionBrowserSourceMaps: false` 설정을 추가했습니다. 이는 Sentry에 소스맵을 직접 업로드하는 방식으로 전환하기 위한 적절한 설정입니다.

---

`11-11`: **SVG 로더 설정 형식 변경**

SVG 로더 설정을 한 줄로 압축했습니다. 기능적으로는 동일하지만 가독성이 향상되었습니다.

---

`13-16`: **환경별 소스맵 생성 전략 구현**

개발 모드가 아닐 때 환경에 따라 다른 소스맵 생성 전략을 사용하도록 설정했습니다:
- 프로덕션 환경: `hidden-source-map` (별도 파일로 소스맵 생성)
- 기타 환경: `inline-source-map` (번들에 소스맵 포함)

이 설정은 Sentry와 함께 사용할 때 적절하며, 프로덕션에서는 소스맵을 숨기면서도 Sentry가 읽을 수 있도록 하는 접근 방식입니다.

</details>
<details>
<summary>sentry.edge.config.ts (2)</summary>

`13-13`: **트레이스 샘플링 비율 고정**

기존 환경별 조건부 샘플링 비율에서 고정값 `0.05`로 변경했습니다. 이는 모든 환경에서 일관된 샘플링을 제공합니다.

---

`17-17`: **프로덕션 환경에서만 Sentry 활성화**

`enabled: process.env.NODE_ENV === 'production'` 플래그를 추가하여 프로덕션 환경에서만 Sentry가 활성화되도록 설정했습니다. 이는 개발 및 테스트 환경에서 불필요한 오류 보고를 방지하는 좋은 방법입니다.

</details>
<details>
<summary>sentry.server.config.ts (2)</summary>

`12-12`: **서버 트레이스 샘플링 비율 고정**

서버 측 트레이스 샘플링 비율을 `0.1`로 고정하여 클라이언트 및 엣지 구성과 일관된 접근 방식을 유지했습니다.

---

`16-16`: **프로덕션 환경에서만 서버 Sentry 활성화**

`enabled: process.env.NODE_ENV === 'production'` 플래그를 추가하여 클라이언트 및 엣지 구성과 동일한 방식으로 프로덕션 환경에서만 서버 Sentry를 활성화하도록 설정했습니다.

</details>
<details>
<summary>sentry.client.config.ts (3)</summary>

`12-12`: **통합 배열 형식 개선**

Sentry 통합 배열 형식을 단일 라인으로 정리하여 가독성을 향상시켰습니다.

---

`15-15`: **클라이언트 트레이스 샘플링 비율 고정**

클라이언트 측 트레이스 샘플링 비율을 조건부 표현식에서 고정값 `0.1`로 변경했습니다. 이는 서버 측 구성과 일치하며 일관된 모니터링을 제공합니다.

---

`27-27`: **프로덕션 환경에서만 클라이언트 Sentry 활성화**

`enabled: process.env.NODE_ENV === 'production'` 플래그를 추가하여 서버 및 엣지 구성과 일관되게 프로덕션 환경에서만 클라이언트 Sentry를 활성화하도록 설정했습니다.

</details>
<details>
<summary>.github/workflows/docker-publish.yaml (1)</summary>

`51-53`: **Sentry Org/Project 설정값 검증 요청**

`SENTRY_ORG: velog-dashboard2`, `SENTRY_PROJECT: vd-fe`가 실제 Sentry 대시보드의 조직 및 프로젝트 슬러그와 일치하는지 다시 확인해주세요.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-22T04:52:17Z
user: login: Nuung
body: 크게 이견없습니다. 2 가지 정도 제안 사항이 있어요.
1. 코드 레빗이 찝어준 바와 같이 릴리즈에 버저닝을 해야 디버깅할때 "언제" 배포 해서 "어느 때" 나온 이슈인제 추적하기 용이할 것 같아요. 
2. 더욱이 기준님, notion task 를 꼭 채워주세요. 기준님 아니면 다른 분들이 해당 내용에 대한 F/U 이 매우 힘듭니다. 특히 이런 task 는 다른 F/W 나 language 와 공유되는 부분이 아니라 철저하게 nextjs 에서만, 더욱이 nextjs 의 sentry 에서만 적용되는 부분이라서요! 

너무 고생많으셨어요. 소스맵이 파악이 안되는 정확한 이유는 무엇이라고 봐야할까요? 
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-22T14:31:08Z
user: login: ooheunda
body: 코드 잘 봤습니다.
제가 FE쪽은 아주 생소해서 GPT의 도움을 받으며 리뷰했는데요. 소스맵이라는 것도 신기한데, 외부 모니터링 솔루션에 전송하는 과정에서 난독화된 코드를 어떻게 처리할 수 있는지를 알게 되어서 좋았습니다!

코드래빗과 현우님이 코멘트 남겨주셔서, 해당 부분 반영되면 다시 보고 Approve 드릴게요!
이슈 해결하시느라 고생하셨습니다! 👍 🔥
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T12:16:34Z
user: login: Jihyun3478
body: ### 좋았던 점

- 소스맵이 등록되더라도 실제 오류 트레이스에 적용되지 않는 경우가 발생할 수 있군요!  코드 바뀐 부분 천천히 따라가면서 오류 해결 과정을 엿볼 수 있어서 좋았습니다! 고생하셨습니다!!🔥

PS. 피드백 반영되면 다시 살펴보겠습니다!!
state: APPROVED
author_association: NONE
submitted_at: 2025-04-24T23:43:15Z
user: login: ooheunda
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-25T02:16:37Z
user: login: Nuung
body: 이욜 너무 고생 많았어요 ㅋㅋㅋ 저는 이런 디테일 작업 할때 너무 짜증나더라구요 :) 머지드갑시다!!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-25T06:29:02Z

Review comments:
diff_hunk: @@ -40,6 +41,16 @@ jobs:
         run: |
           pnpm run build
 
+      - name: Upload Source Maps
+        run: |
+          sentry-cli releases new production
+          sentry-cli sourcemaps inject .next/static/chunks
+          sentry-cli releases files production upload-sourcemaps .next/static/chunks
+        env:
+          SENTRY_AUTH_TOKEN: ${{ secrets.NEXT_PUBLIC_SENTRY_AUTH_TOKEN }}
+          SENTRY_ORG: velog-dashboard2
+          SENTRY_PROJECT: vd-fe
+
path: .github/workflows/docker-publish.yaml
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**중요: 퍼블릭 키를 CLI 인증 토큰으로 사용하지 마세요.**

`SENTRY_AUTH_TOKEN: ${{ secrets.NEXT_PUBLIC_SENTRY_AUTH_TOKEN }}`를 사용하면 JS 클라이언트에 노출될 수 있는 퍼블릭 키가 CLI 인증에 쓰입니다.  
- 별도의 GitHub Secret(`SENTRY_AUTH_TOKEN`)을 만들고, 워크플로우에서는 `$ {{ secrets.SENTRY_AUTH_TOKEN }}`을 사용하도록 변경하세요.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-22T04:52:16Z
author_association: NONE
diff_hunk: @@ -40,6 +41,16 @@ jobs:
         run: |
           pnpm run build
 
+      - name: Upload Source Maps
+        run: |
+          sentry-cli releases new production
+          sentry-cli sourcemaps inject .next/static/chunks
+          sentry-cli releases files production upload-sourcemaps .next/static/chunks
path: .github/workflows/docker-publish.yaml
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**릴리스 종료(finalize) 및 동적 릴리스 이름 추가 제안**

현재 릴리스 이름을 고정 `"production"`으로 사용하고 있으며, sourcemaps 업로드 후 릴리스 종료 단계가 누락되어 있습니다. 다음과 같이 개선을 권장합니다:  
1. 워크플로우 변수로 릴리스 이름 설정 (예: `RELEASE=${GITHUB_SHA}` 또는 `$(node -p "require('./package.json').version")`)  
2. sourcemaps 업로드 후 `sentry-cli releases finalize $RELEASE` 추가  
```diff
- sentry-cli releases new production
+ sentry-cli releases new "$RELEASE"
  sentry-cli sourcemaps inject .next/static/chunks
- sentry-cli releases files production upload-sourcemaps .next/static/chunks
+ sentry-cli releases files "$RELEASE" upload-sourcemaps .next/static/chunks --rewrite
+ sentry-cli releases finalize "$RELEASE"
```  
이렇게 하면 배포마다 고유한 릴리스 맵핑이 가능해지고, 업로드된 sourcemap이 정확히 매핑됩니다.  



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
      - name: Upload Source Maps
        run: |
          sentry-cli releases new "$RELEASE"
          sentry-cli sourcemaps inject .next/static/chunks
          sentry-cli releases files "$RELEASE" upload-sourcemaps .next/static/chunks --rewrite
          sentry-cli releases finalize "$RELEASE"
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-22T04:52:16Z
author_association: NONE

PR comments:
user: login: notion-workspace[bot]
created_at: 2025-04-22T04:49:36Z
body: <a href="https://www.notion.so/1dd6299fd66680e781add918c271dcc0?pvs=8&n=github_linkback">센트리 소스맵 이슈 해결</a>
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-04-22T04:49:39Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: failure by coderabbit.ai -->

> [!CAUTION]
> ## Review failed
> 
> The pull request is closed.

<!-- end of auto-generated comment: failure by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

이번 변경에서는 Sentry 설정이 전반적으로 개편되고, Next.js의 소스맵 및 Webpack 관련 설정이 개선되었습니다. Sentry 관련 설정에서는 각 환경별로 Sentry 활성화 여부를 명확히 하였고, release 버전을 고정값으로 지정했으며, 샘플링 비율 및 기타 여러 옵션이 일관적으로 변경되었습니다. 또한 Next.js의 production 소스맵 생성이 활성화되고, Webpack의 devtool 설정이 빌드 환경에 따라 동적으로 지정되도록 수정되었습니다. Sentry 업로드 및 로깅 관련 옵션도 세분화되어 적용되었습니다.

## Changes

| 파일(들)                                         | 변경 요약                                                                                                     |
|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| next.config.mjs                                 | `productionBrowserSourceMaps`를 `true`로 설정, `hideSourceMaps` 제거, Webpack `devtool`을 환경에 따라 동적 지정, Sentry 설정 전면 개편 및 한국어 주석 추가, 여러 Sentry 옵션(예: `authToken`, `sourcemaps.deleteSourcemapsAfterUpload`, `hideSourceMaps`, `silent`, `disableLogger`) 추가 및 수정 |
| sentry.client.config.ts, sentry.edge.config.ts, sentry.server.config.ts | Sentry `release`를 `'production'`으로 고정, `tracesSampleRate`를 상수로 지정, production 환경에서만 Sentry 활성화하는 `enabled` 플래그 도입, `integrations` 배열 단일 라인으로 재포맷, 설정 단순화 및 일관성 강화 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant NextApp
    participant Sentry

    User->>NextApp: 요청
    NextApp-->>Sentry: (production 환경 & enabled=true) 오류/트레이스 전송 (release='production', tracesSampleRate 고정)
    NextApp-->>User: 응답
```

## Suggested labels

`enhancement`

## Suggested reviewers

- Jihyun3478
- Nuung

## Poem

> 🐇  
> 소스맵이 빛나네, 프로덕션 밤에  
> Sentry 깃발 아래, 오류는 잠재네  
> release는 고정, 샘플링도 정직  
> 환경 따라 켜고 끄는 센스까지  
> 코드 토끼 춤추네, 로그와 함께!  
> 🥕

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>next.config.mjs</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> ReferenceError: globals is not defined
>     at file:///eslint.config.mjs?mtime=1745297382000:17:12
>     at ModuleJob.run (node:internal/modules/esm/module_job:262:25)
>     at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:483:26)
>     at async loadFlatConfigFile (/node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/flat-eslint.js:303:21)
>     at async calculateConfigArray (/node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/flat-eslint.js:382:28)
>     at async FlatESLint.lintFiles (/node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/flat-eslint.js:762:25)
>     at async Object.execute (/node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/cli.js:421:23)
>     at async main (/node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/bin/eslint.js:152:22)
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between db378aebfc9a80d98f237df009a264be8de1b5e2 and a9f8a63bb48961898eda33c80119b4c78b031980.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `next.config.mjs` (2 hunks)

</details>

</details>
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Check-Data-Out/velog-dashboard-v2-fe&utm_content=30):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: six-standard
created_at: 2025-04-25T00:30:27Z
body: > 크게 이견없습니다. 2 가지 정도 제안 사항이 있어요.
> 
> 1. 코드 레빗이 찝어준 바와 같이 릴리즈에 버저닝을 해야 디버깅할때 "언제" 배포 해서 "어느 때" 나온 이슈인제 추적하기 용이할 것 같아요.
> 2. 더욱이 기준님, notion task 를 꼭 채워주세요. 기준님 아니면 다른 분들이 해당 내용에 대한 F/U 이 매우 힘듭니다. 특히 이런 task 는 다른 F/W 나 language 와 공유되는 부분이 아니라 철저하게 nextjs 에서만, 더욱이 nextjs 의 sentry 에서만 적용되는 부분이라서요!
> 
> 너무 고생많으셨어요. 소스맵이 파악이 안되는 정확한 이유는 무엇이라고 봐야할까요?

혹시나 싶어 계속 조사해보니, 센트리 옵션 객체의 일부 속성값에 문제가 있어 정상 동작이 안 되는 경우가 있다는 말이 있어 해당 내용 반영하였습니다.
해당 내용 반영 후 로컬 빌드 진행하니 정상적으로 소스맵이 업로드되는 것 같네요..

옵션 파일의 내용을 상세히 확인하지 못한 제 불찰일 듯 합니다.

우선 수정된 내용 마무리하고 빠르게 커밋하겠습니다!

+ 추가로 버저닝도 적용해볼 생각이 있었으나, 자동으로 현재 날짜 + 시간 기반의 이름이 붙는 걸 보고 일단은 놔두기로 했습니다.
애초에 버저닝의 기준 중에서 날짜 + 시간이 가장 정확한 것 같기도 하네요
author_association: MEMBER