Skip to content

design: 마이페이지 UI 수정#56

Merged
Seoje1405 merged 2 commits intodevelopfrom
design/mypage
Feb 11, 2026
Merged

design: 마이페이지 UI 수정#56
Seoje1405 merged 2 commits intodevelopfrom
design/mypage

Conversation

@Seoje1405
Copy link
Copy Markdown
Contributor

📝 개요

  • 작업한 내용의 핵심을 간단히 적어주세요.
  • 관련 이슈 번호: #이슈번호

🚀 주요 변경 사항

  • 구체적인 변경 사항 1
  • 구체적인 변경 사항 2

📸 스크린샷 (선택)

기능 구현 화면
사진을 여기에 드래그하세요

✅ 체크리스트

  • 빌드 테스트를 완료했나요?
  • 코드 컨벤션을 준수했나요?
  • 불필요한 console.log는 제거했나요?

이슈 해결 여부

PR 본문에 Closes #이슈번호 이라고 적으면, PR이 머지될 때 해당 이슈가 자동으로 닫힙니다

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 10, 2026

Walkthrough

마이페이지 관련 여러 컴포넌트의 UI/스타일 전면 변경입니다. 전반적으로 테두리 색상을 회색에서 검은색으로 통일하고, 타이포그래피와 패딩/마진을 증대했으며 일부 컴포넌트에서 Next.js Image로 교체했습니다. 페이지 구조나 공개 API/로직 변경은 없습니다.

Changes

Cohort / File(s) Summary
마이페이지 레이아웃
src/app/me/page.tsx
헤더 높이 증가(h-14→h-20), 제목 타이포그래피 확장(text-lg→text-3xl leading-normal font-semibold), 상단 여백/스타일 조정; 기능/네비게이션 변경 없음.
컨테이너·섹션 공통 스타일
src/components/mypage/customer-service-section.tsx, src/components/mypage/my-shopping-section.tsx, src/components/mypage/point-section.tsx, src/components/mypage/quick-menu-section.tsx, src/components/mypage/review-request-card.tsx
테두리 색상 회색→검은색, 헤더 스타일(경계·패딩·타이포) 강화, 레이아웃 간격 재조정 및 라벨 폰트 크기 상향. 대부분 UI/CSS 변경(데이터·라우팅 불변).
결제·설정 이미지 마이그레이션
src/components/mypage/payment-section.tsx, src/components/mypage/settings-section.tsx
img/lucide-react 아이콘 일부를 Next.js Image로 교체(경로에 선행 슬래시, width/height 명시). 접근성상 alt 여부와 Next.js 16 PPR에 따른 레이아웃/성능 영향 확인 필요.
프로필·버튼 스타일 조정
src/components/mypage/profile-section.tsx, src/components/mypage/settings-section.tsx
프로필/버튼 클래스 변경(rounded-full→rounded-md/rounded-lg, 색상·텍스트 크기 변경), 그리드/플렉스 간격 재배치. 버튼 텍스트 래핑/문구 변경(예: "내 정보 수정" 래핑).
소소한 레이블·문구 변경
src/components/mypage/review-request-card.tsx, src/components/mypage/payment-section.tsx
라벨 텍스트 스타일/줄바꿈 제거, 버튼 텍스트 일부 연속 표기("받으러가​기" 등) 변경 — 문구·읽기성(a11y) 영향 검토 필요.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Possibly related PRs

  • Feat/mypage #54: 동일한 마이페이지 컴포넌트들(src/app/me/page.tsx, src/components/mypage/*)을 처음 도입하거나 구조화한 PR로 스타일/마이그레이션 변경과 직접적 연관 가능.
🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description check ⚠️ Warning PR description은 템플릿이 작성되지 않은 상태로, 실제 변경사항에 대한 구체적인 설명, 스크린샷, 또는 연결된 이슈가 없습니다. 템플릿의 모든 섹션을 작성하세요: 변경사항의 핵심 설명, 구체적인 변경 사항 목록, 스크린샷, 관련 이슈 번호(Closes #), 완료된 체크리스트 항목들을 포함하세요.
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 (1 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목 '마이페이지 UI 수정'은 변경사항의 핵심을 명확하게 요약하며, 전체 changeset에서 주요 변경점(마이페이지 컴포넌트들의 UI/스타일 리팩토링)을 정확하게 반영합니다.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch design/mypage

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
Contributor

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/components/mypage/quick-menu-section.tsx (1)

37-41: 🛠️ Refactor suggestion | 🟠 Major

img 대신 next/imageImage 컴포넌트를 사용하세요.

동일 PR 내 payment-section.tsx, my-shopping-section.tsx에서는 같은 아이콘 렌더링 패턴에 Image를 사용하고 있습니다. 일관성과 이미지 최적화를 위해 통일이 필요합니다.

♻️ 제안

파일 상단에 import 추가:

 import Link from 'next/link';
+import Image from 'next/image';

imgImage 교체:

-              <img
+              <Image
                 src={`/${item.icon}`}
                 alt={item.label}
                 className="h-full w-full"
+                width={48}
+                height={48}
               />
src/app/me/page.tsx (1)

46-48: ⚠️ Potential issue | 🟡 Minor

하단 네비게이션 바에 max-w-2xl이 적용되지 않아 넓은 화면에서 레이아웃이 깨질 수 있습니다.

main에는 max-w-2xl이 있지만, fixed bottom-0 w-full인 네비게이션에는 해당 제약이 없습니다.

♻️ 제안
-      <div className="fixed bottom-0 w-full">
+      <div className="fixed bottom-0 w-full max-w-2xl">
src/components/mypage/customer-service-section.tsx (1)

37-42: ⚠️ Potential issue | 🟡 Minor

alt 텍스트에 \n 포함 — a11y 주의

item.label'자주 묻는\n질문'인 경우, alt 속성에 리터럴 개행 문자가 들어갑니다. 스크린 리더가 개행을 무시하거나 예상치 못하게 읽을 수 있으므로, alt 전용 필드를 분리하거나 replace(/\n/g, ' ')로 공백 치환하는 것이 좋습니다.

♿ 제안
                <Image
                  src={`/${item.icon}`}
-                 alt={item.label}
+                 alt={item.label.replace(/\n/g, ' ')}
                  width={48}
                  height={48}
                />
🤖 Fix all issues with AI agents
In `@src/app/me/page.tsx`:
- Around line 15-18: The header's h1 has a top margin that can push the text out
of the centered 64px tall header; remove the `mt-6` from the h1 (the element
with class "mt-6 text-3xl leading-normal font-semibold") or alternatively
increase the header height on the containing element (the header with classes
"sticky top-0 z-20 flex h-16 items-center justify-center bg-white") so the
vertical space matches the h1; update whichever you choose to keep visual center
alignment without overflow.

In `@src/components/mypage/review-request-card.tsx`:
- Around line 27-32: The Link element rendering the button (Link with href using
reviewId) is currently an inline element so py-2 may not affect layout; update
the Link's className to include either inline-block or inline-flex (e.g., add
"inline-flex" or "inline-block") so vertical padding is applied, and remove the
unnecessary inner <span> child to simplify markup (target the Link that builds
href={reviewId ? `/review/write/${reviewId}` : '/review/write'}).
🧹 Nitpick comments (6)
src/components/mypage/profile-section.tsx (1)

25-30: Link를 버튼처럼 스타일링할 때 role 또는 시맨틱 요소 고려.

Link에 버튼 스타일(bg-ongil-teal, rounded-md 등)을 적용하고 있는데, 이 경우 네비게이션 의도이므로 현재 Link 사용이 적절합니다. 다만, 내부 <span>은 불필요한 래퍼입니다.

♻️ 불필요한 span 제거
-          <span>내 정보 수정</span>
+          내 정보 수정
src/components/mypage/my-shopping-section.tsx (1)

24-24: gap-[122px] 매직 넘버 — 반응형 대응이 되지 않습니다.

고정 픽셀 gap은 다양한 화면 크기에서 레이아웃이 깨질 수 있습니다. justify-around 또는 justify-evenly를 사용하면 컨테이너 크기에 맞게 자동으로 간격이 조정됩니다.

♻️ 제안
-        <div className="flex items-center justify-center gap-[122px]">
+        <div className="flex items-center justify-evenly">
src/components/mypage/payment-section.tsx (1)

22-27: 헤더 보더 스타일 불일치: border-y vs border-b.

payment-sectionborder-y(상하 보더)를, my-shopping-sectionborder-b(하단만)를 사용합니다. 의도된 디자인이 아니라면 통일이 필요합니다.

src/components/mypage/customer-service-section.tsx (1)

30-48: settings-section.tsx와 아이콘+라벨 렌더링 패턴 중복

두 섹션 모두 Image(48×48) + <span> 라벨을 flex-col로 배치하는 동일한 패턴을 사용합니다. 공통 IconLabelItem 컴포넌트로 추출하면 유지보수가 편해집니다. 지금 당장은 아니더라도 참고해 주세요.

src/components/mypage/settings-section.tsx (2)

7-31: item.href! 비-null 단언 제거 가능 — 타입 안전성 개선

settingsItems 배열이 단일 타입으로 추론되어 href가 optional이 됩니다. discriminated union으로 타입을 분리하면 ! 없이도 안전하게 접근할 수 있습니다.

🛡️ 타입 개선 제안
-const settingsItems = [
-  {
-    icon: 'icons/notification.svg',
-    label: '알림 받기',
-    href: '/me/notifications',
-    type: 'link' as const,
-  },
-  ...
-  {
-    icon: 'icons/logout.svg',
-    label: '로그아웃',
-    type: 'logout' as const,
-  },
-  ...
-];
+type SettingsLinkItem = {
+  icon: string;
+  label: string;
+  href: string;
+  type: 'link';
+};
+
+type SettingsLogoutItem = {
+  icon: string;
+  label: string;
+  type: 'logout';
+};
+
+type SettingsItem = SettingsLinkItem | SettingsLogoutItem;
+
+const settingsItems: SettingsItem[] = [
+  { icon: 'icons/notification.svg', label: '알림 받기', href: '/me/notifications', type: 'link' },
+  { icon: 'icons/my-edit.svg', label: '내 정보 수정', href: '/me/edit', type: 'link' },
+  { icon: 'icons/logout.svg', label: '로그아웃', type: 'logout' },
+  { icon: 'icons/people-delete.svg', label: '회원 탈퇴', href: '/me/withdraw', type: 'link' },
+];

그러면 item.type !== 'logout' 분기에서 item.hrefstring으로 자동 추론되어 ! 단언이 불필요해집니다:

-              href={item.href!}
+              href={item.href}

Also applies to: 66-68


45-84: button/Link 내부 콘텐츠 중복

<div className="flex h-12 w-12 ..."><Image .../></div> + <span> 블록이 button과 Link에서 동일하게 반복됩니다. 내부 콘텐츠를 변수나 헬퍼로 추출하면 유지보수가 쉬워집니다.

♻️ 예시
const ItemContent = ({ icon, label }: { icon: string; label: string }) => (
  <>
    <div className="flex h-12 w-12 items-center justify-center">
      <Image src={`/${icon}`} alt={label} className="h-full w-full" width={48} height={48} />
    </div>
    <span className="text-center text-lg leading-normal font-normal">{label}</span>
  </>
);

Comment thread src/app/me/page.tsx Outdated
Comment thread src/components/mypage/review-request-card.tsx
Copy link
Copy Markdown
Contributor

@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

🤖 Fix all issues with AI agents
In `@src/components/mypage/review-request-card.tsx`:
- Line 28: The ternary for the href treats reviewId as falsy (so 0 falls back
incorrectly); change the conditional to explicitly check for undefined/null
(e.g., use reviewId != null or reviewId !== undefined) when building the path so
a valid 0 ID is preserved—update the expression where href is set (the ternary
using reviewId) in the review-request-card component to use an explicit
null/undefined check.

받으러 가실까요?
</p>
<Link
href={reviewId ? `/review/write/${reviewId}` : '/review/write'}
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.

⚠️ Potential issue | 🟡 Minor

reviewId0일 때 falsy로 평가되어 fallback 경로로 빠집니다.

reviewId?: number이므로 0이 유효한 ID라면 조건문이 의도와 다르게 동작합니다. 실제 ID 체계에서 0이 불가능하다면 무시해도 됩니다.

🛡️ 엄격한 undefined 체크
-          href={reviewId ? `/review/write/${reviewId}` : '/review/write'}
+          href={reviewId !== undefined ? `/review/write/${reviewId}` : '/review/write'}
📝 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
href={reviewId ? `/review/write/${reviewId}` : '/review/write'}
href={reviewId !== undefined ? `/review/write/${reviewId}` : '/review/write'}
🤖 Prompt for AI Agents
In `@src/components/mypage/review-request-card.tsx` at line 28, The ternary for
the href treats reviewId as falsy (so 0 falls back incorrectly); change the
conditional to explicitly check for undefined/null (e.g., use reviewId != null
or reviewId !== undefined) when building the path so a valid 0 ID is
preserved—update the expression where href is set (the ternary using reviewId)
in the review-request-card component to use an explicit null/undefined check.

@Seoje1405 Seoje1405 merged commit dd26efd into develop Feb 11, 2026
2 checks passed
@Seoje1405 Seoje1405 deleted the design/mypage branch February 15, 2026 09:36
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