Skip to content

Conversation

@cywin1018
Copy link
Contributor

@cywin1018 cywin1018 commented Sep 7, 2025

🚀 풀 리퀘스트 제안

  • 기능 추가
  • 기능 삭제
  • 버그 수정
  • 스타일링
  • 의존성, 환경 변수, 빌드 관련 코드 업데이트
  • 기타

✈️ 관련 이슈

📋 작업 내용

📸 스크린샷 (선택 사항)

image image image image image

📄 기타

Summary by CodeRabbit

  • New Features
    • 모바일 랜딩 페이지 추가(/landing): 히어로, 카드형 콘텐츠, 일러스트, 안내 섹션으로 구성된 모바일 최적화 화면.
    • 카카오톡 공유 버튼: 하단 고정 또는 인라인 사용 가능, 안전영역을 고려한 오프셋 지원.
    • 맨 위로 이동 버튼: 스크롤 시 노출, 부드러운 스크롤과 위치(하단/우측) 조절 지원.
    • 모바일 프레임/레이아웃 추가: 기기 안전영역을 반영한 여백 처리로 안정적인 전체 화면 표시.
    • 라우팅에 랜딩 경로(/landing) 연결.

@cywin1018 cywin1018 requested a review from Chasyuss September 7, 2025 15:23
@coderabbitai
Copy link

coderabbitai bot commented Sep 7, 2025

Warning

Rate limit exceeded

@cywin1018 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 27 minutes and 5 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a8224a6 and 8f182e9.

📒 Files selected for processing (4)
  • src/common/CheckList.tsx (3 hunks)
  • src/hook/useJobQuery.ts (2 hunks)
  • src/pages/otherTodoList/OtherTodoListPage.tsx (4 hunks)
  • src/pages/otherTodoList/components/OtherTodoCard.tsx (1 hunks)

Walkthrough

새로운 랜딩 페이지(/landing) 라우트를 추가하고, 이를 감싸는 BlankLayout을 도입했습니다. 랜딩 페이지 UI를 위한 MobileFrame, ScrollTopButton, KakaoShareButton 등 공용 컴포넌트를 신규 추가했으며, Router에 해당 경로를 등록했습니다.

Changes

Cohort / File(s) Change Summary
공용 버튼/프레임 컴포넌트 추가
src/common/KakaoShareButton.tsx, src/common/MobileFrame.tsx, src/common/ScrollTopButton.tsx
카카오 공유 버튼, 모바일 프레임 래퍼, 스크롤-탑 버튼 컴포넌트 신설. 속성 지원 및 안전영역(env safe-area) 보정, 스크롤/리사이즈 감지 로직 포함.
레이아웃 추가
src/outlet/BlankLayout.tsx
기본 흰 배경의 공백 레이아웃 컴포넌트 추가. 중첩 라우트 렌더링(Outlet) 제공.
랜딩 페이지 추가
src/pages/landing/LandingPage.tsx
모바일 최적화 랜딩 페이지 UI 추가. 다양한 이미지/카드 구성 및 공용 컴포넌트 조합.
라우터 수정
src/route/Router.tsx
/landing 경로를 BlankLayout으로 감싸서 LandingPage 렌더링하도록 라우트 등록.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant User as 사용자
    participant Router as Router
    participant Blank as BlankLayout
    participant Landing as LandingPage
    participant Common as 공용 컴포넌트(ScrollTop/KakaoShare)

    User->>Router: /landing 접속
    Router->>Blank: 경로 매칭 및 레이아웃 로드
    Blank->>Landing: Outlet으로 페이지 렌더
    Landing->>Common: ScrollTopButton/KakaoShareButton 마운트
    Common-->>User: 스크롤/클릭 상호작용 처리
Loading
sequenceDiagram
    autonumber
    participant Window as Window
    participant ScrollBtn as ScrollTopButton

    Window-->>ScrollBtn: scroll 이벤트
    ScrollBtn->>ScrollBtn: 임계치 초과 여부 계산(visible 토글)
    Window-->>ScrollBtn: resize 이벤트
    ScrollBtn->>ScrollBtn: 모바일 프레임 기준 right 오프셋 재계산
    User->>ScrollBtn: 클릭
    ScrollBtn->>Window: window.scrollTo({top:0, smooth})
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • main 최신화 #229: Router.tsx에 새로운 라우트들을 추가하는 변경으로, 본 PR의 /landing 라우트 추가와 동일 파일/유형 변경.
  • main 최신화 #62: Router.tsx에 /jobfound 라우트 추가. 라우터 확장이라는 점에서 직접적인 코드 수준 연관.
  • main 최신화 #312: Router.tsx에 /community 라우트 추가. 상위 라우팅 구조 변경과 유사한 패턴.

Suggested labels

✨Feature, 💄Style

Suggested reviewers

  • Chasyuss

Poem

토끼는 톡톡, 노랗게 버튼을 누르고,
프레임은 폭신, 안전영역 감싸주고.
스르륵 꼭대기, 스크롤은 가볍게—↑
새 길은 /landing, 하얀 길 위에 피고.
깡총! 오늘 배포는 부드럽게 굴러가요. 🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch landing-336

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
Member

@Chasyuss Chasyuss left a comment

Choose a reason for hiding this comment

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

확인했어용

Copy link

@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

🧹 Nitpick comments (12)
src/outlet/BlankLayout.tsx (1)

5-5: 모바일 100vh 이슈 대비해 svh 추가 권장

모바일 주소창/OS UI에 의해 100vh가 과하게 커지는 문제를 줄이기 위해 svh를 함께 지정하는 편이 안전합니다.

-    <div className="min-h-screen w-full bg-white">
+    <div className="min-h-[100svh] min-h-screen w-full bg-white">
src/common/MobileFrame.tsx (2)

16-16: min-h-screen 대신 svh 보강

동일 이유로 svh를 추가해 모바일에서 뷰포트 높이 계산 이슈를 완화하세요.

-    'mx-auto w-full max-w-[390px] min-[360px]:w-[360px] min-[391px]:w-[390px] min-h-screen bg-white';
+    'mx-auto w-full max-w-[390px] min-[360px]:w-[360px] min-[391px]:w-[390px] min-h-[100svh] min-h-screen bg-white';

20-31: 가로 센터링 중복 제거

바깥 래퍼의 flex/justify-center와 내부의 mx-auto가 중복입니다. 하나로 충분합니다.

-  return (
-    <div className="flex w-full justify-center">
-      <div
-        className={`${baseClass} ${paddingClass}${className ? ` ${className}` : ''}`}
-        style={{
-          paddingTop: 'env(safe-area-inset-top)',
-          paddingBottom: 'env(safe-area-inset-bottom)',
-        }}
-      >
-        {children}
-      </div>
-    </div>
-  );
+  return (
+    <div
+      className={`${baseClass} ${paddingClass}${className ? ` ${className}` : ''}`}
+      style={{
+        paddingTop: 'env(safe-area-inset-top)',
+        paddingBottom: 'env(safe-area-inset-bottom)',
+      }}
+    >
+      {children}
+    </div>
+  );
src/common/KakaoShareButton.tsx (1)

19-25: 작은 화면 폭(≤320px) 오버플로우 가능성과 포커스 가시성 개선

  • 고정 폭 328px은 320px 기기에서 좌우가 잘릴 수 있습니다. max-width로 클램프하세요.
  • 키보드 접근성을 위해 focus-visible 링 추가, 버튼에 명시적 라벨 부여 권장.
-  const base =
-    'flex w-[328px] items-center justify-center rounded-[16px] px-[18px] py-[18px]';
+  const base =
+    'flex w-[328px] max-w-[calc(100vw-32px)] items-center justify-center rounded-[16px] px-[18px] py-[18px]';
   const layout = fixed
     ? `fixed left-1/2 -translate-x-1/2 z-[9999] ${base}`
     : `mx-auto mt-[58px] ${base}`;
-  // 시안 색상(카카오 노란색 계열)
-  const styles = 'bg-[#FFD400] text-gray-900 shadow-lg';
+  // 시안 색상(카카오 노란색 계열)
+  const styles =
+    'bg-[#FFD400] text-gray-900 shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-black/20';

또한 버튼 요소에 접근성 라벨을 추가하세요:

-    <button
+    <button
+      aria-label="카카오톡에 링크 보내기"
       type="button"
src/common/ScrollTopButton.tsx (2)

25-26: 스크롤 리스너에 passive 옵션 추가

스크롤 성능 향상을 위해 passive 리스너를 사용하세요.

-    window.addEventListener('scroll', onScroll);
+    window.addEventListener('scroll', onScroll, { passive: true });

53-62: form 내부 사용 대비: type="button" 명시

예기치 않은 submit 방지를 위해 명시적으로 버튼 타입을 지정하세요.

-    <button
+    <button
+      type="button"
       aria-label="scroll-to-top"
       onClick={handleClick}
src/route/Router.tsx (1)

14-14: LandingPage/BlankLayout 지연 로딩으로 번들 크기/초기 TTI 절감

랜딩은 최초 진입 경로가 아닐 가능성이 높아 lazy 로드가 이점이 큽니다. 아래처럼 React.lazy + Suspense로 전환을 제안합니다.

-import { useEffect } from 'react';
+import { useEffect, Suspense, lazy } from 'react';
-import BlankLayout from '@outlet/BlankLayout';
+const BlankLayout = lazy(() => import('@outlet/BlankLayout'));
 ...
-import LandingPage from '@pages/landing/LandingPage.tsx';
+const LandingPage = lazy(() => import('@pages/landing/LandingPage'));

그리고 라우트 요소에만 국소적으로 경량 fallback을 두면 됩니다:

-        <Route element={<BlankLayout />}>
-          <Route path="/landing" element={<LandingPage />} />
-        </Route>
+        <Route element={
+          <Suspense fallback={null}>
+            <BlankLayout />
+          </Suspense>
+        }>
+          <Route path="/landing" element={
+            <Suspense fallback={null}>
+              <LandingPage />
+            </Suspense>
+          } />
+        </Route>

Also applies to: 38-38

src/pages/landing/LandingPage.tsx (5)

20-22: 헤더 시맨틱/로고 접근성 라벨 추가

헤더는 header 태그 사용, 로고에는 스크린리더 라벨을 권장합니다.

-        <div className="z-10 flex h-[50px] w-full items-center justify-center bg-white">
-          <MobileLogo className="h-[28px] w-[81px]" />
-        </div>
+        <header className="z-10 flex h-[50px] w-full items-center justify-center bg-white">
+          <MobileLogo className="h-[28px] w-[81px]" role="img" aria-label="두드림 로고" />
+        </header>

43-50: 정보 아이콘은 장식이면 스크린리더에서 숨기기

중복 낭독 방지를 위해 aria-hidden을 권장합니다.

-                    <InfoIcon className="h-5 w-5 shrink-0 text-gray-700" />
+                    <InfoIcon className="h-5 w-5 shrink-0 text-gray-700" aria-hidden="true" focusable="false" />
@@
-                    <InfoIcon className="h-5 w-5 shrink-0 text-gray-700" />
+                    <InfoIcon className="h-5 w-5 shrink-0 text-gray-700" aria-hidden="true" focusable="false" />

33-37: 헤딩 시맨틱 적용으로 접근성/SEO 강화

주요 카피를 p 대신 h1/h2로 승격하는 것을 권장합니다. 클래스는 유지 가능합니다.

-                <p className="mt-4 text-[28px] leading-[40px] text-white font-T02-B">
+                <h1 className="mt-4 text-[28px] leading-[40px] text-white font-T02-B">
                   인생 2막의 시작은
                   <br />
                   두드림과 함께 하세요!
-                </p>
+                </h1>
@@
-          <p className="mt-10 w-[328px] text-[20px] font-[700] leading-[28px] text-gray-900">
+          <h2 className="mt-10 w-[328px] text-[20px] font-[700] leading-[28px] text-gray-900">
             퇴직 후 , 나에게 꼭 맞는
             <br />
             두번째 커리어는?
-          </p>
+          </h2>
@@
-          <p className="mt-10 w-[328px] text-center text-[22px] font-[700] text-gray-900">
+          <h2 className="mt-10 w-[328px] text-center text-[22px] font-[700] text-gray-900">
             두드림에서 나에게 딱 맞는
             <br />
             직업을 추천받아보세요!
-          </p>
+          </h2>
@@
-          <p className="mt-8 w-[328px] text-center text-[22px] font-[700] text-gray-900">
+          <h2 className="mt-8 w-[328px] text-center text-[22px] font-[700] text-gray-900">
             혼자 준비하려니 막막하셨나요?
-          </p>
+          </h2>
@@
-          <p className="mt-6 w-[328px] text-center text-[22px] font-[700] text-gray-900">
+          <h2 className="mt-6 w-[328px] text-center text-[22px] font-[700] text-gray-900">
             두드림과 함께 해봐요!
-          </p>
+          </h2>

Also applies to: 65-69, 100-104, 121-123, 137-139


51-52: 한글 띄어쓰기/문장부호 교정(사용자 노출 문구)

작은 오탈자이지만 첫인상에 직접 영향이 있어 교정 권장합니다.

-                      카카오톡에 링크 보내기 버튼을 누른 뒤, PC로 접속해보세요!
+                      카카오톡에 링크 보내기 버튼을 누른 뒤, PC로 접속해 보세요!
@@
-            퇴직 후 , 나에게 꼭 맞는
+            퇴직 후, 나에게 꼭 맞는
@@
-            두번째 커리어는?
+            두 번째 커리어는?
@@
-                  아이들을 다 키우고 나니 어떤 일을 해야할지 모르겠어
+                  아이들을 다 키우고 나니 어떤 일을 해야 할지 모르겠어
@@
-            직업을 추천받아보세요!
+            직업을 추천받아 보세요!
@@
-            같이 준비하는 드리머들의 할 일을 보며
-            <br />내 할 일을 작성해보세요
+            같이 준비하는 드리머들의 할 일을 보며
+            <br />내 할 일을 작성해 보세요
@@
-            두드림에서 직업,학원,구직 정보까지
+            두드림에서 직업, 학원, 구직 정보까지

Also applies to: 66-69, 83-84, 101-104, 125-127, 141-144


172-172: ScrollTopButton 항상 노출(showAfter=0) 재검토

0이면 페이지 상단에서도 버튼이 떠 UX를 방해할 수 있습니다. 150~300px 정도로 노출 임계값을 두는 것을 제안합니다.

-      <ScrollTopButton offsetBottomPx={100} showAfter={0} withinMobileFrame />
+      <ScrollTopButton offsetBottomPx={100} showAfter={200} withinMobileFrame />
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0ceac2f and a8224a6.

⛔ Files ignored due to path filters (12)
  • src/assets/icons/landing/info.svg is excluded by !**/*.svg
  • src/assets/icons/landing/kakao.svg is excluded by !**/*.svg
  • src/assets/icons/landing/up.svg is excluded by !**/*.svg
  • src/assets/icons/up.svg is excluded by !**/*.svg
  • src/assets/images/landing/1.png is excluded by !**/*.png
  • src/assets/images/landing/10.png is excluded by !**/*.png
  • src/assets/images/landing/2.png is excluded by !**/*.png
  • src/assets/images/landing/3.png is excluded by !**/*.png
  • src/assets/images/landing/4.png is excluded by !**/*.png
  • src/assets/images/landing/5.png is excluded by !**/*.png
  • src/assets/images/landing/6.png is excluded by !**/*.png
  • src/assets/images/landing/9.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • src/common/KakaoShareButton.tsx (1 hunks)
  • src/common/MobileFrame.tsx (1 hunks)
  • src/common/ScrollTopButton.tsx (1 hunks)
  • src/outlet/BlankLayout.tsx (1 hunks)
  • src/pages/landing/LandingPage.tsx (1 hunks)
  • src/route/Router.tsx (3 hunks)
🔇 Additional comments (2)
src/route/Router.tsx (1)

107-109: /landing 라우트 추가 구성 적절

BlankLayout 아래에 분리해 둔 점 좋습니다. 기존 레이아웃과 충돌 없어 보입니다.

src/pages/landing/LandingPage.tsx (1)

173-173: iOS 안전 영역(safe-area) 대응 확인 요청

고정형 공유 버튼은 iPhone 하단 홈 인디케이터와 겹칠 수 있습니다. KakaoShareButton 내부에서 env(safe-area-inset-bottom)를 고려하는지 확인 부탁드립니다. 미대응 시 padding-bottom 보강이 필요합니다.

Comment on lines +56 to +61
<img
src={LandingHeroImg}
alt="landing-hero"
className="absolute bottom-[140px] left-1/2 z-10 h-[200px] w-[200px] -translate-x-1/2"
/>
</div>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

LCP(히어로 이미지) 최적화: fetchpriority/명시 크기 지정

히어로 이미지는 LCP 후보이므로 우선순위를 높이고 레이아웃 시프트를 줄이기 위해 명시 크기와 fetchpriority를 권장합니다. alt도 더 구체적으로요.

-              <img
-                src={LandingHeroImg}
-                alt="landing-hero"
-                className="absolute bottom-[140px] left-1/2 z-10 h-[200px] w-[200px] -translate-x-1/2"
-              />
+              <img
+                src={LandingHeroImg}
+                alt="두드림 랜딩 히어로 일러스트"
+                className="absolute bottom-[140px] left-1/2 z-10 h-[200px] w-[200px] -translate-x-1/2"
+                width={200}
+                height={200}
+                loading="eager"
+                decoding="async"
+                fetchpriority="high"
+              />
📝 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
<img
src={LandingHeroImg}
alt="landing-hero"
className="absolute bottom-[140px] left-1/2 z-10 h-[200px] w-[200px] -translate-x-1/2"
/>
</div>
<img
src={LandingHeroImg}
alt="두드림 랜딩 히어로 일러스트"
className="absolute bottom-[140px] left-1/2 z-10 h-[200px] w-[200px] -translate-x-1/2"
width={200}
height={200}
loading="eager"
decoding="async"
fetchpriority="high"
/>
🤖 Prompt for AI Agents
In src/pages/landing/LandingPage.tsx around lines 56 to 61, the hero image is an
LCP candidate but currently lacks explicit width/height and fetch priority and
uses a generic alt; add explicit numeric width and height attributes matching
the rendered size (e.g., 200 x 200), add fetchpriority="high" to prioritize
loading, and replace the alt with a more descriptive string (e.g., "Product hero
illustration showing X") to reduce CLS and improve accessibility and LCP.

Comment on lines +74 to +78
<img
src={LandingBubbleImg}
alt="landing-bubble"
className="absolute bottom-0 left-1/2 h-[120px] w-auto -translate-x-1/2"
/>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

폴드 이하 이미지 지연 로딩/접근성 개선

접근성 향상과 초기 페인트 가속을 위해 아래 이미지들에 lazy/async를 적용하고 alt를 내용 기반으로 보완하세요.

-            <img
-              src={LandingBubbleImg}
-              alt="landing-bubble"
+            <img
+              src={LandingBubbleImg}
+              alt="말풍선 장식 이미지"
               className="absolute bottom-0 left-1/2 h-[120px] w-auto -translate-x-1/2"
+              loading="lazy"
+              decoding="async"
             />
@@
-            <img
-              src={Card2}
-              alt="card-2"
+            <img
+              src={Card2}
+              alt="추천 카드 예시 2"
               className="absolute right-[24px] top-4 z-0 h-[200px] w-auto rotate-[6deg] rounded-[20px]"
+              loading="lazy"
+              decoding="async"
             />
-            <img
-              src={Card1}
-              alt="card-1"
+            <img
+              src={Card1}
+              alt="추천 카드 예시 1"
               className="absolute left-[24px] top-0 z-10 h-[220px] w-auto -rotate-[6deg] rounded-[20px]"
+              loading="lazy"
+              decoding="async"
             />
@@
-            <img
-              src={LandingImg3}
-              alt="landing-3"
+            <img
+              src={LandingImg3}
+              alt="서비스 기능 소개 일러스트 3"
               className="mx-auto h-auto w-full"
+              loading="lazy"
+              decoding="async"
             />
@@
-            <img
-              src={LandingImg4}
-              alt="landing-4"
+            <img
+              src={LandingImg4}
+              alt="서비스 기능 소개 일러스트 4"
               className="mx-auto h-auto w-full"
+              loading="lazy"
+              decoding="async"
             />
@@
-            <img
-              src={LandingImg5}
-              alt="landing-5"
+            <img
+              src={LandingImg5}
+              alt="서비스 기능 소개 일러스트 5"
               className="mx-auto h-auto w-full"
+              loading="lazy"
+              decoding="async"
             />
@@
-            <img
-              src={LandingImg6}
-              alt="landing-6"
+            <img
+              src={LandingImg6}
+              alt="서비스 기능 소개 일러스트 6"
               className="mx-auto h-auto w-full"
+              loading="lazy"
+              decoding="async"
             />

Also applies to: 108-117, 131-136, 148-152, 158-161, 165-168

🤖 Prompt for AI Agents
In src/pages/landing/LandingPage.tsx around lines 74-78 (and also apply to
108-117, 131-136, 148-152, 158-161, 165-168): the below-the-fold images need
lazy/async loading and improved alt text for accessibility and faster initial
paint. Add loading="lazy" and decoding="async" (and optionally
fetchPriority="low") attributes to these <img> tags, and replace the generic alt
values with concise, content-descriptive strings (or use alt="" and
role="presentation" only if the image is purely decorative). Ensure any
decorative images are explicitly marked as such and that all informative images
have meaningful alt text.

@cywin1018 cywin1018 merged commit 258ae22 into develop Sep 7, 2025
2 checks passed
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.

3 participants