Skip to content

Conversation

@wantkdd
Copy link
Member

@wantkdd wantkdd commented Dec 1, 2025

✨ 작업 개요

챗봇 하단 버튼 기능 연결

📌 관련 이슈

✅ 작업 내용

  • 챗봇 하단 버튼 기능 연결(기존 하드코딩)

Summary by CodeRabbit

새로운 기능

  • 인기 용어 빠른 실행 버튼이 선택된 카테고리의 실시간 인기 용어를 동적으로 가져옵니다.
  • 오늘의 용어 빠른 실행 버튼이 실제 오늘의 용어 데이터를 동적으로 조회합니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@wantkdd wantkdd self-assigned this Dec 1, 2025
@wantkdd wantkdd requested a review from a team as a code owner December 1, 2025 07:28
@wantkdd wantkdd added the 🧹 Refactor 코드 리팩토링 label Dec 1, 2025
@vercel
Copy link

vercel bot commented Dec 1, 2025

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

Project Deployment Preview Comments Updated (UTC)
gotit Ready Ready Preview Comment Dec 1, 2025 7:28am

@coderabbitai
Copy link

coderabbitai bot commented Dec 1, 2025

Walkthrough

챗봇 하단 버튼의 하드코딩된 기능을 연결하는 리팩터링입니다. "인기 용어"와 "오늘의 용어" 버튼에 새로운 핸들러를 추가하고, 관련 유틸리티 함수와 쿼리 생성 로직을 구현했습니다.

Changes

컴포넌트 / 파일(들) 변경 요약
ChatBot 컴포넌트 와이어링
src/app/chatbot/components/ChatBot.tsx
useChatBot 훅에서 handlePopularTerms와 handleTodaysTerm 핸들러 참조 추가. "인기 용어", "오늘의 용어" QuickActionButton의 onClick 핸들러를 새 핸들러로 변경
quick-actions 유틸리티
src/app/chatbot/utils/quick-actions.ts
getPopularTermsQuery(category)와 getTodaysTermQuery() 두 새로운 공개 함수 추가. 각각 용어를 조회하여 사용자 대면 프롬프트 문자열 생성
useChatBot 훅 인터페이스
src/hooks/useChatBot.ts
handlePopularTerms(): Promise<void>와 handleTodaysTerm(): Promise<void> 공개 메서드 추가. useUserData를 통해 selectedCategory 접근하여 쿼리 생성 후 handleSubmit으로 위임
추천 용어 유틸리티
src/lib/recommendations.ts
getPopularTerms(category, count = 3): Promise<string[]> 함수 추가. getRecommendedTerms 래퍼로 용어 배열 반환, 오류 발생 시 빈 배열 반환
서버사이드 용어 유틸리티
src/lib/terms.server.ts
getTodaysTermNameServer(): string | null 함수 추가. getTodaysTermServer를 기반으로 오늘의 용어 한글명 반환

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

  • 주목 포인트:
    • useChatBot 훅의 새로운 메서드 로직 검증 필요 (useUserData 의존성, 비동기 흐름)
    • getPopularTermsQuery와 getTodaysTermQuery의 폴백 로직 동작 확인
    • 에러 핸들링 및 로그 처리 일관성 검토

Possibly related PRs

Suggested labels

🚀 Feat

Poem

🐰 버튼이 깨어났네요,
용어를 주워 담고,
하드코딩 벗어나 자유로워졌어요!
쿼리 생성기 돌아가고,
챗봇 손가락 이제 춤을 춥니다. ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경사항의 주요 내용과 정확하게 일치합니다. 챗봇 하단 버튼 기능 연결이라는 명확한 요약을 제공합니다.
Linked Issues check ✅ Passed PR의 모든 코드 변경사항이 #100 이슈의 목표를 충족합니다. 하드코딩된 버튼들이 실제 핸들러(handlePopularTerms, handleTodaysTerm)와 연결되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 #100 이슈 범위 내에 있습니다. 챗봇 하단 버튼 기능 연결을 위한 필요한 핸들러, 유틸리티 함수, 서버 함수만 추가되었습니다.
✨ 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/chatbotBottom

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

@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

🧹 Nitpick comments (3)
src/lib/terms.server.ts (1)

50-56: 오늘의 용어 이름 래핑 유틸 구현이 단순하고 재사용에 좋습니다.

기존 getTodaysTermServer를 잘 래핑해서 termKo만 반환하도록 분리한 구조가 명확하고, 호출부 입장에서도 문자열만 필요할 때 쓰기 편해 보입니다. 이 함수가 null을 반환할 수 있으니, 사용처에서 널 케이스에 대한 처리(대체 문구 등)만 확실히 해 두면 될 것 같습니다. 만약 TermIndexItem.termKo가 항상 존재하는 필드라면, 추후에는 반환 타입을 string으로 좁히는 것도 고려해볼 수 있겠습니다.

src/lib/recommendations.ts (1)

92-106: getPopularTerms 래핑 로직은 적절하지만 에러 처리 중복은 정리 여지가 있습니다.

getRecommendedTerms 결과에서 term만 추려내는 헬퍼로 분리한 구조는 명확하고, 반환 타입도 단순해져서 사용하기 좋습니다. 다만 getRecommendedTerms 내부에서도 이미 try/catch로 "추천 용어 로드 실패"를 로그하고 []를 반환하고 있어서, 이 함수에서 다시 한 번 try/catch로 "인기 용어 로드 실패"를 찍는 것은 약간 중복에 가깝습니다. 향후 상위 레벨에서만 에러를 처리할지, 혹은 하위 유틸에서만 처리할지 한 번 정리해서 로그가 과하게 중복되지 않도록 하는 정도의 리팩터링을 고려해 볼 수 있겠습니다.

src/app/chatbot/utils/quick-actions.ts (1)

1-31: 퀵 액션용 프롬프트 유틸 구조는 명확하며, 특히 오늘의 용어 쿼리도 에러 시 폴백을 두면 더 견고해집니다.

getPopularTermsQuery가 인기 용어 최대 3개를 받아 "…, …, … 이 세 가지 용어를 각각 설명해줘." 형식으로 프롬프트를 만드는 구조는 직관적이고, 용어가 없을 때 기본 문구로 폴백하는 처리도 잘 되어 있습니다. 반면 getTodaysTermQuery는 인덱스가 비어 있는 경우에는 "TypeScript"로 폴백하지만, getTodaysTerm() 호출 자체가 실패(네트워크/파일/파싱 에러 등)할 경우를 따로 처리하지 않아 onClick 시 예외로 끝날 여지가 있습니다. 아래처럼 try/catch로 감싸서 인기 용어 쿼리와 동일하게 에러 시에도 "TypeScript"로 폴백하도록 하면, 오늘의 용어 버튼도 보다 안정적으로 동작할 것 같습니다.

export async function getTodaysTermQuery(): Promise<string> {
-  const todayTerm = await getTodaysTerm();
-  if (!todayTerm) {
-    return "TypeScript";
-  }
-  return todayTerm.termKo;
+  try {
+    const todayTerm = await getTodaysTerm();
+    if (!todayTerm) {
+      return "TypeScript";
+    }
+    return todayTerm.termKo;
+  } catch (error) {
+    console.error("오늘의 용어 로드 실패:", error);
+    return "TypeScript";
+  }
}

또한, 3이라는 개수나 한국어 설명 템플릿 문자열은 상수로 분리해 두면 다른 곳에서 재사용하거나 문구를 수정할 때 한 군데만 고치면 되어 관리가 조금 더 수월해집니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a01cf5c and b6cf87a.

📒 Files selected for processing (5)
  • src/app/chatbot/components/ChatBot.tsx (2 hunks)
  • src/app/chatbot/utils/quick-actions.ts (1 hunks)
  • src/hooks/useChatBot.ts (5 hunks)
  • src/lib/recommendations.ts (1 hunks)
  • src/lib/terms.server.ts (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
src/app/chatbot/utils/quick-actions.ts (3)
src/config/categories.ts (1)
  • CategoryType (20-30)
src/lib/recommendations.ts (1)
  • getPopularTerms (95-106)
src/lib/terms.ts (1)
  • getTodaysTerm (137-145)
src/lib/recommendations.ts (1)
src/config/categories.ts (1)
  • CategoryType (20-30)
src/app/chatbot/components/ChatBot.tsx (2)
src/app/chatbot/components/QuickActionButton.tsx (1)
  • QuickActionButton (9-23)
src/components/icons/ic_star.tsx (1)
  • StarIcon (3-32)
src/hooks/useChatBot.ts (3)
src/contexts/auth/index.tsx (1)
  • useUserData (24-24)
src/contexts/auth/UserDataContext.tsx (1)
  • useUserData (151-157)
src/app/chatbot/utils/quick-actions.ts (2)
  • getPopularTermsQuery (12-20)
  • getTodaysTermQuery (25-31)
🔇 Additional comments (2)
src/app/chatbot/components/ChatBot.tsx (1)

11-21: 하단 퀵 액션이 useChatBot의 새 핸들러와 자연스럽게 연결되었습니다.

"인기 용어" / "오늘의 용어" 버튼이 각각 handlePopularTerms, handleTodaysTerm로 위임되면서, 프롬프트 하드코딩이 컴포넌트 밖(훅 + 유틸)으로 잘 빠져나간 구조라 유지보수성이 좋아졌습니다. 한 가지 확인만 하면 좋을 점은, QuickActionButtonPropsonClick 타입이 현재 전달하는 비동기 핸들러(() => Promise<void>)와 호환되도록(예: () => void 또는 () => void | Promise<void>) 선언되어 있는지입니다.

Also applies to: 53-66

src/hooks/useChatBot.ts (1)

5-10: 새 퀵 액션 핸들러와 useUserData 연동 방식이 자연스럽지만, useChatBot 사용 위치가 모두 Provider 하위인지 확인이 필요합니다.

userData?.selectedCategory ?? "all"로 카테고리를 결정하고 이를 getPopularTermsQuery에 넘긴 뒤 handleSubmit로 위임하는 흐름, 그리고 오늘의 용어 쿼리를 동일한 패턴으로 처리하는 구조 모두 일관되고 이해하기 쉽습니다. 다만 이 훅이 이제 useUserData 컨텍스트에 의존하게 되었기 때문에, useChatBot을 사용하는 모든 컴포넌트가 반드시 UserDataProvider 하위에서 렌더링되고 있는지 한 번 점검해 두는 것이 좋겠습니다(그렇지 않으면 런타임에서 "useUserData must be used within a UserDataProvider" 에러가 발생할 수 있습니다). 현재 구조가 이 전제를 만족한다면, 반환 타입에 새 핸들러를 추가한 것까지 포함해 전반적인 변경 방향은 잘 맞는 것 같습니다.

Also applies to: 17-27, 36-36, 79-99

@wantkdd wantkdd merged commit ba8046c into develop Dec 1, 2025
4 checks passed
@wantkdd wantkdd deleted the fix/chatbotBottom branch December 1, 2025 11:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🧹 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 챗봇 하단 버튼 기능 연결

2 participants