DTO (Data Transfer Object)

정웅·2025년 11월 27일

데이터베이스

목록 보기
2/5

Data Transfer Object 클래스는 스프링이 빈으로 등록하지 않는다.
-> @Component, @Service, @Repository, @Configuration 이나 @Bean 등이 없으면 스프링 빈(X), 그냥 일반 객체(POJO)(O)

1. 그럼 이 DTO는 누가 만들어줄까?

public class TrackingLinkCreateRequest {

    @NotNull
    private Long campaignId;

    @NotNull
    private Long creatorId;

    private String finalUrl;
}

이 DTO는 주로 컨트롤러 메서드 파라미터에서 이렇게 쓰일 것이다.

@PostMapping("/api/tracking-links")
public TrackingLinkResponse createTrackingLink(
	@Valid @RequestBody trackingLinkCreateRequest request){
    ...
    }
)

동작 흐름은 다음과 같다.
1. 클라이언트가 JSON 요청 보냄
2. 스프링 MVC + Jackson이 JSON을 보고
-> new TrackingLinkCreateRequest()해서
-> 필드에 값 채워 넣음
3. @Valid를 보고 Bean Validation(hibernate-validator)이 -> @NotNull 같은 어노테이션 검사
4. 컨트롤러 메서드에 완성된 DTO 인스턴스를 넘겨줌

  • 이 객체는 스프링 컨테이너에 올라간 빈이 아니라,
    요청이 올 때마다 새로 만들어지는 일반 객체이다.

2. 스프링이 "자동으로 빈 등록" 하는 건 어떤 애들인가?

컴포넌트 스캔 대상만 자동으로 빈 등록된다.

  • @Component
  • @Service
  • @Repository
  • @Controller, @RestController
  • @Configuration
    또는 설정 클래스 안의
  • @Bean 이 붙은 메서드 반환 객체

이런 것들이 스프링 컨테이너에 한 번 만들어져서 (대부분 싱글톤) 관리되는 친구들이다.
DTO는 그런 역할이 아니라서 보통 애초에 빈으로 만들지도 않는다.

3. 그럼 DTO에서 @NotNull은 왜 잘 동작할까?

@NotNull은 Bean Validation(자카르타 Validation)용 어노테이션이다.

  • 스프링이 "이건 빈이니까 검사해줘" 하는 게 아니라
  • 컨트롤러 파라미터에 @Valid 또는 @Validated가 붙어있으면, 그 파라미터(=DTO 객체)에 붙은 검증 어노테이션을 읽어서 검사해주는 것이다.

즉, "검증 대상 객체"일 뿐이지, "스프링 빈"이라서 검사하는 게 아니다.

4. 요약

  • DTO는 보통 스프링 빈이 아니다
  • @Component, @Bean 안 붙이면 스프링 컨테이너에 등록 안 됨.
  • 대신 요청마다 Jackson이 new DTO() 해서 만들어서 컨트롤러에 넣어주고, @Valid가 붙어 있으면 그때 @NotNull 같은 검증이 돌아가는 구조.
profile
즐거운 개발 :) 신입 서버 개발자입니다

0개의 댓글