검색
검색
공개 노트 검색
회원가입로그인
TypeScript Express 서버: 기초에서 프로덕션까지

12장: 익스프레스 애플리케이션 테스트하기 (단위 및 통합 테스트)

익스프레스 애플리케이션 테스트의 시작

TypeScript와 Express로 개발한 서버가 실제 현장에서 신뢰를 얻기 위해 가장 중요한 과정 중 하나는 바로 테스트입니다. 단위(unit)와 통합(integration) 테스트는 코드가 의도대로 동작함을 보장해 주며, 유지보수와 확장에도 절대적인 역할을 합니다. 실전 서비스에선 사소한 API의 변화도 사용자 경험에 큰 영향을 미치기에, 테스트는 개발만큼이나 필수적인 작업입니다.

단위 테스트란 무엇인가?

단위 테스트는 최소 기능 단위, 즉 함수 하나나 메서드 수준에서 동작을 검증하는 과정입니다. 예를 들면 컨트롤러의 특정 메서드가 주어진 입력에 대해 예상한 출력을 돌려주는지를 확인합니다. TypeScript Express 프로젝트에선 Jest와 같은 프레임워크가 주로 활용됩니다. Jest는 실행이 빠르고 TypeScript와의 호환성이 좋아, 테스트 코드 유지가 용이합니다.

컨트롤러, 서비스, 그리고 미들웨어 각 단계에서 단위 테스트를 적용하면, 작은 논리 오류부터 데이터 타입의 실수까지 조기에 발견할 수 있습니다. 서비스 계층의 비즈니스 로직을 외부 데이터베이스 의존성 없이 직접 테스트함으로써, 외부 환경 변화와 관계없이 안정성을 확보하는 것이 핵심입니다.

통합 테스트, 기능 전체의 흐름 점검

통합 테스트는 단일 컴포넌트를 넘어 여러 계층이 연동된 전체 동작에 초점을 맞춥니다. 예를 들어, 실제 API 엔드포인트 호출 시 요청이 라우팅을 거쳐 컨트롤러·서비스·DB까지 무리 없이 흘러가는지 점검합니다. supertest와 같은 라이브러리로 Express 서버를 직접 구동한 뒤, HTTP 요청과 응답 전체를 체크할 수 있습니다.

이 과정에서 Fake 또는 테스트용 데이터베이스를 활용하면 실제 운영 데이터에 영향 없이 다양한 상황을 시뮬레이션할 수 있습니다. 통합 테스트는 단위 테스트에서 놓칠 수 있는, 계층 간 의사소통 오류나 모듈 결합 문제를 조기에 걸러줍니다.

TypeScript 테스트 환경 구축 방법

테스트 설정은 명확하게 분리해야 관리가 쉽습니다. 별도의 테스트 데이터베이스와 환경 변수 파일(.env.test 등)을 두고, ts-jest 또는 babel-jest로 TypeScript 코드를 바로 테스트할 수 있습니다.

Jest 설정 예시는 다음과 같습니다.

{
  "preset": "ts-jest",
  "testEnvironment": "node",
  "roots": ["<rootDir>/src"],
  "globals": {"ts-jest": {"isolatedModules": true}}
}

테스트 커버리지는 필수는 아니지만, 주요 로직과 API에 대한 미달 범위를 파악하는 데 큰 도움을 줍니다.

실전 테스트 코드: 예시와 팁

Controller 단위 테스트에서는 서비스와 DB를 mock 처리해 독립적인 함수 검증에 집중합니다. 통합 테스트에선 실제 라우터와 미들웨어를 그대로 적용해, 엔드 투 엔드 품질을 점검합니다. 시작과 종료 시 테스트 전용 서버와 데이터베이스를 적절히 생성·파괴하는 절차도 빼놓지 않아야 합니다.

코드 예시:

// 예: 단위 테스트에서 서비스 모듈 mocking
jest.mock('../services/userService');

import { getUserById } from '../controllers/userController';

// ...생략
// 예: supertest로 API 응답 확인
import request from 'supertest';
import app from '../app';

describe('GET /api/users', () => {
  it('200 응답 및 유저 리스트 반환', async () => {
    const res = await request(app).get('/api/users');
    expect(res.status).toBe(200);
    expect(Array.isArray(res.body)).toBeTruthy();
  });
});

프로덕션 품질을 위한 테스트 습관

테스트는 프로젝트 규모와 상관없이 빠질 수 없습니다. 코드 리팩터링 전후, 기능 추가나 외부 라이브러리 업그레이드 시에도 즉각적인 품질 검증이 가능해야 합니다. CI(지속적 통합) 서버에 테스트를 자동화하면, 실수로 인한 장애 가능성을 획기적으로 낮출 수 있습니다.

TypeScript Express 서버는 올바른 테스트 체계 덕분에 단단한 기반 위에서 성장할 수 있습니다. 단위와 통합, 두 가지 테스트 전략을 나란히 채택하면, 변화와 성장 속에서도 서비스의 신뢰성이 지켜집니다.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기