
데이터 흐름 제어의 핵심 개념
Nest.js에서 API를 설계할 때, 클라이언트와 주고받는 데이터의 형태와 범위를 제어하는 것은 매우 중요하다.
이때 핵심이 되는 것이 직렬화(Serialization) 와 역직렬화(Deserialization) 개념이다.
Spring에서도 DTO와 Jackson을 활용하여 비슷한 작업을 수행하지만,
Nest.js에서는 class-transformer, class-validator, @Expose, @Exclude, @Transform 등의
데코레이터 기반 도구를 통해 이를 더욱 명시적이고 정제된 방식으로 제어할 수 있다.
역직렬화 (Deserialization)
클라이언트 → 서버로 들어오는 데이터
Nest.js에서는 클라이언트가 보낸 요청 데이터를 DTO 클래스를 통해 역직렬화한다.
그리고 이 DTO는 class-validator를 통해 유효성 검사를 수행한다.
import { IsEmail, IsString } from 'class-validator';
export class CreateUserDto {
@IsString()
userName: string;
@IsEmail()
email: string;
}- 컨트롤러에서
@Body()데코레이터를 통해 전달된 데이터를 해당 DTO 클래스의 인스턴스로 변환한다. - 내부적으로는
class-transformer를 통해 plain object → class instance로 변환된다.
@Post()
create(@Body() dto: CreateUserDto) {
return this.authService.registerUser(dto);
}직렬화 (Serialization)
서버 → 클라이언트로 나가는 응답 데이터
응답 시, Entity 전체를 그대로 반환할 경우 민감 정보까지 노출될 수 있다.
이를 방지하기 위해 @Exclude, @Expose 데코레이터를 활용하여 반환 필드를 제어할 수 있다.
import { Exclude } from 'class-transformer';
export class Admin {
id: string;
userName: string;
@Exclude()
password: string;
@Exclude()
refreshToken: string;
}응답 직전에 plainToInstance() 혹은 instanceToPlain()을 사용하여
직렬화 규칙을 적용한 객체로 변환할 수 있다.
import { instanceToPlain } from 'class-transformer';
return instanceToPlain(user); // password, refreshToken은 제외됨🛠 글로벌 직렬화 적용 방식
main.ts에서 전역 직렬화 인터셉터(Global Serialization Interceptor) 를 등록하면
모든 응답 객체에 대해 자동으로 @Exclude, @Expose 규칙이 적용된다.
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));그리고 컨트롤러에서 다음과 같이 DTO 또는 Entity 반환 시 자동으로 직렬화된다:
@Get()
getMe(@Req() req): Admin {
return req.user; // @Exclude 필드가 자동으로 제거됨
}단, 반환되는 객체는 반드시 class 인스턴스여야 하고, @UseInterceptors(ClassSerializerInterceptor) 또는 글로벌 등록이 필요하다.
🧩 Spring과의 비교
| 개념 | Spring | Nest.js |
|---|---|---|
| 역직렬화 | Jackson이 요청 body → DTO로 변환 | class-transformer + DTO 클래스 사용 |
| 유효성 검증 | @Valid, @NotNull, @Email 등 |
class-validator 기반 데코레이터 |
| 직렬화 필드 제한 | @JsonIgnore, @JsonProperty |
@Exclude, @Expose |
| 필드 변환 처리 | Custom Deserializer, Converter |
@Transform 데코레이터 또는 커스텀 시리얼라이저 |
| 전역 적용 방식 | WebMvc 설정 or ControllerAdvice | main.ts에서 글로벌 인터셉터 등록 |
✅ 정리
Nest.js에서 직렬화와 역직렬화는 DTO → Entity → DTO 구조에서 데이터 흐름을 안전하게 제어하는 핵심 기능이다.
특히 class-transformer 기반 설정은 명확하게 어떤 필드가 포함되고 제외되는지를 코드 상에서 직관적으로 확인할 수 있다.
또한 Nest.js의 장점은 main.ts에서 전역 직렬화 인터셉터를 등록하면
모든 컨트롤러에서 통일된 직렬화 정책을 일관성 있게 유지할 수 있다는 점이다.
'Nest.js' 카테고리의 다른 글
| Nest CLI란 무엇인가? (0) | 2025.05.22 |
|---|---|
| [Nest.js] 테스트 코드 작성 (0) | 2025.05.22 |
| [Nest.js] 애플리케이션 진입점 (0) | 2025.05.22 |
| [Nest.js] 프로젝트 구조 설계 (0) | 2025.05.22 |
| Spring과의 구조적 유사성과 차이점 정리 (2) | 2025.05.22 |