[typescript] 타입스크립트로 마이크로서비스 아키텍처의 API 게이트웨이 구현하기

마이크로서비스 아키텍처에서는 여러 개의 서비스가 상호작용하므로 API 게이트웨이는 중요한 역할을 합니다. 이 게이트웨이는 클라이언트와 서버 간의 통신을 관리하고 보안, 로깅, 인증, 부하 분산 등의 기능도 제공합니다. 이번 포스트에서는 타입스크립트로 간단한 API 게이트웨이를 구현하는 방법에 대해 살펴보겠습니다.

시작하기 전에

이 튜토리얼을 따라하려면 Node.js를 설치해야 합니다. 또한, 타입스크립트 컴파일러인 tsc도 설치해야 합니다. 아직 설치되어 있지 않은 경우 아래의 명령어를 사용하여 설치할 수 있습니다.

npm install -g typescript

프로젝트 설정

먼저, 새로운 디렉토리를 만들고 그 안에서 다음 명령어를 사용하여 package.json 파일을 생성합니다.

npm init -y

그런 다음, 프로젝트에 필요한 의존성 패키지를 설치합니다.

npm install express axios
npm install @types/express @types/axios typescript ts-node nodemon -D

코드 작성

API 게이트웨이 서버 구현

다음으로, API 게이트웨이 서버를 만들기 위해 index.ts 파일을 생성하고 다음과 같이 작성합니다.

import express from 'express';
import axios from 'axios';

const app = express();
const PORT = 3000;

app.use(express.json());

app.all('/api/*', async (req, res) => {
  try {
    const response = await axios({
      method: req.method as any,
      url: `http://microservice1/${req.params[0]}`,
      data: req.body,
      headers: req.headers,
    });
    res.status(response.status).json(response.data);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(PORT, () => {
  console.log(`API Gateway is running at http://localhost:${PORT}`);
});

위의 코드는 Express를 사용하여 API 게이트웨이 서버를 구현한 것입니다. 클라이언트에서의 모든 API 요청('/api/*')은 해당하는 마이크로서비스로 포워딩됩니다.

마이크로서비스 구현

간단한 마이크로서비스 예시로, microservice1/index.ts 파일을 생성하고 다음과 같이 작성합니다.

import express from 'express';

const app = express();
const PORT = 4000;

app.use(express.json());

app.put('/resource', (req, res) => {
  // 마이크로서비스의 비즈니스 로직
  res.status(200).json({ message: 'Resource created successfully' });
});

app.listen(PORT, () => {
  console.log(`Microservice 1 is running at http://localhost:${PORT}`);
});

타입스크립트 코드 컴패일 및 실행

각 서버의 코드를 작성한 후에는 다음 명령어를 사용하여 타입스크립트 코드를 컴패일하고 실행할 수 있습니다.

npx tsc --init
npx tsc --watch
npx nodemon index.js

이제 API 게이트웨이를 통해 클라이언트는 마이크로서비스에 액세스할 수 있습니다.

결론

이를 통해 타입스크립트와 Express를 사용하여 간단한 API 게이트웨이 및 마이크로서비스를 구현하는 방법에 대해 알아보았습니다. API 게이트웨이와 마이크로서비스의 복잡성이 증가함에 따라 보다 강력하고 안전한 아키텍처를 구현하기 위한 추가 기능을 고려해볼 수 있습니다.

참고문헌: