Spring Boot Part4 - REST API
Service에서 Transaction을 사용하면 Service에서 끝내라.
- 주문을 저장하는 Service 코드를 작성한다면 아래와 같은 예시가 있다.
@Service
public OrderDefaultService implements OrderService {
private final OrderRepository orderRepository;
private final OrderConverter orderConverter;
public OrderDefaultService(OrderRepository orderRepository,
OrderConverter orderConverter) {
this.orderRepository = orderRepository;
this.orderConverter = orderConverter;
}
@Transaction
public String save(OrderDto orderDto) {
Order order = orderconverter.convertOrder(orderDto);
Order entity = orderRepository.save(order);
return entity.getUuid();
}
}
- 일단 Dto로 준영속 상태의 Order 객체를 만든다.
- JPA에서 관리하는 영속적인 엔티티로 만들기 위해 save 메서드를 호출한다.
- 하지만, 반환값은 엔티티의 uuid다.
- 이유는 바로 의도하지 않은 곳에서 entity를 조작하지 않기 위함이다.
- service에서 발생한 transaction은 service에서 끝내야 한다.
BDD
Pageable
- JpaRepository의 findAll과 같은 메서드를 사용할 때, 페이징 처리를 쉽게 할 수 있게 해주는 인터페이스다.
@Service
public OrderDefaultService implements OrderService {
...
@Transaction
public Page<OrderDto> findAll(Pageable pageable) {
return orderRepository.findAll(pageable)
.map(orderConverter::orderDto);
}
}
Controller Test를 작성 할 때?
- given은 클라이언트가 요청을 보내는 것
- when은 dispatcherServlet이 적절한 method를 찾아 실행시키는 것
- then은 응답이 200인지 아니면 그 외 응답인지 확인한다.
- 응답하는 값들은 이미 service, repository에서 테스트를 마쳤으니 다시 확인 할 필요는 없다.
Controller Test에서 RestDoc 작성하기