2022-05-12 TIL

이창호·2022년 5월 12일
0

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

  • Behavior-Driven Development의 약어다.
  • given, when, then으로 나누어 테스트를 진행한다.
  • https://prostars.net/227

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 작성하기

profile
이타적인 기회주의자

0개의 댓글