inblog logo
|
codingb
    Spring

    Optional (옵셔널) (+orElseThrow)

    coding S's avatar
    coding S
    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

    RSS·Powered by Inblog