Skip to content

[Feat/#43] 로그인 페이지 생성#42

Merged
skyblue1232 merged 1 commit intodevelopfrom
feat/#40/role-auth
Mar 22, 2026
Merged

[Feat/#43] 로그인 페이지 생성#42
skyblue1232 merged 1 commit intodevelopfrom
feat/#40/role-auth

Conversation

@skyblue1232
Copy link
Copy Markdown
Contributor

@skyblue1232 skyblue1232 commented Mar 22, 2026

✅ 작업 내용

📝 Description

로그인 화면 UI를 구현했습니다.
이메일/비밀번호 입력, 일반 로그인 버튼, 카카오 로그인 버튼, 회원가입 이동 기능을 추가했습니다.

작업한 내용을 체크해주세요.

  • 로그인 입력폼 UI 구현
  • 일반 로그인 / 카카오 로그인 버튼 구현
  • 회원가입 클릭 시 /role-select 이동 연결

🚀 설계 의도 및 개선점

구조 변경 이유 + 고민 + 해결 과정

  • Input, Button 등 디자인 시스템 컴포넌트를 활용해 화면을 구성했습니다.
  • 카카오 로그인 버튼은 아이콘과 텍스트 정렬을 위해 커스텀 레이아웃으로 구현했습니다.
  • 회원가입 이동 로직을 분리해 가독성을 높였습니다.

📸 스크린샷 (선택)

  • 로그인 화면 UI
image

📎 기타 참고사항

  • 로그인 기능은 현재 mock 상태이며, 추후 API 연동 예정입니다.

Fixes #40

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 로그인 폼 UI 추가: 이메일/비밀번호 입력 필드, 일반 로그인 버튼, 카카오 로그인 버튼
    • 회원가입 페이지로 이동하는 링크 추가
  • Chores

    • 초기 로딩 화면 이후 네비게이션 경로 변경

@skyblue1232 skyblue1232 self-assigned this Mar 22, 2026
@skyblue1232 skyblue1232 added feat 기능 구현 및 생성 style 스타일 관련 적용 labels Mar 22, 2026
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
compasser-customer Error Error Mar 23, 2026 4:18am
compasser-owner Ready Ready Preview, Comment Mar 23, 2026 4:18am

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 22, 2026

📝 Walkthrough

개요

고객 앱의 로그인 흐름이 재구성되었습니다. 로그인 페이지는 단순 네비게이션 버튼에서 이메일/비밀번호 입력 필드 및 카카오 로그인 옵션을 포함한 전체 로그인 폼으로 전환되었으며, 스플래시 페이지의 리디렉션 대상이 /role-select에서 /login으로 변경되었습니다.

변경 사항

분류 / 파일 요약
로그인 페이지 업데이트
apps/customer/src/app/login/page.tsx
단순 네비게이션 버튼을 대체하여 이메일/비밀번호 입력 필드, 일반 로그인 버튼, 카카오 로그인 버튼(KakaoLogo 아이콘 포함)을 추가한 완전한 로그인 폼 레이아웃 구현. 디자인 시스템 컴포넌트(Input, Button, Icon) 임포트 추가 및 클릭 핸들러(handleLogin, handleKakaoLogin) 구현.
스플래시 페이지 리디렉션 변경
apps/customer/src/app/splash/page.tsx
2초 후 리디렉션 대상을 /role-select에서 /login으로 수정.

예상 코드 리뷰 난이도

🎯 2 (Simple) | ⏱️ ~10분

관련 가능성 있는 PR

축하 시

🐰 로그인 폼이 쏙 들어왔네,
이메일과 비번 입력창까지!
카카오 버튼도 반짝반짝,
스플래시에서 로그인으로 쌩 넘어가고,
사용자들이 기분 좋게 로그인할 날만 기다려! 🥕✨

🚥 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 풀 리퀘스트 제목이 변경 사항의 주요 내용을 명확하게 요약하고 있습니다. '로그인 페이지 생성'은 두 파일 모두에서 이루어진 주요 변경 사항(로그인 페이지 구현)을 정확하게 반영합니다.

✏️ 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 feat/#40/role-auth

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.

@skyblue1232 skyblue1232 changed the title [Feat/#40] 로그인 페이지 생성 [Feat/#42] 로그인 페이지 생성 Mar 22, 2026
@skyblue1232 skyblue1232 changed the title [Feat/#42] 로그인 페이지 생성 [Feat/#43] 로그인 페이지 생성 Mar 22, 2026
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: 1

🧹 Nitpick comments (2)
apps/customer/src/app/login/page.tsx (2)

13-19: 입력 값을 캡처할 상태가 없습니다.

현재 handleLogin에서 이메일/비밀번호 값에 접근할 방법이 없습니다. API 연동을 위해 useState로 입력 값을 관리하거나, useRef로 입력 요소에 접근하는 방식이 필요합니다.

♻️ useState를 사용한 상태 관리 예시
+"use client";
+
+import { useState } from "react";
 import { useRouter } from "next/navigation";
 import { Input, Button, Icon } from "@compasser/design-system";

 export default function LoginPage() {
   const router = useRouter();
+  const [email, setEmail] = useState("");
+  const [password, setPassword] = useState("");

   const handleLogin = () => {
-    console.log("일반 로그인");
+    console.log("일반 로그인", { email, password });
   };

그리고 Input 컴포넌트에 valueonChange props를 추가:

<Input
  type="email"
  placeholder="이메일을 입력해주세요"
  value={email}
  onChange={(e) => setEmail(e.target.value)}
/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/customer/src/app/login/page.tsx` around lines 13 - 19, handleLogin and
handleKakaoLogin currently have no access to the user's inputs; add local state
(e.g., useState hooks like email and password) in the component that renders
Input and Password fields, pass those state values into the Input components via
value and update them via onChange handlers (or alternatively useRefs to read
DOM values), then update handleLogin to read from those state variables (email,
password) and use them for the API call; ensure the Input component accepts
value and onChange props so the controlled inputs work with the new state.

24-45: <form> 요소 사용을 권장합니다.

현재 구조에서는 사용자가 Enter 키로 로그인을 제출할 수 없습니다. <form>으로 감싸고 onSubmit을 사용하면 UX가 개선됩니다.

♻️ form 요소 적용 예시
-<div className="flex flex-col">
+<form className="flex flex-col" onSubmit={(e) => { e.preventDefault(); handleLogin(); }}>
   {/* ... inputs ... */}
   <div className="w-full">
     <Button
-      type="button"
+      type="submit"
       size="lg"
       kind="default"
       variant="primary"
-      onClick={handleLogin}
     >
       일반 로그인
     </Button>
   </div>
   {/* ... rest ... */}
-</div>
+</form>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/customer/src/app/login/page.tsx` around lines 24 - 45, Wrap the
email/password inputs and login Button inside a <form> and use the form's
onSubmit instead of relying on Button onClick so Enter submits; update the
Button to type="submit" (or remove its onClick) and change handleLogin to accept
(or wrap it with) an event parameter that calls event.preventDefault() then
performs the login logic; ensure the form element is placed around the Input
components and the Button and that handleLogin is wired as onSubmit on the form.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/customer/src/app/login/page.tsx`:
- Around line 25-33: The email and password fields use visual <p> tags as labels
but lack accessible associations; update the markup so each label is an actual
<label> with htmlFor matching an id on the corresponding Input or add
aria-labelledby on the Input. Specifically, for the Email and Password blocks
replace the <p> with <label htmlFor="email"> and <label htmlFor="password"> (or
give the Input an id prop like id="email" / id="password"), or alternatively add
aria-labelledby pointing to a label element; ensure the Input component
instances receive the id prop so Input (the Input component) is associated with
its label.

---

Nitpick comments:
In `@apps/customer/src/app/login/page.tsx`:
- Around line 13-19: handleLogin and handleKakaoLogin currently have no access
to the user's inputs; add local state (e.g., useState hooks like email and
password) in the component that renders Input and Password fields, pass those
state values into the Input components via value and update them via onChange
handlers (or alternatively useRefs to read DOM values), then update handleLogin
to read from those state variables (email, password) and use them for the API
call; ensure the Input component accepts value and onChange props so the
controlled inputs work with the new state.
- Around line 24-45: Wrap the email/password inputs and login Button inside a
<form> and use the form's onSubmit instead of relying on Button onClick so Enter
submits; update the Button to type="submit" (or remove its onClick) and change
handleLogin to accept (or wrap it with) an event parameter that calls
event.preventDefault() then performs the login logic; ensure the form element is
placed around the Input components and the Button and that handleLogin is wired
as onSubmit on the form.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 30fae1b9-7829-4123-b217-e62451237abc

📥 Commits

Reviewing files that changed from the base of the PR and between 689b7a6 and d3be04c.

⛔ Files ignored due to path filters (3)
  • packages/design-system/src/icons/generated/iconNames.ts is excluded by !**/generated/**
  • packages/design-system/src/icons/generated/spriteSymbols.ts is excluded by !**/generated/**
  • packages/design-system/src/icons/source/KakaoLogo.svg is excluded by !**/*.svg
📒 Files selected for processing (2)
  • apps/customer/src/app/login/page.tsx
  • apps/customer/src/app/splash/page.tsx

Comment on lines +25 to +33
<div className="w-full">
<p className="body2-m pb-[0.2rem] text-default">이메일</p>
<Input type="email" placeholder="이메일을 입력해주세요" />
</div>

<div className="mt-[2rem] mb-[5.2rem] w-full">
<p className="body2-m pb-[0.2rem] text-default">비밀번호</p>
<Input type="password" placeholder="비밀번호를 입력해주세요" />
</div>
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

레이블과 입력 필드의 접근성 연결이 필요합니다.

현재 <p> 태그가 시각적 레이블로만 사용되고 있어, 스크린 리더가 입력 필드와 레이블을 연결하지 못합니다. <label>htmlFor/id를 사용하거나 aria-labelledby를 추가해주세요.

♿ 접근성 개선 예시
 <div className="w-full">
-  <p className="body2-m pb-[0.2rem] text-default">이메일</p>
-  <Input type="email" placeholder="이메일을 입력해주세요" />
+  <label htmlFor="email" className="body2-m pb-[0.2rem] text-default block">이메일</label>
+  <Input id="email" type="email" placeholder="이메일을 입력해주세요" />
 </div>

 <div className="mt-[2rem] mb-[5.2rem] w-full">
-  <p className="body2-m pb-[0.2rem] text-default">비밀번호</p>
-  <Input type="password" placeholder="비밀번호를 입력해주세요" />
+  <label htmlFor="password" className="body2-m pb-[0.2rem] text-default block">비밀번호</label>
+  <Input id="password" type="password" placeholder="비밀번호를 입력해주세요" />
 </div>
📝 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
<div className="w-full">
<p className="body2-m pb-[0.2rem] text-default">이메일</p>
<Input type="email" placeholder="이메일을 입력해주세요" />
</div>
<div className="mt-[2rem] mb-[5.2rem] w-full">
<p className="body2-m pb-[0.2rem] text-default">비밀번호</p>
<Input type="password" placeholder="비밀번호를 입력해주세요" />
</div>
<div className="w-full">
<label htmlFor="email" className="body2-m pb-[0.2rem] text-default block">이메일</label>
<Input id="email" type="email" placeholder="이메일을 입력해주세요" />
</div>
<div className="mt-[2rem] mb-[5.2rem] w-full">
<label htmlFor="password" className="body2-m pb-[0.2rem] text-default block">비밀번호</label>
<Input id="password" type="password" placeholder="비밀번호를 입력해주세요" />
</div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/customer/src/app/login/page.tsx` around lines 25 - 33, The email and
password fields use visual <p> tags as labels but lack accessible associations;
update the markup so each label is an actual <label> with htmlFor matching an id
on the corresponding Input or add aria-labelledby on the Input. Specifically,
for the Email and Password blocks replace the <p> with <label htmlFor="email">
and <label htmlFor="password"> (or give the Input an id prop like id="email" /
id="password"), or alternatively add aria-labelledby pointing to a label
element; ensure the Input component instances receive the id prop so Input (the
Input component) is associated with its label.

@skyblue1232 skyblue1232 merged commit cc543d8 into develop Mar 22, 2026
6 checks passed
@skyblue1232 skyblue1232 linked an issue Mar 22, 2026 that may be closed by this pull request
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 기능 구현 및 생성 style 스타일 관련 적용

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 로그인 페이지 생성 [Feat] 역할 선택 페이지 UI 생성

1 participant