Skip to content

[FIX] 3차 스프린트 QA 대응#345

Merged
maylh merged 25 commits intodevelopfrom
fix/#344/3sp-qa1
Feb 5, 2026
Merged

[FIX] 3차 스프린트 QA 대응#345
maylh merged 25 commits intodevelopfrom
fix/#344/3sp-qa1

Conversation

@maylh
Copy link
Collaborator

@maylh maylh commented Feb 3, 2026

🛰️ 관련 이슈

해결한 이슈 번호를 작성해주세요
close #344

🧑‍💻 작업 내용

작업한 내용을 간략히 작성해주세요

  • 할 수 있는 QA 다 함 (노션 QA 시트에 작업완료로 상태 체크해둔 항목들이 이번 이슈에서 해결한 부분들입니다 ~!)

🗯️ PR 포인트

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

  • 필터 이슈 해결하면서 검색 후 필터 적용 시 정확하게 작동하도록 필터 모달에 searchText 상태를 반영했고, 각 필터 그룹별로 초기화할 수 있는 로직을 추가했습니다 5ca8dcb 2f228a9
  • 나머지는 자잘한 이슈들임 !!

🚀 알게된 점

기록하며 개발하기!

📖 참고 자료 (선택)

참고했던 문서들 공유하기!

📸 스크린샷 (선택)

Summary by CodeRabbit

  • 새로운 기능

    • 필터 그룹 초기화(개별 그룹·가격 포함) 및 검색어(searchText) 전달/동기화 추가
    • 읽기전용 검색 트리거 링크와 검색 입력 클리어 동작 추가
  • 개선사항

    • 유형 필터 안내 문구 및 빈 상태 메시지 조건화 개선
    • 테스트 모달 흐름 및 진행/이전 경로 복귀 동작 개선
    • 뒤로가기/홈 네비게이션 동작 개선, 여러 컴포넌트 스타일·레이아웃 조정
  • 기타

    • 외부 링크 업데이트 및 입력 길이 제한 완화(10→16)

@maylh maylh self-assigned this Feb 3, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 3, 2026

Walkthrough

홈페이지 스타일·검색 진입 UI 추가, 필터 리셋 및 searchText 전파 로직 추가, 테스트 흐름·페이지명·여러 컴포넌트의 props·스타일 수정 등 UI·필터 관련 변경 모음입니다.

Changes

Cohort / File(s) Summary
홈 페이지 스타일 및 검색 진입 UI
src/app/homePage.css.ts, src/app/page.tsx
searchInput, searchWrapper, testBannerWrapper 스타일 추가. SearchBar를 readOnly 링크형 검색 트리거로 변경하고 hasType 쿠키에 따라 TestBanner 조건부 렌더링.
검색 결과 및 필터 리셋 흐름
src/app/searchResult/SearchResultPageClient.tsx, src/components/filter/filterTypeBox/FilterTypeBox.tsx, src/components/filter/filterBottomSheetModal/FilterBottomSheetModal.tsx, src/components/filter/filterBottomSheetModal/FilterModalContent.tsx, src/model/filter/filterList.ts, src/components/filter/priceSlider/PriceSlider.tsx
FilterTypeBox에 onResetGroup/searchText prop 추가. FilterBottomSheetModal/FilterModalContent로 searchText 전파. FilterList.resetGroup(groupName) 추가. SearchResultPageClient에 그룹 리셋 핸들러·price/URL 동기화 로직과 price atom 리셋 연동 추가. PriceSlider가 atom 변경에 동기화되도록 useEffect 추가.
검색 컴포넌트 및 스타일 조정
src/components/search/searchBar/SearchBar.tsx, src/components/search/searchBar/searchBar.css.ts, src/components/search/searchHeader/SearchHeader.tsx, src/components/search/searchHeader/searchHeader.css.ts
입력 maxLength 10→16, 클리어 기능 추가, 입력/레이아웃 너비 축소 및 폰트 일부 제거. SearchHeader CSS를 named export로 전환하고 backBtn 스타일 추가 및 클래스명 사용으로 교체.
테스트 페이지/헤더 흐름 변경
src/app/test/page.tsx, src/components/test/testHeader/TestHeader.tsx, src/components/test/testHeader/TestHeader.css.ts
모달 오픈 조건을 닉네임+hasType 기반으로 변경, START 클릭시 nextStep 호출로 간소화, 모달 닫힘 시 prevPath로 네비게이션. TestHeader의 버튼/타이틀 렌더링 조건 및 스타일명 변경.
마이페이지·페이지네임 변경
src/app/myPage/page.tsx, src/components/common/pageName/PageName.tsx
MOCK 데이터 제거 후 useGetMyPage 사용. PageName prop isPrivate?isBackToHome?로 변경 및 동작 수정(홈으로 이동 가능).
검색 빈 상태 및 텍스트 래핑
src/components/common/empty/searchEmpty/SearchEmpty.tsx, src/components/common/empty/searchEmpty/searchEmpty.css.ts
text prop을 선택적(text?: string)으로 변경하고 메시지 분기 처리 추가. 텍스트 워드브레이크/오버플로우 스타일 추가.
필터 UI 도움말 및 스타일 추가
src/components/filter/filterBox/FilterBox.tsx, src/components/filter/filterBox/filterBox.css.ts
"유형" 제목 아래 helper 문구 추가 및 helperText 스타일 추가.
카드 스타일 조정
src/components/card/recommendCard/recommendCard.css.ts, src/components/card/templeStayCard/templeStayCard.css.ts
recommendCardmarginBottom 제거. templeStayCard에서 position: relative를 base → vertical variant로 이동.
그 외 소소한 변경
src/components/curation/CurationHeader.tsx, src/components/footer/Footer.tsx, src/components/userInfo/userInfo.tsx, src/type/titleMap.ts
SmallLogo를 홈 버튼으로 래핑, Footer/유저 링크 대상 URL 변경, titleMap 키 순서 변경(값 동일).

Sequence Diagram(s)

sequenceDiagram
participant U as UI (SearchResultPageClient)
participant FT as FilterTypeBox
participant FB as FilterBottomSheetModal
participant FM as FilterModalContent
participant FL as FilterList
participant P as priceAtom / URL

U->>FT: 사용자 클릭 (필터 우측 X) -> onResetGroup(groupKey)
FT->>U: onResetGroup(groupKey) 호출
U->>FM: FilterModalContent에 reset 요청 (searchText 포함)
FM->>FL: FL.resetGroup(groupKey)
FL-->>FM: 그룹 리셋 완료
FM->>P: priceAtom 초기화 및 updateSearchParams(page=1,...)
P-->>U: URL/상태 변경 -> UI 재렌더
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • Taew00k
  • seong-hui

Poem

🐇 깡충깡충 코드를 밟고 와서,
작은 스타일 씨앗 하나 심었네.
필터 X 누르면 깔끔히 정리되고,
모달 문 열리면 길이 환해지네.
당근빛 결과가 반짝반짝, 홓홓 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목 '[FIX] 3차 스프린트 QA 대응'은 연결된 이슈 #344의 제목과 동일하며, 다양한 QA 버그 수정을 포함한 변경사항의 주요 목적을 명확히 나타냅니다.
Description check ✅ Passed PR 설명은 관련 이슈(#344)를 명시하고, 작업 내용(필터 개선, QA 항목 해결)과 PR 포인트(searchText 상태 반영, 필터 그룹별 초기화 로직)를 포함하고 있어 템플릿의 필수 섹션을 충분히 채우고 있습니다.
Linked Issues check ✅ Passed 변경사항은 이슈 #344의 '3차 스프린트 QA 대응' 목표와 일치하며, 필터 로직 개선(searchText 추가, resetGroup 구현), UI 수정(배너 렌더링, 테스트 모달), 스타일 조정 등 여러 QA 항목을 해결하고 있습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항은 QA 항목 해결과 관련된 범위 내의 수정사항으로, 외부 라이브러리 업그레이드나 아키텍처 변경 같은 범위 밖의 작업은 포함되지 않았습니다.

✏️ 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 fix/#344/3sp-qa1

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.

@github-actions
Copy link

github-actions bot commented Feb 3, 2026

🪷 Storybook 확인 🪷
🔗 https://677fa9af1269762b7858c29f-cggkuiqowx.chromatic.com/

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: 5

Caution

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

⚠️ Outside diff range comments (3)
src/app/myPage/page.tsx (1)

12-18: ⚠️ Potential issue | 🟡 Minor

임포트 순서(import/order) 정리가 필요합니다.

ESLint 힌트에 따라 @utils/getTestType 임포트를 next/navigation 이전으로 이동하세요.

🧹 제안 수정안
 import ResultCard from '@components/test/resultCard/ResultCard';
 import UserInfo from '@components/userInfo/userInfo';
 import { TestType } from '@constants/test';
+import getTestType from '@utils/getTestType';
 import { useRouter } from 'next/navigation';
 import { useState } from 'react';
 import useEventLogger from 'src/gtm/hooks/useEventLogger';

 import * as styles from './myPage.css';
-import getTestType from '@utils/getTestType';
src/app/page.tsx (1)

1-13: ⚠️ Potential issue | 🟡 Minor

ESLint import/order 오류 정리 필요

lint 에러대로 next/link는 스타일 import보다 앞에, @assets/svgs@components/*보다 앞에 배치해야 합니다.

🧹 제안 수정 diff
-import HomeClient from '@app/HomeClient';
-import RecommendTempleClient from '@app/RecommendTempleClient';
-import MainBanner from '@components/banner/MainBanner';
-import DetailTitle from '@components/detailTitle/DetailTitle';
-import FilterTypeBoxClient from '@components/filter/filterTypeBox/FilterTypeBoxClient';
-import Footer from '@components/footer/Footer';
-import Header from '@components/header/Header';
-import TestBanner from '@components/test/testBanner/TestBanner';
-import { cookies } from 'next/headers';
-
-import * as styles from './homePage.css';
-import Link from 'next/link';
-import Icon from '@assets/svgs';
+import Link from 'next/link';
+import { cookies } from 'next/headers';
+
+import Icon from '@assets/svgs';
+import HomeClient from '@app/HomeClient';
+import RecommendTempleClient from '@app/RecommendTempleClient';
+import MainBanner from '@components/banner/MainBanner';
+import DetailTitle from '@components/detailTitle/DetailTitle';
+import FilterTypeBoxClient from '@components/filter/filterTypeBox/FilterTypeBoxClient';
+import Footer from '@components/footer/Footer';
+import Header from '@components/header/Header';
+import TestBanner from '@components/test/testBanner/TestBanner';
+
+import * as styles from './homePage.css';
src/app/searchResult/SearchResultPageClient.tsx (1)

3-29: ⚠️ Potential issue | 🟡 Minor

ESLint import/order 정리 필요

lint 에러대로 @assets/svgs@components/*보다 앞에, HeaderSearchHeader보다 앞에, jotainext/navigation보다 앞에, src/store/store는 스타일 import보다 앞에 배치해야 합니다.

🧹 제안 수정 diff
-import SearchCardList from '@components/card/templeStayCard/searchCardList/SearchCardList';
+import Icon from '@assets/svgs';
+import SearchCardList from '@components/card/templeStayCard/searchCardList/SearchCardList';
 ...
-import SearchHeader from '@components/search/searchHeader/SearchHeader';
-import Header from '@components/header/Header';
+import Header from '@components/header/Header';
+import SearchHeader from '@components/search/searchHeader/SearchHeader';
 ...
-import { useSearchParams } from 'next/navigation';
-import { useState } from 'react';
+import { useSetAtom } from 'jotai';
+import { useSearchParams } from 'next/navigation';
+import { useState } from 'react';
 ...
-import * as styles from './searchResultPage.css';
-import Icon from '@assets/svgs';
-import { filterListInstance, priceAtom } from 'src/store/store';
-import { useSetAtom } from 'jotai';
+import { filterListInstance, priceAtom } from 'src/store/store';
+
+import * as styles from './searchResultPage.css';
🤖 Fix all issues with AI agents
In `@src/app/page.tsx`:
- Around line 25-32: The Link component currently nests an interactive <input>
(styles.searchInput) which causes accessibility and focus conflicts; replace the
input with a non-interactive element (e.g., a <div> or <span> using
styles.searchInput for visuals) or change it to a button role, remove the
readOnly prop, and ensure the Link (styles.searchWrapper) has an explicit
aria-label describing the destination (e.g., aria-label="검색 페이지로 이동"); preserve
the Icon.IcnSearchMediumGray inside the Link and keep visual styling via
styles.searchInput so the control looks the same but is not an interactive form
element inside a link.

In `@src/components/curation/CurationHeader.tsx`:
- Around line 17-19: The header's logo button (in CurationHeader.tsx wrapping
Icon.SmallLogo and using router.push) lacks an accessible name and is missing an
explicit button type; update the <button> element to include type="button" and a
descriptive aria-label (e.g., aria-label="Go to homepage" or similar) so the
Icon.SmallLogo button is not treated as a submit and is accessible to assistive
tech.

In `@src/components/search/searchHeader/SearchHeader.tsx`:
- Around line 1-4: The imports in SearchHeader.tsx are not separated into groups
with a blank line, causing an ESLint import/order error; open the top of
SearchHeader.tsx and insert a single blank line between external-package imports
(e.g., Icon from '@assets/svgs') and your project-local imports (e.g., SearchBar
from '@components/search/searchBar/SearchBar', * as styles from
'./searchHeader.css', and useNavigateTo from '@hooks/useNavigateTo') so the
import groups are visually and lint-wise separated.

In `@src/components/test/testHeader/TestHeader.css.ts`:
- Line 40: 파일 끝에서 개행 문자(EOF newline)가 빠졌습니다;
src/components/test/testHeader/TestHeader.css.ts의 파일 끝에 있는 닫는 블록(예: "});") 다음에 새
줄을 추가하여 파일을 끝내고 ESLint/Prettier 규칙을 만족시키세요.

In `@src/components/userInfo/userInfo.tsx`:
- Around line 21-28: The handlers handleNoticeClick and handleQuestionClick
currently call window.open with only '_blank' which leaves the page vulnerable
to reverse tabnabbing; update both functions to call window.open with the third
parameter 'noopener,noreferrer' (e.g., window.open(url, '_blank',
'noopener,noreferrer')) and, to be extra safe, capture the returned window
object and set newWin.opener = null if non-null; keep logClickEvent calls as-is.
🧹 Nitpick comments (3)
src/components/filter/filterBox/FilterBox.tsx (2)

18-18: 하드코딩된 문자열 비교 대신 prop 사용을 고려해 보세요.

현재 title === '유형' 하드코딩 방식은 동작하지만, 다른 필터 그룹에도 helper text가 필요해지면 확장성이 떨어집니다. helperText를 optional prop으로 받아 처리하면 더 유연하게 대응할 수 있습니다.

♻️ 제안된 리팩토링
 interface FilterBoxProps {
   title: string;
   items: string[];
   id: string;
   filtersState: Record<string, number>;
   onToggleFilter: (filterName: string) => void;
+  helperText?: string;
 }

-const FilterBox = ({ title, items, id, filtersState, onToggleFilter }: FilterBoxProps) => {
+const FilterBox = ({ title, items, id, filtersState, onToggleFilter, helperText }: FilterBoxProps) => {
   return (
     <div className={styles.filterBoxContainer} id={id}>
       <h1 className={styles.titleStyle}>{title}</h1>
-      {title === '유형' && <p className={styles.helperText}>*휴식형과 체험형은 숙박입니다.</p>}
+      {helperText && <p className={styles.helperText}>{helperText}</p>}

23-34: keyindex 대신 item 사용을 권장합니다.

items 배열의 필터명이 고유하다면 item을 key로 사용하는 것이 더 안전합니다. 배열 순서가 변경되어도 React가 올바르게 요소를 추적할 수 있습니다.

♻️ 제안된 변경
-              <BasicBtn
-                key={index}
+              <BasicBtn
+                key={item}
src/components/test/testHeader/TestHeader.tsx (1)

49-49: 하드코딩된 타이틀 문자열 확인 필요.

타이틀 "나의 템플 캐릭터는?"이 컴포넌트 내에 하드코딩되어 있습니다. 현재 QA 대응 목적으로는 문제없지만, 추후 이 헤더를 다른 컨텍스트에서 재사용할 경우 유연성이 제한될 수 있습니다.

필요시 title prop으로 외부에서 주입받는 방식을 고려해 보세요.

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: 0

Caution

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

⚠️ Outside diff range comments (1)
src/app/test/page.tsx (1)

69-69: ⚠️ Potential issue | 🟡 Minor

prevPath가 빈 문자열일 경우 router.push('') 동작이 예상과 다를 수 있습니다.

localStorageprevPage 값이 없으면 prevPath는 빈 문자열이 됩니다. router.push('')는 일부 환경에서 현재 페이지를 새로고침하거나 예기치 않은 동작을 유발할 수 있습니다. 안전한 fallback 경로(예: 홈 /)를 지정하는 것을 권장합니다.

🛡️ 안전한 fallback 경로 적용 제안
- const prevPath = getStorageValue('prevPage') || '';
+ const prevPath = getStorageValue('prevPage') || '/';

Also applies to: 112-112

🧹 Nitpick comments (1)
src/app/test/page.tsx (1)

26-26: prevPath를 컴포넌트 본문에서 직접 호출하면 hydration mismatch가 발생할 수 있습니다.

getStorageValue는 서버에서 null을 반환하고 클라이언트에서는 실제 localStorage 값을 반환합니다. 이로 인해 Next.js의 hydration 경고가 발생할 수 있습니다.

♻️ useState 초기화 함수 사용 제안
- const prevPath = getStorageValue('prevPage') || '';
+ const [prevPath] = useState(() => getStorageValue('prevPage') || '/');

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: 1

🤖 Fix all issues with AI agents
In `@src/app/test/page.tsx`:
- Line 25: The variable prevPath assigned from getStorageValue('prevPage') can
be an empty string causing router.push('') to navigate unexpectedly; update the
code that calls router.push(prevPath) (occurrences near the uses in this file)
to first check if prevPath is a non-empty string and either use a safe default
path (e.g. '/') or skip calling router.push when empty; ensure this check is
applied wherever prevPath is used for navigation so router.push is never invoked
with ''.

Copy link
Collaborator

@bykbyk0401 bykbyk0401 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
Member

@seong-hui seong-hui 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: 0

Caution

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

⚠️ Outside diff range comments (1)
src/app/page.tsx (1)

1-13: ⚠️ Potential issue | 🟡 Minor

ESLint import/order 위반 정리 필요

정적 분석에서 next/link@assets/svgs의 순서가 규칙에 맞지 않는다고 나옵니다. 아래처럼 재정렬해 주세요.

🧹 제안 diff
 import HomeClient from '@app/HomeClient';
 import RecommendTempleClient from '@app/RecommendTempleClient';
+import Icon from '@assets/svgs';
 import MainBanner from '@components/banner/MainBanner';
 import DetailTitle from '@components/detailTitle/DetailTitle';
 import FilterTypeBoxClient from '@components/filter/filterTypeBox/FilterTypeBoxClient';
 import Footer from '@components/footer/Footer';
 import Header from '@components/header/Header';
 import TestBanner from '@components/test/testBanner/TestBanner';
 import { cookies } from 'next/headers';
 
-import * as styles from './homePage.css';
 import Link from 'next/link';
-import Icon from '@assets/svgs';
+import * as styles from './homePage.css';

@maylh maylh merged commit f1f3e72 into develop Feb 5, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FIX] 3차 스프린트 QA 대응

3 participants