NestJS로 회원가입 구현하기

임홍원·2022년 3월 15일
0

회원가입 구현하기 전에 알고있어야 할 것

  1. DB를 사용하려면 DI(Dependency Injection)을 해 주어야한다
  2. DB에서 테이블은 Entity이다.
  3. Entity에 쿼리를 날려주는 Class가 Repository이다.
  4. NestJS는 Module -> Controller -> Service -> Repository -> Entity 이렇게 실행된다 (이러한 구조를 가지고 있음)
  5. Post로 단순히 데이터를 보낼때는 DTO에서 검증하거나 서비스에서 검증할 수 있음 (혹은 컨트롤러)
  6. Repository 패턴에서는 TypeOrmModule을 꼭 주입해주어야함

users.controller.ts

export class UsersController {
  constructor(private usersService: UsersService) {}
    @ApiOperation({ summary: '회원가입' })
    @Post()
    join(@Body() body: JoinRequestsDto) {
        this.usersService.join(body.email, body.nickname, body.password);
        return undefined;
    }
}

회원가입 부분은 단순하게 POST API를 통해 DTO로 데이터를 보낸다


join.request.dto.ts

import { PickType } from '@nestjs/swagger';
import { Users } from 'src/entities/Users';

export class JoinRequestsDto extends PickType(Users, [
    'email',
    'nickname',
    'password',
] as const) {}

Nest 공식문서에서 PickType을 살펴보면,

export class JoinRequestsDto {
  @ApiProperty()
  email: string;

  @ApiProperty()
  nickname: string;
}

일일히 이렇게 type을 지정하지 않아도 Nest가 Entity에서 찾아서 type을 매핑해준다.


users.service.ts

@Injectable()
export class UsersService {
    constructor(
        @InjectRepository(Users)
        private usersRepository: Repository<Users>,
    ) {}
  
    getUser() {}
    async join(email: string, nickname: string, password: string) {
        const user = await this.usersRepository.findOne({ where: { email } });
        if (!email) {
            throw new Error('이메일이 없습니다.');
        }
        if (!nickname) {
            throw new Error('닉네임이 없습니다.');
        }
        if (!password) {
            throw new Error('비밀번호가 없습니다.');
        }
        if (user) {
            return;
        }
        const hashedPassword = await bcrypt.hash(password, 12);
        await this.usersRepository.save({
            email,
            nickname,
            password: hashedPassword,
        });
    }
}

서비스단에선 Repository 패턴을 이용하여 join api를 이용해
save를 이용하여 db에 저장한다.
여기서 Repository 패턴을 이용하기위해선 DI가 필수적이다.
DI는 constructor에서 해 주어야 한다.
여기서 InjectRepository 데코레이터를 통해 Users 엔티티와 userRepository를 UsersService에 주입하였다.


users.module.ts

import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Users } from 'src/entities/Users';

@Module({
    imports: [TypeOrmModule.forFeature([Users])],
    providers: [UsersService],
    controllers: [UsersController],
})
export class UsersModule {}

마지막으로 모듈에서 TypeOrmModule.forFeature 메서드를 사용하여 Users Repository를 Nest에 알려준다.


정상적으로 잘 동작되는것을 알 수 있음.

0개의 댓글