매번 Mybtis만 사용하다가 JPA를 사용해보고 싶었는데 새로운 프로젝트에 JPA를 사용하기 전에 미리 게시판이라도 간단하게 만들어보자고 생각해서 코드를 짜보던 도중!
어? 근데 JPA는 select 날려서 가져온 entity에 값이 없으면 어떻게 처리해줘야 하는거지?
그래서 여기저기 찾아봤더니 !
JPA사용시 Optional을 통해서 기존에 null처리 했던 코드를 싸악 날릴 수 있다고 한다?! 🙄
Optional<T>
null의 가능성이 있는 객체를 감싸서 사용하는 형태의 Wrapper class,
기존에 null을 방지하던 코드들을 날리고 객체가 null이 아닐때만 실행할 로직들을 작성하거나 null일 경우 Exception을 발생시킬 수 있다.
public MemberDTO selectByAdminNum(int num) {
MemberDTO getMemberDto = memberMapper.selectByMemberNum(num);
if(getMemberDto == null) {
throw new CustomException(ExceptionEnum.Custom_EXCEPTION);
}
return getMemberDto;
}
public Member getMember(Long seq) {
// member를 return하기 위해서는 Optinal method를 이용해서 Member객체를 반환 해야함
Optional<Member> member = memberRepository.findById(seq);
// or
Member getMember = memberRepository.findById(seq).orElseThrow(IllegalArgumentException::new);
return getMember;
}
이렇게 한줄로 NPE 처리가 가능해진다.
ispresent()
Optional로 포장한 객체가 null일 경우 false null이 아닐 경우 true 반환ifpresent()
Optional로 포장한 객체가 null이 아닐 경우 ()안 코드라인 실행orElse()
Optional로 포장한 객체가 null, not null 상관없이 ()안 코드라인 실행orElseGet()
Optional로 포장한 객체가 null일 때 ()안 코드라인 실행orElseThrow()
Optional로 포장한 객체가 null일 경우 ()안 Exceoption 반환ispresent()
는 if를 사용하기 때문에 ifpresent()
를 사용하는 것이 좋음
orElse()
는 null 상관없이 코드가 실행되기 때문에 ->
orElseGet()
or orElseThrow()
사용하는 것이 좋음
기존에 if()를 통해서 null이 아닐 경우와 null 경우를 잡아서 처리를 해줘야 했지만,
JPA 사용시 Repository를 통해 Data를 가져올 때 Optional을 이용한다면 null처리를
따로 해주지 않아도 되기 때문에 코드 가독성이 확실히 좋아진다.
따라서 잘 사용해 볼 것! 👨🍳