인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

한조님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

문제와 풀이

문제와 풀이 invokeAll()로 풀때 예외처리

작성

·

46

0

안녕하세요 해당 문제를 invokeAll()로 풀었는데 예외처리 부분을 어떻게 처리해야할지 궁금해 질문 올렸습니다.

저는 예외를 main메서드에서 잡았지만 , NewOrderService에 try-catch문을 써서 예외를 잡는게 뭔가 응집도가 높아보인다 해야하나? 관련있는 코드끼리 모여있어서 더 유지보수 하기 좋은 코드라고 생각합니다.

그럴려면 order 메서드 안에 이중 try문을 써야하는게 최선인가요? (invokeAll, future.get() 2번)

 

public class NewOrderService {

    private final ExecutorService es = Executors.newFixedThreadPool(10);

    public void order(String orderNo) throws InterruptedException, ExecutionException {
        InventoryWork inventoryWork = new InventoryWork(orderNo);
        ShippingWork shippingWork = new ShippingWork(orderNo);
        AccountingWork accountingWork  = new AccountingWork(orderNo);
        List<Callable<Boolean>> works = List.of(inventoryWork, shippingWork, accountingWork);

        //작업 요청
        try {
            List<Future<Boolean>> futures = es.invokeAll(works);

            for (Future<Boolean> future : futures) {
                Boolean result = future.get();
            }
        } finally {
            es.close();
        }

    }

    .........InventoryWork,ShippingWork,AccountingWork 클래스
}

public class OrderServiceTestMain {

    public static void main(String[] args) {
        String orderNo = "Order#1234";
        NewOrderService orderService = new NewOrderService();

        try {
            orderService.order(orderNo);
            log("모든 주문 처리가 성공적으로 완료되었습니다.");
        } catch (ExecutionException e) {
            log("일부 작업이 실패했습니다.");
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 한조님

예외 처리라는 것이 딱 정답이 없는데요.

주문과 관련된 책임을 NewOrderService에서 다 처리하고 싶다면

order() 메서드 안에서 예외를 모두 잡아서 처리하면 됩니다. 그리고 호출자에게 예외로 알려야 한다면, 주문과 관련된 예외로 변경해서 밖으로 던지시면 됩니다.

예를 들어서 OrderException()과 같은 예외를 만들어서 밖으로 던지시면 됩니다. 이렇게 하면 구현해야 하는 코드가 많아지는 단점이 있지만, 호출자가 멀티스레드 관련 예외를 몰라도 되는 장점이 있습니다.

 

try를 나누어서 해야하는 지는 얼마나 예외를 자세히 처리하고 싶은지에 따라 달라지는데요.

실제로 업무 로직마다 “쓰레드 풀에서 작업을 등록하는 시점”“등록된 작업을 꺼내 결과를 처리하는 시점”에 대한 예외가 달리 처리되어야 할 수 있습니다.

하지만 단순한 시나리오라면 예외 처리를 크게 구분할 필요 없이 한꺼번에 처리해도 무방합니다.

감사합니다.

한조님의 프로필 이미지

작성한 질문수

질문하기