[Spring Boot 쇼핑몰] 예외처리

개발자·2022년 2월 2일

Spring boot 쇼핑몰

목록 보기
12/14

서론

Spring boot 쇼핑몰을 개발하면서 다양하게 예외처리를 할 일이 생긴다.
기본적으로는 (if/else) 구문을 이용하여 분기를 나누어 처리하거나
(try/catch) 구문을 사용한다. 하지만 이것을 이용하면 모든 메소드에 try/catch 구문을 사용하여야 하므로 코드 가독성이 매우 떨어지게 되며 개발자를 괴롭히게 된다....
try/catch 에 대한 클린코드에는 이런 멘트가 있다.

try/catch 블록은 원래 추하다. 코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섞는다.

따라서 나는 try/catch를 사용하지않고 Exception을 이용하여 처리하도록 하려한다.


예외처리

먼저 예외처리를 적용할 항목을 먼저 생각해보았다.

제일 필요한구간은 결제를 처리할때이다!

  • 주문을 할때에 재고가 주문갯수보다 없는경우
  • 주문을 할때에 잔액이 총주문금액보다 없는경우

다음 두가지에 대한 예외처리를 먼저 적용해 보려고 한다.

먼저 exception이라는 패키지를 만들어주고 그 아래에서 Exception 처리를위한 class를 만들어 주었다.

OutOfMoneyException.java

public class OutOfMoneyException extends RuntimeException{
    public OutOfMoneyException(String message){
        super(message);
    }
}

OutOfStockException.java

public class OutOfStockException extends RuntimeException{

    public OutOfStockException(String message){
        super(message);
    }
}

코드는 간단하다. 기존의 런타임예외처리를 상속받아 내가 원하는 메시지를 출력하도록 하는것이다.

CartService.java

@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);
        }
    }

완성된 코드는 다음과 같다.

View

  • 만약에 재고가 1인 상품을 110개 주문했을 경우의 화면

  • 만약에 금액이 100만원인 금액을 100만원이 없을경우의 화면

다음과 같이 나오도록 구현하였다.

마무리

Spring boot에서 예외처리를 하는 방법은 정말 여러가지가 있었다.
Rest API 를 이용하거나, Exception Handler를 이용하는 방법등..

하지만 나는 간단하게 예외처리를 하도록 구현하였고 이전에 개발했던 코드들에도 예외처리가 필요한 부분을 수정할 예정이다!

0개의 댓글