티스토리 뷰

프로그래밍/Java

[Java] Optional 사용법

물고기고기 2023. 2. 8. 17:41

자바에서 없는 값(*아무것도 할당되지 않은)을 조회하려고하면 바로 NullPointerException가 발생하며 오류를 뱉곤합니다.

그런 값이 존재하는지 매번 검사해주기 힘든데 이를 위해 존재하는 것이 Optional입니다.

참조하더라도 에러가 발생하지 않도록 해당 값을 감싸는 Wrapper 클래스다.

 

1. 해당 값이 있는지 조회하는 로직

- 객체 단위로 optional로 받아주면 get으로 객체를 return할 수 있다

Optional<Reference> existReference = referenceRepository.findByTitle(title);

        if(existReference.isPresent()){
            return existReference.get();
        }

 

2. 해당 값이 절대로 null이 아닌 경우

- 해당 값을 참조하는 순간에 NPE를 뱉는 것이 아닌 해당 코드가 발생하는 순간에 NPE를 뱉는다

public Page<Post> makeWebFeed(Pageable pageable) {
        
        List<UserCategoryRelation> likedCategoryCodeList = userCategoryRelationRepository.findAllByUserId(SecurityUtil.getCurrentUserId());
        Page<Post> webFeed = postRepository.findAll(pageable);

        Optional.of(webFeed);
        return webFeed;
    }

 

추가로 Optional.of 경우 Static 메서드이기 때문에 따로 Optional 객체를 매번 생성하지 않아도 되는 이점이 존재한다.

Optional 객체를 참조하면 이런 메서드들이 나오는데 자세히 보면 of에 특정 값을 할당하면 null값인지 확인해주는 로직이다.

public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    
private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

 

3. 특정 값을 null로 받아줘도 되는 상황

- 어떤 데이터가 null이 와도 괜찮다면 Optional.ofNullbale로 생성하면 된다.

만약에 일단 가져오기는하는데 바로 특정 값이 null일때 throw로 에러를 뱉게하고 싶다면 orElseThrow 메서드를 사용하면 된다.

private Long returnUserId(String userNickname) {
        Optional<User> findUser = Optional.ofNullable(userRepository.findByNickname(userNickname));
        return findUser.get().getId();
    }

 

- 만약 특정 값이 없을때 빈칸을 return

private Long returnUserId(String userNickname) {
        Optional<User> findUser = Optional.ofNullable(userRepository.findByNickname(userNickname));
        findUser.orElse("");
        return findUser.get().getId();
    }

 

- 특정 값이 없을때 에러를 바로 뱉고싶다면

private Long returnUserId(String userNickname) {
        Optional<User> findUser = Optional.ofNullable(userRepository.findByNickname(userNickname))
        			.orElseThrow(() -> new UnderlineException(ErrorCode.CANNOT_FOUND_USER));
        return findUser.get().getId();
    }
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함