From 3361551f24885c7ac63e66ac5dadc449dc4947ab Mon Sep 17 00:00:00 2001 From: haerong22 Date: Tue, 19 Jul 2022 01:53:05 +0900 Subject: [PATCH] #13 spring transaction - exception, runtimeException --- .../order/NotEnoughMoneyException.java | 8 +++ .../springtransaction/order/Order.java | 23 +++++++ .../order/OrderRepository.java | 6 ++ .../springtransaction/order/OrderService.java | 34 ++++++++++ .../src/main/resources/application.properties | 6 +- .../order/OrderServiceTest.java | 67 +++++++++++++++++++ 6 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 spring-transaction/src/main/java/com/example/springtransaction/order/NotEnoughMoneyException.java create mode 100644 spring-transaction/src/main/java/com/example/springtransaction/order/Order.java create mode 100644 spring-transaction/src/main/java/com/example/springtransaction/order/OrderRepository.java create mode 100644 spring-transaction/src/main/java/com/example/springtransaction/order/OrderService.java create mode 100644 spring-transaction/src/test/java/com/example/springtransaction/order/OrderServiceTest.java diff --git a/spring-transaction/src/main/java/com/example/springtransaction/order/NotEnoughMoneyException.java b/spring-transaction/src/main/java/com/example/springtransaction/order/NotEnoughMoneyException.java new file mode 100644 index 00000000..c3499f77 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/order/NotEnoughMoneyException.java @@ -0,0 +1,8 @@ +package com.example.springtransaction.order; + +public class NotEnoughMoneyException extends Exception { + + public NotEnoughMoneyException(String message) { + super(message); + } +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/order/Order.java b/spring-transaction/src/main/java/com/example/springtransaction/order/Order.java new file mode 100644 index 00000000..b93ba4f8 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/order/Order.java @@ -0,0 +1,23 @@ +package com.example.springtransaction.order; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "orders") +@Getter +@Setter +public class Order { + + @Id + @GeneratedValue + private Long id; + + private String username; // 정상, 예외, 잔고부족 + private String payStatus; // 대기, 완료 +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/order/OrderRepository.java b/spring-transaction/src/main/java/com/example/springtransaction/order/OrderRepository.java new file mode 100644 index 00000000..a4443223 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/order/OrderRepository.java @@ -0,0 +1,6 @@ +package com.example.springtransaction.order; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/order/OrderService.java b/spring-transaction/src/main/java/com/example/springtransaction/order/OrderService.java new file mode 100644 index 00000000..c1f8762f --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/order/OrderService.java @@ -0,0 +1,34 @@ +package com.example.springtransaction.order; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +public class OrderService { + + private final OrderRepository orderRepository; + + @Transactional + public void order(Order order) throws NotEnoughMoneyException { + log.info("order 호출"); + orderRepository.save(order); + + log.info("결제 프로세스 진입"); + if (order.getUsername().equals("예외")) { + log.info("시스템 예외 발생"); + throw new RuntimeException("시스템 예외"); + } else if (order.getUsername().equals("잔고부족")) { + log.info("잔고 부족 비즈니스 예외 발생"); + order.setPayStatus("대기"); + throw new NotEnoughMoneyException("잔고가 부족합니다."); + } else { + log.info("정상 승인"); + order.setPayStatus("완료"); + } + log.info("결제 프로세스 완료"); + } +} diff --git a/spring-transaction/src/main/resources/application.properties b/spring-transaction/src/main/resources/application.properties index 9bfd8232..59184f36 100644 --- a/spring-transaction/src/main/resources/application.properties +++ b/spring-transaction/src/main/resources/application.properties @@ -1,5 +1,9 @@ logging.level.org.springframework.transaction.interceptor=TRACE logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG + #JPA log logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG -logging.level.org.hibernate.resource.transaction=DEBUG \ No newline at end of file +logging.level.org.hibernate.resource.transaction=DEBUG + +#JPA SQL +logging.level.org.hibernate.SQL=DEBUG \ No newline at end of file diff --git a/spring-transaction/src/test/java/com/example/springtransaction/order/OrderServiceTest.java b/spring-transaction/src/test/java/com/example/springtransaction/order/OrderServiceTest.java new file mode 100644 index 00000000..a8e599d0 --- /dev/null +++ b/spring-transaction/src/test/java/com/example/springtransaction/order/OrderServiceTest.java @@ -0,0 +1,67 @@ +package com.example.springtransaction.order; + +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +@Slf4j +@SpringBootTest +class OrderServiceTest { + + @Autowired OrderService orderService; + @Autowired OrderRepository orderRepository; + + @Test + void complete() throws NotEnoughMoneyException { + //given + Order order = new Order(); + order.setUsername("정상"); + + //when + orderService.order(order); + + //then + Order findOrder = orderRepository.findById(order.getId()).get(); + assertThat(findOrder.getPayStatus()).isEqualTo("완료"); + } + + @Test + void runtimeException() throws NotEnoughMoneyException { + //given + Order order = new Order(); + order.setUsername("예외"); + + //when + assertThatThrownBy(() -> orderService.order(order)) + .isInstanceOf(RuntimeException.class); + + //then + Optional orderOptional = orderRepository.findById(order.getId()); + assertThat(orderOptional.isEmpty()).isTrue(); + } + + @Test + void bizException() { + //given + Order order = new Order(); + order.setUsername("잔고부족"); + + //when + try { + orderService.order(order); + } catch (NotEnoughMoneyException e) { + log.info("고객에게 잔고 부족을 알리고 별고의 계좌로 입금하도록 안내"); + } + + //then + Order findOrder = orderRepository.findById(order.getId()).get(); + assertThat(findOrder.getPayStatus()).isEqualTo("대기"); + } +} \ No newline at end of file