컴포넌트 기반으로 개발하는 이유?
관심사의 분리
React의 관심사의 분리가 무엇을 뜻하는가?
React.js는 컴포넌트로써 마크업과 뷰의 로직을 createClass()의 안에 작성합니다. 하지만 마크업은 HTML이나 mustache로 작성하고 뷰의 로직은 자바스크립트로 나눠서 작성하는 기존의 방식을 취하지 않아 마음에 들지 않는 사람도 있을 것 같습니다. 이 사안에 대해 React.js의 개발자인 Pete Hunt는 “그것은 관심사의 분리(Separation of concerns)가 아니라 기술의 분리(Speparation of technologies)”라며 마크업과 뷰의 로직은 긴밀해야 한다고 언급했습니다. 거기에 템플릿의 문법으로 불필요하게 코드를 작성하는 것보다 자바스크립트로 작성하는 것이 더 좋다고 말하고 있습니다.
class Todo extends Component {
constructor(props) {
super(props);
this.state = {
list: [],
text: ""
};
}
handleAddItem = e => {
this.setState({
list: this.state.list.concat(this.state.text),
text: ""
});
};
handleChange = e => {
this.setState({
text: e.target.value
});
};
removeItem = index => {
const list = this.state.list;
this.state.list.splice(index, 1);
this.setState({ list });
};
render() {
const { text, list } = this.state;
return (
<div>
<h1>TODO LIST</h1>
<input value={text} onChange={this.handleChange} />
<button onClick={this.handleAddItem}>Add</button>
<ol>
{list.map((item, index) => (
<li key={index}>
{item}
<button onClick={() => this.removeItem(index)}>Delete</button>
</li>
))}
</ol>
</div>
);
}
}
https://codesandbox.io/s/q8qnon7nq9
JSX
JSX는 자바스크립트 확장문법으로 템플릿엔진이라 불리는 것과 유사한 방식의 표현식이다.
간단히 말해, 자바스크립트 문법과 HTML 태그가 혼용되어 사용되는 방식이다.
JSX를 무조건 사용해야 하는것은 아니지만, React에서 사용하는 것을 권고하고 있으므로 사용하는것이 좋다.
// #1
const element = <h1>Hello, world!</h1>;
// #2
const formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
DOM Tree 생성
1) 브라우저의 렌더 엔진이 HTML 파싱후 DOM Tree 생성
Render Tree 생성
1) 노드 스타일 처리 과정 (attachment
)
2) DOM 트리의 노드가 가진 attach
메서드를 통해 스타일 정보를 계산하고 객체 형태로 반환
3) DOM 트리에 새로운 노드가 추가되면 노드의 attach
메서드가 실행 됨
4) Render Tree 생성시에 각 요소의 스타일 처리과정이 포함되고 다른 요소들의 스타일 속성도 참조
Layout(reflow)
1) 스크린 좌표를 참조하여 표시 위치 결정
Painting
2) 렌더링된 요소에 색을 입히는 과정. 트리의 각 노드들을 거치면서 paint
메서드 호출
과거엔 데이터가 변경되면 전체를 새로 그리는 간편하고 단순한 방법으로 애플리케이션을 구현했습니다. 현대에 들어 애플리케이션을 개발하는 방법이 많이 복잡해졌다고 생각합니다. Angular.js의 양방향 데이터 바인딩은 코드를 줄여주고 사용하기 편하지만, 규모가 커질수록 데이터의 흐름을 추적하기 힘듭니다. React.js는 근원(根源)으로 돌아가는 개발 방법입니다. 그리고 그 과정에서 발생하는 비효율적인 부분, 예를 들어 DOM 전체를 갱신해야하는 문제를 VIRTUAL DOM과 비교(diff)로 해결했습니다.