
복잡한 보험, 이제 내가 직접 이해하고 선택해요. 보핏과 함께 !
- 개인 맞춤 추천 : 꼭 필요한 보장 중심으로 객관적인 보험 추천
- 쉬운 이해를 위한 리포트 : 복잡한 보험 정보를 시각화하고 친절한 설명을 담은 리포트 제공
- 순수 정보 공유 커뮤니티 : 영업활동이 제한된 공간에서 신뢰할 수 있는 정보 교환








![]() 지욱 |
![]() 민정 |
![]() 수정 |
![]() 혜린 |
![]() 지우 |
![]() 정훈 |
카테고리 | 기술 스택 |
---|---|
UI Library | |
Server State Management | |
Language | |
Build Tool | |
Styling | |
Design System | |
Repository Management | |
Build System | |
Package Manager | |
CI/CD | |
Web Server | |
Containerization |
-
main branch
main
브랜치는 언제나 배포 가능한 안정된 상태만 관리합니다. -
develop branch
develop
브랜치는 통합 브랜치로, 모든 기능 개발이 이곳을 기반으로 진행됩니다.
평소에는develop
에서 기능별Feature branch
를 분기하고, 개발이 완료된 후 다시develop
으로 병합합니다.
develop
브랜치는 항상 안정적인 상태를 유지하며, 배포 가능한 상태가 되면main
브랜치로 병합하여 CI/CD를 통해 배포를 진행합니다. -
Feature branch
develop
브랜치에서 분기하여 기능별 개발을 진행하고, 완료 후 다시develop
브랜치로 병합합니다.
✅ 컴포넌트
💡 컴포넌트 작성 시 핵심 원칙 재사용 가능하고 명확한 구조로 설계하며, 비즈니스 로직과 디자인 시스템을 분리합니다.
- Interface: 반드시
Props
접미사 사용- ✅
CardProps
,ChipProps
- ❌
Card
,ChipInterface
- ✅
- Fragment 사용: 의미 없는
<div>
지양, 컴포넌트 최상단은Fragment
(<>...</>
) 사용
const InfoText = () => {
return (
<>
<h1>Welcome!</h1>
<p>This is our new page, we're glad you're here!</p>
</>
);
};
- Self-closing: Children이 불필요할 때는
<Component />
사용 - Headless UI: 디자인 시스템 컴포넌트는 비즈니스 로직 최소화
- 도메인 분리: 특정 도메인 의존 컴포넌트는 디자인 시스템이 아닌 client 내부에 작성
📁 폴더명
🎯 일관된 폴더 구조로 프로젝트 관리
규칙 | 설명 | 예시 |
---|---|---|
소문자 시작 | 모든 폴더명은 소문자로 시작 | components , utils |
복수형 | 항상 복수형으로 s 붙이기 | pages , hooks |
케밥 케이스 | 단어 연결 시 하이픈 사용 | user-pages , api-utils |
📝 타입
🔧 TypeScript 타입 정의 가이드
타입 | 사용 시기 | 특징 |
---|---|---|
interface | 기본 권장 | 병합 가능, 확장성 좋음 |
type | 특수한 경우 | 유니언, 튜플, 리터럴 타입 |
// ✅ 권장: interface 사용
interface UserProps {
name: string;
age: number;
}
// ✅ 특수한 경우: type 사용
type Status = 'loading' | 'success' | 'error';
type Position = [number, number];
🔑 변수
📌 명확하고 일관된 변수 선언
- var 사용 금지:
const
→let
순서로 선언 - 문자열 연결 금지:
+
대신 템플릿 리터럴 사용
타입 | 규칙 | 예시 |
---|---|---|
상수 | 대문자 스네이크 케이스 | API_KEY , MAX_COUNT |
Boolean | is 접두사 |
isActive , isLoading |
일반 변수 | 의미 명확한 이름 (길어도 OK) | userProfileData |
- 정적 리스트: index 사용 가능
- 동적 리스트: 고유한 id 사용 필수
- 랜덤 값: key로 사용 금지
⚙️ 함수
🎯 명확한 함수 네이밍과 구조
접두사 | 용도 | 예시 |
---|---|---|
get | 값 반환 | getUserData |
create | 새 값 생성 | createUser |
check | 로직 검증 | checkValidation |
convert | 변환 | convertToString |
add/minus | 연산 | addToCart , minusCount |
filter | 배열 필터링 | filterActiveUsers |
handle | 이벤트 핸들러 | handleSubmitClick |
- 함수 형태: 동사+명사 조합
- 이벤트 핸들러:
handle
접두사 필수- 예:
handleResetClick
,handleSubmitClick
- 예:
- 유틸 함수: 반환값 기준 네이밍 (ex.
hasEmail
) - 재사용: 2개 이상 도메인에서 사용 시 utils 폴더로 이동
- 선언 방식: 화살표 함수 사용
🧩 메소드
🔄 효율적인 데이터 처리 방법
// ✅ 스프레드 연산자 사용
const copies = [...originals];
// ✅ 함수형 메소드 사용 (for 대신)
items.forEach((item) => processItem(item));
items.map((item) => transformItem(item));
interface VoteAllInfoProps {
date: number;
time: string;
}
interface UserDataProps {
userName: string;
userBirth: string;
}
// Props 구조 분해
const MonthVoting = ({ date, time }: VoteAllInfoProps) => {
// 컴포넌트 로직
};
// 함수 매개변수 구조 분해
function checkIsUser({ userName, userBirth }: UserDataProps) {
// 검증 로직
}
🎨 스타일
🏗️ 의미 있는 HTML 구조
원칙 | 설명 | 예시 |
---|---|---|
시맨틱 태그 | 의미에 맞는 태그 사용 | <header> , <nav> , <main> |
div 지양 | 의미 없는 div 사용 금지 | <section> , <article> 활용 |
Container 네이밍 | Wrapper 필요 시 명확한 이름 | UserContainer , LayoutContainer |
📖 참고 자료: MDN HTML 시맨틱 태그 가이드
📚 Storybook
📖 컴포넌트 문서화 가이드
- Interface 설명: 모든 Props에 대한 명확한 설명 포함
- 사용 예시: 다양한 시나리오별 Story 작성
- 시각적 테스트: 컴포넌트의 모든 상태 검증
import type { Meta, StoryObj } from '@storybook/react';
import Box from './Box';
const meta: Meta<typeof Box> = {
title: 'Common/Box',
component: Box,
parameters: {
layout: 'centered',
componentSubtitle: '📦 박스 컴포넌트',
docs: {
description: {
component: `
Box 컴포넌트는 제목과 버튼이 포함된 컨테이너입니다.
**Props 설명:**
- \`title\`: 박스 상단 제목
- \`showMore\`: 버튼 노출 여부
- \`showMoreText\`: 버튼 텍스트
- \`path\`: 클릭 시 이동 경로
- \`children\`: 콘텐츠 영역
`,
},
},
},
decorators: [
(Story) => (
<div style={{ width: '375px', border: '1px solid #ccc' }}>
<Story />
</div>
),
],
tags: ['autodocs'],
};
export default meta;
type Story = StoryObj<typeof Box>;
// 🎯 기본 사용 예시
export const Default: Story = {
args: {
title: '박스 제목',
children: <p>콘텐츠 영역입니다.</p>,
},
};
// 🔗 더보기 버튼 예시
export const WithButtonLabel: Story = {
name: '더보기 버튼',
args: {
showMore: true,
showMoreText: '더보기',
path: '/more',
children: <p>더보기 버튼이 있는 콘텐츠</p>,
},
};
// 📋 전체보기 버튼 예시
export const WithAllButton: Story = {
name: '전체보기 버튼',
args: {
showMore: true,
showMoreText: '전체보기',
path: '/all',
children: <p>전체보기 콘텐츠</p>,
},
};
⚛️ React
🏗️ React 패턴 및 네이밍 규칙
패턴 | 규칙 | 예시 |
---|---|---|
고차 컴포넌트 | with 접두사 |
withAuth , withLoading |
Context | Context 접미사 |
UserContext , ThemeContext |
Custom Hook | use 접두사 |
useAuth , useLocalStorage |
// ✅ 권장: 개별 import
import { ReactNode, FC } from 'react';
// ❌ 비권장: 네임스페이스 import
import React from 'react';
const node: React.ReactNode = <div />;
// ✅ 권장: 화살표 함수 + 타입 정의
interface ButtonProps {
text: string;
onClick: () => void;
}
const Button: FC<ButtonProps> = ({ text, onClick }) => {
return <button onClick={onClick}>{text}</button>;
};
- 질문 많이하기
- 문제 생겼을 때 바로 얘기하기
🔍 코드 리뷰 규칙
🎯 품질 높은 코드를 위한 리뷰 문화 매일 아침 코드 리뷰를 통해 서로의 코드를 학습하고 개선점을 찾아갑니다.
- 매일 아침 코드 리뷰 후 작업 시작
- 2명 이상의 리뷰어 승인 후 머지
- 코드 리뷰에 충분한 시간 할애하기
- 근거 있는 피드백을 위해 의견 제시 시 레퍼런스 첨부
- 작은 컨벤션은 정적 분석도구를 활용하여 강제하고,리뷰어는 코드의 품질과 비즈니스 로직에만 집중합니다
- 비판이나 제안을 활발히 하자
- 칭찬도 적극적으로
📝 PR (Pull Request) 가이드라인
📖 명확한 문서화를 통한 효율적인 협업 PR은 단순한 코드 제출이 아닌, 고민과 해결 과정을 공유하는 소통의 도구입니다.
- 리뷰 퀄리티를 위해 PR은 작게, 문서는 크게
- PR 작성자는 작업에 대한 설명을 명확히 남기기
-
변경사항의 맥락과 배경
- 어떤 문제를 해결하고자 했는지
- 왜 이런 방식으로 접근했는지
-
고민의 흔적
- 작은 작업이라도 고민한 부분 상세히 기록
- 대안들을 검토했다면 왜 현재 방식을 선택했는지
-
해결 과정
- 문제 해결을 위한 단계별 접근법
- 시도했던 다른 방법들과 결과
-
Trade-off 분석
- 현재 해결책의 장단점
- 향후 개선 가능한 부분
-
QA 체크리스트
- 기획 요구사항 명세서의 모든 항목 체크
- 각 요구사항별 구현 완료 여부 확인
- 기획자 요구사항 명세서를 PR에 복사 붙여넣기
- 체크박스 형태로 모든 요구사항 검증
- QA 최소화를 위한 자체 검증 완료
💻 커밋 및 코드 관리
🔧 체계적인 버전 관리와 코드 품질 유지 일관된 커밋 메시지와 의미있는 코드 구조를 통해 프로젝트의 가독성을 높입니다.
- 커밋 메시지 컨벤션 통일 (lefthooks 활용)
- 커밋은 하나의 의미있는 변경사항 별로 최대한 작은 단위로
- 컨벤션 잘 지키기
- // @TODO 형태로 향후 개선 사항 기록
- 노티하고 싶은 부분에 주석 적극 활용
- 코드의 의도와 맥락을 명확히 전달
📚 문서화 중요성
📖 지식 축적과 성장을 위한 문서화 문서화는 개인의 성장과 팀의 지식 공유에 큰 도움이 됩니다.
- 개인 성장에 도움
- 팀 지식 공유
- 막히는 부분이나 문제 발생 시 즉시 노션에 기록
- 해결 과정과 결과까지 상세히 문서화
- 정기적인 문서 업데이트와 공유
🎯 요구사항 파악 프로세스
🔍 명확한 요구사항 파악을 통한 효율적인 개발 요구사항 파악은 협업의 시작점이자 개발자가 빠르게 성장할 수 있는 핵심 역량입니다.
개발은 TO-BE와 AS-IS의 차이(diff)를 구현하는 것입니다.
- TO-BE: 기획자/디자이너가 기대하는 결과물
- AS-IS: 현재 코드의 상태
- diff: 개발해야 할 범위 = TO-BE - AS-IS
-
TO-BE 파악
- 기획자에게 정책 상세 요청
- 디자이너에게 시안 꼼꼼히 검토
-
AS-IS 파악
- 현재 코드에서 수정 필요 부분 확인
- 기존 구조와 로직 이해
-
diff 계산
- 필요한 변경사항 정리 (API, UI 등)
- 서버 개발자, 디자이너와 협의
-
공유
- 정리한 요구사항을 팀원과 공유
- 피드백 받아 이해도 맞추기
- 페이지 단위로 파악하기
- 페이지별 API 변경사항 파악
- 작업 계획 초안 작성 후 팀원 리뷰
- 도메인 지식 익히기
🤝 소통 문화
- 편하게 질문하기
- 개발 시 질문 및 답변 활발히 하기
- 내 힘으로 할 수 있는 건 최대한 해보되, 막히면 바로 질문
- 파트 간, 파트 내 소통 활발히 하기
- 조금이라도 모르는 거나 이해가지 않는 사안이 생기면 바로바로 말하기
- 문제 상황 공유를 통한 빠른 해결
└── src/
├── app/ // route VIEW
│ ├── index.html
│ └── App.tsx
├── pages/ // VIEW -> 화면의 구조를 파악
│ ├── home/
│ │ └── page.tsx
│ ├── report/
│ ├── landing/
│ ├── onboarding/
│ ├── mypage/
│ └── community/
│ ├── detail/
│ │ └── page.tsx
│ ├── write/
│ │ └── page.tsx
│ └── page.tsx
├── widgets/ // 뷰 내부 로직, 컴포넌트,... 의 기능
│ ├── home/
│ ├── report/
│ │ ├── configs/ // 상수
│ │ ├── components/ // 해당 도메인 내 components, section
│ │ ├── hooks/
│ │ └── utils/
│ ├── landing/
│ ├── onboarding/
│ ├── mypage/
│ └── community/
└── shared/
├── configs/
├── components/
├── hooks/
├── api/
│ ├── domain/
│ │ ├── home/
│ │ │ └── queries.ts
│ │ ├── report/
│ │ │ └── queries.ts
│ │ ├── landing/
│ │ ├── onboarding/
│ │ ├── mypage/
│ │ └── community/
│ ├── query.keys.ts // 모든 쿼리 키는 shared 에서 관리
│ └── types.ts // 모든 api type는 shared 에서 관리
└── utils/
└── packages/
├── bds-ui/
└── bds-icons/