[TIL] CRUD Code Shadowing 3회차

신여원·2026년 4월 22일

내일배움캠프

목록 보기
15/15

Controller에서 비즈니스 로직 분리하기

OrderService

package com.sparta.assignment.order.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;

import com.sparta.assignment.order.dto.OrderRequest;
import com.sparta.assignment.order.dto.OrderResponse;
import com.sparta.assignment.order.entity.Order;
import com.sparta.assignment.order.repository.OrderRepository;
import com.sparta.assignment.prduct.entity.Product;
import com.sparta.assignment.prduct.repository.ProductRepository;

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;
    private final ProductRepository productRepository;

    @Transactional
    public OrderResponse createOrder(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 orderResponse = new OrderResponse(saved);
        return orderResponse;
    }

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

}
  • get 종류 메서드의 경우에는 @Transactional(readOnly = true)를 사용하여 Transaction은 그대로 생성되지만, JPA에게 수정은 하지 않을 것이라고 힌트를 줌(변경 감지(dirty checking)을 하지 않음)
  • Controller에서 OrderResponse orderResponse = orderService.메서드명의 형태로 결과를 받고 있기 때문에, Service에서 OrderResponse 형태를 반환해줘야함
profile
경북대학교 컴퓨터학부

0개의 댓글