0. 서론
현재 진행 중인 프로젝트에서 일부 도메인에 대해 spring data rest를 사용 중이다.
보안상으로도 안 중요하고, 비즈니스 로직도 필요 없는 도메인에 대해선 나름 유용하게 사용 중이었다.
그러던 중, 해당 도메인에 추가할 api에서 validator와 dto가 필요한 상황에 직면했고,
이를 어떻게 대응할지 고민해보았다. 일단, 사용법을 알아보았다.
레퍼런스가 거의 없어서 공식 문서를 참고했다.
1. Spring Data Rest와 Validator
spring boot data rest가 자동으로 제공하는 API를 사용할 때,
인자값의 valid 여부를 확인하기 위한 방법을 살펴보자.
결론부터 말하자면 Validator 인터페이스를 사용하여 데이터 유효성 검사를 수행할 수 있으며,
이를 Spring Data REST의 이벤트 시스템과 통합하여 사용할 수 있다.
공식 문서에 따르면, Spring Data REST에서 Validator 인스턴스를 등록하는 방법은 두 가지가 있다.
하나는 bean 이름을 통해 자동으로 연결하는 것이고, 다른 하나는 수동으로 validator를 등록하는 것이다.
후자의 방식으로 설명해보겠다.
RepositoryRestConfigurer를 구현하는 구성에서
configureValidatingRepositoryEventListener 메소드를 오버라이드하고
ValidatingRepositoryEventListener의 addValidator를 호출하여
원하는 이벤트에 대한 validator의 인스턴스를 등록하면 된다.
아래 코드와 같이 원하는 이벤트에 대해 특정 validator를 직접 지정한다.
@Override
void configureValidatingRepositoryEventListener
(ValidatingRepositoryEventListener v) {
v.addValidator("beforeSave", new BeforeSaveValidator());
}
Java
복사
삽질 로그 (with Baeldung)
2. Spring Data Rest와 DTO
Spring Data REST에서 DTO(Data Transfer Object)를 직접 사용하는 것은 기본적으로 지원되지 않는다.
Spring Data REST는 주로 엔티티 클래스를 직접 노출시키도록 설계되어 있으며, 이는 JPA 엔티티를 REST 리소스로 자동으로 변환하는 것을 목표로 하기 때문이다.
그럼에도, DTO를 사용하고자 하는 경우 아래 방법들로 우회해 구현할 수 있다.
1.
프로젝션(Projection): 프로젝션을 사용하면 엔티티의 특정 필드만 노출시킬 수 있다. 이를 통해 DTO와 유사한 효과를 낼 수 있다.
2.
이벤트 핸들링: Spring Data REST의 이벤트 핸들링 기능을 사용하여 요청 또는 응답 단계에서 DTO 변환 로직을 적용할 수 있다.
3. 결론
validator와 dto를 사용하기 위해선 이벤트 핸들링 기능을 사용해야 한다는 점이
편리를 위해 사용했던 Spring Data Rest의 장점을 없애버렸다..
이보단, 컨트롤러와 서비스 계층을 추가하여 DTO를 반환하도록 하는 기존 방식이 더 낫겠다고 판단되었다.
즉, Spring Data REST의 자동화된 라우팅 기능 대신 직접 엔드포인트를 정의하고 관리하기로 했다.