JWT 로그인 및 검증 구현해보기 + RESTful API (Plain)

1. entity mapping

src/user/entities/user.entity.ts

@Entity()
export class User extends BaseEntity {

  @Column({ unique: true, nullable: false })
  account: string;

  @Column({ nullable: false })
  password: string;

  @Column({ nullable: false })
  name: string;

  @Column({ unique: true, nullable: false })
  email: string;

  @Column()
  phone: string;

  @Column({ type: 'enum', enum: UserRole, default: UserRole.SILVER })
  role: UserRole;

  toResponse() {
    return new UserResponse(
      this.id,
      this.account,
      this.name,
      this.email,
      this.phone,
      this.role,
      this.createdAt,
      this.updatedAt,
    )
  }

}

src/user/entities/user.role.ts

export enum UserRole {
  VIP = 'ADMIN',
  GOLD = 'GOLD',
  SILVER = 'SILVER',
  FAMILY = 'FAMILY',
}

2. services 작성

jwt 발급을 위해 필요한 패키지를 받아줍니다

pnpm install @nestjs/jwt

password encode를 위해 필요한 패키지를 받아줍니다

pnpm install bcrypt

일단 서비스는 유저 저장과, 로그인, 조회만 작성해보도록 하겠습니다

src/user/user.service.ts

export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
    private readonly jwtService: JwtService,
  ) {}

  async create(request: UserSaveRequest) {
    const user = await request.toEntity();
    const resultUser = await this.userRepository.save(user);
    return resultUser.toResponse();
  }

  async signIn(request: UserSignInRequest) {
    const user = await this.userRepository.findOneBy({ account: request.account });
    await UserServiceUtil.checkValid(user, request.password);
    const token = await UserServiceUtil.getToken(this.jwtService, user.id);
    return UserSignInResponse.of(token);
  }
  
  async findUser(id: number) {
    const user = await this.userRepository.findOneBy({ id: id });
    return user.toResponse();
  }
}