본문 바로가기

Study

[내일배움캠프 TIL] 11일차 - Controller 단에서 로직 분리 실습 2

728x90
반응형

컨트롤단에 로직을 분리하는 실습을 두번째로 진행하였습니다.

지난번에 분리할 때 잘못된 점들이 있어서 수정하였고

그부분을 정리하였습니다.

 

1.  @Transactional을 서비스로 같이 옮겼어야 했는데, 컨트롤러에 그대로 남겨놨었습니다.

그 부분을 수정하였습니다.

Transactional은 비즈니스 로직에서 필요한 부분이기 때문입니다.

 

2. 서비스단에서는 Dto 로만 반환하고 컨트롤러에서 http 응답형식에 맞춰 반환하도록 수정하였습니다.

저번에 수정할때, 서비스에서 http응답을 만들어서 반환하도록하였는데, 이 또한 서비스단에서는 비즈니스 로직만 구현한다는 논리에 맞지 않고, http 응답 처리는 컨트롤러에서 하는게 맞으므로 수정하였습니다.

 

수정 전 service

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;
    private final ProductRepository productRepository;

    public ResponseEntity<OrderResponse> createOrder(@Valid OrderRequest request) {
        Product product = productRepository.findById(request.getProductId())
                .orElseThrow(() -> new IllegalArgumentException(
                        "해당 상품이 존재하지 않습니다. id=" + request.getProductId()));

        Order order = new Order(product);
        Order saved = orderRepository.save(order);
        OrderResponse response = new OrderResponse(saved);

        return ResponseEntity.created(URI.create("/api/orders/" + response.getOrderId())).body(response);
        // http응답을 만들어서 반환하고 있음.
    }

    public ResponseEntity<OrderResponse> getOrder(Long id) {
        Order order = orderRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException(
                        "해당 주문이 존재하지 않습니다. id=" + id));

        return ResponseEntity.ok(new OrderResponse(order));
    }
}

 

 

수정 후 service

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;
    private final ProductRepository productRepository;

    @Transactional
    public OrderResponse createOrder(@Valid OrderRequest request) {
        Product product = productRepository.findById(request.getProductId())
                .orElseThrow(() -> new IllegalArgumentException(
                        "해당 상품이 존재하지 않습니다. id=" + request.getProductId()));

        Order order = new Order(product);
        Order saved = orderRepository.save(order);

        return new OrderResponse(saved);
    }

    @Transactional (readOnly = true)
    public OrderResponse getOrder(Long id) {
        Order order = orderRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException(
                        "해당 주문이 존재하지 않습니다. id=" + id));

        return new OrderResponse(order);
    }
}

 

 

 

 

수정 전 controller

@RestController
@RequestMapping("/api/orders")
@RequiredArgsConstructor
public class OrderController {

    private final OrderService orderService;

    @PostMapping
    @Transactional
    public ResponseEntity<OrderResponse> createOrder(@Valid @RequestBody OrderRequest request) {
        return orderService.createOrder(request);
    }

    @GetMapping("/{id}")
    @Transactional(readOnly = true)
    public ResponseEntity<OrderResponse> getOrder(@PathVariable Long id) {
        return orderService.getOrder(id);
    }
}

 

 

 

수정 후 controller

package com.sparta.miniorder.order.controller;

import com.sparta.miniorder.order.dto.OrderRequest;
import com.sparta.miniorder.order.dto.OrderResponse;
import com.sparta.miniorder.order.entity.Order;
import com.sparta.miniorder.order.respository.OrderRepository;
import com.sparta.miniorder.order.service.OrderService;
import com.sparta.miniorder.product.entity.Product;
import com.sparta.miniorder.product.repository.ProductRepository;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.net.URI;

@RestController
@RequestMapping("/api/orders")
@RequiredArgsConstructor
public class OrderController {

    private final OrderService orderService;

    @PostMapping
    public ResponseEntity<OrderResponse> createOrder(@Valid @RequestBody OrderRequest request) {
        OrderResponse orderResponse = orderService.createOrder(request);
        return ResponseEntity.created(URI.create("/api/orders/" + orderResponse.getOrderId())).body(orderResponse);
    }

    @GetMapping("/{id}")
    public ResponseEntity<OrderResponse> getOrder(@PathVariable Long id) {
        OrderResponse orderResponse =  orderService.getOrder(id);

        return ResponseEntity.ok(orderResponse);
    }
}
반응형