posts

컨벤션&스택

Apr 23, 2026 updated Apr 23, 2026 huskyreactreact-queryzustand

사용 라이브러리

분류

라이브러리

코어

react,stackflow

코드 품질

biome,husky

네트워크

axios,@tanstack/react-query

상태관리

zustand,immer,zustand/combine

유틸

es-toolkit,classnames

폼 처리

react-hook-form

UI

swiper,react-day-picker

Git 컨벤션

브랜치

개발용 브랜치: main

배포 브랜치: dev, prod

브랜치 전략

기능 개발 시 다음 규칙을 따라 브랜치 명명

기본 형식:{{story이슈번호}}/{{subTask이슈번호}}__{{간략한 작업 설명}}

예:EL-3/EL-4__signup-login

subTask가 없을 경우:{{story이슈번호}}/{{간략한 작업 설명}}

예:EL-3/signup-login

서브태스크 유무와 무관하게 일관된 구조 유지

이유: 초기에는 단일 작업이더라도 협업 중에 서브태스크가 추가될 수 있기 때문

유의사항

짧은 수명 브랜치 유지: 브랜치는 가급적 1~2일 이내 머지. 장기간 작업은 분할하거나 main에서 직접 개발.

주기적 pull & rebase: main 브랜치 기준으로 작업 브랜치를 주기적으로 업데이트

병합 시--no-ff사용: 작업 단위 명확화 및 커밋 추적을 위해 fast-forward 병합은 지양

테스트 필수: main에 병합 전 로컬에서 기능 확인 필수.

폴더 구조나 파일 이동 시 확인 필수: 구조 변경은 후속 작업에 영향이 크므로 공동 작업자에게 확인 필수.

머지 자동 알림 시스템 (GitLab → Google Chat)

main브랜치에 머지 후 별도 공유 없이도 팀 전체가 실시간으로 변경사항을 인지할 수 있도록

GitLab → Google Chat 연동을 통해 자동 알림설정

알림 위치:[Git] culturepass-fo스페이스

트리거:main브랜치로 푸시 발생 시

커밋 컨벤션

제목은 명령형으로 작성하며, 마침표를 붙이지 않습니다.

본문운 제목과 한 줄 띄운 뒤 작성합니다.

Jira 이슈 트래킹을 위한 규칙

커밋 메시지 prefix로 해당 이슈 번호를 괄호로 명시 (브랜치명에 마지막 이슈번호가 자동으로 삽입되도록 husky세팅 되어있음)

예:[EL-3] 회원가입/로그인 기능 구현

Merge 방식

Merge Request 사용 ❌

빠른 개발을 위해 main브랜치에 바로 머지

Squash Merge ❌ - 기능 브랜치의 커밋을 개별적으로 유지

Squash는 개별 작업 브랜치에서 메인 브랜치에 머지하기 전에 WIP커밋을 처리할때만

파일 및 폴더 네이밍 컨벤션 예시

/activity /act-login /_local (act-login에서만 사용되는 정의, 로직, 컴포넌트 파일 등) /step step-1.tsx step-2.tsx act-login.tsx act-login.css /api /component /core /ui /hook /library /stackflow /store store-user.ts /type /util

컴포넌트 기본 템플릿

interface ComponentProps {} const Component = (props: ComponentProps) => { const {} = props return ( <div> <div>Component</div> </div> ) } export default Component

코드 스타일 및 규칙

열거형 상수

as const사용

주석

슬래시 주석(//) 사용

아래 위치에는 요약된 설명을 주석으로 반드시 작성:

컴포넌트의Props

주요function

useEffect내부 로직

주석은 해당 로직의 목적과 흐름을 빠르게 파악할 수 있도록 간결하게 작성합니다.

이벤트 핸들러

함수명은handle+ 대상 + 이벤트명의 형태로 작성

(예:handleSubmitForm,handleLoginButtonClick)

정확한 타입 명시

(예:MouseEventHandler)

이벤트 객체는 일반적으로e로 표기

단, 사용하지 않는 경우에는_e와 같이 접두어에 언더바를 붙여 명시

핸들러의 동작 목적을 슬래시 주석(//)으로 함수 위에 간결하게 작성합니다.

// 예시 버튼 클릭 - 클릭하면 어떤일이 일어납니다 const handleButtonClick: MouseEventHandler = (_e) => { console.log('예시 버튼 클릭') }

로직이한 줄이고 사이드 이펙트가 단순한 경우에만 인라인 핸들러를 허용하며,

복잡하거나 재사용이 필요한 로직은 별도 함수로 분리하여 작성합니다.

Linter 설정

항목

설정값

semicolons

⭕️

lineWidth

100

quoteStyle

'홑따옴표

HTML/CSS/JS 을 전달 받으면

HTML → React 컴포넌트로 분리

core 영역 및 기능 밀집 영역 위주로 우선 분리

분리 기준은 작업 중 조율 예정

CSS 분리 및 적용

클래스명이 글로벌 스코프 기준으로 구성되어 있어 CSS Module 미사용, 일반 CSS로 관리

컴포넌트 단위로 CSS를 세분화할 경우 협업 난이도 증가 우려 → 다음 구조로 적용:

common.css: 공통 영역에서 전역 호출

화면 단위 CSS: 각 activity에서 개별 호출

JS → React State

전달받은 JS는 React 기준으로 상태 관리 전환

전체 마이그레이션이 기본 방향이나 일정에 따라 결정할 예정