JpaRepository에서 Optional 객체에 담긴 정보 가져오기

Dev_ch·2022년 11월 4일
1
post-thumbnail
본 글은 2022.09.30에 작성된 게시글 입니다.

개발을 시작하기 얼마 안됐을때쯤 JPA를 통해 Optional 객체로 사용자의 정보를 가져와서 리스트나 아니면 다른 값으로 Response 해주는걸 하다가 의문점이 들었다. 그럼 원하는 정보를 하나만 딱 뽑아서 가져오는건 어떻게하지..? 이것만 쉽게 한다면 세상 뭐든걸 다 개발할 수 있을 것 같아서 바로 찾아봤다.

사실 그렇게 어려운건 아니다. Optional 클래스에 대한 지식이 어느정도만 있어도 충분히 가능한 수준이지만 자린이였던 내가 그런걸 알리가 없다. 그렇기 때문에 바로 다시 개념 공부,, 아래는 필자가 생각하기에 간단한 개념정리가 잘되어있다고 생각한 블로그이다.

Optional에 대하여

흔히 우리가 자주 사용하는 Jpa에서 findById를 하였을때 이 값은 Optional로 return하게 된다. 그러면 우리가 조회한 값을 Optional에서 가져올려면 어떻게 해야할까?

해결


우리는 ShopData라는 사용자의 클릭에 반응하는 빅데이터 Entity가 있다고 가정한다면, 이와 같이 Repository를 생성할 것 이다. 여기서 우리는 shopDataRepository.findById를 통해 Entity에 접근하여 값을 가져와 사용자가 클릭할때마다 사용자의 정보에 따라 빅데이터가 하나씩 늘어날 것이다.

그렇다면 사용자가 클릭한 후 사용자의 데이터가 Post 되었을때 그에 맞게 늘어난다면, ShopData에 현재 데이터를 바로 불러와야 할 것이고 이는 클라이언트의 JWT에서 꺼낼 수 없는 정보이기에 Shop의 Id로 접근하여 ShopData의 Entity로 접근하여서 데이터를 가져올 것이다. 그렇다면 가져온 findById로 가져온 Optional에서 정보들을 꺼내보도록 하자.

ShopData Entity로 findById가 접근해 Optional값을 return하기 때문에 Optional에 담겨있는 값은 ShopData Entity일 수 밖에 없다. 즉 return된 Optional에서 정보를 꺼내기 위해선 ShopData 객체를 하나 생성하여 그 안에 Optional을 담아주면된다.

ShopData Entity는 @Getter 어노테이션을 담고있어서 각각의 attribute에 접근이 가능하기 때문에 생성한 객체에 Optional를 담고 그 객체에서 자신이 원하는 값을 get으로 가져오기만 하면 끝!

기타내용


  1. orElseThrow가 뭐죠 ?
    -> Optional에 담긴 값이 없다면 throw를 던져줌, Exception 커스텀 가능

  2. () -> new NullpointException() 처럼 람다식으로 구현하지 않는이유 ?
    -> 개인의 취향이 아닐까 싶음 / 필자는 메소드 참조 형식이 보기 편해서 저렇게 함

  3. 커스텀한 JPA 구문도 사용 가능한가요 ?
    -> Optional로 선언했다면 사용 가능 !

  4. 꼭 Entity에 담아야 하나요?
    -> 안담아도 사실 상관없음, 다만 객체를 이용해 값을 꺼내오는걸 보여주고 싶었어요,,

profile
내가 몰입하는 과정을 담은 곳

0개의 댓글