Skip to main content

Command Palette

Search for a command to run...

타입스크립트와 OpenAPI로 타입 안정성 있는 API 구축하기

Published
타입스크립트와 OpenAPI로 타입 안정성 있는 API 구축하기

원문: Alexander Obregon, "Building Type-safe APIs with TypeScript and OpenAPI"

소개

최신 웹 개발에서 타입 안정성은 안정적이고 유지 관리가 가능한 애플리케이션을 구축하는 데 중요한 역할을 합니다. 정적 타입을 지원하는 자바스크립트의 상위 집합인 타입스크립트는 타입 안정성을 중시하는 개발자가 선호하는 언어가 되었습니다. 반면 OpenAPI는 API를 설계, 구축, 문서화 및 테스트하는 데 도움이 되는 보편적인 API 설명 형식입니다.

이 글에서는 타입스크립트 및 OpenAPI를 사용하여 타입 안정성 있는 API를 만드는 방법을 살펴보겠습니다. 기사 모음을 관리하기 위한 간단한 REST API 구축 과정을 통해 이를 설명하겠습니다.

1단계: 프로젝트 설정하기

시작하려면 프로젝트에 대한 새 폴더를 만들고 npm으로 초기화하세요.


mkdir type-safe-api
cd type-safe-api
npm init -y

다음으로 필요한 종속성을 설치합니다.

npm install --save express
npm install --save-dev typescript @types/express ts-node

프로젝트 루트에 tsconfig.json 파일을 만듭니다.

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules"]
}

2단계: OpenAPI 사양 정의하기

openapi라는 새 폴더를 만들고 그 안에 spec.yml 파일을 만듭니다. OpenAPI 사양을 사용해 API를 정의합니다.

openapi: 3.0.0
info:
  title: Article API
  version: 1.0.0
paths:
  /articles:
    get:
      summary: Get all articles
      responses:
        '200':
          description: A list of articles
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Article'
components:
  schemas:
    Article:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        content:
          type: string
      required:
        - id
        - title
        - content

3단계: OpenAPI 사양에서 타입스크립트 타입 생성하기

OpenAPI 사양에서 타입스크립트 타입을 생성하려면 openapi-typescript 패키지를 설치합니다.

npm install --save-dev openapi-typescript

타입을 생성하려면 package.json에 스크립트를 추가하세요.

"scripts": {
  "generate-types": "openapi-typescript openapi/spec.yml --output src/types/api.ts"
}

스크립트를 실행해 타입을 생성합니다.

npm run generate-types

4단계: 타입 안정성을 갖춘 API 구현하기

src라는 새 폴더를 만들고 그 안에 index.ts 파일을 만듭니다. 필요한 모듈과 생성된 타입을 가져옵니다.

import express from "express";
import { Article } from "./types/api";

기사를 저장하기 위한 용도로 간단한 메모리 내 저장소를 만듭니다.

const articles: Article[] = [];

모든 기사를 가져오는 경로를 정의합니다.

const app = express();
app.use(express.json());

app.get("/articles", (req, res) => {
  res.json(articles);
});

마지막으로 서버를 시작합니다.

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

이제 타입스크립트 및 OpenAPI를 사용하여 타입 안정성 있는 API를 갖게 되었습니다. API가 성장함에 따라 더 많은 엔드포인트를 쉽게 추가하여 모든 단계에서 타입 안정성을 보장할 수 있습니다.

5단계: OpenAPI 사양 업데이트하기

spec.yml에서 /articles 경로에 post 엔드포인트를 추가합니다.

post:
  summary: Create a new article
  requestBody:
    required: true
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/ArticleInput'
  responses:
    '201':
      description: The created article
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Article'

그리고 components 섹션에서 ArticleInput 스키마를 정의합니다.

ArticleInput:
  type: object
  properties:
    title:
      type: string
    content:
      type: string
  required:
    - title
    - content

6단계: 타입스크립트 타입 재생성하기

업데이트된 OpenAPI 사양을 기반으로 타입스크립트 타입을 다시 생성하려면 스크립트를 실행하세요.

npm run generate-types

7단계: 기사 생성 엔드포인트 구현하기

새로운 ArticleInput 타입을 포함하도록 index.ts 파일을 업데이트하고 기사 생성 엔드포인트를 구현합니다.

import { v4 as uuidv4 } from "uuid";
import { Article, ArticleInput } from "./types/api";

// ...

app.post("/articles", (req, res) => {
  const articleInput: ArticleInput = req.body;
  const newArticle: Article = { ...articleInput, id: uuidv4() };

  articles.push(newArticle);
  res.status(201).json(newArticle);
});=

이제 API에는 기사 관리를 위한 getpost의 두 가지 엔드포인트와 타입스크립트 및 OpenAPI를 사용하여 모두 타입 안정성이 구현되었습니다. API를 계속 개발하면서 타입 안정성 기능을 활용하여 잠재적인 오류를 조기에 포착하고 개발 프로세스를 간소화하며 전반적인 코드 품질을 향상할 수 있습니다.

결론

타입스크립트와 OpenAPI는 함께 타입 안정성 있는 API를 구축하기 위한 강력한 조합을 제공합니다. 이러한 도구를 활용하면 향상된 개발자 경험과 코드 품질을 갖춘 강력하고 유지 관리 가능한 API를 만들 수 있습니다.

  1. 타입스크립트 문서

  2. OpenAPI 사양 문서

More from this blog

나의 오픈 소스 시작 이야기

원문: TkDoDo, “My Open Source Origin Story“ 가끔씩 제가 받는 질문이 하나 있는데, 바로 오픈 소스와 리액트 쿼리(React Query)를 어떻게 시작하게 되었는지입니다. 저의 기본 원칙은 어떤 질문을 세 번 받으면 더 이상 답변할 필요가 없도록 질문에 대해 글로 쓴다는 것입니다. 하지만 이 질문은 주로 직접 만났을 때 받는 질문이라 글로 작성할 생각을 한 적이 없었습니다. 최근에 오프라인 컨퍼런스에 더 많이 참...

Jul 30, 2025
나의 오픈 소스 시작 이야기

이더넷이란?

원문: baeldung, “What Is Ethernet?“ 1. 소개 이 튜토리얼에서는 이더넷(Ethernet)과 이를 통해 이루어지는 데이터 전송에 대해 알아보겠습니다. 2. 이더넷이란? 이더넷은 근거리 통신망(LAN) 또는 광역 네트워크(WAN) 내에서 장치들이 데이터를 주고받고 통신하기 쉽게 만들어 주는 널리 사용되는 기술입니다. 컴퓨터, 프린터, 서버는 물론 스마트 홈 기기까지도 이더넷으로 연결됩니다. 가정이나 사무실처럼 제한된 공간...

Jul 20, 2025
이더넷이란?

포스트 개발자 시대

원문: Josh W. Comeau, "The Post-Developer Era" 2년 전 2023년 3월, "프런트엔드 개발의 종말"이라는 제목의 블로그 글을 발행했습니다. 이는 OpenAI가 GPT-4 쇼케이스를 발표한 직후였고, 당시 업계 분위기는 머지않아 인간 소프트웨어 개발자는 필요 없어지고 앞으로는 소프트웨어 개발을 AI가 전담하게 될 것이라는 전망이 지배적이었습니다. 저는 이런 주장에 회의적이었고 그 블로그 글에서 소프트웨어 개발...

Jul 10, 2025
포스트 개발자 시대

널리 사용되는 네트워크 프로토콜

원문: Subham Datta, "Popular Network Protocols" 1. 개요 이 튜토리얼에서는 가장 널리 사용되고 인기 있는 네트워크 프로토콜들을 소개합니다. 2. 네트워크 프로토콜 소개 의사소통과 정보 교환은 현대 사회에서 가장 중요하고 강력한 역량입니다. 컴퓨터 네트워킹이란 여러 대의 컴퓨터와 장치를 케이블이나 위성을 통해 서로 연결하여, 거리와 상관없이 정보·자원·데이터베이스 등을 공유할 수 있게 하는 것을 말합니다. 네...

Jun 20, 2025
널리 사용되는 네트워크 프로토콜

커맨드 라인에 편해지는 법

원문: Julia Evans, "What helps people get comfortable on the command line?" 가끔 커맨드 라인을 써야 하는 친구들과 이야기하다 보면 많은 이들이 여전히 터미널을 두려워하고 있다는 걸 느낍니다. 그럴 때마다 어떤 조언을 할지 잘 모르겠더라고요. 저는 워낙 오래전부터 터미널을 써왔기 때문이죠. 그래서 Mastodon에 이렇게 물어봤습니다. 최근 1~3년 사이에 터미널 공포(?)를 극복한 분...

Jun 10, 2025
커맨드 라인에 편해지는 법
C

CodeSnap

84 posts

한국어로 전달하는 웹 개발 번역 매거진