๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

[๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ] 2์žฅ - JSX

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-0

์ด ๊ธ€์€ ๊น€๋ฏผ์ค€(velopert)๋‹˜์˜ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ#

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •์„ ์šด์˜์ฒด์ œ์— ๋งž๊ฒŒ ์ž˜ ์„ค์น˜ํ•œ ์ดํ›„ ์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

yarn create react-app hello-react
# yarn์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉดnpm init react-app hello-react

ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ์ดํ›„ ๋ฆฌ์•กํŠธ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

cd hello-reactyarn start # ๋˜๋Š” npm start

ํ„ฐ๋ฏธ๋„์— ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™๋œ ๊ฒƒ์ด๋‹ค.

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-1

ํ„ฐ๋ฏธ๋„์— ๋‚˜์™€์žˆ๋Š” ๋Œ€๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000์— ์ ‘์†ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ํŽ˜์ด์ง€๋ฅผ ๋ณผ์ˆ˜์žˆ๋‹ค

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-2

๋งฅ์˜ ๊ฒฝ์šฐ ํ„ฐ๋ฏธ๋„์—์„œ ^ + C ๋กœ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฝ”๋“œ ์ดํ•ดํ•˜๊ธฐ#

src/App.js

import React from 'react';import logo from './logo.svg';import './App.css';
function App() {    return (        <div className="App">            <header className="App-header">                <img src={logo} className="App-logo" alt="logo" />                <p>                    Edit <code>src/App.js</code> and save to reload.                </p>                <a                    className="App-link"                    href="https://reactjs.org"                    target="_blank"                    rel="noopener noreferrer"                >                    Learn React                </a>            </header>        </div>    );}
export default App;

create-react-app์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ src/App.js ๋ฅผ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค.

import React from 'react'; ์ด ์ฝ”๋“œ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด node_modules ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” npm(Node Package Manager)์œผ๋กœ ์„ค์น˜ํ•œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ด๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ๋ฆฌ์•กํŠธ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

import logo from './logo.svg'; , import './App.css'; ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฆฌ์•กํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ css, svg ๋˜ํ•œ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ js, ์Šคํƒ€์ผ์‹œํŠธ, ์ด๋ฏธ์ง€ ๋“ฑ ๋ชจ๋“  ๊ฒƒ์„ ๋ชจ๋“ˆ๋กœ ๋กœ๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด, ํŒŒ์ผ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๋•Œ ๊ด€๋ฆฌํ•˜๊ธฐ์šฉ์ดํ•ด์ง„๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์—†๋˜ ๊ธฐ๋Šฅ์ด๊ณ , Node.js์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ๋“ค๋Ÿฌ (bundler)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ์›นํŒฉ (Webpack)์ด๋‹ค. ์ด ๋ฒˆ๋“ค๋Ÿฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋Ÿฌ์˜จ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ๋ชจ๋‘ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ž˜ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜์ง€๋งŒ create-react-app์€ ์ด ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ๋ชจ๋‘ ๋Œ€์‹ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค. (ํ•˜์ง€๋งŒ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.)

์ด ์›นํŒฉ์˜ ์ž์„ธํ•œ ์›๋ฆฌ์™€ ์ž‘๋™ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์˜ ๊ฐ™์ด ์ฝ๊ธฐ๋ฅผ ์ฝ์–ด๋ณด์ž.


๊ทธ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

function App() {    return (        <div className="App">            <header className="App-header">                <img src={logo} className="App-logo" alt="logo" />                <p>                    Edit <code>src/App.js</code> and save to reload.                </p>                <a                    className="App-link"                    href="https://reactjs.org"                    target="_blank"                    rel="noopener noreferrer"                >                    Learn React                </a>            </header>        </div>    );}

์ด ์ฝ”๋“œ๋Š” App์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด ํ•จ์ˆ˜์—์„œ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์€ ๋งˆ์น˜ HTML ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ์ด๋Š” JSX๋ผ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. UI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š”์ง€ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ด๋ผ๊ณ  ํ•  ์ˆ˜์žˆ๋‹ค.


JSX๋ž€?#

JSX๋Š” JavaScript XML์˜ ์•ฝ์ž๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋ฉฐ XML๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ์ƒ๊ฒผ๋‹ค. JSX ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋ฐ”๋ฒจ(Babel)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

function App() {    return (        <div>            Hello <b>react</b>        </div>    );}

์œ„์˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ™˜๋œ๋‹ค.

function App() {    return React.createElement(        'div',        null,        'Hello ',        React.createElement('b', null, 'react'),    );}

์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•œ ์ผ์ด๋‹ค. JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ํŽธํ•˜๊ฒŒ UI๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

JSX๋Š” ๊ณต์‹์  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.


JSX์˜ ์žฅ์ #

๋ณด๊ธฐ ์‰ฝ๊ณ  ์ต์ˆ™ํ•˜๋‹ค.#

JSX๋Š” HTML ์ฝ”๋“œ์™€ ๋น„์Šทํ•ด ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ  ์ž‘์„ฑํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค.

๋†’์€ ํ™œ์šฉ๋„#

HTML ํƒœ๊ทธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ JSX ์•ˆ์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. App.js ์—์„œ๋งŒ๋“  App ์ปดํฌ๋„ŒํŠธ๋ฅผ src/index.js ์—์„œ๋Š” ๋งˆ์น˜ HTML ํƒœ๊ทธ ์“ฐ๋“ฏ์ด ์ž‘์„ฑํ•œ๋‹ค.

ReactDOM.render(<App />, document.getElementById('root'));

index.js ์˜ ์ด ์ฝ”๋“œ๋Š” App ์ปดํฌ๋„ŒํŠธ๋ฅผ public/index.html ํŒŒ์ผ์— ์ž‘์„ฑ๋œ id="root" ์ธ ์š”์†Œ ์•ˆ์— ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


JSX ๋ฌธ๋ฒ•#

JSX๋Š” HTML๊ณผ ์œ ์‚ฌํ•œ ํŽธ๋ฆฌํ•œ ๋ฌธ๋ฒ•์ด์ง€๋งŒ ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.


๊ฐ์‹ธ์ธ ์š”์†Œ#

์ปดํฌ๋„ŒํŠธ์— ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ์š”์†Œ ํ•˜๋‚˜๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š”์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

src/App.js

import React from 'react';
function App() {  return (      <h1>Hello World!</h1>      <h2>Hello React!</h2>  );}
export default App;

Virtual DOM์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋Š” ํ•˜๋‚˜์˜ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ <div> ์š”์†Œ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

src/App.js

import React from 'react';
function App() {    return (        <div>            <h1>Hello World!</h1>            <h2>Hello React!</h2>        </div>    );}
export default App;

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ƒ์œ„์— <div> ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-3

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํŠธ์˜ Fragment ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

src/App.js

import React, {Fragment} from 'react';
function App() {    return (        <Fragment>            <h1>Hello World!</h1>            <h2>Hello React!</h2>        </Fragment>    );}
export default App;

Fragment๋ฅผ ์ด๋ ‡๊ฒŒ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

src/App.js

import React from 'react';
function App() {    return (        <>            <h1>Hello World!</h1>            <h2>Hello React!</h2>        </>    );}
export default App;

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-4

์ด๋ ‡๊ฒŒ ๋ถˆํ•„์š”ํ•œ <div> ์š”์†Œ ์ถ”๊ฐ€๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„#

JSX ์•ˆ์—์„œ๋Š” JS ํ‘œํ˜„์‹์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. JSX ๋‚ด๋ถ€์— ์ฝ”๋“œ๋ฅผ {} ๋กœ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค.

src/App.js

import React from 'react';
function App() {    const name = 'React';    return (        <>            <h1>Hello World!</h1>            <h2>Hello {name}!</h2>        </>    );}
export default App;

์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž(์‚ผํ•ญ ์—ฐ์‚ฐ์ž)#

JSX ๋ฐ–์—์„œ if ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, JSX ๋‚ด๋ถ€์—์„œ๋Š” ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž ์ฆ‰ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์‚ผํ•ญ ์—ฐ์‚ฐ์ž : condition ? exprIfTrue : exprIfFalse

src/App.js

import React from 'react';
function App() {    const name = 'React';    return (        <div>            {name === 'React' ? <h1>Hello React!</h1> : <h1>Who are you?</h1>}        </div>    );}
export default App;

AND ์—ฐ์‚ฐ์ž(&&)#

ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์ƒํ™ฉ.

src/App.js

import React from 'react';
function App() {    const name = 'Reaaaact';    return <div>{name === 'React' ? <h1>Hello React!</h1> : null}</div>;}
export default App;

์ด์ฒ˜๋Ÿผ ์กฐ๊ฑด์ด false๋ผ๋ฉด null์„ ๋ Œ๋”๋งํ•˜๊ฒŒ ํ•˜๋ฏ€๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, &&๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์งง์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<div>  {name === 'React' ? <h1>Hello React!</h1>}</div>

๋ฆฌ์•กํŠธ์—์„œ false๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” null๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ”— Truthy and Falsy

์ฃผ์˜ํ•  ์ ์€ falsyํ•œ ๊ฐ’์ธ 0์€ ์˜ˆ์™ธ์ ์œผ๋กœ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

const number = 0;return number && <div>๋‚ด์šฉ</div>;

์ด ์ฝ”๋“œ๋Š” ํ™”๋ฉด์— ์ˆซ์ž 0์ด ๋ Œ๋”๋ง๋œ๋‹ค.

undefined๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ธฐ#

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํ•จ์ˆ˜์—์„œ undefined๋งŒ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค๋ฉด ์•ˆ๋œ๋‹ค.

src/App.js

import React from 'react';import './App.css';
function App() {    const name = undefined;    return name;}
export default App;

์ด ์ฝ”๋“œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -2์žฅ-jsx-image-5

์–ด๋–ค ๊ฐ’์ด undefined์ผ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ OR(||) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

return name || '๊ฐ’์ด undefined์ž…๋‹ˆ๋‹ค.';

JSX ๋‚ด๋ถ€์—์„œ undefined๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๋‹ค.

return <div>{name}</div>;

์ธ๋ผ์ธ ์Šคํƒ€์ผ๋ง#

๋ฆฌ์•กํŠธ์—์„œ DOM ์š”์†Œ์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๋•Œ๋Š” ๋ฌธ์ž์—ด ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์Šคํƒ€์ผ ์ด๋ฆ„์„ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•(camelCase)๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. (background-color๋Š” backgroundColor๋กœ)

class ๋Œ€์‹  className#

HTML์—์„œ ์‚ฌ์šฉํ•˜๋Š” class ์†์„ฑ ๋Œ€์‹  JSX์—์„œ๋Š” className์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. JSX์—์„œ class๋กœ ์ž‘์„ฑํ•ด๋„ ์ ์šฉ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ console ์ฐฝ์— ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

๊ผญ ๋‹ซ์•„์•ผ ํ•˜๋Š” ํƒœ๊ทธ#

HTML ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ€๋” ํƒœ๊ทธ๋ฅผ ๋‹ซ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, JSX์—์„œ๋Š” ํƒœ๊ทธ๋ฅผ๋‹ซ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํƒœ๊ทธ ์‚ฌ์ด์— ๋ณ„๋„์˜ ๋‚ด์šฉ์ด ์—†๋‹ค๋ฉด self-closing ํƒœ๊ทธ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์„#

JSX ๋‚ด๋ถ€ ์ฃผ์„์€ {/* ... */} ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ํƒœ๊ทธ ๋‚ด๋ถ€์—์„œ๋Š” // ... ์˜ ํ˜•ํƒœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


ESLint์™€ Prettier#

ESLint#

ESLint๋Š” ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ๋„๊ตฌ๋กœ, ์ฝ”๋“œ ์ž‘์„ฑ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ ์—๋Ÿฌ ํ˜น์€ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ VS Code์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Prettier#

Prettier๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ •๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์Šคํƒ€์ผ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— .prettierrc ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•œ๋‹ค.

.prettierrc

{  "singleQuote": true,  "semi": true,  "useTabs": false,  "tabWidth": 2}

์„ค์ •์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์ž‘์€ ๋”ฐ์˜ดํ‘œ, ์„ธ๋ฏธ์ฝœ๋ก , ํƒญ ์‚ฌ์šฉ, ํƒญ ๊ธธ์ด์— ๋Œ€ํ•œ ์„ค์ •์ด๋‹ค.

๋˜ํ•œ VS Code ์„ค์ •์—์„œ Format On Save ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ €์žฅ์„ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์ฝ”๋“œ๊ฐ€ ์ž๋™ ์ •๋ฆฌ๋œ๋‹ค.


๊ฐ™์ด ์ฝ๊ธฐ#

React ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” ์›นํŒฉ(Webpack) ๊ธฐ์ดˆ

์›นํŒฉ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

SPA(single page app)์—์„œ webpack์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

Webpack ๊ฐ™์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž - LINE ENGINEERING