Info

24๋…„ 5์›” ์ดˆ ์ž‘์—… ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Entity์™€ DTO

Entity๋Š” ๋‹จ์ˆœ ์˜๋ฏธ๋กœ๋Š” ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ DB ๊ด€๋ จ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
DTO(Data Transfer Object)๋ž€ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ธ€์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋…์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

์—…๋ฌด ์ฝ”๋“œ์—์„œ Entity๋Š” TypeORM์„ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ” ์ •๋ณด์™€ ๋™์ผํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ , DTO๋Š” API๋ฅผ ์œ„ํ•ด ๋ณ„๋„๋กœ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” Entity์—์„œ DTO๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ, ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๊ฒน์น˜๋Š” ์†์„ฑ์ด ๋งŽ์Œ์—๋„ ๋‹จ์ˆœํžˆ JSON ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์–ด ์ฝ”๋“œ์˜ ์–‘๋„ ๋งŽ์•„์ง€๊ณ  ๊น”๋”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

// DB function
const foos = await this.getFooList();
 
return foos.map((foo) => ({
  name: foo.name,
  description: foo.description,
  bar: someProcess(foo.bar),
  // ..
}));

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

class-transformer ํŒจํ‚ค์ง€์˜ plainToClass ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ๋‚ฎ์•„์„œ ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” plainToInstance ํ•จ์ˆ˜๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

// DB function
const foos = await this.getFooList();
 
return foos.map((foo) =>
  plainToClass(FooDto, {
    ...foo,
    bar: someProcess(foo.bar),
  })
);

์ด ๋ฐฉ๋ฒ•๋„ ์™„์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๊ฐ’๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ฒ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—๋„ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ์—ฌ๋Ÿฌ ํ™œ์šฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•ˆ์ •์„ฑ์„ ํŒ๋‹จํ•ด์•ผ ํ•  ํ•„์š”๋Š” ์žˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”.