모듈 연결과 실행
프로젝트·파일·폴더 모듈을 AppModule에 등록하고 NestJS 서버를 실행합니다.
Project, File, Folder Modules
각 기능을 모듈로 묶고 AppModule에 등록합니다.
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 {}// 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에서 File과 Folder 엔티티를 관리하고 있으므로, 별도의 모듈은 당장 필요 없습니다.
하지만 DDD 관점에서 나중에 파일과 폴더를 자체 도메인으로 분리할 때 유용합니다.
AppModule에 ProjectModule 등록
src/app.module.ts에 ProjectModule을 임포트합니다.
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 프로젝트 초기 설정과 데이터베이스 설정을 중심으로 정리한 보조 다이어그램입니다.
AppModule은 ConfigModule.forRoot, TypeOrmModule.forRoot, AuthModule, ProjectModule을 가져옵니다. ProjectModule은 Project·File·Folder의 저장소와 ProjectController, ProjectService를 등록하고 ProjectService를 내보냅니다.
- AppModule —
imports- ConfigModule.forRoot
환경 파일 선택 ·
isGlobal: true - TypeOrmModule.forRoot
PostgreSQL ·
synchronize: trueentities: User, Project, File, Folder - AuthModule
앞 절의 사용자 인증 모듈
- ProjectModule
imports:TypeOrmModule.forFeature로 Project, File, Folder 등록controllers: ProjectControllerproviders: ProjectServiceexports: ProjectService
- ConfigModule.forRoot
forFeature는 TypeOrmModule.forFeature입니다. 현재 File·Folder도 ProjectModule에서 등록하며, 별도 FileModule·FolderModule은 분리하지 않았습니다.