자바 8에 추가된 Optional이 제공하는 ifPresent를 사용해서 null을 확인하는 if 문을 줄일 수 있다.
Member member = memberRepository.findById(id);
if (member != null) {
if (member.isAdmin()) {
member.addAdminPermissions();
} else {
member.addDefaultPermissions();
}
}
이런 코드가 있다고 가정해보자. memberRepository가 제공하는 findById를 Member 타입을 리턴하는데 이 값을 null일 수도 있기 때문에 if (member != null)과 같은 코드가 존재한다.
이 코드에 이제 Optional을 적용한 다음코드를 살펴보자.
Member member = memberRepository.findById(id);
Optional<Member> memberOptional = Optional.ofNullable(member);
if (memberOptional.isPresent()) {
if (member.isAdmin()) {
member.addAdminPermissions();
} else {
member.addDefaultPermissions();
}
}
오히려 인스턴스를 Optional로 감싼 다음 isPresent로 boolean 값으로 받아오는 번거로운 과정이 추가됐고 코드는 더 읽기 힘들어졌다.
Optional을 적용하고 싶다면 Member를 리턴하는 findById에서부터 시작해야 한다. findById가 Member가 아니라 Optional을 리턴하게 바꾸고 isPresent가 아닌 ifPresent를 사용하면 Consumer 타입의 함수를 제공할 수 있다.
Optional<Member> memberOptional = memberRepository.findById(id);
memberOptional.ifPresent(member -> {
if (member.isAdmin()) {
member.addAdminPermissions();
} else {
member.addDefaultPermissions();
}
});
보다시피, null을 확인하던 if 문 대신에 ifPresent 함수를 호출하면서 그 안에 함수를 제공했다. 값이 존재하는 경우에 그 안에 있는 내용을 실행한다고 읽을 수 있으니 null 을 확인하는 if 문을 사용했던 첫번째 예제에 비해 코드량도 조금 줄어들고 가독성도 좋아졌다. 이런식으로 활용하는 것을 권장한다고 한다.
출처: https://ykh6242.tistory.com/entry/Java8-Optional-의-ifPresent-활용 [경호의 공부방:티스토리]
https://www.whiteship.me/optional-ifpresent/
'JPA' 카테고리의 다른 글
영속성 전이(CASCADE)에 관해 (2) | 2022.10.06 |
---|---|
SpringBoot JPA Multiple Databases 설정 (0) | 2022.10.02 |
@Transactional(rollbackFor = Exception.class) 에 대해 (0) | 2022.08.26 |
(Spring Data JPA)리스트에서 첫번째 값만 가져오기 (0) | 2022.08.24 |
페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법 (0) | 2022.07.14 |