React 등장과 JSX 문법
웹 프론트엔드 개발과 React 등장
(1) 웹 프론트엔드 개발 : Rendering = 웹 페이지의 화면 변경
웹 프론트엔드 개발은 웹 페이지의 화면 변경(Rendering)의 모든 것이며, HTML(DOM) 조작의 모든 것을 의미
- 고대 : JavaScript 문법을 통한 HTML(DOM) 직접 조작으로 웹 페이지 화면 변경
- 과거 : jQuery 문법으로 HTML(DOM) 조작을 쉽게 돕는 라이브러리
- 현재 : React JSX 문법을 통해 HTML(DOM) 조작을 단순화한 프레임워크
(2) React는 왜 Facebook에서 등장했는가?
- 하나의 이벤트가 다수 DOM을 변경시키는 경우
- 하나의 이벤트 = 하나의 상태(State) 변경 → 다수 DOM(View) 변경
(3) SPA (Single Page Application) 란 무엇인가? = 출장뷔페
웹 브라우저 내 JavaScript를 활용해 동적 페이지 생성 + JavaScript 반환을 위한 웹 서버 또는 저장소(S3)
SPA의 특징:
- 모바일 앱처럼 실시간 유저 인터페이스가 중요한 웹 페이지에서 사용
- 서버가 불필요 (단순한 호스팅 가능) = 빈 HTML + CSS + JS 제공, API 서버는 필요
- 웹 페이지 전환 시 깜빡임 없음 (동적 렌더링)
- 초기 로딩 속도가 느릴 수 있음 (Bundled JS 크기 때문)
- 검색엔진 최적화(SEO) 어려움 : 웹 크롤러가 렌더링된 페이지를 수집하지 못함
(4) SPA Routing
- SPA Routing : React-Router-Dom 등으로 구현
- Hard Navigation : 네트워크 사용 (SSR, SSG 방식)
- SPA Navigation : 네트워크 미사용 (CSR 방식)
React-Router-Dom Tutorial 을 통해 직접 SPA Routing 제작 가능 : Tutorial v6.28.0
JSX 문법
(1) React Component ~= HTML Element
React에서 화면은 여러 React Component로 구성되며, 이를 통해 HTML Element를 쉽게 관리
- React Component는 독립적이고 재사용 가능한 UI 요소
- 부모 컴포넌트에서 자식 컴포넌트로 Props를 전달하여 데이터 공유/전달
- React Component를 조합하여 더 복잡한 형태의 UI를 제작 가능
(2) JSX
- JavaScript와 XML의 혼합 문법
- React에서 DOM 조작 대신 JSX 문법을 사용하여 효율적으로 개발
1
| const element = <h1 className='greeting'>Hello, world!</h1>;
|
1
| const element = React.createElement('h1', { className: 'greeting' }, 'Hello, world!');
|
JSX 가 JS 특성과 XML 특성 모두를 혼재하여 갖고있어서 아래와 같은 제약사항 존재
- JSX는 무조건 하나의 요소로 반환
- 여러 요소를 작성하려면 하나의 태그로 감싸야 하며, Fragment 사용 가능
1
2
3
4
5
6
7
8
| <>
<h1>오늘의 할 일</h1>
<ul>
<li>빨래하기</li>
<li>숙제하기</li>
<li>1시 약속</li>
</ul>
</>
|
- class 대신 className 사용
1
| <div className="container"></div>
|
- JS 로직(변수나 함수)을 넣기 위해서는 중괄호 사용
1
2
3
4
5
6
7
8
9
10
| function Container({ children }) {
const title = '오늘의 할 일';
return (
<div>
<h1>{title}</h1>
{children}
</div>
);
}
|
- 주석은 /* … */ 형태로 작성
- 명시적으로 태그 닫기
1
| <img src="image.png" alt="example" />
|
- React Component는 대문자로 시작
1
2
3
4
5
6
7
8
9
10
11
| function TodoList() {
return (
<Container>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</Container>
);
}
|
- *조건부 렌더링 삼항 연산자 사용
1
2
3
4
5
6
7
8
9
10
11
12
| function TodoList() {
const todoList = [];
return (
<Container>
<div>
{todoList.length > 0
? todoList.map(todo => <div key={todo.id}>{todo.value}</div>)
: "새로운 할 일을 입력해보세요."}
</div>
</Container>
);
}
|
- 여러 HTML 엘리먼트를 표시할 때는 map 함수 사용
1
2
3
| {items.map(item => (
<li key={item.id}>{item.value}</li>
))}
|