본문 바로가기
개발/NestJS

😎 NestJS class-transform 제대로 알고 쓰자!

by coking 2024. 11. 12.

안녕하세요! 오늘은 NestJS에서 자주 사용되는 class-transform 라이브러리에 대해 알아볼게요.
API 개발하다 보면 데이터 변환이 필요한 경우가 정말 많은데, 이때 완전 꿀템인 class-transform을 소개합니다!

🤔 class-transform이 왜 필요한가요?

백엔드 개발을 하다 보면 이런 고민 많이 하시죠?

  • "API 응답으로 받은 plain object를 클래스로 어떻게 변환하지?"
  • "비밀번호 같은 민감한 정보는 응답에서 제외하고 싶은데..."
  • "날짜 형식을 항상 변환해서 보내고 싶어!"

class-transform을 사용하면 이런 고민들을 깔끔하게 해결할 수 있어요!

📚 주요 변환 함수들 살펴보기

1. plainToInstance

가장 많이 사용되는 함수예요. plain object(JSON)를 클래스 인스턴스로 변환해줍니다.

import { plainToInstance } from 'class-transform';

class User {
  id: number;
  name: string;
  createdAt: Date;
}

const plainUser = {
  id: 1,
  name: "김개발",
  createdAt: "2024-03-15"
};

const user = plainToInstance(User, plainUser);
// 짜잔! User 클래스의 인스턴스가 됐어요

2. instanceToPlain

클래스 인스턴스를 일반 객체로 변환할 때 사용해요. API 응답을 보내기 전에 많이 사용하죠.

const plainObject = instanceToPlain(userInstance);
// 이제 이걸 JSON으로 보내도 문제없어요!

3. classToClass

클래스 인스턴스를 깊은 복사할 때 사용합니다.

const userCopy = classToClass(userInstance);
// 완전히 새로운 인스턴스가 생성돼요

🎨 데코레이터로 더 멋지게 꾸미기

class-transform의 진정한 힘은 데코레이터에 있어요!

import { Expose, Exclude, Transform } from 'class-transform';

class User {
    @Expose() // 이 필드는 변환 결과에 포함됩니다
    id: number;

    @Exclude() // 이 필드는 변환 결과에서 제외됩니다
    password: string;

    @Transform(({ value }) => value.toUpperCase())
    nickname: string;

    @Transform(({ value }) => new Date(value))
    createdAt: Date;
}

이런 식으로 데코레이터를 사용하면:

  • 민감한 정보 숨기기 (@Exclude())
  • 특정 필드만 노출하기 (@Expose())
  • 데이터 형식 변환하기 (@Transform())
    이 가능해져요!

🚀 실전 사용 예제

NestJS 컨트롤러에서 이렇게 사용할 수 있어요:

@Controller('users')
export class UserController {
    @Get()
    getUsers() {
        const users = this.userService.findAll();
        // DB에서 가져온 데이터를 변환해서 반환
        return instanceToPlain(users);
    }

    @Post()
    createUser(@Body() userData: any) {
        // 받은 데이터를 User 클래스 인스턴스로 변환
        const user = plainToInstance(User, userData);
        return this.userService.create(user);
    }
}

💡 꿀팁!

  1. classToPlaininstanceToPlain의 별칭이에요. 더 새로운 instanceToPlain을 사용하는 걸 추천합니다!

  2. 전역 설정도 가능해요:

    import { ClassSerializerInterceptor } from '@nestjs/common';
    

// main.ts
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));


3. 순환 참조 문제가 있다면 `enableCircularCheck: true` 옵션을 사용해보세요:
```typescript
plainToInstance(User, data, { enableCircularCheck: true })

마치며 👋

class-transform을 잘 활용하면 데이터 변환 코드가 훨씬 깔끔해지고 유지보수도 쉬워져요!
특히 NestJS와 함께 사용하면 완전 찰떡궁합이랍니다.

더 자세한 내용은 공식 문서를 참고해주세요!

질문이나 의견이 있으시다면 댓글로 남겨주세요~ 😊

댓글