Next.js에서 TypeScript 사용하기: 강력한 타입 시스템 도입

작성일 :

Next.js에서 TypeScript 사용하기: 강력한 타입 시스템 도입

Next.js는 React 기반의 프레임워크로, 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG)를 지원합니다. 타입스크립트(TypeScript)는 자바스크립트(JavaScript)의 상위 집합으로, 자바스크립트에 강력한 타입 시스템을 추가하여 코드의 안정성과 유지보수성을 크게 향상시킵니다. 이 글에서는 Next.js 프로젝트에 TypeScript를 도입하고 설정하는 방법과 이를 활용한 다양한 예제를 살펴보겠습니다.

TypeScript 설치 및 설정

Next.js 프로젝트에 TypeScript를 설치하고 설정하는 과정은 간단합니다. 기본적으로 몇 가지 패키지를 설치하고 설정 파일을 추가하면 됩니다.

  1. 프로젝트 생성: 다음 명령어를 실행하여 새로운 Next.js 프로젝트를 생성합니다.

    bash
    npx create-next-app my-nextjs-project
    cd my-nextjs-project
  2. TypeScript 패키지 설치: 다음 명령어를 사용하여 TypeScript와 관련된 패키지를 설치합니다.

    bash
    npm install --save-dev typescript @types/react @types/node
  3. tsconfig.json 파일 생성: 프로젝트 루트 디렉토리에 tsconfig.json 파일을 생성합니다. 이 파일은 TypeScript 컴파일러의 설정을 정의합니다. 기본 설정 파일을 생성하려면 아래 명령어를 실행합니다.

    bash
    npx tsc --init

    기본 설정 파일이 생성된 후 필요한 설정을 수정합니다. 예를 들어, strict 모드를 활성화하거나 baseUrlpaths를 설정할 수 있습니다.

  4. 확장자 변경: 프로젝트의 파일 확장자를 .js에서 .ts로, React 컴포넌트 파일은 .jsx에서 .tsx로 변경합니다. 예를 들어, pages/index.js 파일의 확장자를 pages/index.tsx로 변경합니다.

  5. 타입 정의 추가: 필요한 경우, 추가적인 타입 정의를 @types 패키지에서 설치합니다. 커스텀 타입을 정의해야 하는 경우, 프로젝트에 type.d.ts 파일을 생성하여 타입을 정의할 수 있습니다.

TypeScript를 활용한 코드 작성

TypeScript를 사용하면 코드에서 발생할 수 있는 다양한 오류를 사전에 방지할 수 있습니다. 여기서는 몇 가지 예제를 통해 TypeScript를 효과적으로 활용하는 방법을 살펴보겠습니다.

함수 및 변수에 타입 선언

TypeScript에서는 함수와 변수에 타입을 명시적으로 선언할 수 있습니다. 이를 통해 함수의 인자와 반환값, 변수의 타입을 명확히 정의할 수 있습니다.

typescript
function add(a: number, b: number): number {
  return a + b;
}

let message: string = "Hello, TypeScript!";

React 컴포넌트에 타입 적용

Next.js 프로젝트에서 React 컴포넌트를 작성할 때도 TypeScript를 활용할 수 있습니다. 특히, 컴포넌트의 props와 state에 타입을 선언하여 코드의 안정성을 높일 수 있습니다.

tsx
import React from 'react';

interface MyComponentProps {
  title: string;
  description?: string;
}

const MyComponent: React.FC<MyComponentProps> = ({ title, description }) => (
  <div>
    <h1>{title}</h1>
    {description && <p>{description}</p>}
  </div>
);

export default MyComponent;

위 예제에서 MyComponenttitledescription이라는 두 개의 props를 받습니다. title은 필수적인 문자열 타입이며, description은 선택적(optional)인 문자열 타입입니다.

상태 관리에서의 타입 적용

Next.js와 TypeScript를 사용할 때는 상태 관리 라이브러리에서도 타입을 적용할 수 있습니다. 예를 들어, useState와 같은 React 훅에 타입을 명시적으로 선언할 수 있습니다.

tsx
import React, { useState } from 'react';

const Counter: React.FC = () => {
  const [count, setCount] = useState<number>(0);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>{count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

export default Counter;

위 예제에서 useState 훅의 초기 값은 0이며, count 상태와 setCount 함수는 number 타입으로 선언되었습니다. 이를 통해 상태 관리에서도 타입 안정성을 확보할 수 있습니다.

폴더 구조와 타입 정의 파일

TypeScript를 사용하면 프로젝트의 폴더 구조와 타입 정의 파일 관리에도 유용합니다. 다음은 일반적으로 사용되는 폴더 구조 예시입니다.

my-nextjs-project/
├── pages/
│   ├── index.tsx
│   └── _app.tsx
├── components/
│   └── MyComponent.tsx
├── types/
│   └── index.d.ts
├── tsconfig.json
└── package.json

타입 정의 파일은 types 폴더에 저장하여 프로젝트 전반에 걸쳐 재사용할 수 있습니다. 예를 들어, 전역 타입을 정의하는 index.d.ts 파일을 생성할 수 있습니다.

typescript
// types/index.d.ts
interface User {
  id: number;
  name: string;
  email: string;
}

결론

이 글에서는 Next.js에 TypeScript를 도입하고 설정하는 방법, 그리고 TypeScript를 활용하여 안정적인 코드를 작성하는 방법을 살펴보았습니다. TypeScript는 코드에서 오류를 사전에 방지하고, 코드의 이해도와 유지보수성을 높이는 데 큰 도움이 됩니다. TypeScript를 Next.js 프로젝트에 도입하여 더 나은 개발 환경을 경험해 보세요.