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

이전 작성글의 리팩토링한 코드에서 개선사항이 있었다.

개선사항

  • 예외 처리가 없으므로 복구되지 않았다. 예외 발생 반드시 종료된다.
  • 사용 후 반드시 disconnect() 호출하여 연결을 해제해주어야 한다.

NetworkClientException.class

public class NetworkClientException extends Exception {
    private String errorCode;

    public NetworkClientException(String errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    // 에러 코드 조회하기
    public String getErrorCode() {
        return errorCode;
    }
}

참고

  • 파라미터로 들어온 message는 super 키워드로 Exception 상위 생성자로 생성하는 것을 볼 수 있다.
  • super 키워드로 인해 상위 생성자를 호출하고 message 는 detailMessage 필드로 저장된다.

NetworkClient.class

public class NetworkClient {
    private final String address;
    public boolean connectError;
    public boolean sendError;

    public NetworkClient(String address) {
        this.address = address;
    }

    public void connect() throws NetworkClientException {
        // exception error
        if (connectError) {
            throw new NetworkClientException("connectError", "Connect Open Failed");
        }

        // Connect Success
        System.out.println(address + " Connect Open Success");
    }

    public void send(String message) throws NetworkClientException {
        if (sendError) {
            throw new NetworkClientException("sendError", "Send Failed");
        }
        // 전송 성공
        System.out.println(address + " Send Message data: " + message);
    }

    public void disconnect() {
        System.out.println(address + " Connect Closed Success");
    }

    public void initError(String data) {
        if (data.contains("error1")) {
            connectError = true;
        }

        if (data.contains("error2")) {
            sendError = true;
        }
    }
}

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); // 오류 코드로 반환.

        client.connect();
        client.send(data);
        client.disconnect();
    }

    private static boolean isError(String connectResult) {
        return !connectResult.equals("success");
    }
}

Main.class

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws NetworkClientException {

        NetworkService networkService = new NetworkService();

        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("Send Message data: ");
            String input = scanner.nextLine();
            if (input.equals("exit")) {
                break;
            }
            networkService.sendMessage(input);
            System.out.println();
        }
        System.out.println("네트워크 프로그램 종료");
    }
}

NetworkService 코드에서 예외 처리가 없으므로 무조건 던지도록 되어있다.
아래와 같이 try ~ catch 문법을 사용하여 에러를 처리하는 로직으로 바꿔주자.


리팩토링 1

Network.Service.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();
        } 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();
    }

    private static boolean isError(String connectResult) {
        return !connectResult.equals("success");
    }
}

Send Message data: error1
[Error] Code: connectError, Message: Connect Open Failed

Send Message data: error2
http://kiioio.com Connect Open Success
[Error] Code: sendError, Message: Send Failed

Send Message data: open
http://kiioio.com Connect Open Success
http://kiioio.com Send Message data: open
http://kiioio.com Connect Closed Success

  • try ~ catch 문으로 connect(), send() 메소드와 같이 예외 발생 포인트로 잡았다.
  • 예외를 잡은 경우 오류 코드와 메시지 출력하기
  • 예외로 잡아 처리하였기에 정상 흐름으로 복귀한다.
  • 예외가 잡힌 경우 return 메소드에서 빠져나온다.

개선사항 체크하기

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