Data Transfer Object 클래스는 스프링이 빈으로 등록하지 않는다.
-> @Component, @Service, @Repository, @Configuration 이나 @Bean 등이 없으면 스프링 빈(X), 그냥 일반 객체(POJO)(O)
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 인스턴스를 넘겨줌
컴포넌트 스캔 대상만 자동으로 빈 등록된다.
이런 것들이 스프링 컨테이너에 한 번 만들어져서 (대부분 싱글톤) 관리되는 친구들이다.
DTO는 그런 역할이 아니라서 보통 애초에 빈으로 만들지도 않는다.
@NotNull은 Bean Validation(자카르타 Validation)용 어노테이션이다.
즉, "검증 대상 객체"일 뿐이지, "스프링 빈"이라서 검사하는 게 아니다.