Skip to content

refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링#65

Merged
youngminss merged 4 commits intofix/gathering-create-form-field-statefrom
refactor/gathering-create-zod-schema
Feb 6, 2026
Merged

refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링#65
youngminss merged 4 commits intofix/gathering-create-form-field-statefrom
refactor/gathering-create-zod-schema

Conversation

@youngminss
Copy link
Member

🎯 refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링

모임 생성 퍼널의 form validation을 zod 스키마 기반으로 변경하여 일관된 validation 관리를 적용합니다.

📑 작업 상세 내역

  • createMeetingForm.schema.ts 생성하여 zod 스키마 정의
  • useCreateMeetingForm 훅에 zodResolver 적용 및 submit 로직 통합
  • Step 컴포넌트에서 rules 객체 제거
  • page.tsx에서 submit 로직 제거하여 간소화
  • DATE_ERROR_MESSAGES를 유틸로 추출하여 중복 제거
  • DateStep에서 formState.errors 기반으로 에러 표시 및 버튼 활성화 판단

🙏 리뷰 요청 사항

  • useOpinionForm과 동일한 패턴으로 구현했습니다.
  • 기존 toggle 버그 수정(nullable 사용)을 유지하면서 zod 기반으로 변경했습니다.

📃 참고 자료

  • 기반 브랜치: fix/gathering-create-form-field-state (toggle 버그 수정)

🖼️ 작업 결과물

youngminss and others added 4 commits February 6, 2026 01:36
모임 생성 폼의 validation을 zod 기반으로 관리하기 위한 스키마 정의
- peopleCount, scheduledDate, timeSlot, region 필드 정의
- 기존 validateDateInput 유틸 함수 재사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- useCreateMeetingForm에 zodResolver 적용 및 submit 로직 통합
- Step 컴포넌트에서 rules 객체 제거
- page.tsx에서 submit 로직 제거하여 간소화
- CreateMeetingForm 인터페이스를 스키마 타입으로 대체

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- DATE_ERROR_MESSAGES를 유틸로 추출하여 공유
- DateStep에서 fieldState.error 사용으로 변경
- DateStepFooter에서 formState.errors 기반으로 버튼 활성화 판단
- 스키마에서 10자리 미만일 때는 validation 건너뛰도록 수정 (이전 동작 유지)

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 5, 2026 16:52
@github-actions github-actions bot added the 🔨 Refactor 코드 리팩토링 및 구조 개선 label Feb 5, 2026
@youngminss youngminss changed the base branch from develop to fix/gathering-create-form-field-state February 5, 2026 16:53
@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은 모임 생성 퍼널의 폼 유효성 검사 시스템을 Zod 기반으로 재구축하여 코드의 일관성과 유지보수성을 크게 향상시키는 것을 목표로 합니다. 기존에 각 컴포넌트에 분산되어 있던 유효성 검사 로직과 폼 제출 처리를 useCreateMeetingForm 훅으로 통합하고, Zod 스키마를 통해 명확하고 중앙화된 유효성 검사 규칙을 적용함으로써, 개발자가 폼 상태를 더 쉽게 관리하고 예측할 수 있도록 개선했습니다.

Highlights

  • Zod 기반 폼 유효성 검사 도입: 모임 생성 폼의 유효성 검사를 Zod 스키마 기반으로 전면 리팩토링하여, 일관되고 강력한 유효성 검사 로직을 적용했습니다.
  • 폼 제출 로직 통합: useCreateMeetingForm 훅에 zodResolver를 적용하고, 폼 제출(submit) 로직 및 API 호출을 해당 훅 내부로 통합하여 page.tsx의 코드를 간소화했습니다.
  • 불필요한 rules 객체 제거: 각 스텝 컴포넌트(DateStep, PeopleStep, RegionStep)에서 react-hook-formuseController에 사용되던 rules 객체를 제거하고, Zod 스키마를 통해 유효성 검사를 중앙 집중화했습니다.
  • 에러 메시지 및 버튼 활성화 로직 개선: DateStep에서 formState.errors를 기반으로 에러 메시지를 표시하고 버튼 활성화 여부를 판단하도록 변경하여, Zod 스키마와 연동된 정확한 유효성 상태를 반영합니다.
  • 타입 정의 및 유틸리티 분리: 기존 CreateMeetingForm 인터페이스를 제거하고 Zod 스키마로부터 타입을 추론하도록 변경했으며, DATE_ERROR_MESSAGES를 유틸리티 파일로 추출하여 재사용성을 높였습니다.
  • nullable 값 처리 일관성 확보: 선택되지 않은 값(예: 인원 수, 시간대, 지역)에 대해 undefined 대신 null을 사용하도록 변경하여 Zod 스키마의 nullable() 정의와 일관성을 맞췄습니다.

🧠 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/create/page.tsx
    • useCreateGathering 훅 및 관련 임포트 제거
    • 폼 제출 로직(onSubmit)을 useCreateMeetingForm 훅으로 이동하여 page.tsx에서 제거
    • useCreateMeetingForm에서 methods, onSubmit, isPending을 구조 분해 할당하여 사용
    • FormProviderform 대신 methods를 전달하도록 변경
    • form.handleSubmit(onSubmit) 대신 onSubmit을 직접 form 요소에 전달하도록 변경
  • src/hooks/gathering/useCreateMeetingForm.ts
    • zodResolver 임포트 및 적용
    • next/navigationuseRouter 임포트
    • createMeetingFormSchemaCreateMeetingFormSchema 임포트
    • useCreateGathering 훅 임포트 및 isApiError, toast 유틸리티 임포트
    • 폼의 defaultValues를 Zod 스키마에 맞춰 null을 포함하도록 정의
    • 폼 제출 로직(handleSubmit)을 훅 내부로 통합하여 API 호출 및 라우터 이동 처리
    • 훅이 methods, onSubmit, isPending을 반환하도록 변경
  • src/pageComponents/gathering/create/DateStep.tsx
    • 기존 scheduledDateRules, timeSlotRulesDATE_ERROR_MESSAGES 상수 제거
    • CreateMeetingForm 타입 대신 CreateMeetingFormSchema 타입 사용
    • useController에서 rules 속성 제거
    • 날짜 입력 필드의 errorTextscheduledDateError?.message로 변경하여 Zod 에러 메시지 표시
    • handleTimeSlotChange에서 선택 해제 시 undefined 대신 null을 할당하도록 변경
    • DateStepFooter에서 isValid 로직을 formState.errorsuseWatch를 사용하여 Zod 기반으로 변경
  • src/pageComponents/gathering/create/PeopleCountGrid.tsx
    • PeopleCountGridPropsvalueonChange 타입에서 undefinednull로 변경
    • 인원 수 선택 해제 시 undefined 대신 nullonChange에 전달하도록 변경
  • src/pageComponents/gathering/create/PeopleStep.tsx
    • 기존 rules 상수 제거
    • CreateMeetingForm 타입 대신 CreateMeetingFormSchema 타입 사용
    • useController에서 rules 속성 제거
    • handleChange 함수의 count 파라미터 타입을 number | undefined에서 number | null로 변경
    • PeopleStepFooter에서 useWatch를 사용하여 peopleCount 값을 가져오고 isValid 로직을 !isNil(peopleCount)로 변경
  • src/pageComponents/gathering/create/RegionChip.tsx
    • CreateMeetingForm 타입 대신 CreateMeetingFormSchema 타입 사용
    • 칩 클릭 시 field.value === value ? null : value 로직을 통해 선택/해제 시 null을 할당하도록 변경
  • src/pageComponents/gathering/create/RegionStep.tsx
    • CreateMeetingForm 타입 대신 CreateMeetingFormSchema 타입 사용
    • RegionStepFooter에서 useController 대신 useWatch를 사용하여 region 값을 가져오고 isValid 로직을 !isNil(region)으로 변경
  • src/schemas/gathering/createMeetingForm.schema.ts
    • 새 파일 추가: createMeetingFormSchema를 Zod를 사용하여 정의
    • TimeSlotRegion에 대한 Zod enum 스키마 정의
    • scheduledDateSchema에 10자리 입력 완료 시에만 유효성 검사를 수행하는 커스텀 check 로직 추가
    • peopleCount, scheduledDate, timeSlot, region 필드를 포함하는 메인 스키마 정의
    • CreateMeetingFormSchema 타입을 Zod 스키마로부터 추론하여 export
  • src/schemas/gathering/index.ts
    • createMeetingFormSchemaCreateMeetingFormSchema를 export 하도록 추가
  • src/types/gathering/createMeetingForm.ts
    • 기존 CreateMeetingForm 인터페이스 제거
  • src/types/gathering/index.ts
    • CreateMeetingForm 타입 export 제거
  • src/utils/gathering/create/dateStep.ts
    • DATE_ERROR_MESSAGES 상수를 이 파일로 이동
  • src/utils/gathering/create/index.ts
    • DATE_ERROR_MESSAGES를 export 하도록 추가
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 🔨 Refactor 코드 리팩토링 및 구조 개선 and removed 🔨 Refactor 코드 리팩토링 및 구조 개선 labels Feb 5, 2026
@youngminss youngminss added the ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 label Feb 5, 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

zod 스키마를 사용한 리팩토링에서 몇 가지 개선점을 발견했습니다. useCreateMeetingForm 훅의 제출 로직과 createMeetingForm.schema.ts 파일의 zod API 사용 방식에 대한 피드백을 확인해주세요.

Comment on lines +19 to +35
const scheduledDateSchema = z.string().check((ctx) => {
// 10자리(yyyy.MM.dd) 입력 완료 시에만 validation 수행
// 빈 문자열이거나 입력 중일 때는 에러 표시하지 않음
if (ctx.value.length < 10) {
return;
}

const error = validateDateInput(ctx.value);
if (error) {
ctx.issues.push({
code: "custom",
message: DATE_ERROR_MESSAGES[error],
input: ctx.value,
path: [],
});
}
});
Copy link
Contributor

Choose a reason for hiding this comment

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

high

Zod의 .check() 메서드는 현재 deprecated 상태이며 Zod v4에서 제거될 예정입니다. 대신 .refine()을 사용해야 합니다. 현재 구현은 check의 콜백 함수에서 boolean 값을 반환하지 않고 있어 예기치 않은 동작을 유발할 수 있습니다. .refine()으로 변경하여 유효성 검사 로직을 명확하고 안전하게 수정하는 것을 권장합니다.

Suggested change
const scheduledDateSchema = z.string().check((ctx) => {
// 10자리(yyyy.MM.dd) 입력 완료 시에만 validation 수행
// 빈 문자열이거나 입력 중일 때는 에러 표시하지 않음
if (ctx.value.length < 10) {
return;
}
const error = validateDateInput(ctx.value);
if (error) {
ctx.issues.push({
code: "custom",
message: DATE_ERROR_MESSAGES[error],
input: ctx.value,
path: [],
});
}
});
const scheduledDateSchema = z.string().refine((value, ctx) => {
// 10자리(yyyy.MM.dd) 입력 완료 시에만 validation 수행
// 빈 문자열이거나 입력 중일 때는 에러 표시하지 않음
if (value.length < 10) {
return true;
}
const error = validateDateInput(value);
if (error) {
ctx.addIssue({
code: "custom",
message: DATE_ERROR_MESSAGES[error],
});
return false;
}
return true;
});
References
  1. Zod의 .check() 메서드는 deprecated 상태이며, .refine() 사용이 권장됩니다. 현재 코드는 deprecated된 API를 사용하고 있으며, 콜백 함수의 반환 값이 없어 버그의 소지가 있습니다. (link)

Comment on lines +29 to +59
const handleSubmit = methods.handleSubmit((data) => {
if (
!data.peopleCount ||
!data.timeSlot ||
!data.scheduledDate ||
!data.region
) {
return;
}

createGathering(
{
peopleCount: data.peopleCount,
region: data.region,
scheduledDate: data.scheduledDate.replace(/\./g, "-"),
timeSlot: data.timeSlot,
},
{
onSuccess: (response) => {
router.push(
`/gathering/create/complete/${response.data.accessKey}`,
);
},
onError: (error) => {
if (isApiError(error)) {
toast.warning(error.message);
}
},
},
);
});
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

handleSubmit 콜백 내에서 수동으로 필드의 존재 여부를 확인하는 대신, 제출 전용의 더 엄격한 Zod 스키마를 정의하여 데이터 유효성을 검증하는 것이 좋습니다. 이 접근 방식은 유효성 검사 로직을 Zod 스키마로 중앙화하여 코드의 일관성과 예측 가능성을 높입니다. 현재 if 문은 타입 가드 역할을 하지만, safeParse와 함께 별도의 제출 스키마를 사용하면 이 로직을 더 선언적으로 만들 수 있습니다.

const handleSubmit = methods.handleSubmit((data) => {
	const submissionSchema = createMeetingFormSchema.required({
		peopleCount: true,
		timeSlot: true,
		region: true,
	}).refine((d) => d.scheduledDate.length > 0, {
		path: ["scheduledDate"],
		message: "날짜를 입력해주세요.",
	});

	const result = submissionSchema.safeParse(data);

	if (!result.success) {
		// 일반적으로 UI의 버튼 비활성화로 인해 호출되지 않지만, 안전장치로 남겨둡니다.
		return;
	}

	const { peopleCount, region, scheduledDate, timeSlot } = result.data;

	createGathering(
		{
			peopleCount,
			region,
			scheduledDate: scheduledDate.replace(/\./g, "-"),
			timeSlot,
		},
		{
			onSuccess: (response) => {
				router.push(
					`/gathering/create/complete/${response.data.accessKey}`,
				);
			},
			onError: (error) => {
				if (isApiError(error)) {
					toast.warning(error.message);
				}
			},
		},
	);
});

Copy link
Collaborator

@RookieAND RookieAND left a comment

Choose a reason for hiding this comment

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

👍 반영해줘서 고마워!

@youngminss youngminss merged commit 878c203 into fix/gathering-create-form-field-state Feb 6, 2026
15 checks passed
@youngminss youngminss removed the ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 label Feb 6, 2026
youngminss added a commit that referenced this pull request Feb 6, 2026
* fix: CreateMeetingForm 타입을 optional 에서 nullable 로 변경

react-hook-form의 field.onChange(undefined) 호출 시 이전 값으로
롤백되는 문제를 해결하기 위해 undefined 대신 null을 사용하도록
타입을 변경하고 defaultValues를 설정

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

* fix: 모임 생성 퍼널 Step 컴포넌트 toggle 버그 수정

- undefined 대신 null을 사용하여 필드 초기화가 정상 동작하도록 수정
- Footer 컴포넌트에서 useController 대신 useWatch 사용
- RegionChip에 toggle 로직 추가

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

* refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링 (#65)

* feat: CreateMeetingForm zod 스키마 추가

모임 생성 폼의 validation을 zod 기반으로 관리하기 위한 스키마 정의
- peopleCount, scheduledDate, timeSlot, region 필드 정의
- 기존 validateDateInput 유틸 함수 재사용

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

* refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링

- useCreateMeetingForm에 zodResolver 적용 및 submit 로직 통합
- Step 컴포넌트에서 rules 객체 제거
- page.tsx에서 submit 로직 제거하여 간소화
- CreateMeetingForm 인터페이스를 스키마 타입으로 대체

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

* refactor: DATE_ERROR_MESSAGES 중복 제거 및 formState 활용

- DATE_ERROR_MESSAGES를 유틸로 추출하여 공유
- DateStep에서 fieldState.error 사용으로 변경
- DateStepFooter에서 formState.errors 기반으로 버튼 활성화 판단
- 스키마에서 10자리 미만일 때는 validation 건너뛰도록 수정 (이전 동작 유지)

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

* style: useCreateMeetingForm 조건문 포맷팅 정리

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: useWatch 사용 패턴 개선

- DateStep: 두 개의 useWatch를 배열 형태로 축약
- PeopleStep: useWatch + compute 조합으로 isValid 계산
- RegionStep: useWatch + compute 조합으로 isValid 계산

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

* fix: DateStep isValid 검증 로직 개선

- isValidDateFormat을 사용하여 날짜 포맷 검증 복구
- useWatch + compute 조합으로 isValid 계산 통합
- formState.errors 의존성 제거

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
* fix: CreateMeetingForm 타입을 optional 에서 nullable 로 변경

react-hook-form의 field.onChange(undefined) 호출 시 이전 값으로
롤백되는 문제를 해결하기 위해 undefined 대신 null을 사용하도록
타입을 변경하고 defaultValues를 설정

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

* fix: 모임 생성 퍼널 Step 컴포넌트 toggle 버그 수정

- undefined 대신 null을 사용하여 필드 초기화가 정상 동작하도록 수정
- Footer 컴포넌트에서 useController 대신 useWatch 사용
- RegionChip에 toggle 로직 추가

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

* refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링 (#65)

* feat: CreateMeetingForm zod 스키마 추가

모임 생성 폼의 validation을 zod 기반으로 관리하기 위한 스키마 정의
- peopleCount, scheduledDate, timeSlot, region 필드 정의
- 기존 validateDateInput 유틸 함수 재사용

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

* refactor: 모임 생성 폼을 zod 기반 validation으로 리팩토링

- useCreateMeetingForm에 zodResolver 적용 및 submit 로직 통합
- Step 컴포넌트에서 rules 객체 제거
- page.tsx에서 submit 로직 제거하여 간소화
- CreateMeetingForm 인터페이스를 스키마 타입으로 대체

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

* refactor: DATE_ERROR_MESSAGES 중복 제거 및 formState 활용

- DATE_ERROR_MESSAGES를 유틸로 추출하여 공유
- DateStep에서 fieldState.error 사용으로 변경
- DateStepFooter에서 formState.errors 기반으로 버튼 활성화 판단
- 스키마에서 10자리 미만일 때는 validation 건너뛰도록 수정 (이전 동작 유지)

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

* style: useCreateMeetingForm 조건문 포맷팅 정리

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: useWatch 사용 패턴 개선

- DateStep: 두 개의 useWatch를 배열 형태로 축약
- PeopleStep: useWatch + compute 조합으로 isValid 계산
- RegionStep: useWatch + compute 조합으로 isValid 계산

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

* fix: DateStep isValid 검증 로직 개선

- isValidDateFormat을 사용하여 날짜 포맷 검증 복구
- useWatch + compute 조합으로 isValid 계산 통합
- formState.errors 의존성 제거

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

🔨 Refactor 코드 리팩토링 및 구조 개선

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants