📝 컴포넌트

컴포넌트(Component) : 앱의 기능을 단위별로 캡슐화하는 React의 기본 단위

HTML 요소를 반환하는 함수나 클래스와 같다고 생각해도 된다.
따라서, 컴포넌트는 독립적이고, 재사용 가능한 코드의 조각이다.

컴포넌트의 종류로는, 1. 함수형 컴포넌트, 2. 클래스형 컴포넌트가 있다.

 

💡 함수형 컴포넌트

간단한 예로, 함수형 컴포넌트 형태를 보자.

function Introduce() {
  return <h2>Hi, I am elice!</h2>;
}

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

💡 클래스형 컴포넌트

함수형 컴포넌트와 비교했을 때, 약간 구조만 다른 정도다.
다만, class 선언 시, React.Component의 메소드들을 사용하기 위해, extends를 이용해, React.Component를 상속
render( ) 함수안에, 반환 할, HTML 요소를 return 으로 반환
간단한 예로, 클래스형 컴포넌트 형태를 보자.

class Introduce extends React.Component {
  render() {
    return <h2>Hi, I am elice!</h2>;
  }
}

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

 

💡 이 둘은 각각, 언제 사용하는가 ?

함수형 컴포넌트

  • 단순히 HTML UI를 반환하는 간단한 자바스크립트 함수로 자주 사용한다.
  • 단순히, 데이터를 받고, 렌더링 하면 끝이지 때문에, 비상태형 컴포넌트라고도 한다.

클래스 컴포넌트

  • 클래스 컴포넌트는, "상태(State)"를 구현할 때 사용한다.
  • 여기서, "상태(State)"란, React의 State를 의미하며, 쉽게 말하면, 컴포넌트의 현재 저장된 값
  • 이런, "상타(State)"를 가지는, 클래스 컴포넌트를, 다른 말로, 상태형 컴포넌트라고도 한다.
  • HTML을 반환하는 render( ) 메소드가 구현되어, 복잡한 UI 로직을 구현할 때 클래스형 컴포넌트를 사용한다.
  • 특히, State를 사용할 때, 반드시(?) 클래스형 컴포넌트로 구현이 되어야 한다.

 

그러나, 기술이 발달 되면서, 이제는, 사실, 클래스 컴포넌트에서만, 다룰 수 있던, 컴포넌트의 상태(State)를, 함수형 컴포넌트에서도 다룰 수 있게 되었고, 그러한 기술을 우리는, "훅(hook)" 이라고한다.

이것은, 뒤에서 설명하려고 한다. ( 아주 중요하기 때문 ! )

그리고, 요즘은 사실, 클래스형 컴포넌트보단, hook을 이용한, 함수형 컴포넌트로 React를 구현하는 것이 추세라고 한다.

728x90
반응형

'WEB' 카테고리의 다른 글

[JS] spread  (0) 2021.03.22
[JS] 배열 내장함수  (0) 2021.03.22
[React] JSX 문법 및 렌더링  (0) 2021.02.06
[React] 개요 & JS와 차이점  (0) 2021.02.03
[JS] DOM,Event,Node객체  (0) 2021.02.03

📝 JSX

JSX는 자바스크립트 XML의 약자.
즉, JSX는 자바스크립트를 확장한 문법이며, 그런 만큼, 자바스크립트와 사용법이 많이 비슷하다.
HTML을 React에서 쉽게 쓰기 위해 사용한다.

React는 JSX 문법을 이용해 마크업 언어와 코드의 로직을 따로 분리하지 않고, 두 가지를 포함한 "컴포넌트"를 사용

 

💡 표현식

JSX에서는 "중괄호( { } )"를 이용해, 사용 가능한 표현식들이 있다.

  • 먼저, 중괄호를 이용해, HTML 내에 변수를 표현할 수 있다.
const name = 'elice';
const element = <h1> Hello, {name}! </h1>;
  • 중괄호를 이용해, 함수 표현식을 넣는 것도 가능하다.
function greeting(){
  return "Hello, elice!";
}

const element = <h1>{greeting()}</h1>;
  • 함수 내에서 표현식을 적용할 수도 있다.
function formatGreeting(name){
  return "Hello" + ' ' + name;
}

function getGreeting(user) {
  return <h1>Hello, {formatGreeting("elice!")}!</h1>;
}

 

💡 속성

  • 큰 따옴표를 이용해 JSX의 속성을 지정할 수 있다.
const element = <a href = "https://kdt.elice.io/explore">엘리스로 이동</a>;

 

💡 자식 정의

  • 자식 태그가 여러개 포함된 코드를 저장하기 위해서는, 자식 태그를 부모 태그로 감싸야 한다.
const element = (
  <div>
    <h1>Hello,</h1>
    <h2>elice!</h2>
  </div>
);

// <div> = 부모 태그
// <h1>,<h2> = 자식 태그
  • 모든 태그는 반드시 닫혀야 한다. 다만, 원래 태그 이름을 맞춰서 </input> 처럼 닫아야 하지만
    이름은 생략하고 />만 이용해서 닫아도 괜찮다.
const element = <input type="text" />;

 

💡 객체 표현

React.createElement( ) 메소드를 이용하면, JSX 문법을 이용하지 않고, 객체로 표현할 수 있다.
두 코드는 문법이 다르지만, 같은 내용을 담고 있다.

  • HTML 직접생성
const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
  • React.createElement( ) 로 생성
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

 

📝 엘리먼트 렌더링

Element ( 엘리먼트 ) : React 앱의 가장 작은 단위, 컴포넌트(Component의 구성요소)

쉽게 말하면, HTML 요소라고 할 수 있다.

Rendering( 렌더링 ) : 이러한 element를 화면에 그리는 것

 

💡 ReactDOM과 렌더링

  • React는 가상(Virutal) DOM과 실제로, 표시되는 DOM을 유지한다.
  • React는 실제 DOM을 추상화하여, 가상 DOM에 만들어두고, 데이터가 업데이트되면 한 번에 렌더링한다.
  • 결과적으로, 계속해서 DOM을 렌더링하는 것보다 속도가 빠르다.

ReactDOM.render( ) : 렌더링 함수

  • HTML 파일 안에 Id가 root인 요소가 있다고 해보자.
<div id="root"></div>
  • 해당 HTML에 텍스트를 넣기 위해, ReactDOM.render( )을 이용해, 다음과 같이 렌더링 한다.
const element = <h1>Hello, elice</h1>;
ReactDOM.render(element, document.getElementById('root'));

// ReactDOM에 렌더링 할꺼다. element를, id = root 인 요소에다가 ~

 

💡 엘리먼트 업데이트

  • 엘리먼트는 한 번 생성되면, 수정이 불가능한 불변 객체이다.
  • 값을 변경하고 싶으면, 새로운 엘리먼트를 만들어 업데이트 해야 한다.

만약, 시간을 출력하는 기능을 구현하고 싶다면, 매 초마다 렌더링을 해줘야 할 것이다.

function tick() {
  const element = (
    <div>
      <h1>{new Date().toLocaleTimeString()}</h1>
    </div>
  );
  ReactDOM.render(element, document.getElementById('root'));
}

setInterval(tick, 1000);

Date 객체의 toLocaleTimeString( ) 메소드를 이용하면, 시간을 반환해주는데, 실제로 시간이 변하는 것을 확인하기 위해서는 setInterval( ) 콜백을 이용해 tick을 계속 호출해야한다.
setInterval( )의 매개변수인 1000은 1초를 의미한다.

728x90
반응형

'WEB' 카테고리의 다른 글

[JS] 배열 내장함수  (0) 2021.03.22
[React] 컴포넌트(Component)  (0) 2021.02.06
[React] 개요 & JS와 차이점  (0) 2021.02.03
[JS] DOM,Event,Node객체  (0) 2021.02.03
[HTML] HTML 양식 태그 정리  (0) 2021.02.02

📝 개요

React(리액트)란 사용자 인터페이스를 구축하기 위한 자바스크립트 라이브러리

  • React는 선언적이고, 효율적이고, 유연하다.
  • 컴포넌트(Component)라는 요소를 이용하면 복잡한 UI를 독립적인 단위로 쪼개어 구현할 수 있다.

💡 React를 왜 사용할까 ?

무엇보다, 동적(Dynamic)인 웹페이지를 만들기 위해서이다.
웹 페이지는 각 페이지마다 페이지를 관리해줘야 하고, 사용자의 응답에 따라 인터페이스가 지속적으로 변해야 한다.

한 마디로, React를 사용하는 이유를 정리하자면,,

" 사용자(User)와의 소통을 UI로 쉽게 구현하고 대규모의 웹페이지를 관리하기 위해 사용한다. "


  • React의 Virtual DOM은 사용자 경험을 향상하고 개발자의 작업 속도를 높인다.
    Virtual DOM이란 가상적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 실제 DOM과 동기화하는 프로그래밍 개념이다.
  • React 컴포넌트의 재사용은 개발 시간을 크게 절약한다.
  • 단방향 데이터 흐름을 통해 안정적인 코드를 제공한다.
    단향향 데이터 흐름은 데이터는 항상 일정한 장소에 있고, 그 장소에서만 변경이 가능한 것을 의미한다.
  • 오픈소스이며, 페이스북 라이브러리이기 때문에 지속해서 개발되고 커뮤니티에 공개된다.
  • Hooks 이란 것을 이용해, 컴포넌트의 상태(State)를 쉽게 관리할 수 있다.

💡 React 파일 구조

[ 출처 : elice ]


📝 React 와 자바스크립트의 차이점

React는 앱 작성 방식을 정의하는 라이브러리다. 이는 데이터가 앱에 사용되는 방식과 그 데이터가 변화하는 결과에 따른  UI 변경 방법에 대해 명확한 규칙을 설정하여 수행한다.

반면 자바스크립트는 규칙을 설정하지 않는 스크립트언어이기 때문에, 이러한 순수 자바스크립트로 작성된 앱은 자유로울수는 있지만, 그만큼 정해진 것이 없기 때문에, 코드를 작성하다 길을 잃어버리기 쉽다.

이 둘의 대표적인 차이점을 잠깐 정리하자.

💡 1. 사용자 인터페이스를 처음 만드는 방법

  • JS에서는 보통 다음과 같이 HTML을 요소를 구현한다. 따로 추가적인 코드가 필요하지 않는다.
<div>
    <h1>Grocery List</h1>
    <ul>
        <li>Milk</li>
        <li>Bread</li>
        <li>Eggs</li>
    </ul>
</div>
  • 반면 React는 JSX로 반환되는 컴포넌트를 통해 UI를 정의한다.
  • JSX는 HTML 처럼 보이지만, 실제로는, 자바스크립트다.
/*
다음은 GroceryList 라는 컴포넌트는 
이후 React DOM 라이브러리에 의해 "랜더링(Rendering)"되어 화면에 출력될 수 있다.
*/

function GroceryList(props) {
    return (
        <div>
            <h1>Grocery List</h1>
            <ul>
                <li>Milk</li>
                <li>Bread</li>
                <li>Eggs</li>
            </ul>
        </div>
    )
};

 

💡 앱에서 기능이 분할되는 방식

  • JS는 앱의 기능 또는 UI의 요소를 분할하는 방법에 대한 특별한 요구사항이 없다.
    기본적인 출력은 HTML 파일에 정의한다.
<div>
    <h1>Grocery List</h1>
    <ul id="grocery-list">
        <li>Milk</li>
        <li>Bread</li>
        <li>Eggs</li>
    </ul>
</div>

그리고 목록을 업데이트하는 코드를 자바스크립트 파일(.js)에 넣어야 한다.

function addItemToList() {

  // Add item

}

이렇게 작성되어야 하는 이유는 관심사 분리 원칙에 따라, 화면에 출력을 하는 HTML과 기능을 구현하는 자바스크립트가 분리되도록 설계하였기 때문이다.
하지만 이러한 방식은, 앱이 점차 방대해지고, 복잡해짐에 따라, 컨트롤 하기 어려울 수 있다.

  • 반면, React는 위의 기능을 구현하는데 필요한 코드를 하나의 파일로 유지가 가능하다.
function GroceryList(props) {
    function addItem() {
        // Add Item
    }

    return (
        <div>
            <h1>Grocery List</h1>
            <ul>
                <li>Milk</li>
                <li>Bread</li>
                <li>Eggs</li>
            </ul>
        </div>
    )
};

이렇게 사용하면, 앱이 방대해지고, 복잡해져도, 쉽게 이해할 수 있고, 만들어 놓은 컴포넌트를 앱 전체가 공유할 수 있으므로 코드의 재사용이 가능해진다.

 

💡 3. 브라우저에 데이터가 저장되는 방법

  • JS에서는 사용자 데이터는 일반적으로 DOM에 저장된다.
    DOM은 브라우저 자체에서 만들고, 유지 관리하며, 전체 HTML을 나타낸다.
    예를 들면, 다음과 같이 텍스트 박스를 정의하고, 사용자가 입력하면, 해당 내용이 브라우저에 저장된다.
<input type="text" placeholder="Enter an item" id="item-input" />

그리고 사용자가 값을 입력할 때, 개발자가 먼저 DOM에서 값을 찾은 다음 추출하여, 해당 입력 상자에 값을 수동으로 입력해야 한다.

const input = document.getElementById("item-input"); console.log(input.value);

지금은, 작은 예라, 편리해보이지만, 입력이 여러 개일 때 문제가 될 수 있다.
만약 id가 다른 입력 텍스트 박스가 여러개라면, id 별로 자바스크립트 코드를 모두 관리해야 한다.

  • 반면, React는 사용자의 입력을 기반으로 자신의 상태(State)를 관리하고, 업데이트 하는 제어 컴포넌트를 이용해 사용자 입력 시, 자바스크립트 객체의 텍스트 값을 설정한다. 이를 위해 먼저 상태를 정의해야 한다.
const [itemInput, setItemInput] = useState("");		// 형식 확인하기

입력이 변경될 때마다 설정이 되어야 하므로, HTML 코드는 조금 복잡해질 수 있다.

<input type="text" placeholder="Enter an item" value={itemInput} onChange={e => 
setItemInput(e.target.value)} />

하지만, 자바스크립트에서는 다음과 같이, 간단하게 텍스트 박스의 현재 값을 훨씬 쉽게 알 수 있다.

console.log(itemInput);

현재 앱의 상태(State)를 저장하기 위해 DOM에 의존하지 않음으로써, React가 사용자 데이터를 관리하는 이점은 앱이 성장할수록(커질수록) 그 효과는 커진다.

자바스크립트 변수에 앱의 상태를 저장하는 것은 React가 자바스크립트에 비해 얻을 수 있는 가장 큰 이점 중 하나이며 앱이 복잡할수록 해당 이점이 커진다.

 

💡 4. UI 업데이트 방법

마지막은, 이벤트 발생 시, 앱이 사용자에 반응하는 방식과 새로운 변경 사항을 반영하는 UI 업데이트 방식이다.

  • JS에서는 텍스트 박스 옆에 다음처럼 버튼을 추가할 수 있다.
<input type="text" placeholder="Enter an item" id="item-input" /> <button id="add-button">Add</button>

그런 다음, 해당 버튼을 누른 것에 응답하기 위해 DOM에서 버튼을 찾는다.

const addButton = document.getElementById("add-button");

그리고, 그 버튼에 click listener를 설정한다.

addButton.addEventListener("click", function() {

  // Append item

})

그런 다음, 리스너 내부에서, 먼저 이전과 동일한 방법을 사용하여, 입력 상자의 값을 가져올 수 있을 것이다.
그런 다음, 식료품 목록에 새 항목을 추가하려면, DOM에서 목록을 찾고, 추가 할 새 항목을 만든 다음, 마지막으로 목록 끝에 추가해야 할 것이다. ( 이렇게만 봐도, 상당히 복잡함을 알 수 있다. )

  • 반면, React는 자바스크립트 변수의 전체 상태를 유지한다.
const [items, setItems] = useState(["Milk", "Bread", "Eggs"]);

그리고 변수의 각 항목을 매핑(Mapping)한 후, 그에 대한 목록 요소를 반환하여 JSX에 표시한다.

// 형식, 확인하기

<ul>
    {items.map(item => (
        <li key={item}>{item}</li>
    ))}
</ul>

그런 다음, 버튼을 누르는 기능을 정의한다. click listener는 필요하지 않고, onClick 버튼 자체에 속성을 추가 할 수 있다.

<button onClick={addItem}>Add React</button>

이 함수에 추가할 것은 setItem 함수를 사용하여, 기존 항목에 새 항목을 추가하는 것이다.

function addItem() { console.log(itemInput); setItems([...items, itemInput]); }

이로써, React는 목록이 변경되었음을 자동으로, 등록하고, UI를 자동으로 업데이트한다.

이 업데이트 기능은 React가 가진, 위대함 중 하나이다.

728x90
반응형

'WEB' 카테고리의 다른 글

[React] 컴포넌트(Component)  (0) 2021.02.06
[React] JSX 문법 및 렌더링  (0) 2021.02.06
[JS] DOM,Event,Node객체  (0) 2021.02.03
[HTML] HTML 양식 태그 정리  (0) 2021.02.02
[HTML] 시맨틱 태그 정리  (0) 2021.02.02

📢 개요

강력한 MVC 웹 프레임워크들이 등장하고 발전하면서 우리는 빠르고 편리하게 웹사이트를 개발할 수 있게 되었습니다.

하지만 기술이 발달해서 어떤 필요를 충족하고 나면, 항상 또 다른 수요와 해결과제가 생기게 되죠 ?

기존 MVC 웹이 가졌던 아쉬움들 중에서 2가지 예시를 보면

1. 오래된 웹사이트일수록, 이것저것 많이 있는 웹사이트에서 한 게시글을 읽고, 내용이 마음에 들어 "좋아요"를 눌렀다.

👉 이거 하나 눌러서, 전체 좋아요 수가 증가하는 것을 업데이트하려고, 화면이 "깜빡"하면서 페이지가 새로 로딩된다.

게시물 페이지 접근시

 

게시물 페이지에 좋아요를 반영한 경우

좋아요를 눌렀을 경우, 위에 두 그림같은 과정이 매번 좋아요 버튼을 누를경우 반복될 것입니다. 

바뀐건 좋아요 하나뿐인데, 위에 모든 작업을 매번 새로하다보니, 굉장히 비효율적이지요.

사이트에 로드할 정보들이나 이미지가 많으면, 데이터 낭비도 심할 것입니다.

결과적으로, 이건 옛날 방식 !

2. 옛날에는, PC용 웹사이트 하나만 만들면 되었지만, 요즘같은 모바일 시대에서는, 앱이나 스마트폰 브라우저로 서비스들을 이용하면서, 이제는 어느정도 갖춰진 사업을 하는 회사에서는, PC용 웹사이트, 모바일용 사이트,안드로이드,ios 서버까지 개발하게 되었습니다.

👉 반응형 웹사이트를 만든것이 아니라는 전제하에, PC나 모바일 페이지에 접속하는 방식은 위 그림과 비슷한 과정을 보이며, 안드로이드나 ios에서는 자체적인 OS환경에서 페이지가 로딩되도록, 따로 프로그래밍을 해야합니다.

사이트 하나만 만들면 되던 예전보다, 개발 인력이 배로 들것입니다.

여기서, 겹치는 부분을 최소화하고, 업무를 좀 더 깔끔하게 분할할 수는 없을까요 ?

예를들어, 안드로이드와 ios에는 자체적인 SW와 시스템이 있어서, 서버로부터 데이터만 전송받으면 화면이 보여질 수 있으니, 웹에서도 그게 가능하다면, 즉 서버에서 데이터만 보내줘도, 그걸 서버가 아닌 "사용자의 브라우저"에서 HTML/CSS/JS로 렌더링해낼 수 있다면, 서버는 어디서 정보를 요청하든, 동일한 작업을 수행해서 데이터만 전송하면 될 것 입니다.

사용자 컴퓨터의 브라우저에서 돌아가는 👉 프론트엔트(Front_End)
서버에서 돌아가는 👉 백앤드(Back_End)

철저하게 분리하는 것이지요.

 

📢 Angular, React, Vue 는 SPA Framework

브라우저에서도 동작하는 "JavaScript" 로 강력한 라이브러리나 프레임워크를 만든 것이 바로

👉 Angular, React, Vue 같은 "SPA 프레임워크" 입니다.

SPA = Single Page Application 이라고 하는데요.

비유를 하면, 종업원들이 고기와 쌈재료를 가져다주면, 주방장이 아닌, 손님이 직접 불판에 구워먹는 고기집이라고 생각하면 됩니다.

게시물 페이지 SPA 방식

이렇게 되면 사이트에서 뭘 할 때마다 새로 접속하지 않고, 한 번 로드된 화면에서 많은 기능을 수행 할 수 있게 됩니다.

그래서 Single Page Application, SPA 라고 불리는 것입니다.

 

📢 마무리

왼쪽에서부터 React / Angular / Vue

Angular, React, Vue 에 대한 자세한  설명까지하는것은 이 글의 취지는 아니어서 생략하겠습니다.

다만, 대표적인 이 3가지의 SPA 프레임워크는 방식들은 조금씩 다르지만, 기본 원리와 아이디어는 유사합니다.

특징만 간단히 말하자면

  • Vue : 코드가 깔끔하고 배우기 쉽다. Angular, React에 비해 후발주자지만 빠르게 성장하고 있습니다.
  • React : Facebook에서 만들었는데, 막강한 커뮤니티와 자료들을 갖추고 있습니다. 다른 서비스에 잘 녹아들어 유연함을 요하는 서비스들에 권장됩니다.
  • Angular : Google에서 만들었고, TypeScript라는, JavaScript를 보완한 언어로, 매우 안정적이고 탄탄한 프론트엔드 앱을 만들 수 있다고 합니다. 대신 상대적으로 무겁고 배우기 어렵다고 하네요.

 

 

문제나 잘못되었거나 미흡한것이 있다면 알려주세요.🙏


 

728x90
반응형

+ Recent posts