230419(μ)
π μ±μ₯μΌμ§ 4.0
μ±
ν볡ν μ΄κΈ°μ£Όμμ(μ¨μΈ λ€μ΄μ΄)
μ λ΄μ©μ μκ·Ήλ°μ μμνλ μλ°ν μ±μ₯κΈ°λ‘
μ΄μμλ κ½κ³Ό μ£½μ κ½μ μ΄λ»κ² ꡬλ³νλκ°?
μ±μ₯νκ³ μλ κ²μ΄ μ΄μ μλ κ²μ΄λ€.
μλͺ μ μ μΌν μ¦κ±°λ μ±μ₯μ΄λ€!
π³ (1.0)ν€μλ
μ΅λν κ°λ¨νκ² μ 리, μΆνμ 보면μ μ€μ€λ‘ μ€λͺ
π (2.0)κ²½ν μμ£Όλ‘
λ¨μ μ 보λ₯Ό μ λ¬νκΈ°λ³΄λ€ λ¬΄μμ λ°°μ κ³ μ΄λ»κ² ν΄κ²°νλμ§ μ§§κ³ κ°λ¨νκ² μμ±
βοΈ (3.0)μ ν΄μ§ ν νλ¦Ώμ λ§μΆ°μ
ν€μλ, κ²½ν λͺ¨λ μ’λ€. λ€λ§ λ§€μΌ μμ±νκΈ°λ‘ λ§μ λ¨Ήμλ§νΌ ν΅μ¬λ§ κ°κ²°νκ² μ 리ν μ μκ² ν νλ¦Ώμ μμ±
(3.1)230102λΆν° μμλλ νμ΅μ κ΄ν λ΄μ© μΆκ°
(3.2)230313λΆν° μ’λ κ²½ν, κ°μ μμ£Όμ λ΄μ©λ λ΄κΈ°!
πΎ (4.0)νμ΅ ν€μλμμ μ΅λν κ°λ¨ν μ 보 μ 곡, κ³ λ―Όμμ λ΄ κ²½νμ μμΈν μ μ!
π§ κ³ λ―Ό μ¬ν
1. νλ‘μ νΈμμ μ μμΌλ‘ κ΄λ¦¬ν νμκ° μλ μνλ€λ§ flux μν€ν μ³ μ μ©ν μ§.
κΈ°μ‘΄μ λ΄κ° μκ°νλ λ°©ν₯μ μ»΄ν¬λνΈ λ³λ‘ ꡬμ±νλ κ°κ°μ μ»΄ν¬λνΈκ° MVC, μ΅μ λ², Flux ν¨ν΄μΌλ‘ ꡬνλλ κ²μ΄μλ€. MVCμ μ΅μ λ²κΉμ§λ κ·Έλ κ² ν΄λ λμ§λ§, Fluxμ κ²½μ° κ΅³μ΄..? λΌλ μκ°μ΄ λ λ€. μλνλ©΄ Flux μν€ν μ³λ‘ ꡬνλ 리λμ€μ κ²½μ°μλ 리μ‘νΈμ props drillingμ λ§κΈ° μν΄μ μνλ₯Ό μ μμΌλ‘ κ΄λ¦¬νκ² ν΄μ£Όλ μν μ΄κΈ° λλ¬Έμ΄λ€. μμ μ»΄ν¬λνΈ λ¨μμμ Flux ν¨ν΄μΌλ‘ ꡬννλ 건 μ‘°κΈ μλͺ¨μ μΈ μΌκ°λ€. ν΄μ μΌλ¨ MVC, μ΅μ λ²λ‘ ꡬν ν μ μμΌλ‘ λΉΌκ³ μΆμ μνλ€λ§ Fluxλ‘ λ¦¬ν©ν λ§νλ μμΌλ‘ κ°λ μ’μ κ² κ°λ€.
2. 리ν©ν λ§μ ν μ§ λ§μ§(ꡬλ κΈ°λ₯μ μΌλ¨ keep)
μ§κΈ λ΄κ° ꡬνν μ»΄ν¬λνΈλ€μ setStateλ₯Ό ν λ, μλ‘μ΄ htmlμ ν λΉνκ³ eventλ₯Ό λΆμ΄λ λ°©μμ΄ μλλ€. κΈ°μ‘΄ tamplate htmlμ μ μ§νλ©΄μ κ±°κΈ°μ μμ dom μ‘°μμ νλ λλμ΄λΌμ μ§μ§ cra λλμ componentκ° μλ κ² κ°λ€. ν΄μ λ§μΉ¨ 리ν©ν λ§, ν μ€νΈ μ½λκ° μ£Όμ μΈλ§νΌ μ΄λ₯Ό μμ±νλ©΄μ μ½λ μ λ°μ μΌλ‘ 리ν©ν λ§μ μ§νν΄λ³΄λ € νλ€.
3. TSμμ jest μ¬μ© μ import λ¬Έμ (λ²λ€λ¬ μμ)
λ²λ€λ¬ μμ΄ tsλ₯Ό μ¬μ©ν λ, esmμ μ¬μ©νκΈ° μν΄μλ import from λ€μ νμΌμ λ°λμ μ»΄νμΌλκ³ λ νμ js νμΌμ κ°μ ΈμμΌλ§ νλ€. μ¬κΈ°κΉμ§λ ν¬κ² λ¬Έμ κ° μλλλ°, ts configμμ path μ€μ μ ν΄μ€ κ²½μ° λ§μ°¬κ°μ§λ‘ jestμμλ μ΄ κ²½λ‘ λ¨μΆ μ¬μ€μ μλ €μ£Όμ΄μΌ νλ€. ν΄μ μ΄λ κ² μ²λ¦¬ν΄μ£Όλ©΄ κΈ°μ‘΄μ ts fileμμλ esm μ¬μ©μ μν΄ λμ β.jsβλ₯Ό λΆμ΄λλ°, jest μ μ₯μμλ ν΄λΉ κ²½λ‘μλ js νμΌμ΄ μμΌλ κ³μ μλ¬κ° λ°μνλ€. κ·Έλμ κ²°κ΅μ tsμ λν ν μ€νΈλ₯Ό μ€ννμ§ μκ³ μ»΄νμΌλ js νμΌμ λν΄μ testλ₯Ό μ§ννλλ‘ νμ¬ μΌλ¨μ ν΄κ²°..!(κ·Όλ° λκ° μ°μ°β¦)
π μ€λμ νμ΅ ν€μλ
- flux μν€ν μ²
- 리ν©ν λ§κ³Ό ν μ€νΈ μ½λ
π₯³ νμ΅ λ΄μ©
리ν©ν λ§μ μν ν μ€νΈ μ½λ μμ±(feat. Jest)
κΈ°μ‘΄μ MVC, Observer patternμμ Flux patternμΌλ‘ 리ν©ν λ§νκΈ°μ μμ ν μ€νΈ μ½λλΆν° μμ±νκ³ μ°μ΅ν΄λ³΄μλ€.(κ³ λκΈΈ κ°κΈ° μ κ·Έλλ§ μ¬μ λλΉγ γ γ )
μμ1) νκ΅ λ μ§ νκΈ°μ λ§κ² λ³κ²½ν΄μ£Όλ ν¨μ
import { KR_DAYS } from '@src/constants/constants.js';
export const getKrDate = (locale: string, todayDate: Date) => {
const date = todayDate;
const localeDate = date.toLocaleDateString(locale);
const day = date.getDay();
return `${localeDate} ${KR_DAYS[day]}μμΌ`;
};
κ·Έμ λν ν
μ€νΈμ½λ
λ§€μΌ λ³ννλ new Date()
λλ¬Έμ νλ£¨κ° μ§λλ©΄ ν
μ€νΈκ° μ€ν¨νκ² λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ mockDateλ₯Ό μ‘μμ£Όκ³ μ΄μ λν΄μ ν
μ€νΈλ₯Ό μ§νν λ‘ νμλ€.
import { getKrDate } from '@utils/date.js';
describe('Get date', () => {
it('korean date', () => {
const mockDate = new Date('2023.04.19');
expect(getKrDate('ko-KR', mockDate)).toEqual('2023. 4. 19. μμμΌ');
});
});
μμ2) DOM μ‘°μνλ ν¨μ(querySelector, querySelectorAll)
export const $ = (
selector: string,
baseElement: Document | HTMLElement = document,
) => baseElement.querySelector(selector);
export const $$ = (
selector: string,
baseElement: Document | HTMLElement = document,
) => baseElement.querySelectorAll(selector);
import { $, $$ } from '@utils/dom.js';
import { JSDOM } from 'jsdom';
describe('Select DOM node', () => {
const mockDom = new JSDOM();
global.document = mockDom.window.document;
global.document.body.innerHTML = `
<div id="first" class="mock-element"></div>
<div id="second" class="mock-element"></div>
`;
it('Select One - querySelector', () => {
expect(
($('#first', global.document.body) as HTMLElement).outerHTML,
).toEqual(`<div id="first" class="mock-element"></div>`);
});
it('Select All - querySelectorAll', () => {
let mockHtml = ``;
($$('.mock-element', global.document.body) as NodeList).forEach((node) => {
mockHtml += (node as HTMLElement).outerHTML;
});
expect(mockHtml).toEqual(
`<div id="first" class="mock-element"></div><div id="second" class="mock-element"></div>`,
);
});
});
DOMκ³Ό κ΄λ ¨ν ν μ€νΈμ½λκ° μΈμ κΉμλ€. λ¨Όμ jsdom λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ mockingλ domμ λ§λ€ μ μλ€. mockingλ domμμμ windowλ document λ±μ nodeμ global κ°μ²΄ λ΄λΆμ ν λΉν΄μ€λ€. κ·Έλ¦¬κ³ μ°λ¦¬κ° λΈλΌμ°μ μμ node(νΉμ element)λ₯Ό μ ννμ¬ λ€λ£¨λ― μ¬μ©ν΄μ£Όλ©΄ λλ€!