[TIL]12.23 Optional의 orElse,orElseThrow

hyewon jeong·2022년 12월 23일
0

TIL

목록 보기
8/138
post-thumbnail

1. 문제점 :

Required type 은 Posts 타입인데 Provided은 Optional 으로 변경하라는 에러창이 떴다.

 Posts posts = postsRepository.findById(postsId).orElseThrow(
   ()->new IllegalArgumentException(("해당 글이 존재하지 않습니다."))
 );

## 2. 시도한 점:

Optional posts = postsRepository.findById(postsId);


Optional wrapping Class로 감싸서 NullPointException 방어를 하니 에러가 해결되었다.

Optional은 명시적으로 변수에 대한 null가능성을 표현하면서 ,
null체크를 직접하지 않아도 되고,
Null Point Exception 이 발생 할 가능성이 있는 값을 직접 다룰 필요가 없는 장점이 있지만

반면

단점으로
Wrapper 클래스이기 때문에 두 개의 참조를 가지므로 생성 비용이 비싸다.
직렬화 불가능하기 때문에 클래스의 인스턴스 필드로 사용하면 안된다.
필드로 사용하기 위해 고안된 것이 아니기 때문에 값을 반환하는 용도로 사용해야 한다.

3. 해결

         Posts posts = postsRepository.findById(postsId).orElseThrow(
                 ()->new IllegalArgumentException(("해당 글이 존재하지 않습니다."))
         );

4. 알게 된 점:

orElseThrow의 사용법

User user = userRepository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("user doesn't exist");

orElseThrow는 Optional의 인자가 null일 경우 예외처리를 시킨다.
보통 JPA 사용 시에 위처럼 사용하는데 가져온 값이 null일 경우 예외를 발생시킨다.

5. 기타 공부

Optional?

자바에서 Null 참조시 NullPointerException을 방지해주는 클래스를 말한다.

위의 코드에서 Optional.ofNullable()이 아닌 Optional.of() 메소드를 이용하면 NullPointerException이 발생한다.
Optional.of()는 들어올 데이터가 절대 null이 아닌 경우에만 사용하는데 null을 넣었기 때문이다.
Optional의 목적은 자바 개발 시 NullPointerException이 너무 자주 발생해서 데이터가 null이어도 처리가 가능하도록 도와주는 것이 Optional이라고 보면된다.

🎈orElseThrow의 사용법

User user = userRepository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("user doesn't exist");

orElseThrow는 Optional의 인자가 null일 경우 예외처리를 시킨다.
보통 JPA 사용 시에 위처럼 사용하는데 가져온 값이 null일 경우 예외를 발생시킨다.

🎈 orElse~를 활용하는 법(JPA)🎈

여러 곳에서 활용할 수 있겠지만 개인적으로 느끼기에 가장 적극적으로 쓰인다고 생각하는건 Spring Data JPA다.

Optional<User> user = userRepository.findById(id); //정상
User user = userRepository.findById(id); //에러

Spring Data JPA 메소드return 값이 Optional 로 이루어져있다.
그러므로 위처럼 Optional 타입으로 받아야 정상 처리된다.

String name1 = Optional.ofNullable("test1").orElse("test2"); // 맞음
Optional name1 = Optional.ofNullable("test1").orElse("test2"); // 틀림

위에서 설명했던 코드를 다시 가져와서 복습해보자면 orElse~를 사용하는 경우 null이 아닐 시 Optional의 인자가 반환된다.

Optional 타입이 반환되는 것이 아니다.

User user = userRepository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("user doesn't exist");

마찬가지로 Spring Data JPA 메소드는 orElse~를 사용할 수 있는데, orElse~ 문법을 사용하면 null이 아닐 경우 내부적으로 Optional의 value를 가져오도록 구현되어있다.

그러므로 이때는 User라는 Entity 객체로 받아서 처리할 수 있다.

JPA 연관관계

  • 폴더 Entity 관점

    • 폴더 여러 개를 회원 1명이 가질 수 있음
    • "@ManyToOne"
      public class Folder{
          @ManyToOne
          private User user;
      }
    • 폴더를 소유한 회원을 조회
      folder.getUser();
  • 객체의 관계를 맺어주면, DB 의 관계 설정 맺어줌

    • 객체) 회원과 폴더의 관계 폴더를 소유한 회원 id 가 아닌 객체를 저장
    • DB) 회원과 폴더의 관계 외래키를 통한 관계 형성

  • JPA 연관관계 Column 설정방법
    @ManyToOne
    @JoinColumn(name = "USER_ID", nullable = false)
    private User user;
    • @JoinColumn 내 속성값 설정
      • name: 외래키 명
      • nullable: 외래키 null 허용 여부
        • false (default)
          • 예) 폴더는 회원에 의해서만 만들어짐. user 값이 필수
        • true
          • 예) 공용폴더의 경우, 폴더의 user 객체를 null 로 설정하기로 함
profile
개발자꿈나무

0개의 댓글