본문 바로가기

Spring

Business Exception 처리

요구사항에 맞지 않을 경우 발생하는 Exception을 어떻게 발생시킬까 고민해보자.

예를들어 쿠폰을 사용하고 싶은데, 이미 사용한 쿠폰인 경우에는 더이상 로직을 이어가면 안된다.

그러므로 , 적절한 Exception 을 발생시키고, 로직을 종료시켜야 한다.

즉, 개발자가 로직의 흐름상 필요에 의해서 직접 발생시키는 Exception 들을 말한다,.

 

로직 도중 stop 해야할 곳에서는 반드시 .Exception을 이용해서 끊어주어야 한다.

그렇지 않으면, 다음 로직에서 책임이 더 커지고, 코드가 무거워지게 된다.

 

먼저 Exception을 적절히 이용하지 않고, 에러 메세지 출력으로 로직을 짠 코드르 보이겠다.

가독성이 좋지 못해서 핵심 비즈니스를 파악하기 어렵다.

if else처리 코딩도 어려울 것이다.

public class DeviceController {
    ...
    public void sendShutDown() {
        DeviceHandle handle = getHandle(DEV1);
        // 디바이스 상태를 점검한다.
        if (handle != DeviceHandle.INVALID) {
            // 레코드 필드에 디바이스 상태를 저장한다.
            retrieveDeviceRecord(handle);
            // 디바이스가 일시정지 상태가 아니라면 종료한다.
            if (record.getStatus() != DEVICE_SUSPENDED) {
                pauseDevice(handle);
                clearDeviceWorkQueue(handle);
                closeDevice(handle);
            } else {
                logger.log("Device suspended. Unable to shut down");
            }
        } else {
            logger.log("Invalid handle for: " + DEV1.toString());
        }
    }
    ...
}

 

예외처리를 이용해서 핵심비즈니스 코드가 명료하게 드러나는 코드를 보이겟다.

public class DeviceController {
    ...
    public void sendShutDown() {
        try {
            tryToShutDown();
        } catch (DeviceShutDownError e) {
            logger.log(e);
        }
    }

    private void tryToShutDown() throws DeviceShutDownError {
        DeviceHandle handle = getHandle(DEV1);
        DeviceRecord record = retrieveDeviceRecord(handle);
        pauseDevice(handle);
        clearDeviceWorkQueue(handle);
        closeDevice(handle);
    }

    private DeviceHandle getHandle(DeviceID id) {
        ...
        throw new DeviceShutDownError("Invalid handle for: " + id.toString());
        ...
    }
    ...
}

출처 cheese10yun.github.io/spring-guide-exception/