프론트엔드에서 자원을 동일한 경로로 안정되게 접근하게 하려면 응답 객체를 일정하게 래핑해야 함

모든 응답을 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를 통해 실제 데이터에 일관되게 접근 가능함

단점: ResponseEntityResponse 대신 도메인 객체를 직접 넣는 경우는 제한할 수 없음