
리액트를 다루기 위해선 ES6, JSX, 컴포넌트 정의하는 방법을 알아야합니다. 이번 포스팅에서는 리액트의 개념과 특징을 정리하고, JSX 에 대해 알아보려고 합니다.
The library for web and native user interfaces = 사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리.
즉, SPA(Single Page Application)를 쉽고 빠르게 만들수 있도록 해 주는 도구
자주 사용되는 기능을 정해 모아 놓은 것
대표적인 자바스크립트 UI 라이브러리 : Angular, React, Vue.js
[프레임워크 vs 라이브러리]
프레임워크는 흐름의 제어 권한을 개발자가 아닌 프레임워크가 갖고 있는 반면,
라이브러리는 흐름에 대한 제어를 하지 않고 개발자가 필요한 부분만 필요할 때 가져다 사용하는 형태이다.
일반 웹 페이지에 react.js 파일을 추가해서 기능을 구현한다.

예시 파일을 작성하기 위해 디렉터리를 생성했다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
**<!-- #1 HTML 파일에 DOM 컨테이너를 추가
~~~~~~~~~~~
Root DOM Node => Virtual DOM의 시작점
-->
<div id="root"></div>
<!-- #2 리액트 파일(react.js, react-dom.js)을 추가
https://ko.legacy.reactjs.org/docs/cdn-links.html
-->
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<!-- #3 리액트 컴포넌트 코드를 추가 -->
<script src="MyButton.js"></script> **
</body>
</html>
function MyButton(props) {
const [isClicked, setIsClicked] = React.useState(false);
// <button onClick="..."> ... </button>
// ~~~~~~ ~~~~~~~~~~~~~ ~~~
// | | +-- 세번째 매개변수
// | +-- 두번째 매개변수 ⇒ 속성을 객체 형식으로 전달
// +-- 첫번째 매개변수
return React.createElement(
"button",
{ onClick: () => setIsClicked(!isClicked) },
isClicked ? "Clicked" : "Click here"
);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(React.createElement(MyButton));
HTML ⇒ XML
~~~~~~~~~~~~~~~~~~~~~~~~~
const element = <h1> Hello, World ! </h1>;
~~~~~~~~~~~~~~~ ~
| |
+----------- JavaScript --------------+
const element = React.createElement('h1', {}, "Hello, World !");
리액트 기반 웹 어플리케이션 개발에 필요한 모든 설정 상태의 프로젝트를 만들어주는 도구.
기존에는 CRA로 개발해왔으나 최근엔 CNA 방식을 권장하고 있음.
패키지 설치 과정은 아래와 같다.


프로젝트 디렉터리로 이동해서 개발 서버를 실행한다.

C:\react\my-next-app\src\pages\MyButton.js
import { useState } from "react";
function MyButton(props) {
const [isClicked, setIsClicked] = useState(false);
/*
return React.createElement(
"button",
{ onClick: () => setIsClicked(!isClicked) },
isClicked ? "Clicked" : "Click here"
);
*/
return (
<button onClick={() => setIsClicked(!isClicked)}>
{isClicked ? "Clicked" : "Click here"}
</button>
);
}
export default MyButton;
C:\react\my-next-app\src\pages\index.js
import MyButton from "./MyButton";
export default function Home() {
return (
<MyButton />
);
}
패키지 설치 과정은 아래와 같다.


c:\react\my-cra-app\src\MyButton.js
import { useState } from "react";
function MyButton(props) {
const [isClicked, setIsClicked] = useState(false);
/*
return React.createElement(
"button",
{ onClick: () => setIsClicked(!isClicked) },
isClicked ? "Clicked" : "Click here"
);
*/
return (
<button onClick={() => setIsClicked(!isClicked)}>
{isClicked ? "Clicked" : "Click here"}
</button>
);
}
export default MyButton;
c:\react\my-cra-app\src\App.js
import MyButton from "./MyButton";
function App() {
return (
<MyButton />
);
}
export default App;
차세대 빌드 도구. JavaScript, TypeScript 기반 웹 애플리케이션을 더 빠르고 효율적으로 개발하기 위해 설계
c:\react> npm create vite my-app
~~~~~~ 프로젝트 이름npx
create-vite my-app
√ Select a framework: » React ⇐ 화살표 키를 이용해서 이동 후 선택√ Select a variant: » JavaScript
Scaffolding project in c:\react\my-app...
Done. Now run:
cd my-app
npm install
npm run dev
c:\react> cd my-app ⇐ 프로젝트 디렉터리로 이동
c:\react\my-app> npm install ⇐ 의존 모듈 설치
c:\react\my-app> npm run dev ⇐ 개발 서버 실행
my-app@0.0.0 dev
vite
VITE v6.0.7 ready in 246 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help

공격자가 전달한 스크립트 코드가 사용자 브라우저를 통해서 실행되는 공격 기법
희생자 브라우저에서 공격자가 전달한 스크립트 코드가 실행되면,
희생자 브라우저 또는 PC에 저장된 정보를 탈취 ⇒ Cookie
가짜 페이지를 만들어 사용자 입력을 유도해서 입력한 정보를 탈취
해당 PC의 제어권을 탈취해서 원격에서 제어 ⇒ BeeF와 공격 프레임워크를 활용해서 가능
방어기법
스크립트 코드가 실행되지 않도록 안전한 형태로 변경해서 저장하거나, 응답
CSP (컨텐츠 보안 정책) ⇒ https://developer.mozilla.org/ko/docs/Web/HTTP/CSP
create-react-app으로 생성한 my-cra-app 프로젝트의 App.js 파일(C:\react\my-cra-app\src\App.js)을 수정하면서 실습을 진행


문제점 : 불필요한 태그가 추가 됨.
불필요한 태그 추가를 방지할 수 있다.

import도 하지 않는다. <> </> 로 표현됨. 가장 많이 쓰는 방식!

function App() {
const name = "홍길동";
const age = 23;
return (
<>
<h1>{`안녕, ${name}`}</h1>
<h1>안녕, {name}</h1>
<h2>{age + 2}</h2>
</>
);
}
export default App;
<h2>{name === "홍길동" ? "환영합니다." : "환영하지 않습니다."}</h2>
<h2>{name === "홍길동" ? "환영" : null}</h2>
단락연산자(short circuiting operator)를 활용한다. && 뒤의 구문은 조건을 만족했을 때 출력할 내용을 넣어주면 된다.
<h2>{name === "홍길동" && "환영이요"}</h2>
태그 내에서 style 속성을 이용해서 스타일을 지정하는 방법
DOM 요소에 스타일을 지정할 때엔 객체 형태로 적용해야하며, 스타일 이름은 카멜 표현식을 사용, 숫자 타입의 경우 단위를 생략하면 기본값이 px 이다. (단위를 포함할 때엔 문자열로 표현)
<h1 style={{backgroundColor: "black", color : "yellow", fontSize:28, padding:'16px'}}>{`안녕, ${name}`}</h1>
중괄호가 두번 쓰여지는데, 겉 괄호는 표현식을 의미, 안 괄호는 js 의 객체를 나타내는 것.
function App() {
const myStyle = { backgroundColor: "black", color: "yellow", fontSize: 28, padding: '16px' };
return (
<>
<h1 style={myStyle}>{`안녕, ${name}`}</h1>
</>
);
}
export default App;
변수 선언 후 key & value 값을 갖는 객체로 일괄 선언 가능
function App() {
const name = "홍길동";
const myStyle = {
h1Style: { backgroundColor: "black", color: "yellow", fontSize: 28, padding: '16px' },
h2Style: { color: "red" }
};
return (
<>
<h1 style={myStyle.h1Style}>{`안녕, ${name}`}</h1>
<h2 style={myStyle.h2Style}>{name === "홍길동" && "환영합니다."}</h2>
</>
);
}
export default App;
function Name() {
let name;
return name || "아무개";
}
function App() {
return (
<>
안녕, <Name />!
</>
);
}
export default App;
위의 코드에서 name||"~"; 는 || 앞의 값이 null 일때 "~"로 결과를 리턴하는 삼항연산자이다.
<div class="myclass"> ... </div> ⇒ <div className="myclass"> ... </div>
.react {
background-color: black;
color: yellow;
font-size: 40px;
padding: 10px;
}
import "./App.css";
function App() {
return (
<div className="react">홍길동</div>
);
}
export default App;
내용이 없는 태그의 경우엔 self-closing 태그를 사용
e.g.
컴포넌트 외부, 태그가 시작되기 전에는 자바스크립트 주석 과 같은 (//, /* */) 형태를 쓸 수 있다. 하지만 태그가 시작 되면 주석이 아닌 일반 문자열로 인식되어 출력된다.
이 경우엔 {/* */} 와 같이 중괄호 안에 자바스크립트 표현식으로 주석 처리하면 된다. //와 같은 인라인 주석을 사용할 때엔 유의해야한다. 닫는 괄호가 주석처리 되기때문에 표현식 끝에(다음 라인에) 닫는 괄호를 넣어주도록 한다. 이 주석은 많이 쓰지 않음!
import "./App.css";
// 자바스크립트 주석
/*
자바스크립트 주석
*/
function App() {
// 자바스크립트 주석
/*
자바스크립트 주석
*/
return (
// 태그가 시작되기 전에는 자바스크립트 주석 사용이 가능
/*
자바스크립트 주석
*/
<>
// 태그가 시작되면 주석이 아닌 일반 문자열로 인식
/*
일반 문자열로 해석되어 화면에서 출력
*/
{ /* 자바스크립트 표현식으로 주석을 처리 */}
{ //인라인 주석을 사용할 때는 유의해야 함(표현식 끝에 }을 사용하면 주석 처리돼 버림)
}
<input type="text" />
<input type="text"></input>
</>
);
}
// 자바스크립트 주석
/*
자바스크립트 주석
*/
export default App;
JSX (자바스크립트 + XML) 즉 자바스크립트 확장 문법을 학습했는데, 생소하지만 구조가 있는 것 같아서 계속 보다보면 외워질 것 같습니다. 익숙해지는 그날까지...계속 화이팅!