[9ν μ νμ€] Chapter π¦ 3-1. νλ‘ νΈμλ ν μ€νΈ μ½λ π¦#41
[9ν μ νμ€] Chapter π¦ 3-1. νλ‘ νΈμλ ν
μ€νΈ μ½λ π¦#41jun17183 wants to merge 37 commits intohanghae-plus:hardfrom
Conversation
|
μ΄λ²μ£Όλ κ³ μλ§μΌμ
¨μ΅λλ€~ |
susmisc14
left a comment
There was a problem hiding this comment.
μλ
νμΈμ! AI μ½λ 리뷰μ΄μ
λλ€. π€
[HARD] 7μ£Όμ°¨ κ³Όμ : μΊλ¦°λ μλΉμ€ ν
μ€νΈ Pull Requestμ λν 리뷰λ₯Ό μλ£νμ΄μ. ν¨κ» μ½λλ₯Ό λ λ°μ μμΌ λ³ΌκΉμ?
Note
β¨ μ΄λ² PR ν μ€ μμ½
κ±°λν App μ»΄ν¬λνΈλ₯Ό ν
μ€νΈ κ°λ₯ν λ¨μλ‘ μ±κ³΅μ μΌλ‘ λΆλ¦¬νκ³ , ν
μ€νΈ 격리λ₯Ό μν Mock Handler ν©ν 리 ν¨ν΄μ νλ₯νκ² μ μ©νμ¬ μ½λμ νμ§κ³Ό ν
μ€νΈ μ©μ΄μ±μ κ·Ήμ μΌλ‘ ν₯μμμΌ°μ΅λλ€.
π― ν΅μ¬ 리뷰 μμ½
κ°μ₯ μ€μν κ°μ ν¬μΈνΈλΆν° λΉ λ₯΄κ² νμΈν΄ 보μΈμ.
- Monolith μ»΄ν¬λνΈμ μ±κ³΅μ μΈ λΆλ¦¬: κ±°λν
App.tsxλ₯Ό λͺ©μ μ λ°λΌ λͺ ννκ² λΆλ¦¬νμ¬ μμ§λλ₯Ό λμ΄κ³ ν μ€νΈ μ©μ΄μ±μ κ·Ήλννμ΅λλ€. - μ°μν Mocking μ λ΅:
createHandlerν©ν 리 ν¨μλ₯Ό ν΅ν΄ λ°λ³΅μ μΈ MSW νΈλ€λ¬ μ½λλ₯Ό μΆμννκ³ , κ° ν μ€νΈμ λ 립μ±μ μλ²½νκ² λ³΄μ₯νμ΅λλ€. - μ λ¬Έμ μΈ ν
μ€νΈ λ°μ΄ν° κ΄λ¦¬:
eventFactoryλ₯Ό λμ νμ¬ ν μ€νΈ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ ν μ°¨μ λμμ΅λλ€. - [μ¬ν μ§λ¬Έ] 곡μ μν ν
μ€νΈμ μν :
handlersμhandlersUtilsμ μν μ λν μ§λ¬Έμ λͺ νν μ¬μ© μλ리μ€μ μ₯λ¨μ μ μ μν©λλ€.
π μμΈ λ¦¬λ·°
κ° νλͺ©μ λν ꡬ체μ μΈ μ€λͺ κ³Ό μ½λ μμλ₯Ό μ€λΉνμ΄μ.
1. The Monolith Slayer: μν€ν μ² κ°μ μ κ΅κ³Όμ
-
π μ’μ μ : 600μ€μ΄ λλ
Appμ»΄ν¬λνΈλ₯ΌCalendarView,EventForm,EventListλ± μκ³ κ΄λ¦¬ κ°λ₯ν λ¨μλ‘ λΆλ¦¬ν κ²μ μ΄λ² κ³Όμ μ ν΅μ¬ λͺ©νλ₯Ό μλ²½νκ² λ¬μ±ν, λ§€μ° νλ₯ν 리ν©ν λ§μ λλ€. κ° μ»΄ν¬λνΈλ μ΄μ λ¨μΌ μ± μμ κ°μ§λ©°, λ 립μ μΌλ‘ μ΄ν΄νκ³ ν μ€νΈνκΈ° ν¨μ¬ μ¬μμ‘μ΅λλ€. -
π‘ κ°μ μ μ: νμ¬
Appμ»΄ν¬λνΈκ° μ΅μμ 컨ν μ΄λλ‘μ λλΆλΆμ μνμ λ‘μ§μ μμμκ²propsλ‘ μ λ¬νλ 'μν λμ΄μ¬λ¦¬κΈ°(Lifting State Up)' ν¨ν΄μ μ¬μ©νκ³ μμ΅λλ€. μ΄λ μμ μ±μμλ νλ₯ν μ νμ΄μ§λ§, μ ν리μΌμ΄μ μ΄ λ 볡μ‘ν΄μ§λ©΄ Prop Drilling λ¬Έμ λ‘ μ΄μ΄μ§ μ μμ΅λλ€. -
π€ μ΄λ κ² μ μνλ μ΄μ : Prop Drillingμ΄λ μνκ° νμ μλ μ€κ° μ»΄ν¬λνΈλ€μ κ±°μ³ μ¬λ¬ λ¨κ³μ κ±Έμ³ propsλ₯Ό μ λ¬νλ κ²μ λ§ν©λλ€. μ΄λ μ»΄ν¬λνΈ κ°μ κ²°ν©λλ₯Ό λμ¬ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ μ ν΄ν μ μμ΅λλ€. μ§κΈ λΉμ₯ μμ ν νμλ μμ§λ§, μ΄λ° ꡬ쑰μ μ₯λ¨μ μ μΈμ§νκ³ React Context APIλ Zustand κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬κ° μΈμ νμνμ§ κ³ λ―Όν΄λ³΄λ κ²μ μ’μ μν€ν μ² μ€κ³ κ²½νμ΄ λ κ²μ λλ€.
-
πΊοΈ μν€ν μ² λ³ν (AS-IS vs TO-BE)
AS-IS: κ±°λν λ¨μΌ μ»΄ν¬λνΈ
graph TD
A[App.tsx] --> B{All States};
A --> C{All UI Rendering};
A --> D{All Event Handlers};
A --> E{All API Calls};
TO-BE: μ± μμ΄ λΆλ¦¬λ μ»΄ν¬λνΈ κ΅¬μ‘° (νμ¬ κ΅¬μ‘°)
graph TD
subgraph App.tsx (Container)
A[States & API Logic]
end
subgraph Children (Presentational)
B[EventForm]
C[CalendarView]
D[EventList]
E[OverlapDialog]
F[NotificationStack]
end
A -- Props --> B;
A -- Props --> C;
A -- Props --> D;
A -- Props --> E;
A -- Props --> F;
μ΄ κ΅¬μ‘°λ κ΄μ¬μ¬ λΆλ¦¬(SoC) μμΉμ μ λ°λ₯΄κ³ μμΌλ©°, κ° μ»΄ν¬λνΈμ μν μ λͺ ννκ² λ§λ€μ΄μ£Όμμ΅λλ€. μ λ§ μνμ ¨μ΅λλ€!
2. Mockingμ μ μ: createHandler ν©ν 리 ν¨ν΄
-
π μ’μ μ :
handlers.tsμcreateHandlerλΌλ ν©ν 리 ν¨μλ₯Ό λ§λ€μ΄μ£Όμ λΆλΆμ μ λ§ μΈμ κΉμμ΅λλ€. ν΄λ‘μ (Closure)λ₯Ό νμ©νμ¬ κ° ν μ€νΈλ§λ€ 격리λ λ°μ΄ν° μ μ₯μλ₯Ό κ°λ νΈλ€λ¬λ₯Ό λμ μΌλ‘ μμ±νλ λ°©μμ ν μ€νΈμ λ 립μ±μ 보μ₯νλ κ°μ₯ μ΄μμ μΈ λ°©λ² μ€ νλμ λλ€.handlersUtils.tsμsetupMockHandlerκ° μ΄ ν©ν 리λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ μ½λκ° κ°κ²°ν΄μ§κ³ μλκ° λͺ νν΄μ‘μ΅λλ€. -
π‘ κ°μ μ μ: νμ¬ κ΅¬μ‘°λ μλ²½μ κ°κΉμ΅λλ€. μ¬κΈ°μ ν κ±Έμ λ λμκ°μλ©΄, νΉμ ν μ€νΈ μλ리μ€λ₯Ό μν **μ¬μ μ μλ νΈλ€λ¬ μ (Handler Set)**μ λ§λ€μ΄λ³Ό μ μμ΅λλ€. μλ₯Ό λ€μ΄, 'μ΄λ²€νΈκ° νλλ μλ μν'λ 'νΉμ μ΄λ²€νΈκ° λ°λμ ν¬ν¨λ μν'λ₯Ό μν ν©ν 리λ₯Ό μΆκ°λ‘ ꡬμ±νλ κ²μ λλ€.
-
π€ μ΄λ κ² μ μνλ μ΄μ : ν μ€νΈλ₯Ό μμ±νλ€ λ³΄λ©΄ λ°λ³΅μ μΌλ‘ μ¬μ©λλ νΉμ λ°μ΄ν° μνκ° μμ΅λλ€. μ΄ μνλ€μ
setupMockHandlerForEmptyEvents(),setupMockHandlerWithSpecificEvent(event)μ κ°μ΄ λͺ μμ μΈ ν¨μλ‘ λ§λ€μ΄λλ©΄, ν μ€νΈ μ½λμ κ°λ μ±μ΄ λμ± ν₯μλκ³ μ€λΉ(Arrange) λ¨κ³κ° κ°κ²°ν΄μ§λλ€. -
π» μ½λ μμ (AS-IS vs TO-BE)
AS-IS (νμ¬λ λ§€μ° νλ₯ν ꡬ쑰)
// src/__mocks__/handlersUtils.ts
export const setupMockHandler = (initEvents: Event[] = []) => {
const events = [...initEvents];
const handlers = createHandler(events);
server.use(...handlers);
};
// test.spec.ts
beforeEach(() => {
setupMockHandler(createEvents(5));
});TO-BE (μλλ¦¬μ€ κΈ°λ°μΌλ‘ νμ₯)
// src/__mocks__/handlersUtils.ts
// κΈ°μ‘΄ setupMockHandlerλ κ·Έλλ‘ λκ³ , μΆκ°λ‘ λ§λλλ€.
export const setupEmptyMockHandler = () => {
server.use(...createHandler([]));
};
export const setupErrorMockHandler = () => {
server.use(...createErrorHandler());
};
// test.spec.ts
describe('μ΄λ²€νΈκ° μλ κ²½μ°', () => {
beforeEach(() => {
setupEmptyMockHandler(); // μλκ° λ λͺ
νν΄μ§λλ€.
});
it('"κ²μ κ²°κ³Όκ° μμ΅λλ€."κ° νμλμ΄μΌ νλ€', () => {
// ...
});
});3. handlersλ μΈμ νμν κΉ? (μ§λ¬Έμ λν λ΅λ³)
μ ν νκ³ μμ λ¨κ²¨μ£Όμ μ§λ¬Έμ λν λ΅λ³μ λλ€.
handlersλ§μ μ¬μ©ν λ³λ ¬μ μ΄μ§ μμ ν μ€νΈ μ½λλ μΈμ νμν κΉμ?
κ²°λ‘ λΆν° λ§μλ리면, κ±°μ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. κ° ν
μ€νΈκ° λ
립μ μΌλ‘ μ€νλλ κ²μ΄ κ°μ₯ μ΄μμ μ΄λ©°, νμ¬ setupMockHandlerλ₯Ό beforeEachμμ μ¬μ©νλ λ°©μμ΄ 99%μ μν©μμ μ¬λ°λ₯Έ μ κ·Όλ²μ
λλ€.
νμ§λ§ handlersλ₯Ό ν΅ν΄ ν
μ€νΈ κ° μνλ₯Ό 곡μ νλ κ²μ΄ μ μ©ν μμ£Ό νΉμν μλ리μ€κ° μ‘΄μ¬νκΈ°λ ν©λλ€. λ°λ‘ μ¬λ¬ ν
μ€νΈ μΌμ΄μ€κ° νλμ μ¬μ©μ μλ리μ€(User Story) λ₯Ό ꡬμ±νμ¬, μμλλ‘ μ€νλμ΄μΌλ§ μλ―Έκ° μμ λμ
λλ€.
- π€ μλλ¦¬μ€ μμ: E2E(End-to-End) ν
μ€νΈμ²λΌ μ¬μ©μμ κΈ΄ μ¬μ μ ν
μ€νΈν λ
test 1: μ¬μ©μκ° μ±κ³΅μ μΌλ‘ λ‘κ·ΈμΈνλ€. (API μν λ³κ²½: λ‘κ·ΈμΈλ¨)test 2: λ‘κ·ΈμΈλ μνμμ μ μΌμ μ μμ±νλ€. (API μν λ³κ²½: μΌμ μΆκ°λ¨)test 3: μμ±λ μΌμ μ΄ λͺ©λ‘μ μ 보μ΄λμ§ νμΈνλ€.test 4: ν΄λΉ μΌμ μ μμ νλ€. (API μν λ³κ²½: μΌμ μμ λ¨)test 5: μμ λ λ΄μ©μ΄ μ λ°μλμλμ§ νμΈνλ€.test 6: μΌμ μ μμ νκ³ λ‘κ·Έμμνλ€.
μ΄λ° ν
μ€νΈλ μ΄μ ν
μ€νΈμ κ²°κ³Ό(Side Effect)μ λ€μ ν
μ€νΈκ° μμ‘΄νκΈ° λλ¬Έμ, server.resetHandlers()λ₯Ό νμ§ μκ³ κ³΅μ λ handlersμ μνλ₯Ό κ³μ μ μ§ν΄μΌ ν©λλ€.
β οΈ λ¨μ λ° μ£Όμμ¬ν:- μ·¨μ½μ±(Fragile): μ΄μ ν μ€νΈ νλκ° μ€ν¨νλ©΄ μ΄ν λͺ¨λ ν μ€νΈκ° μ°μμ μΌλ‘ μ€ν¨ν©λλ€.
- μμ μμ‘΄μ±: ν μ€νΈ μ€ν μμκ° λ³΄μ₯λμ΄μΌ νλ―λ‘ λ³λ ¬ μ€νμ΄ λΆκ°λ₯ν©λλ€.
- λλ²κΉ μ μ΄λ €μ: ν μ€νΈ μ€ν¨ μ, ν΄λΉ ν μ€νΈμ λ¬Έμ μΈμ§ μ΄μ μνμ λ¬Έμ μΈμ§ νμ νκΈ° μ΄λ ΅μ΅λλ€.
λ°λΌμ μ΄λ¬ν λ°©μμ Vitestλ Jest κ°μ λ¨μ/ν΅ν© ν μ€νΈ νλ μμν¬μμλ μν°ν¨ν΄μΌλ‘ κ°μ£Όλλ κ²½μ°κ° λ§μ΅λλ€. Cypressλ Playwright κ°μ E2E ν μ€νΈ λꡬμμλ μ νμ μΌλ‘ μ¬μ©λλ ν¨ν΄μ΄λ, μ§κΈμ²λΌ ν μ€νΈ 격리 μμΉμ μ§ν€λ κ²μ΄ ν¨μ¬ μ€μν©λλ€.
πΊοΈ μ 체 κ°μ λ‘λλ§΅ (μ°μ μμ κ°μ΄λ)
νΌλλ°±μ μ€μλ μμλλ‘ μ λ ¬νμ΄μ. λμ μμλΆν° μ°¨κ·Όμ°¨κ·Ό ν΄κ²°ν΄ λκ°λ κ±Έ μΆμ²ν΄μ.
- WARNING
β οΈ : λΉμ₯ λ¬Έμ λ μμ§λ§, μμΌλ‘μ μ μ§λ³΄μλ₯Ό μν΄ κ°μ μ μ κ·Ή κΆμ₯ν΄μ.- Prop Drilling μΈμ§νκΈ°:
Appμ»΄ν¬λνΈμ μν μ λ€μ νλ² μκ°ν΄λ³΄κ³ , λ ν° μ ν리μΌμ΄μ μμλ μ΄λ€ λ¬Έμ κ° λ°μν μ μμμ§ κ³ λ―Όν΄λ³΄μΈμ. React Context APIκ° μ’μ λμμ΄ λ μ μμ΅λλ€.
- Prop Drilling μΈμ§νκΈ°:
- OPTIONAL π‘: μ½λ νμ§μ ν λ¨κ³ λ λμ΄κΈ° μν μ μμ΄μμ. μ νμ μΌλ‘ μ μ©ν΄ 보μΈμ.
- μλλ¦¬μ€ κΈ°λ° Mock Handler μΆκ°:
setupEmptyMockHandlerμ κ°μ΄ νΉμ ν μ€νΈ μλ리μ€λ₯Ό μν μ νΈ ν¨μλ₯Ό μΆκ°νμ¬ ν μ€νΈ μ½λμ μλλ₯Ό λ λͺ ννκ² λ§λ€μ΄ 보μΈμ. - Test Data Factory vs Fixtures: νμ¬
eventFactoryλ λμ μΈ λλ€ λ°μ΄ν°λ₯Ό μμ±ν©λλ€. νΉμ IDλ κ°μ κ°μ ΈμΌ νλ ν΅ν© ν μ€νΈλ₯Ό μν΄, κ³ μ λ λ°μ΄ν°λ₯Ό μ 곡νλfixtures.tsνμΌμ λ°λ‘ λ§λλ κ²λ μ’μ λ°©λ²μ λλ€.
- μλλ¦¬μ€ κΈ°λ° Mock Handler μΆκ°:
π€ ν κ±Έμ λ: μ½λμ μλ λμ보기
PR λ³Έλ¬Έμ ν΅ν΄ ν
μ€νΈ μ½λμ λν κΉμ κ³ λ―Όκ³Ό μ¦κ±°μμ λλ μ μμμ΅λλ€. νΉν eventFactoryλ₯Ό μ§μ λ§λμ κ³Όμ μ λ§€μ° μΈμ κΉμμ΅λλ€. κ·Έ κ³ λ―Όμ λ°νμΌλ‘ λͺ κ°μ§ μ§λ¬Έμ λ립λλ€.
- λͺ©νμ ꡬνμ μ°κ²°κ³ 리: λ³Έλ¬Έμ μμ±ν΄μ£Όμ 'ν
μ€νΈ μ½λμ λ
립μ±'μ΄λΌλ λͺ©νλ
createHandlerμsetupMockHandlerλ₯Ό ν΅ν΄ νλ₯νκ² λ¬μ±λμμ΅λλ€. νΉμ μ΄ λͺ©νλ₯Ό λ¬μ±νκΈ° μν΄ ν΄λ‘μ λ₯Ό νμ©νλ λ°©μ μΈμ λ€λ₯Έ μν€ν μ²(μ: ν΄λμ€ κΈ°λ° Mock Server)λ₯Ό κ³ λ―Όν΄λ³΄μ ¨λμ? - μ¨κ²¨μ§ μλ νμ
:
medium.integration.spec.tsxνμΌμμinputEventλΌλ ν¬νΌ ν¨μλ₯Ό λ§λμ κ²μ λ°κ²¬νμ΅λλ€. λ°λ³΅μ μΈ νΌ μ λ ₯ λ‘μ§μ μΆμννμ μμ£Ό μ’μ μλμ λλ€! μ΄λ₯Ό ν΅ν΄ ν μ€νΈ μ½λμ κ°λ μ±μ΄ ν¬κ² ν₯μλμμ΅λλ€. - μ€μ€λ‘μκ² λμ§λ μ§λ¬Έ:
- "λ΄κ° λ§λ
EventFormμ»΄ν¬λνΈλuseEventFormν κ³Ό λ무 κ°νκ² κ²°ν©λμ΄ μμ§λ μμκ°? λ§μ½ λ€λ₯Έ νΌ μν κ΄λ¦¬ λ‘μ§μ μ¬μ©νκ² λλ€λ©΄ μΌλ§λ λ§μ μ½λλ₯Ό λ³κ²½ν΄μΌ ν κΉ?" - "Toss Frontend Fundamentalμ μμ§λ(Cohesion) μμΉ κ΄μ μμ,
useEventOperationsν μ API ν΅μ μ΄λΌλ λ¨μΌ μ± μμ μ μννκ³ μλκ°? μλλ©΄ μν κ΄λ¦¬ μν κΉμ§ λ무 λ§μ΄ νκ³ μλκ°?" - "μ΄λ²μ λ§λ
eventFactoryλ ν μ€νΈμ νμν λͺ¨λ μ£μ§ μΌμ΄μ€(μ: μ λͺ©μ΄ μμ£Ό κΈ΄ μ΄λ²€νΈ, μ€λͺ μ΄ μλ μ΄λ²€νΈ)λ₯Ό μ½κ² μμ±ν μ μλκ°?" - "μ΄ μ½λλ₯Ό μ²μ 보λ λλ£λ
handlers.tsμhandlersUtils.tsμ κ΄κ³λ₯Ό λͺ νν μ΄ν΄ν μ μμκΉ? μ£Όμμ΄λ νμΌ κ΅¬μ‘°λ₯Ό ν΅ν΄ λ κ°μ ν μ μλ μ μ μμκΉ?"
- "λ΄κ° λ§λ
π μ°Έκ³ μλ£
λ¬Έμ ν΄κ²°μ λμμ΄ λ λ§ν μλ£λ€μ λͺ¨μλ΄€μ΄μ.
π μΆμ² μν°ν΄
- Avoiding Prop Drilling in React
- Stop using factories for your test data (Kent C. Doddsμ κΈ: Factory ν¨ν΄μ λ€λ₯Έ κ΄μ μ μ μνλ©°, Fixtureμμ μ°¨μ΄μ μ κ³ λ―Όνκ² ν΄μ€λλ€.)
- React μ»΄ν¬λνΈλ₯Ό ν μ€νΈνλ λ°©λ² (λ²μ)
- MSW: Mock Service Worker 곡μ λ¬Έμ - Isolating Tests
μ΄λ² λ¦¬λ·°κ° μ±μ₯μ ν° λμμ΄ λμμΌλ©΄ μ’κ² μ΅λλ€! ν μ€νΈ μ½λμ λν κΉμ κ³ λ―Όκ³Ό νλ₯ν κ²°κ³Όλ¬Όμ λ°μλ₯Ό 보λ λλ€. π
κ³Όμ μ ννκ³
κΈ°μ μ μ±μ₯
μ½λ νμ§
νμ΅ ν¨κ³Ό λΆμ
κ³Όμ νΌλλ°±
리뷰 λ°κ³ μΆμ λ΄μ©
HARD
7μ£Όμ°¨ κ³Όμ 체ν¬ν¬μΈνΈ
κΈ°λ³Έκ³Όμ
μ§λ¬Έ
μ¬ν κ³Όμ
κ³Όμ μ ννκ³
κΈ°μ μ μ±μ₯
κ·Έλμ κ³Όμ λ₯Ό μ§ννλ©° μ²μμΌλ‘ ν μ€νΈ μ½λλ₯Ό λ§μ£Όνμ΅λλ€. μ²μμλ κ³Όμ ν΅κ³Όλ§μ λ°λΌλ³΄λ€ 보λ ν μ€νΈ μ½λκ° λ―Έμ μ§λ§, νν΄ μ£Όμ°¨κ° μ§νλ μλ‘ ν μ€νΈ μ½λμ μμ‘΄νλ μμ μ λ°κ²¬ν μ μμμ΅λλ€. κ·Έλ¬λ μ€ ν μ€νΈ μ½λκ° μλ 6μ£Όμ°¨ κ³Όμ λ₯Ό λ§μ£Όνμμ΅λλ€. μΈμΌ ν μ€νΈ μ½λκ° κ·Έλ¦¬μ μ΅λλ€. μ΄μ ν μ€νΈ μ½λ μμ΄ μ΄ μ μλ λͺΈμ΄ λμ΄λ²λ Έμ΅λλ€.
μ΄λ²μ μ²μ μμ±ν΄ λ³Έ ν μ€νΈ μ½λμμ§λ§, λκ² μ¬λ°κ³ μ λ§λ€λ λλμ΄ λ€μμ΅λλ€. μ λͺ¨λ₯΄λ μνμμ λ μ¬λ Έλ ν μ€νΈ μ½λ μ² νμ΄ μ€μ λ‘ ν μ€νΈ μ½λμμ μ€μνκ² λ€λ£¨λ κ°μΉμμμ κΈ°λ»€κ³ , ν μ€νΈ νλ¦μ λ°λΌ μμ°¨μ μΌλ‘ μμ±νλ κ² λν μ¦κ±°μ μ΅λλ€. μλ§ μμΌλ‘ ν μ€νΈ μ½λλ₯Ό μ κ·Ήμ μΌλ‘ μ¬μ©ν΄ λ³΄μ§ μμκΉ μκ°ν©λλ€.
μ½λ νμ§
1. μ΄λ²€νΈ ν©ν 리
ν μ€νΈ μ½λλ κ·Έ μμ²΄λ‘ λ 립μ μ΄μ΄μΌ μ’μ μ½λλΌκ³ μκ°νμ΅λλ€. μ΄ μκ°μ λ©ν λ§κ³Ό QnA μκ°μ ν΅ν΄ λμ± κ²¬κ³ ν΄μ‘μ΅λλ€. κ·Έλμ μ΄κΈ°μ λ€μκ³Ό κ°μ΄ μ§μ νλμ½λ©νμ¬ ν μ€νΈ λ°μ΄ν°λ₯Ό κ΄λ¦¬νμμ΅λλ€.
μμ κ°μ λ°μ΄ν°λ₯Ό λ§€ μ½λλ§λ€ μ μΈν΄ μ£Όμ΄λ λμμ§ μλ€κ³ μκ°ν©λλ€. λ€λ§ λ°μ΄ν° μμ΄ λ§μμ§κ±°λ μμ±μ΄ λ무 λ§μΌλ©΄ λ¬Έμ κ° λ μ μλ€κ³ μκ°ν©λλ€. ν μ€νΈ μ½λ μ체 λ§μΌλ‘ λ 립μ μΈ κ²λ μ€μν κ°μΉμ§λ§, κ²°κ΅ ν μ€νΈ μ½λλ μ¬λμ΄ μ½λ μ½λμ΄κΈ°μ κ°λ μ±μ μν΄μ μ΄λ μ λ ννμ΄ νμνλ€κ³ μκ°νμ΅λλ€.
μ²μμ
fixtureν΄λλ₯Ό λ§λ€μ΄ λͺ¨λ ν μ€νΈμ μ μ©ν μ μλ λ°μ΄ν°λ₯Ό λ§λ€μμ΅λλ€. νμ§λ§ νλμ λ°μ΄ν° λͺ©λ‘μΌλ‘ ν μ€νΈλ₯Ό 컀λ²νκΈ°μ λ무 λ§μ λ°μ΄ν°κ° νμνκ³ , μ΄ κ³Όμ μμ κ°λ μ±μ΄λ λ°μ΄ν° μ μ§λ³΄μ λν νλ€μ΄μ‘μ΅λλ€.λ€μμΌλ‘ μκ°ν λ°©λ²μ ν©ν 리μ λλ€. μ²μμ μΆκ΅¬νλ κ° ν μ€νΈλ§μ λ 립μ±μ 보μ₯νλ, κ³Όλν μμ±μ΄λ λ°μ΄ν° μμ 컀λ²νκΈ°μ ν©ν λ¦¬κ° μμ±λ§μΆ€μ΄λΌκ³ νλ¨νμ΅λλ€.
μ ν©ν 리λ₯Ό ν΅ν΄ μλμ κ°μ΄ μ½λλ₯Ό κ°κ²°νκ² μμ±ν μ μμμ΅λλ€.
handlers, handlersUtils
μ΄λ²€νΈλ μμ±, μμ λλ©΄ fetchλ₯Ό λ€μ ν΄ μνλ₯Ό μ λ°μ΄νΈ ν©λλ€. μ΄λ₯Ό μν μ μ΄κ° νμν κ² κ°μλ°μ.
μ΄λ»κ² μμ±ν΄μΌ ν μ€νΈκ° λ³λ ¬λ‘ λμλ μμ μ μ΄κ² λμν κΉμ?
μλ μ΄λ¦μ μ¬μ©νμ§ μμλ λλ, λ 립μ μ΄κ² ν μ€νΈλ₯Ό ꡬλν μ μλ λ°©λ²μ μ°Ύμ보μΈμ. κ·Έλ¦¬κ³ μ΄ λ‘μ§μ PRμ μ€λͺ ν΄μ£ΌμΈμ.
??
μ²μμ λκ² μμνλ
handlersUtilsμ μ£Όμμ λλ€. κ·Έλ₯ λλ·μμ΄handlersμhandlersUtilsκ° μμΌλ μ΄κ² μ΄λμ μ°λ 건μ§λ κ°μ΄ μ‘νμ§ μμμ΅λλ€. μ°μmockν΄λ μμ μμΌλ μ€μ μλ² ν΅μ λμ μ μν μ₯μΉμΈ 건 κ°μλ°,,, μ 2κ°λ‘ λΆλ¦¬λμ΄ μμ§...?μ μκ°μ
handlersλ μ¬λ¬ ν μ€νΈλ₯Ό μ 체μ μΌλ‘ νλ¦μ λ°λΌ μ§ννλ©° νλμ λ°μ΄ν°λ₯Ό λ°λΌλ³΄κΈ° μν¨μ΄κ³ ,handlerUtilsλ λ³λ ¬μ μΌλ‘ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ©° ν μ€νΈλ₯Ό μ§ννκΈ° μν¨μ΄λΌκ³ νλ¨νμμ΅λλ€.κ·Έλ κΈ° λλ¬Έμ μ²μμ
handlersλ₯Ό λ€μκ³Ό κ°μ΄ μμ±νμμ΅λλ€.κ·Έλ¬κ³
handlersUtilsλ ν΄λ‘μ λ₯Ό νμ©ν΄ μμ±νλ € νμ§λ§handlersμ μλ μλ² μμ² μ½λ λΆλΆμ΄ μ€λ³΅μΌλ‘ νμνμ΅λλ€. μ΄ λΆλΆμ΄ λ§μμ λ€μ§ μμ λ€μκ³Ό κ°μ΄ μμ νμμ΅λλ€.λλΆμ
handlersUtilsλ κ°λ¨νκ² μμ±ν μ μμμ΅λλ€.μΆκ°λ‘ μλμ κ°μ μλ² μλ¬λ₯Ό μ μ λ‘ ν ν μ€νΈλ₯Ό μν
handlersλ μμ±νμμ΅λλ€.3. μμ°¨μ μΈ ν μ€νΈ
ν μ€νΈ μ½λλ₯Ό μμ±νλ©° λλ μ μ€ νλλ μ΄ μ½λκ° μ ννκ² ν μ€νΈνκ³ μμ§ μμ μλ μκ² κ΅¬λ μΆμ μ μ λλ€. κ·Έμ λ²νΌμ λλ₯΄κ³ λͺ©λ‘μ lengthκ° 1 λ λμμμ νμΈνλ©΄ λλ κ²μ΄ μλλΌ, λ λλ§μ΄ λμμμ νμΈνκ³ , λ²νΌμ λλ₯Ό μνμμ νμΈνκ³ , κΈ°μ‘΄μ λ°μ΄ν°μ λΉκ΅νμ¬ μλ‘μ΄ λ°μ΄ν°κ° μΆκ°λμμμ νμΈνμ¬μΌ νμ΅λλ€. κ·Έλμ λ€μκ³Ό κ°μ΄ κΌΌκΌΌνκ² ν μ€νΈλ₯Ό μμ±νλλ‘ λ Έλ ₯νμμ΅λλ€.
νμ΅ ν¨κ³Ό λΆμ
μ°μ μ²μμΌλ‘ ν μ€νΈ μ½λλ₯Ό μμ±ν΄ 보μλ€λ μ μ΄ κ°μ₯ κ³ λ¬΄μ μ λλ€. λ§λ₯ ν μ€νΈ μ½λλ νμνλ€, νμ§λ§ ν λ²λ ν΄λ³΄μ§ μμλ€λ μκ°λ§ μμλλ° μ΄μ λ ν μ€νΈ μ½λλ₯Ό μμ±ν μ μλ€κ³ λ§ν μ μμ κ²λ§ κ°μ΅λλ€.
λ¬Όλ‘ ν μ€νΈ μ½λ λΌμ΄λΈλ¬λ¦¬μ κ°μ μ¬μ©λ²μ λΉμ°νκ³ μ΄λ€ ν μ€νΈ μ½λκ° μ’μ ν μ€νΈ μ½λμΈμ§ λμ± κ³΅λΆνκ³ λμ λ§μ΄ μ΅νλ νμκ° μλ€κ³ λκΌμ΅λλ€. ν μ€νΈ μ½λλ κΈ°μ‘΄μ μμ±νλ μ½λλ€λ³΄λ€ ν μ€ ν μ€μ μλ―Έκ° λμ± μ§λ€κ³ λλλλ€. λ°λλ‘ λμ± μ λ΅μ΄ μκΈ°λ ν κ² κ°μ΅λλ€. κ·Έλ κΈ°μ λμ± λ§μ΄ κ²½ννκ³ μμΌλ₯Ό λν νμκ° μλ€κ³ μκ°ν©λλ€.
μ€λ¬΄ μ μ© κ°λ₯μ±μ λ§€μ° λλ€κ³ μκ°ν©λλ€. λ€λ§ νλ‘ νΈμνΈ ν μ€νΈ μ½λ νΉμ±μ 미리 μμ±ν΄ λκΈ°λ μ΄λ ΅λ€κ³ μκ°ν©λλ€. μ무λλ μ΅μνμ μΈν°λ μ μ κ°λ₯ν μμ€κΉμ§ κ°λ°μ΄ νμνκΈ°λ νλ©° μ€μ νλ©΄μ΄ μ΄λ»κ² λμ¬μ§ μμΈ‘νκΈ΄ μ½μ§ μκΈ° λλ¬Έμ λλ€. κ·ΈλΌμλ ν μ€νΈ μ½λλ λ§€μ° νμν μ‘΄μ¬λΌκ³ μκ°ν©λλ€. μ€λ¬΄μμ μκ°μ΄ μ£Όμ΄μ§λ€λ©΄ ν μ€νΈ μ½λ μμ±μ λ§μ μκ°μ ν¬μνκ³ μΆμ΅λλ€.
κ³Όμ νΌλλ°±
μ¬ν κ³Όμ λ‘ λ¦¬ν©ν λ§μ ν΄μΌ νλ λΆλΆμ΄ λ무 λΉνΉμ€λ¬μ μ΅λλ€. ν μ€νΈ μ½λλ₯Ό 체ννλλ°λ λ§μ΄ λ² μ°Όλλ° λ¦¬ν©ν λ§κΉμ§ ν΄μΌ νλ μμ΄ λ무 λ§κΈ°λ νκ³ μ μμ΄ μ λμ§ μμμ΅λλ€.
νμ§λ§ ai μ¬μ©μ μ§μνλ©° μ§μ ν μ€νΈ μ½λλ₯Ό μμ±ν΄ λ³Έ κ²½νμ μ λ§ λ»κΉμ κ²½νμ΄μμ΅λλ€. λ¨μ ν μ€νΈ μ½λμ λν κΈ°μ μ μΈ νμ΅μ λμ΄ ν μ€νΈ μ½λμ λν λλ €μμ μμ κ±°λ μ€λ¬΄μ μ μ©ν΄ λ³΄κ³ μΆμ λ§μκΉμ§ μ»μ μ μμμ΅λλ€.
리뷰 λ°κ³ μΆμ λ΄μ©
handlersλsetupTestsλ₯Ό μν΄, κ·Έλ¦¬κ³ ν μ€νΈ μ 체 νλ¦μ λ§‘κ² νλμ λ°μ΄ν°λ₯Ό λ€λ£¨κΈ° μν¨μ΄λ©°,handlersUtilsλ μ΄ κ³Όμ μμ λ³λ ¬μ μΌλ‘ λ°μ΄ν°λ₯Ό λ€λ£¨λ©° ν μ€νΈλ₯Ό μ§ννκΈ° μν¨μ΄λΌκ³ μκ°ν©λλ€. νμ§λ§ λ§μ ν μ€νΈ μ½λλ₯Ό μμ±νλ€ λ³΄λ©΄handlersλ μ€μ λ‘ μ¬μ©ν μΌμ΄ μμ΄ λ³΄μ΄λ©° λͺ¨λhandlersUtilsλ‘λ§ μμ±νκ² λμμ΅λλ€.vitestμ κ°μ νλ¬κ·ΈμΈ μ¬μ© λ±κ³Ό κ°μ΄ νλμ ν μ€νΈλ§μ λ 립μ μΌλ‘ μ€ννλ κ²½μ°κ° λκ² λ§λ€κ³ μκ°νλλ°,
handlersλ₯Ό μ¬μ©νλ©΄ μ΄μ , μ΄ν ν μ€νΈμ μν₯μ λΌμΉκ² λλλΌκ΅¬μ.handlersλ§μ μ¬μ©ν λ³λ ¬μ μ΄μ§ μμ ν μ€νΈ μ½λλ μΈμ νμν κΉμ? QnA λλ λμΆ©μ μ€λͺ μ λ€μμ§λ§ ꡬ체μ μΈ μμλ₯Ό λͺ°λΌμ κ·Έλ°μ§ κ°μ΄ μ‘νμ§ μμ΅λλ€.