728x90
module.exports = {
    name: 'wordrelay-setting', // 그냥 이름
    mode: 'development', // 실 서비스에서는: production
    devtool: 'eval',  // 빠르게 하겠다는 의미
    resolve: {
        extensions: ['.js', '.jsx']
    },
    
    entry: {
        app: ['./client'],
    }, // 입력
    
    module: {
       rules: [{
          test: /\.jsx$/,  // 정규표현식이다. 의미는 js랑 jsx파일에 rule을 적용하겠다.
           loader: 'babel-loader', // js,jsx에 바벨을 적용해서 최신이나 실험적인 문법을 옛날브라우저에서도 
                                   // 호환되는 문법으로 바꿔주겠다는 의미
           options: {
             presets: ['@babel/preset-env', '@babel/preset-react'], // 아까 설치한 preset 모듈들을 주면 된다.
             plugins: ['@babel/plugin-proposal-class-properties'],
           },
       }],
    }, // @babel/preset-env등을 설치 후 이것을 추가해주는데, 이것의 역할은 "entry 라는 
       // 파일을 읽고 거기에 모듈을 적용한 후 output에 뺀다"는 의미이다.
    
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'app.js'
    }, // 출력

    // client.jsx, WordRelay.jsx를 app.js에 합쳐줘야 하는데, 
    // client.jsx에서 이미 WordRelay.jsx를 불러오고 있어서 client.jsx만 불러오면 app.js에 합쳐진다.

    // 📎 resolve에 확장자를 추가해주면 entry에 확장자를 적어줄 
    //    필요가 없이 웹팩에서 알아서 resolve에 리스트 되어있는 확장자 범위 안에서 찾아준다.

    // 실행 방법: npx webpack 을 해주면 dist/app.js에 코드가 합쳐진다.
};

※ module에 options에 presets의 또다른 표현법

module: {
      rules: [{
          ...
              presets: [
                  ['@babel/preset-env', {
                    targets:{
                  🔈   browsers: ['last 2 chrome versions'], // 최신 브라우저만 지원할 수 있게 한다.
                    },
                  }],
                  '@babel/preset-react'],
              plugins: ['@babel/plugin-proposal-class-properties'],
          }
      }],
    },
    
 // @babel/preset-env는 자동으로 옛날브라우저들을 호환시켜주는 것인데 이것을 이렇게 조금 더 구체적으로 설정해줄 수 있다.

🔈 밑에와 같은 옵션들이 들어갈 수 있다.

  • > 5%: browsers versions selected by global usage statistics. >=, < and <= work too.
  • > 5% in US: uses USA usage statistics. It accepts two-letter country code.
  • > 5% in alt-AS: uses Asia region usage statistics. List of all region codes can be found at caniuse-lite/data/regions.
  • > 5% in my stats: uses custom usage data.
  • > 5% in browserslist-config-mycompany stats: uses custom usage data from browserslist-config-mycompany/browserslist-stats.json.

https://github.com/browserslist/browserslist#queries


※ 추가적으로 뭔가 하고싶은 것들이 있다면 plugins을 붙인다. (확장프로그램 개념)

module: {
      rules: [{
          test: /\.jsx$/,
          loader: '...',
          options: {
              presets: ['...']
              plugins: ['...'],
          },
      }],
    },
  🔈plugins: [
        new webpack.LoaderOptionsPlugin({ debug: true }),
    ],
    output: {
        path: ...,
        filename: '...'
    },

 

 

 

@babel/preset-env 

브라우저에 맞게 알아서 최신문법을 옛날문법으로 바꿔준다.

 

@babel/preset-react

js를 지원하게 해준다.

 

babel-loader

바벨이랑 웹팩을 연결해준다.

'프레임워크 > React' 카테고리의 다른 글

[React] map 다른 파일로 빼기  (0) 2021.07.22
[React] Map 사용법  (0) 2021.07.22
[React] 라우트 파라메터  (0) 2021.06.30
[React] gravatar  (0) 2021.06.28
[React] 쿠키  (0) 2021.06.27
728x90
바로 라우트 파라메터의 예를 들어보면 다음과 같다.

 

<Route path="/workspace/:workspace" component={Workspace} />

 

:workspace 이부분은 자유롭게 값을 바꿀 수 있다.

 


만약

 

<Route path="/workspace/space” component={Workspace} />
<Route path="/workspace/:workspace" component={Workspace} />

 

이렇게 같이 있으면 반드시 파라메터 아닌것을 밑에 써줘야한다. 왜냐하면 모든값을 받을 수 있는 파라메터이기 때문에 파라메터만 인식하기 때문이다.

 

저런 parameters를 가져올 때는 useParams 훅을 사용한다. 

 

const { workspace } = useParams<{ workspace: string; }>();

 

/api/workspaces/${workspace}/channels

 

 

이러한 식으로 가져올 있다.

'프레임워크 > React' 카테고리의 다른 글

[React] Map 사용법  (0) 2021.07.22
[React] webpack 설정들의 의미  (0) 2021.07.09
[React] gravatar  (0) 2021.06.28
[React] 쿠키  (0) 2021.06.27
[React] Revalidate vs mutate 그리고 Optimistic UI vs Pessimistic UI  (0) 2021.06.27
728x90

💡 임의의 이미지를 넣어주는 기능을 한다.

 

 

설치
npm i gravatar @types/gravatar

 

 

사용 예
<ProfileImg src={gravatar.url(data.email,{ s:'28px', d:'retro'})} alt={data.nickname} />

 

 

※ s = 사이즈    d = default image

 

 

다음은 d에 들어갈 수 있는 목록들 이다.

728x90
프론트앤드 입장에서 내가 로그인 했다는 사실을 어떻게 알 것인가?

 

보통 로그인이 성공하면 정보를 서버에서 갖다준다. 정보가 밑의 그림과 같다. 로그인을 하면 데이터를 프론트에서 갖고있다가 로그아웃이 되면 버린다.

 

이 데이터를 저장하려면 Redux가 필요하다. 이 때 state에서 저장하면 되지 않냐는 질문이 나올 수 있다. 

 

그러나 “state에서는 하나의 component에서만(로그인 컴포넌트에서만) 저장이 된다.” 이렇게 되면 다른 컴포넌트에서 로그인 되었다는 사실을 모르게 되어서 정상적인 웹페이지가 안된다. 

 

그래서 컴포넌트를 넘나들면서 로그인되었다는 데이터를 갖고 있어야 한다. 이것을 하기 위해서 Redux가 필요하지만, 대안으로 context api, swr이 있다.

 

 

※ 쿠키는 항상 백앤드에서 생성을 해준다. 그래서 프론트앤드가 기억을 하게끔 만들어주고 프론트앤드에서 한번 기억한 쿠키를 요청마다 백앤드로 보내준다.

'프레임워크 > React' 카테고리의 다른 글

[React] 라우트 파라메터  (0) 2021.06.30
[React] gravatar  (0) 2021.06.28
[React] Revalidate vs mutate 그리고 Optimistic UI vs Pessimistic UI  (0) 2021.06.27
[React] a 와 Link의 차이  (0) 2021.06.26
[React] children  (0) 2021.06.26
728x90

Revalidate

 

서버로 요청을 보내서 데이터를 다시 가져오는것

 

예)

const {data, error, revalidate} = useSWR('http://localhost:3095/api/users', fetcher);

 

axios
    .post(
      …
    )
    .then(() => {
        revalidate();
    })
    .catch((error) => {
        …
    });

 

💡 revalidate 서버에 요청을 보내서 데이터를 가져오는 것이다. 그리고 data 정보를 넣는다. 컴포넌트가 실행 때는 data false 되면서 null 된다. 데이터 수정 후 바로 서버에 revalidate 요청을 보내면 된다.

 


Mutate

서버에 요청을 안보내고 데이터를 수정하는 것

 

예)

const {data, error, mutate} = useSWR('http://localhost:3095/api/users', fetcher);

 

 

axios
    .post(
      …
    )
    .then((response :AxiosResponse<any>) => {
        mutate(response.data, false);
    })
    .catch((error) => {
        …
    });

 

 

로그인을 하면 응답이 오고, 그 응답의 데이터인 response.data에 내 정보가 들어있다. 

 

이 정보를 mutate(response.data, false) data에 넣어버린다. 이렇게 되면 요청을 안보내도 된다. 

 

두 번째 매개변수에 false는 무엇을 의미하냐면 mutate가 데이터를 수정했다가 나중에는 데이터가 정말로 이렇게 바뀐게 맞는지 서버에 점검하는데, 

 

그것이 shouldRevalidate라는 것이다. default값이 true인데 false로 설정해두면 서버요청을 안한다.


Optimistic UI  -  페이스북을 예로 들면 좋아요 눌렀을 때 바로 좋아요가 반영되어 보이는 기능
  • 먼저 성공한다고 생각하고 먼저 수정한 데이터와 서버에 있는 데이터가 일치하는지 점검을 하는 것 (만약 실패했으면 서버에 있는 데이터 그대로 반영) 

※ shouldRevalidate: true 여야지만 Optimistic UI가 가능하다.

 

 

Pessimistic UI
  • 먼저 실패한다고 생각하고 무조건 서버 요청을 보낸다음 요청 성공을 했으면 데이터 수정을 하는 것

※ 아무 설정 없이 기본적으로 Pessimistic UI 이다.


 

'프레임워크 > React' 카테고리의 다른 글

[React] gravatar  (0) 2021.06.28
[React] 쿠키  (0) 2021.06.27
[React] a 와 Link의 차이  (0) 2021.06.26
[React] children  (0) 2021.06.26
[React] SWR 설정  (0) 2021.06.26
728x90

a
<a href="/login">로그인 하러가기</a>

 📌  새로고침 되어버린다. 화면 깜빡임 발생함.


Link
<Link to="/login">로그인 하러가기</Link>

 📌   화면만 바꿔주므로 싱글페이지 어플리케이션에 용이하므로 대체방안으로 사용할  있다. 화면 깜빡임 발생 하지 않음.


 

'프레임워크 > React' 카테고리의 다른 글

[React] 쿠키  (0) 2021.06.27
[React] Revalidate vs mutate 그리고 Optimistic UI vs Pessimistic UI  (0) 2021.06.27
[React] children  (0) 2021.06.26
[React] SWR 설정  (0) 2021.06.26
[React] SWR  (0) 2021.06.25
728x90
const Workspace: FC = ({children}) => {

	...
    
    return (
        <div>
            <button onClick={onLogout}>로그아웃</button>
            {children}
        </div>
    )
}

 

💡 {children} 밑에처럼 Workspace 컴포넌트로 감싸면 안에 있는 내용들이 {children} 된다

 


 

const Channel = () => {
    return (
        <Workspace>
            <div>children 안에 들어간다</div>;
        </Workspace>
    );
};

 

리엑트에 있는 FC라는 타입 안에 children 들어있다. 만약 children 쓰지 않는 component 있으면 VFC 사용하면된다.

728x90

📎  swr 잘못 사용하면 패킷들을 마구마구 백앤드로 보내서 셀프 DDOS공격을 하는셈이 된다. 이를 막기 위해서 설정을 있다.


내가 원할 때 swr 호출하기

 

revalidate 함수

 

               ex) const { data, error, revalidate } = useSWR('http://localhost:3095/api/users', fetcher);

axios
    .post(
      ...
    )
    .then(() => {
        revalidate();
    })
    .catch((error) => {
        ...
    });

 

성공 했을 revalidate 호출 해주면 fetcher 실행된다. 원래 정보가 들어있는 data revalidate 실행되면 false 된다.


swr 호출 주기를 늘리기

dedupingInterval
ex) dedupingInterval = 2000     캐시에 저장한 뒤로부터는 2초동안 에는 캐시에서 가져오고, 2초가 지나면 서버에 요청 한번씩 보내기


(컴포넌트가 실행되면 요청을 보내는데 아무리 많은 컴포넌트들이 실행되어도 2초동안에는 서버에는 딱 한번만 요청보내고 나머지들은 첫번째 요청이 성공한것에 대한 데이터를 그대로 가져오겠다는 뜻이다.)

 

focusThrottleInterval
ex) focusThrottleInterval = 5000     revalidate 함수를 5초에 한번씩 제한걸어주기

 

loadingTimeout
ex) loadingTimeout = 3000     요청을 보냈는데 3초가 넘으면 동작함

 

errorRetryInterval
ex) errorRetryInterval = 5000     서버에 요청을 보냈는데 에러가 나면 5초를 기다렸다가 재요청을 보내기

 

errorRetryCount   
최대 몇번까지 재요청이 가능한지 제한하기

'프레임워크 > React' 카테고리의 다른 글

[React] a 와 Link의 차이  (0) 2021.06.26
[React] children  (0) 2021.06.26
[React] SWR  (0) 2021.06.25
[React] CORS로 인한 proxy 설정 그리고 axios요청보내기  (0) 2021.06.25
[React] useCallback  (0) 2021.06.24
728x90

💡 swr은 요청을 보내서 받아온 데이터를 저장해둔다. post를 쓰지못하는 건아니지만 보통은 get 요청에 대한 데이터를 swr이 저장을 해준다.

이 때, 로그인을 할 때는 post요청이고 데이터를 돌려주는데 나는 swr을 쓰고 싶은 상황이다. 그러나 swr은 get요청만 되는데 어떻게 할까?

답: get 요청을 한번 더 보내면 된다. 내가 로그인을 했으니 내 정보갖다 줘라는요청을 서버에 보내주는 것이다.

 

🔨  설치 및 사용
터미널에 "npm i swr"

import useSWR from "swr";

 

📎  보통 형식은 이렇다
const {data, error} = useSWR(‘주소’, {config: withCredentials: true,}, 처리방식);

useSWR은 주소를 처리방식으로 넘겨준다. 이때주소는 처리방식에 매개변수로 넘어간다.
ex) const {data, error} = useSWR('http://localhost:3095/api/users', fetcher);


위의 예시의 fetcher를 따로 구현을 해보면 아래와 같다

const fetcher = (url) = axios.get(url, {config: withCredentials: true,}).then((response :AxiosResponse<any>) => response.data);


매개변수(url)로 주소가 넘어오면 그 주소로 axios.get요청을 보낸다. 그것에 대한 응답에서 데이터를 꺼내서 돌려준다. 그리고 그 데이터는 const{data, error}에 data에 들어가고 error는 서버에러 등이들어간다.


const fetcher = (url) = axios.get(url, {config: withCredentials: true,}).then((response :AxiosResponse<any>) => response);이면 const{response} 로 해야 한다.

※ 그리고 withCredentials: true를 해주어야 쿠키요청 응답이가능해진다. (백앤드와프런트 앤드의주소가 다를 때 필수 설정)


최종적으로


 

로그인이 되었을 때의 화면이고 밑의 정보는 data에 담겨있다.
쿠키가 생겼고
응답 헤더에 쿠키와 함께 오면서 로그인 되었다는 것을 사이트가 알 수 있게 한다.

 


장점


  • 로딩 상태도 알 수 있다. 만약 데이터가 존재하지 않으면 로딩 중이라는 뜻이다.
  • 다른 탭에 갔다가 오면 자동으로 요청을 보내서 항상 최신 화면으로 유지시켜준다.

 

728x90
제로초 블로그[웹사이트]. (2021.06.25). 
URL: https://www.zerocho.com/category/HTTP/post/5b4c4e3efc5052001b4f519b

 

Access-Control-Allow-Origin

프론트엔드 개발자들에게 악명 높은 헤더입니다. 요청을 보내는 프론트 주소와 받는 백엔드 주소가 다르면 CORS 에러가 발생하는데요. 이 때 서버에서 응답 메시지 Access-Control-Allow-Origin 헤더에 프론트 주소를 적어주어야 에러가 나지 않습니다.

Access-Control-Allow-Origin: www.zerocho.com
Access-Control-Allow-Origin: *

프로토콜, 서브도메인, 도메인, 포트 중 하나만 달라도 CORS 에러가 나서 슬픕니다. 만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용하면 됩니다. 단 그만큼 보안이 취약해집니다.

유사한 헤더로 Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Headers 등이 있습니다. Request랑 Allow에서 Method 단수 복수 주의하세요!

CORS 요청 시에는 미리 OPTIONS 주소로 서버가 CORS를 허용하는지 물어봅니다. 이 때 Access-Control-Request-Method로 실제로 보내고자 하는 메서드를 알리고, Access-Control-Request-Headers로 실제로 보내고자 하는 헤더들을 알립니다. Allow 친구들은 Request에 대응되는 애들로, 서버가 허용하는 메서드와 헤더를 응답하는데 사용됩니다. Request랑 Allow가 일치하면 CORS 요청이 이루어지는 것이죠.

Allow

Allow 헤더는 Access-Control-Allow-Methods랑 비슷하지만, CORS 요청 외에도 적용된다는 데에 차이가 있습니다. 즉 GET www.zerocho.com은 되고, POST www.zerocho.com은 허용하지 않는 경우, 405 Method Not Allowed 에러를 응답하면서 헤더로

Allow: GET

를 같이 보내면 됩니다. GET 요청만 받겠다는 뜻입니다.

Content-Disposition

응답 본문을 브라우저가 어떻게 표시해야 할지 알려주는 헤더입니다. inline인 경우 웹페이지 화면에 표시되고, attachment인 경우 다운로드됩니다.

Content-Disposition: inline
Content-Disposition: attachment; filename='filename.csv'

다운로드되길 원하는 파일은 attachment로 값을 설정하고, filename 옵션으로 파일명까지 지정해줄 수 있습니다. 파일용 서버인 경우 이 태그를 자주 사용하게 될 것입니다.

Location

300번대 응답이나 201 Created 응답일 때 어느 페이지로 이동할지를 알려주는 헤더입니다.

HTTP/1.1 302 Found
Location: /

이런 응답이 왔다면 브라우저는 / 주소로 리다이렉트합니다.

Content-Security-Policy

다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 여기에 명시할 수 있습니다. 하나의 웹 페이지는 다양한 외부 소스들을 불러옵니다. 이미지도 불러오고 script 태그로 자바스크립트 파일들도 불러옵니다. 폰트나 스타일, 아이프레임도 불러오고요. 하지만 해커들에 의해 원하지 않는 파일을 불러오게 될 수도 있습니다. 악성 코드가 담겨져있는 파일이라면 큰 일이 나겠죠. XSS 공격 같은 것이 하나의 예시입니다. 이럴 때 Content-Security-Policy로 허용할 외부 소스만 지정할 수 있습니다.

Content-Security-Policy: default-src 'self'
Content-Security-Policy: default-src https:
Content-Security-Policy: default-src 'none'

self로 지정하면 자신의 도메인의 파일들만 가져올 수 있습니다. www.zerocho.com에서는 www.zerocho.com/logo.jpg를 가져올 수 있지만, www.nero.com/logo.jpg는 못 가져오는 것이죠. https:로 지정하면 https를 통해서만 파일을 가져올 수 있게 됩니다. 'none'으로 지정하면 가져올 수 없습니다.

default-src는 모든 외부 소스에 대해 적용되는 것이고요. 각각 따로 지정할 수도 있습니다. 두 개나 세 개 정도만 추려서 지정할 수도 있고요.

Content-Security-Policy: font-src 'self'; script-src https://www.zerocho.com 'unsafe-inline'; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'

font-src, script-src, img-src, style-src, object-src 등이 있고, 소스 옵션으로는 도메인이나, https:, 'unsafe-inline'(인라인 태그 허용), 'unsafe-eval'(eval 함수 허용) 등이 있습니다. 옵션들이 매우 많으므로 자세한 내용은 여기 서 참고하세요!

이 외에도 다양한 응답 헤더들이 있으나, 자주 보이는 것만 추려보았습니다. 혹시나 궁금한 다른 헤더가 있다면 댓글을 남겨주세요. 다음 시간에는 쿠키&캐시 헤더들을 알아보겠습니다! Cache-Control, Cookie, Set-Cookie, Expires, ETag 등의 헤더입니다.

'프레임워크 > Node.js' 카테고리의 다른 글

express-session  (0) 2021.03.26

+ Recent posts