본문 바로가기
React TIL

[React] Day_65 데일리 정리

by 림졍 2024. 12. 19.

 

빨리자기 위한 TIL 작성..

 

 

과제 제출 새벽에 끝-!

오늘은 일찍 자기위해서 TIL 빠르게 정리해따 히히 ^0^

바아로 시작해보도록 하죠. 레고.

 

 

 

챌린지반 강의정리 - Next.js 심화: 기능 구현과 문제 해결

으아아 어지러워요오 @.@....

 

네. 많이요.

 

 

React vs Next.js 

(= 단순한 UI 설계 도구 vs 전체 애플리케이션 개발 환경을 제공하는 프레임워크)

 

- React

UI 구성 요소를 작성하기 위한 라이브러리

컴포넌트 기반 설계를 통해 재사용 가능한 UI를 쉽게 구현 가능

상태 관리, 라우팅, 빌드 최적화 등의 기능은 별도의 라이브러리나 설정이 필요함 (한계점)

 

- Next.js

React를 기반으로 하는 프레임워크

 

[Next.js의 특징]

  • 파일 기반 라우팅: 폴더 구조에 따라 자동으로 라우트를 생성
  • SSR/SSG/ISR 지원: 다양한 렌더링 방식을 제공 → SEO 최적화 및 UX 개선
  • 빌트인 성능 최적화: 이미지 최적화, 코드 스플리팅, 빠른 초기 로딩 지원

 

 

Next.js를 사용하기 좋은 경우

  • SEO가 중요한 프로젝트 : SSR과 SSG 렌더링 → 검색 엔진 크롤러가 HTML 콘텐츠를 쉽게 접근 가능
  • 복잡한 라우팅이 필요한 경우 : Next.js 파일 기반 라우팅 = 라우팅 설정을 단순화 및 동적 라우팅도 쉽게 지원
  • 서버-클라이언트 간 데이터 효율적으로 다뤄야 할 때 : API 라우트 핸들러와 함께 서버리스 함수로 간단하게 데이터 로직 구현 가능
  • 정적 파일 및 이미지 최적화:  내장된 이미지 최적화 → 기능 웹사이트 로딩 속도를 크게 개선 가능

 

 

서버 컴포넌트와 클라이언트 컴포넌트의 혼합

 

- 문제 상황

 

Next.js의 layout.tsx는 서버 컴포넌트로 작동

∴ 클라이언트 측에서만 실행 가능한 브라우저 API or 클라이언트 전용 라이브러리를 사용 X!

ex) Tanstack QueryQueryClientProvider는 브라우저 환경에서 동작해야 하기 때문에 layout.tsx에 직접 사용할 수 없다!

 

- 해결 방법

 

1. 클라이언트 전용 Provider 파일 생성

providers.tsx라는 별도 파일 생성 → use client 선언 후, 클라이언트 로직을 작성

// app/providers.tsx
'use client';

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import React, { useState } from 'react';

export default function Providers({ children }: { children: React.ReactNode }) {
  const [queryClient] = useState(() => new QueryClient());

  return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
}

 

2. layout.tsx에서 Providers 사용

클라이언트 컴포넌트인 Providers, 서버 컴포넌트인 layout.tsx에서 호출

// app/layout.tsx
import Providers from './providers';
import './globals.css';

export const metadata = { title: 'My App' };

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}

 

 라이언트와 서버의 책임을 분리하여 문제를 해결이 가능하다 ^-^)b

 

 

Hydration

 

서버에서 렌더링된 HTML에 React 상태 및 이벤트를 추가 → 클라이언트 측에서 완전히 활성화하는 과정

 

- 작동 원리

  1. 서버에서 생성된 HTML을 클라이언트로 전송
  2. 브라우저가 HTML을 렌더링하고, React는 HTML DOM에 연결
  3. 연결 후 React 상태와 이벤트가 활성화됨

 

 

Provider & 클라이언트 컴포넌트

 

클라이언트 상태 관리를 전제로 하는 Provider 컴포넌트 = use client 선언 필요

 

서버 컴포넌트와 혼합하여 사용할 때,

  • layout.tsx는 서버 컴포넌트로 유지.
  • 클라이언트 상태 관리를 위해 Provider 컴포넌트를 별도 파일로 작성.

위의 접근 방식 → 클라이언트와 서버를 분리하고, Next.js의 번들링 최적화를 활용하는 데 효과적

 

 

Next.js의 렌더링 방식

 

- Static Site Generation (SSG)

  • 빌드 시 정적 HTML 생성 ex) 정적 블로그, 회사 소개 페이지
  • SEO와 빠른 로딩 속도 : 사용자가 즉시 콘텐츠를 볼 수 있음

- Incremental Static Regeneration (ISR)

  • 주기적으로 콘텐츠 업데이트 ex) 뉴스 섹션, 주간 베스트
  • SSR과 SSG의 장점 결합 → 콘텐츠가 최신 상태로 유지, 빌드 비용을 절약

- Server-Side Rendering (SSR)

  • 요청 시 HTML 생성 ex) 사용자 맞춤 대시보드
  • 최신 데이터 제공 → 실시간 데이터를 활용할 수 있음

- Client-Side Rendering (CSR)

  • 클라이언트에서 렌더링 및 데이터 패칭 ex) SPA.
  • 빠른 사용자 인터랙션 지원

 

 

- 페이지 이동 방식: Link와 useRouter

  • Link 컴포넌트 : 정적 라우팅에 사용, prefetch로 성능 최적화
  • useRouter 훅 : 동적 페이지 이동이나 조건부 라우팅에 적합
import Link from 'next/link';
import { useRouter } from 'next/navigation';

export default function NavigationExample() {
  const router = useRouter();

  const handleLogin = () => {
    // 로그인 성공 후 대시보드로 이동
    router.push('/dashboard');
  };

  return (
    <div>
      <Link href="/about">About</Link>
      <button onClick={handleLogin}>Login</button>
    </div>
  );
}

 

 

API 라우트 핸들러와 서버리스 함수

 

app/api, 서버리스 함수처럼 작동

// app/api/hello/route.ts
import { NextResponse } from 'next/server';

export function GET() {
  return NextResponse.json({ message: 'Hello from API!' });
}

 

 

SEO를 고려한 Metadata

 

SEO와 소셜 미디어 공유를 위한 메타데이터 설정을 지원

// app/layout.tsx
export const metadata = {
  title: 'My Awesome Website',
  description: 'Built with Next.js',
  openGraph: {
    title: 'My Awesome Website',
    description: 'Learn how to build with Next.js',
    images: [{ url: 'https://example.com/og-image.png' }],
  },
};

 

 

환경변수 설정

 

환경변수는 .env.local 파일에 정의, 민감한 정보는 서버에서만 접근 가능!

SUPABASE_URL=https://your-supabase-url.supabase.co
SUPABASE_ANON_KEY=your-anon-key
// 서버 코드
export async function GET() {
  const supabaseUrl = process.env.SUPABASE_URL;
  return NextResponse.json({ url: supabaseUrl });
}

 

 

 

마무리 - 내일부터 이제 팀플이다!

 

ye? 아시겠냐고요.

 

 

머리가 너무 아픈 나머지

오늘은 일찍 가볼거고..

내일.. 팀프로젝트 시작해야겠쥐?

아하하 그럼 20000!

(이젠 몰라 대충할래~)

 

 

오늘의 KPT 회고

 

Keep: 과제 끝!

Problem: 비상! 비상! 상태이상!

Try: 일찍 자긔 들으렁..

728x90
반응형