Destructuring이 마치 냉장고에서 샌드위치 재료를 꺼내듯 원하는 프로퍼티(속성)을 추출해서 손쉽게 사용한다(변수에 바인딩 한다)는 개념을 이전 글에서 배웠습니다. 쉽게 말해, Object Destructuring은 냉장고(객체) 속 음식재료(프로퍼티)를 변수(냄비)에 넣어 사용한다고 볼 수 있습니다.

 

 Array Destructuring에 대해 짧게 알아봤지만, Array도 중요하지만 Object Destructuring 또한 너무나 중요한 개념이기 때문에 이번에 배워보겠습니다. 먼저, JavaScript에서의 'Object'는 무엇일까요?

 

 

Object


먼저 객체에 대해 짧게 알아보겠습니다.

JavaScript는 객체기반 프로그래밍이라고도 하죠. 자바스크립트를 구성하는 거의 모든 것들은 객체라고 할 수 있습니다. 객체는 최종적으로 0개 이상의 프로퍼티 집합으로 볼 수 있으며, 프로퍼티란 {Key:Value}라고 볼 수 있습니다.

 

Object(객체) : 키(key)와 값(value)으로 구성된 프로퍼티(property)정렬되지 않은 집합

 

  • JavaScript의 기본 타입(data type)은 객체(Object)입니다.
  • JavaScript에서 숫자, 문자열, 불리언, undefined 타입 (즉, 원시 타입)을 제외한 모든 것이 객체입니다.
  • 숫자, 문자열, 불리언, undefined과 같은 원시 타입은 객체가 아니지만, 값이 정해진 객체로 간주되어 객체로서의 특성도 가집니다.
  • 프로퍼티의 값으로 함수(function)이 올 수 있는데, 이 때 이 것을 메서드(method)라고 부릅니다.
// 객체 person
var person = {
	// 프로퍼티 키(Key) : 프로퍼티 값(Vaule)
	name: 'hwonda',		// 프로퍼티 1
	age: 30			// 프로퍼티 2
}

△ 위와 같이 객체는 프로퍼티 집합으로 볼 수 있습니다.

 

var person = {
    distance: 0,
    // 객체 속 프로퍼티 키가 '함수'인 경우, 이를 '메서드'라고 부른다.
    // 객체 'person' 내의 메서드 'walking'
    walking: function() {
    	distance++;
    }
}

△ 이처럼 메서드는 프로퍼티(key:value형태의 data)를 참조하고 조작할 수 있는 동작(like function)입니다.  

 

// ES6
let a = 0;
let b = 1;

// ES6 문법으로 프로퍼티 값으로 변수를 사용할 때
// 변수이름 == 프로퍼티 키라면
// 프로퍼티 키를 생략할 수 있습니다.
const obj = {a, b};

console.log(obj);  // {a: 0,b: 1}

이 내용을 잘 기억해주세요! 아래 Object Destructuring ES6문법에서 참고할 예정입니다.

 

 

Object Destructuring


 객체 추출은 다음과 같이 진행됩니다.

// 변수선언 = 객체 혹은 프로퍼티
//
// 그러면 내가 만든(객체의 필요한 data를 가지는) 새 변수를 마음껏 쓸 수 있지.

 

 ES5 문법으로 객체 추출을 하기 위해서는 프로퍼티 키(Key)를 사용합니다.

// ES5
var obj = {a: 1, b: 2};

var one = obj.a;
var two = obj.b;

console.log(one, two);	// 1 2

위와 같은 경우, 마침표 프로퍼티 접근 연산자(.)를 사용했습니다.

 

 마침표 외에 대괄호 프로퍼티 접근 연산자([ ])도 사용 가능합니다.

// ES5
var obj = {a: 1, b: 2, 10: '이것도 돼?'}

// 대괄호로 프로퍼티를 가져오는 경우, 프로퍼티 키는 '따옴표' 안에 넣어야 합니다.
var one = obj['a'];
console.log(one);	// 1

// 그렇지 않는 경우 다음과 같은 에러가 뜹니다.
var two = obj[b];
console.log(two);	// Uncaught ReferenceError: b is not defined

// 신기하게도, 프로퍼티 키가 숫자인 경우 '따옴표'는 생략 가능합니다.
var ten = obj[10];
console.log(ten);	// '이것도 돼?'

 

ES6 문법에서의 Object Destructuring 방법은 다음과 같습니다.

const obj = {a: 1,b: 2}

const {one, two} = obj;

console.log(one, two);	// undefined undefined

아차! ES6 문법에서 축약식 표현을 하기 위해서는 프로퍼티 키와 변수명을 동일하게 해줘야 했습니다.

const obj = {a: 1,b: 2}

// 변수명의 순서를 바꿔도, 프로퍼티 키를 기준으로 할당(추출)되므로 a=1, b=2가 됩니다.
const {b, a} = obj;

console.log(a, b);	// 1 2

 

그렇다면 변수를 객체로 준다면 어떻게 될까요?

// ES5
// one이라는 변수에 'a'값을, two라는 변수에 'b'값을 넣어준다.
const {prop1:one, prop2:two} = {prop1:'a', prop2:'b'}
console.log(one, two);	// a b

// ES6에서는 변수명과 프로퍼티 키만 동일하게 설정해주면 된다.
const {one, two} = {one:'a', two:'b'}
console.log(one, two);	// a b

 

객체 추출 중 가장 현업에서 자주 사용하는 기능은 필요한 프로퍼티 값만 추출하는 것입니다. 예제는 다음과 같습니다.

const weather = [
	{ id: 'sunny', image: 'sun', isToday: false},
    { id: 'rainy', image: 'rain', isToday: false},
    { id: 'windy', image: 'wind', isToday: true}
];

const todayWeather = weather.filter(({isToday}) => isToday);
console.log(todayWeather)  
// 먼저 원하는 객체가 결과로 나온다.
//{id: 'windy', image: 'wind', isToday: true}
// 객체 단 1개이므로, length는 1이다.
//length: 1
//[[Prototype]]: Array(0)

 

 

 저번 시간에 우리는 JSX 문법데이터바인딩에 대해 간략하게 알아보았습니다.

 

▽ 복습

변수와 { 중괄호 }를 이용해 자료를 잠깐 저장해서 불러왔습니다. css는 참조만 해주세요.

 

 오늘은 React의 꽃이라 불리는 State에 대해 알아보겠습니다.

 

useState를 대체 왜 써요?


state : 리액트 컴포넌트의 변경 가능한 데이터를 표현하는 자바스크립트 객체

 

 state는 짱 좋습니다. state를 수정하면 자동으로 html에 반영되는 성질을 가지고 있기 때문이죠.

 

 React에서 data를 잠깐 저장하는 방법

  1. (복습과 같이) 변수에 저장한다.
  2. state에 저장한다.

변수에 저장해도 될텐데 왜 굳이 state에 data를 저장하는 걸까요? 이는 웹이 App처럼 동작하게 하기 위해서 입니다. 변수에 data를 저장한다면, 데이터가 바뀌면 새로고침을 눌러줘야 HTML의 재렌더링(re-rendering)이 진행되어 데이터 값이 수정됩니다. 하지만 state를 사용한다면 데이터가 바뀔 때 HTML이 자동으로 재렌더됩니다. 다음을 보시죠.

 

import { useState } from 'react';
import './App.css';

function App() {

  let [photo, setPhoto] = useState(['PhotoCard_01', 'PhotoCard_02']);	//state에 Number, Array, Object 등 갖가지 것들을 저장할 수 있습니다.
  let [good, setGood] = useState(0);

//click 시 실행할 함수, good + 1 을 리턴하는 것이 아니라 setGood(good + 1)을 리턴합니다. state를 직접적으로 수정이 불가하기 때문입니다.
  let ifClick = () => {	
    setGood(good + 1);
  }

  return (
    <div className="App"> 
      <div className="datastyle">
        { photo[0] } 
      </div>
      <span>좋아요: { good } 개 </span>
      <button onClick={ifClick}>좋아요</button>
    </div>
  );
}

export default App;

△ 인스타그램 '좋아요' 기능과 같이 버튼을 누르면 좋아요 갯수가 1씩 증가하는 state 사용해 보았습니다.

 

 △ 다음과 같이 동작하며, 좋아요를 누르면 state의 상태만 변화하고, 새로고침 시 좋아요 갯수는 초기화됩니다.


state의 형식

  • {useState}를 React로부터 import한다.
import {useState} from 'react';
  • 변수 선언을 해야하며, 초기값이 필요하다.
let [변수명1, 변수명2] = useState(초기값);

※ 변수명1 : state에 보관한 자료

※ 변수명2 : state 변경을 도와주는 함수

 

이처럼 자주 변경되는 html은 state로 만들어 데이터바인딩하면 되겠습니다.

 

 이런 상태를 관리해주는 React의 컴포넌트는 useState뿐일까요? 그렇지 않습니다. useEffect, useCallback 등 다양한 함수들이 있습니다. 이런 함수형 컴포넌트들의 집합을 Hooks(훅)이라고 합니다. 이제 Hooks에 대해 조금 더 알아봅시다.

 

 

Hooks


Hooks: [ 상태 관리 / 라이프사이클 API ] 사용이 가능한 함수형 컴포넌트들

https://ko.reactjs.org/docs/hooks-intro.html

 

Hook의 개요 – React

A JavaScript library for building user interfaces

ko.reactjs.org

△Hook에 관한 React 공식 문서

 

 Hooks는 React 16.8버전 이후 추가된 기능입니다. Hook은 기존의 함수형 컴포넌트가 할 수 없었던 다양한 기능(특히 정보를 잠깐 저장하고 업데이트 하는 것)을 할 수 있게 만들어줍니다.

 

 Hook이 등장하기 전에는 상태를 관리하기 위한 Class형 컴포넌트가 필요했습니다. 그러나 Class형 컴포넌트는 다음과 같이 몇 가지 단점이 있었습니다.

  • 여러 컴포넌트 사이에 상태를 관리하기 위한 로직을 재사용하기 어려웠습니다. 
  • 상태와 관련된 로직이 모두 같은 공간에 있어, 복잡한 컴포넌트는 이해하기 어려웠습니다.
  • JavaScript Class의 'this' 를 이해하기 어려웠습니다. 

 

 Hook을 통해 React는 계층변화 없이 상태관련 로직을 재사용하고, 작은 함수로 컴포넌트를 나눠 Class의 사용을 최소화할 수 있었습니다. 상대적으로 어려운 Class를 사용할 필요 없이 모듈로 활용할 수 있다는 점이 Hook의 장점이라고 볼 수 있습니다.

 

Hook은 다음과 같은 규칙을 따릅니다.

  • 같은 Hook을 여러 번 호출할 수 있습니다.
  • 반복문, 조건문, 중첩된 함수 내에서 Hook을 호출하는 것을 지양해야 합니다.(버그가 생겨서 그러지 실행은 되긴 함)
  • JS함수가 아닌 React함수 내에서 호출해야 합니다.

 특히 두번째 규칙의 부가설명) React Hook은 호출되는 순서에 의존하기 때문에, 조건문이 만약 false라서 해당 부분을 건너뛰면 순서가 밀려서 버그가 생깁니다. true인 경우에는 실행이 되기 때문에 해도 괜찮다고 생각이 들 수도 있지만, 하지 말라고 하지 않는 것이...!

 

Hook 종류


hooks 동작
useState 컴포넌트의 상태(state)를 관리한다.
useEffect 렌더링 이후 실행할 코드를 만든다.
useContext 부모-자식 컴포넌트 사이의 변수와 함수를 전역적으로 정의한다.
useReducer 컴포넌트의 상태(state) 업데이트 로직을 Reducer 함수에 따로 분리한다.
useRef 컴포넌트, HTML 요소를 래퍼런스로 관리한다.
useImperativeHandle useRef로 만든 래퍼런스의 상태에 따라 실행할 함수를 정의한다.
useMemo 의존성 배열에 적힌 값이 변할 때만 결과값을 다시 정의(재사용)한다.
useCallback useMemo와 비슷하게 특정 함수를 다시 정의(재사용)한다.
useLayoutEffect 모든 DOM 변경 후 브라우저가 화면을 렌더링하기 전에 실행되는 기능을 지정한다.

 △ 해당 hook들은 하나씩 직접 사용해보도록 하겠습니다.

 

'Front-End > REACT' 카테고리의 다른 글

#02. [REACT] JSX와 Data Binding 5분컷  (2) 2022.12.01
#01. [REACT] 설치와 개발환경  (0) 2022.11.30
#00. [REACT] 를 왜 쓰나요?  (0) 2022.11.29

 

 ES6 문법 중 하나인 Destructuring이란 무엇일까요? 영단어 의미로는 '파괴하다'지만, 프로그래밍에서 Destructuring은 내가 원하는 요소만 '추출하는 것'입니다.

w3schools에서는 샌드위치 비유로 다음과 같이 설명했습니다.

 

https://www.w3schools.com/react/react_es6_destructuring.asp

 

React ES6 Destructuring

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

To illustrate destructuring, we'll make a sandwich. Do you take everything out of the refrigerator to make your sandwich? No, you only take out the items you would like to use on your sandwich.

Destructuring is exactly the same. We may have an array or object that we are working with, but we only need some of the items contained in these.

Destructuring makes it easy to extract only what is needed.

 

샌드위치 만들 때 냉장고에 있는 물건 전부다 빼내지 않죠? 샌드위치 만드는 데 필요한 것들만 꺼낼거에요.

Destructuring도 이와 비슷합니다. 배열이나 객체 중 필요한 부분만 잘라낼 수 있습니다.


Destructuring Arrays


Destructuring : 구조화된 객체, 배열 따위 요소를 비구조화(Destructure)하여 변수에 할당하다.

 

 우리는 이번 시간에 배열의 Destructuring에 대해 중점적으로 알아보도록 하겠습니다. 먼저 2015년 ES6 전의 Destructuring 문법에 대해 간략히 알아보겠습니다.

 

 ▽ ES5 Destructuring Arrays

var arr = [a, b, c];

var one = arr[0];
var two = arr[1];
var three = arr[2];

console.log(one, two, three);
#결과

a b c

 

 이렇게 ES5 문법으로는 Array의 각 요소를 변수에 하나씩 할당해야 했습니다. 여간 귀찮은 일이 아니었죠.

그래서 ES6에는 다음과 같은 수학 공식을 문법에 추가했습니다.

 △ 수학 배열의 동치구조입니다. 수학과 미묘하게 다른 점이 하나 있다면, 추출&할당이 Array의 index 기준으로 진행된다는 것입다. 우측의 배열의 인덱스 기준으로 좌측 변수에 할당된다는 것입니다. (변수할당의 특성상 원래 그렇긴 하죠.)

 

 이 문법 하나만으로 ES5와 다르게 얼마나 빠르게 Destructuring이 가능한 지 다음에서 볼 수 있습니다.

 

▽ ES6 Destructuring Arrays

let one, two, three;
[one, two, three] = [a, b, c];

console.log(one, two, three);
#결과

a b c

 ▽ 이렇게도 쓸 수 있습니다.

let arr = [a, b, c];
let [one, two, three] = arr;

 ▽ 혹은 이렇게도!

let [one, two, three] = [a, b, c];

 

 

응용


let a, b, c;

[a, b, c] = [1, 2, 3];
console.log(a, b, c);	//결과 : 1 2 3

[a, b] = [1];
console.log(a, b);	//결과 : 1 Undefined

[a] = [1, 2];
console.log(a);		//결과 : 1

[a, , c] = [1, 2, 3];
console.log(a, c)		//결과 : 1 3
[a = 10000, b, c] = [1, 2, 3];
console.log(a, b, c)		//결과 : 1 2 3

[a, b, c = 3] = [1, 2];
console.log(a, b, c)		//결과 : 1 2 3

 △ 위에서 언급한 것과 같이 추출&할당이 Array의 index 기준으로 진행되기 때문에 우측 배열의 값이 우선적으로 변수에 할당됩니다.

[a, ...c] = [1, 2, 3, 4];
console.log(a, c)		//결과 1 [2, 3, 4]

△ ES6의 Spread 문법입니다. 해당 내용 참조 바랍니다.

https://hwon-da.tistory.com/15

 

#03. [JS] ES6 최신문법

객체 만들기 (key) //옛날 문법 let name = "hwonda"; let age = 29; let person ={name:name, age:age} //ES6 문법 let name = "hwonda"; let age = 29; let person ={name, age} : 자동으로 변수 이름 = key 값으로 변경해줍니다. 객체 분

hwon-da.tistory.com

 

 

 React를 사용하기 위해서는 JSX를 알아야합니다. 또한 React를 사용하는 가장 큰 이유는 데이터바인딩(DataBinding)이죠.

 

 React라는 라이브러리를 사용하기 위해 공부해야되는 것이 많다고 느껴지겠지만, 사실 이 두가지는 별 것 없습니다. JSX에 대해 먼저 알아봅시다.

 

JSX


JSX : A syntax extension to JavaScript. 자바스크립트 확장 문법. 

 

 JSX는 JS의 확장문법으로, XML/HTML + JS라고 생각하면 됩니다. 

 다음은 저번 시간에 만든 App.js입니다. index.js가 App.js에 있는 함수 리턴값을 public에 있는 index.html로 옮겨줍니다.

 

 분명 App.js이라고 되어있는 걸로 보아 JS파일이고 분명 JS에서 사용하는 함수선언인데 너무나 HTML스러운 부분이 있죠. 바로 이 함수 속 HTML 노란박스 부분(함수 리턴값)이 JSX로 쓰였습니다. html의 태그 <div>, <img>, <p> 등을 사용해 겉보기는 비슷해보이지만 다음과 같은 속성을 가지고 있습니다.

(많은 속성이 있지만 공부하는 데 필요한 부분만 적었습니다.)

 

→ JSX의 속성

  • JSX로 작성된 코드는 전부 JS 코드로 변환된다.
  • 리액트는 JSX 코드를 모두 createElement() 함수 코드로 변환한다.
  • Dom 요소에 class를 넣기 위해서는 className을 쓴다. (프로퍼티 명명법 사용)
  • { 중괄호 }를 사용하면 무조건 자바스크립트 코드가 들어간다.

 JSX를 사용하며 우리가 얻을 수 있는 이득은 코드의 간결함가독성 향상입니다. JSX를 사용하는 법은 천천히 함께 공부해보며 알아봅시다.

 

 

데이터 바인딩(Data Binding)


데이터 바인딩 : HTML에 원하는 DATA를 나타내는(일치화하는) 것.

 

 리액트를 사용하는 큰 이유로 데이터바인딩이 쉽다는 것이 있죠. 데이터 바인딩이란 개발자가JS 코드로 선언하고 반환한 데이터를 HTML에서도 동일하게 보이게 만드는 것을 의미합니다.

//Vanilla JavaScript
document.getElementByID().innerHTML = "data";

△ 쌩 자바스크립트에서 데이터바인딩을 하기 위해서는 이렇게 긴 코드가 필요했습니다.

React.createElement('h3',null,'data')

 △ React를 쓰더라도 이렇게 써야 했습니다.

 

let data = 'data';

...

	<h3> { data } </h3>

△ 데이터 바인딩을 하면 이렇게 쓸 수 있습니다.

 

 △ React에서 데이터바인딩해서 나타낼 때는 { 변수명 } 를 사용하면 됩니다.

 

function 함수(){
  함수작동!
}

return(
  <h1> { 함수() } </h1>
);

 △ 함수 작동하고싶을때도 { } 사용. (function App() 내에서 작성)

 

import logo from './logo.svg';

function App(){

  return(
    <img src={ logo } />
  );
}

 △ 이미지 넣고 싶을 때도 { } 사용.

 

 이렇게 리액트를 사용하면 { 중괄호 }만 잘 사용하더라도 내가 원하는 데이터바인딩은 쉽게 끝낼 수 있습니다.

다음 시간에는 리액트 데이터바인딩의 꽃 state에 대해 알아보겠습니다.

 

개발환경 세팅


 

 REACT 라이브러리를 사용하기 위해서는 컴퓨터의 개발환경이 필요합니다.

  1. Node.js : 개발환경(REACT 설치)
  2. VScode : 에디터
  3. Chrome : 브라우저
  4. Git : 소스제어, 버젼관리

1. Node.js 설치는 이전 글 확인해주세요. 그리고 LTS로 설치하시는 것을 권장드립니다. https://hwon-da.tistory.com/6

 

[Node.js] 개념 및 설치방법(Mac OS)

Chrome V8 JavaScript 엔진으로 빌드된 [JavaScript 런타임] * 런타임 : 특정언어(JavaScript 등)가 동작할 수 있는 환경입니다. * 자바스크립트는 독립적 언어가 아닌 ‘스크립트 언어’입니다. 스크립트 언

hwon-da.tistory.com

 

2. VScode는 터미널을 가장 쉽게 사용할 수 있는 에디터입니다. 다음 링크를 따라가 다운로드 해주세요. (OS확인)

https://visualstudio.microsoft.com/ko/downloads/

 

Visual Studio Tools 다운로드 - Windows, Mac, Linux용 무료 설치

Visual Studio IDE 또는 VS Code를 무료로 다운로드하세요. Windows 또는 Mac에서 Visual Studio Professional 또는 Enterprise Edition을 사용해 보세요.

visualstudio.microsoft.com

3-4. git과 chrome은 이미 있으시겠죠? - https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 94 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

 

 

시작


 자 이제 시작입니다.

 

 요즘은 맥OS나 Windows에 큰 차이가 없기 때문에 제가 사용하는 맥OS 위주로 올리겠습니다.

 

1. 새로운 디렉토리를 생성합니다.

 

 

2. VScode를 열어줍니다. 중간에 보이는 Open 혹은 File-Open folder를 눌러 해당 파일을 열어줍니다.

 

3. Terminal을 열어줍니다. (^ + shift + ~ 혹은 Terminal-New Terminal)

 

4. 터미널에 아래 명령을 입력해줍니다.

$ npx create-react-app new

 해당 명령은 리액트 프로젝트 생성을 하는 명령으로,

npx : node.js를 통해 라이브러리 설치를 도와줌

create-react-app : React Setting이 되어있는 boilerplate (셋팅이 완료된 라이브러리)

new : 프로젝트명(원하는 것으로 변경 가능)

 제 맥북으로는 이렇게 WARN이 떠서 뭔가 했더니 tar version이 낮았군요. 다음 명령을 실행시켜 tar version 업데이트를 해줍니다.

npm install tar@6 -g

 

 

5. 잠시 후 모든 게 완료됐다고 뜨면서 해당 프로젝트 파일(new)에는 리액트를 사용하는 데 필요한 모든 것이 들어간 것을 확인할 수 있습니다.

 

6. 해당 디렉토리를 VScode로 열어 src에 있는 App.js를 열어줍니다. App.js는 index.html처럼 기준이 되는 파일입니다.

 

7. 코드 결과 미리보기

$ npm start

Terminal에서 다음 명령을 입력하면 코드 결과를 미리볼 수 있습니다. localhost:3000 사용.

짝짝짝! 이제 React를 시작할 준비가 다 됐습니다!

 

에러 및 소거방법


 

1.  npm run 시 에러

다음과 같이 에러가 뜨는 경우는 해당 디렉토리에서 터미널을 열지 않았기 때문입니다.

$ cd new

해당 프로젝트로 들어간 뒤 다시 npm start 해줍니다.


2. Permission이 없는 경우

 

오류 코드 중 npm ERR! code EACCES라는 오류가 있습니다. 이 때는 다음과 같은 명령어를 치고 계정 비밀번호(MAC)를 입력하시면 됩니다.

$ sudo npm install -g creat-react-app

혹은

$ sudo npx create-react-app new

3. The engine "node"is incompatible with this module 에러

 

다음과 같은 에러시 node.js의 버전이 너무 낮거나 높다는 것을 의미하므로, LTS 버전(혹은 요구되는 버전)으로 다시 깔아줍니다.

 

리액트 쓸 필요 없습니다.

 

리액트(REACT)


React : A JavaScript library for building user interfaces.

 

 리액트는 다음 공식사이트 정의와 같이 사용자 인터페이스(UI)를 만들기 위한 자바스크립트 라이브러리입니다.

UI는 사용자와 프로그램을 연결해주는 매개체라고 볼 수 있습니다. User와 Program의 상호작용을 위해 입력과 출력을 제어해주는 것으로 볼 수 있는데요. 웹 상에서 자주 쓰이는 버튼이나 텍스트 입력창 등이 있겠네요.

라이브러리는 실제로 도서관이라는 뜻이죠. 프로그래밍에서는 자주 사용되는 기능을 모은 것이라고 볼 수 있습니다.

 

그럼 이 라이브러리는 어떤 기능을 주로 할까요?

 

리액트의 역할은 Web-App(웹앱)을 만드는 것이라고 생각하면 됩니다. (Web-App을 Mobile-Web으로 혼돈하지 않도록 주의합시다!!)

Web-App : Mobile을 기준으로 개발하는 방식입니다. 단일 페이지 방식(SPA)을 사용하여 속도를 높이고 페이지 전환이 부드럽습니다.

Mobile-Web : 단순히 PC에서 보는 브라우저 창을 Mobile로 보도록 줄여놓은 상태. 풀 브라우저 방식입니다.

 

※ SPA : Single Page Application. 하나의 페이지만 존재하는 웹 사이트.

사용자가 특정 페이지를 요청하면 그때그때 페이지에 해당 내용을 채워줌.

 

웹앱은 모바일앱과 겉모습이 비슷하지만 구동방식을 마치 앱처럼 꾸며놓아 Web-app이라는 이름이 붙여졌습니다. 웹 개발기술로  Native-App(우리가 구글스토어나 앱스토어에서 다운받는 네이티브앱)을 흉내냈다고도 볼 수 있습니다.

 

 

리액트, 쓸 필요 없습니다.


1. Github는 쌩 자바스크립트(Vanilla JS)로 개발합니다.

: 전 세계 수많은 개발자들이 사용하는 Github 페이지는 Vanilla JavaScript를 사용합니다. 바닐라 자바스크립트란 외부 라이브러리나 프레임워크를 쓰지 않는 순수, 다시 말해서 쌩 자바스크립트라는 말이죠. 사용자 정의된 라이브러리나 프레임워크를 일절 사용하지 않기 때문에, 보다 빠르고 호환성이 높으며 좀 더 많은 기능을 개발할 수 있습니다. (리액트를 완전히 대체하진 못하지만 리액트의 JSX Component를 바닐라JS의 Web Component화 해서 사용하는 등 비슷한 기법을 사용할 순 있습니다.)

 Front-End 분야는 워낙 라이브러리, 프레임워크의 교체 시기가 빠르기 때문입니다. 주권이 언제 바뀔지 모르는 라이브러리를 사용하기보다 쌩 자바스크립트로 개발하는 게 더 위험성 없다고 생각했을 거에요.(자바스크립트가 주권을 뺏기지 않는 한...)

 

2. Kakao는 Vue.js를 좋아합니다.

: 카카오는 React도 물론 사용하지만 새로운 서비스를 런칭할 때 Vue.js 프레임워크의 선호도가 더 높습니다. 그 이유는 아주 여러가지가 있겠지만 '리액트보다 쉬워서'입니다. 문법이 리액트보다 어렵지 않고, 수학과 같이 개발 공식(Right Way)이 있기 때문입니다. 예를 들어, <HTML>을 여러 개 만들 때 리액트에서는 여러 문법이 사용될 수 있지만 Vue에서는 v-for 문법으로 통일되어 있습니다.

 

 

그럼에도 쓰는 REACT


 

  1.  사람들이 가장 많이 사용한다.
  2.  Single Page Application을 만들 수 있다.
  3.  Component로 html 재사용이 편리하다.
  4.  State로 데이터가 html에 자동 반영된다.
  5.  React-Native 같이 모바일 앱으로 발행도 쉽다.

 사실 다른 이유를 다 제쳐두고서라도, 리액트를 사용하는 이유로 활발한 개발 생태계와 커뮤니티를 꼽을 수 있습니다.

구글 검색결과 수조차 남다른 react

 라이브러리나 프레임워크가 잊혀지는 경우는 크게 두가지 입니다. 더이상 업데이트가 되지 않거나, 찾는 사람이 줄어들거나. 게다가 개발은 사람이 하는 것이다보니 같은 문제, 같은 버그가 생길 확률이 높습니다. 아니면 모르는 것도 비슷하죠.

 리액트는 메타(페이스북)라는 거대 스폰서가 있어 꾸준히 버전 업데이트가 진행중입니다. 또 엄청난 크기의 커뮤니티가 개발에 있어 막히고 더디게하는 문제를 금방 해결해줄 수 있습니다. 

 언젠가 다른 라이브러리가 대세가 될 수도 있겠지만, 앞으로의 몇 년간은 REACT의 시대라고 봐도 과언이 아닐듯 합니다. 이런 이유로 REACT 개발을 시작해보려 합니다.

 

객체 만들기 (key)


//옛날 문법
let name = "hwonda";
let age = 29;
let person ={name:name, age:age}
//ES6 문법
let name = "hwonda";
let age = 29;
let person ={name, age}

: 자동으로 변수 이름 = key 값으로 변경해줍니다.

 

객체 분해하기


//옛날 문법
let person = {
    name : "hwonda",
    age : 29
    }
let name = person.name;
let age = person.age;
//ES6 문법
let person = {
    name : "hwonda",
    age : 29
}
let {name, age} = person;

: 객체 만들기와 동일하게 변수값 = key값 일때만 가능합니다.

 

${...}


//옛날 문법
let name = "hwonda";
let age = 29;
console.log("이름은"+name+"입니다. 나이는"+age"입니다");
//ES6 문법
let name = "hwonda";
let age = 29;
console.log(`이름은 ${name}입니다. 나이는 ${age}입니다`);

: ${} 을 사용할때는 작은 따옴표(')가 아닌, 백틱(`)을 사용합니다.

 

배열


//옛날 문법
let array = [1, 2, 3];
let a = array[0];
let b = array[1];
let c = array[2];
console.log(a,b,c);

// 결과 
// 1 2 3
//ES6 문법
let array = [1, 2, 3];
let [a, b, c] = array
let [first,...rest] = array

console.log(a, b, c)
console.log(first)
console.log(rest)

// 결과
// 1 2 3
// 1
// [2, 3]

: rest가 아니더라도 주고싶은 변수 이름은 쓰면 됩니다. (others, userInfo 등등..)

 

...의 추가 기능


let person = {
    name : "hwonda",
    age : 29,
    sex : male
}

let {name,...userInfo} = person
console.log(name, userInfo)

// 결과
// hwonda { age : 29, sex : male}
// 객체 분해 및 생성 가능

 

...의 추가 기능 2

// 옛날 문법
let a = [1,2];
let b = [3,4];
let c = [5,6];

let result = a.concat(b,c)
console.log(result)

// 결과
// [1, 2, 3, 4, 5, 6]
// ES6 문법
let a = [1,2];
let b = [3,4];
let c = [5,6];

let result = [...a,...b,...c]
console.log(result)

// 결과
// [1, 2, 3, 4, 5, 6]

 

함수


// 옛날 문법
function boo(){
    console.log("hello")
}
// ES6 문법
let boo = ()=>{
    console.log("hello")
}

: 함수 선언 방식을 바꿔버렸습니다. 왜 굳이 만들었을까요?

function boo(){
    return "haha"
}

이 함수는 아래와 같이 편하게 쓸 수 있습니다. (return 생략 가능, 문장 1개의 함수를 1줄로 표현 가능)

let boo = ()=>"haha"

그러나 화살표 함수(=>)는 100% 옛날 문법을 대체할 순 없습니다. (this)

 

this 란?


let age = 19
let person = {
    name : "hwonda",
    age : 29
    getInfo:function(){
        console.log(age)
    }
}

person.getInfo()

// 결과
// 19

: 분명 getInfo의 함수를 호출했으나, 결과는 놀랍게도 전역변수를 가져옵니다.

이 때, console.log(this.age)를 하는 경우, 지역변수 값인 29를 가지고 올 수 있게 됩니다.

this는 곧 나를 불러준 객체라고 볼 수 있습니다.

let age = 19
let person = {
    name : "hwonda",
    age : 29
    getInfo:function(){
        console.log(this.age)
    }
}

person.getInfo()

// 결과
// 29

: 그러나 getInfo()=>{console.log(this.age)}로 함수를 선언할 경우, undefined 오류가 발생한다. (결국 this값을 찾다가찾다가 Window에 있는 person값을 가져와 undefinded 되는 것.)

공부한 내용을 스스로 정리하는 글입니다. 불친절할 수 있습니다!

 

 태그 (Empty Tag)


 빈 태그 : 종료 태그만 있고, 시작 태그는 없는 태그

  • 내용을 싣지 못함
  • 이미지나 경로 등 특정값을 나타낼 때 사용

HTML1/2/3/4/5 : <tag> 

XHTML / HTML5 : <tag/>

 

일반태그

<tag 속성=‘값’> 내용 </tag>


빈 태그 ex1. <img/>

<img src=“./dog.jpg” alt=“강아지 사진” />


빈 태그 ex2. <input/>

<input type=“text”/>

 

 

글과 상자


 

글과 상자는 요소가 화면에 출력되는 특성을 이야기하며, 크게 2가지로 나눕니다.

 

1) 인라인(Inline)요소 : 글자를 만들기 위한 요소들

2) 블록(Block)요소 : 상자(레이아웃) 만들기 위한 요소들

 

 1) Inline의 예시

<span>hello</span> 

<span>world</span>

 

# 결과

hello world

: 띄어쓰기를 한다

: 포함한 콘텐츠 크기만큼 자동으로 줄어듬!!(width, height)

: 글자는 가로세로 사이즈(px) 지정할 없다!

: /아래 여백은 사용 불가! (/ 여백은 가능)

: 글자 내에 상자(div) 넣을 없다

 

2) Block의 예시

<div>hello</div>

<div>world</div>

# 결과

hello
world

: 줄을 바꾼다

: 부모 요소의 크기만큼 width자동으로 늘어남!!(height 줄어듬)

: 가로세로 사이즈(px) 지정할 있음.

: /아래// 여백 가능

: 상자 상자, 상자 인라인 넣을 있음. (제약 적음)

 

 

HTML Tags


 

태그 내용 비고
<div>  특별한 의미가 없는, 구분을 위한 요소(division)  여러 주제를 묶는다
<h>  제목을 의미하는 요소(heading)  
<p>  문장을 의미하는 요소(paragraph)  
<img>  이미지를 삽입하는 요소  
<ul>  순서가 필요없는 목록의 집합  
<ol>  순서가 필요한 목록의 집합  
<li>  목록 내 각 항목  
<a>  닻, 하이퍼링크를 지정하는 요소  
<span>  특별한 의미가 없이 구분을 위한 요소  해당 요소를 CSS로 적용하기 편하다
<br/>  줄바꿈  
<input>  사용자가 데이터를 입력하는 요소  data type에 따라 text/value/placeholder/checkbox/radio/name으로 묶음
disabled/checked/name
<label>  라벨 가능 요소(input)의 제목  
<table>  표 요소(행과 열의 집합)  <tr>: 행, <td>: 열

 

 

전역속성


 

html에서 자주 사용하는 태그의 전역속성입니다.

# 사용법.

<tag [전역속성]> 내용 </tag>

 

전역속성 내용
title  어떤 행동을 할 것인지 도와줌
style  css를 적용함
class  요소를 지칭하는 중복 가능한 이름
id  요소를 지칭하되 고유한 이름
data  요소에 데이터를 지정 (잠시 저장해서 JS, CSS에서 사용 가능)

 

 프로젝트의 규모가 커지다보니 한 파일에 수 천만의 코드라인이 생기기도 했습니다. 이에 JS 코드를 수많은 파일/폴더에 저장하고 효율적으로 불러올 수 있는 시스템이 필요해졌고, 2015년(ES6)에 모듈 시스템이 등장하게 되었습니다.

 

 

모듈(module)



모듈 : 프로그램 구성 요소. 관련된 data, function 등을 하나로 묶은 단위

 

모듈형 주택(사진 - 영국 Yorkon)

 모듈형 주택, 모듈형 핸드폰 등 일상생활에서 '모듈'이라는 단어는 많이 들어보셨을 겁니다. 미리 지어진 방, 거실, 화장실을 이어 만든 주택이나 미리 만들어놓은 배터리, OS칩, 카메라 등을 붙여 만든 핸드폰. 짐작하셨듯이 모듈의 특성은 다음과 같습니다.

 

  1. 어떠한(웬만하면 하나의) 기능이나 정보를 가지고 있다.
  2. 그 자체로 완성된 기능이지만, 완성품의 부속물이다.
  3. 수정이 쉽다.
  4. 재활용(프로그래밍에서는 감가상각 없는 재사용)이 가능하다.

특히 JavaScript에서의 모듈은 다음과 같은 특성을 가지고 있습니다.

 

  1. import, export 구문으로 사용할 수 있습니다.
  2. 모듈 간의 같은 변수명을 써도 충돌하지 않는다. (변수명이 모듈 스코프에 한정된다.)

다음은 사진 한 장으로 import와 export를 사용한 JS modules 를 알아보겠습니다. 다음은 모듈을 사용하는 대표적인 예로, 모듈의 다른 사용법은 추후 다시 다뤄보도록 하겠습니다.

 

 

import / export


export에는 두 가지 방법이 있습니다.

1. default

 

 

 sum.js는 num1과 num2를 받아 그 합을 return하는 함수모듈입니다. 

default는 모듈 개체가 단 1개일 때 사용합니다. 예제와 같이 하나의 함수, 하나의 리턴값이 존재합니다.

이 때는 심지어 sum이라는 함수 이름도 필요 없습니다.

export default function (num1, num2){	//심지어 sum이 없어도 동일한 결과가 나온다.
    return num1 + num2;
}

import 할 때도 함수 이름을 가져올 필요가 없습니다. 제가 원하는 대로(plus처럼) 이름을 가져와도 작동합니다.

 

결과는 3으로 잘 나왔습니다.

 

 

2. named

 

 

모듈 개체가 2개 이상일 때는 default를 사용할 수 없습니다. default와 달리 변수명, 함수이름도 그대로 가져와야 합니다. (게다가 가져올 때 중괄호{}가 필요하죠.) 만약 이름을 가져오고 싶지 않고 새로 사용하고 싶다면 'as'를 사용하면 됩니다.

 

import { intro, sum as plus } from "./intro.js"		// as를 사용하면 새로 변수명을 쓸 수 있다.

console.log(intro)
console.log(plus(2,3))

 

결과

 

 

 JavaScript의 첫 번째 시간으로는 가장 중요한 '변수(Variable)'과 '호이스팅(Hoisting)'의 개념에 대해 알아보겠습니다.

 

변수(Variable)


변수 : 하나의 값(data)을 저장할 수 있는 저장공간(memory).

 

 프로그래밍에서 '변수'는 데이터를 저장할 수 있는 메모리 공간을 의미하고, 변수의 값은 변경될 수 있습니다.

자바스크립트에서 변수의 종류는 크게 두 가지로 나뉘는데요,

 

  • 원시형 변수(Primitive Variable) : 실제값(value)을 저장하는 변수, 데이터 자체를 변수에 저장.
  • 참조형 변수(Reference Variable) : 객체의 주소(reference)를 저장하는 변수, 데이터는 다른 곳에 저장 후 변수에는 주소만 할당.

 

변수 타입 종류 예시 or 설명
원시형 number 1, 2, 3
string hwonda
boolean true or false
symbol 변경 불가한 값(프로퍼티)
undefined 정의되지 않음 or 의도치 않게 비어있음
참조형 null 의도적으로 비어있음
array []
object {}
function function <함수명>(매개변수){}

 

typeof로 데이터의 타입을 확인할 수 있습니다. 아래 예시를 보겠습니다.

 

 

 하지만 typeof에는 한계가 있습니다. 노란색 박스와 같이 null, {}, [] 을 모두 객체(object)로 보기 때문이죠.

이를 위해 function getType을 만들어줍니다. return 값에 대해서는 아직 정확하게 알 필요가 없습니다. 함수를 통해 Null, {}, [] 각각 어떤 타입인지 반환할 수 있습니다.

 

변수 선언


 자바스크립트 변수를 선언하는 방법은 총 3가지가 있습니다. ES6이 나오기 전, JS의 변수 선언방식은 var만 존재했습니다.

하지만 var는 변수명으로 이미 선언된 이름과 같은 이름을 사용하는 경우 에러가 나오지 않는 치명적인 문제가 있었습니다.

그래서 ES6 이후, var 방식을 보완한 constlet 방식이 나왔죠.

 

const와 let의 차이로 '재할당'이 가능한가?의 문제가 있습니다.

const는 재할당이 가능하지 않으므로, 의도치 않은 재할당을 방지할 수 있겠습니다.

반면 let은 재할당이 필요한 경우 사용하는 것이 좋겠습니다. 

 

특징 var const let
선언 전 사용시 ERROR X O O
이미 선언된 이름과 같은 이름 사용시 ERROR X O O
초기값 줘야 함 X O X
다시 할당할 수 있음(재할당) O X O

 다음은 위 내용을 참고하여 실수할 수 있는 부분에 대해 직접 알아보겠습니다. (chrome 의 console 창 활용)

실수한 경우의 ERROR message의 타입을 기억해 놓는 것은, 추후 코딩할 때 내가 어디서 어떻게 틀렸는 지 알 수 있는 경로가 되므로 에러 메세지를 잘 기억해 놓는 것이 좋겠습니다.

 

 

1. var는 선언 전 사용시, undefined 에러가 뜹니다.

2. const는 초기값을 주지 않으면 missing initializer in const declaration 에러가 뜹니다.

3. let은 이미 변수명 'a'에 대해 var로 선언되었기 때문에, 이미 선언된 변수명을 다시 사용하면 에러가 뜹니다.

 

 

한 가지 덧붙이자면, const와 let은 var와 다르게 '블록' 단위로 할당되기 때문에, 하나의 블록(if문, for문 등등)에서 같은 변수명을 사용하면 에러가 뜹니다. var는 재밌게도 에러가 뜨지 않습니다.

 

 

변수 호이스팅 (Hoisting)


 

호이스팅 : 함수가 실행되기 전에, 안에 있는 변수들을 범위의 최상단으로 끌어올리는 것.

 

ES6는 let, const를 포함한 모든 선언(function, class, 특히 var도)을 호이스팅 합니다. 모든 선언들을 해당 스코프의 가장 윗쪽으로 올려버리고 읽어내는 것이죠. (진짜 코드를 올려버리는 것이 아니라, Parser에서 마치 올린 것처럼 읽어내는 것)

 

name(myName);

function name(myName){
    console.log("my name is " + myName);
}

var myName = "hwonda";
// 결과

my name is hwonda

 

이렇게 함수 선언 전에 함수를 호출하고, 변수 선언 전에 변수를 호출해도 문제 없이 원하는 결과가 나옵니다. 이렇게 기존 var는 어디서 선언하든 에러가 뜨지 않았지만, let은 다른 언어와 같이 변수 선언을 먼저 해야 변수 호출이 가능합니다.


1. let : 선언과 초기화가 분리되어 진행됨. 초기화 단계 없이 선언하면 해당 변수 참조 에러가 뜸. ( Uncaught ReferenceError: Name is not defined)
2. const : 선언과 초기화가 동시에 진행됨. 동시에 선언과 초기화가 동시에 진행되어야 하지만, 따로 진행하는 경우 같이 진행하라는 에러가 뜸. (Cannot access 'name' before initialization)

+ Recent posts