개발냥발/FE (FrontEnd)👩🏻‍💻

React 익히고 활용하기❗

승이버섯 2022. 6. 9. 11:55

💥5주차 & 6주차 통합본!

 

0. React? React의 장점과 단점?

React? A JavaScript library for building user interfaces.

사용자와 웹사이트의 상호작용을 돕는 인터페이스를 만들기 위한, , 화면을 만들기 위한 기능들을 모아놓은 자바스크립트 *라이브러리!

Meta(facebook)에서 만든 오픈소스 자바스크립트 UI 라이브러리. 현재 가장 많이 사용되는 라이브러리! 복잡한 사이트를 쉽고 빠르게 만들고 관리하기 위해 만들어짐!

(*라이브러리 : 자주 사용되는 기능들을 정리해 모아놓은 것)

사용자 인터페이스(User Interface, UI) : 사용자와 컴퓨터 프로그램이 서로 상호작용을 하기 위해 중간에서 서로간의 입력과 출력을 제어해주는 것! (ex) 버튼, 텍스트 입력창

프레임워크 VS 라이브러리? : 가장 큰 차이는, 프로그램의 흐름에 대한 제어 권한! 프레임워크는, 제어 권한을 개발자가 아닌 프레임워크가 가짐. 반면에 라이브러리는, 흐름에 대한 제어를 하지 않고, 개발자가 필요한 부분만 필요할 때 가져다 사용하는 형태! , 라이브러리는 제어 권한이 개발자에게 있음!

웹 개발의 흐름은 나중에 어떻게 될지 모르므로, React를 공부하면서, 동시에 그 밑바탕에 깔려 있는 웹사이트의 작동 원리와 흐름을 함께 이해하는 게 중요!

 

SPA? : Single Page Application의 약자. 하나의 페이지만 존재하는 웹사이트, 또는 웹애플리케이션.

수백개의 페이지를 각각 html로 만드는 것은 비효율적! 그래서 1개의 html 틀을 만들어놓고, 사용자가 특정 페이지를 요청할 때, 그 안에 해당 페이지의 내용을 채워서 보내주는 것! ReactSPA를 쉽고 빠르게 만들 수 있도록 해주는 도구!

 

 

1. create-react-app으로 React 프로젝트 만들기

Windows Powershell을 열어준 뒤, npx create-react-app voca(=프로젝트 폴더)

예전에 react 프로젝트를 조금 해본 적이 있어서 그런지, 최신 버전이 아니라고 뭐시기뭐시기 군더더기가 뜨고 프로젝트가 안 만들어짐. 그래서 하라는 대로 함. npm uninstall g create-react-app

위의 명령을 실행시켜준 뒤, 다시 npx create-react-app voca를 하니까 프로젝트가 만들어짐!

터미널을 열어서, 프로젝트 폴더 안으로 들어간 뒤, npm start를 치면 끝!

 

create-react-app 의 역할

자동으로 git을 초기화 상태로 설정해준다. 그래서 git init을 따로 해줄 필요가 없음!

src/App.js 파일에서 수정한 내용들을 바로바로 반영시켜준다!

 

node-modules 폴더

이 프로젝트를 실행할 때 사용되는 dependency 모듈들이 모두 모여있음! 여기에 설치된 내용들은, package.json에 기록되어 있음! node-modules 폴더를 지우면 프로젝트 실행 불가! 근데 npm install 해주면 됨!(다만 package.json이 수정되지 않았다면!)

git에 올릴 때 안 올라감. 크기도 크고 파일도 많아서! 근데 package.json 파일을 git에 올려두면, 다른 개발자가 동일한 환경을 구축할 수 있음!

 

public 폴더

이 폴더 안의 <div id=“root”></div>react 코드가 실행되어서 만들어진 DOM이 구현됨!

 

src 폴더

대부분의 작업이 실행되는 곳!

이 폴더의 App.js에서 코드를 구현! 이 파일에서 무언가를 작성하거나, 수정한 후 저장하면, 브라우저에 바로 반영됨!! Hot Module Replacement (HMR)

JSX : 자바스크립트 내부에 HTML처럼 작성하는 것!

 

 

2. React의 컴포넌트, JSX

컴포넌트

React로 만든 페이지는 컴포넌트들로 구성되어있음! 페이지 단위로 HTML을 작성하는 게 아니라, 각 부분들을 컴포넌트로 만들어서 조립!!

비슷한 부분은 코드 재사용! 유지보수도 한결 쉬워짐!

한번 만들어둔 컴포넌트는, 어디에든 몇 번이고 재사용 가능!

App.jsApp 컴포넌트! 함수로 만들어져있음. defaultexport 되어지고 있음. 이걸 index.js에서 import해서 사용!

함수로 만들어진 컴포넌트 : 함수형 컴포넌트! 모든 컴포넌트는 대문자로 시작해야함!

src 폴더 안에 component 폴더를 만든 후, 그 안에 js파일도 만들고, 함수도 만든 후 export 해주면 간단하게 컴포넌트 생성 가능!

컴포넌트 만드는 방식

1) const Hello = () => {

return (

<div>

<h1>Hello</h1>

<World />

</div>

);

}

export default Hello;

 

2) const Hello = function () {

return <p>Hello</p>;

};

export default Hello;

 

3) export default function Hello() {

return <p>Hello</p>;

}

JSX

컴포넌트가 return하는 것은, JSX (JavaScript XML). HTML을 다뤄봤다면 쉽게 적응 가능!

classJavascript의 예약어이므로, JSX 작성시, className을 써야함!

style은 객체로 전달해야 적용됨. style에서 color는 문자열로, 배경색은 backgroundColor처럼 CamelCase!

{ } 내부에서 변수 사용 가능! (ex) Hello, {name}

숫자나 문자열은 가능하나, boolean이나 객체는 표현 불가!

한 컴포넌트 안에는, 하나의 JSX 태그만 쓸 수 있음! (그래서 전체 태그들을 빈 태그 <></>로 묶거나, <div></div>로 묶는다!

 

 

3. React에서의 CSS 작성법

create-react-app으로 만들어진 프로젝트라면, 별도의 다른 패키지 설치 없이, 바로 CSS 사용 가능

inline style 사용

CSS 파일을 별도로 만들지 않고, 바로 html 태그에 적어주는 것. 객체를 작성해야! 이름은 CamelCase로 적어준다. 사실 특별한 이유가 없으면, inline style로 작성하진 않음.

(ex) <div>

<h1 style = {{

color : ‘#f00’,

borderRight : ‘2px solid #000’,

opacity : 0.5,

marginBottom : “30px”,

}}>Hello</h1>

 

CSS 모듈 사용

index.css : 전체 프로젝트에 영향 미침

App.css : App 컴포넌트에 한정!

App 컴포넌트에 있고 App.css로 꾸며준 box, Hello 컴포넌트에 있고 Hello.css로 꾸며준 box가 생김새가 서로 똑같아짐..! 왜냐하면, CSS 파일들이 각 컴포넌트에 종속되는 게 아니라, head 안에 전부 다 작성되기 때문에, 전체 페이지에 영향을 미치기 때문!

컴포넌트에 특화된 CSS 작성법 : CSS 모듈 사용하기!

(컴포넌트 이름).module.css 파일을 만들어준 뒤, 그 안에 CSS를 작성하고, 컴포넌트 파일 위에 import styles from “./(컴포넌트 이름).module.css”; 작성 후, 컴포넌트 안에 <div className={styles.(css 클래스 이름)}></div> 작성

CSS 크기가 엄청 커지면, 네이밍, 상속, 오버라이딩이 가장 고민이 되는데, 이 방식으로 다 해결 가능!

global 단위가 아니라, 컴포넌트 단위로 관리되는 것도 장점!

 

index.css 파일에 전부 작성

 

 

4. React에서의 이벤트 처리(Handling Events)

미리 함수를 만들어 놓고, 전달하기

안에다가 직접 함수 작성하기

2번째 방법의 장점 : 매개변수를 전달하기가 편하다!

const Hello = () => {

 

function showName() {

console.log('Mike');

}

 

return (

<div>

<h1>Hello</h1>

<button onClick={showName}>Show Name</button> /* 1번째 방법 */

<button onClick={()=>{

console.log(20);

}}>Show Age</button> /* 2번째 방법 */

</div>

);

}

 

 

 

5. React에서의 stateuseState

state : 컴포넌트가 관리하는 상태값. 이 값이 변하면, React는 자동으로 UI를 업데이트 시킨다! 그래서 개발자는 이 state만 잘 관리하면, 화면을 다시 그려주는 작업은 신경 안써도 되는 편리함이 있음!

useState : state를 만들 수 있는 ReactHook. 상태값(state) 관리를 위해서 사용. (ex) import {useState} from “react”; //바깥에 작성

const [name, setName] = useState(‘Mike’); //export default function 안에 작성. 배열 구조 분해를 사용함. setName 함수가 호출되어서 name이 바뀌면, react는 이 컴포넌트를 다시 렌더링함. useState()의 괄호 안에는 초기값이 들어감.

useState배열로 반환! 배열의 첫 번째 값은 state, 즉 변수명이고, 두 번째는 state를 변경해주는 함수!

동일한 컴포넌트가 여러 개 있어도, state는 각각 관리됨! 다른 state에 영향을 미치지 X

 

16.8 버전부터, 모든 컴포넌트를 함수형으로 만들 수 있게 되었고, React Hook은 함수형 컴포넌트에서도 statelife cycle 관리가 가능해짐.

 

 

6. React에서의 Props

props : properties의 줄임말. 컴포넌트의 속성값. (App.js에서 컴포넌트 태그 안에 속성값을 주면, 그걸 컴포넌트 파일 안에서 넘겨받을 수 있음!) 이 값은 컴포넌트 내부에서 변경할 수 없음!! 넘겨받은 그대로 사용해야함! 만약 변경하고 싶다면, 컴포넌트 내부에서 state를 다시 만들어야 함!

stateprops는 굉장히 많이 사용된다! 화면에 어떤 데이터를 갱신하기 위해서는 항상 이 2가지를 사용해서 처리하는 게 좋음!

한 컴포넌트가 가지고 있는 stateprops로 넘길 수도 있음!

 

개발자가 해야할 일 : 데이터만 적절히 바꿔주기! 그러면 컴포넌트는 알아서 렌더링을 다시 하고, 화면의 UI 정보도 갱신됨! 일일이 어떤 요소를 어떤 값으로 바꿔줘야할지 찾아다니지 않아도 X

 

 

7. React에서의 더미 데이터 구현, map() 반복문

json 파일 안의 더미 데이터들을 화면상에 구현할 때, 반복문을 사용해야 하는데, 이때는 map()을 사용하는 게 편함!

map()배열을 받아서, 또 다른 배열로 반환! 이때 반환되는 배열 요소는 JSX로 작성!

key는 반복되는 요소에 고유한 값을 넣어줘야 함!

React는 상태가 바뀌면, 이전 상태의 트리와, 이후 상태의 트리를 비교함. 이때 키가 같다면, 동일한 요소로 판단하고 업데이트 해줌.

배열의 순서나 내용이 변경되지 않는다면, 아무 key나 사용해도 된다. (다르기만 하다면!)

but 순서나 내용이 변화되는 상황이라면, 요소를 특정할 수 있는 key를 사용한다! (그렇지 않으면 효율성이 안 좋음)

 

 

8. React-router-dom

프로젝트 폴더 안에서, npm install react-router-dom으로 라우터 설치!

<Route path=“/”> : 첫페이지를 의미!

exact path=“/” : 정확히 딱 첫페이지!

한 페이지에서 다른 페이지로 넘어갈 때, HTML<a href> 태그를 사용하지만, react-router-dom<Link to>를 사용!

URL을 포함한 값을 얻을 때는, react-router-dom이 제공하는 useParams() 라는 Hook을 사용!

 

 

9. Reactjson-server, REST API

사용자의 action에 따라서 데이터를 읽고, 쓰고, 업데이트하고, 삭제할려면, db를 구축하고 API를 만들어야 함! 그래서 json-server를 이용해서 Restful API를 만들어보자!

json-server빠르고 쉽게 Rest API를 만들어줌 (공부 목적, 프로토타입, 작은 개인프로젝트에 쓸 수 있음!) 프로젝트 폴더에서 npm install g json-server 명령으로 설치! 설치 후, json-server --watch ./src/db/data.json port 3001로 경로 정해주기!

Rest API? : 쉽게 말해서, URL 주소와, 메서드로 *CRUD를 요청!

(*CRUD : Create(POST), Read(GET), Update(PUT), Delete(DELETE))

Rest API, URL과 메서드만 보고도 어떤 요청인지 유추 가능한 장점이 있음!!

 

 

10. ReactuseEffect(), fetch()API 호출하기

useEffect()? : useState와 마찬가지로, 어떤 상태값이 바뀌었을 때, 동작하는 함수를 작성 가능!

useEffect()첫 번째 매개변수로 함수를 가짐. 이 함수가 호출되는 타이밍은, 렌더링 결과가 실제 DOM에 반영된 직후! 화면이 다 그려지고 나서, 그리고 컴포넌트가 사라지기 직전에 마지막에 호출됨! , 상태값이 변경되어서 다시 렌더링된 다음에 호출됨!

렌더링을 끝내고 어떤 작업을 하고 싶다면, 예를 들면 API 호출 같은 경우, useEffect()의 첫 번째 매개변수로 함수를 전달하면 됨! 그런데 그렇게만 하면, 상태값이 매번 변경될 때마다 불필요하게 함수가 호출될 수 있다! , 원하지 않는 상황에서도 함수가 호출될 수 있음!

이럴 경우에, useEffect()의 두 번째 매개변수로, *배열을 전달한다! 이건 무슨 뜻이냐면, 배열 안의 것이 변경될때만 이 함수를 실행하라는 뜻! (*이 배열을 의존성 배열이라고 한다.) , 의존성 배열의 값이 변경되는 경우에만 이 함수를 실행하라는 뜻!

useEffect()를 사용하는 이유 : API 호출! , 렌더링이 된 후에 API를 호출하는 목적! 그러면 렌더링이 다 완료되고 최초로 한번만 API를 호출하면 됨! 그럴 땐, 의존성 배열을 [] 이렇게 비워놓으면 된다!

, 상태값과 무관하게 렌더링 직후 딱 한번만 실행되는 작업은, [] 빈 배열을 전달하면 된다!

 

API 호출하기 : API의 비동기 통신을 위해서, useEffect()의 안에 fetch()를 이용!

(ex) useEffect(() => {

fetch('http://localhost:3001/days') (API의 경로를 적어줌. 이렇게 하면 Promise가 반환됨.)

.then(res => {

return res.json() (그러면, then을 이용! 여기서 reshttp의 응답이고, 실제 json은 아님. 그래서 json() 메서드를 사용하여 res.json()으로 쓴다. 그러면 json으로 변환되고, Promise가 반환된다!)

})

}, []);

'개발냥발 > FE (FrontEnd)👩🏻‍💻' 카테고리의 다른 글

Redux 익히기❗  (0) 2022.06.20
Typescript 익히기❗  (0) 2022.06.13
React 익히기❗  (0) 2022.05.30
Javascript 활용하기❗  (0) 2022.05.25
Javascript 익히기❗  (0) 2022.05.16