π Links
chap-chap μ λ€μν λ μνΌλ₯Ό κ²μν μ μλ μ¬μ΄νΈμ λλ€
곡곡 λ°μ΄ν° ν¬νΈμ OpenApi μνμμ½ν μμ μ² μ‘°λ¦¬μνλ μνΌ μ π₯Peanutλμ λ°±μλ Apiλ₯Ό νμ©νμμ΅λλ€
μ΄ 3λͺ
μ΄ μ°Έμ¬νμκ³ 2024-01-19 ~ 2024-01-30 μ΄ 12μΌ λμ μ§ννμμ΅λλ€
λλ¨Έμ§ κΈ°κ°μλ λ°°ν¬ κ³Όμ μ€ λ§λ₯λ¨λ¦° μμν μ€λ₯λ€μ μμ νμμ΅λλ€
β£οΈ Planning Poker
"λ΄κ° μ΄ νμ΄μ§λ₯Ό μ§ννλ€λ©΄ μ΄λ μ λμ μκ°μ΄ 걸릴 κ²μΈκ°, λμκ² μ΄λ€ λμ΄λμΈκ°"λ₯Ό λκ³ κ°μ₯ μ κ² λ°°ν
ν μ¬λμ΄ ν΄λΉ νλ‘μ νΈλ₯Ό μ§ν
νμ κ°μ λ° λ‘κ·ΈμΈ & κ²μ νμ΄μ§
1. μ κ·Ήμ μΈ νμ
2. μμ±λ³΄λ€λ "μ±μ₯"μ μ§μ€, λκ³ μ¨ λΆλΆλ€ 보κ°!
κ·Έ μ μ νλ‘μ νΈλ₯Ό ν λλ λͺ©νκ° μμ±μ μΉμ°μ³μ Έμ,
μκ°μ΄ μ€λ 걸릴 κ±° κ°μ λΆλΆμ΄λ μλ‘μ΄ μ€νλ€μ μλνμ§ λͺ»νμ΅λλ€.
νμ§λ§ μ΄λ²μλ νμ λΆλ€κ³Όμ ν©μ νμ μ±μ₯κ³Ό νμ
μ μ΄μ μ λ§μΆ° νλ‘μ νΈλ₯Ό μ§ννμμ΅λλ€.
3. μλ‘μ΄ κΈ°μ μ€ν λμ
react-hook-form
+ zod
typescript
+ react
react query
tailwind css
lottiefiles
리λμ΄λ₯Ό μ¬μ©νμ¬ λ°±λ‘κ·Έ, μ΄μ, λ¦¬λ·°κ° νμν νλͺ© λ± μ§νμ¬νλ€μ ν λμ νμ
νμ¬ λ³΄λ€ μ§κ΄μ μ΄κ³ ν¨μ¨μ μΌλ‘ νλ‘μ νΈλ₯Ό μ§ννμμ΅λλ€
Github Pull Requestμ λͺ¨λ μ‘°μλ€μ΄ 리뷰μ μ κ·Ήμ μΌλ‘ μ°Έμ¬νλ λͺ¨μ΅μ λλ€
μ΄ κ³Όμ μ ν΅ν΄ λΆνμν μ£Όμμ μμ νκ±°λ, λ³ΈμΈμ΄ μ§ννμ§ μμ ννΈλ κΈ°λ₯μ λν λ΄μ©μ 리뷰νλ©° νλ‘μ νΈ μ΄ν΄λλ₯Ό λμΌ μ μμμ΅λλ€
μΌλΆ λ΄μ© μΊ‘μ³
PR Templateμ νμ©νμ¬ μ²΄κ³μ μΈ λ¦¬λ·°λ₯Ό μ§ννμμ΅λλ€
JSDocsλ₯Ό νμ©νμ¬ μ§μ λ§λ hookν¨μλ₯Ό λ¬Έμννμμ΅λλ€
github issuessλ₯Ό νμ©νμ¬ λ°μΌλ¦¬μ€ν¬λΌμ μμ±νκ³ λκΈλ‘ λ§€μΌ νκ³ λ₯Ό νμμΌλ©°,
μ‘°μλ€κ³Ό issueλ₯Ό 곡μ νκ³ λ¬Έμλ₯Ό ν΅ν κ°λ¨ν νμλ μ§ννμ΅λλ€
π£ κ·Έ μ νλ‘μ νΈμμ νκ³ μΆμμ§λ§ μκ° κ΄κ³μ νμ§ μμλ μ λλ©μ΄μ , λκΉμ§ μ‘κ³ ν΄λ΄€μ΅λλ€!
lottifiles
νμ©ν λ‘λ© μ λλ©μ΄μ
- 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μ μμν΄λ³΄λ μμ )
μ’μ νμ
λ¬Ένλ₯Ό ν¨κ» λ§λ€μ΄μ€ μ‘°μλ€μκ² λ무 κ°μ¬νκ³ ,
μ²μ μ¬μ©νλ λΌμ΄λΈλ¬λ¦¬μ μ΅μν΄μ§λλΌ μκ°μ΄ κ±Έλ¦Όμ μν΄λ₯Ό ꡬνμ λ,
λκ·Έλ¬μ΄ λ°μμ€μ κ³ λ§μ μ΅λλ€!
κ°μ΄ λ°€μκ³ κ³ λ―Όνλ μ‘°μλ€μ΄ μμκΈ°μ,
λ§νκ³ λ΅λ΅νλ μκ°μλ λ©νμ μ‘κ³ ν μ μμλ κ±° κ°μ΅λλ€.
λ€μ νλ‘μ νΈ μ§ν μμλ κ°μ λ°©μμ μΈμλ¨μΌλ μ‘°κΈ λ νννκ² νμ μ‘κ³ ,
μμ¬μ λ μ λ€μ 극볡νμ¬ νμΈ΅ λ μμ±λμλ νλ‘μ νΈλ₯Ό λ§λ€μ΄λ΄κ³ μ±μ₯νκ³ μΆμ΅λλ€!