๐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ !!
PostgreSQL ์ค์น!!
์ฌ๋ฌ๋ถ ๋๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ์๊ฐ์ด ์์ต๋๋ค!!.
์ค์ ์ฐ์ตํ ๋๋ ๋ฐฐ์ด ๊ฐ์ ์์ ์ ์ธ ๋์ ๋ง๋ค๊ณ ๋์ ํ๊ธดํ์ง๋ง... ๋ฐ๋ก ์ฐ๊ฒฐํด๋ณด์ฃ !
์ ํฌ๋ Postgresql ์ ์ฌ์ฉํ ๊ฒ๋๋ค!! ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค!!
Postgresql ์ ์คํ์์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก SQL ํ์ค์ ์ ์ง์ํฉ๋๋ค. ์ผ๋จ ๋ฌด๋ฃ์ ๋๋ค!!
์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ ์ ๋ฌธ์๋ ํ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์. postgresql ์ค์น๋ฐฉ๋ฒ
ํธ์๋ฅผ ์ํด pgAdmin ํด์ ์ด์ฉํ์ฌ postgresql ์ ์ ์ดํ๊ฒ ์ต๋๋ค.!!
๊ธฐ์กด์ ์๋ฒ (PostgreSQL 13 ์ด๊ตฐ์ ์ ๋) ๋ฅผ ์ฐํด๋ฆญํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ญ์๋ค!!
์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ์ nest_blog ๋ผ๊ณ ํ์ต๋๋ค!!
์ํ์๋ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ์ ๋ ๊ด์ฐฎ์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง ๊ตฌ์กฐ์ ๋ํด์๋ ์์ง ์ ์ํ์ง ์๊ฒ ์ต๋๋ค. NestJS๊ฐ ํด์ค๊ฑฐ๊ฑฐ๋ ์!!
TypeORM !!
TypeORM ์ NodeJS ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ORM (Object Relational Mapping) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค!!
ORM ์ ๊ฐ๋จํ ๋งํด Object ๋ฅผ Database ์คํค๋ง์ ์ ์ ํ๊ฒ ์ ์ฉ์ํค๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐํ๋ฉด ํธํฉ๋๋ค.!!
์ค์น ์ค์น~ nestjs ๋ฃจํธ ํด๋์์ ๋ค์ ๋ช ๋ น์ด๋ก ์ค์นํด์ฃผ์ธ์ !!
$ npm install typeorm @nestjs/typeorm --save
์ค์น๊ฐ ๋ฌ์ผ๋ฉด ormconfig.json ์ด๋ผ๋ ํ์ผ์ ๋ฃจํธ ํด๋์ ๋ง๋ค์ด ์ค๋๋ค.
๋์ค์ TypeORM ๋ชจ๋์ด ์ด ํ์ผ์ ์ฐธ๊ณ ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ ์๋ํฉ๋๋ค!!
๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํด์ฃผ์ธ์!!
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": ์ฌ๋ฌ๋ถ์ด ์ค์ ํ๋ ๋น๋ฐ๋ฒํธ!,
"database": "nest_blog",
"entities": ["dist/**/**.entity{.ts,.js}"],
"synchronize": true
}
- type : ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ฒ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋ํ๋ ๋๋ค.
- host : db ์ฐ๊ฒฐ ์ฃผ์์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก localhost ๋ฅผ ์ด์ฉํ๊ณ db ๋ฅผ ๋ค๋ฅธ ๋จธ์ ์์ ์คํํ๋ค๋ฉด ๊ทธ ๋จธ์ ์ ์ ์ํ๊ธฐ ์ํ ์ฃผ์๋ก ๋ณ๊ฒฝํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
- port : db ์ฐ๊ฒฐ ํฌํธ ์ ๋๋ค. ๊ธฐ๋ณธ์ 5432 ์ ๋๋ค.
- username : ๋ณ ๋ค๋ฅธ ์ค์ ์ ์ํ๋ค๋ฉด postgres ์ ๋๋ค
- password : ์ค์น ๊ณผ์ ์์ ์ค์ ํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ธ์.
- database : ์์์ ๋ง๋ค์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ์ ๋ ฅํ์๋ฉด ๋ฉ๋๋ค. ์ ๋ nest_blog ๋ผ๊ณ ํ์ต๋๋ค.
- entities : ๋ฐ๋์ dist ์๋์ ํด๋๋ก ์ง์ ํด์ฃผ์ธ์. ์๊ทธ๋ฌ๋ฉด ์ค๋ฅ๋ ์๋ ์์ต๋๋ค. ์ด ์ค์ ์ ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ์ฐธ๊ณ ํ์ฌ DB ์์ ์คํค๋ง๋ฅผ ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
- synchronize : ์ด ์ค์ ์ true ๋ก ํ์๋ฉด ์ฑ ์๋์ DB ์คํค๋ง๊ฐ ์๋์ผ๋ก ์์ฑ๋๊ฒ ๋ฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ormconfig ํ๋ฐฉํ๊ธฐ!! ์ ์ฐธ์กฐํด์ฃผ์ธ์~
app ๋ชจ๋์์ import !! ๊ทธ๋ฆฌ๊ณ ์คํ!!
์ ์ด์ app.moudle.ts ํ์ผ๋ก ๊ฐ์ TypeOrmMoudle ์ import ํด์ค์๋ค!!
@Module({
imports: [UsersModule, TypeOrmModule.forRoot()],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ormconfig.json ํ์ผ์ ์์ฑํ์ง ์์๋ค๋ฉด, forRoot ํจ์ ์์ ์ค์ ๋ด์ฉ์ ์ ์ผ์
์ผ ํฉ๋๋ค.!!
ํ์ผ๋ก ๊ด๋ฆฌํ๋๊ฒ ๋ ํธํ๊ฒ ์ฃ ~?
์ ์ด์ ๋ฃจํธ ํด๋์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ํํด๋ด ์๋ค!
$ npm run start
๋ณ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ์๋ค๋ฉด ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ ๋๊ฒ๋๋ค!! ์ฐ๋ผํ!!!
์ ํฌ๋ ์์ง Entity์ ๋ํด์ ์ค์ ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ
์ด๋ธ์ ๋ณ ๋ด์ฉ์ ์์ต๋๋ค.
์ดํ์ Entity ๋ฅผ ๋ง๋ ํ์๋ DB ์์ ํ ์ด๋ธ์ ์ญ์ ํ๊ณ ๋ค์ ์ฐ๊ฒฐํด์ฃผ์๋ฉด ๋ง๋ ๋ด์ฉ์ด ์ ์ฉ๋ฉ๋๋ค!
๐ด User Entity ๋ง๋ค๊ธฐ.
ํก.
DB ๋ ์ฐ๊ฒฐํ๊ฒ ๋ค.
ํกํก.
User Entity Template ๋ ์์ฑํ๊ฒ ๋ค.
ํกํก.
๋ด์ฉ๋ง ๋ฃ์ผ๋ฉด ๋๋ค?
์ง!
src/users ์์ ๊ตฌ์กฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํด์ฃผ์ธ์!!
spec ํ์ผ๋ค์ ์ง๊ธ ์์ด๋ ๋ฉ๋๋ค.
users
โ users.repository.ts
โ users.controller.spec.ts
โ users.controller.ts
โ users.entity.ts
โ users.module.ts
โ users.service.spec.ts
โ users.service.ts
โ
โโdto
create-user.dto.ts
index.ts
update-user.dto.ts
์ฐ๋ฆฌ๋ User ์ ์๊ตฌ์ฌํญ ๋ง๊ฒ ์ ์ ํ Entity ๋ฅผ ์ค๊ณํด์ผ ํฉ๋๋ค. ์๋๋ฉด ์ด ์์ ์๋ ๋ด์ฉ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์คํค๋ง๋ก ์ ์ฉ๋ ๋ ์๋ค์ด๊ฑฐ๋ ์!!
๋ฐ๋ก ๋ชจ๋ ์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๊ธฐ๋ ๋ณต์กํ๋ ํ ์ ์๋๊ฑฐ ๋จผ์ ์ฑ์ ๋๊ฐ์๋ค!!
users.entity.ts ์์ ๋ค์๊ณผ ๊ฐ์ด ์ฑ์์ฃผ์ธ์!!
import { BeforeInsert, Column, Entity, PrimaryGeneratedColumn } from "typeorm";
import * as argon2 from "argon2";
@Entity("user")
export class UserEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 32 })
username: string;
@Column({ unique: true })
email: string;
@Column()
password: string;
@BeforeInsert()
async hashPassword() {
this.password = await argon2.hash(this.password);
}
@Column({ default: "" })
imageLink: string;
}
- @Entity : ์ด annotation ์ด ์์ผ๋ฉด nestjs๊ฐ ๋ณด๊ณ ์๋ค๊ฐ DB ์คํค๋ง ์ ์ฉ์ ์ํด ์ฐธ๊ณ ํ๊ฒ ๋ฉ๋๋ค!! ์ดํ repository ํด๋์ค์์๋ ์ฐธ๊ณ ํ ์ ์๋ ํด๋์ค๊ฐ ๋ฉ๋๋ค. ๊ดํธ์์ ๋ฃ์ ๋ด์ฉ์ด ํ ์ด๋ธ์ ์ด๋ฆ์ด ๋ฉ๋๋ค.
- PrimaryGeneratedColumn : ์ด annotion์ด ์๋ค๋ฉด ์ด ํ ์ด๋ธ์ ํด๋น ํ๋๊ฐ primary key ๊ฐ ๋ฉ๋๋ค. ๊ดํธ ์์ ์๋ฌด๋ฐ ๋ด์ฉ์ ๋ฃ์ง ์์ผ๋ฉด id ๋ auto increment ๊ฐ ์ ์ฉ๋ฉ๋๋ค.uuid vs auto increment
- Column : ์ด annotion ์ด ์์ผ๋ฉด ํ ์ด๋ธ์ ํ๋๋ก ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค. ๊ดํธ ์์ ์ฌ๋ฌ ์ต์ ์ ๋ฃ์ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ดํธ ์์ ์ต์ ๋ณด๊ธฐ
- BeforeInsert : ์ ๋ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ insert ํ๊ธฐ ์ ์ ์ํ๋๋ ๋ ์์ ๋๋ค. ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณตํธํ ํ ์ ์๊ฒ hash ํจ์๋ฅผ ์ด์ฉํด ์ ์ฅํฉ์๋ค.
์์ฐธ ํด์ฌ ํจ์๋ฅผ ์ฐ๊ธฐ ์ํด argon2 ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
$ npm install argon2 --save
๐จ Repository ์ Dto ๋ณ๊ฒฝํ๊ธฐ!
Repository
Repository ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ Entity ๋ฅผ ๊ด๋ฆฌ(insert, update, delete, load, etc.)ํด์ค ๋ ์์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
users.repository.ts ์์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ฑ์์ฃผ์ธ์!!
import { EntityRepository, Repository } from "typeorm";
import { UserEntity } from "./users.entity";
@EntityRepository(UserEntity)
export class UserRepository extends Repository<UserEntity> {}
์ฅ? ์ด๊ฒ๋ง ํด๋ ๋๋๊ฑด๊ฐ??
- ๋ค!!
์ด๋ ๊ฒ Repository ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ฉด UserEntity์ ๋ํด ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฅ ์ธ ์ ์์ต๋๋ค.
๋ณต์กํ ์ฟผ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ง๋ค์ด์ฃผ์
๋ ๋๊ณ ์ดํ ๋์ฌ query builder ๋ก ํด๋น ํด๋์ค์์ ์ฐ์
๋ ๋ฉ๋๋ค!
DTO
DTO(Data Transfer Object) ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ก ์ ์ก๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํด๋์ค ์ ๋๋ค.
dto ํด๋ ์์
create-user.dto.ts ํด๋์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ฃผ์ธ์
import { IsNotEmpty } from "class-validator";
export class CreateUserDto {
@IsNotEmpty()
readonly username: string;
@IsNotEmpty()
readonly email: string;
@IsNotEmpty()
readonly password: string;
}
class-validator ๋ data ๊ฐ ์ ์ก๋ ๋ ํด๋น ํ๋๊ฐ ์ ์ ํ ์ ํจ์ฑ์ ๊ฐ์ง๋์ง ๊ฒ์ฌํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
์ ์ด์ Service ๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค!!
๐ค User Service ๋ณ๊ฒฝํ๊ธฐ!!
์ ๊ตฌ์กฐ๋ ์ค๋น ๋์์ต๋๋ค. ์ด์ ๋ก์ง๋ง ์ ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค ํ์ดํ !!
๋จผ์ ์์กด์ฑ ์ฃผ์ ์ ์ํด UserService ์์ฑ์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ด์ค์๋ค!
constructor(private readonly userRepository: UserRepository) {}
์ ์ด๊ฒ ๋ง์ผ๋ก ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋ฌ์ต๋๋์ด์ด์ด!! ์ผ๋ง๋ ์ข์~!
User create
users.service.ts ํ์ผ ๋ด์ create ํจ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ์ฃผ์ธ์!
async create(createUserDto: CreateUserDto) {
const { username, email, password } = createUserDto;
const getByUserName = getRepository(UserEntity)
.createQueryBuilder('user')
.where('user.username = :username', { username });
const byUserName = await getByUserName.getOne();
if (byUserName) {
const error = { username: 'UserName is already exists' };
throw new HttpException(
{ message: 'Input data validation falied', error },
HttpStatus.BAD_REQUEST,
);
}
const getByEmail = getRepository(UserEntity)
.createQueryBuilder('user')
.where('user.email = :email', { email });
const byEmail = await getByEmail.getOne();
if (byEmail) {
const error = { email: 'email is already exists' };
throw new HttpException(
{ message: 'Input data validation falied', error },
HttpStatus.BAD_REQUEST,
);
}
// const thisUser = this.userRepository.findOne({ username: username });
// const thisEmail = this.userRepository.findOne({ email: email });
// create new user
let newUser = new UserEntity();
newUser.email = email;
newUser.password = password;
newUser.username = username;
const validate_error = await validate(newUser);
if (validate_error.length > 0) {
const _error = { username: 'UserInput is not valid check type' };
throw new HttpException(
{ message: 'Input data validation failed', _error },
HttpStatus.BAD_REQUEST,
);
} else {
return await this.userRepository.save(newUser);
}
}
๋จผ์ username ๊ณผ email ์ ์ ์ผํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ฒ์ฌํด๋ณด์ฃ !!
๋จผ์ ์ดํด๋ณผ ๊ฒ์ createQueryBuilder ์
๋๋ค.
typeorm ์ createQueryBuilder ๋ผ๋ ํจ์๋ฅผ ํตํด ์ฝ๋ ์์์ SQL ๋ฌธ์ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด ์ฝ๋๋ก ์ธํด ์์ฑ๋ sql ๋ฌธ์ ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ์ค์ง์ ์ผ๋ก DB ์ ๋ฐ์ดํฐ ๊ตํ์ด ์ผ์ด๋๋ฉด ์คํ ๋ฉ๋๋ค.
๋งจ ์ฒ์ ๋ง๋ SQL ๋ฌธ์
const byEmail = await getByEmail.getOne();
์ฌ๊ธฐ์ ์ํ ๋ฉ๋๋ค. DB ์ ์ฟผ๋ฆฌ ์๋์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฐฑ์๋ ์๋ฒ์์ ์ฝ๋๋ฅผ ์คํํ๋ ์๋ ์ฐจ์ด๊ฐ ๋ง์ด ๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์์ผ๋ก ์ํํ์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก username ๋ ๊ฒ์ฌํด์ค์๋ค!!
์ฌ์ค ์ด ๊ธฐ๋ฅ์ createQueryBuilder ๋ฅผ ์์จ๋ ๋ฉ๋๋ค. Repository ๋ฅผ ์์ฑํ์ผ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ด๋ฏธ ์ง์์ด ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ค ๋ค์ด username ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ผ๋ฉด ๋ฉ๋๋ค.
const user = this.userRepository.findOne({ username: username });
์ดํด๋ฅผ ๋๊ณ ์ createQueryBuilder ๋ฅผ ์ฌ์ฉํ์ต๋๋ค
๋ง์ฐฌ๊ฐ์ง๋ก findByEmail ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์๋ฉด
async findByEmail(email: string) {
return await this.userRepository.findOne({ email });
}
email ๊ธฐ์ค์ผ๋ก ์ ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค!!
๐จ Module ์ import ํด์ฃผ๊ธฐ!!
์ ๊ฑฐ์ ๋ค ์์ต๋๋ค!!
users.module.ts ํ์ผ ์์ imports ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋์ import ํด์ค์๋ค!!
@Module({
imports: [TypeOrmModule.forFeature([UserRepository])],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}
๐ ์ด์ ์คํ๋๋ค!!
$ npm run start
์ ๋ช
๋ น์ด๋ฅผ ํตํด ์ดํ๋ฆฌ์ผ์ด์
์ ์คํ์ ํฉ์๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ก๊ทธ๊ฐ ๋น๋๋ค!!
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [NestFactory] Starting Nest application...
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [InstanceLoader] TypeOrmModule dependencies initialized +97ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [InstanceLoader] AppModule dependencies initialized +1ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [InstanceLoader] TypeOrmCoreModule dependencies initialized +213ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [InstanceLoader] TypeOrmModule dependencies initialized +1ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [InstanceLoader] UsersModule dependencies initialized +1ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RoutesResolver] AppController {}: +14ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {, GET} route +18ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RoutesResolver] UsersController {/users}: +10ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {/users, POST} route +7ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {/users, GET} route +3ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {/users/:email, GET} route +1ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {/users/:id, PUT} route +11ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [RouterExplorer] Mapped {/users/:id, DELETE} route +1ms
[Nest] 33080 - 2021-02-01 2:36:58 โF10: PMโค [NestApplication] Nest application successfully started +2ms
์ฐํ ์ฐํ~ ์ฐํ~ ์ฐํ~ ์ฑ๊ณต!!
๊ณ ์ํ์
จ์ต๋๋ค.
๐คฃ ์์ง ํ ์คํธ๊ฐ ๋จ์๋ค!!!
์ ๋ Rest Client ๋ผ๋ vscode extension ์ ์ด์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค. postman, curl ์ฌ๋ฌ๋ถ์ด ํธํ์ ํด์ ์ด์ฉํด์ฃผ์ธ์!!
์ ๋ค์๊ณผ ๊ฐ์ด ์์ฒญ์ ํ๋ฉด!
POST http://localhost:3000/users HTTP/1.1
Content-Type: application/json
{
"username": "manynang",
"email" : "nono@cat.co.kr",
"password" : "manyang"
}
๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ์ด ๋ฉ๋๋ค!!
HTTP/1.1 201 Created
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 179
ETag: W/"b3-G/i5vHuN9KZDYAV9wTSwyMToetE"
Date: Mon, 01 Feb 2021 05:41:10 GMT
Connection: close
{
"email": "nono@cat.co.kr",
"password": "$argon2i$v=19$m=4096,t=3,p=1$LthoEnjA4KlaeaE/8YhMPg$2bNUqzjlCqbomBtDTkcYzTHjibaSrjefgJDzJWTvGFQ",
"username": "manynang",
"id": 1,
"imageLink": ""
}
์์ค .. ๋น๋ฐ๋ฒํธ๊ฐ ๋์ค๋๊ตฐ์... ์ด๋์ ํ ์คํธ๊ฐ ์ค์ํ๊ฒ๋๋ค.
์ ํฌ๋ ์ ์ id๋ง ๊ฐ์ ธ์ค๋๋ก ํ๊ฒ ์ต๋๋ค.
UserCreate save ํ๋ ๋ถ๋ถ์
return await this.userRepository.save(newUser).then((v) => v.id);
์ด์ ๊ฐ์ด ๋ฐ๊ฟ์ค์๋ค.
HTTP/1.1 201 Created
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 1
ETag: W/"1-NWoZK3kTsExUV00Ywo1G5jlUKKs"
Date: Mon, 01 Feb 2021 05:50:44 GMT
Connection: close
1
์ ์ฑ๊ณต!
์ ๋ค์ ์์ POST ๊ด๋ จ ๋ฌธ์ ๋ค์ ๋ณด๋ด๋ฉด?
HTTP/1.1 400 Bad Request
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 92
ETag: W/"5c-j/u2GjtMeXEpPJw+5WWgYELKwpM"
Date: Mon, 01 Feb 2021 05:54:56 GMT
Connection: close
{
"message": "Input data validation falied",
"error": {
"username": "UserName is already exists"
}
}
์ฑ๊ณต~~!!!!
์ค๋ณต๋ username ์ ๊ฑธ๋ ์ต๋๋ค ใ
ใ
!!
๊ณ ์ํ์ต๋๋ค ใ ใ !!!!
๋ค์์๋ ์ ์ฝ๋๋ฅผ Refactor ํ๋ ๊ณผ์ ์ผ๋ก ์ฐพ์๋ต๋๋ก ํ๊ฒ ์ต๋๋ค!!
์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ ๋ณด๋ด์ธ์!!
ํผ๋๋ฐฑ์ ํญ์ ํ์์ ๋๋ค.
'nestjs' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TypeORM, Nest.js] ManyToOne ๊ด๊ณ์ entity๊ฐ null return ๋ ๋ (0) | 2022.08.11 |
---|---|
[NestJS] TypeORM โ Relation, Transactions (0) | 2022.08.11 |
2.-2 NestJS ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ - ๋ฆฌํฉํ ๋ง๊ณผ e2e ํ ์คํธ!! (0) | 2022.08.10 |
2. NestJS ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ - CRUD ๋ก ์์ํ์. (0) | 2022.08.10 |
1. NestJS ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ -์ด๊ฑฐ๋ ์๊ณ ์์ํ์. (0) | 2022.08.10 |