Spring boot 쇼핑몰을 개발하면서 다양하게 예외처리를 할 일이 생긴다.
기본적으로는 (if/else) 구문을 이용하여 분기를 나누어 처리하거나
(try/catch) 구문을 사용한다. 하지만 이것을 이용하면 모든 메소드에 try/catch 구문을 사용하여야 하므로 코드 가독성이 매우 떨어지게 되며 개발자를 괴롭히게 된다....
try/catch 에 대한 클린코드에는 이런 멘트가 있다.
try/catch 블록은 원래 추하다. 코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섞는다.
따라서 나는 try/catch를 사용하지않고 Exception을 이용하여 처리하도록 하려한다.
먼저 예외처리를 적용할 항목을 먼저 생각해보았다.
제일 필요한구간은 결제를 처리할때이다!
다음 두가지에 대한 예외처리를 먼저 적용해 보려고 한다.
먼저 exception이라는 패키지를 만들어주고 그 아래에서 Exception 처리를위한 class를 만들어 주었다.
public class OutOfMoneyException extends RuntimeException{
public OutOfMoneyException(String message){
super(message);
}
}
public class OutOfStockException extends RuntimeException{
public OutOfStockException(String message){
super(message);
}
}
코드는 간단하다. 기존의 런타임예외처리를 상속받아 내가 원하는 메시지를 출력하도록 하는것이다.
@Transactional
public void cartPayment(int id){
List<Cart_item> cart_items = cart_itemRepository.findAll(); // 전체 cart_item 찾기
List<Cart_item> userCart_items = new ArrayList<>();
User buyer = userRepository.findById(id).get();
// 반복문을 이용하여 접속 User의 Cart_item만 찾아서 저장
for(Cart_item cart_item : cart_items){
if(cart_item.getCart().getUser().getId() == buyer.getId()){
userCart_items.add(cart_item);
}
}
orderService.order(buyer,userCart_items);
// 반복문을 이용하여 접속 User의 Cart_item 만 찾아서 삭제
for(Cart_item cart_item : userCart_items){
// 재고 변경
int stock = cart_item.getItem().getStock(); // 현재 재고를 변수에 저장
stock = stock - cart_item.getCount(); // 저장된 변수를 결제한 갯수만큼 빼준다
cart_item.getItem().setStock(stock); // 재고갯수 변경
// 금액 처리
User seller = cart_item.getItem().getUser();
int cash = cart_item.getItem().getPrice(); // 아이템 가격을 변수에 저장
buyer.setMoney(cash * -1);
seller.setMoney(cash);
}
}
다음은 앞서서 개발하였던 CartService.java 파일이다.
재고와 금액처리부분에 다음과 같은 코드를 추가하여 주었다.
if(stock < cart_item.getCount()){
throw new OutOfStockException("상품의 재고가 부족합니다. ( 현재 재고 수량 : " + stock + ")");
}
if(buyer.getMoney() < cash){
throw new OutOfMoneyException("보유 머니가 부족합니다 . ( 현재 보유 머니 : " + buyer.getMoney() + ")");
}
@Transactional
public void cartPayment(int id){
List<Cart_item> cart_items = cart_itemRepository.findAll(); // 전체 cart_item 찾기
List<Cart_item> userCart_items = new ArrayList<>();
User buyer = userRepository.findById(id).get();
// 반복문을 이용하여 접속 User의 Cart_item만 찾아서 저장
for(Cart_item cart_item : cart_items){
if(cart_item.getCart().getUser().getId() == buyer.getId()){
userCart_items.add(cart_item);
}
}
orderService.order(buyer,userCart_items);
// 반복문을 이용하여 접속 User의 Cart_item 만 찾아서 삭제
for(Cart_item cart_item : userCart_items){
// 재고 변경
int stock = cart_item.getItem().getStock(); // 현재 재고를 변수에 저장
if(stock < cart_item.getCount()){
throw new OutOfStockException("상품의 재고가 부족합니다. ( 현재 재고 수량 : " + stock + ")");
}
stock = stock - cart_item.getCount(); // 저장된 변수를 결제한 갯수만큼 빼준다
cart_item.getItem().setStock(stock); // 재고갯수 변경
// 금액 처리
User seller = cart_item.getItem().getUser();
int cash = cart_item.getItem().getPrice(); // 아이템 가격을 변수에 저장
if(buyer.getMoney() < cash){
throw new OutOfMoneyException("보유 머니가 부족합니다 . ( 현재 보유 머니 : " + buyer.getMoney() + ")");
}
buyer.setMoney(cash * -1);
seller.setMoney(cash);
}
}
완성된 코드는 다음과 같다.
다음과 같이 나오도록 구현하였다.
Spring boot에서 예외처리를 하는 방법은 정말 여러가지가 있었다.
Rest API 를 이용하거나, Exception Handler를 이용하는 방법등..
하지만 나는 간단하게 예외처리를 하도록 구현하였고 이전에 개발했던 코드들에도 예외처리가 필요한 부분을 수정할 예정이다!