반응형

■ 리액트 소스 노출 차단

React로 구현한 웹의 소스가 노출되는 것을 방지하지 않고 그대로 베포하게 되면,

크롬 웹 브라우저의 개발자 도구에서 쉽게 소스를 확인하거나 디버깅할 수 있다.

소스를 확인하거나 디버깅을 할 수 있다는 의미는 보안적인 부분에서 치명적인 문제가 아닐수 없다.

따라서 React로 개발한 소스가 노출되지 않도록 차단하는 작업을 진행

1. [.env] 파일 생성 후 내용 추가

GENERATE_SOURCEMAP = false

2. 프로젝트 빌드 후 반영

npm run build

3. 크롬 웹 브라우저 개발자 도구에서 확인

프로젝트내에 임의로 MainView.js 파일 생성하였지만 노출되지 않음을 확인할 수 있다.

반응형
반응형

■ 스토리북

스토리북은 비주얼 테스트를 위한 도구이며, 화면을 구성하는 컴포넌트들을 독립적으로

관리하고 변화를 테스트해 볼 수 있다.


■ 스토리북 활용

1. 스토리북 설치

  • 프로젝트의 루트 폴더로 이동
  • 명령어 실행
  • package.json에 자동으로 스토리북이 추가된걸 확인
> yarn add -dev @storybook/react@5.2.6

2. package.json에 스토리북 실행 명령어 추가

  • package.json의 script 블록에 npm 또는 yarn으로 실행할 명령어를 추가
  • storybook 명령어가 스토리북 서버를 9001 프토를 통해 실행시킬 수 있도록 설정

* package.json의 script블록은 리액트 서버를 구동하는 명령어인 yarn start와 같이 실행할 명령어를 정의하는 공간이다.

"scripts": {
        :
        :    
    "storybook": "start-storybook -p 9001 -c .storybook",    
    "start": "react-scripts start",    
    "build": "react-scripts build",
        :
},

3. 스토리 파일 만들기

  • src 폴더에 stories 폴더 생성
  • 컴포넌트의 여러 출력 형태를 구성할 스토리 파일 생성
import React from 'react';
// 스토리를 스토리북 도구에 추가해주는 storiesOf() 함수를 임포트
import { storiesOf } from '@storybook/react';

// 다양한 형태의 Input 컴포넌트를 가지는 Input 스토리를 임포트
import Input from '../Input';

// 'Input' : 스토리북 도구에 표시할 스토리의 이름
// '기본 설정' : 스토리북 도구에 표시할 메뉴 이름
storiesOf('Input', module)  .add('기본 설정', () => <Input/>)

4. 스토리북 config.js에 스토리 연결

  • 프로젝트 루트 폴더에 .storybook 폴더 생성
  • .storybook 폴더에 config.js 설정 파일 생성

* InputStory.jsx 파일을 loadStories 함수 안에서 require 함수로 임포트 했다. 즉, Input 스토리를 스토리북에 연결

import { configure} from '@storybook/react';

function loadStories() {  
    require('../src/stories/InputStory');  
    // 스토리 파일을 이곳에 추가할 수 있다.
}
configure(loadStories, module);

5. 스토리북 실행하기

  • 터미널에 명령어 실행
> yarn storybook

6. 스토리북 실행 화면

반응형
반응형

■ 컴포넌트의 생명주기

컴포넌트의 생명주기는 컴포넌트의 생성부터 소멸까지의 과정을 의미하며,

생명주기 함수는 리액트 엔진에서 자동으로 호출되며, 각 함수의 기능을 이해하면 

컴포넌트를 효율적으로 활용할 수 있다.



■ 생명주기 함수

1) constructor(props) 함수

컴포넌트가 생성될 때 한 번만 호출되며, 상태를 선언할 때 사용된다.
constructor 함수를 정의할 때는 항상 super 함수를 가장 상위에 호출해야 한다.

 * super 함수는 프로퍼티와 생명 주기 상태 등을 초기화하는 과정을 포함하고 있다.

2) static getDerivedStateFromProps(props, state) 함수

getDerivedStateFromProps 함수는 정적 함수이다.
따라서 함수 안에서 this.props 또는 this.state와 같이 프로퍼티나 state값에 접근할 수 없다.
만약 프로퍼티나 state에 접근해야 하는 경우 반드시 인자로 전달된 props, state를 이용해야한다.
props는 상위 컴포넌트에서 전달된 값이며, state는 현재 컴포넌트의 state값 이다.
결론적으로 getDerivedStateFromProps 함수는 상위 컴포넌트에서 전달받은 프로퍼티로 state값을
변경할 때 주로 사용되며, 반환값으로 state를 변경한다.

3) render() 함수

데이터가 변경되어 새 화면을 그려야 할 때 자동으로 호출되는 함수이다.
render 함수가 반환하는 JSX를 화면에 그려준다.

4) componentDidMount() 함수

render 함수가 JSX를 화면에 그린 이후에 호출되는 함수이므로, 컴포넌트가 화면에 표현된 이후 
작업들을 componentDidMount 함수에서 하면 된다.

5) shouldComponentUpdate(nextProps, nextState) 함수

shouldComponentUpdate 함수는 프로퍼티를 변경하거나 setState 함수를 호출하여 state값을 변경하면
화면을 새로 출력할 것인지를 판단하는 함수이다.
따라서 이 함수는 화면을 새로 출력할지 말지 판단하며, 데이터 변화를 비교하는 작업을 포함하므로 
리액트 성능에 영향을 많이 준다.

* forceUpdate 함수를 호출하여 화면을 출력하게 되면 shouldComponentUpdate 함수는 호출되지 않는다.

6) getSnapshotBeforeUpdate(prevProps, prevState) 함수

getSnapshotBeforeUpdate 함수는 컴포넌트의 변경된 내용이 가상 화면에 완성된 이후 호출되는 함수이다.
따라서 이 함수는 컴포넌트가 화면에 실제로 출력되기 전에 호출되므로 화면에 출력될 엘리먼트의 크기
또는 스크롤 위치 등의 DOM 정보에 접근할 때 사용된다.

7) componentDidUpdate(prevProps, prevState, snapshot) 함수

componentDidUpdate 함수는 컴포넌트가 실제 화면에 출력된 이후 호출되는 함수이다.
따라서 스크롤 위치를 옮기거나 커서를 이동시키는 등의 DOM 정보를 변경할 대 사용된다.


* 함수 인자 정의
prevProps : 부모 컴포넌트로부터 전달된 이전 프로퍼티
prevState : 이전 state 값
snapshot : getSnapshotBeforeUpdate 함수에서 반환된 값

8) componentWillUnmount() 함수

componentWillUnmount 함수는 컴포넌트가 소멸되기 직전에 호출되는 함수이다.
컴포넌트에서 감시하고 있는 작업들을 해제할 때 필요한 함수이다.
따라서 메모리 누수 현상이 발생하여 웹 브라우저의 작동이 멈추는 현상을 방지할 수 있다.
반응형
반응형

■ 디바운스

내용을 입력하다가 특정 시간 동안 대기하고 있으면 마지막에 입력된내용을 바탕으로 서버 요청을 하는 방법이다.구글의 검색창을 떠올리면 이해하는데 도움이 된다.검색창에 입력을 하다가 입력을 멈추면 검색창 하단에 연관 검색어가 나오는 것이 디바운스로 구현한 기능이다.


예시)


■ 스로틀

페이스북의 타임라인 기능으로 이해하기 쉽다.

스크롤을 내리는 동안 계속해서 다음 내용이 출력되는 무한 스크롤 기능이다.


예시)

반응형
반응형

■ 웹팩(Webpack)

의존성을 분석해 모듈을 번들(여러 개를 하나로 묶어주는)시켜주는 역할을 한다.

프로젝트를 개발하다보면 수 많은 라이브러리들을 사용하게 되는데 빌드(build)라는 과정을 통해

하나의 파일로 만들어 준다.

예시로 JAVA 스프링 프레임워크를 활용하느 프로젝트에서

해당 프로젝트를 빌드하여 jar파일로 말아서 생성하는것과 유사하다.


■ 바벨(Babel)

바벨은 코드 변환기다.

개발자들은 최신의 코드로 작업을 진행하고 최대한 많은 사용자가 사용하는데

불편함이 없도록 만들어 주는게 바벨이다.

바벨은 최신 자바스크립트 문법을 구형 브라우저에서도 돌 수 있도록 코드 자체를 변환시킨다.

반응형
반응형

■ foreach() 함수

* 반복문의 순번 또는 배열의 크기를 따로 변수에 저장하지 않고도 반복작업이 가능하다.

* 반환값이 없어도 된다.

function parse(qs) {
  const queryString = qs.substr(1);  // querystring = 'banana=10&apple=20&orange=30'
  const chunks = queryString.split('&');  // chunks = ['banana=10', 'apple=20', 'orange=30']
  let result = {};
  chunks.forEach((chunk) => {
    const [ key, value ] = chunk.split('=');  // key = 'banana', value = '10'
    result[key] = value;  // result = { banana: 10 }
  });
  return result;
}

// 결과 : 
// result = {banana: "10", apple: "20", orange: "30"}

map() 함수

* 각 배열 요소를 정의된 함수를 통해 변환한 결괏값들로 변환하고 새 배열을 반환한다.

* 반환값이 있어야 한다.

function parse(qs) {
  const queryString = qs.substr(1);  // querystring = 'banana=10&apple=20&orange=30'
  const chunks = queryString.split('&');  // chunks = ['banana=10', 'apple=20', 'orange=30']
  const result = chunks.map((chunk) => {
    const [ key, value ] = chunk.split('=');  // key = 'banana', value = '10'
    return { key: key, value: value };  // { key: 'banana', value: '10' }
  });
  return result;
}

/*
결과:
result = [
  { key: 'banana', value: '10'},
  { key: 'apple', value: '20' },
  { key: 'orange', value: '30'}
];
*/

 reduce() 함수

* 첫번째 요소부터 마지막 요소까지의 각 배열 요소의 형태를 가공하거나 변환하여 1개의 값(또는 객체)을 반환한다.

* 반환값이 있어야 한다.

function parse(qs) {
  const queryString = qs.substr(1);  // querystring = 'banana=10&apple=20&orange=30'
  const chunks = queryString.split('&');  // chunks = ['banana=10', 'apple=20', 'orange=30']
  return chunks
    .map((chunk) => {
      const [ key, value ] = chunk.split('='); // key = 'banana', value = '10'
      return { key, value }; // { key: 'banana', value: '10' }
    })
    .reduce((result, item) => ({
      ...result,
      [item.key]: item.value,
    }), {});
}

/*
결과:
{banana: "10", apple: "20", orange: "30"}
*/
반응형

+ Recent posts