Nest.js에서의 직렬화와 역직렬화

2025. 5. 22. 12:23·Nest.js
728x90
반응형

데이터 흐름 제어의 핵심 개념

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에서 전역 직렬화 인터셉터를 등록하면

모든 컨트롤러에서 통일된 직렬화 정책을 일관성 있게 유지할 수 있다는 점이다.

728x90
반응형

'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
'Nest.js' 카테고리의 다른 글
  • Nest CLI란 무엇인가?
  • [Nest.js] 테스트 코드 작성
  • [Nest.js] 애플리케이션 진입점
  • [Nest.js] 프로젝트 구조 설계
highgarden
highgarden
커밋 하나하나가 쌓여 커다란 정원이 되는 중입니다. 하루하루 정성껏 심어가는 중 https://github.com/highgarden7
  • highgarden
    커밋심는 정원
    highgarden
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • ai (1)
      • devops (2)
      • Nest.js (14)
      • linux (14)
      • 네트워크 (6)
      • git (0)
      • aws (0)
      • docker (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Linux
    IP
    springboot
    Chat GPT
    nestjs
    vercel
    githib action
    네트워크
    Java
    E2E
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
highgarden
Nest.js에서의 직렬화와 역직렬화
상단으로

티스토리툴바