React.js JSX 문법
React.js 는 일반 JavaScript 문법이 아닌 JSX 문법을 사용하여 UI를 템플릿화 한다. JSX를 사용하는것이 필수는 아니지만 이를 사용하면 다음과 같은 장점이 있다.
- JSX는 컴파일링 되면서 최적화 되므로, 빠르다
- Type-safe (어떠한 연산도 정의되지 않은 결과를 내놓지 않는것, 즉 예측 불가능한 결과를 나타내지 않는 것) 하며 컴파일링 과정에서 에러를 감지 할 수 있다.
- HTML에 익숙하다면, JSX를 사용하여 더 쉽고 빠르게 템플릿을 작성 할 수 있다.
type-safe 란
“어떠한 오퍼레이션(또는 연산)도 정의되지 않은 결과를 내놓지 않는것, 즉, 예측불가능한 결과를 내지 않는것을 뜻한다.”
예를 들면, 1 + “1” 의 연산이 가능하거나, 문자열에 숫자 1을 할당하는것이 가능하다거나 한다는 것은 일면 비 논리적이라고 볼 수 있다.
type-safe 란 위와 같이 연산이나 조작에 있어서 논리적이지 않은 것에 대해 엄격히 체크를 하여
Runtime시 이로 인한 오류가 발생하지 않도록 하는것이다.
Type-Safe하다고 알려진 언어에서는 보통 이를 컴파일 타임에 에러처리를 해주지만,
Type-Safe하지 않은 언어, 예를 들어 자바스크립트같은 언어에서는 이것을 적당하게(?) 처리한다.
그래서 Javascript는 Type-Safe하다고 하지 않는다.
위와 같은 의미에서, 일반적으로, c# / java 와 같은 언어들을 일반적으로 type-safe 하다라고 한다.
JSX 사용하기
JSX는 HTML이랑 문법이 거의 비슷하게 생겼다.
App.js
1 | import React from 'react'; |
- LINE 1: import 는 ES6 에 도입된 새로운 문법인데, var React = require(‘react’) 와 같다. React 모듈은 Component를 만들때 사용된다.
- LINE 3: class 개념 역시 ES6 에 새로 도입된 요소중 하나 이다. 모든 Component는 React.Component 를 상속한다. ES5 환경에서는 React.createClass() 라는 메소드를 사용한다. 또한, ES5 에서 클래스를 만들때는 메소드들을 nest 할 수 없고 prototype을 사용했어야 했는데, 많이 편해졌다.(ES6 Class 에 대해서는 Mozilla 참고자료 에서 확인하면 된다.)
- LINE 4: render() 메소드에서는 컴포넌트에 렌더링 될 데이타를 정의한다.
- LINE 5~7: 이 부분이 JSX의 가장 중요한 부분으로 자바스크립트에서 html 태그를 반환하는데, 따옴표같은건 없음을 유의하자.(문자열 처리) React JSX 는 XML-like Syntax 를 native Javascript로 변환해주므로
""로 감싸지 않는 점을 주의해야한다.()를 사용하지 않아도 오류는 발생하지 않지만 가독성을 위하여 사용하는것이 좋다.
1. 확장자에 대하여..
JSX 파일의 확장자의 경우, 이전에는 개발자들이 .jsx 확장자를 사용하였지만 요즘은 .js 를 사용하는 추세로 전환되어 가고 있다. 페이스북의 오픈소스 에디터인 draft.js 는 구별을 제대로 하기 위하여 .react.js 확장자를 사용하기도 한다. 여기서는 .js 확장자를 사용하도록 하겠다.
JSX VS JS
JSX 를 사용했을 경우와 사용하지 않았을 때를 비교 차이는 다음과 같다.
1 | <!-- JSX --> |
1 | <!-- JS --> |
2. Nested Elements
컴포넌트에서 여러 Element 를 렌더링 해야 할 때, 그 element들을 필수적으로 container element 안에 포함시켜줘야 된다.
예를들어 다음과 같이 코드를 작성하면:
1 | return ( |
변환 과정에서 다음과 같은 오류가 발생 한다.
1 | ERROR in ./src/App.js |
다음과 같이 div element 를 wrapper 로 사용하면 오류가 발생하지 않는다.
1 | return ( |
3. JavaScript Expression
JSX 안에서, JavaScript 표현을 사용하는 방법은 매우 간단하다. 그냥 {} 로 wrapping 하면 된다.
1 | render() { |
- LINE 2: ES6 에 도입된 let 키워드는 var 과 비슷하지만, var 변수의 scope는 기본적으로 함수 단위인데 let 은 블럭 범위 내에서 변수를 선언 한다. 따라서 가끔 발생하는 javascript 의 Scope관련 문제를 해결 할 수 있다. 지금 이 상황에선 let 을 사용하는것이 필수는 아니지만, ES6 에선 평상시 let 을 쓰고 var은 필요한 상황에서만 사용하는게 좋다. (let 에 관련된 정보는 Mozilla 참고자료 에서 확인하면 된다.)
- LINE 6:
{ text }를 사용하여 text Javascript 변수를 렌더링 한다.
임의 method 생성 및 사용하기
React 에서 method를 생성하고 사용하는 방법에 대하여 알아보자.
1 | sayHey() { |
- LINE 11:
{this.sayHey}를 통해 버튼이 클릭되면 해당 메소드가 실행되게 할 수 있다. () 가 뒤에 안붙어있다는점을 주의하자. 만약에 () 가 붙으면 페이지가 로드 될때도 실행되고, 클릭할때도 실행된다.
If-Else 문 사용 불가
JSX 안에서 사용되는 JavaScript 표현에는 If-Else 문이 사용 불가하다. 이에 대한 대안은 ternary ( condition ? true : false ) 표현(삼항 연산자)을 사용하는 것이다.
예를 들면 다음과 같다.
1 | <p>{1 == 1 ? 'True' : 'False'}</p> |
4. Inline Style
React의 Inline Style 에서는, string 형식이 사용되지 않고 key 가 camelCase 인 Object 가 사용된다.
다음 예제를 통하여 살펴보자.
1 | render() { |
pStyle 이 p element 에 적용되었다.
5. 주석
JSX 안에서 주석을 작성할 때엔, { /* comments */ } 형식으로 작성하면 된다. 여기에 작성된 주석은 브라우저상 source 에서 나타나지 않는다. 주의하실 점은 2. Nested Element 에서 나왔던 것 처럼 container element 안에 주석이 작성되어야 한다.
6. Naming Convention
모든 React Component 은 첫 문자가 대문자인 CamelCase 로 작성된다.