인프런에서 김영한님의 JPA 활용 2편을 듣다가, Response에 대해서, 반환을 List로 하면 다른 데이터를 껴 넣거나 할 수 없으니 그렇게 하지 말자는 얘기가 있었는데.. 듣고보니 매우 일리가 있었다.
(예를 들면, 모든 유저를 전부 조회한 후, 유저의 수 까지 count해서 반환하는게 필요할 수 있으니까)
그래서 강의에서 다뤘던 부분에 대해서 간단히 개인적인 리팩토링을 진행해봤다. (그렇게 말하기도 민망한 수준이다.)
먼저, 강의에서 다뤘던 코드는 이렇다.
@GetMapping("/api/v3/simple-orders")
public List<SimpleOrderDto> ordersV3(){
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(Collectors.toList());
return result;
}
이렇게 하면 List를 반환하여 이렇게 된다.
이제 이걸 조금 수정해보자.
먼저, 조회를 위한 class를 하나 만든다.
Result1 이라고 한다.
@Data
@AllArgsConstructor
static class Result1<T>
{
private T data;
}
그 후, 이걸 이용해 조회 결과를 받아보자
@GetMapping("/api/v31/simple-orders")
public Result1 ordersV31(){
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(Collectors.toList());
return new Result1(result);
}
요런 식으로 반환이 된다.
이제 이걸 한번 더 방향을 꺾어서 주문 수도 count 해보자.
Result2 라는 class를 만들자. 얘는
@Data
@AllArgsConstructor
static class Result2<T>
{
int count;
private T data;
}
요런 친구이다.
참고로 지금까지 이미 왕창 사용하고 설명하지만 ,@Data는 getter를 만들어주는, @AllArgsConstructor는 생성자를 만들어주는 친구들이다. lombok 플러그인에 존재한다.
여튼 Result2 class를 이용하여 응답을 받아보자
@GetMapping("/api/v32/simple-orders")
public Result2 ordersV32(){
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimpleOrderDto> collect = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(Collectors.toList());
return new Result2(collect.size(),collect);
}
이렇게 Result2에서 entity를 dto로 변환한 collect list의 size를 생성자의 매개변수로 받아줬다.
그러면 이런 응답을 받을 수 있다.
맨 위에 count라는 이름으로 조회 결과 수를 출력해줬다.
간단하지만, 의미있는 포인트가 될지도 모르지.
여튼간에 이런 장황한 글의 핵심은,