https://nextjs.org/docs/advanced-features/middleware

 

Advanced Features: Middleware (Beta) | Next.js

Learn how to use Middleware in Next.js to run code before a request is completed.

nextjs.org

 

 

import { NextFetchEvent, NextRequest, NextResponse } from "next/server";
import jwtDecode from "jwt-decode";
import CustomJwtPayload from "@/util/jwt/CustomJwtPayload";

// 리프레시 토큰 관리를 위한 미들웨어 제작
export function middleware(req: NextRequest, ev: NextFetchEvent) {
  // 스태틱파일 구분을 위한 정규표현식
  const PUBLIC_FILE = /\.(.*)$/;

  const { origin, pathname } = req.nextUrl;

  // 스태틱파일이 아니거나 로그인 관련 주소가 아니면 조건실행
  if (!PUBLIC_FILE.test(pathname) && !pathname.includes("/sign")) {
    console.log(req.nextUrl);

    const refreshToken = req.cookies["refresh_token"];
    const nowTimestamp = new Date().getTime();

    // 만료일 초기화
    let exp = -1;

    // 디코딩하여 만료일 체크
    try {
      exp = jwtDecode<CustomJwtPayload>(refreshToken).exp * 1000;
    } catch (e) {
      // 토큰이 디코딩 되지 않으면 로그인 페이지로 이동
      return NextResponse.redirect(`${origin}/sign/in`);
    }

    // 만료되었으면 로그인 페이지로 이동
    if (exp < nowTimestamp) {
      return NextResponse.redirect(`${origin}/sign/in`);
    }
  }
}

 

리액트에서

A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component.

에러가 발생할 경우 값변경이 제대로 되지 않는 경우가 있다

이 경우는 받아온 DTO나 state가 null일 경우이다

 

value={dto.name}

이렇게 들어간 코드를

value={dto.name || ''}

이런식으로  널처리를 해주면 해결된다.

'Web > ReactJS' 카테고리의 다른 글

NextJS 미들웨어  (0) 2022.04.20
NextJS Api 키 등 중요 변수 숨기기  (0) 2022.04.19
intellij 인텔리제이 eslint typescript prettier  (0) 2021.02.19
react js / next js quill 적용  (0) 2021.02.17
next js 시작하기  (0) 2021.02.15

 

타입 스크립트 버전으로 설치

 

next js (ts 버전) 설치

npx create-next-app 앱이름 --ts
# or
yarn create next-app 앱이름 --typescript

 

작동

해당 앱폴더로 이동하여

npm dev

#or

yarn dev

 

상대경로 -> 절대경로로 바꾸기

 

 

tsconfig.json 파일에 아래를 추가

{
  [기타내용],
  "compilerOptions": {
  	[기타내용],
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "./*"
      ]
    }
  },
  [기타내용],
 }

 

mobx 설치

yarn add mobx
또는
npm install --save mobx

 

 

설치 후 작동이 안될 경우

.next / node_modules / package-lock.json 을 지우고 

yarn install
또는
npm install

한 뒤 실행해본다

 

참고 사이트

velog.io/@soncl_97/Next.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0

 

📋Next.js 시작하기

next 시작하기

velog.io

 

noogoonaa.tistory.com/65

 

next.js 와 typescript를 끼얹어 보자

최근 프론트엔드 생태계는 React, Vue, Angular 이 삼대장이 주류를 이루고 최근 Typescript 또한 각광 받고 있습니다. 저 또한 프론트엔드쪽 일을 자주하는 개발자로써 자연스럽게 이 삼대장 중 React를

noogoonaa.tistory.com

 

sumini.dev/guide/003-react-typescript-absolute-import/

 

React+Typescript 절대경로 import 설정하기

상대 경로를 사용하면 package 구조가 깊어질 수록 파일 간의 관계를 파악하기 어려워지고, 파일 이동시 귀찮게 경로를 수정해야 합니다. 예시 절대 경로를 사용하면 depth와 상관 없이 일관되고 짧

sumini.dev

 

chanyeong.com/blog/post/35

 

타입스크립트에서 절대경로(alias) 사용하기! - chanyeong

개요 요즘 부스트캠프에서 프로젝트를 진행하고 있는데 서버를 타입스크립트로 구현하고 있다. 그런데 설계 과정에서 폴더 및 파일이 나눠지고 import, export하는 과정에서 상대경로를 사용하다

chanyeong.com

 

velog.io/@sji7532/Next-Next-js%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-SSR-CSR-%EA%B5%AC%ED%98%84

 

[Next] Next js를 사용하여 SSR, CSR 구현

Next.js를 사용하면 React에서도 CSR, SSR을 혼합하여 빠른 성능을 구현할 수 있다.

velog.io

 

mobx.js.org/installation.html

 

Installation · MobX

mobx.js.org

 

'Web > ReactJS' 카테고리의 다른 글

intellij 인텔리제이 eslint typescript prettier  (0) 2021.02.19
react js / next js quill 적용  (0) 2021.02.17
react // 리덕스 실습  (0) 2020.08.14
리액트 // redux 리덕스  (0) 2020.08.12
리액트 // useEffect 연습  (0) 2020.08.05

 

참고

https://github.com/codingspecialist/react-redux-example

 

codingspecialist/react-redux-example

Contribute to codingspecialist/react-redux-example development by creating an account on GitHub.

github.com

 

현재 프로젝트

https://github.com/jaybon1/react/tree/master/bitc_react/react-redux/redux-app

 

jaybon1/react

Contribute to jaybon1/react development by creating an account on GitHub.

github.com

 

esrint

prettier

 

 

--

 

 

프리티어 세팅파일 생성

--

 

 

깃헙에서 붙여넣기

프리티어 세팅

--

 

 

아래 것들을 삭제

--

 

 

--

 

 

구조

--

 

 

store를 만든다
1. 리듀서를 호출할 액션명을 적는다
2. state를 안쓰는 컴포넌트가 있을 수 있기 때문에 해당 컴포넌트용 state를 만들어준다
3. 리듀서 - state와 action을 받아서 액션명으로 함수를 실행한다.
리듀서는 내부적으로 setState가 내장되어 있어서 값만 넘기면 된다

--

 

 

리덕스를 설치한다

--

 

 

1. store로 만들어둔 리듀서 / Provider / createStore 를 가져온다
2. store.js파일로 진짜 스토어를 만든다
3. App컴포넌트를 Provider로 감싸고 store를 넘겨준다

--

 

 

--

 

 

리덕스를 통해서 함수를 받을 컴포넌트

--

 

 

1. 리덕스에서 connect 함수를 가져온다
2. 넘길 액션을 만든다 / 액션을 실행하면 onAdd 가 실행되고, dispatch가 내부적으로 리덕스 안에 있는 INCREMENT 로직을 실행한다
3. connect의 첫번째에는 state, 두번째에는 action / 이것을 담은 AddNumber 컴포넌트를 생성한다

--

 

 

리덕스를 이용하려면 connect를 export하는 Container를 사용한다
(리덕스를 이용하지 않으려면 AddNumber를 사용)

App.js에서 props를 넘기지 않는 다는 것을 보여주기 위한 파일.

--

 

 

리덕스를 통해서 state를 받을 컴포넌트

--

 

 

1. 리덕스에서 connect 함수를 가져온다
2. 넘길 스테이트를 만든다
3. connect의 첫번째에는 state, 두번째에는 action / 이것을 담은 DisplayNumber 컴포넌트를 생성한다

--

 

 

리덕스를 이용하려면 connect를 export하는 Container를 사용한다
(리덕스를 이용하지 않으려면 DisplayNumber를 사용)

App.js에서 props를 넘기지 않는 다는 것을 보여주기 위한 파일.

--

 

 

테스트

--

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

react js / next js quill 적용  (0) 2021.02.17
next js 시작하기  (0) 2021.02.15
리액트 // redux 리덕스  (0) 2020.08.12
리액트 // useEffect 연습  (0) 2020.08.05
리액트 // 스테이트를 훅스로 바꾸기  (0) 2020.08.05

 

자바는 타 클래스의 함수를 사용하기 위해서는 객체(레퍼런스)를 넘겨야 한다

자바스크립트(리액트)에서는 함수를 넘길 수 있다 (1급객체)

그런데 객체를 여러 단계로 넘기면 복잡해진다

객체지향에서 제일 어려운 것이 오브젝트를 넘기는 것이다

그러한 점을 해결하기위해 스프링에서는 IOC를 사용한다

스프링은 IOC공간에서 클래스타입으로 객체를 찾아낸다 -> 객체 안의 함수 모두를 가져올 수 있다

자바스크립트에서는 store에서 String값으로 함수를 찾아낸다(Action명) -> 

 

다른 화면에서 건드릴 것들을 예상해서 액션명을 미리 만들어둔다
아래는 store 공간에 만든 액션명들이다

[이벤트]를 등록하는데 다른화면에서 건드릴 것들 

최상위화면(A)에서 store를 만들고 자식들에게 props로 넘긴다

store(스프링의 IOC역할)
액션명 : A.change - (change()함수의 레퍼런스 + 해당화면의 state를 가진다)
액션명 : A.insert - (insert()함수의 레퍼런스 + 해당화면의 state를 가진다)

(액션명과 state 값을 가진 것을 리듀스 라고 한다)

 

다른 클래스가 store를 구독하면 접근을 할 수 있게 된다 (액션명을 호출하면 해당 함수가 실행된다)

레퍼런스를 실행하면 state값이 바뀐다

 

// A.js 화면 이벤트가 3개 있다
// onChange, onInsert, onDelete

// A의 자식 중에 B -> C -> D
// D가 A의 onChange를 건들이고 싶을 경우 기본은 props로 단계를 타고 함수를 전해줘야한다
// store는 모든 함수 레퍼런스를 저장하고 찾을 때 액션명으로 찾게 한다

// 1번 - 액션 이름 하나 생성
const ACHANGE = "a/CHANGE"; // 액션이름이 충돌 나지 않게 하기 위해서 a/를 붙여준다
const AINSERT = "a/INSERT";
const ADELETE = "a/DELETE";

// 앞에 파일명을 붙이고 뒤에 함수명을 붙여서 중복을 막는다
const DDELETE = "D/DELETE";

// 2번 - 액션을 함수로 호출할 수 있게 해야 함
const aChange = () => ({
  type: ACHANGE,
});

// const aChange = () => ({ // 여러줄이라도 소괄호로 묶어주면 한줄로 인식한다
//     type: ACHANGE
// });

const aInsert = () => ({
  type: AINSERT,
});

const aDelete = () => ({
  type: ADELETE,
});

const initialState = {
  number: 0,
};

// 3번 - 리듀서 만들기( 리듀서가 알고 있어야 하는 값 state, action)
// 프로젝트에 store는 하나로 관리한다
function aREducer(state = initialState, action) {
  switch (action.type) {
    case aChange:
      return {
        number: state.number + 10,
      };
    case aInsert:
      return {
        number: state.number + 1,
      };
    case aDelete:
      return {
        number: state.number - 10,
      };
  }
}

// 함수들을 익스포트
export { aInsert };
export { aChange };
export { aDelete };

// 리듀서를 익스포트
export default aREducer;

 

STORE 예시

리듀서(state, 액션이름){  }

요청하고 싶은 곳(D)에서 state와 aDelete를 store에 날리면 리듀서가 해당 레퍼런스를 이용해서 함수를 실행한다

state를 같이 날리는 이유는 D의 화면을 변경 하고 싶기 때문이다

 

(액션명과 함수 레퍼런스를 연결은 나중에)

 

리듀서에 액션이 많아지면 구분하기 힘들기 때문에 리듀서를 여러개 만들어서 컴바인 해서 합친다

 

 

 

 

 

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

next js 시작하기  (0) 2021.02.15
react // 리덕스 실습  (0) 2020.08.14
리액트 // useEffect 연습  (0) 2020.08.05
리액트 // 스테이트를 훅스로 바꾸기  (0) 2020.08.05
리액트 자동완성 스니펫  (0) 2020.08.04

+ Recent posts