[JPA]Optional이란?

배지원·2022년 12월 3일
0

SpringBoot

목록 보기
10/11

Optional은 주로 JPA 쿼리문을 통해 DB에서 데이터를 호출할때 만약 데이터가 없을때 null값을 피하기 위해 사용한다.

Optional 메서드

  • Optional은 기능이 실행되었을때 null이 올 수 있는 값을 감싸는 Wrapper클래스로 NullPointException(에러)이 발생하지 않게 해준다.

    Optional 클래스는 해당값이 null일 경우 예외처리를 통해 원하는 방식으로 변경하여 출력할 수 있다.

1. Empty( )

  • null을 담고 있는, 한 마디로 비어있는 Optional 객체를 얻어온다.
Optional<Member> maybeMember = Optional.empty();

2. isEmpty( )

  • 값이 있는지 없는지 확인한다
  • 값이 없다면 true, 값이 있다면 false를 반환한다.
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);

if (optionalHospital.isEmpty()) {
		// ...
}

3. isPresent( )

  • 값이 있는지 없는지 확인한다
  • isEmpty와 반대로 값이 있으면 true, 없으면 false를 반환한다.
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);

if (optionalHospital.isPresent()) {
		// ...
}

4. get( )

  • 값을 가져오는 메서드
  • 값이 없다면 예외 발생
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);

Hospital hospital = optionalHospital.get(); // 값이 없으면 예외 발생

5. orElseThrow( )

  • 값을 가져오는 메서드
  • 값이 없으면 예외처리를 통해 에러문이 동작하도록 한다.
  • null값일때 RuntimeException 에러 "해당 병원 정보를 찾을 수 없다" 표시
Hospital hospital = hospitalRepository.findById(id)
	.orElseThrow(() -> new RuntimeException("해당 병원 정보를 찾을 수 없습니다."));

6. ifPresent( )

  • 값을 가져오는 메서드
  • 값이 있을때 예외처리를 통해 에러문이 동작하도록 한다.
  • 이미 등록된 유저 아이디일경우 RuntimeException 에러 "중복된 아이디" 표시
User user = userRepository.findByUserName(id)
	ifPresent.(() -> new RuntimeException("아이디가 중복됩니다.."));

7. ofNullbale( ), orElse( ), orElseGet( )

  • if/else문과 구조가 약간 비슷하다.
  • 값을 반환하는 메서드
  • Optional로 받는 데이터가 null이 될 수도 있고 아닐수도 있는 경우에사용하는 것으로 ofNullbale( )를 통해 생성할 수 있다. 그리고 orElse( ), orElseGet( )을 이용해서 값이 없는 경우라도 안전하게 값을 가져올 수 있다.
  • .of( )를 통해 Teacher(name,likestudy,likesport) 객체의 값을 필수로 받아 온다.
  • 그리고 ofNullable( )을 통해 optionalTeacher3에 저장되어 있는 name의 값이 있을경우 해당 name을 반환하는데 현재는 null값이 저장되어 있으니 orElse( )를 통해 "이름이 없습니다"를 반환하게 된다.
// 데이터가 있는 경우
Optional<Teacher> optionalTeacher3 = Optional.of(new Teacher("han", true, true));
        String name = Optional.ofNullable(optionalTeacher3.get().getName()).orElse("이름이 없습니다.");
-----------
결과 : han

// 데이터가 없는 경우
Optional<Teacher> optionalTeacher3 = Optional.of(new Teacher(null, true, true));
        String name = Optional.ofNullable(optionalTeacher3.get().getName()).orElse("이름이 없습니다.");
-----------
결과 : 이름이 없습니다.

❓orElse( ), orElseGet( ) 차이점은 무엇일까?

orElse( )

  • 파라미터 값을 필요로한다
  • 값이 null일 경우 동작한다.


    orElseGet( )
  • 파라미터로 함수(함수형 인터페이스)를 필요로 한다.
  • 값이 null일 경우 동작한다.

8. of( )

  • 값이 Null이 아닌 경우 사용한다.
  • 무조건 받아오는 값이 null값이 아닐경우 사용하고 만약 null값이 들어오면 NullPointerException이 발생한다.
  • 예를 들어 회원가입할때 필수로 입력해야 하는 값들이 있는데 그 값들을 제외하고 입력하는 것을 방지할때 사용한다. 필수로 입력해야 하는 데이터에 대해서 of로 감싸서 무조건 받을 수 있도록 한다.
    Optional<Teacher> optionalTeacher1 = Optional.of(new Teacher("k", true, true));
           Teacher teacher = optionalTeacher1.get();
profile
Web Developer

0개의 댓글