[회고] chap-chap

kimiΒ·2024λ…„ 2μ›” 3일
4
post-thumbnail

github
figma

ν”„λ‘œμ νŠΈ κ°œμš”

chap-chap 은 λ‹€μ–‘ν•œ λ ˆμ‹œν”Όλ₯Ό 검색할 수 μžˆλŠ” μ‚¬μ΄νŠΈμž…λ‹ˆλ‹€

곡곡 데이터 ν¬ν„Έμ˜ OpenApi μ‹ν’ˆμ˜μ•½ν’ˆ μ•ˆμ „μ²˜ μ‘°λ¦¬μ‹ν’ˆλ ˆμ‹œν”Ό 와 πŸ₯œPeanutλ‹˜μ˜ λ°±μ—”λ“œ Apiλ₯Ό ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€

총 3λͺ…이 μ°Έμ—¬ν•˜μ˜€κ³  2024-01-19 ~ 2024-01-30 총 12일 λ™μ•ˆ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€
λ‚˜λ¨Έμ§€ κΈ°κ°„μ—λŠ” 배포 κ³Όμ • 쀑 맞λ‹₯뜨린 μžμž˜ν•œ 였λ₯˜λ“€μ„ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€


μ—­ν•  λΆ„λ‹΄ 및 λͺ©ν‘œ

μ—­ν•  λΆ„λ‹΄ 방식

♣️ Planning Poker
"λ‚΄κ°€ 이 νŽ˜μ΄μ§€λ₯Ό μ§„ν–‰ν•œλ‹€λ©΄ μ–΄λŠ μ •λ„μ˜ μ‹œκ°„μ΄ 걸릴 것인가, λ‚˜μ—κ² μ–΄λ–€ λ‚œμ΄λ„μΈκ°€"λ₯Ό 두고 κ°€μž₯ 적게 λ°°νŒ…ν•œ μ‚¬λžŒμ΄ ν•΄λ‹Ή ν”„λ‘œμ νŠΈλ₯Ό 진행

λ‚˜μ˜ μ—­ν• 

νšŒμ› κ°€μž… 및 둜그인 & 검색 νŽ˜μ΄μ§€

λͺ©ν‘œ

1. 적극적인 ν˜‘μ—…

  • Linear
  • github Pull requests + Issues 적극 ν™œμš©
  • JSDocs

2. μ™„μ„±λ³΄λ‹€λŠ” "μ„±μž₯"에 집쀑, λ†“κ³ μ˜¨ λΆ€λΆ„λ“€ 보강!

κ·Έ 전에 ν”„λ‘œμ νŠΈλ₯Ό ν•  λ•ŒλŠ” λͺ©ν‘œκ°€ 완성에 μΉ˜μš°μ³μ Έμ„œ,
μ‹œκ°„μ΄ 였래 걸릴 κ±° 같은 λΆ€λΆ„μ΄λ‚˜ μƒˆλ‘œμš΄ μŠ€νƒλ“€μ„ μ‹œλ„ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ μ΄λ²ˆμ—λŠ” νŒ€μ› λΆ„λ“€κ³Όμ˜ ν•©μ˜ ν•˜μ— μ„±μž₯κ³Ό ν˜‘μ—…μ— μ΄ˆμ μ„ 맞좰 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

3. μƒˆλ‘œμš΄ 기술 μŠ€νƒ λ„μž…

  • react-hook-form + zod
  • typescript + react
  • react query
  • tailwind css
  • lottiefiles

λͺ©ν‘œ 달성 μ—¬λΆ€ 및 μ„±κ³Ό

1. ν˜‘μ—… βœ…

λ¦¬λ‹ˆμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 백둜그, 이슈, 리뷰가 ν•„μš”ν•œ ν•­λͺ© λ“± 진행사항듀을 ν•œ λˆˆμ— νŒŒμ•…ν•˜μ—¬ 보닀 직관적이고 효율적으둜 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€

Github Pull Requestμ‹œ λͺ¨λ“  쑰원듀이 리뷰에 적극적으둜 μ°Έμ—¬ν•˜λŠ” λͺ¨μŠ΅μž…λ‹ˆλ‹€

이 과정을 톡해 λΆˆν•„μš”ν•œ 주석을 μ‚­μ œν•˜κ±°λ‚˜, 본인이 μ§„ν–‰ν•˜μ§€ μ•Šμ€ νŒŒνŠΈλ‚˜ κΈ°λŠ₯에 λŒ€ν•œ λ‚΄μš©μ„ λ¦¬λ·°ν•˜λ©° ν”„λ‘œμ νŠΈ 이해도λ₯Ό 높일 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€

일뢀 λ‚΄μš© 캑쳐

PR Template을 ν™œμš©ν•˜μ—¬ 체계적인 리뷰λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€

JSDocsλ₯Ό ν™œμš©ν•˜μ—¬ μ§μ ‘λ§Œλ“  hookν•¨μˆ˜λ₯Ό λ¬Έμ„œν™”ν•˜μ˜€μŠ΅λ‹ˆλ‹€

github issuessλ₯Ό ν™œμš©ν•˜μ—¬ λ°μΌλ¦¬μŠ€ν¬λŸΌμ„ μž‘μ„±ν•˜κ³  λŒ“κΈ€λ‘œ 맀일 회고λ₯Ό ν•˜μ˜€μœΌλ©°,
쑰원듀과 issueλ₯Ό κ³΅μœ ν•˜κ³  λ¬Έμ„œλ₯Ό ν†΅ν•œ κ°„λ‹¨ν•œ νšŒμ˜λ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€

2. μ„±μž₯ βœ…

🐣 κ·Έ μ „ ν”„λ‘œμ νŠΈμ—μ„œ ν•˜κ³  μ‹Άμ—ˆμ§€λ§Œ μ‹œκ°„ 관계상 ν•˜μ§€ μ•Šμ•˜λ˜ μ• λ‹ˆλ©”μ΄μ…˜, λκΉŒμ§€ 작고 ν•΄λ΄€μŠ΅λ‹ˆλ‹€!

  • νšŒμ›κ°€μž… <-> 둜그인 νΌμ „ν™˜ μ• λ‹ˆλ©”μ΄μ…˜ 및 lottifilesν™œμš©ν•œ λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜

  • 검색 input μ• λ‹ˆλ©”μ΄μ…˜

3. μƒˆλ‘œμš΄ 기술 μŠ€νƒ λ„μž… βœ…

- react hook form + zod

typescriptλ₯Ό κΈ°λ°˜μœΌλ‘œν•˜λŠ” κ°•λ ₯ν•œ μŠ€ν‚€λ§ˆ 및 μœ νš¨μ„± 검사 라이브러리인 zodλ₯Ό RHF와 κ²°ν•©ν•˜μ—¬ λΉ„λ™κΈ°μ μœΌλ‘œλ„ μœ νš¨μ„± 검사λ₯Ό ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€

import { z } from 'zod';
import { REGEXP } from './regexp';

export const SignUpSchema = z
    .object({
        nickname: z
            .string()
            .nonempty('별λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.')
            .min(2, { message: '두 κΈ€μž 이상 μ—¬λŸ κΈ€μž μ΄ν•˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”' })
            .max(8, { message: '두 κΈ€μž 이상 μ—¬λŸ κΈ€μž μ΄ν•˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”' }),
        userId: z
            .string()
            .nonempty('아이디λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.')
            .regex(REGEXP.userId, { message: '4자리 이상 10자리 μ΄ν•˜μ˜ 영문자 λ˜λŠ” 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”' }),
        password: z
            .string()
            .nonempty('λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.')
            .regex(REGEXP.password, { message: '8자리 이상 16자리 μ΄ν•˜μ˜ μ˜λ¬Έμžμ™€ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”' }),
        checkPw: z.string(),
    })
    .refine((data) => data.password === data.checkPw, {
        path: ['checkPw'],
        message: 'λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€',
    });

export type SignUpType = z.infer<typeof SignUpSchema>;

export const SignInSchema = z.object({
    userId: z.string().regex(REGEXP.userId, { message: '4자리 이상 10자리 μ΄ν•˜μ˜ 영문자 λ˜λŠ” 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”' }),
    password: z.string().regex(REGEXP.password, { message: '8자리 이상 16자리 μ΄ν•˜μ˜ μ˜λ¬Έμžμ™€ 숫자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”' }),
});

export type _SignInType = z.infer<typeof SignInSchema>;

export type SignInType = _SignInType & {
    token: string;
};

z.infer을 톡해 μ •μ˜ν•œ μŠ€ν‚€λ§ˆλ₯Ό λ°”νƒ•μœΌλ‘œ κ°„νŽΈν•˜κ²Œ νƒ€μž…μ„ μΆ”λ‘ ν•˜κ³  ν™•μž₯ν•©λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈν•˜κΈ°μ—λ“€ μš©μ΄ν•˜κ³ , 였λ₯˜ 메세지도 λͺ…ν™•ν•œ 라이브러리둜 μž₯점이 λ§ŽμŠ΅λ‹ˆλ‹€!

- react + typescript

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό λ„μž…ν•˜μ—¬ νƒ€μž… μ•ˆμ •μ„±μ„ 높이고 μ½”λ“œλ₯Ό λ¬Έμ„œν™”ν–ˆμŠ΅λ‹ˆλ‹€
+νƒ€μž…μ΄ 잘 μ •μ˜λœ κ²½μš°μ—” λ¦¬νŒ©ν† λ§ κ³Όμ •μ—μ„œμ˜ λŸ°νƒ€μž„ 였λ₯˜κ°€ μ΅œμ†Œν™”λ˜λŠ” 이점이 μžˆμŠ΅λ‹ˆλ‹€

- react-query

λ¦¬μ•‘νŠΈ 기반의 μƒνƒœ 및 데이터 관리 라이브러리인 react-queryλ₯Ό ν™œμš©ν•˜μ—¬
데이터λ₯Ό μΊμ‹±ν•˜κ³  λ°μ΄ν„°μ˜ μ—…λ°μ΄νŠΈμ™€ 변경을 μœ μ—°ν•˜κ²Œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€
νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ‚¬μš©μžλ₯Ό μœ„ν•œ νƒ€μž… 지원이 μš°μˆ˜ν•œ λ¦¬μ•‘νŠΈ 쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬, μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ λ†’μ˜€μŠ΅λ‹ˆλ‹€
μ»€μŠ€ν…€ 훅을 λ§Œλ“€μ–΄ λ‘œμ§μ„ λͺ¨λ“ˆν™”ν•˜κ³  μž¬μ‚¬μš©μ„±μ„ λ†’μ˜€μŠ΅λ‹ˆλ‹€


μ–΄λ €μ› λ˜ 점 & μ•Œκ²Œ 된 점 & κ°œμ„  λ°©μ•ˆ

1. ν˜‘μ—…ν•˜λŠ”λ° 생각보닀 많이 λ“€μ—ˆλ˜ μ‹œκ°„

μ΄λ ‡κ²ŒκΉŒμ§€ μ§„μ‹¬μœΌλ‘œ ν˜‘μ—…ν•˜λŠ” 것이 처음이라 pr template도 λ§Œλ“€κ³ ,
λ¦¬λ‹ˆμ–΄ μ‚¬μš©λ²•λ„ 읡히고, git issues및 pr을 ν™œμš©ν•˜λŠ” 것이 μ΅μˆ™μΉ˜ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
jira도 ν–ˆλ‹€κ°€ λ¦¬λ‹ˆμ–΄μ™€ λ‘˜ 쀑 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•˜λŠ” 게 쒋을 κ±° κ°™μ•„μ„œ, μ—ŽκΈ°λ„ν•˜κ³ ...@

κ·Έλž˜μ„œ λ¦¬μ†ŒμŠ€κ°€ λ‚­λΉ„λ˜μ—ˆκ³  μ‹œκ°„ λΆ€μ‘±μœΌλ‘œ λͺΈμ΄.. 무리λ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€

처음이라 μ΅μˆ™μΉ˜ μ•Šμ•„μ„œ 그랬던 κ²ƒμ΄λ‹ˆ, λ‹€μŒμ—λŠ” 더 잘 ν•  수 μžˆμ„ κ±° κ°™μŠ΅λ‹ˆλ‹€.
μ΄λ ‡κ²Œ ν˜‘μ—…μ„ ν•˜λ©΄ 저도 쑰원듀도 μ–»μ–΄κ°€λŠ” 것이 많고, μ‹€μ œλ‘œ 버그λ₯Ό 미리 λ°œκ²¬ν•˜κΈ°λ„ ν•˜μ—¬ μœ μ§€λ³΄μˆ˜λ‚˜ λ¦¬νŒ©ν† λ§ν•˜λŠ” μ‹œκ°„μ΄ μ€„μ–΄λ“œλŠ” 이점이 μžˆμ–΄ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

2. μ΅μˆ™μΉ˜ μ•Šμ•˜λ˜ Api μ‚¬μš© 및 λΉ„μ¦ˆλ‹ˆμŠ€ 섀계 λΆ€μ‘±

이번 ν”„λ‘œμ νŠΈλ₯Ό ν•˜λŠ”λ°μ— μžˆμ–΄μ„œ λ°±μ—”λ“œ Api에 λŒ€ν•œ μ΄ν•΄λ„λ‚˜ 뢄석이 λΆ€μ‘±ν•˜μ—¬,
μ‹€μ œλ‘œ κ°œλ°œμ„ μ§„ν–‰ν•˜λŠ” 데에 κ΅¬ν˜„μ΄ μ•ˆλ˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ €λ‹€ μ‹œκ°„μ„ λ‚­λΉ„ν•˜κΈ°λ„ ν•˜μ˜€κ³ , λΆˆλŸ¬μ˜€λŠ” 과정이 μˆœνƒ„μΉ˜ μ•Šμ•˜λ˜ κ±° κ°™μŠ΅λ‹ˆλ‹€.

ν•¨κ»˜ μž‘μ—…μ„ ν–ˆλ˜ 쑰원 Amyλ‹˜κ³Ό 이λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ ν•œ 번 ν”„λ‘œμ νŠΈλ₯Ό 진행할 μ˜ˆμ •μž…λ‹ˆλ‹€.
(섀계λ₯Ό μ•„μ˜ˆ ν•˜λ£¨ λ‚  μž‘κ³ ν•˜μ—¬ inputκ³Ό output을 μ˜ˆμƒν•΄λ³΄λŠ” μž‘μ—…)


마무리

쒋은 ν˜‘μ—…λ¬Έν™”λ₯Ό ν•¨κ»˜ λ§Œλ“€μ–΄μ€€ μ‘°μ›λ“€μ—κ²Œ λ„ˆλ¬΄ κ°μ‚¬ν•˜κ³ ,
처음 μ‚¬μš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ— μ΅μˆ™ν•΄μ§€λŠλΌ μ‹œκ°„μ΄ 걸림을 μ–‘ν•΄λ₯Ό κ΅¬ν–ˆμ„ λ•Œ,
λ„ˆκ·ΈλŸ¬μ΄ λ°›μ•„μ€˜μ„œ κ³ λ§ˆμ› μŠ΅λ‹ˆλ‹€!

같이 λ°€μƒˆκ³  κ³ λ―Όν•˜λŠ” 쑰원듀이 μžˆμ—ˆκΈ°μ—,
λ§‰νžˆκ³  λ‹΅λ‹΅ν–ˆλ˜ μˆœκ°„μ—λ„ λ©˜νƒˆμ„ 작고 ν•  수 μžˆμ—ˆλ˜ κ±° κ°™μŠ΅λ‹ˆλ‹€.

λ‹€μŒ ν”„λ‘œμ νŠΈ 진행 μ‹œμ—λŠ” κ°œμ„  λ°©μ•ˆμ„ μ„Έμ›Œλ†¨μœΌλ‹ˆ 쑰금 더 νƒ„νƒ„ν•˜κ²Œ 틀을 작고,
μ•„μ‰¬μ› λ˜ 점듀을 κ·Ήλ³΅ν•˜μ—¬ ν•œμΈ΅ 더 μ™„μ„±λ„μžˆλŠ” ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€μ–΄λ‚΄κ³  μ„±μž₯ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€!

profile
no namae wa

0개의 λŒ“κΈ€