JPA로 개발하다가 JpaRepository로 find를 사용해서 객체를 조회하면 Optional로 감싸져서 반환되는걸 볼 수 있다.
왜 Optional로 반환하는게 좋은가?
궁금해서 찾아본 결과 예외 처리에 좋다고 한다. 근데 나는 Optional을 사용할 때랑 안할 때랑 try().. catch()로 예외를 처리해서 뭐가 좋은지 모르겠더라. 그래서 좋은 예외 처리를 찾아보기로 함.
먼저 Optional에 대한 개념에 대해 이해해보자
1. Optional이란?
NPE(NullPointerException)은 개발할 때 가장 많이 발생하는 예외 중 하나이다. NPE를 피하려면 null 여부 검사를 해야하는데 null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 "번거롭다."
java8에서는 Optional<T> 클래스를 사용해서 NPE를 방지할 수 있도록 도와준다. Optional<T>는 null이 될 수 있는 값을 감싸는 Wrapper클래스이다. 따라서 참조하더라도 NPE가 발생하지 않도록 도와준다.
여기서 Optional안에 있는 객체에 접근할 때 객체가 없으면 NPE가 발생하는 것이다.
중요한게 Optional은 값을 Wrapping하고 다시 풀고, 감싸져있는 객체가 null일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사용하면 시스템 성능이 저하된다.
그렇기 때문에 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다.
또한 Optional은 파라미터로 넘어가는 등이 아니라 반환 타입으로써 제한 적으로 사용되도록 설계되었음.
2. Optional 객체 접근
get()
메서드 사용해서 접근가능. 하지만 Optional안에 객체가 없으면 예외가 발생할 수 있으므로 isPresent() 메서드를 사용해서 값이 존재하는지 여부를 먼저 확인하는 것이 좋다.
또한 Optional 객체에 값이 있을 경우에는 orElse()나 orElseGet() 메서드를 사용해서 대체 값으 제공할 수 있음.
orElse()와 orElseGet 차이
- orElse: 파라미터로 값을 받는다.
- orElseGet: 파라미터로 함수형 인터페이스(함수)를 받는다.
orElse
파라미터로 받은 함수의 반환값을 orElse 파라미터로 전달.
Optional이 가진 객체가 null이 이면 반환값을 출력, 아니면 객체값을 출력
orElseGet
orElseGet은 함수 자체를 파라미터로 받아서 Optional이 가진 객체가 null일 때만 함수를 실행.
예제코드를 보면
public void findUserEmailOrElse() {
String userEmail = "Empty";
String result = Optional.ofNullable(userEmail)
.orElse(getUserEmail());
System.out.println(result);
}
public void findUserEmailOrElseGet() {
String userEmail = "Empty";
String result = Optional.ofNullable(userEmail)
.orElseGet(this::getUserEmail);
System.out.println(result);
}
private String getUserEmail() {
System.out.println("getUserEmail() Called");
return "mangkyu@tistory.com";
}
//출처: https://mangkyu.tistory.com/70 [MangKyu's Diary:티스토리]
위 코드 결과는 아래와 같음.
// 1. orElse인 경우
getUserEmail() Called
Empty
// 2. orElseGet인 경우
Empty
//출처: https://mangkyu.tistory.com/70 [MangKyu's Diary:티스토리]
orElse인 경우 객체가 null이건 null이 아니건 함수에 있는 로직이 무조건 실행됨.
orElseGet은 null일 경우에만 실행됨.
orElse는 값을 생성하여 orElseGet보다 비용이 크므로 최대한 사용을 피해야한다.
참고 자료
'언어 > JAVA' 카테고리의 다른 글
[JAVA] EOF 사용법 (0) | 2024.04.10 |
---|---|
Optional 올바르게 사용하자 (0) | 2024.03.30 |
[JAVA] 예외 (0) | 2023.10.05 |