React
React 입문
Yuna_dev
2021. 6. 9. 18:57
1. React 개발 배경
- 애플리케이션의 규모가 커지며 복잡해질수록 처리해야 할 이벤트도 다양해지고, 관리해야할 상태값이나 DOM도 다양해지게 된다. 이에 따라 업데이트 등을 할때도 작업이 많이 복잡해지게된다.
- 이러한 문제점을 해결하기 위해 다양한 프레임워크가 만들어져서 업데이트 하는 작업을 간소화시켜 주었다.
- 하지만 리엑트는 업데이트를 간소화하는 방법에 초점을 둔것이 아니라, 처음부터 다시 새로 만드는 것에서 시작을 하게 되었다.
- 리액트에서는 virtual DOM 이라는 것을 사용하는데, 이는 가상의 DOM 으로 브라우저에 실제로 보여지는 DOM이 아니라 그냥 메모리에 가상으로 존재하는 DOM이다. 실제 DOM 이 아닌 JavaScript 객체이기 때문에 작동 성능이 빠르다.
- 리액트는 상태가 업데이트 되면, 업데이트가 필요한 곳의 UI 를 Virtual DOM 을 통해서 렌더링한다. 그리고 실제 브라우저에 보여지고 있는 DOM 과 비교를 한 후, 차이가 있는 곳을 감지하여 이를 실제 DOM 에 패치시킨다.
2. 리액트란
- React는 JavaScript 라이브러리로, Facebook 에서 만든 오픈 소스 프로젝트이다.
- React 의 가장 중요한 측면 중 하나는 사용자 인터페이스를 빠르고 효율적으로 구축하기 위해 재사용 가능한 사용자 정의 HTML 요소와 같은 구성 요소를 만들수 있다는 사실이다.
- React는 프론트 엔드에서 사용자 인터페이스(UI)를 구축하는데 사용된다. Model View Controller 애플리케이션의 뷰 레이어이다.
- React는 state 및 props를 사용하여 데이터 저장 및 처리 방법을 간소화한다.
3. 리액트를 배우기 전에,
React를 사용하기 전에 미리 알아야 할 개념들이 있다. 선행적으로 JavaScript 개념이 학습되어야 하는데, 그중 중요한 부분을 정리해보려 한다. 그중 대부분은 javascript ES6에서 도입한 개념이다.
3.1 var / let / const
- 키워드 var 의 문제
- 함수레벨 스코프
- 중복 선언이 가능함
- 생략 가능
- 호이스팅
- let / const 키워드의 등장
- 블록레벨 스코프
- 중복 선언 ⇒ SyntaxError 발생
- 호이스팅 ⇒ ReferenceError 발생
- let = 변경 가능/ const = 변경 불가능(Primitive)
3.2 template string
- 문자열
- ${자바스크립트 표현식} : 표현식은 return의 유무로 결정된다. 따라서 if문이나 for 문은 표현식이 아니기 때문에 넣을 수 없다. 이런 이유로 삼항 연산자를 중요하게 사용하게 되었다.
3.3 arrow function ( ( ) ⇒ { } ) 화살표 함수
- 자신의 this를 만들지 않기 때문에 생성자로 사용할 수 없다.
- 거의 익명함수를 사용한다.
- 인자가 하나면, ( ) 를 생략할 수 있다.
- 리턴만 있으면, { } 생략할 수 있다. (=중괄호 안의 값이 표현식이다.)
3.4 함수.bind (this)
- bind() 함수가 호출되면 새로운 바인딩한 함수를 생성한다.
- bind 함수에 인수로 바인딩 하려는 대상함수를 넣어주면 this가 지정한 객체에 묶인다.
// bind.js
function hello() {
console.log(`안녕하세요 ${this.name}`);
}
const mark = { name: 'Mark' };
const helloMark = hello.bind(mark);
helloMark();
3.5 디스트럭처링 할당 (Destructuring assignment)
- 구조 분해 할당으로 이터러블 또는 객체를 destructuring 하여 1개 이상의 변수에 개별적으로 할당하는 것을 말한다.
- 필요한 값만 추출하여 변수에 할당할때 유용하다.
- 배열 디스트럭처링 할당 / 객체 디스트러처링 할당
// 객체 디스트럭처링 할당
const foo = {
a: '에이',
b: '비이',
};
const { a, b } = foo;
console.log(a, b);
// 배열 디스트럭처링 할당
const bar = ['씨이', '디이'];
const [c, d] = bar;
console.log(c, d);
const { a: newA, b: newB } = foo;
console.log(newA, newB);
3.6 Spread 와 Rest
- ... (점 3개)
- 스프레드 문법은 하나로 뭉쳐있는 여러 값들의 집합(배열 등)을 펼쳐서 개별적인 값들의 목록으로 만든다.
- Rest 파라미터(Rest parameter, 나머지 매개변수)는 매개변수 이름 앞에 세개의 점 …을 붙여서 정의한 매개변수를 의미한다. Rest 파라미터는 함수에 전달된 인수들의 목록을 배열로 전달받는다.
3.7 callback 함수
- 전통적으로 비동기 처리를 위해 사용되어진 방법이다.
- 콜백 헬이 발생하고 에러처리가 곤란하다는 한계가 있어서 이를 처리하기 위해 다양한 방법이 등장했다.
function foo(callback) {
setTimeout(() => {
// 로직
callback();
}, 1000);
}
foo(() => {
console.log('end');
});
console.log('이것이 먼저 실행');
3.8 async / await
- 기본적으로 비동기 처리를 위해 Promise를 사용한다.
- then 과 catch 등의 메서드를 통해 후속처리를 하고, 비동기 처리 상태가 변화하면 후속처리 메서드에 인수로 전달한 콜백함수가 선택적으로 호출된다.
- async 키워드가 붙은 함수 안에서만 await 키워드를 사용할 수 있다.
function foo(callback) {
setTimeout(() => {
// 로직
callback();
}, 1000);
}
foo(() => {
console.log('end');
});
console.log('이것이 먼저 실행');
3.9 Generator 객체
- function*으로 만들어진 함수를 호출하면 반환되는 객체이다.
- function*에서 yield 를 호출하여, 다시 제어권을 넘겨준다.
- 제너레이터 객체에 next() 함수를 호출하면, 다음 yield 지점까지 간다.
// generator.js
function* foo() {
console.log(0.5);
yield 1;
console.log(1.5);
yield 2;
console.log(2.5);
yield 3;
console.log(3.5);
}
const g = foo();
console.log(g.next().value);
console.log(g.next().value);
console.log(g.next().value);
console.log(g.next().value);
console.log(g.next().value);