seong

Optional 사용해서 예외처리 하기 - findById예시 본문

JPA

Optional 사용해서 예외처리 하기 - findById예시

hyeonseong 2022. 10. 26. 11:24

Optional이란?

Optional는 예외처리를 해주는 팩토리 패턴이다.

기본적인 로직을 짤때 DB에 값이 없는데 찾으려고 하면 null이 된다.

Optional을 만들어 놓으면 객체가 아래 처럼 박스에 들어와서 나갈땐 null체크를 진행하게 된다.

Board가 null은 가능하지만 Optional은 절대 null이 아니다.
Optional은 임의로 박스가 만들어져 Board가 들어가는 방식이기 때문이다.

실습

Repository에서 예외 처리 

Service로 가기전에 애초에 Repository에서 예외처리를 해서 리턴해주어야한다.

쿼리문 전체를 Optinal.ofNullable로 감싸준다. ofNullable를 하면 null값도 받는것이 가능 하다. 

  // Optinal - 예외처리
  public Optional<Board> findById(Long id) {
    Optional<Board> boardOP = Optional.ofNullable
    (em.createQuery("select b from Board b where b.id = :id", Board.class)
        .setParameter("id", id)
        .getSingleResult());
    return boardOP;
  }

Dto 작성

필요한것 - BoardRespDto 내부에 findById에 대한 것이 필요.

  // findById
  @Getter
  @Setter
  public static class BoardDetailRespDto {
    private Long id;
    private String title;
    private String content;
    private UserDto user;

    @Getter
    @Setter
    public static class UserDto {
      private Long id;
      private String username;

      public UserDto(User user) {
        this.id = user.getId();
        this.username = user.getUsername();
      }
    }

    public BoardDetailRespDto(Board board) {
      this.id = board.getId();
      this.title = board.getTitle();
      this.content = board.getContent();
      this.user = new UserDto(board.getUser());
    }
  }

Service 작성

isPresent - null이 아니라면 실행isEmpty - null이라면 실행


  @Transactional
  public BoardDetailRespDto findById(Long id) {
    Optional<Board> boardOP = boardRepository.findById(id);
    if (boardOP.isPresent()) {
      BoardDetailRespDto boardDetailRespDto = new BoardDetailRespDto(boardOP.get());
      return boardDetailRespDto;
    } else {
      throw new RuntimeException("해당 +" + id + "로 상세보기를 할 수 없습니다.");
    }

  }

Controller

  @GetMapping("/board/{id}")
  public ResponseDto<?> findById(@PathVariable Long id) {
    return new ResponseDto<>(1, "성공", boardService.findById(id));
  }