Optional (옵셔널) (+orElseThrow)

coding S's avatar
Mar 20, 2024
Optional (옵셔널) (+orElseThrow)

[ Optional이란? ]

메소드가 결과값을 반환할 때 null을 직접 반환하는 대신에 사용된다. 이는 null 처리를 보다 명시적으로 하여, NullPointerException과 같은 런타임 예외를 방지하는 데 도움 -> Optional을 사용하면, 메소드의 반환 타입이 Optional<T> ! -> User 객체를 반환하는 메소드가 있고, 해당 메소드가 User 객체를 찾지 못할 경우 null을 반환하는 대신, Optional<User> 타입을 반환! -> 안전하게 값처리 가능!
💡
Optional타입은 return을 Optional<T> 로 받아야함!
 

[ Optional 객체를 사용하는 주된 이유 ]

null 처리를 보다 명시적으로 하여 NullPointerException을 방지하는 것 우리는 .orElseThrow를 사용했다.
 

[ orElseThrow 메소드 ]

Optional 객체가 값을 가지고 있지 않을 경우, (내부적으로 null을 담고 있을 때) 사용자가 지정한 예외를 던지게 해줌!
@RequiredArgsConstructor @Service public class UserService { private final UserJPARepository userJPARepository; //조회라 트랜젝션 안 붙여도 됨! public User 로그인(UserRequest.LoginDTO requestDTO) { //나중에 해시 비교하는 이런 코드 여기에 들어옴 User sessionUser = userJPARepository.findByUsernameAndPassword(requestDTO.getUsername(), requestDTO.getPassword()) .orElseThrow(() -> new Exception401("인증되지 않았습니다")); return sessionUser; }
리턴값이 옵셔널이니까... 이렇게 orElseThrow로 사용할 수도 있다! 내가 ssar , 1234를넣으면 옵셔널에 값이 들어감. (존재하니까) 만약, ssar. 12345를 넣으면 옵셔널에 null 이 들어감. (존재x) orElseThrow는 내부에 람다식을 넣어서 사용하는데, Optional 객체가 null이 아닌 값을 포함하고 있으면 그 값을 반환하고, Optional 객체가 비어있다면 (즉, 값이 null이라면) 사용자가 제공한 예외를 던진다! -> Optional을 사용하면 메서드의 리턴 값이 null일 가능성이 있는 경우에도 안전하게 처리가능!
 

[ 만약 없는 id값을 조회한다면? ]

notion image
💡
Optional 덕분에 NullPointerException 방지
 

notion image
💡
Optional 없이 해봤다. 없는 걸 꺼냈으니 당연히 터짐 → 이런걸 방지 해주는게 옵셔널!
 
Share article

codingb