#13 spring transaction - exception, runtimeException
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
package com.example.springtransaction.order;
|
||||
|
||||
public class NotEnoughMoneyException extends Exception {
|
||||
|
||||
public NotEnoughMoneyException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -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; // 대기, 완료
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.example.springtransaction.order;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface OrderRepository extends JpaRepository<Order, Long> {
|
||||
}
|
||||
@@ -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("결제 프로세스 완료");
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
logging.level.org.hibernate.resource.transaction=DEBUG
|
||||
|
||||
#JPA SQL
|
||||
logging.level.org.hibernate.SQL=DEBUG
|
||||
@@ -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<Order> 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("대기");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user