본문으로 건너뛰기

안동민 개발노트

본문 시작

모듈 연결과 실행

프로젝트·파일·폴더 모듈을 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 프로젝트 초기 설정과 데이터베이스 설정을 중심으로 정리한 보조 다이어그램입니다.

단일 DataSource로 조립한 NestJS 모듈 그래프

DEPENDENCY GRAPH · COMPOSITION

루트는 조립하고 기능 모듈은 자신의 경계를 소유한다

AppModule이 검증된 환경과 단 하나의 TypeORM root 연결을 만든다. Auth, Workspace, Collaboration은 같은 DataSource와 principal 계약을 공유한다.

단일 DataSource로 조립한 NestJS 모듈 그래프 App Module 아래 Environment, Auth, Workspace, Collaboration 기능 모듈과 단 하나의 DataSource가 연결된 NestJS 의존성 그래프다. COMPOSITION ROOT AppModule imports only CONFIG Environment validated values FEATURE AuthModule principal + JWT FEATURE WorkspaceModule ownership + entries FEATURE Collaboration gateway + ACK ONE ROOT DataSource migration · transaction
  1. AppModule

    환경과 기능 모듈을 조립할 뿐 업무 규칙을 넣지 않습니다.

  2. Environment

    시작 시 설정을 검증하고 typed value를 제공합니다.

  3. AuthModule

    JWT와 최소 principal을 제공합니다.

  4. WorkspaceModule

    프로젝트·엔트리 권한과 원자 갱신을 소유합니다.

  5. CollaborationModule

    Workspace 규칙을 소켓 명령에 연결합니다.

  6. DataSource

    forRoot는 한 번이며 모든 저장소가 같은 migration을 봅니다.

화살표는 신뢰 또는 상태가 다음 경계로 이동하는 방향을 뜻합니다.