이번 시간은 깃의 가장 기초적인 부분으로 Repository 생성/삭제에 대해 알아보겠습니다.

 

 

Repository


Repository(리파지토리/레파지토리) : 파일이나 폴더를 저장하는 저장소

 

git에서는 두 가지 저장소를 제공합니다.

  • 원격 저장소(Remote Repository) : 서버에 저장되어 여러 사람이 함께 볼 수 있는 저장소
  • 로컬 저장소(Local Repository) : 내 PC에 저장되는 개인 저장소

우리는 로컬 저장소에서 원격 저장소로 Push해서 여러 사람에게 원하는 파일을 보여줄 수 있고,

원격 저장소에서 로컬 저장소로 Pull해서 다른 사람이 만든 파일을 내 PC로 가져올 수 있습니다.

 

 

새 Repository 만들기


 

 ▽ 1. 깃허브 홈페이지에 접속해서 Sign in(로그인) 합니다. 아직 아이디가 없는 경우 Sign up(회원가입)을 진행합니다.

 

 ▽ 2. 로그인해서 들어가면 해당 화면이 나오는데, New 버튼을 클릭합니다.

 

▽ 3. Create a new repository 화면에서 내 레파지토리 이름을 적습니다. 처음 깃허브를 접해보신 분들은 Readme 파일을 생성하는 것을 추천드립니다. Readme파일을 만들면 조금 더 손쉽게 레파지토리를 관리할 수 있습니다.

 

 ▽ 4. Create repository 버튼을 누르면~

 

 ▽ 5. helloworld 레파지토리가 만들어졌습니다!

 

 

Repository 삭제하기


 

 ▽ 1. 상단 메뉴 가장 우측 Settings를 클릭합니다.

 

 ▽ 2. General 메뉴의 가장 아랫부분에 가면 Delete this repository 버튼이 있습니다. 클릭 해줍니다.

 

 ▽ 3. 레파지토리를 삭제할 것인지 되묻는 경고창이 뜨고, 입력창에 레파지토리 이름을 적어주면 아래 delete 버튼이 활성화됩니다. 눌러주면 해당 레파지토리는 삭제됩니다. (이 때, 깃허브 잔디도 함께 사라집니다..!)

 

 

Arrays


 

 ▽ 4.1 배열을 작성 할 때는 리터럴 구문을 사용한다.

// bad
const items = new Array();

// good
const items = [];

 

 

 ▽ 4.2 아이템을 배열에 추가하는 경우, 직접 배열에 항목을 대입하지 말고 Array#push를 이용한다.

const someStack = [];

// bad
someStack[someStack.length] = "abracadabra";

// good
someStack.push("abracadabra");

 

 

 ▽ 4.3 배열을 복사할 때는 배열의 spread 연산자...를 이용한다.

// bad
const len = items.length;
const itemsCopy = [];
let i;

for (i = 0; i < len; i++) {
  itemsCopy[i] = items[i];
}

// good
const itemsCopy = [...items];

Airbnb 4.4 ~ 4.7

4.4 반복 가능한 객체를 배열로 변환 시, Array.from보다 spread ...의 사용을 권장합니다.

4.5 Array.from은 배열과 같은 객체를 배열로 변환하는 데 사용합니다.

4.6 spread ... 대신 Array.from을 사용하면 중간배열이 생성되지 않아 반복 가능한 항목에 매핑할 수 있습니다.

4.7 배열 메서드 콜백에서 반환문을 사용합니다. 함수 본문이 단일문으로 구성된 경우 반환을 생략해도 됩니다.

airbnb javascript conventions


 

 ▽ 4.8 배열이 멀티 라인인 경우, 배열의 시작(before)과 끝(after)은 개행한다.

// bad
const arr = [
  [0, 1], [2, 3], [4, 5],
];

const objectInArray = [{
  id: 1,
}, {
  id: 2,
}];

const numberInArray = [
  1, 2,
];

// good
const arr = [[0, 1], [2, 3], [4, 5]];

const objectInArray = [
  {
    id: 1,
  },
  {
    id: 2,
  },
];

const numberInArray = [
  1,
  2,
];

 

 확실히 Array Conventions에 대해서는 언급할 부분이 별로 없습니다. 직접적인 아이템 추가를 지양하고, 조금 더 보기 쉽도록 spread를 권장하는 모습을 보입니다.

 

 

naver github STYLE_GUIDE.md

 

Object (객체)


 

▽ 3.1 Object(객체)를 작성할 때는, 리터럴 구문을 사용한다.

// bad
const item = new Object();

// good
const item = {};

 : 객체는 new object(), Object.create(), literal표기법을 사용해 초기화할 수 있습니다. 여기서는 리터럴 표기법을 사용합니다.

 

 

▽ 3.2 동적 프로퍼티명을 갖는 오브젝트를 작성할 때, 계산된 프로퍼티명(computed property names)을 이용한다.

function getKey(k) {
  return `key named ${k}`;
}

// bad
const obj = {
  id: 5,
  name: "San Francisco",
};
obj[getKey("enabled")] = true;

// good
const obj = {
  id: 5,
  name: "San Francisco",
  [getKey("enabled")]: true
};

: 계산된 프로퍼티명은 JS Object의 프로퍼티 이름을 동적으로 설정할 수 있게 만들어주는 ES6의 기능입니다. 유효한 값을 반환하는 변수나 함수를 [대괄호] 안에 작성하여 객체의 프로퍼티를 동적으로 추가할 수 있습니다. 위 예시와 같이 변수 뿐 아니라 함수를 대괄호에 작성해 객체 프로퍼티를 추가할 수 있습니다. 이런 방식을 사용한다면 Object의 모든 프로퍼티를 한 블록 내에서 정의할 수 있습니다.

 

 

▽ 3.3 메서드의 단축구문을 사용한다.

// bad
const atom = {
  value: 1,

  addValue: function (value) {
    return atom.value + value;
  },
};

// good
const atom = {
  value: 1,

  addValue(value) {
    return atom.value + value;
  },
};

: 메서드 단축구문 또한 ES6에 도입되었습니다. 객체 초기자(initializer)에 메서드 정의를 위한 단축구문입니다. function은 메서드 정의에서 더 이상 필요없게 되었습니다.

 

 

▽ 3.4 속성의 단축구문을 사용한다.

const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  lukeSkywalker: lukeSkywalker,
};

// good
const obj = {
  lukeSkywalker,
};

: 위 예시와 같이 객체의 속성값이 변수로 할당되었다면, 변수 이름만 적어주면 됩니다.

 

 

▽ 3.5 속성의 단축 구문은 오브젝트 선언의 시작 부분에 그룹화한다.

const anakinSkywalker = "Anakin Skywalker";
const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  lukeSkywalker,
  episodeThree: 3,
  mayTheFourth: 4,
  anakinSkywalker,
};

// good
const obj = {
  // 단축 속성 구문 - 시작
  lukeSkywalker,
  anakinSkywalker,
  // 단축 속성 구문 - 끝
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  episodeThree: 3,
  mayTheFourth: 4,
};

: 속성의 단축구문을 시작구문에 그룹화하면, 어떤 프로퍼티가 단축구문을 이용하고 있는지 알기 편합니다.


 (Airbnb와 다른 부분 시작)

 

▽ 3.6 속성명이 키워드(default, if, ...)일 경우에는 꼭 따옴표를 붙인다. 또한, -문자와 같이 속성명으로 지정할수 없는 경우에는 꼭 따옴표를 붙인다.

// bad
const bad = {
  foo: 3,
  default: 20,
  data-blah: 5
};

// good
const good = {
  foo: 3,
  "default": 20,
  "data-blah": 5,
  10: "naver"
};

 

 

▽ 3.7 hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 Object.prototype 메서드를 직접적으로 사용하지 않는다.

// bad
console.log(object.hasOwnProperty(key));

// good
console.log(Object.prototype.hasOwnProperty.call(object, key));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from "has";
// ...
console.log(has.call(object, key));

: JS에서 객체를 상속하기 위해 프로토타입 방식을 사용합니다. 한편,  hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 builtin 메서드는 객체에서 직접호출하거나 Object.prototype을 사용해 호출합니다. 3.7 항목은 Object.prototype를 사용해 호출할 때 직접적인 사용을 지양하도록 합니다. 직접적으로 사용할 경우 발생될 문제점은 다음과 같습니다.

  • Object.create(null) : null로 객체를 생성하면 Object.prototype을 상속받지 않습니다.
  • builtin 방식으로 제공되는 메서드는 키를 이미 가진 채로 제공되는데, 객체와 builtin 메서드에 같은 이름을 가진 키가 있다면 잘못된 결과를 반환할 수 있습니다.

 

▽ 3.8 얕은 복사(shallow-copy)를 하기 위해서 Object.assign보다는 spread 연산자(...)를 선호한다. 오브젝트에서 몇몇 속성을 제거한 새로운 오브젝트를 얻고자 할때는 rest 파라미터(...)를 사용한다.

// very bad
const original = { a: 1, b: 2 };
const copy = Object.assign(original, { c: 3 }); // this mutates `original`
delete copy.a; // so does this

// bad
const original = { a: 1, b: 2 };
const copy = Object.assign({}, original, { c: 3 }); // copy => { a: 1, b: 2, c: 3 }

// good
const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }

const { a, ...noA } = copy; // noA => { b: 2, c: 3 }

: JS에는 얕은 복사(Shallow-copy)와 깊은 복사(Deep-copy)가 있습니다. 

  • 얕은 복사 : 객체를 직접 대입함. 참조에 의한 할당. 원본과 복사본은 같은 데이터주소를 가지고 있어, 한쪽만 변경돼도 둘 다 변경된다.
  • 깊은 복사 : 새로운 객체의 프로퍼티만 복사. 원복과 복사본은 다른 데이터주소를 가지고 있다. 

Object.assign는 얕은 복사, spread는 깊은 복사(1depth 한정)가 이루어집니다. spread는 장황하지 않고, 네이티브 지원이 없는 환경에서도 폴리필이 필요하지 않습니다.(ex. BABEL)

 

naver github STYLE_GUIDE.md

 

 

Object 부분은 다른 컨벤션 부분보다 기초지식이 없으면 이해하기 어렵다는 생각이 들었습니다. 이 페이지에 나온 부분들은 추후 따로 다뤄보도록 하겠습니다. 다행이도 다음 Array부분부터는 좀 더 친숙한 부분이 많네요...ㅎㅎ

References


 이 부분은 변수 선언(참조)에 대한 내용입니다.

 

  2.1 변수 선언은 가급적 const를 사용하고, var는 사용하지 않는다.

//bad
var a = 1;
var b = 2;

//good
const a = 1;
const b = 2;

: const를 사용해야 참조를 재할당할 수 없으므로, 버그발생 및 코드난독을 해소할 수 있습니다.

 

 

 ▽ 2.2 참조를 재할당 해야된다면 var 대신 let을 사용한다.

//bad
var count = 1;
if (true) {
	count += 1;
}

//good, use the let!
let count = 1;
if (true) {
	count += 1;
}

 : let은 블록범위, var는 함수범위이기 때문입니다.

 

 

  2.3 let과 const는 선언된 블록 안에서만 존재하는 블록 스코프이다.

// const와 let은 선언된 블록의 안에서만 존재한다.
{
	let a = 1;
	let b = 1;
	let c = 1;
}
console.log(a);
console.log(b);
console.log(c);
//결과
ReferenceError
ReferenceError
1

 

 

naver github STYLE_GUIDE.md

 

사전지식

  • 데이터 타입에는 기본형(Primitive)과 참조형(References=Non-Primitive)이 있습니다.
  • JavaScript는 object를 제외한 모든 것이 Primitive한 성격을 가지고 있습니다.
  • Primitive type : 데이터의 실제 값을 할당합니다.
  • Reference type : 데이터의 위치 값을 할당합니다.

Primitives Type


  • data가 변수에 저장될 때, 고정된 크기(Byte)로 저장됩니다.
  • 변수 선언, 초기화, 할당 시 메모리 영역에 직접 접근합니다.
  • 종류는 string, number, boolean, null, undefined, symbol, bigint가 있습니다.
const foo = 1;
let bar = foo;

bar = 9;

console.log(foo, bar);

 ▽ 1.1 기본형은 그 값을 직접 조작한다.

//결과
1, 9

 

Reference Type (Complex)


  • data의 크기가 정해져 있지 않고, 변수에 할당될 때 데이터에 대한 참조만 저장됩니다.
  • 종류로는 object, array, function이 있습니다.

  1.2 참조형(Complex)는 참조를 통해 값을 조작한다.

const foo = [1, 2];
const bar = foo;

bar[0] = 9;

console.log(foo(0), bar[0]);
//결과
9, 9

 

naver github STYLE_GUIDE.md

 

 저번 시간에 우리는 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

 

 여러 강의를 들으면서 따라 적는 클론코딩을 많이 했지만, 결국 개발공부를 열심히 하게 만든 것은 직접 계획한 프로젝트입니다.

 내가 원하는 모션과 효과, 컨텐츠를 담기 위해(어떻게든 구현하기 위해) 노력하면서 만들다보니 배워가는 것도, 그만큼 애착도 남다른 것 같습니다.

 

 클론코딩과 반복되는 것 같은 의미없는 공부가 지속되다보니 개발에 대한 재미가 사그러들때쯤.. 문득 '이런 걸 만들어보면 어떨까?'하는 생각에 시작한 게, 제 첫 번째 프로젝트가 됐네요. 결과물 먼저 보겠습니다.


▽ 첼리스트 아내의 프로필 웹페이지 만들기

 

https://hwonda.github.io/Seulgi

 

Kim Seulgi | Cellist

Profile 서울예술고등학교 졸업 이화여자대학교 학부 수석졸업 이화여자대학교 대학원 재학중 이화오케스트라 협주회 협연 실내악 콩쿨 다수 입상 예술의전당 대학오케스트라축제 첼로수석 헝

hwonda.github.io


 먼저, 다른 음악인의 홈페이지를 참고하고 싶어 서칭해봤는데 정말 아예 없다싶을 정도로 없더군요. 우리나라에서 음악을 하는 수많은 사람들이 의외로 자기만의 홈페이지를 만드는 데에 관심없다는 생각이 들었습니다. 그도 그럴 것이 인스타나 페이스북 같은 SNS나 Youtube를 통해 훨씬 편하고 폭넓게 홍보할 수 있는 수단이 있었죠. 하지만 SNS나 Youtube는 한 눈에 정보를 알아보기 어렵고, 찾아보기 은근히 귀찮다는 단점이 있습니다. 그래서 제 공부도 할 겸 만들어보기로 했습니다.

 

 9/13 ~ 10/20 약 5주에 걸쳐 Seulgi ver 1.0을 완성해 배포했습니다. 배포라고 하기엔 github를 통해 호스팅을 한 것이고, 빠르게 만들고 싶어 BootStrap5를 이용했습니다.

 첫 결과물 치고 은근히 만족했습니다만,, 보면 볼수록 뭔가 나사빠진 부분이나 수정하고 싶은 부분이 봇물처럼 터져나오더라구요. 그리고 BootStrap은 물론 좋은 라이브러리입니다만 많은 제약이 있고, template를 이용했기에 수정하고 싶은 부분 중 아예 갈아엎어야 되는 부분도 더러 있습니다. 물론 나중에 Vue나 React를 공부하며 완전히 갈아엎어볼 예정입니다.

 

 이 Project 카테고리에서는 창작물을 어떻게 수정하고싶은지 생각해보며 직접 고치는 작업을 업로드할 예정입니다.

부트스트랩을 적어놨지만 수정할 부분에서 부트스트랩의 비중보다 HTML,JS,CSS의 비중이 높을지도 모르겠네요..!

 

 https://github.com/hwonda/Seulgi.git

 

GitHub - hwonda/Seulgi

Contribute to hwonda/Seulgi development by creating an account on GitHub.

github.com

 △ 아무도 보지 않는 나만의 웹페이지 깃허브♡

 

 

 

 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 버전(혹은 요구되는 버전)으로 다시 깔아줍니다.

+ Recent posts