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