μΌλ§ μ , νμ¬ νμμκ² DTOλ₯Ό μ κ΅³μ΄ μ¬μ©ν΄μΌνλμ§?μ λν μ§λ¬Έμ λ°μλ€.
κ·Έλμ μ΄λ² ν¬μ€ν μμλ DTOλ₯Ό μ μ¬μ©ν΄μΌνλμ§μ λν΄ μμλ³΄κ³ μ νλ€.
λ¨Όμ , DTOλ Data Transfer Objectμ μ½μλ‘, λ°μ΄ν° μ μ‘ κ°μ²΄λΌκ³ νλ€.
DTOλ λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μ»μ΄ μλΉμ€λ λΉμ¦λμ€ λ‘μ§μΌλ‘ μ λ¬ν λ μ¬μ©νλ κ°μ²΄μ΄λ€.
μλ§, μμ λ°μ μ§λ¬Έμ, μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄ λμ§ μ DTOλ₯Ό μ¬μ©ν΄μΌνλ? λΌλ μλ¬Έμ΄μμ κ²μ΄λ€.
μλ μμλ, User μ κ΄ν μν°ν° ν΄λμ€μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
loginType: string;
@Column()
email: string;
@Column()
password: string;
@Column()
socialId: string;
@Column()
socialAccessToken: string;
@Column()
name: string;
@Column()
nickname: string;
@Column()
profileImage: string;
}
μμ κ°μ μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄, λͺ¨λ λ°μ΄ν°κ° λ ΈμΆλκΈ° λλ¬Έμ 보μμμ μ΄μ λ‘ DTOλ₯Ό μ¬μ©νλ€.
μλ μμλ, νΉμ User λ₯Ό μ‘°ννλ API μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// user.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
class UserController {
constructor(private readonly userService: UserService) {}
@Get(':id')
async getUser(@Param('id') id: number) {
return await this.userService.getUser(id);
}
}
// user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>,
) {}
async getUser(id: number) {
return await this.userRepository.findOne(id);
}
}
μ΄ API λ₯Ό νΈμΆνλ©΄, μλμ κ°μ μλ΅μ΄ μ¨λ€.
1
2
3
4
5
6
7
8
9
10
11
{
"id": 1,
"loginType": "email",
"email": "test@test.com",
"password": "test",
"socialId": null,
"socialAccessToken": null,
"name": "test",
"nickname": "test",
"profileImage": null
}
λͺ¨λ λ°μ΄ν°κ° λ ΈμΆλκΈ° λλ¬Έμ 보μμμ μ΄μ λ‘ DTOλ₯Ό μ¬μ©νλ€.
μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄, μν°ν°μ λ°μ΄ν°κ° λ³κ²½λλ©΄ API μλ΅ λ°μ΄ν°λ λ³κ²½λλ€.
κΈ°μ‘΄ User ν μ΄λΈμμ, lastLoginAt 컬λΌμ μΆκ°νμλ€κ³ κ°μ νμ.
1
2
@Column()
lastLoginAt: Date;
μ΄ κ²½μ°, API μλ΅ λ°μ΄ν°λ λ³κ²½λμ΄μΌ νλ€.
λ°±μλμμλ, API μλ΅ λ°μ΄ν°λ₯Ό λ³κ²½νλ κ²μ ν° λ¬Έμ κ° λμ§ μμ§λ§, νλ‘ νΈμλμμλ ν° λ¬Έμ κ° λλ€.
νλ‘ νΈμλμμλ, API μλ΅ λ°μ΄ν°κ° λ³κ²½λλ©΄, API μλ΅ λ°μ΄ν°λ₯Ό μ¬μ©νλ λͺ¨λ κ³³μμ λ³κ²½λ λ°μ΄ν°λ₯Ό μ¬μ©ν΄μΌ νλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ DTOλ₯Ό μ¬μ©νλ€.
μλ μμλ, λ³ΈμΈμ΄ μλ, λ€λ₯Έ User λ₯Ό μ‘°ννλ API μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ κ²½μ°
{
"id": 1,
"loginType": "email",
"email": "test@test.com",
"password": "test",
"socialId": null,
"socialAccessToken": null,
"name": "test",
"nickname": "test",
"profileImage": null,
"lastLoginAt": "2021-10-24T12:00:00.000Z" // μΆκ°λ 컬λΌ
}
// DTOλ₯Ό μ¬μ©νλ κ²½μ°
{
"id": 1,
"email": "test@test.com",
"name": "test",
"nickname": "test",
"profileImage": null // νμν λ°μ΄ν°λ§ μλ΅λ°μμ, μΆκ°λ 컬λΌμ΄ μλ΅λμ§ μλλ€.
}
μμ κ°μ΄, νμν λ°μ΄ν°λ§ μλ΅λ°μμ, μΆκ°λ 컬λΌμ΄ μλ΅λμ§ μλλ€.
μ΄λ¬ν μ΄μ λ‘, μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νμ§ μκ³ , DTOλ₯Ό μ¬μ©νλ€.
μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄, λΆνμν λ°μ΄ν°κ° ν¬ν¨λμ΄, API μλ΅ λ°μ΄ν°μ ν¬κΈ°κ° 컀μ§λ€.
μλ₯Ό λ€μ΄, User ν μ΄λΈκ³Ό μ°κ΄λ Post ν μ΄λΈμ΄ μλ€κ³ κ°μ νμ.
μ΄ κ²½μ°, μν°ν°λ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄, User ν μ΄λΈκ³Ό μ°κ΄λ Post ν μ΄λΈμ λ°μ΄ν°λ μλ΅λλ€.
νμ§λ§, User ν μ΄λΈκ³Ό μ°κ΄λ Post ν μ΄λΈμ λ°μ΄ν°λ νμνμ§ μλ€.