본문으로 건너뛰기

안동민 개발노트

본문 시작
13장 : 실전 프로젝트백엔드 API 구현

모듈 연결과 실행

프로젝트·파일·폴더 모듈을 AppModule에 등록하고 NestJS 서버를 실행합니다.

Project, File, Folder Modules

각 기능을 모듈로 묶고 AppModule에 등록합니다.

src/project/project.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Project } from './entities/project.entity';
import { ProjectService } from './project.service';
import { ProjectController } from './project.controller';
import { File } from '../file/entities/file.entity'; // File 엔티티 임포트
import { Folder } from '../folder/entities/folder.entity'; // Folder 엔티티 임포트

@Module({
  imports: [
    TypeOrmModule.forFeature([Project, File, Folder]), // 프로젝트, 파일, 폴더 엔티티 등록
  ],
  controllers: [ProjectController],
  providers: [ProjectService],
  exports: [ProjectService], // 필요한 경우 ProjectService 내보내기
})
export class ProjectModule {}
src/file/file.module.ts (현재는 ProjectModule에 통합되어 있으므로, 추후 분리 시 사용)
// import { Module } from '@nestjs/common';
// import { TypeOrmModule } from '@nestjs/typeorm';
// import { File } from './entities/file.entity';
// @Module({
//   imports: [TypeOrmModule.forFeature([File])],
//   providers: [],
//   exports: [],
// })
// export class FileModule {}

마찬가지로 folder.module.ts도 만듭니다.

현재는 ProjectModule에서 FileFolder 엔티티를 관리하고 있으므로, 별도의 모듈은 당장 필요 없습니다.

하지만 DDD 관점에서 나중에 파일과 폴더를 자체 도메인으로 분리할 때 유용합니다.

AppModule에 ProjectModule 등록

src/app.module.tsProjectModule을 임포트합니다.

src/app.module.ts (최종 수정)
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';
import { ProjectModule } from './project/project.module'; // ProjectModule 임포트
import { User } from './auth/entities/user.entity'; // 엔티티 추가
import { Project } from './project/entities/project.entity'; // 엔티티 추가
import { File } from './file/entities/file.entity'; // 엔티티 추가
import { Folder } from './folder/entities/folder.entity'; // 엔티티 추가

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV === 'development' ? '.env.development' : '.env' }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DATABASE_HOST,
      port: parseInt(process.env.DATABASE_PORT, 10),
      username: process.env.DATABASE_USERNAME,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      entities: [User, Project, File, Folder], // 모든 엔티티 등록
      synchronize: true,
      logging: ['query', 'error'],
    }),
    AuthModule,
    ProjectModule, // ProjectModule 등록
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

주의: entities 배열에 모든 엔티티를 명시적으로 추가해야 TypeORM이 해당 엔티티를 인식하고 테이블을 생성합니다.


NestJS 애플리케이션 실행

이제 NestJS 애플리케이션을 실행하고 API를 테스트할 수 있습니다.

npm run start:dev

서버가 3000번 포트에서 실행되면, Postman이나 Insomnia 같은 API 클라이언트를 사용하여 구현한 API를 테스트할 수 있습니다.

테스트 시나리오

POST /auth/register로 사용자 회원가입 (이메일, 비밀번호)

POST /auth/login으로 로그인 (회원가입한 이메일, 비밀번호) -> accessToken 받기

GET /auth/profile로 프로필 조회 (Header: Authorization: Bearer <accessToken>)

POST /projects로 새 프로젝트 생성 (Header: Authorization: Bearer <accessToken>, Body: { "name": "My First Project" })

GET /projects로 내 프로젝트 목록 조회 (Header: Authorization: Bearer <accessToken>)

GET /projects/:projectId로 특정 프로젝트 상세 조회

POST /projects/:projectId/files로 파일 생성

GET /projects/:projectId/files/:fileId로 파일 내용 조회

PATCH /projects/:projectId/files/:fileId/content로 파일 내용 업데이트 (아직 실시간 아님)

실전 구현 단계에서는 각 모듈이 어떤 경계 계약을 책임지는지 먼저 고정하면, 인증과 파일 관리 API를 확장할 때 권한 누락과 데이터 불일치를 줄일 수 있습니다.


이번 절에서는 온라인 코드 에디터 프로젝트의 백엔드 API를 구축하는 초기 단계를 진행했습니다.

사용자 인증, 프로젝트 및 파일/폴더 관리를 위한 기본 RESTful API를 TypeORM, Passport-JWT를 활용하여 구현했습니다.

다음 절에서는 이 백엔드 위에 프로젝트의 핵심 기능인 실시간 협업 기능(WebSocket)을 구현하는 방법에 대해 알아보겠습니다.

NestJS 프로젝트 초기 설정과 데이터베이스 설정을 중심으로 정리한 보조 다이어그램입니다.