[TIL] CRUD Code Shadowing 3회차
Spring Service 비즈니스 로직 분리, @Transactional(readOnly = true) 옵션 활용 조회 성능 최적화 및 데이터 변경 방지
For the English version of this post, see here.
[TIL] CRUD Code Shadowing 3회차
Controller에서 비즈니스 로직 분리하기
OrderService
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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 형태를 반환해줘야함
댓글
궁금한 점, 피드백, 오류 제보를 남겨 주세요.