Skip to content

feature: Resend 활용 매직 링크 - 이메일 링크 로그인 기능 추가#3

Open
Green-JEONG wants to merge 1 commit intodevfrom
feature/email
Open

feature: Resend 활용 매직 링크 - 이메일 링크 로그인 기능 추가#3
Green-JEONG wants to merge 1 commit intodevfrom
feature/email

Conversation

@Green-JEONG
Copy link
Copy Markdown
Member

@Green-JEONG Green-JEONG commented Mar 29, 2026

🔮 Supplement

  1. nextauth v5, prisma7 및 adapter 패키지 설치
  2. 메인 페이지에 로그인 정보 띄우기 (로그인/로그아웃)

🚀 Result

image image image image image image

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 이메일 주소를 통한 로그인 및 인증 시스템 추가
    • 새로운 로그인 페이지 및 로그아웃 기능 구현
    • 사용자 세션 관리 및 인증 상태 추적 기능 추가
    • 인증된 사용자와 미인증 사용자를 위한 페이지별 콘텐츠 분기 및 접근 제어
    • 인증된 사용자의 이메일 정보 표시 기능
  • 기타

    • 사용자 인증 및 데이터베이스 지원 관련 의존성 패키지 추가

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 29, 2026

개요

이 변경사항은 NextAuth와 Prisma 어댑터를 활용한 인증 인프라를 Next.js 애플리케이션에 추가합니다. Resend 이메일 제공자를 통한 매직링크 로그인 흐름, 세션 관리, 데이터베이스 스키마를 도입합니다.

변경사항

Cohort / File(s) 요약
구성 및 의존성
FE/.gitignore, FE/package.json, FE/prisma.config.ts
Prisma 관련 패키지(@prisma/client, @prisma/adapter-mariadb), NextAuth 어댑터, Resend 이메일 제공자 의존성 추가. Prisma 설정 파일에서 .env 로드 및 데이터베이스 URL 정의.
Prisma 설정
FE/lib/prisma.ts, FE/prisma/schema.prisma
Prisma 클라이언트 인스턴스 초기화(MariaDB 어댑터 포함) 및 전역 캐싱. NextAuth 호환 User, Account, Session, VerificationToken 모델이 포함된 데이터베이스 스키마 정의.
인증 인프라
FE/app/api/auth/[...nextauth]/route.ts, FE/components/Providers.tsx
NextAuth 라우트 모듈 구성(Prisma 어댑터 및 Resend 제공자 포함) 및 세션 컨텍스트 제공을 위한 SessionProvider 래퍼 컴포넌트.
페이지 및 UI
FE/app/layout.tsx, FE/app/login/page.tsx, FE/app/page.tsx
레이아웃을 Providers 컴포넌트로 래핑. 이메일 입력 및 상태 관리를 통한 매직링크 로그인 페이지 신규 추가. 홈페이지를 인증 확인 서버 컴포넌트로 변경하고 로그아웃 기능 추가.

시퀀스 다이어그램

sequenceDiagram
    participant User as 사용자
    participant Client as 클라이언트 (브라우저)
    participant NextAuth as NextAuth 서버
    participant Database as 데이터베이스
    participant Email as Resend (이메일)

    User->>Client: 로그인 페이지 방문
    User->>Client: 이메일 입력 및 제출
    Client->>NextAuth: signIn('resend', { email, ... })
    NextAuth->>Database: 사용자 조회 또는 생성
    Database-->>NextAuth: 사용자 데이터
    NextAuth->>Email: 매직링크 이메일 전송 요청
    Email-->>NextAuth: 이메일 전송 완료
    NextAuth-->>Client: 성공 응답
    Client->>User: "확인 이메일을 확인하세요" 메시지 표시
    User->>Email: 이메일에서 매직링크 클릭
    Email->>NextAuth: 콜백 URL로 리다이렉트
    NextAuth->>Database: 토큰 검증 및 세션 생성
    Database-->>NextAuth: 세션 확인
    NextAuth->>Client: 세션 쿠키 설정
    Client->>Client: 홈페이지로 리다이렉트
    Client->>NextAuth: auth() 호출 (세션 확인)
    NextAuth->>Database: 세션 조회
    Database-->>NextAuth: 세션 데이터
    NextAuth-->>Client: 인증된 사용자 정보
    Client->>User: 사용자 이메일 및 로그아웃 버튼 표시
Loading

코드 리뷰 예상 소요 시간

🎯 4 (복잡함) | ⏱️ ~60분

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항을 명확하게 설명합니다. Resend와 NextAuth를 사용한 매직 링크 기반 이메일 로그인 기능 추가로, 모든 변경사항(Prisma 설정, NextAuth 라우트, 로그인 페이지, 사용자 인증 UI)과 완벽하게 일치합니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/email

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (7)
FE/app/login/page.tsx (2)

10-33: 함수 내 들여쓰기 불일치

handleSendMagicLink 함수 내부의 들여쓰기가 일관되지 않습니다. Line 11부터 함수 본문이 2칸 들여쓰기로 시작해야 하지만 현재 일부 라인이 잘못 정렬되어 있습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/login/page.tsx` around lines 10 - 33, The handleSendMagicLink function
has inconsistent indentation; normalize the block to use two-space indentation
for all lines inside the function body (align the e.preventDefault(), setStatus
calls, try/catch block, await signIn call and its object properties, console
logs, and the if/else and catch branches) so braces and nested statements line
up consistently around the function name handleSendMagicLink and its internal
symbols (e.preventDefault, setStatus, signIn, result, console.error/log).

6-66: NextAuth pages 설정에 커스텀 로그인 페이지 등록 권장

커스텀 /login 페이지를 만들었지만, NextAuth 설정(FE/app/api/auth/[...nextauth]/route.ts)에 pages 옵션이 없습니다. 일부 인증 플로우에서 NextAuth가 기본 /api/auth/signin 페이지로 리다이렉트할 수 있습니다.

♻️ NextAuth 설정에 pages 옵션 추가

FE/app/api/auth/[...nextauth]/route.ts 파일에 다음을 추가하세요:

export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: PrismaAdapter(prisma),
  providers: [
    Resend({
      apiKey: process.env.RESEND_API_KEY,
      from: "onboarding@resend.dev",
    }),
  ],
  secret: process.env.AUTH_SECRET,
  pages: {
    signIn: '/login',
  },
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/login/page.tsx` around lines 6 - 66, Add the custom sign-in page to
your NextAuth config: inside the NextAuth(...) call in
FE/app/api/auth/[...nextauth]/route.ts (the export where you currently set
adapter, providers, secret and export handlers/auth/signIn/signOut), add a pages
property with signIn: '/login' so NextAuth will redirect to your LoginPage
instead of the default /api/auth/signin; update the exported config accordingly
and redeploy.
FE/app/page.tsx (2)

21-25: signOut 후 리다이렉트 경로 명시 권장

signOut()redirectTo 없이 호출되고 있습니다. NextAuth 설정에 pages.signOut이 정의되어 있지 않아 기본 동작(일반적으로 /api/auth/signin)으로 리다이렉트됩니다.

의도한 동작인지 확인하고, 특정 페이지로 리다이렉트하려면 redirectTo를 명시하세요.

♻️ 명시적 리다이렉트 예시
       <form
         action={async () => {
           "use server";
-          await signOut();
+          await signOut({ redirectTo: "/" });
         }}
       >
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/page.tsx` around lines 21 - 25, The signOut call inside the form
action currently omits an explicit redirect target, which can trigger the
default NextAuth redirect; update the server action that calls signOut() (the
inline async form action) to pass a specific redirectTo/redirect URL (e.g.,
signOut({ redirectTo: '/your-target' }) or the appropriate NextAuth option) so
logout navigates to the intended page; keep the "use server" directive and
adjust the form action implementation accordingly.

10-10: 클라이언트 사이드 네비게이션을 위해 Link 컴포넌트 사용 권장

<a href="/login"> 대신 next/linkLink 컴포넌트를 사용하면 전체 페이지 새로고침 없이 클라이언트 사이드 네비게이션이 가능합니다.

♻️ 권장 수정
+import Link from "next/link";
 import { auth, signOut } from "@/app/api/auth/[...nextauth]/route";
 
 // ... 
 
-        <a href="/login">로그인 하러가기</a>
+        <Link href="/login">로그인 하러가기</Link>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/page.tsx` at line 10, Replace the plain anchor tag with Next.js
client-side navigation by importing Link from "next/link" and using the Link
component instead of the <a href="/login"> anchor; specifically, add an import
like `import Link from "next/link"` at the top and change the element to `<Link
href="/login">로그인 하러가기</Link>` (or wrap an anchor for styling if needed) so
navigation uses client-side routing.
FE/package.json (1)

26-26: next-auth 베타 버전 사용 주의

next-auth@5.0.0-beta.30은 베타 버전이며, 현재(2026년 3월) 안정 버전(v5)이 아직 출시되지 않았습니다. 가장 최신 안정 버전은 v4.24.13입니다. 베타 버전은 API 변경이 있을 수 있으므로 프로덕션 배포 시 주의가 필요합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/package.json` at line 26, Replace the beta dependency "next-auth":
"5.0.0-beta.30" in package.json with the latest stable v4 release (e.g.,
"next-auth": "4.24.13"), then run your package manager (npm install or yarn
install/pnpm install) to update the lockfile; search for usages of
NextAuth-related APIs (e.g., any imports of "next-auth" and calls to NextAuth
handlers/middleware) to confirm compatibility and revert any v5-specific changes
if present.
FE/app/api/auth/[...nextauth]/route.ts (2)

6-15: 프로덕션 배포를 위해 trustHost 옵션 추가를 고려해주세요.

NextAuth v5에서 프로덕션 환경(특히 Vercel 외 플랫폼)에 배포할 경우 trustHost: true 옵션이 필요할 수 있습니다. 이 옵션이 없으면 호스트 검증 관련 오류가 발생할 수 있습니다.

♻️ trustHost 옵션 추가 제안
 export const { handlers, auth, signIn, signOut } = NextAuth({
   adapter: PrismaAdapter(prisma),
   providers: [
     Resend({
       apiKey: process.env.RESEND_API_KEY,
       from: "onboarding@resend.dev",
     }),
   ],
   secret: process.env.AUTH_SECRET,
+  trustHost: true,
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/api/auth/`[...nextauth]/route.ts around lines 6 - 15, Add the
trustHost: true option to the NextAuth configuration used in the export (the
NextAuth({...}) call that assigns handlers/auth/signIn/signOut) to avoid host
verification errors in production; update the object passed to NextAuth in
route.ts to include trustHost: true (optionally gated by process.env.NODE_ENV
=== 'production' or a dedicated env var like TRUST_HOST) so the NextAuth
instance (exported as handlers/auth/signIn/signOut) uses that setting when
deployed.

10-11: from 이메일 주소와 API 키를 환경 변수로 분리하는 것을 권장합니다.

현재 from 주소가 Resend 샌드박스 이메일(onboarding@resend.dev)로 하드코딩되어 있습니다. 개발 환경에서는 문제없지만, 프로덕션 배포 시 커스텀 도메인 이메일이 필요합니다. 또한 RESEND_API_KEY가 설정되지 않은 경우 런타임 오류가 발생할 수 있습니다.

♻️ 환경 변수 기반 설정으로 변경 제안
   providers: [
     Resend({
-      apiKey: process.env.RESEND_API_KEY,
-      from: "onboarding@resend.dev",
+      apiKey: process.env.RESEND_API_KEY!,
+      from: process.env.EMAIL_FROM || "onboarding@resend.dev",
     }),
   ],

.env 파일에 추가:

EMAIL_FROM=noreply@yourdomain.com
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/api/auth/`[...nextauth]/route.ts around lines 10 - 11, Replace the
hardcoded Resend "from" address with an environment variable and validate
required env vars: use process.env.EMAIL_FROM instead of
"onboarding@resend.dev", and ensure process.env.RESEND_API_KEY (used for the
apiKey property) and process.env.EMAIL_FROM are present at startup; if either is
missing, throw or log a clear error and fail fast so you don't get runtime
crashes. Locate the block where apiKey: process.env.RESEND_API_KEY and from:
"onboarding@resend.dev" are set in route.ts and update it to read from
EMAIL_FROM and guard both RESEND_API_KEY and EMAIL_FROM before creating the
Resend client.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@FE/app/login/page.tsx`:
- Line 21: Remove the leftover console.log debug statements in
FE/app/login/page.tsx (e.g., the console.log("NextAuth Response:", result) and
the other console.log calls at the same file) before production; either delete
them or replace them with a proper logger call (using your app’s logging utility
or a NODE_ENV check) inside the relevant component/function so no console.log
remains in the page component at runtime.

In `@FE/lib/prisma.ts`:
- Around line 8-14: The PrismaMariaDb adapter instantiation uses raw process.env
values (e.g., DATABASE_HOST, DATABASE_PORT) without validation which can produce
undefined/NaN runtime errors; update the code around PrismaMariaDb and adapter
to validate required env vars before creating the adapter (check presence of
DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME and ensure
DATABASE_PORT parses to a finite number), throw or log a clear error if
validation fails, and only pass validated values (parsed port as Number) into
the PrismaMariaDb constructor.

In `@FE/prisma.config.ts`:
- Around line 6-11: 현재 마이그레이션 설정(defineConfig in prisma.config.ts)에서는
DATABASE_URL을 사용하지만 런타임(FE/lib/prisma.ts의 PrismaClient 초기화)에서는 개별
변수(DATABASE_HOST, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD,
DATABASE_NAME)를 사용해 불일치가 발생하므로 둘을 통일하세요: 선택한 방식(DATABASE_URL 단일 사용 권장)으로
prisma.config.ts의 schema datasource 설정과 FE/lib/prisma.ts의 PrismaClient 초기화 코드를
일치시키거나, PrismaClient 초기화 코드에 DATABASE_URL이 없을 때 개별 변수로부터 안전하게 DATABASE_URL을 동적으로
조립하는 폴백 로직을 추가해 두 환경 방식이 동일한 DB를 가리키게 하고(필수 값 누락 시 명확한 오류를 던지기), .env.example 또는
README에 어떤 변수(DATABASE_URL 또는 각각의 DATABASE_*)가 필요한지 명시하세요.

In `@FE/prisma/schema.prisma`:
- Around line 5-7: The Prisma datasource block (datasource db) is missing the
required url property; add a url = env("DATABASE_URL") entry to the datasource
db declaration so Prisma can read the DB connection string from the environment
(ensure .env contains DATABASE_URL="mysql://user:password@host:3306/dbname").

---

Nitpick comments:
In `@FE/app/api/auth/`[...nextauth]/route.ts:
- Around line 6-15: Add the trustHost: true option to the NextAuth configuration
used in the export (the NextAuth({...}) call that assigns
handlers/auth/signIn/signOut) to avoid host verification errors in production;
update the object passed to NextAuth in route.ts to include trustHost: true
(optionally gated by process.env.NODE_ENV === 'production' or a dedicated env
var like TRUST_HOST) so the NextAuth instance (exported as
handlers/auth/signIn/signOut) uses that setting when deployed.
- Around line 10-11: Replace the hardcoded Resend "from" address with an
environment variable and validate required env vars: use process.env.EMAIL_FROM
instead of "onboarding@resend.dev", and ensure process.env.RESEND_API_KEY (used
for the apiKey property) and process.env.EMAIL_FROM are present at startup; if
either is missing, throw or log a clear error and fail fast so you don't get
runtime crashes. Locate the block where apiKey: process.env.RESEND_API_KEY and
from: "onboarding@resend.dev" are set in route.ts and update it to read from
EMAIL_FROM and guard both RESEND_API_KEY and EMAIL_FROM before creating the
Resend client.

In `@FE/app/login/page.tsx`:
- Around line 10-33: The handleSendMagicLink function has inconsistent
indentation; normalize the block to use two-space indentation for all lines
inside the function body (align the e.preventDefault(), setStatus calls,
try/catch block, await signIn call and its object properties, console logs, and
the if/else and catch branches) so braces and nested statements line up
consistently around the function name handleSendMagicLink and its internal
symbols (e.preventDefault, setStatus, signIn, result, console.error/log).
- Around line 6-66: Add the custom sign-in page to your NextAuth config: inside
the NextAuth(...) call in FE/app/api/auth/[...nextauth]/route.ts (the export
where you currently set adapter, providers, secret and export
handlers/auth/signIn/signOut), add a pages property with signIn: '/login' so
NextAuth will redirect to your LoginPage instead of the default
/api/auth/signin; update the exported config accordingly and redeploy.

In `@FE/app/page.tsx`:
- Around line 21-25: The signOut call inside the form action currently omits an
explicit redirect target, which can trigger the default NextAuth redirect;
update the server action that calls signOut() (the inline async form action) to
pass a specific redirectTo/redirect URL (e.g., signOut({ redirectTo:
'/your-target' }) or the appropriate NextAuth option) so logout navigates to the
intended page; keep the "use server" directive and adjust the form action
implementation accordingly.
- Line 10: Replace the plain anchor tag with Next.js client-side navigation by
importing Link from "next/link" and using the Link component instead of the <a
href="/login"> anchor; specifically, add an import like `import Link from
"next/link"` at the top and change the element to `<Link href="/login">로그인
하러가기</Link>` (or wrap an anchor for styling if needed) so navigation uses
client-side routing.

In `@FE/package.json`:
- Line 26: Replace the beta dependency "next-auth": "5.0.0-beta.30" in
package.json with the latest stable v4 release (e.g., "next-auth": "4.24.13"),
then run your package manager (npm install or yarn install/pnpm install) to
update the lockfile; search for usages of NextAuth-related APIs (e.g., any
imports of "next-auth" and calls to NextAuth handlers/middleware) to confirm
compatibility and revert any v5-specific changes if present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e47cbb19-1998-4a2d-be0f-3ec9f7637634

📥 Commits

Reviewing files that changed from the base of the PR and between df73744 and 4930666.

⛔ Files ignored due to path filters (1)
  • FE/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (10)
  • FE/.gitignore
  • FE/app/api/auth/[...nextauth]/route.ts
  • FE/app/layout.tsx
  • FE/app/login/page.tsx
  • FE/app/page.tsx
  • FE/components/Providers.tsx
  • FE/lib/prisma.ts
  • FE/package.json
  • FE/prisma.config.ts
  • FE/prisma/schema.prisma

callbackUrl: '/', // 로그인 성공 후 이동할 곳
});

console.log("NextAuth Response:", result);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

프로덕션 코드에서 console.log 제거 필요

디버깅용 console.log 문이 남아있습니다. 프로덕션 배포 전에 제거하거나 적절한 로깅 라이브러리로 대체하세요.

🧹 console.log 제거
-    console.log("NextAuth Response:", result);
 
     if (result?.error) {
-      console.error("Login Error:", result.error);
       setStatus('error');
     } else {
       setStatus('success');
     }
   } catch (error) {
-    console.error("Fetch Error:", error);
     setStatus('error');
   }

Also applies to: 24-24, 30-30

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/app/login/page.tsx` at line 21, Remove the leftover console.log debug
statements in FE/app/login/page.tsx (e.g., the console.log("NextAuth Response:",
result) and the other console.log calls at the same file) before production;
either delete them or replace them with a proper logger call (using your app’s
logging utility or a NODE_ENV check) inside the relevant component/function so
no console.log remains in the page component at runtime.

Comment on lines +8 to +14
const adapter = new PrismaMariaDb({
host: process.env.DATABASE_HOST,
port: Number(process.env.DATABASE_PORT),
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

환경 변수 유효성 검사 누락

환경 변수가 정의되지 않은 경우 런타임 오류가 발생할 수 있습니다. 특히 Number(process.env.DATABASE_PORT)undefined일 때 NaN이 되어 연결 실패의 원인을 파악하기 어려울 수 있습니다.

🛡️ 환경 변수 검증 추가 권장
 import { PrismaMariaDb } from "@prisma/adapter-mariadb"
 import { PrismaClient } from "@prisma/client"

+const requiredEnvVars = ['DATABASE_HOST', 'DATABASE_PORT', 'DATABASE_USER', 'DATABASE_PASSWORD', 'DATABASE_NAME'] as const;
+
+for (const envVar of requiredEnvVars) {
+  if (!process.env[envVar]) {
+    throw new Error(`Missing required environment variable: ${envVar}`);
+  }
+}
+
 const globalForPrisma = globalThis as unknown as {
   prisma: PrismaClient | undefined
 }

 const adapter = new PrismaMariaDb({
-  host: process.env.DATABASE_HOST,
-  port: Number(process.env.DATABASE_PORT),
-  user: process.env.DATABASE_USER,
-  password: process.env.DATABASE_PASSWORD,
-  database: process.env.DATABASE_NAME,
+  host: process.env.DATABASE_HOST!,
+  port: Number(process.env.DATABASE_PORT!),
+  user: process.env.DATABASE_USER!,
+  password: process.env.DATABASE_PASSWORD!,
+  database: process.env.DATABASE_NAME!,
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/lib/prisma.ts` around lines 8 - 14, The PrismaMariaDb adapter
instantiation uses raw process.env values (e.g., DATABASE_HOST, DATABASE_PORT)
without validation which can produce undefined/NaN runtime errors; update the
code around PrismaMariaDb and adapter to validate required env vars before
creating the adapter (check presence of DATABASE_HOST, DATABASE_USER,
DATABASE_PASSWORD, DATABASE_NAME and ensure DATABASE_PORT parses to a finite
number), throw or log a clear error if validation fails, and only pass validated
values (parsed port as Number) into the PrismaMariaDb constructor.

Comment on lines +6 to +11
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"),
},
}); No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# .env 파일에서 DATABASE 관련 변수 확인
fd -t f '.env' --exec cat {} 2>/dev/null | grep -E '^DATABASE' || echo ".env 파일을 찾을 수 없거나 DATABASE 변수가 없습니다"

Repository: My-Golden-Kids/MGK

Length of output: 97


🏁 Script executed:

# Find and read FE/prisma.config.ts
find . -name "prisma.config.ts" -o -name "prisma.config.js" | head -5

Repository: My-Golden-Kids/MGK

Length of output: 83


🏁 Script executed:

# Find FE/lib/prisma.ts and similar files
find . -path "*/lib/prisma*" -type f | head -10

Repository: My-Golden-Kids/MGK

Length of output: 80


🏁 Script executed:

# Search for environment variable usage patterns
rg "DATABASE_URL|DATABASE_HOST|DATABASE_PORT|DATABASE_USER|DATABASE_PASSWORD|DATABASE_NAME" -t ts -t js --max-count 20

Repository: My-Golden-Kids/MGK

Length of output: 391


🏁 Script executed:

# Check for .env files and documentation
fd -t f '\.(env|md)' -E node_modules | grep -E '(env|README)' | head -20

Repository: My-Golden-Kids/MGK

Length of output: 97


🏁 Script executed:

cat -n ./FE/prisma.config.ts

Repository: My-Golden-Kids/MGK

Length of output: 371


🏁 Script executed:

cat -n ./FE/lib/prisma.ts

Repository: My-Golden-Kids/MGK

Length of output: 786


🏁 Script executed:

cat -n ./FE/README.md | head -100

Repository: My-Golden-Kids/MGK

Length of output: 1765


🏁 Script executed:

fd -t f '\.(env\.example|env\.sample)' -E node_modules

Repository: My-Golden-Kids/MGK

Length of output: 44


🏁 Script executed:

cat -n ./README.md | head -150

Repository: My-Golden-Kids/MGK

Length of output: 327


🏁 Script executed:

find . -name "docker-compose*" -o -name ".env.local" | head -10

Repository: My-Golden-Kids/MGK

Length of output: 85


🏁 Script executed:

grep -r "DATABASE_URL\|DATABASE_HOST" --include="*.md" --include="*.txt" | head -20

Repository: My-Golden-Kids/MGK

Length of output: 44


🏁 Script executed:

cat -n ./BE/docker-compose.yml

Repository: My-Golden-Kids/MGK

Length of output: 773


🏁 Script executed:

ls -la ./BE/ | head -20

Repository: My-Golden-Kids/MGK

Length of output: 838


🏁 Script executed:

find ./BE -name "*prisma*" -o -name "*env*" -o -name "*config*" | grep -v node_modules | head -20

Repository: My-Golden-Kids/MGK

Length of output: 44


🏁 Script executed:

find ./FE -name "prisma" -type d

Repository: My-Golden-Kids/MGK

Length of output: 73


🏁 Script executed:

find ./FE -name "schema.prisma" -o -name "*.prisma"

Repository: My-Golden-Kids/MGK

Length of output: 87


Prisma 설정에서 환경 변수 접근 방식의 불일치

prisma.config.ts는 마이그레이션을 위해 DATABASE_URL 환경 변수를 사용하지만, FE/lib/prisma.ts는 런타임 PrismaClient 초기화 시 개별 환경 변수(DATABASE_HOST, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME)를 사용합니다.

두 방식이 동일한 데이터베이스를 가리키지 않으면 마이그레이션이 런타임과 다른 데이터베이스에서 실행되어 스키마 불일치가 발생할 수 있습니다. 예를 들어 DATABASE_URL이 설정되지 않으면 마이그레이션은 실패하지만 런타임은 개별 변수로 정상 작동할 수 있습니다.

권장 사항:

  1. 환경 변수 설정 방식을 통일하세요. (DATABASE_URL 단일 변수 또는 개별 변수 중 하나로 선택)
  2. .env.example 또는 README.md에 필요한 환경 변수 설정 가이드를 추가하세요.
  3. DATABASE_URL이 필수인 경우, 개별 변수로부터 동적으로 생성하거나 두 방식 모두 일관성 있게 사용하세요.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/prisma.config.ts` around lines 6 - 11, 현재 마이그레이션 설정(defineConfig in
prisma.config.ts)에서는 DATABASE_URL을 사용하지만 런타임(FE/lib/prisma.ts의 PrismaClient
초기화)에서는 개별 변수(DATABASE_HOST, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD,
DATABASE_NAME)를 사용해 불일치가 발생하므로 둘을 통일하세요: 선택한 방식(DATABASE_URL 단일 사용 권장)으로
prisma.config.ts의 schema datasource 설정과 FE/lib/prisma.ts의 PrismaClient 초기화 코드를
일치시키거나, PrismaClient 초기화 코드에 DATABASE_URL이 없을 때 개별 변수로부터 안전하게 DATABASE_URL을 동적으로
조립하는 폴백 로직을 추가해 두 환경 방식이 동일한 DB를 가리키게 하고(필수 값 누락 시 명확한 오류를 던지기), .env.example 또는
README에 어떤 변수(DATABASE_URL 또는 각각의 DATABASE_*)가 필요한지 명시하세요.

Comment on lines +5 to +7
datasource db {
provider = "mysql"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

datasourceurl 속성이 누락되었습니다 - 필수 설정입니다.

Prisma datasource에 데이터베이스 연결 URL이 없으면 prisma generateprisma migrate 명령이 실패합니다. 환경 변수를 통해 데이터베이스 URL을 설정해야 합니다.

🐛 datasource url 추가 수정
 datasource db {
   provider = "mysql"
+  url      = env("DATABASE_URL")
 }

.env 파일에 추가:

DATABASE_URL="mysql://user:password@localhost:3306/database_name"
📝 Committable suggestion

‼️ 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.

Suggested change
datasource db {
provider = "mysql"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FE/prisma/schema.prisma` around lines 5 - 7, The Prisma datasource block
(datasource db) is missing the required url property; add a url =
env("DATABASE_URL") entry to the datasource db declaration so Prisma can read
the DB connection string from the environment (ensure .env contains
DATABASE_URL="mysql://user:password@host:3306/dbname").

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant