
SSR(Server Side Rendering)방식: 백에서 데이터를 프론트서버로 넘겨주고 그것을 바탕으로 브라우저에 넘겨준다.

CSR(Client Side Rendering) spa방식: 프론트서버에서 브라우저에 데이터를 제외한 정적 파일(html, JS, CSS, 이미지)들을 넘겨준다.
next 설치
npm i nextnpm i next@9@가 버전을 정해줌리액트와 리액트 돔 설치
npm i react react-dom 명령어로 설치pacakge.json파일에서 script의 dev: next 로 바꿔줌
next라는 명령어로 해야됨next는 import React from 'react';가 필요 없음(하지만 써도 상관없음)
초반 폴더구조는 이런식으로 생김 pages는 꼭 있어야됨(이안에 파일들이

라우팅(naver.com/news, naver.com/music 등 서버 뒤에 다른 주소로 들어오는 것들을 처리하는것)
localhost:3000/about 주소로 들어가고 싶으면 pages폴더에 about.js파일을 만들면 된다./profile/a profile/b이렇게 하나의 라우팅에 여러개의 하위구조가 있다면profile폴더를 만들고 그안에 a.js b.js를 만들면 됨[name].js로 만들면 페이지 이름을 동적으로 바꿀수도 있음
prop-types사용 : prop으로 넘겨주는 변수들을 한번 검사해주는 기능(뭘 검사하는지는 모르겠음)
npm i prop-types 설치
components(다른 이름도 가능하나 이 이름이 좋은듯)폴더를 하나 만들어서 레이아웃.js를 하나 만들고

이런식으로 설정함
그리고 상속받을 파일로 가서 
이런식으로 리액트 return 부분을 레이아웃으로 한번 감싸면 됨
import Link from 'next/link';이거를 추가하고 Link태그를 쓰면 됨npm i -D eslint eslint-plugin-import eslint-plugin-react eslint-plugin-react-hooks
.eslintrc 파일을 루트에 만들기{
"parserOptions": {
"ecmaVersion": 2020,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"env": {
"browser": true,
"node": true,
"es6": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"plugins": [
"import",
"react-hooks"
],
"rules": {
}
}
이내용 타입하면 됨. 지금은 recommended라서 엄격한편의 규칙은 아님
코드를 보고 엄격하게 하고 싶으면 엄격한 정도를 바꿀 수 있음
CORS: 브라우저-백엔드간 요청에 필요한 부분 도메인이 다르거나 포트가 다르면 신경써야하는부분
CSR, SSR에 관한 질문을 한번 다시 해주는듯. 아직 무슨말인지 모르겠어서 정리를 못하겠음
필요하면 다시 보기
코드 스플리팅: CSR일때 브라우져에 요청으로 프론트 서버에서 js와 html로 정보를 전송할 때 싱글 페이지다보니까 about만 필요해도 profile등 여러 페이지의 정보를 함께 돌려주는데 요청했던 about 페이지만 '분리'해서 전송해주는게 코드 스플리팅
몽고DB(NoSQL)을 쓰는경우
Ant Design: 쓸만한 CSS 프레임워크(made in China), 리액트, 뷰, 앵귤러 가능
아이콘들이 만들어져 있기 때문에 가져다 쓰기만 하면된다.
ant design, 머터리얼 ui, 시맨틱 ui, 부트스트랩이 있었는데 다 느낌이 비슷해서 다른 사이트들과 비슷해짐. 그래서 고객이 잇는 사이트들은 안쓰거나 쓰더라도 엄청 커스터마이징해서씀
styled-component: 컴포넌트에 이미 스타일이 입혀져 있는거, 컴포넌트에 CSS스타일을 입힐 수 있음
emotion.sh/docs/styled 위에 스타일드 컴포넌트랑 관련이 있음 위에꺼보다 최신임
npmtrends.com/에서 npm에서 인기수치를 볼 수 있음
antd와 styled-components 설치
npm i antd styled-components @ant-design/icons원래 css는 import를 못하는데 antd는 내부에 웹팩을 내장하고 있어서 import를 할 수 있음
import 'antd/dist/antd.css'를 page안에 js파일마다 넣어줘야 하는데 이렇게 공통적으로 넣어야하는것들을 page/_app.js를 만들어서 처리할 수 있다.
_app.js의 역할: pages폴더에 있는 index.js등이 한번 _app.js를 거쳐(Component 인자를 통해 들어옴) 나가게 된다.
import Head from 'next/head'를 한뒤

<Row gutter={8}>
<Col xs={24} md={6}>
왼쪽 메뉴
</Col>
<Col xs={24} md={12}>
{children}
</Col>
<Col xs={24} md={6}>
오른쪽 메뉴
</Col>
</Row>
- 여기서 gutter는 컬럼들간의 여백(padding)을 줌
<a href="https://www.naver.com" target="_blank" rel="noreferrer noopener">Naver</a>state를 사용해서 구현한다<Button type="primary" htmlType="submit" loading={false}>로그인</Button><Link href="/signup"><a><Button>회원가입</Button></a></Link>const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);이런식으로 사용<div style={{ marginTop: '10'}}> 컴포넌트 내에서 스타일적용 로그인폼이 따닥따닥 붙어있어서
<Input.Search enterButton style={{verticalAlign : 'middle'}}/>이런식으로 준적도 있음그런데 위에처럼 div태그에 오브젝트로 style을 넣으면 안된다고 한다.
{} === {}라고 치면 false라고 나오는데 리액트가 virtual DOM으로 어디가 달라졌는지 검사하다가 서로 다른 오브젝트라고 판단해서 다시 렌더링을 해버림(리액트의 경우 SPA로써 state가 이외의 곳은 변하지 않아야 하는게 핵심 장점)이때 styled-component를 사용함
import styled from 'styled-components';
const ButtonWrapper = styled,div`
margin-top: 10px;
`;
return (
<ButtonWrapper>
</ButtonWrapper>
)
import styled from 'styled-components';
const SearchInput = styled(Input.Search)`
vertical-align: middle;
`;
render(
<SearchInput enterButton/>
);
useMemo를 사용한다import {useMemo} from 'react'
const style = useMemo(() => ({marginTop: 10}), []);
<div style={style}>//이런식으로 디자인 원하는 곳에 넣어줌 이렇게 하면 값이 캐싱되어서 리렌더링이 일어나지 않음[]배열안이 바뀌지 않는 이상 다시 그리지 않음<Button> 태그에 `htmlType="submit"속성을 추가한다
Button태그를 감싸고 있는 Form태그에 onFinish={onSubmitForm}속성을 준다(여기서 onFinish는 e.preventDefault()가 자동으로 내장돼있음
여기에서 Form태그는 antd에서 불러온 컴포넌트인데 antd에서 불러온 태그는 e.preventDefault()가 다 내장되어 있어서 추가적으로 쓰면 안됨
여기에서 setIsloggedIn은 props로 넘겨서 LoginForm파일로 전달하고
const LoginForm = ({setIsLoggedIn}) => {... 이렇게 인자로 받아드림
const onSubmitForm = useCallback(() => {
console.log(id, password);
setIsLoggedIn(true);
}, [id, password]);
그리고 onSubmitForm함수에서 버튼이 눌리면 setIsLoggedIn이 true가 되게끔 만들어줌(로그인이 되었다는 신호를 주면서 가짜 로그인 구현)
이번에는 antd에 있는 card로 프로필을 구현


styled component 단점중 하나가 스타일이 적용된 컴포넌트가 기존 컴포넌트와 이름이 달라야 해서 변수명이 너무 많아진다.

'@ant-design/icons'에서 가져와 쓰면됨-LoginForm페이지에서 propTypes를 구현해줌
#### 이제 form에서 계속 중복되는 코드들을 줄여보자
form안에 아래와 같은 코드들이 엄청나게 중복되는데 hooks파일내에
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);
import { useState, useCallback } from 'react';
export default (initialValue = null) => {
const [value, setValue] = useState(initialValue);
const handler = useCallback((e) => {
setValue(e.target.value);
}, []);
return [value, handler];
}
const [id, setId] = useState('');
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);
이랬던 코드를
const [id, onChangeId] = useInput('');
이렇게 바꿀 수 있다.
passWordCheck: 패스워드확인이 패스워드랑 같은지 체크해줌
passWordError: 패스워드확인의 상태의 기본값을 false로 해줬다가 같으면 true로 해줌

비밀번호같이 체크해줘야 하는것들은 폼에서도 체크하지만 제출할때 한번 더 체크해주는게 좋다. 더 나아가 서버쪽에서도 체크해주면 좋음.