ABOUT ME

Today
Yesterday
Total
  • Nest.js 모듈 생성(추가) 퀵가이드
    Nest.js 2025. 3. 5. 08:58

    * 개요

    - Nest.js 에서는 명령어 기반으로 모듈을 추가 할 수 있다.

    - 추가 해야 하는 모듈은 3가지가 있다. (module, controller, service)

    - 레포지토리는 별도로 구성 하지 않고 서비스에 선언해서 사용한다. --> nest 버전이 높으면 deprecate 경고가 나오더라.

     

    1. 모듈 생성 명령어

    - auth 라는 이름의 모듈 생성 예시

    // 모듈 생성
    nest g module auth
    
    // 컨트롤러 추가
    nest g controller auth --no-spec
    
    // 서비스 추가
    nest g service auth --no-spec

     

    2. DB 엔터티 생성

    - user 1 : Many boards 관계

    // 엔티티 생성 src/entity/user/user.entity.ts
    
    import {
      BaseEntity,
      Column,
      Entity,
      OneToMany,
      PrimaryGeneratedColumn,
      Unique,
    } from 'typeorm';
    import { Board } from 'src/boards/entity/board.entity';
    
    @Entity()
    @Unique(['email'])
    export class User extends BaseEntity {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      username: string;
    
      @Column()
      password: string;
    
      @Column()
      email: string;
    
      @OneToMany(() => Board, (board) => board.user, { eager: true })
      boards: Board[];
    }
    // src/boards/board.entity.ts
    
    import {
      BaseEntity,
      Column,
      Entity,
      ManyToOne,
      PrimaryGeneratedColumn,
    } from 'typeorm';
    import { BoardStatus } from '../../boards/board-status-enum';
    import { User } from 'src/auth/entity/user.entity';
    
    @Entity()
    export class Board extends BaseEntity {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      title: string;
    
      @Column()
      description: string;
    
      @Column()
      status: BoardStatus;
    
      @ManyToOne(() => User, (user) => user.boards, { eager: false })
      user: User;
    }

     

    3. 레포지토리

    - 레포지토리 선언

    // 리파지토리 설정 (in service)
    // src/auth/auth.service.ts
    
    import { Injectable } from '@nestjs/common';
    import { User } from 'src/entity/user/user.entity';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    
    @Injectable()
    export class AuthService {
      constructor(
        @InjectRepository(User)
        private userRepository: Repository<User>,
      ) {}
    }

    - 모듈에 레포 추가

    // module 에 리파지토리 설정
    // src/auth/auth.module.ts
    
    import { Module } from '@nestjs/common';
    import { AuthController } from './auth.controller';
    import { AuthService } from './auth.service';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { User } from 'src/entity/user/user.entity';
    
    @Module({
      imports: [TypeOrmModule.forFeature([User])],
      controllers: [AuthController],
      providers: [AuthService],
    })
    export class AuthModule {}

    4. dto 생성

    // dto 생성
    // src/auth/dto/auth-credential.dto.ts
    
    export class AuthCredentialDto {
      username: string;
      password: string;
    }

    5. 컨트롤러 구현

    // 컨트롤러 구현
    // src/auth/auth.controller.ts
    import {
      Controller,
      Post,
      ValidationPipe,
      Body,
      UsePipes,
    } from '@nestjs/common';
    import { AuthCredentialDto } from './dto/auth-credential.dto';
    import { AuthService } from './auth.service';
    import { User } from 'src/entity/user/user.entity';
    
    @Controller('auth')
    export class AuthController {
      constructor(private authService: AuthService) {}
    
      @Post()
      @UsePipes(ValidationPipe)
      createUser(@Body() authCredentialDto: AuthCredentialDto): Promise<User> {
        return this.authService.createUser(authCredentialDto);
      }
    }

    6. 서비스 구현

    // 서비스 구현
    // src/auth/auth.service.ts
    import { Injectable } from '@nestjs/common';
    import { User } from 'src/entity/user/user.entity';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import { AuthCredentialDto } from './dto/auth-credential.dto';
    @Injectable()
    export class AuthService {
      constructor(
        @InjectRepository(User)
        private userRepository: Repository<User>,
      ) {}
    
      async createUser(authCredentialDto: AuthCredentialDto): Promise<User> {
        const { username, password } = authCredentialDto;
        const user = this.userRepository.create({ username, password });
        await this.userRepository.save(user);
        return user;
      }
    }

    'Nest.js' 카테고리의 다른 글

    Nest.js 로그  (0) 2025.02.26
    Nest.js 에서의 Pipe  (0) 2025.02.12
Designed by Tistory.