안녕하세요! 오늘은 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);
}
}
💡 꿀팁!
classToPlain
은instanceToPlain
의 별칭이에요. 더 새로운instanceToPlain
을 사용하는 걸 추천합니다!전역 설정도 가능해요:
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와 함께 사용하면 완전 찰떡궁합이랍니다.
더 자세한 내용은 공식 문서를 참고해주세요!
질문이나 의견이 있으시다면 댓글로 남겨주세요~ 😊
'개발 > NestJS' 카테고리의 다른 글
NestJS 설정 관리의 진화: nestjs-library-config 도입기 (4) | 2024.11.18 |
---|---|
NestJS에서 AWS S3 파일 업로드 깔끔하게 구현하기 🚀 (0) | 2024.11.15 |
[NestJS] TypeORM Pagination: 설치, 사용법, 직접 구현과의 비교 with nestjs-paginate (1) | 2024.11.05 |
TypeORM 트랜잭션: typeorm-transactional 사용 전후 비교 (0) | 2024.10.29 |
[NestJS] 의존성 주입의 모든 것: Provider와 useClass, useFactory, useValue 사용법 (1) | 2024.10.23 |
댓글