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

11장: 데이터베이스 연동 (예: PostgreSQL, MongoDB)

데이터베이스 통합의 중요성

현대적인 서버 개발에서 데이터베이스 연동은 반드시 거쳐야 하는 단계입니다. Express와 TypeScript 조합의 서버도 데이터 저장과 처리 없이는 실질적인 서비스라 부를 수 없습니다. 데이터베이스를 어떻게 효율적으로, 그리고 안전하게 통합하느냐가 서버의 신뢰성과 성능을 좌우합니다. 이번 장에서는 대표적인 관계형 데이터베이스인 PostgreSQL과 NoSQL 데이터베이스인 MongoDB를 Express 서버에 연동하는 방법, 그리고 실전에서 자주 활용되는 ORM과 ODM에 대해 다룹니다.

PostgreSQL과 TypeScript Express 서버 연동하기

PostgreSQL은 명확한 데이터 구조와 ACID 트랜잭션 지원으로 널리 사랑받는 오픈소스 관계형 데이터베이스입니다. 가장 효율적으로 TypeScript Express 프로젝트에 통합하려면, ORM(Object-Relational Mapping) 도구를 사용하는 방법이 주류입니다. Prisma는 TypeScript와의 궁합이 뛰어난 ORM입니다.

Prisma를 사용할 경우, 데이터 모델을 Prisma Schema 파일로 선언하고, CLI로 마이그레이션을 적용해 DB 구조를 자동 반영할 수 있습니다. 다음은 실전적인 연동 흐름입니다.

  1. 프로젝트에 Prisma, PostgreSQL 드라이버 설치:

npm install @prisma/client
npm install -D prisma
npm install pg
  1. Prisma 초기화 및 DB 연결 설정:

npx prisma init

생성된 .env 파일에 데이터베이스 연결 정보를 입력합니다.

  1. Prisma 스키마 파일(prisma/schema.prisma)에서 모델을 타입으로 선언합니다. 예를 들어, User 모델은 다음처럼 간결하게 정의할 수 있습니다:

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}
  1. 마이그레이션 명령어로 스키마를 실데이터베이스에 반영:

npx prisma migrate dev --name init
  1. Express 서버에서 Prisma Client를 사용하여 타입 안전하게 DB에 접근합니다:

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

// 사용자 생성 예시
await prisma.user.create({ data: { name: '홍길동', email: 'hong@test.com' } });

Prisma의 장점은 코드 자동완성, 에러 감지 등 타입의 강점을 최대한 활용할 수 있다는 것입니다. 코드상에서 바로 데이터 모델을 확인하고 변경사항을 관리할 수 있어 개발과 유지보수가 편리합니다.

MongoDB와 TypeScript Express 서버 연동하기

MongoDB는 스키마 없는 문서형 NoSQL 데이터베이스입니다. 유연한 구조 덕분에 빠른 서비스 프로토타이핑 및 대량 데이터 처리에 강점을 지닙니다. Typescript와 Express 서버에서 MongoDB를 다뤄야 한다면, Mongoose ODM(Object Data Modeling)의 도입이 일반적입니다.

  1. 의존성 설치

npm install mongoose
npm install -D @types/mongoose
  1. Mongoose를 이용한 DB 연결 및 스키마 정의:

import mongoose, { Schema, Document } from 'mongoose';

const uri = process.env.MONGO_URI || '';
mongoose.connect(uri);

// 타입 선언
interface IUser extends Document {
  name: string;
  email: string;
}

// 스키마와 모델 선언
const UserSchema = new Schema<IUser>({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
});
const UserModel = mongoose.model<IUser>('User', UserSchema);
  1. 사용자 생성 예시:

const user = new UserModel({ name: '홍길동', email: 'hong@test.com' });
await user.save();

Mongoose는 문서 모델에 타입을 더해 코드의 신뢰성을 높이고, MongoDB의 유연한 스키마 특성도 함께 활용할 수 있게 해줍니다.

실전에서의 데이터베이스 사용 베스트 프랙티스

  • 환경 변수에 데이터베이스 접속 정보를 저장하고, 소스 코드에 하드코딩하는 실수를 피합니다.

  • 커넥션 풀을 활용하여 다수의 요청 상황에서도 성능 저하 없이 안정적으로 서비스를 제공합니다.

  • 데이터베이스 드라이버와 ORM/ODM 각각의 타입 지원 수준을 반드시 확인하고, 타입 안전성을 최우선으로 고려합니다.

  • DB 관련 코드는 별도의 서비스 계층으로 분리하면, 유지보수성과 테스트 용이성이 크게 향상됩니다.

  • 자동 마이그레이션이나 스키마 버전 관리 툴을 도입하여 데이터 구조 변경에 유연하게 대응합니다.

마치며

TypeScript Express 서버의 데이터베이스 통합은 단순한 연동을 넘어, 타입 안정성과 직관적인 코드 작성을 실현하는 관문입니다. 적합한 ORM/ODM 도구를 선택하고, TypeScript의 타입 강점을 십분 활용한다면, 확장성과 견고함을 모두 갖춘 서버를 손쉽게 완성할 수 있습니다.


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