Java 예외 처리 - 네트워크 예제 리팩토링 3

이전 시간을 이어서 네트워크 코드를 개선 사항을 체크하고 이어서 작업한다.

개선사항 체크하기

  • 예외 처리가 없으므로 복구되지 않았다. 예외 발생 시 반드시 종료된다. -> 해결
  • 사용 후 반드시 disconnect() 호출하여 연결을 해제해주어야 한다. -> 해결안됨
  • 예외 처리 했으나 정상, 예외 흐름이 두 개가 생겨 가독성이 저하되었다 -> 신규개선

예외 처리를 했으나 정상 흐름과 예외 흐름이 각각 생겨 가독성이 저하된 모습을 볼 수 있었는데 개선이 필요하다


정상, 예외 흐름 분리하기

try ~ catch 기능을 올바르게 활용하여 정상 흐름과 비정상 흐름을 해결해보자.

Before (try ~ catch 문)

try {
    client.connect();
} catch (NetworkClientException e) {
    System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
    return;
}

try {
    client.send(data);
} catch (NetworkClientException e) {
    System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
    return;
}

client.disconnect();
  • 정상 흐름과 예외 흐름이 분리될 필요가 없다. 합쳐주도록 한다.

After (try ~ catch 문)

try {
    client.connect();
    client.send(data);
    client.disconnect();
} catch (NetworkClientException e) {
    System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
}
  • 간결하고 가독성이 높다. 정상 흐름에서 무엇을 하는 것인지 알 수 있고 예외 처리는 어떻게 되었는지 확인할 수 있다.

전체 코드는 다음과 같다.

NetworkService.class

public class NetworkService {

    public void sendMessage(String data) throws NetworkClientException {
        String address = "http://kiioio.com";
        NetworkClient client = new NetworkClient(address);
        client.initError(data); // 오류 코드로 반환.

        try {
            client.connect();
            client.send(data);
            client.disconnect();
        } catch (NetworkClientException e) {
            System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
        }
    }
}
  • 정상 흐름과 예외 흐름이 합쳐져 가독성이 높아졌다.

개선사항 체크하기

  • 사용 후 반드시 disconnect() 호출하여 연결을 해제해주어야 한다. -> 해결안됨
  • 예외 처리 했으나 정상, 예외 흐름이 두 개가 생겨 가독성이 저하되었다 -> 해결

이제 disconnect() 호출하여 외부 자원인 네트워크를 끊어주어야 한다.