인터페이스 : 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템
Atom
->Molecule
->Organism
->Template
->Page
조합x
-----------------복잡도 증가-----------------조합O
조합의 기준은 각자의 판단
가장 작은 단위의 하위 컴포넌트 먼저 개발
작은 하위 컴포넌트들을 조합하여 전체적인 컴포넌트 개발
일반 사용자 뿐만 아니라 개발자도 고려해야 함
YAGNI(You Aren't Gonna Need It)
를 유발할 수 있음
YAGNI
: 프로그래머가 필요하다고 간주할 때까지 기능을 추가하지 않는 것이 좋다는 익스트림 프로그래밍(XP)의 원칙
서순 : Atom
-> Molecule
-> Organism
-> Template
-> Page
르블랑의 법칙
을 유발할 수 있음
르블랑의 법칙
: 나중은 결코 오지 않는다
CDD(Component Driven Development, 컴포넌트 주도 개발)
에 엄청난 영향을 끼침push
& Single Source of Truth(진실의 원천)
input
에 주입된 데이터, 돔 객체에서 보여지는 데이터, 상태에 저장된 데이터를 하나로 통일하여 유지함push
해야 하므로 이벤트 핸들러를 항상 작성해야 함import { useEffect, useState } from "react";
export default function Controlled() {
const [renderingCount, setRenderingCount] = useState(0);
const [resultValue, setResultValue] = useState("");
const [inputValue, setInputValue] = useState("");
const handleChange = ({ target: { value } }) => {
setInputValue(value);
};
const handleSubmit = (e) => {
e.preventDefault();
console.log(e);
setResultValue(inputValue);
setInputValue("");
};
useEffect(() => {
setRenderingCount((prev) => prev + 1);
}, [inputValue]);
return (
<>
<form onSubmit={handleSubmit}>
<input onChange={handleChange} value={inputValue} />
<p>입력 중인 값 : {inputValue}</p>
<button type="submit">제출</button>
</form>
<p>제출한 값 : {resultValue}</p>
<p>렌더링 횟수 : {renderingCount}</p>
</>
);
}
pull
& get state
pull
하므로 이벤트 핸들러를 항상 작성할 필요 없음import { useEffect, useRef, useState } from "react";
export default function Uncontrolled() {
const [renderingCount, setRenderingCount] = useState(0);
const [resultValue, setResultValue] = useState("");
const inputRef = useRef("");
const handleChange = ({ target: { value } }) => {
inputRef.current.value = value;
};
const handleSubmit = (e) => {
e.preventDefault();
console.log(e);
setResultValue(inputRef.current.value);
inputRef.current.value = "";
};
useEffect(() => {
setRenderingCount((prev) => prev + 1);
}, [inputRef]);
return (
<>
<form onSubmit={handleSubmit}>
<input ref={inputRef} />
<p>입력 중인 값 : {inputRef.current.value}</p>
<button type="submit">제출</button>
</form>
<p>제출된 값 : {resultValue}</p>
<p>렌더링 횟수 : {renderingCount}</p>
</>
);
}
테스트 피라미드
E2E 테스트
에 도달할 수 없다면 가장 나은 테스트 전략과 도구를 선택해야 함
테스트를 어디까지 할 것인가를 정할 줄 아는 것이 진정한 FE 개발자
테스트 트로피에 관한 글 :The Testing Trophy and Testing Classifications
https://storybook.js.org/docs/react/get-started/install
참고
React - 제어 컴포넌트 vs. 비제어 컴포넌트
강도리 - [React] 제어 컴포넌트(Controlled Component)와 비제어 컴포넌트(Uncontrolled Component)
Controlled and uncontrolled form inputs in React don't have to be complicated