[checked Exception, unchedked Exceoption 차이가 뭘까❓at java]
컴파일 시점에 예외를 알 수 있기 때문에 예외 책임을 전가(throws) 하지 않으면 컴파일 에러가 난다.
런타임 시점에 발생하는 예외 이기 때문에 예외 책임을 전가 하지 않아도 된다.
Unchecked Exceoption을 던지면 java에서는 JVM까지 전달돼서 프로그램을 종료 시키고, spring에서는 DispatcherServlet까지 전파돼서 500 에러를 반환시킨다.
[custom Exception 어떻게 만들어야 하는가❓at java]
Exception 클래스를 상속받아 custom 하는 순간 Exception 최상위 계층에 위치하게 돼서 checked Exception 처럼 사용해야하기 때문에 unchecked Exception 을 사용할 수 없게 된다. 따라서 각 계층에 맞는 Exception을 상속받아 custom 해줘야 한다.
[옵셔널 왜 쓰는가❓at java]
가독성: Optional을 반환하는 메소드는 null을 반환할 수 있음을 나타내기 때문에 직관적으로 null 핸들링 로직을 이해할 수 있다.
편의성: null을 처리하기 위한 로직을 Optional 메서드를 통해 간편하게 처리할 수 있다.
위와 같이 가독성과 편의성을 위해 옵셔널을 사용하고 옵셔널 메서드로 로직을 간편화 할 수 있다.
get
은 값이 있으면 그 값을 반환하고 없으면 NoSuchElementException
라는 unchecked exception을 반환하는 메서드 이다.
isPresent
은 값이 있으면 true 없으면 false를 반환하는 메서드 이다.
하지만 get
과 isPresent
는 지양하라고 한다. isPresent
는 if문을 사용하여 null인지 아닌지를 체크하는 로직과 다름이 없고 get
은 NoSuchElementException
라는 예외만 던질 수 있기 때문에 Optional을 사용하는 의미가 없어 진다. 이런 이유로 사용을 지양해야 하는 것 같다.
optional을 field
에서 사용을 지양하라는 말도 있다. 애초에 optinal은 반환타입이 null인지 아닌지를 체크 하기위해 태어난 아이다. 때문에 optional타입을 메서드 매개변수 타입으로 정의해놓거나 field
로 사용할 시 또 다시 NPE를 발생시키는 문제를 야기 할 수 있다. 그리고 Optional은 객체를 감싸는 컨테이너이므로 Optional 객체 자체를 저장하기 위한 메모리가 추가로 필요하기 때문에 비용이 더 든다. 이런 이유 때문에 Optional 반환타입을 체크하기 위한 용도로만 사용해야 한다.
[Null 처리를 위한 방법이 Optional뿐 일까❓]
🐻guru: Introduce Null Object 를 보면
npe가 발생하지 않게 하기 위해 null을 가질 수 있는 객체에 대해 다음과 같은 코드로 항상 확인 해야 하기 때문에 null확인 코드가 계속 생기고 코드가 더러워 진다.
if (customer == null) {
plan = BillingPlan.basic();
}
else {
plan = customer.getPlan();
}
이러한 조건문을 없애기 위해 null 역할을 할 서브클래스를 생성하여 NPE를 방지할 수있다.
class Customer {
boolean isNull() {
return false;
}
}
class NullCustomer extends Customer {
boolean isNull() {
return true;
}
Plan getPlan() {
return new NullPlan();
}
// Some other NULL functionality.
}
// Replace null values with Null-object.
Customer customer = (order.customer != null) ?
order.customer : new NullCustomer();
// Use Null-object as if it's normal subclass.
plan = customer.getPlan();
두 클래스 모두에서 isNull() 메서드를 생성하여 null 객체의 경우 true, 실제 클래스의 경우 false를 반환하도록 하면 다형성을 통해 다른 동작을 구현할 수 있게 된다.