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로 데이터를 보낸다
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을 매핑해준다.
@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에 주입하였다.
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에 알려준다.
정상적으로 잘 동작되는것을 알 수 있음.