제스트(Jest)는 자바스크립트 테스트 프레임워크로, 주로 리액트 애플리케이션의 테스트에 사용됩니다. 

 

Meta에서 개발하였으며, 단위 테스트(unit testing) 및 통합 테스트(integration testing)를 쉽게 작성할 수 있도록 설계되었습니다

 

특징

 

  • 스냅샷 테스트: 컴포넌트의 UI가 예상대로 렌더링되는지 확인하기 위해 스냅샷을 찍어 비교하는 기능을 제공합니다.
  • 모듈화: 다양한 모듈을 쉽게 모킹(mocking)하여 테스트할 수 있어, 실제 의존성을 제거하고 독립적으로 테스트할 수 있습니다.
  • 빠른 실행: 변경된 파일만 테스트하여 실행 속도를 높이는 "빠른 테스트" 기능을 제공합니다.
  • 비동기 테스트: 비동기 코드를 간편하게 테스트할 수 있는 API를 제공하여, Promises와 async/await을 쉽게 사용할 수 있습니다.

 

그만 알아보고 정리해야겠다.

 

주소 연결에 따른 아이콘 또는 nav 또는 tab이 바뀌는 경우 사용하는

useSelectedLayoutSegment 라는 넥스트에서 지원해주는 훅이 있습니다.

 

기존에 활성화된 nav나 tab을 만들기 위해서는 usePathname 도 있었지만 별도의 처리가 필요했습니다.

 

1. useSelectedLayoutSegment, 2. usePathname

 

 

useSelectedLayoutSegment를 사용시 별도 처리없이 간단하게 만들 수 있습니다.

주소가 바뀔경우 useSeletedLayoutSegment는 해당 패이지가 존재하는 폴더에 이름을 전달해줍니다.

 

 

localhost:3000/home 의 경우

log에는 home가 찍힙니다.

(아래는 추후 설명할 useSelectedLayoutSegments 입니다)

 

 


useSelectedLayoutSegments 에 대해서

useSelectedLayoutSegment는 최상위 폴더만 출력했다면

useSelectedLayoutSegment는 해당 경로까지의 폴더를 감지하여 배열의 형태로 반환해줍니다.

 

 

위와 같은 구조에서 /test/page 로 이동시 

 

useSelectedLayoutSegment 는 test/page 경로의 최상위 폴더인 test가 출력되었으며,

useSelectedLayoutSegments 는 ['test','page'] 가 출력됩니다. 해당 경로의 폴더 전체가 배열로 반환되었습니다.

 

자식 폴더까지 감지하고자 한다면 'useSelectedLayoutSegments' 를 사용해야 한다는걸 알 수 있습니다.

 


이제 useSelectedLayoutSegment가 어떤 값을 반환하는지 알았기 때문에 간단하게 만들 수 있을 것 같습니다!.

 

예를 들자면   {segment === '경로' ? ( 해당 경로일 경우의 아이콘 및 컴포넌트) : (아닐경우의 아이콘 및 컴포넌트)} 처럼

 

삼항 연산자를 사용하는 방식이라던지..?

 

 

'React > React Framework' 카테고리의 다른 글

Jest에 대해 알아보자  (0) 2024.09.30
[Next.js] 태그  (1) 2024.01.20
[Next.js] Next App Router에 대해  (1) 2024.01.18
[Next.js] router와 slug + 기본경로설정  (1) 2023.09.07
[Next.js] Images에 대해서  (1) 2023.09.07

Image 컴포넌트

 - Next.js에서 이미지를 로딩하는데 사용되는 img 태그 대신 Image 컴포넌트를 사용할 수 있습니다.

 Image 컴포넌트는 이미지 최적화와 성능 향상을 위한 여러 기능을 제공합니다.

 

Image 컴포넌트에 대한 정리글 : https://j-plum.tistory.com/120

 

[Next.js] Images에 대해서

해당 내용은 npx create-next-app --example image-component react-image-app 를 이용해 작성하였습니다. 1. Next.js의 Image 컴포넌트 Image 컴포넌트에서 제공하는 기능 3가지 lazy loading - 화면 밖의 이미지는 로딩을

j-plum.tistory.com

 

공식문서 : https://nextjs.org/docs/pages/building-your-application/optimizing/images

 

Optimizing: Images | Next.js

Optimize your images with the built-in `next/image` component.

nextjs.org

 

 

Link 컴포넌트

 - Next.js에서는 페이지 이동을 하기 위해 a 태그 대신 Link  컴포넌트를 사용할 수 있습니다.

 Link 컴포넌트는 페이지 이동 시 페이지 새로고침 없이 전환합니다.

 

 

 

------------------------------------------------------------------

계속 업데이트 예정

Next란

- React 위에서 돌아가는 프레임 워크입니다.

- React는 화면만 그리는 라이브러리 라고 한다면, Next에서는 데이터, 라우팅, 캐싱, 스타일링, 최적화, 배포

 다양한 기능을 Next라는 프레임워크 하나로 만들 수 있습니다.

- 백엔드 서버가 없을때 Next 하나만으로 서버를 실행할 수는 있습니다 (권장하지 않음)

 

Pages Router 와 App Router의 차이

 - App Router는 디렉토리 관련 변경사항이 많아졌습니다. (추후정리)

 - Pages Router 는 레이아웃 기능이 없어서 아쉬웠지만 App Router는 레이아웃 기능이 있습니다.

 - App Router 는 미들웨어로 페이지별 권한 체크가 가능해졌습니다.

 - React18을 사용하며, 서버 컴포넌트를 사용합니다.

 - Pages Router에서는 직접 캐싱을 구현해야 했지만, App Router를 사용시 캐싱처리를 해줍니다. (추후 정리)

 

 

서버 컴포넌트

 - Next 서버에서 리엑트를 미리 랜더링해서 완성된 컴포넌트가 넘어옵니다

  그에 따라 js용량 등도 줄어들어 여러모로 이점이 많은 기능입니다.

 - 사용자의 브라우저에서 하던 일을 Next 서버에서 혼자 다 처리해 서버의 부담이 늘어남

 - Pages Router에서는 직접 캐싱을 구현해야 했지만, App Router를 사용시 캐싱을 처리를 해줍니다.

기본적으로 Next.js의 Router는 file system 기반입니다. pages/ 또는 src/pages/ 가 기준이 됩니다.

 

 

pages 폴더가 있다면 src/pages는 무시합니다.

pages 폴더를 이용하겠습니다.

 

기본적으로 Next.js의 Router는 file system 기반이기 때문에 설명은 생략하고 slug로 넘어가겠습니다.

 

Slug에 대해서

 

1. pages/category/[slug].js  => /category/:slug  (ex. /category/items)

[slug].js 파일

파일 시스템 형식의 라우터이지만

파일명에 [] 대괄호 사용시 어떠한 글자, 숫자가 와도 사용이 가능합니다

위 사진의 경우 [slug] 부분에 games가 들어갔습니다.

 


2. pages/[username]/myinfo.js => /:username/info (ex. /jplum/myinfo)

1번과 다르게 폴더 이름에 []대괄호를 사용했습니다.

 

* 추가적으로 알 수 있는건 useRouter의 query의 값은 [] 대괄호의 값이 파라미터로 넘어온다는걸 알 수 있습니다.


번외 ) 이건 어떤 결과가 나올까요?

1번의 경우 pages/category/[slug].js 의 형식이였으나 . 2번은 pages/[username]/myinfo의 형식입니다. 

그렇다면 pages/category/myinfo의 경우엔 어떻게 될까요

category의 [slug] 부분이 바뀌어 Category myinfo가 보일까요?
[username]부분이 category가 되어 userName category 가?

 

 

category/[slug].js 로 이동했습니다.

 

category의 [slug].js 파일로 이동했습니다.

 

명시해둔 값인 category 폴더가 [username] 폴더보다 우선시 되는걸 알 수 있습니다.

 


3. [...] 형식

[...] 형식의 경우 더 깊은 뎁스를 이용할 수 있습니다.

 

 

 

...slug의 경우 뎁스가 배열형태로 넘어온다.

 

 

 

제한은 없는듯 합니다..

 


기본경로 설정하기

 

jsconfig.json 생성하기

프로젝트의 루트 디렉토리에 만들어줍니다.

 

src를 baseUrl 로 사용하겠다 라는 설정을 추가해줍니다.

../../ 2번의 뎁스가 있던 경로가
짜잔!


 

'React > React Framework' 카테고리의 다른 글

[Next.js] 태그  (1) 2024.01.20
[Next.js] Next App Router에 대해  (1) 2024.01.18
[Next.js] Images에 대해서  (1) 2023.09.07
[Next.js] 공통 레이아웃과 _app.js  (0) 2023.09.06
[Next.js] Next.js 시작하기2  (1) 2023.06.19

해당 내용은 npx create-next-app --example image-component react-image-app 를 이용해 작성하였습니다.

 

1. Next.js의 Image 컴포넌트

 

 

Image 컴포넌트에서 제공하는 기능 3가지

  • lazy loading
    - 화면 밖의 이미지는 로딩을 지연시키고 화면 안에 있는 이미지만을 로드해서, 불필요한 사용을 줄이고 필요한 이미지만 빠르게 로드할 수 있도록 하는 것 입니다.

lazy loading

  • 이미지사이즈 최적화
    - Next.js는 이미지를 webp와 같은 용량이 작은 포맷으로 이미지를 변환해서 제공합니다
    - 아래의 이미지를 보면 img 의 경우 294kb(원본크기)  Next.js/Image는 8.1kb로 나타나며 유형 또한 다른것이 보입니다

좌 : img , 우 : Next.js/Image

 

 

  • placeholder 를 제공하여 CLS를 방지합니다

 


Image 컴포넌트의 장점

  • 성능 향상 : 디바이스마다 적절한 사이즈의 이미지를 서빙하고, webp와 같은 작은 용량의 포맷을 사용합니다
  • 시각적인 안정성 : 이미지 로드 전 placeholder를 제공하여 CLS(Cumulative Layout Shift) 방지
    *CLS : 웹 페이지가 로드될 때, 사용자가 페이지의 내용을 읽거나 상호 작용하는 중에 레이아웃이 갑자기 변경되면 사용자 경험에 부정적인 영향 주는 경우를 말합니다.
  • 빠른 페이지 로딩 : viewport에 들어왔을 때만 이미지를 로드하고, 작은 사이즈의 blur 이미지를 미리 로딩하여 사용자 경험이 향상됩니다.

 

Image의 속성

 

Layout

  • intrinsic : default 값, 이미지의 width, height에 따라 얼마나 많은 자리를 차지하는지 계산합니다.
    * 컨테이너의 크기가 이미지보다 작아질 경우 컨테이너에 맞게 크기를 줄임!
  • fixed : 이미지의 정확한 width, height를 사용하여 표시합니다.
    * 컨테이너 크기와 무관하게 이미지의 크기를 width, height 속성값을 이용
  • fill : relative 포지션을 가진 조상의 너비, 높이와 동일하게 조정함. 주로 objectFit 속성과 함께 사용합니다.
    * position: relative를 가진 조상의  width, height에 맞추기 위해 자동으로 width, height를 조절합니다.
    (이미지 사이즈를 모를 때 사용하면 좋은 옵션입니다.)
  • responsive : 부모 컨테이너의 width에 맞게 이미지를 확대합니다.
    (부모 컨테이너에 display: block을 추가해야 합니다.)

width, height 속성에 대해

- intrinsic, fixed 의 경우 이미지의 width, height 속성값이 그대로 적용됩니다.
- responsive, fill의 경우 이미지가 비율에 맞게 확대 축소됩니다.

 

Priority(우선순위)

  • priority를 사용시 브라우저가 이 이미지를 미리 렌더링 합니다.  처음 보이는 이미지에는 이 속성을 지정하는 게 좋습니다.
  • Boolean 타입 이며,  priority라고 적으면 true가 되고, 안 적으면 false가 됩니다.
    (priority의 경우  lazy loading은 적용되지 않습니다.)

 

참고

카카오 FE 기술블로그 : https://fe-developers.kakaoent.com/2022/220714-next-image/

 

Next/Image를 활용한 이미지 최적화 | 카카오엔터테인먼트 FE 기술블로그

조지영(esme) 무언갈 빠르게 좋아합니다. 그래서 변화가 빠른 FE 개발이 적성에 잘 맞습니다.

fe-developers.kakaoent.com

 

1. 하나의 공통된 Layout을 쓰는경우

1-1. 공통된 레이아웃을 가진 컴포넌트를 만든다.

children 자리에 현재 페이지의 컴포넌트가 들어옵니다

 

1-2. pages/_app.js 를 만든다.

 

_app 파일에 대해서

  1. _app 파일은 서버 요청시 가장 먼저 실행되며, 공통 레이아웃의 역할을 합니다. (Next.js에서 제공하며 반드시 _app의 이름을 사용)
  2. _app.js 파일 내부의 App 컴포넌트는 다음과 같은 두 가지 중요한 인수를 받습니다
    • Component: 현재 페이지 컴포넌트를 나타냅니다. 즉, 이후에 라우팅된 페이지 컴포넌트가 Component로 전달됩니다.
    • pageProps: 현재 페이지 컴포넌트의 초기 속성(props)을 나타냅니다. SSR, SSG 등에서 미리 가져온 데이터 등이 포함됩니다.

 

2. 여러개의 Layouts를 사용하는 경우

추가적으로 SubLayout 생성
SubLayout.js

2-1. 함수를 만들어서 넣어줍니다.

getLayout 이라는 함수를 만들어서 넣어줍니다.

2-2. _app 수정하기

해당 페이지에 getLayout이 있다면 그 함수를 가지고와 retrun 시 Component를 값으로 넣어줍니다.


없다면 기존에 만들었던 <Layout> 컴포넌트에 page를 children 으로 받는 함수를  넣어 return 해줍니다.

기존에 만든 공통 레이아웃, 그리고 여러개의 공통 레이아웃을 사용하고자 만든 서브 레이아웃까지 적용하는 방법에 대해 알아보았습니다.

'React > React Framework' 카테고리의 다른 글

[Next.js] Next App Router에 대해  (1) 2024.01.18
[Next.js] router와 slug + 기본경로설정  (1) 2023.09.07
[Next.js] Images에 대해서  (1) 2023.09.07
[Next.js] Next.js 시작하기2  (1) 2023.06.19
[Next.js] Next.js 시작하기  (3) 2023.06.18

react-beautiful-dnd는 3개의 요소로 이루어져있습니다.

 

  1. DragDropContext
    • 드래그를 사용할 영역을 의미합니다
    • contextAPI의 Provider같은 느낌입니다. (감싸주는 느낌..?)
  2. Droppable
    • Drag해서 놓을 Drop할 영역입니다.
    • Draggable을 감싸서 사용합니다.
  3. Draggable
    • Drag 할 Item 입니다. 
    • 우리가 이용할 Item컴포넌트를 Draggable로 감싸주면 됩니다.

 

DragDropContext

DragDropContext는 3개의 prop이 있습니다.

  1. onDragStart
    • Darg를 시작할 때 (Drag 할 Item을 클릭하고 움직이기 시작할 때) 호출
  2. onDragEnd
    • Darg가 끝났을 때 (마우스를 땔때) 호출
  3. onDragUpdate
    • Drag중에 발생하는 변화가 생겼을때 호출

 

Droppable

1. Droppable에는 droppabledId 라는 props가 있습니다.

해당 Id는 Context 안에서 유일해야합니다. (영역을 구분지어야 하기 때문)

 

Droppable에서 사용할 Draggable에 해당하는 자식 컴포넌트는 Element를 받는게 아닌

함수 형태로 받아야 합니다.

 

  <Droppable droppableId={list.id}>
        {(provided: any) => (
          <div>
              {items.map((item, i) => (
                <Item key={item.id} item={item} index={i} />
              ))}
              {provided.placeholder}
          </div>
        )}
      </Droppable>

 

provided에는 droppable에 사용할 props가 모여있습니다.

1. data-rbd-droppable-context-id

2. data-rbd-droppable-id

직접 쓰면.. 

  {(provided: any) => {
          return (
            <div
              data-rbd-droppable-context-id={
                provided.droppableProps["data-rbd-droppable-context-id"]
              }
              data-rbd-droppable-id={provided.droppableProps["data-rbd-droppable-id"]}
              ref={provided.innerRef}
            >

사실 이렇게 쓰고싶은사람은 없으니.

 

  {(provided: any) => {
          return (
            <div {...provided.droppableProps} ref={provided.innerRef} >

스프레드를 씁시다.

 

2. 앗. ref도 지정해줘야합니다. 

 

3. 마지막으로 placeholder 라는 프로퍼티가 있습니다.

 

droppable에 변화가 생긴다면 해당 부분을 처리해주는 역할을 합니다.

 

  <Droppable droppableId={list.id}>
        {(provided: any) => {
          return (
            <div {...provided.droppableProps} ref={provided.innerRef}>
              <>
                {items.map((item, i) => (
                  <Item key={item.id} item={item} index={i} />
                ))}
                {provided.placeholder}
              </>
            </div>
          );
        }}
      </Droppable>

 

 

Draggable

1. Draggable은  draggableId와 index가 필수입니다.

 

Item 컴포넌트를 Drag가 가능하게 하려면 Draggable로 감싸야합니다.

 

Droppable처럼 함수 형태로 작성해야합니다.

 

const Item = ({ item, index }) => {
    <Draggable draggableId={item.id} index={index}>
      {(provided: any) => {
        return (
          <div
            {...provided.draggableProps}
            {...provided.dragHandleProps}
            ref={provided.innerRef}
          >
            {item.content}
          </div>
        );
      }}
    </Draggable>
}

draggableProps, dragHandleProps, 그리고 ref까지 작성 해줘야합니다.

 

draggableProps : Drag 가능한 요소에 적용되는 속성을 나타내며, 해당 요소의 이벤트 리스너 및 기타 속성을 정의할 수 있습니다.

(context에서 작성한 onDragStart , onDragEnd 같은 친구들..)

dragHandleProps : Drag 액션을 처리하는 드래그 핸들에 적용되는 속성을 나타내며, Drag가 발생하는 영역을 정의할 수 있습니다.

 


onDrag 함수들에 대해

{
	draggableId: 'itemList',
    type: 'TYPE'
    reason: 'DROP',
    source: {
    	droppableId: 'item1',
        index:0,
    }, 
    destination: {
    	droppableId: 'item1',
        index:1, 
    }, 
}

draggableId : Drag 한 객체의 id

source : Drag가 시작된 위치  Droppable의 Id와 시작할 때 item의 index

destination : Drag가 끝나는 위치 Droppable의 Id와  끝날때 Item의 index Droppable의 밖에 드래그 할 경우 null

 

 

source와 destination을 이용해야합니다.

  const onDragEnd = (result: DropResult) => {
    const { destination, source, draggableId } = result;
    if (!destination) return;
    if (destination.droppableId === source.droppableId && source.index === destination.index)
      return;

    const newItemIds = Array.from(column.itemIds);

    //시작지점 source의 아이탬의 index를 잘라냅니다 (위치를 바꿔주기위해)
    newItemIds.splice(source.index, 1);
    //아이탬의 도착지 destination의 index 위치에 draggableId를 추가합니다 (잘라낸 아이탬의 id)
    newItemIds.splice(destination.index, 0, draggableId);

    //바뀐 newItemIds를 갱신
    const newColumn = {
      ...column,
      itemIds: newItemIds,
    };

    //갱신한 값을 Data를 가져와서 바꿔줍니다
    const newData = {
      ...data,
      columns: {
        ...data.columns,
        [newColumn.id]: newColumn,
      },
    };

    setData(newData);

}

 

 

다른 Droppable에도 이동하기

 

처음엔 어떻게 하는건지.. 어렵게 생각했었는데..

크게 다르지 않았습니다.

 

기존소스를 이용하면서 바뀐부분은 주석!

 

  const onDragEnd = (result: DropResult) => {
    const { destination, source, draggableId } = result;

    if (!destination) return;
    if (destination.droppableId === source.droppableId && source.index === destination.index)
      return;

    const sourceColumn = data.columns[source.droppableId]; // 출발지의 droppable정보
    const destinationColumn = data.columns[destination.droppableId];// 도착지점의 droppable정보
    
    if(source.droppableId === destination.droppableId){
        //기존소스
      
        /*column 을 sourceColumn 으로 변경
		어짜피 시작과 끝이 같은 영역일 경우에만 동작하므로 
        source나 destination 아무거나 사용해도 괜찮습니다.
        그 영역의 정보를 가지고 오는것이 중요
		*/
      const newItemIds = Array.from(sourceColumn.itemIds);    
      newItemIds.splice(source.index, 1);
      newItemIds.splice(destination.index, 0, draggableId);

      //...column 을 ...sourceColumn 으로 변경
      const newColumn = {
        ...sourceColumn,
        itemIds: newItemIds,
      };


      const newData = {
        ...data,
        columns: {
          ...data.columns,
          [newColumn.id]: newColumn,
        },
      };

      setData(newData);
      //여기까지 기존소스
      
    }else{
      //출발지와 도착지가 이제 다르기 때문에 따로 만들어줍니다.
      
      const sourceItemIds = Array.from(sourceColumn.itemIds);
      const destinationItemIds = Array.from(destinationColumn.itemIds);
      
      sourceItemIds.splice(source.index, 1);
      destinationItemIds.splice(destination.index, 0, draggableId);

      const newSourceColumn = {
          ...sourceColumn,
          itemIds: sourceItemIds,
      };

      const newDestinationColumn = {
          ...destinationItemIds,
          itemIds: destinationItemIds,
      };

      const newData = {
        ...data,
        columns: {
            ...data.columns,
            [newSourceColumn.id]: newSourceColumn,
            [newDestinationColumn.id]: newDestinationColumn,
        },
      };

      setData(newData);
    }
};

정적(Static)과 동적(Dynamic)

 - 정적(Static): 고정된 내용을 가지고 있어 변하지 않습니다.

웹 페이지의 경우, HTML, CSS, JavaScript 등의 파일이 변경되지 않고 고정된 형태로 서버에 의해 제공됩니다. 

정적인 웹 사이트의 예시는 블로그 포스트, 회사 소개 페이지 등이 있습니다. 웹 페이지가 항상 동일한 내용을 보여줍니다. 

 

 - 동적(Dynamic): 변경 가능한 내용을 가지고 있습니다. 즉, 내용이나 데이터가 시간에 따라 변할 수 있습니다. 

서버에서 동적으로 생성되는 콘텐츠를 가지고 있으며, 사용자와의 상호작용에 따라 콘텐츠가 변경될 수 있습니다. 

동적인 웹 사이트의 예시는 온라인 쇼핑몰, 소셜 미디어 피드 등이 있습니다. 사용자에 따라 다른 콘텐츠를 제공할 수 있습니다.

 

1. pre-render와 SEO의 상관관계

SEO : 검색엔진최적화, 검색엔진이 내 페이지를 상위 노출할 수 있게 만드는것.

 

설명하기전 pre-render에 대해 이해하고 넘어가겠습니다.

 

1-1. pre-render (Next.js 를 사용할 경우)

Next.js는 모든 페이지를 기본적으로 pre-render한다.!

Pre-render를 해두면 client(브라우저)처럼 동작하지 않는 검색엔진에게 필요한 데이터를 제공 할 수 있습니다

(Pre-render : client 에서 접근해 HTML을 로드할 때 대부분이 미리 로드가 되어있는것)

 

이후에 Hydration 과정을 거쳐 사용자와 페이지가 인터렉션 할 수 있게 됩니다.

 

1-2. No pre-render(React.js 만 사용할 경우)

자바스크립트가 로드가 된 후에 컴포넌트를 그리기 때문에 브라우저처럼 동작하지 않는 검색엔진의 경우

js를 해석하지 못해 아무 정보도 가져갈 수 없게 되는 것입니다.

 

CSR만 제공한다면 client(브라우저)처럼 동작하지 않는 검색엔진의 경우, 아무런 데이터도 조회해갈 수 없습니다.

 

Next.js를 통해 SSR을 하면 js를 실행하지 못하는 엔진 또한 pre-render를 통해 정보를 읽어갈 수 있습니다.

즉 Client 처럼 동작하지 않는 검색엔진에게 필요한 데이터를 제공 할 수 있습니다.

 

2. Next.js 의 Pre-render 방식은?

SSG(recommended) & SSR

SSG는 빌드 타임에, SSR은 요청 타임에 pre-render를 하게 됩니다.

(SSG 권장 SSG는 접근을 하더라도 부하가 발생하지 않음, SSR은 접근 할때마다 부하가 발생..)

 

2-1. SSG에 대해서.

  1. 페이지가 외부 데이터에 의존적인 경우
    getStaticProps를 사용
  2. 페이지의 경로까지 외부 데이터에 의존적인 경우
    getStaticProps에 더해  getStaticPaths까지 활용해야함

 

 

SSR 을 담당하는 함수

 

 1-1. getServerSideProps(SSR)

 

console.log가 찍히지 않은걸 볼 수 있습니다.

서버에서 찍히고 있습니다.

 

즉  getServerSideProps 는 서버로부터 데이터를 가져와 화면에 보여준다는걸 알 수 있습니다.


 1-2. getStaticPaths (SSG)

 

서버에서 동작하는게 보입니다.

 

저는 지금 yarn dev로 개발환경으로 보고있습니다.

 

개발 환경에서는 SSG가 재대로 동작하지 않고 SSR처럼 동작을합니다

 

이를 재대로 확인하기 위해서는 build과정이 필요합니다.

 

빌드 후 yarn start로 실행했습니다.

 

ssg도 client도 로그에 뜨지않습니다

 

새로고침을 해도 시간은 계속 고정입니다.

 

 

기존 패이지는 새로고침시 시간이 바뀝니다.(SSR)

 

 

csr의 페이지

여기 또한 새로고침시 시간이 바뀝니다.

 

SSG는 결국 build시 page가 미리 만들어집니다.

build 기준의 시간으로 만들어지는겁니다.

 

이건.. 언제 쓰이는걸까요.?

 

SSG는 정적인 페이지를 생성합니다.

 

매번 사용자가 접근시 데이터를 가져와서 페이지를 그린다면, 서버에 부하가 생깁니다.

 

이때 데이터를 가져와서 그릴 필요가 없으며, 사이드바, 메뉴 처럼 갱신이 필요하지 않는 경우 미리 만들어두고 가져올 때 사용합니다.

 


1-3 ISR( incremental Static Regeneration : 증분 정적 사이트)

 

특정 주기로 데이터를 가져와서 다시 그린다.

 

정적인 사이트를 일정 주기로 가져와서 다시 그리는 것입니다.

 

 

getStaticProps에서 revalidate가 추가되었습니다

위의 코드에서는 1이라는 값이 revalidate에 들어가 있습니다.

 

getStaticProps에서 revalidate를 return 하면 

 

1초간의 캐싱을 가지며 그 사이에서는 아무리 새로고침을 해도 데이터를 가져와 새로운 정적 사이트를 만들지는 않습니다.

 

ISR로 만들면 SSG와 SSR의 장점을 적절하게 사용이 가능해집니다!

 

예를들어 1시간의 텀으로 만들경우 그 사이에 누가 접속해도 요청은 보내지 않습니다.

 

1시간의 텀이 지나고 누군가가 접속시 요청을 시작하며, 그 텀이 지난 후에도 접속을 하지 않는다면 갱신을 하지 않습니다.

 

서버에 부담을 주지 않는 효율적인 페이지라고 생각됩니다.

 

 

 

 

 

 

2. CSR을 담당하는 함수

CSR을 담당하는 는 별도로 존재하지 않습니다.

 

 

 

데이터를 클라이언트가 가져와서 그리기 때문에 서버가 아닌 콘솔창에 로그가 찍혀있습니다.

1. 왜 Next.js를 사용하나요.?

  •  SEO(검색 엔진 최적화)
  •  손쉬운 배포 시스템 Vercel
  •  간단한 API 구성
  •  대체재로는 Gatsby / Remix

 

 

2. Next.js 환경설정


- 제 기준의 Node와 Yarn의 버전입니다.

  • Node 18.12.1
  • Yarn 1.22.19 
  • Git 환경
  • VScode

 

+ Recent posts