프론트엔드에서 자원을 동일한 경로로 안정되게 접근하게 하려면 응답 객체를 일정하게 래핑해야 함
모든 응답을 ResponseEntity로 내보내면 기본적으로 가능함
하지만 ResponseEntity는 모든 종류의 데이터를 받기 때문에
도메인을 직접 노출하기보다 DTO 사용을 강제하고 싶었음
나의 접근
@AllArgsConstructor(access = AccessLevel.PRIVATE) // 생성자를 숨기고 팩토리 메서드 사용 강제
@Getter
public class Response<D extends Dto>{
D data;
public static<D extends Dto> Response<D> of(D data){
return new Response<>(data);
}
}
Dto는 아무 내용 없는 순수 제너릭 타입 제한용 인터페이스이고
Response는 이 구현체만 인자로 받음
return ResponseEntity.ok(
Response.of(new MemberResponseDto(/*... 파라미터들 ...*/))
);
이렇게 함으로써 응답에는 Dto만 포함될 수 있고,
실제 객체를 숨김으로써 필요만 데이터만 외부에 노출하게 됨
또한 프론트엔드에서는 response.data.data를 통해 실제 데이터에 일관되게 접근 가능함
단점: ResponseEntity에 Response 대신 도메인 객체를 직접 넣는 경우는 제한할 수 없음