[Java] Optional 사용하기

19·2022년 7월 20일
0

Java

목록 보기
1/13

coco 프로젝트를 진행 중에, return null을 사용하지 말고, return Optional.empty()를 사용해보라는 튜터님의 피드백을 받았다.

기존

| Member.java

public Post findPost(Long postId) {
        if (postId <= 0) {
            return null;
        }
        for (Post post : posts) {
            if (post.getId() == postId) {
                return post;
            }
        }
        return null;
    }
  • Member에 저장되어 있는 Posts에서 특정(postId) Post를 찾는 메소드이다.
  • 매개변수로 넘어오는 postId가 유효하지 않으면 null을 반환한다.

| PostService.java

Post findPost = member.findPost(postId);
if (findPost == null) {
    return new ResponseEntity<>(
            PostUpdateResponseDto.builder()
                    .status(StatusMessage.BAD_REQUEST)
                    .build(),
            HttpStatus.valueOf(StatusCode.BAD_REQUEST)
    );
}
  • findPost()를 통해 Post를 찾아오고, null체크를 해준다.

변경

| Member.java

public Optional<Post> findPost(Long postId) {
        if (postId <= 0) {
            return Optional.empty();
        }
        for (Post post : posts) {
            if (post.getId() == postId) {
                return Optional.of(post); // -> return Optional.ofNullable(post);
            }
        }
        return Optional.empty();
    }
  • 기존에 null로 반환했던 부분을 Optional.empty()로 변경했다.
  • 반환형도 Optional로 감싼 형태로 변경했다. Optional<Post>
  • Optional로 감싸서 반환한다.

※ posts에서 postId와 일치하는 post를 찾으면 Optional.of(post)로 반환하는데, 이를 ofNullable로 변경해야 한다.

of로 반환할 때, post가 null이라면 NullPointerException이 발생한다.
하지만, Nullable로 반환하면, post가 null이어도 NullPointerException이 발생하지 않고 empty객체로 만들어져 반환된다.


| PostService.java

Optional<Post> postOptional = member.findPost(postId);
if (postOptional.isEmpty()) {
    return new ResponseEntity<>(
            PostUpdateResponseDto.builder().status(StatusMessage.BAD_REQUEST).build(),
            HttpStatus.valueOf(StatusCode.BAD_REQUEST)
    );
}
Post findPost = postOptional.get();
  • Optional로 감싼 객체를 null 체크 후, 이상없으면 get()메소드로 Post를 꺼낸다.
profile
하나씩 차근차근

0개의 댓글