Skip to content

랜딩페이지 및 인증페이지 개발 완료#74

Merged
Jieunsse merged 7 commits into
mainfrom
feature/login-signup
Feb 23, 2026
Merged

랜딩페이지 및 인증페이지 개발 완료#74
Jieunsse merged 7 commits into
mainfrom
feature/login-signup

Conversation

@yooolleee

Copy link
Copy Markdown
Contributor

Summary

  • 이 PR에서 변경한 내용 한 줄 요약

우선 feature/login-signup 브랜치에서 인증 페이지 개발을 하고 feature/landing-v2 브랜치에서 랜딩페이지 개발을 하고 각각 다른 개발 브랜치에서 push를 할 예정이였으나 하나의 브랜치에서 두 기능을 push하는 것을 알립니다.

타임라인 순으로 말씀드리면 feature/landing-v2 브랜치에서 개발한 랜딩페이지를 push 했을 때 버셀 배포 환경에서 오류가 났었습니다. 저의 코드로 발생한 건 아니고 팀원의 코드에서 환경변수가 맞지않는 문제가 있어서 에러가 난 상태로 머지를 못하고 두고 시간이 촉박한 관계로 feature/login-signup 브랜치에서 인증페이지를 개발을 먼저 하면서 아무래도 유기성이 있는 페이지다 보니까 필요한 랜딩페이지 관련 파일을 가져와서 작업을 했고 여기서 특정 파일들이 랜딩과 로그인 양쪽에 걸쳐 있어서 어느 브랜치로 분기해서 각각 push 하기가 애매해 졌습니다. 굳이 분리를 하는 방향이 충돌 해결 비용이나 리뷰 난이도 상승이 있을 것 같아서 한 브랜치에서 push를 하고 팀원에게 알립니다.

Zod 와 React Hook Form 을 사용했습니다 pull 받으신 후에 pnpm install 한번 진행해 주시면 감사합니다.

현재

Issue

  • Closes #

Scope

  • 포함

    • 변경한 내용
  • 특이사항

@yooolleee yooolleee added this to the 페이지 milestone Feb 23, 2026
@yooolleee yooolleee requested review from a team, HWAN0218, Jieunsse and jungwon123 February 23, 2026 09:51
@yooolleee yooolleee self-assigned this Feb 23, 2026
@yooolleee yooolleee added the 기능추가 기능개발 및 추가할 때 사용해주세요. label Feb 23, 2026
@github-project-automation github-project-automation Bot moved this to 개발 대기중 in workers Feb 23, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @yooolleee, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 사용자에게 개선된 첫인상을 제공하고 핵심 인증 기능을 활성화하기 위해 새로운 랜딩 페이지와 로그인, 회원가입, 비밀번호 재설정 페이지를 도입합니다. react-hook-formzod를 사용하여 견고한 폼 유효성 검사를 구현했으며, 카카오 소셜 로그인 연동을 통해 사용자 편의성을 높였습니다. 또한, 사용자 인증 상태에 따라 UI를 동적으로 조정하여 전반적인 애플리케이션의 반응성과 유용성을 향상했습니다.

Highlights

  • 랜딩 페이지 개발: 사용자 경험을 개선하고 서비스의 주요 기능을 소개하는 새로운 랜딩 페이지가 개발되었습니다. 이 페이지는 Hero 섹션, 기능 소개 섹션, CTA 섹션으로 구성되어 있으며, PC, 태블릿, 모바일 등 다양한 화면 크기에 최적화된 반응형 디자인을 제공합니다.
  • 인증 페이지 개발: 로그인, 회원가입, 비밀번호 재설정 기능을 포함하는 인증 페이지들이 개발되었습니다. 이 페이지들은 공통 AuthCard 컴포넌트를 사용하여 일관된 UI를 유지하며, react-hook-formzod를 활용한 클라이언트 측 유효성 검사를 구현했습니다.
  • 카카오 소셜 로그인/회원가입 연동: 카카오 소셜 로그인 및 회원가입 기능이 추가되었습니다. Next.js API 라우트를 통해 카카오 인증 흐름을 안전하게 처리하며, 로그인 성공 시 사용자의 팀 소속 여부에 따라 적절한 페이지로 리다이렉트됩니다.
  • 전역 레이아웃 및 상태 관리 개선: 루트 레이아웃(src/app/(root)/layout.tsx)이 업데이트되어 사용자 로그인 상태(isLoggedIn)에 따라 사이드바의 '팀 추가하기' 버튼과 '자유게시판' 링크를 조건부로 렌더링합니다. 이는 사용자 경험을 개인화하고 불필요한 UI 요소를 숨기는 데 기여합니다.
  • 새로운 토스트 알림 컴포넌트 추가: 비밀번호 재설정 이메일 전송 완료와 같은 특정 상황에 사용되는 LinkPassToast 컴포넌트가 추가되었습니다. 이는 사용자에게 명확하고 일관된 피드백을 제공합니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • next.config.ts
    • 카카오 이미지 CDN 도메인을 images.remotePatterns에 추가하여 외부 이미지 로딩을 허용했습니다.
  • package.json
    • @hookform/resolvers 패키지를 의존성에 추가했습니다.
  • pnpm-lock.yaml
    • @hookform/resolvers 및 관련 패키지들의 잠금 파일 정보를 업데이트했습니다.
  • src/app/(auth)/_components/AuthCard.module.css
    • 인증 카드 컴포넌트의 스타일을 추가하고 반응형 디자인을 적용했습니다.
  • src/app/(auth)/_components/AuthCard.tsx
    • 인증 페이지의 공통 레이아웃을 제공하는 AuthCard 컴포넌트를 추가했습니다.
  • src/app/(auth)/layout.module.css
    • 인증 레이아웃의 기본 스타일을 추가하여 콘텐츠를 중앙에 배치했습니다.
  • src/app/(auth)/layout.tsx
    • 인증 페이지를 위한 공통 레이아웃 컴포넌트 AuthLayout을 추가했습니다.
  • src/app/(auth)/login/LoginForm.module.css
    • 로그인 폼의 스타일을 추가하고 반응형 디자인 및 소셜 로그인 버튼 스타일을 정의했습니다.
  • src/app/(auth)/login/LoginForm.tsx
    • 이메일/비밀번호 로그인, 비밀번호 재설정 모달, 카카오 소셜 로그인을 처리하는 LoginForm 컴포넌트를 추가했습니다.
  • src/app/(auth)/login/page.tsx
    • 로그인 페이지를 정의하고 AuthCard 내부에 LoginForm을 렌더링하도록 구현했습니다.
  • src/app/(auth)/login/schema.ts
    • 로그인 폼의 이메일 및 비밀번호 유효성 검사를 위한 loginSchema를 Zod로 정의했습니다.
  • src/app/(auth)/reset-password/ResetPasswordForm.module.css
    • 비밀번호 재설정 폼의 스타일을 추가했습니다.
  • src/app/(auth)/reset-password/ResetPasswordForm.tsx
    • 비밀번호 재설정 로직을 처리하는 ResetPasswordForm 컴포넌트를 추가했습니다.
  • src/app/(auth)/reset-password/page.tsx
    • 비밀번호 재설정 페이지를 정의하고 AuthCard 내부에 ResetPasswordForm을 렌더링하도록 구현했습니다.
  • src/app/(auth)/reset-password/schema.ts
    • 비밀번호 재설정 폼의 새 비밀번호 유효성 검사를 위한 resetPasswordSchema를 Zod로 정의했습니다.
  • src/app/(auth)/signup/SignupForm.module.css
    • 회원가입 폼의 스타일을 추가하고 반응형 디자인 및 소셜 회원가입 버튼 스타일을 정의했습니다.
  • src/app/(auth)/signup/SignupForm.tsx
    • 이름, 이메일, 비밀번호를 이용한 회원가입 로직을 처리하는 SignupForm 컴포넌트를 추가했습니다.
  • src/app/(auth)/signup/page.tsx
    • 회원가입 페이지를 정의하고 AuthCard 내부에 SignupForm을 렌더링하도록 구현했습니다.
  • src/app/(auth)/signup/schema.ts
    • 회원가입 폼의 이름, 이메일, 비밀번호 유효성 검사를 위한 signupSchema를 Zod로 정의했습니다.
  • src/app/(root)/landing/LandingLayout.module.css
    • 랜딩 페이지 레이아웃의 기본 스타일을 추가했습니다.
  • src/app/(root)/landing/LandingPage.module.css
    • 랜딩 페이지의 다양한 섹션에 대한 스타일을 추가하고 반응형 디자인을 적용했습니다.
  • src/app/(root)/landing/LandingPage.tsx
    • 랜딩 페이지의 메인 컴포넌트를 구성하고 여러 섹션 컴포넌트를 조합했습니다.
  • src/app/(root)/landing/components/CtaSection/CtaSection.module.css
    • 랜딩 페이지 CTA 섹션의 스타일을 추가했습니다.
  • src/app/(root)/landing/components/CtaSection/CtaSection.tsx
    • 랜딩 페이지의 Call-to-Action 섹션 컴포넌트를 추가했습니다.
  • src/app/(root)/landing/components/FeatureSection/FeatureSection.module.css
    • 랜딩 페이지 기능 소개 섹션의 스타일을 추가하고 반응형 디자인을 적용했습니다.
  • src/app/(root)/landing/components/FeatureSection/FeatureSection.tsx
    • 랜딩 페이지의 재사용 가능한 기능 소개 섹포넌트를 추가했습니다.
  • src/app/(root)/landing/components/HeroSection/HeroSection.module.css
    • 랜딩 페이지 Hero 섹션의 스타일을 추가하고 반응형 디자인을 적용했습니다.
  • src/app/(root)/landing/components/HeroSection/HeroSection.tsx
    • 랜딩 페이지의 Hero 섹션 컴포넌트를 추가했습니다.
  • src/app/(root)/landing/components/LandingShell.tsx
    • 랜딩 페이지 콘텐츠를 위한 간단한 래퍼 컴포넌트 LandingShell을 추가했습니다.
  • src/app/(root)/layout.tsx
    • 사용자 로그인 상태에 따라 사이드바의 '팀 추가하기' 버튼과 '자유게시판' 링크 렌더링을 조건부로 변경했습니다.
    • useCurrentUser 훅의 isPending 상태를 활용하여 로그인 상태 확인 로직을 개선했습니다.
  • src/app/(root)/page.module.css
    • 기존 홈 페이지 스타일 파일을 제거했습니다.
  • src/app/(root)/page.tsx
    • 루트 페이지를 새로운 LandingPage 컴포넌트를 렌더링하도록 변경하고 SEO를 위한 메타데이터를 추가했습니다.
  • src/app/api/auth/kakao/callback/route.ts
    • 카카오 OAuth 콜백을 처리하고 인증 쿠키를 설정하는 API 라우트를 추가했습니다.
  • src/app/api/auth/kakao/route.ts
    • 카카오 OAuth 인증 URL로 리다이렉트하는 API 라우트를 추가했습니다.
  • src/app/oauth/kakao/route.ts
    • 카카오 OAuth 리다이렉트 URI를 처리하고 사용자 인증을 완료하는 라우트를 추가했습니다.
  • src/assets/buttons/human/profile.svg
    • 새로운 프로필 SVG 아이콘 에셋을 추가했습니다.
  • src/assets/icons/landing/gradation_check.svg
    • 랜딩 페이지용 그라데이션 체크 SVG 아이콘 에셋을 추가했습니다.
  • src/assets/icons/landing/gradation_folder.svg
    • 랜딩 페이지용 그라데이션 폴더 SVG 아이콘 에셋을 추가했습니다.
  • src/assets/icons/landing/gradation_logo.svg
    • 랜딩 페이지용 그라데이션 로고 SVG 아이콘 에셋을 추가했습니다.
  • src/assets/icons/landing/gradation_message.svg
    • 랜딩 페이지용 그라데이션 메시지 SVG 아이콘 에셋을 추가했습니다.
  • src/components/Modal/domain/components/ResetPassword/ResetPassword.module.css
    • 비밀번호 재설정 모달의 모바일 반응형 스타일을 개선했습니다.
  • src/components/Modal/domain/components/ResetPassword/ResetPassword.tsx
    • 비밀번호 재설정 모달 컴포넌트에서 불필요한 JSDoc을 제거하고 모바일 스타일 클래스를 추가했습니다.
  • src/components/toast/LinkPassToast.tsx
    • 비밀번호 재설정 이메일 전송 완료 메시지를 표시하는 LinkPassToast 컴포넌트를 추가했습니다.
  • src/components/toast/styles/LinkPassToast.module.css
    • LinkPassToast 컴포넌트의 스타일과 애니메이션을 정의했습니다.
  • src/shared/styles/color.css
    • 새로운 슬레이트 및 블루 계열 CSS 변수를 추가했습니다.
Activity
  • 작성자는 원래 랜딩 페이지와 인증 페이지를 별도의 브랜치에서 개발할 계획이었으나, 시간 제약과 기능 간의 유기성으로 인해 하나의 브랜치에서 두 기능을 모두 푸시하기로 결정했습니다.
  • 이전에 팀원의 코드에서 발생한 환경 변수 문제로 인해 랜딩 페이지 배포에 오류가 있었고, 이로 인해 랜딩 페이지 머지가 지연되었습니다.
  • 작성자는 PR을 받은 후 pnpm install을 실행해 줄 것을 요청했습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

이 PR은 랜딩 페이지와 인증 관련 페이지(로그인, 회원가입, 비밀번호 재설정) 개발을 포함하고 있습니다. 전반적으로 Zod와 React Hook Form을 사용한 폼 구현이 잘 되어 있으며, 카카오 소셜 로그인 흐름도 서버 사이드에서 안전하게 처리되었습니다. 랜딩 페이지 또한 반응형으로 잘 구현되었습니다. 몇 가지 개선점을 제안드립니다. next.config.js의 이미지 허용 호스트에서 http 프로토콜을 제거하여 보안을 강화하고, 일부 중복되거나 사용되지 않는 코드를 정리하여 유지보수성을 높이는 것이 좋겠습니다. 또한, 랜딩 페이지의 반응형 이미지 로딩 방식을 최적화하여 성능을 개선할 수 있습니다. 자세한 내용은 각 파일에 남긴 코멘트를 참고해주세요.

Comment on lines +1 to +78
import { NextRequest, NextResponse } from 'next/server';
import { fetchApiServer } from '@/shared/apis/fetchApi.server';
import { setAuthCookies } from '../../_lib/cookies';

const TEAM_ID = process.env.API_TEAM_ID ?? '20-1';

interface KakaoSignInResponse {
accessToken: string;
refreshToken: string;
user: {
id: number;
email: string;
nickname: string;
image: string | null;
teamId: string;
createdAt: string;
updatedAt: string;
};
}

/**
* GET /api/auth/kakao/callback
*
* 카카오가 인가코드를 전달하는 Redirect URI 핸들러입니다.
*
* 흐름:
* 1. 카카오가 ?code=인가코드 형태로 이 URL을 호출합니다.
* 2. 인가코드 + redirectUri를 백엔드 /auth/signIn/KAKAO로 전달합니다.
* 3. 백엔드가 카카오에 토큰 교환 후 accessToken/refreshToken을 발급합니다.
* 4. httpOnly 쿠키에 저장 후 적절한 페이지로 이동합니다.
*
* 왜 redirectUri를 다시 백엔드에 보내는가?
* - 카카오 보안 정책상, 인가코드 발급 시 사용한 redirectUri와
* 토큰 교환 시 사용하는 redirectUri가 정확히 일치해야 합니다.
* - 백엔드가 카카오 토큰 API를 호출할 때 이 값이 필요합니다.
*/
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url);
const code = searchParams.get('code');
const error = searchParams.get('error');

// 사용자가 카카오 로그인 동의를 거부한 경우
if (error || !code) {
return NextResponse.redirect(new URL('/login', req.url));
}

const APP_URL = process.env.NEXT_PUBLIC_APP_URL ?? 'http://localhost:3000';
const redirectUri = `${APP_URL}/oauth/kakao`;

try {
console.log('[kakao callback] code:', code);
console.log('[kakao callback] redirectUri:', redirectUri);

const response = await fetchApiServer(`/auth/signIn/KAKAO`, {
method: 'POST',
body: JSON.stringify({
token: code,
redirectUri,
}),
});

if (!response.ok) {
const errorBody = await response.json().catch(() => ({}));
console.error('[kakao callback] 백엔드 응답 실패:', response.status, errorBody);
return NextResponse.redirect(new URL('/login?error=kakao_failed', req.url));
}

const data: KakaoSignInResponse = await response.json();
await setAuthCookies(data.accessToken, data.refreshToken);

// 소속 팀이 있으면 팀 페이지로, 없으면 팀 추가 페이지로
const redirectPath = data.user?.teamId ? `/${data.user.teamId}` : '/addteam';
return NextResponse.redirect(new URL(redirectPath, req.url));
} catch (e) {
console.error('[kakao callback] 예외 발생:', e);
return NextResponse.redirect(new URL('/login?error=kakao_failed', req.url));
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

이 파일(src/app/api/auth/kakao/callback/route.ts)은 src/app/oauth/kakao/route.ts와 거의 동일한 코드를 포함하고 있어 중복으로 보입니다. src/app/api/auth/kakao/route.ts에서 리다이렉트 URI를 /oauth/kakao로 설정했기 때문에, 실제로는 src/app/oauth/kakao/route.ts 파일만 사용될 것입니다. 중복된 코드는 혼란을 야기하고 유지보수를 어렵게 만들 수 있으므로, 사용되지 않는 이 파일은 삭제하는 것이 좋습니다. 또한, 이 파일 내에 선언된 TEAM_ID 상수도 사용되지 않고 있습니다.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

이제 사용되지 않아 삭제하는게 맞습니다 삭제하겠습니다.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

삭제 했습니다

Comment thread next.config.ts
Comment on lines +4 to +23
images: {
remotePatterns: [
{
protocol: 'https',
hostname: '**.kakaocdn.net',
},
{
protocol: 'http',
hostname: '**.kakaocdn.net',
},
{
protocol: 'https',
hostname: '**.kakao.com',
},
{
protocol: 'http',
hostname: '**.kakao.com',
},
],
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

http 프로토콜을 통한 이미지 로드는 보안에 취약할 수 있습니다. 중간자 공격(MITM)에 노출될 위험이 있으므로, 특별한 이유가 없다면 https 프로토콜만 사용하도록 제한하는 것이 좋습니다.

  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.kakaocdn.net',
      },
      {
        protocol: 'https',
        hostname: '**.kakao.com',
      },
    ],
  },

}
router.refresh();
} catch {
setError('email', { message: '네트워크 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

네트워크 오류는 이메일 필드에만 국한된 문제가 아니므로, setError('email', ...) 대신 setError('root', ...)를 사용하여 폼 전체에 대한 오류로 처리하는 것이 더 적절합니다. 이렇게 하면 사용자에게 더 명확한 피드백을 제공할 수 있으며, 다른 폼(회원가입, 비밀번호 재설정)에서의 오류 처리 방식과 일관성을 유지할 수 있습니다.

Suggested change
setError('email', { message: '네트워크 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' });
setError('root', { message: '네트워크 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' });

@@ -0,0 +1,376 @@
/* app/(root)/landing/LandingPage.module.css */

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

이 CSS 파일은 현재 랜딩 페이지 컴포넌트들(HeroSection, FeatureSection 등)에서 사용되지 않는 것으로 보입니다. 각 컴포넌트는 자체적인 모듈 CSS 파일을 가지고 있어 이 파일은 불필요한 코드로 남게 될 수 있습니다. 코드베이스를 깔끔하게 유지하기 위해 사용하지 않는 파일은 삭제하는 것을 권장합니다.

Comment on lines +92 to +100
<div className={[styles.media, mediaClass].join(' ')}>
<Image
src={imgPc}
alt=""
className={[styles.imgPc, imgPcClass].filter(Boolean).join(' ')}
/>
<Image src={imgTablet} alt="" className={styles.imgTablet} />
<Image src={imgMobile} alt="" className={styles.imgMobile} />
</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

현재 반응형 이미지를 처리하기 위해 여러 개의 <Image> 컴포넌트를 렌더링하고 CSS로 숨기는 방식을 사용하고 계십니다. 이 방법은 구현이 간단하지만, 화면에 보이지 않는 이미지도 다운로드하게 되어 초기 로딩 성능에 영향을 줄 수 있습니다. 특히 여러 이미지가 사용되는 랜딩 페이지에서는 성능 저하가 두드러질 수 있습니다.

<picture> 태그와 source 엘리먼트를 사용하면 브라우저가 화면 크기에 맞는 이미지만 다운로드하도록 할 수 있어 성능 개선에 도움이 됩니다. Next.js에서 <picture>next/image를 함께 사용하는 것은 다소 복잡할 수 있지만, 성능 최적화를 위해 고려해볼 만한 방법입니다.

@media (max-width: 480px) {
/* 오버레이를 하단 정렬로 변경 */
.mobileOverlay {
align-items: flex-end !important;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

.mobileOverlay 클래스에서 !important를 사용하고 있습니다. !important는 CSS의 명시도 규칙을 무시하여 스타일 충돌 시 디버깅을 어렵게 만들고 코드 유지보수를 힘들게 할 수 있습니다. 가능하면 !important 사용을 피하고, 더 구체적인 셀렉터를 사용하거나 Modal 컴포넌트 자체에서 스타일을 제어할 수 있는 prop(예: verticalAlign)을 추가하는 방안을 고려해보는 것이 좋습니다.

Suggested change
align-items: flex-end !important;
align-items: flex-end;

@Jieunsse Jieunsse merged commit 576e4d2 into main Feb 23, 2026
1 check passed
@github-project-automation github-project-automation Bot moved this from 개발 대기중 to 개발 완료 in workers Feb 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

기능추가 기능개발 및 추가할 때 사용해주세요.

Projects

Status: 개발 완료

Development

Successfully merging this pull request may close these issues.

3 participants