본문 바로가기

개발일지/React

React를 배워보자(feat. 노마드 코더 - ReactJS 로 영화 웹 서비스 만들기)

반응형

 기존에 Spring Boot를 이용한 서버와 API를 만들었고 프론트단을 JSP와 Thymeleaf를 사용해서 동적인 부분을 처리하는 서비스를 구현했었다. 하지만, Refresh token으로 인한 JWT token의 교체를 구현하는데 어려움이 있었고 동적인 View를 구성하는 데 있어 예전 팀프로젝트에서 사용했던 React를 배워보려고 한다. 

 

 강의를 찾아보다 노매드 코더의 무료강의가 눈에 띄어 찾아들어보게 되었다.

https://nomadcoders.co/react-for-beginners

 

우선, 첫 번째로 기존의 html과 JS를 이용하여 동적인 구조를 살펴보았다.

<!DOCTYPE html>
<html>
<body>
    <span>Total clicks : 0</span>
    <button id="btn">Click me</button>
</body>
<script>
    let counter = 0;
    const button = document.getElementById("btn");
    const span = document.querySelector("span");
    function handleClick() {
        counter = counter + 1;
        span.innerText = `Total clicks : ${counter}`;
    }
    button.addEventListener("click", handleClick);
</script>
</html>

기존의 방식은 html 문서 생성 -> <body>에 contents와 button생성 -> button에 JS를 연결 -> button의 click시 count의 증가

 

html의 tag를 생성 후 JS로 동적 변화를 주는 순서로 구현된다.

 

 

그리고 ReactJS를 이용한 구현은 다음과 같았다.

<!DOCTYPE html>
<html>
<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
    const root = document.getElementById("root");
    const h3 = React.createElement(
        "h3",
        {onMouseEnter: () => console.log("mouse enter")},
        "Hello"
    );
    const btn = React.createElement(
        "button",
        {onClick: () => console.log("button")},
        "Click me"
    );
    const container = React.createElement("div", null, [h3, btn]);
    ReactDOM.render(container, root);
</script>
</html>

 우선 React를 사용하기 위해 React와 React-Dom을 <script>로 불러온다.

<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>

 

React의 경우 작동방식이 조금 달랐다.

먼저 최상단 <div> root를 생성 -> 변수 형태의 elements를 생성(btn, h3) -> root에 lender의 형태로 기존 JS와는 순서가 다소 반대로 되어있었다.

 

 React.createElement() 함수를 이용하여 elements를 작성할 수 있지만, 조금 더 편한 방법으로 개선할 수 있다.

JSX (Javascript Syntax eXtension) 를 이용해 더 편한 방법으로 작성 후 babel로 변환해 주면 조금 더 쉽게 코드 작성이 가능하다.

<!DOCTYPE html>
<html>
<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    const root = document.getElementById("root");
    const Title = ()=>
        <h3 id="title" onMouseEnter={()=> console.log("mouse enter")}>
            Hello I'm a title
        </h3>;
    const Button = ()=>
        <button style={{backgroundColor : "orangered"}} onClick={()=> console.log("im clicked")}>
            Click me
        </button>;
    const container = React.createElement("div", null, [title, Button]);
    ReactDOM.render(container , root); // span을 root안에 배치

    // 만들어진 컴포넌트는 반드시 첫문자를 '대문자'로 구분하여 일반 tag와 혼동되지 않게한다.
    const Container = ()=> (<div>
        <Title /> 
        <Button />
        </div>);
    ReactDOM.render(<Container/> , root);
</script>
</html>

JSX와 babel을 사용하기 위해 script를 추가해 준다.

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">

 여기서 독특한 점은 변수 형태로 elements를 만들어 주는 방법은 비슷하지만 함수화 시켜 변수를 함수로 작성한다는 점이었다. 

const h3 = React.createElement(
        "h3",
        {onMouseEnter: () => console.log("mouse enter")},
        "Hello"
    );
const Title = ()=>
        <h3 id="title" onMouseEnter={()=> console.log("mouse enter")}>
            Hello I'm a title
        </h3>;

 위의 React.createElemnet를 사용할 경우 전달 인자를 (html tag, property, contents) 순으로 입력해 주어야 한다. 하지만 JSX를 사용하면 훨씬 더 html에 가까운 문법으로 elements를 생성할 수 있다. (실제로는 아래와 같이 작성 시에 babel을 통해 위의 코드처럼 변화한다.)

 컴포넌트 구성의 특징은 1.함수 형태 2.첫 문자는 대문자 3.하나의 <div>안에 작성이다. 기존의 html tag와 혼동되지 않도록 컴포넌트의 첫 글자는 대문자를 사용해야 하며, 여러 가지 elements들이 있더라도 그것을 감싸는 부모 div가 꼭 필요하다.

 

 이제 counter 변수를 설정하고 counter를 증가 시켜주는 함수를 만든다. countUp()함수가 실행이 되면 render함수가 작동하면서 화면을 다시 그려준다.

<!DOCTYPE html>
<html>
<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    const root = document.getElementById("root");
    let counter = 0;
    function countUP() {
        counter = counter + 1;
        render();
    }
    function render() {
        ReactDOM.render(<Container/>, root);
    }
    const Container = () => (
        <div>
            <h3>Total clicks: {counter}</h3>
            <button onClick={countUP}>Click me</button>
        </div>
    );
    render();
</script>
</html>

 화면을 다시 그릴 때 vanilla JS와 ReactJS의 차이점이 있는데 vanilla JS의경우 counter를 포함하고 있는 tag 전체가 업데이트되는 반면, ReactJS 경우 변화가 일어나는 counter 부분만 변경이 된다. 이 점이 아주 신기하고 재미있었다.

왼쪽 : vanilla JS , 오른쪽 : ReactJS

 

 

git : https://github.com/leesulgi66/React_for_Beginners/commit/e12aadcbceab448d88d8194bd3b550a20a64b9f6

반응형