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);
}
}반응형
'Study' 카테고리의 다른 글
| [내일배움캠프 TIL] 13일차 - security context, Authentication, @Secured (0) | 2026.04.22 |
|---|---|
| [내일배움캠프 TIL] 12일차 - JWT, Auth 구현(회원가입 로그인) (0) | 2026.04.21 |
| [내일배움캠프 TIL] 10일차 - uuid, erd표기법, Transaction (1) | 2026.04.17 |
| [내일배움캠프 TIL] 9일차 - Controller 단에서 로직 분리 실습 1 (0) | 2026.04.16 |
| [내일배움캠프 TIL] 8일차 - Spring 정리. 빈스코프 (0) | 2026.04.15 |