avatar
Ganymedian

#1. 리액트를 배우기 위한 사전 준비

#1. 리액트를 배우기 위한 사전 준비
Jun 25
·
7 min read

#1. 리액트를 배우기 위한 사전 준비

#챕터 목차

  1. JSX 구문

  2. Imperative & Declarative

  3. v = f ( s )

  4. ES5/ ES6 functions and literals

JSX 구문

JSX 는 Javascript 와 XML 을 합성한 표현방식입니다.

React 에서는 JSX 구문을 주로 사용하게 됩니다.

// JSX 의 예제 코드
const name = 'John Doe';
const element = <h1>Hello, {name}</h1>;

// JS 의 예제 코드
const element = React.createElement(
  'h1',
  null,
  `Hello, ${name}`
);
// 함수형 컴포넌트 내에서의 사용예
  return(	
      {state === "loading" ? (
        "Loading"
      ) : (
        <ul>
          {todos.map((todo) => (
            <TodoItem77 key={todo.id} {...todo} />
          ))}
        </ul>
      )}
  )

JSX 심화 학습 Ref :

https://reactjs-kr.firebaseapp.com/docs/introducing-jsx.html

https://ko.legacy.reactjs.org/docs/jsx-in-depth.html

Imperative vs. Declarative

프로그래밍에서 해결해야 할 과제 “AAA” 가 있다고 가정하겠습니다.

절차형/명령형 imperative 프로그래밍에서는 “AAA” 의 모든 속성과 과제 들을 데스크탑 위에 모두 풀어헤쳐 놓고 하나하나의 세부항목 태스크를 구성한 후, 각각의 태스크에 대한 코드들을 구성해준 뒤 전체 플로우를 연결해줍니다.

// Imperative
// 배열에서 짝수를 찾고 그 합을 계산한다.
const numbers = [1, 2, 3, 4, 5, 6];
let sum = 0;

for (let i = 0; i < numbers.length; i++) {
  if (numbers[i] % 2 === 0) {
    sum += numbers[i];
  }
}

console.log(sum); // 12
// 모든 절차가 마치 익숙한 의식의 흐름처럼 진행되었습니다.

반면에 선언형 declarative 프로그래밍에서는, 추상화 된 처리 엔진(또는 규칙) 을 전제로 합니다.

그리고 그 엔진이 watch/listen 하고있는 ‘개별 상태’ 를 변경 또는 관리의 목표로 설정해 줌으로서 태스크가 해결됩니다.

// Declarative
// 새로운 greet 객체를 출력에 반영시킨다.
const [activeGreet, setActiveGreet] = setState(null)
const newGreet = ['greetings', '안녕']
setActiveGreet(newGreet)
return (
	{
		activeGreet && (
			activeGreet.map( (eachGreet, i) => {
	      <Greet key={i} greet={eachGreet } />
			}	     
    )
	}
)
// 모든 코드의 중심과 목표는 'activeGreet' 라는 상태-state 에 집중되어 있습니다.

v = f ( s )

view = function ( state )

선언형 프로그래밍에서는 처리해야 할 ‘상태’ 즉, state 에 집중하고, state 를 변화 시키면 화면의 출력 양태가 바뀌도록 프로그래밍 합니다.

이 점이 가장 큰 변화이고 익숙해지기 어려운 문제인데요.. 기존의 절차형 프로그래밍으로부터의 패러다임 전환이기 때문에, 적응하기가 쉽지는 않습니다. 습관처럼 for 문을 적게 되기도 하죠. 언제나 그랬던 것 처럼, 직접 수 만 라인의 코드를 짜보는 것 외에는 왕도가 없는 것 같습니다.

아무튼, 기억해두시기 바랍니다. 모든 것은 state 이고, 개발자는 state 에 집중해야 한다… 라는 것이 리액트의 가장 큰 지혜이자 중심 컨셉입니다.

ES5/ES6 functions & literals

리액트 에서는 ECMA5/6 에서 도입된 펑션과 리터럴이 자주 사용됩니다. 거의 모든 리액트 컴포넌트에서 사용된다고도 말할 수 있겠습니다.

ES5/6 펑션과 표현에 익숙해지셔야 합니다.

// ES5/ES6 펑션의 예 
  setAllTodos(allTodos.filter((eachTodo) => eachTodo.id !== targetTodoId));
  return(
      <ul>
        {todos.map((todo) => (
          <TodoItem key={todo.id} {...todo} />
        ))}
      </ul>
  )

가장 자주, 유용하게 사용되는 ES5/ES6 펑션들은 다음과 같습니다.

Array.map

var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);

function myFunction(value) {
  return value * 2;
}
// arrow function ver.
const numbers2 = numbers1.map( (val) => val*2 );

Array.filter

var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);

function myFunction(value) {
  return value > 18;
}
// arrow function ver.
const numbers2 = numbers1.filter( (val) => val > 18 );

Array.reduce

var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);

function myFunction(total, value) {
  return total + value;
}
// arrow function ver.
const numbers2 = numbers1.reduce((total, value) => total + value, 0);

Arrow function

// ES5
var x = function(x, y) {
   return x * y;
}

// ES6
const x = (x, y) => x * y;

Optional chaining

const user = {
  name: 'John',
  greet: function() {
    return 'Hello!';
  }
};

// Optional chaining을 사용하지 않은 경우
const greet1 = user && user.greet && user.greet();
console.log(greet1); // 'Hello!'

// Optional chaining을 사용한 경우
const greet2 = user?.greet?.();
console.log(greet2); // 'Hello!'

ES5/ES6 Functions 심화학습 Ref :

https://www.w3schools.com/js/js_es5.asp

Destructuring assignment : 구조 분해 할당

// 기본 분해 할당
let a, b, rest;
[a, b] = [10, 20];

console.log(a); // 10
console.log(b); // 20

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest); // Array [30, 40, 50]

// 객체 구조 분해 할당
const person = {
  name: 'John Doe',
  age: 30,
  address: {
    city: 'New York',
    zip: '10001'
  }
};

// 객체에서 값을 분해하여 변수에 할당
const { name, age } = person;

console.log(name); // John Doe
console.log(age); // 30

// 중첩된 객체의 속성을 분해하여 할당
const { address: { city, zip } } = person;

console.log(city); // New York
console.log(zip); // 10001

Destructuring assignment 심화학습 Ref :

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

Nullish Coalescing Operator 와 Logical OR Operator


let name = "";
let text = "default";
let result;

// Nullish coalising
result = name ?? text;
console.log(result); // ""

// Logical OR operator
result = name || text;
console.log(result); // "default"

// Falsy 값 처리: 
// ?? 연산자는 null이나 undefined만을 검사하고, 
// || 연산자는 모든 falsy 값을 검사합니다.

여기까지가 React 에서 주로 사용되는 구문과 펑션.. 등에 대한 사전 지식 점검 이었습니다.

충분히 이해하셨다면, 다음 장에서 본격적으로 React App 을 생성하고, 코딩을 시작해 봅시다.







....