Skip to content

feat: GA4 이벤트 트래킹 통합#70

Merged
youngminss merged 16 commits intodevelopfrom
feature/ga-init
Feb 10, 2026
Merged

feat: GA4 이벤트 트래킹 통합#70
youngminss merged 16 commits intodevelopfrom
feature/ga-init

Conversation

@youngminss
Copy link
Member

@youngminss youngminss commented Feb 9, 2026

🎯 PR 제목

GA4 이벤트 트래킹을 전체 사용자 여정에 통합

📑 작업 상세 내역

  • GA4 Analytics 컴포넌트 및 이벤트 로깅 유틸리티 추가
  • 랜딩 페이지 GA 이벤트 추가 (view_page, cta_click)
  • 모임 생성 퍼널 GA 이벤트 추가 (step_complete)
  • 모임 생성 완료 페이지 GA 이벤트 추가 (view_page, cta_click, click_share)
  • 의견 수합 랜딩 페이지 GA 이벤트 추가 (view_page, cta_click)
  • 의견 수합 퍼널 GA 이벤트 추가 (step_complete)
  • 의견 수합 대기 페이지 GA 이벤트 추가 (view_page, click_share)
  • 의견 수합 완료 페이지 GA 이벤트 추가 (view_page, cta_click)
  • 추천 결과 페이지 GA 이벤트 추가 (view_page, click_restaurant, click_share)

🙏 리뷰 요청 사항

  • GA DebugView에서 이벤트 정상 수신 여부 확인 필요

🖼️ 작업 결과물

  • GA DebugView에서 이벤트 확인 가능
    • GA 계정은 yogieat gmail 계정 사용

youngminss and others added 15 commits February 9, 2026 23:22
- GoogleAnalytics 컴포넌트 추가 (GTM과 병행 사용)
- trackEvent, trackButtonClick 유틸리티 함수 추가
- development 환경에서는 debugMode 활성화 (DebugView 확인용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- '모임 링크 생성 시작' 버튼 클릭 시 button_click 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- trackPageView, trackCtaClick 유틸리티 함수 추가
- GA dataLayer 준비 대기 로직 추가 (타이밍 이슈 해결)
- 랜딩 페이지: view_landing_page, cta_click 이벤트 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- trackStepComplete 유틸리티 함수 추가
- 인원수/날짜/장소 단계별 완료 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- view_gathering_create_complete_page: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- view_landing: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- page_id를 "모임생성_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 거리/비선호음식/선호음식 단계별 완료 이벤트 로깅
- page_id를 "의견수합_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- trackShareClick 유틸리티 함수 추가
- view_waiting: 페이지 진입 시 (submit_progress 포함)
- click_share: 링크 공유 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- view_page 이벤트 (페이지 진입, 의견 일치율 포함)
- click_restaurant 이벤트 (맛집 클릭, 순위 포함)
- click_share 이벤트 (공유 버튼 클릭)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- rank를 rank_type(top/other)으로 변경
- onBeforeShare를 onShare로 네이밍 개선
- agreement_rate 파라미터 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions github-actions bot requested a review from RookieAND February 9, 2026 17:51
@github-actions github-actions bot added ✨ Feature 기능 개발 ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 labels Feb 9, 2026
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @youngminss, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 애플리케이션 전반에 걸쳐 Google Analytics 4(GA4) 이벤트 트래킹을 통합하여 사용자 행동 데이터를 보다 정확하게 수집하고 분석할 수 있도록 합니다. 주요 사용자 여정 단계마다 페이지 뷰, CTA 클릭, 퍼널 단계 완료, 공유 및 식당 클릭 이벤트를 로깅하도록 구현되었습니다. 또한, 폼 유효성 검사 로직을 개선하고 특정 에러 상황에 대한 사용자 피드백을 강화하는 등 전반적인 안정성과 사용자 경험을 향상시키는 변경 사항도 포함되어 있습니다.

Highlights

  • GA4 이벤트 트래킹 통합: 랜딩 페이지, 모임 생성 퍼널, 모임 생성 완료 페이지, 의견 수합 랜딩 페이지, 의견 수합 퍼널, 의견 수합 대기 페이지, 의견 수합 완료 페이지, 추천 결과 페이지 등 주요 사용자 여정에 GA4 이벤트 트래킹이 통합되었습니다. 이를 위해 GA4 Analytics 컴포넌트와 이벤트 로깅 유틸리티가 추가되었습니다.
  • 폼 유효성 검사 개선: 모임 생성 폼(useCreateMeetingForm)의 유효성 검사 로직이 zodResolver를 사용하여 Zod 스키마 기반으로 리팩토링되었습니다. 이로써 폼 데이터의 타입 안정성과 유효성 검사 규칙이 강화되었습니다.
  • 에러 처리 및 사용자 경험 개선: 의견 수합 폼(useOpinionForm)에서 모임이 가득 찼을 때(GATHERING_FULL 에러) 사용자에게 추천 결과 페이지로 바로 이동할 수 있는 토스트 메시지 액션 버튼이 추가되어 사용자 경험이 향상되었습니다.
  • UI/UX 및 이미지 처리 개선: 모임 생성 완료 페이지의 뒤로가기 버튼이 홈 아이콘으로 변경되었으며, 추천 결과 페이지의 식당 카드 이미지 플레이스홀더 및 에러 처리 로직이 개선되었습니다.
  • 새로운 유틸리티 및 아이콘 추가: GA4 이벤트 로깅을 위한 events.ts 유틸리티 파일과 홈 아이콘(HomeIcon) 컴포넌트 및 관련 에러 코드 정의(errorCodes.ts)가 추가되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • app/gathering/[accessKey]/opinion/complete/CompleteViewContainer.tsx
    • useEffect, trackCtaClick, trackPageView 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • "추천 결과 보기" 버튼에 trackCtaClick 이벤트 추가
    • 페이지 로드 시 view_page 이벤트와 submit_progress를 트래킹하는 useEffect 추가
  • app/gathering/[accessKey]/opinion/pending/PendingViewContainer.tsx
    • useEffect, trackPageView, trackShareClick 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • 공유 버튼에 trackShareClick 이벤트 추가
    • 공유 URL을 /landing으로 변경
    • 페이지 로드 시 view_page 이벤트와 submit_progress를 트래킹하는 useEffect 추가
    • Toaster 컴포넌트 추가
  • app/gathering/[accessKey]/opinion/result/ResultViewContainer.tsx
    • useEffect, trackPageView, trackShareClick 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • 공유 버튼 클릭 시 click_share 이벤트를 트래킹하는 handleShare 함수 추가
    • 페이지 로드 시 view_page 이벤트와 group_id를 트래킹하는 useEffect 추가
    • ShareButtononShare prop 전달
    • Toaster 컴포넌트 추가
  • app/gathering/create/complete/[accessKey]/page.tsx
    • useEffect, twJoin, trackCtaClick, trackPageView, HomeIcon 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • 기존 BackwardButtonHomeIcon을 사용하는 커스텀 버튼으로 대체
    • "내 취향 입력" 버튼에 trackCtaClick 이벤트 추가
    • 페이지 로드 시 view_page 이벤트와 group_id를 트래킹하는 useEffect 추가
    • 페이지 헤딩 텍스트 변경
    • "링크 공유" 버튼 제거 및 "내 취향 입력" 버튼의 variant 변경
  • app/gathering/create/page.tsx
    • useCreateGathering 및 관련 로직을 useCreateMeetingForm 훅으로 이동
    • FormProvideruseCreateMeetingForm에서 반환하는 methods를 사용하도록 변경
    • 폼 제출 로직이 useCreateMeetingForm에서 반환하는 onSubmit을 사용하도록 변경
  • src/components/analytics/Analytics.tsx
    • GoogleAnalytics 컴포넌트 임포트 추가
    • GA_ID 환경 변수 추가 및 GoogleAnalytics 컴포넌트 조건부 렌더링
    • 개발 환경에서 GTM/GA ID 누락 시 경고 메시지 개선
  • src/components/analytics/events.ts
    • GA4 커스텀 이벤트 로깅을 위한 waitForGAAndSend, trackEvent, trackPageView, trackCtaClick, trackStepComplete, trackShareClick, trackRestaurantClick 유틸리티 함수 추가
  • src/components/analytics/index.ts
    • 새로 추가된 GA4 트래킹 함수들을 events.ts에서 익스포트
  • src/components/shareButton/ShareButton.tsx
    • ShareButtonPropsonShare prop 추가 및 공유 시 해당 콜백 호출
  • src/hooks/gathering/useCreateMeetingForm.ts
    • zodResolver를 사용하여 createMeetingFormSchema 기반의 폼 유효성 검사 로직 통합
    • 모임 생성 API 호출 로직을 훅 내부로 이동
    • methods, onSubmit, isPending을 반환하도록 변경
  • src/hooks/gathering/useOpinionForm.ts
    • ERROR_CODES, createElement, ArrowLeftIcon 임포트 추가
    • GATHERING_FULL 에러 발생 시 추천 결과 페이지로 이동하는 액션 버튼이 포함된 토스트 메시지 표시 로직 추가
  • src/icons/homeIcon/HomeIcon.tsx
    • 새로운 홈 아이콘 SVG 컴포넌트 추가
  • src/icons/homeIcon/index.ts
    • HomeIcon 익스포트 추가
  • src/pageComponents/gathering/create/DateStep.tsx
    • trackStepComplete 임포트 추가
    • 날짜 및 시간 슬롯 유효성 검사 로직을 Zod 스키마 기반으로 변경 및 관련 상수 제거
    • timeSlotField.onChange에서 undefined 대신 null 사용
    • "다음" 버튼 클릭 시 "시간대" 단계 완료 이벤트를 트래킹하는 handleNext 함수 추가
  • src/pageComponents/gathering/create/PeopleCountGrid.tsx
    • valueonChange prop의 타입을 number | undefined에서 number | null로 변경
  • src/pageComponents/gathering/create/PeopleStep.tsx
    • trackStepComplete 임포트 추가
    • 인원수 유효성 검사 로직을 Zod 스키마 기반으로 변경 및 관련 상수 제거
    • "다음" 버튼 클릭 시 "인원수" 단계 완료 이벤트를 트래킹하는 handleNext 함수 추가
  • src/pageComponents/gathering/create/RegionChip.tsx
    • 지역 선택 해제 시 field.onChange에서 undefined 대신 null 사용
  • src/pageComponents/gathering/create/RegionStep.tsx
    • trackStepComplete 임포트 추가
    • 지역 선택 유효성 검사 로직을 Zod 스키마 기반으로 변경
    • "완료" 버튼 클릭 시 "장소" 단계 완료 이벤트를 트래킹하고 폼을 제출하는 handleClick 함수 추가
  • src/pageComponents/gathering/opinion/DislikeStep.tsx
    • trackStepComplete 임포트 추가
    • "다음" 버튼 클릭 시 "비선호음식" 단계 완료 이벤트를 트래킹하는 handleNext 함수 추가
  • src/pageComponents/gathering/opinion/DistanceStep.tsx
    • trackStepComplete 임포트 추가
    • "다음" 버튼 클릭 시 "거리" 단계 완료 이벤트를 트래킹하는 handleNext 함수 추가
  • src/pageComponents/gathering/opinion/LandingView.tsx
    • useEffect, trackCtaClick, trackPageView 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • "내 취향 입력" 버튼에 trackCtaClick 이벤트 추가
    • 페이지 로드 시 view_page 이벤트와 group_id를 트래킹하는 useEffect 추가
  • src/pageComponents/gathering/opinion/OpinionFormView.tsx
    • 모임 완료 시 리다이렉트 로직 제거 (API 에러 처리로 대체)
    • useGetGatheringCapacity 훅 사용 제거
  • src/pageComponents/gathering/opinion/PreferenceStep.tsx
    • trackStepComplete, FOOD_CATEGORIES 임포트 추가
    • "완료" 버튼 클릭 시 "선호음식" 단계 완료 이벤트를 트래킹하는 handleClick 함수 추가
  • src/pageComponents/gathering/opinion/ResultView.tsx
    • 사용되지 않는 ChipCrownIcon 임포트 제거
  • src/pageComponents/gathering/restaurantCard/OtherCandidateCard.tsx
    • trackRestaurantClick 임포트 추가
    • 지도 클릭 시 trackRestaurantClick 이벤트 추가
    • 이미지 플레이스홀더 로직 개선
  • src/pageComponents/gathering/restaurantCard/TopRecommendCard.tsx
    • trackRestaurantClick 임포트 추가
    • 지도 클릭 시 trackRestaurantClick 이벤트 추가
    • 이미지 플레이스홀더 로직 및 에러 처리 개선
  • src/pageComponents/landing/LandingPage.tsx
    • useEffect, trackCtaClick, trackPageView 임포트 추가
    • GA4 트래킹을 위한 PAGE_ID 상수 정의
    • "모임 링크 생성 시작" 버튼에 trackCtaClick 이벤트 추가
    • 페이지 로드 시 view_page 이벤트를 트래킹하는 useEffect 추가
  • src/schemas/gathering/createMeetingForm.schema.ts
    • 모임 생성 폼을 위한 Zod 스키마(createMeetingFormSchema) 및 타입(CreateMeetingFormSchema) 정의
    • peopleCount, scheduledDate, timeSlot, region 필드에 대한 유효성 검사 규칙 포함
    • scheduledDate에 대한 커스텀 날짜 유효성 검사 로직 추가
  • src/schemas/gathering/index.ts
    • createMeetingFormSchemaCreateMeetingFormSchema 익스포트 추가
  • src/types/gathering/createMeetingForm.ts
    • 기존 CreateMeetingForm 인터페이스 제거 (Zod 스키마로 대체)
  • src/types/gathering/index.ts
    • CreateMeetingForm 타입 익스포트 제거 및 CreateMeetingStep만 익스포트하도록 변경
  • src/utils/api/errorCodes.ts
    • 서버 API 에러 코드를 정의하는 ErrorCode 타입 및 ERROR_CODES 상수 객체 추가
  • src/utils/api/errors.ts
    • ApiError 클래스의 errorCode 속성 타입을 string에서 ErrorCode로 변경
  • src/utils/api/index.ts
    • ErrorCode 타입 및 ERROR_CODES 상수 익스포트 추가
  • src/utils/api/types.ts
    • ErrorCode 임포트 추가 및 ErrorData 인터페이스의 errorCode 속성 타입을 ErrorCode로 변경
  • src/utils/gathering/create/dateStep.ts
    • DATE_ERROR_MESSAGES 상수를 이 파일로 이동
  • src/utils/gathering/create/index.ts
    • DATE_ERROR_MESSAGES 익스포트 추가
  • src/utils/toast.ts
    • ToastOptions 타입을 sonner 라이브러리의 ExternalToast를 기반으로 확장하고, 모든 옵션을 sonnerToast 함수에 전달하도록 변경
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions github-actions bot added ✨ Feature 기능 개발 and removed ✨ Feature 기능 개발 ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 labels Feb 9, 2026
@youngminss youngminss changed the base branch from main to develop February 9, 2026 17:53
@github-actions github-actions bot added ✨ Feature 기능 개발 and removed ✨ Feature 기능 개발 labels Feb 9, 2026
@youngminss youngminss added the 📤 In Progress 현재 작업 중인 PR 입니다. label Feb 9, 2026
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request primarily focuses on integrating Google Analytics (GA4) event tracking across various user flows and refactoring form handling for meeting creation. Analytics tracking for page views, CTA clicks, share clicks, step completion, and restaurant clicks has been added to the 'Complete', 'Pending', 'Result', 'Create Complete', 'Opinion Landing', and main 'Landing' pages, as well as to restaurant cards. A new Analytics component now supports both GTM and GA, and a dedicated events.ts file provides utility functions for tracking. Form handling for meeting creation has been refactored to use a new useCreateMeetingForm hook with Zod schemas for validation, replacing the previous manual validation and CreateMeetingForm interface. Additionally, the 'Opinion Form' now includes specific error handling for when a gathering is full, displaying a toast with a 'View Results' button. Minor UI adjustments include replacing a backward button with a home icon on the 'Create Complete' page and updating image placeholder logic for restaurant cards. Review comments highlighted the need to avoid optional chaining in useEffect dependency arrays, preferring to pass the full object and perform null checks inside the effect, and to adhere to the style guide by using arrow functions for components and design tokens for styling.

I am having trouble creating individual review comments. Click here to see my feedback.

app/gathering/[accessKey]/opinion/complete/CompleteViewContainer.tsx (33-42)

medium

useEffect의 의존성 배열에 옵셔널 체이닝(?.)을 사용하는 것은 안티패턴이며, 예상치 못한 동작을 유발할 수 있습니다. capacity 객체 자체를 의존성에 추가하고, effect 내부에서 capacity의 존재 여부를 확인하는 것이 더 안전하고 명확합니다.

	useEffect(() => {
		if (!isPending && capacity) {
			trackPageView("view_page", {
				page_id: PAGE_ID,
				submit_progress: Math.round(
					(capacity.currentCount / capacity.maxCount) * 100,
				),
			});
		}
	}, [isPending, capacity]);

app/gathering/[accessKey]/opinion/pending/PendingViewContainer.tsx (19)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export const와 화살표 함수를 사용해 주세요.

export const PendingViewContainer = () => {
References
  1. All components must be written as Arrow Functions. (link)

app/gathering/[accessKey]/opinion/pending/PendingViewContainer.tsx (40-51)

medium

useEffect에서도 의존성 배열에 옵셔널 체이닝이 사용되었습니다. capacity를 직접 의존성으로 추가하고 effect 내부에서 null 체크를 하는 것이 좋습니다.

	useEffect(() => {
		if (!isComplete && capacity) {
			const progress = Math.round(
				(capacity.currentCount / capacity.maxCount) * 100,
			);

			trackPageView("view_page", {
				page_id: PAGE_ID,
				submit_progress: progress,
			});
		}
	}, [isComplete, capacity]);

app/gathering/[accessKey]/opinion/result/ResultViewContainer.tsx (17)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export const와 화살표 함수를 사용해 주세요.

export const ResultViewContainer = () => {
References
  1. All components must be written as Arrow Functions. (link)

app/gathering/create/complete/[accessKey]/page.tsx (17)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export default와 함께 화살표 함수를 사용해 주세요.

const GatheringCreateCompletePage = () => {
References
  1. All components must be written as Arrow Functions. (link)

app/gathering/create/page.tsx (23)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export default와 함께 화살표 함수를 사용해 주세요.

const GatheringCreatePage = () => {
References
  1. All components must be written as Arrow Functions. (link)

src/components/analytics/events.ts (46-51)

medium

trackPageView 함수는 호출되는 모든 곳에서 첫 번째 인자로 "view_page"를 하드코딩하여 사용하고 있습니다. 이 경우, 함수 내부에서 이벤트 이름을 고정하여 API를 더 명확하고 사용하기 쉽게 만들 수 있습니다.

export const trackPageView = (
	params: { page_id: string } & Record<string, string | number | boolean>,
) => {
	trackEvent("view_page", params);
};

src/hooks/gathering/useOpinionForm.ts (61)

medium

스타일 가이드에 정의된 디자인 토큰을 사용하는 것이 좋습니다. 현재 사용된 ygi:text-palette-primary-500ygi:body-14-sb 클래스는 스타일 가이드의 색상(330-335행) 및 타이포그래피(338-341행) 토큰 목록에 포함되어 있지 않은 것으로 보입니다. 정의된 토큰을 사용하거나, 필요하다면 디자인 시스템에 새 토큰을 추가하는 것을 고려해 보세요.

References
  1. Always use design tokens for spacing, color, and typography. Avoid hard-coded values. (link)

src/pageComponents/gathering/opinion/LandingView.tsx (17)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export const와 화살표 함수를 사용해 주세요.

export const LandingView = () => {
References
  1. All components must be written as Arrow Functions. (link)

src/pageComponents/gathering/opinion/LandingView.tsx (35-42)

medium

useEffect 의존성 배열에 옵셔널 체이닝(?.)을 사용하는 것보다, gathering 객체 자체를 의존성으로 전달하고 effect 내부에서 gathering의 존재 여부를 확인하는 것이 더 안전합니다.

	useEffect(() => {
		if (!isComplete && gathering) {
			trackPageView("view_page", {
				page_id: PAGE_ID,
				group_id: gathering.accessKey,
			});
		}
	}, [isComplete, gathering]);

src/pageComponents/gathering/opinion/OpinionFormView.tsx (21)

medium

스타일 가이드에 따라 컴포넌트는 화살표 함수로 작성해야 합니다. function 선언 대신 export const와 화살표 함수를 사용해 주세요.

export const OpinionFormView = () => {
References
  1. All components must be written as Arrow Functions. (link)

@youngminss
Copy link
Member Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

GA4 이벤트 트래킹 로직이 추가되었습니다. 일부 컴포넌트에서 useEffect 훅의 의존성 배열이 최적화되지 않은 부분이 있어 개선을 제안합니다.

Comment on lines +33 to +42
useEffect(() => {
if (!isPending && capacity?.currentCount && capacity?.maxCount) {
trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
),
});
}
}, [isPending, capacity?.currentCount, capacity?.maxCount]);
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

useEffect 의존성 배열이 isPendingcapacity의 개별 속성을 포함하고 있습니다. isPendingcapacity에서 파생된 값이므로, 의존성을 [capacity, isPending]으로 명시하는 것이 더 명확하고 React 훅의 모범 사례에 부합합니다. 이렇게 하면 capacity 객체의 참조가 변경될 때마다 이펙트가 일관성 있게 실행됩니다. 또한, capacityundefined일 수 있는 경우를 대비해 내부 로직에 안전장치를 추가하는 것이 좋습니다.

Suggested change
useEffect(() => {
if (!isPending && capacity?.currentCount && capacity?.maxCount) {
trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
),
});
}
}, [isPending, capacity?.currentCount, capacity?.maxCount]);
useEffect(() => {
if (!isPending && capacity) {
trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
),
});
}
}, [capacity, isPending]);

Copy link
Member Author

Choose a reason for hiding this comment

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

반영했습니다. b972b7d

Comment on lines +40 to +51
useEffect(() => {
if (!isComplete && capacity?.currentCount && capacity?.maxCount) {
const progress = Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
);

trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: progress,
});
}
}, [isComplete, capacity?.currentCount, capacity?.maxCount]);
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

useEffect 의존성 배열이 isCompletecapacity의 개별 속성을 포함하고 있습니다. isCompletecapacity에서 파생된 값이므로, 의존성을 [capacity, isComplete]으로 명시하는 것이 더 명확하고 React 훅의 모범 사례에 부합합니다. 이렇게 하면 capacity 객체의 참조가 변경될 때마다 이펙트가 일관성 있게 실행됩니다. 또한, capacityundefined일 수 있는 경우를 대비해 내부 로직에 안전장치를 추가하는 것이 좋습니다.

Suggested change
useEffect(() => {
if (!isComplete && capacity?.currentCount && capacity?.maxCount) {
const progress = Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
);
trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: progress,
});
}
}, [isComplete, capacity?.currentCount, capacity?.maxCount]);
useEffect(() => {
if (!isComplete && capacity) {
const progress = Math.round(
(capacity.currentCount / capacity.maxCount) * 100,
);
trackPageView("view_page", {
page_id: PAGE_ID,
submit_progress: progress,
});
}
}, [capacity, isComplete]);

Copy link
Member Author

Choose a reason for hiding this comment

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

반영했습니다. b972b7d

Comment on lines +36 to +43
useEffect(() => {
if (isComplete && recommendationResult && accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: accessKey,
});
}
}, [isComplete, recommendationResult, accessKey]);
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

useEffect 훅은 isComplete에 의존하지만, isComplete이 파생된 capacity 객체는 의존성 배열에서 누락되었습니다. exhaustive-deps 규칙에 따라 파생 상태의 원천이 되는 값을 의존성 배열에 포함해야 합니다. capacity를 추가하여 훅이 항상 최신 상태를 기반으로 실행되도록 보장해주세요.

Suggested change
useEffect(() => {
if (isComplete && recommendationResult && accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: accessKey,
});
}
}, [isComplete, recommendationResult, accessKey]);
useEffect(() => {
if (isComplete && recommendationResult && accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: accessKey,
});
}
}, [capacity, isComplete, recommendationResult, accessKey]);

Copy link
Member Author

Choose a reason for hiding this comment

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

useEffect 내부에서 capacity를 직접 사용하지 않으므로 의존성 배열에서 제외했습니다. isComplete은 capacity에서 파생되어 매 렌더마다 재계산되므로, capacity 변경 시 isComplete도 변경되어 effect가 정상 실행됩니다.

Comment on lines +35 to +42
useEffect(() => {
if (!isComplete && gathering?.accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: gathering.accessKey,
});
}
}, [isComplete, gathering?.accessKey]);
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

useEffect 훅의 의존성 배열이 불완전합니다. isCompletecapacity에서 파생되었고, gathering?.accessKeygathering 객체에서 비롯된 값이므로 capacitygathering을 의존성 배열에 추가해야 합니다. 또한, 객체의 속성 대신 객체 자체를 의존성으로 사용하는 것이 좋습니다.

Suggested change
useEffect(() => {
if (!isComplete && gathering?.accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: gathering.accessKey,
});
}
}, [isComplete, gathering?.accessKey]);
useEffect(() => {
if (!isComplete && gathering?.accessKey) {
trackPageView("view_page", {
page_id: PAGE_ID,
group_id: gathering.accessKey,
});
}
}, [capacity, isComplete, gathering]);

Copy link
Member Author

Choose a reason for hiding this comment

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

반영했습니다. (capacity는 useEffect 내부에서 직접 사용하지 않아 제외) b972b7d

- useEffect 의존성 배열 개선 (optional chaining 제거)
- trackPageView를 trackViewPage로 리네이밍 및 이벤트명 내부 고정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@youngminss youngminss merged commit 0c1b9fa into develop Feb 10, 2026
14 checks passed
@youngminss youngminss self-assigned this Feb 10, 2026
youngminss added a commit that referenced this pull request Feb 10, 2026
youngminss added a commit that referenced this pull request Feb 10, 2026
youngminss added a commit that referenced this pull request Feb 10, 2026
* feat: GA4 Analytics 컴포넌트 및 이벤트 로깅 유틸리티 추가

- GoogleAnalytics 컴포넌트 추가 (GTM과 병행 사용)
- trackEvent, trackButtonClick 유틸리티 함수 추가
- development 환경에서는 debugMode 활성화 (DebugView 확인용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 랜딩 페이지 버튼 클릭 GA 이벤트 추가

- '모임 링크 생성 시작' 버튼 클릭 시 button_click 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: GA 이벤트 로깅 유틸리티 개선 및 랜딩 페이지 이벤트 적용

- trackPageView, trackCtaClick 유틸리티 함수 추가
- GA dataLayer 준비 대기 로직 추가 (타이밍 이슈 해결)
- 랜딩 페이지: view_landing_page, cta_click 이벤트 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 퍼널 step_complete 이벤트 추가

- trackStepComplete 유틸리티 함수 추가
- 인원수/날짜/장소 단계별 완료 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 완료 페이지 GA 이벤트 추가

- view_gathering_create_complete_page: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견 수합 랜딩 페이지 GA 이벤트 추가

- view_landing: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 랜딩 페이지 GA 이벤트 page_id 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 모임생성 퍼널 GA 이벤트 page_id 통일

- page_id를 "모임생성_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 퍼널 step_complete 이벤트 추가

- 거리/비선호음식/선호음식 단계별 완료 이벤트 로깅
- page_id를 "의견수합_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 대기 페이지 GA 이벤트 추가

- trackShareClick 유틸리티 함수 추가
- view_waiting: 페이지 진입 시 (submit_progress 포함)
- click_share: 링크 공유 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: GA 이벤트명 view_page로 통일 및 코드 포맷팅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 완료 페이지 GA 이벤트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 추천 결과 페이지 GA 이벤트 추가

- view_page 이벤트 (페이지 진입, 의견 일치율 포함)
- click_restaurant 이벤트 (맛집 클릭, 순위 포함)
- click_share 이벤트 (공유 버튼 클릭)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 추천 결과 페이지 GA 이벤트 파라미터 개선

- rank를 rank_type(top/other)으로 변경
- onBeforeShare를 onShare로 네이밍 개선
- agreement_rate 파라미터 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: 의견수합 대기 페이지 공유 URL 경로 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 코드 리뷰 피드백 반영

- useEffect 의존성 배열 개선 (optional chaining 제거)
- trackPageView를 trackViewPage로 리네이밍 및 이벤트명 내부 고정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
RookieAND pushed a commit that referenced this pull request Feb 16, 2026
* feat: GA4 Analytics 컴포넌트 및 이벤트 로깅 유틸리티 추가

- GoogleAnalytics 컴포넌트 추가 (GTM과 병행 사용)
- trackEvent, trackButtonClick 유틸리티 함수 추가
- development 환경에서는 debugMode 활성화 (DebugView 확인용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 랜딩 페이지 버튼 클릭 GA 이벤트 추가

- '모임 링크 생성 시작' 버튼 클릭 시 button_click 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: GA 이벤트 로깅 유틸리티 개선 및 랜딩 페이지 이벤트 적용

- trackPageView, trackCtaClick 유틸리티 함수 추가
- GA dataLayer 준비 대기 로직 추가 (타이밍 이슈 해결)
- 랜딩 페이지: view_landing_page, cta_click 이벤트 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 퍼널 step_complete 이벤트 추가

- trackStepComplete 유틸리티 함수 추가
- 인원수/날짜/장소 단계별 완료 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 완료 페이지 GA 이벤트 추가

- view_gathering_create_complete_page: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견 수합 랜딩 페이지 GA 이벤트 추가

- view_landing: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 랜딩 페이지 GA 이벤트 page_id 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 모임생성 퍼널 GA 이벤트 page_id 통일

- page_id를 "모임생성_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 퍼널 step_complete 이벤트 추가

- 거리/비선호음식/선호음식 단계별 완료 이벤트 로깅
- page_id를 "의견수합_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 대기 페이지 GA 이벤트 추가

- trackShareClick 유틸리티 함수 추가
- view_waiting: 페이지 진입 시 (submit_progress 포함)
- click_share: 링크 공유 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: GA 이벤트명 view_page로 통일 및 코드 포맷팅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 완료 페이지 GA 이벤트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 추천 결과 페이지 GA 이벤트 추가

- view_page 이벤트 (페이지 진입, 의견 일치율 포함)
- click_restaurant 이벤트 (맛집 클릭, 순위 포함)
- click_share 이벤트 (공유 버튼 클릭)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 추천 결과 페이지 GA 이벤트 파라미터 개선

- rank를 rank_type(top/other)으로 변경
- onBeforeShare를 onShare로 네이밍 개선
- agreement_rate 파라미터 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: 의견수합 대기 페이지 공유 URL 경로 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 코드 리뷰 피드백 반영

- useEffect 의존성 배열 개선 (optional chaining 제거)
- trackPageView를 trackViewPage로 리네이밍 및 이벤트명 내부 고정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
RookieAND pushed a commit that referenced this pull request Feb 16, 2026
RookieAND pushed a commit that referenced this pull request Feb 16, 2026
* feat: GA4 Analytics 컴포넌트 및 이벤트 로깅 유틸리티 추가

- GoogleAnalytics 컴포넌트 추가 (GTM과 병행 사용)
- trackEvent, trackButtonClick 유틸리티 함수 추가
- development 환경에서는 debugMode 활성화 (DebugView 확인용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 랜딩 페이지 버튼 클릭 GA 이벤트 추가

- '모임 링크 생성 시작' 버튼 클릭 시 button_click 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: GA 이벤트 로깅 유틸리티 개선 및 랜딩 페이지 이벤트 적용

- trackPageView, trackCtaClick 유틸리티 함수 추가
- GA dataLayer 준비 대기 로직 추가 (타이밍 이슈 해결)
- 랜딩 페이지: view_landing_page, cta_click 이벤트 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 퍼널 step_complete 이벤트 추가

- trackStepComplete 유틸리티 함수 추가
- 인원수/날짜/장소 단계별 완료 이벤트 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 모임 생성 완료 페이지 GA 이벤트 추가

- view_gathering_create_complete_page: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견 수합 랜딩 페이지 GA 이벤트 추가

- view_landing: 페이지 진입 시
- cta_click: 내 취향 입력 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 랜딩 페이지 GA 이벤트 page_id 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 모임생성 퍼널 GA 이벤트 page_id 통일

- page_id를 "모임생성_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 퍼널 step_complete 이벤트 추가

- 거리/비선호음식/선호음식 단계별 완료 이벤트 로깅
- page_id를 "의견수합_퍼널"로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 대기 페이지 GA 이벤트 추가

- trackShareClick 유틸리티 함수 추가
- view_waiting: 페이지 진입 시 (submit_progress 포함)
- click_share: 링크 공유 버튼 클릭 시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: GA 이벤트명 view_page로 통일 및 코드 포맷팅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 의견수합 완료 페이지 GA 이벤트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: 추천 결과 페이지 GA 이벤트 추가

- view_page 이벤트 (페이지 진입, 의견 일치율 포함)
- click_restaurant 이벤트 (맛집 클릭, 순위 포함)
- click_share 이벤트 (공유 버튼 클릭)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 추천 결과 페이지 GA 이벤트 파라미터 개선

- rank를 rank_type(top/other)으로 변경
- onBeforeShare를 onShare로 네이밍 개선
- agreement_rate 파라미터 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: 의견수합 대기 페이지 공유 URL 경로 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: 코드 리뷰 피드백 반영

- useEffect 의존성 배열 개선 (optional chaining 제거)
- trackPageView를 trackViewPage로 리네이밍 및 이벤트명 내부 고정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
github-actions bot pushed a commit that referenced this pull request Feb 16, 2026
## 1.0.0-beta.1 (2026-02-16)

### Features

* [#70](#70) ([#72](#72)) ([b676e0e](b676e0e))
* [QA] 모임 생성 완료, 결과페이지 페이지 UI 개선 ([#66](#66)) ([f10225d](f10225d))
* [QA] 서비스 전체 배경색 및 Layout Root 그림자 효과 적용 ([#59](#59)) ([384b56f](384b56f))
* api client 모듈 생성 ([#37](#37)) ([a37b0a9](a37b0a9)), closes [#38](#38) [#39](#39) [#40](#40) [#41](#41)
* Button 컴포넌트 추가 ([#11](#11)) ([83b7607](83b7607))
* Chip Component 추가 ([#9](#9)) ([e9d8b8f](e9d8b8f))
* Color theme 초기화 ([#2](#2)) ([97f1dcc](97f1dcc))
* DotsLoader 컴포넌트 추가  ([#48](#48)) ([cfe4582](cfe4582)), closes [#49](#49)
* GA4 이벤트 트래킹 통합 ([#70](#70)) ([0c1b9fa](0c1b9fa))
* GTM(Google Tag Manager) 통합을 위한 Analytics 컴포넌트 추가 ([#57](#57)) ([87a6ded](87a6ded))
* IconBase 컴포넌트 및 아이콘 컴포넌트들 구축 ([#13](#13)) ([8557b75](8557b75)), closes [#FFCD00](https://github.com/Nexters/yogieat/issues/FFCD00) [#FFAD00](https://github.com/Nexters/yogieat/issues/FFAD00) [#15](#15) [#ff5a3c](https://github.com/Nexters/yogieat/issues/ff5a3c)
* InputField 컴포넌트 추가 ([#16](#16)) ([99b8aa2](99b8aa2))
* Landing / Opinion Form 페이지 분리 ([#61](#61)) ([0f11e71](0f11e71))
* Layout 컴포넌트 추가 ([#10](#10)) ([9efce6f](9efce6f))
* Semantic Color Token 추가 ([#19](#19)) ([fcaedaf](fcaedaf))
* Spacing utility 클래스 초기화 ([#8](#8)) ([2e38d7a](2e38d7a))
* Tag 컴포넌트 추가 ([#20](#20)) ([f69dd05](f69dd05))
* Toast 컴포넌트 추가 ([#21](#21)) ([76e84b0](76e84b0))
* 모임 생성 퍼널 Step 1 (인원 선택) 구현 ([#23](#23)) ([7fc01a1](7fc01a1)), closes [#24](#24) [#1f2933](https://github.com/Nexters/yogieat/issues/1f2933) [#ff5a3c](https://github.com/Nexters/yogieat/issues/ff5a3c) [#25](#25) [#26](#26) [#27](#27) [#28](#28) [#29](#29) [#30](#30) [#31](#31) [#32](#32) [#34](#34)
* 프로젝트 기초 세팅 진행 ([aa0ec20](aa0ec20))
* 프로젝트 폴더 구조 반영 ([e54962d](e54962d))

### Bug Fixes

* 1순위를 1개라도 선택했다면 바로 CTA 가 활성화 되도록 수정 ([#60](#60)) ([e5758b4](e5758b4))
* 1차 MVP 배포 이전 최종 QA 항목 반영 ([#58](#58)) ([6574231](6574231))
* Button/Chip type 속성 추가 및 의견 수렴 UX 개선 ([#50](#50)) ([7e86e4a](7e86e4a)), closes [#51](#51) [#52](#52) [#53](#53) [#54](#54) [#55](#55) [#56](#56)
* cat 에서 echo 로 env.production 파일을 생성하도록 수정 ([f15307d](f15307d))
* CI/CD health check 타이밍 개선 및 수동 배포 기능 추가 ([54fd2b8](54fd2b8))
* Docker build-args로 환경 변수 전달 방식 변경 ([#77](#77)) ([e5fa0b9](e5fa0b9))
* Docker 이미지 강제 pull 및 컨테이너 재생성 ([#79](#79)) ([c253ec1](c253ec1))
* Health check 전략 개선 및 curl 기반으로 변경 ([765d3da](765d3da))
* nginx http2 deprecated 경고 해결 ([2fd9c75](2fd9c75))
* PendingView 내에서 ShareButton 을 렌더링 하지 않도록 수정 ([7bc3e12](7bc3e12))
* 결과 페이지 맛집 이미지 기본 placeholder, 공유하기 toast 미노출 ([#68](#68)) ([3c80844](3c80844))
* 동시 배포 방지를 위한 concurrency 설정 추가 ([e9bfd52](e9bfd52))
* 모임 생성 퍼널 필드 상태 초기화 버그 수정 ([#64](#64)) ([3934066](3934066)), closes [#65](#65)
* 모임 생성 폼 필드명 변경 (meetingDate → scheduledDate, location → region) ([#35](#35)) ([e90beed](e90beed))
* 배포 워크플로우에 GA4 환경 변수 추가 ([#73](#73)) ([835ae1f](835ae1f))
* 의견 수렴 페이지 내 UI 수정 및 인터렉션 개선 ([#36](#36)) ([a74f7da](a74f7da))
* 의견 수합 Form Capacity 폴링 제거 및 ErrorCode 타입 시스템 추가 ([#67](#67)) ([d55dba1](d55dba1))
* 인원 수 선택 Grid 및 의견 수렴 QA 수정 사항 반영 ([f01626e](f01626e))
* 테스트 용으로 추가했던 페이지 제거 및 icons 폴더 추가 ([4116025](4116025))

### Code Refactoring

* Button 컴포넌트 스펙을 Figma 명세에 맞춰 수정 ([#14](#14)) ([2e27f17](2e27f17))

### Build System

* Docker 빌드 시 NEXT_PUBLIC 환경변수 주입 프로세스 추가 ([#47](#47)) ([88ba163](88ba163))

### Documentation

* 프로젝트 개발 가이드 문서 추가 ([#84](#84)) ([4313145](4313145))
github-actions bot pushed a commit that referenced this pull request Feb 16, 2026
## 1.0.0 (2026-02-16)

### Features

* [#70](#70) ([#72](#72)) ([b676e0e](b676e0e))
* [QA] 모임 생성 완료, 결과페이지 페이지 UI 개선 ([#66](#66)) ([f10225d](f10225d))
* [QA] 서비스 전체 배경색 및 Layout Root 그림자 효과 적용 ([#59](#59)) ([384b56f](384b56f))
* analytics 개선 및 네이버 서치 어드바이저 등록 ([#88](#88)) ([4372aa5](4372aa5))
* api client 모듈 생성 ([#37](#37)) ([a37b0a9](a37b0a9)), closes [#38](#38) [#39](#39) [#40](#40) [#41](#41)
* Button 컴포넌트 추가 ([#11](#11)) ([83b7607](83b7607))
* Chip Component 추가 ([#9](#9)) ([e9d8b8f](e9d8b8f))
* Color theme 초기화 ([#2](#2)) ([97f1dcc](97f1dcc))
* DotsLoader 컴포넌트 추가  ([#48](#48)) ([cfe4582](cfe4582)), closes [#49](#49)
* GA4 이벤트 트래킹 통합 ([#70](#70)) ([0c1b9fa](0c1b9fa))
* GTM(Google Tag Manager) 통합을 위한 Analytics 컴포넌트 추가 ([#57](#57)) ([87a6ded](87a6ded))
* IconBase 컴포넌트 및 아이콘 컴포넌트들 구축 ([#13](#13)) ([8557b75](8557b75)), closes [#FFCD00](https://github.com/Nexters/yogieat/issues/FFCD00) [#FFAD00](https://github.com/Nexters/yogieat/issues/FFAD00) [#15](#15) [#ff5a3c](https://github.com/Nexters/yogieat/issues/ff5a3c)
* InputField 컴포넌트 추가 ([#16](#16)) ([99b8aa2](99b8aa2))
* Landing / Opinion Form 페이지 분리 ([#61](#61)) ([0f11e71](0f11e71))
* Layout 컴포넌트 추가 ([#10](#10)) ([9efce6f](9efce6f))
* Semantic Color Token 추가 ([#19](#19)) ([fcaedaf](fcaedaf))
* Spacing utility 클래스 초기화 ([#8](#8)) ([2e38d7a](2e38d7a))
* Tag 컴포넌트 추가 ([#20](#20)) ([f69dd05](f69dd05))
* Toast 컴포넌트 추가 ([#21](#21)) ([76e84b0](76e84b0))
* 모임 생성 완료 페이지 UI 리뉴얼 ([#89](#89)) ([17a3fc1](17a3fc1))
* 모임 생성 퍼널 Step 1 (인원 선택) 구현 ([#23](#23)) ([7fc01a1](7fc01a1)), closes [#24](#24) [#1f2933](https://github.com/Nexters/yogieat/issues/1f2933) [#ff5a3c](https://github.com/Nexters/yogieat/issues/ff5a3c) [#25](#25) [#26](#26) [#27](#27) [#28](#28) [#29](#29) [#30](#30) [#31](#31) [#32](#32) [#34](#34)
* 프로젝트 기초 세팅 진행 ([aa0ec20](aa0ec20))
* 프로젝트 폴더 구조 반영 ([e54962d](e54962d))

### Bug Fixes

* 1순위를 1개라도 선택했다면 바로 CTA 가 활성화 되도록 수정 ([#60](#60)) ([e5758b4](e5758b4))
* 1차 MVP 배포 이전 최종 QA 항목 반영 ([#58](#58)) ([6574231](6574231))
* Button/Chip type 속성 추가 및 의견 수렴 UX 개선 ([#50](#50)) ([7e86e4a](7e86e4a)), closes [#51](#51) [#52](#52) [#53](#53) [#54](#54) [#55](#55) [#56](#56)
* cat 에서 echo 로 env.production 파일을 생성하도록 수정 ([f15307d](f15307d))
* CI/CD health check 타이밍 개선 및 수동 배포 기능 추가 ([54fd2b8](54fd2b8))
* Docker build-args로 환경 변수 전달 방식 변경 ([#77](#77)) ([e5fa0b9](e5fa0b9))
* Docker 이미지 강제 pull 및 컨테이너 재생성 ([#79](#79)) ([c253ec1](c253ec1))
* Health check 전략 개선 및 curl 기반으로 변경 ([765d3da](765d3da))
* nginx http2 deprecated 경고 해결 ([2fd9c75](2fd9c75))
* PendingView 내에서 ShareButton 을 렌더링 하지 않도록 수정 ([7bc3e12](7bc3e12))
* 결과 페이지 맛집 이미지 기본 placeholder, 공유하기 toast 미노출 ([#68](#68)) ([3c80844](3c80844))
* 동시 배포 방지를 위한 concurrency 설정 추가 ([e9bfd52](e9bfd52))
* 모임 생성 퍼널 필드 상태 초기화 버그 수정 ([#64](#64)) ([3934066](3934066)), closes [#65](#65)
* 모임 생성 폼 필드명 변경 (meetingDate → scheduledDate, location → region) ([#35](#35)) ([e90beed](e90beed))
* 배포 워크플로우에 GA4 환경 변수 추가 ([#73](#73)) ([835ae1f](835ae1f))
* 의견 수렴 페이지 내 UI 수정 및 인터렉션 개선 ([#36](#36)) ([a74f7da](a74f7da))
* 의견 수합 Form Capacity 폴링 제거 및 ErrorCode 타입 시스템 추가 ([#67](#67)) ([d55dba1](d55dba1))
* 인원 수 선택 Grid 및 의견 수렴 QA 수정 사항 반영 ([f01626e](f01626e))
* 테스트 용으로 추가했던 페이지 제거 및 icons 폴더 추가 ([4116025](4116025))

### Code Refactoring

* Button 컴포넌트 스펙을 Figma 명세에 맞춰 수정 ([#14](#14)) ([2e27f17](2e27f17))

### Build System

* Docker 빌드 시 NEXT_PUBLIC 환경변수 주입 프로세스 추가 ([#47](#47)) ([88ba163](88ba163))

### Documentation

* 프로젝트 개발 가이드 문서 추가 ([#84](#84)) ([4313145](4313145))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발 📤 In Progress 현재 작업 중인 PR 입니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant