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() 호출하여 외부 자원인 네트워크를 끊어주어야 한다.