[Spring] Optional 클래스

류재성's avatar
Mar 20, 2024
[Spring] Optional 클래스
 

1. Optional 클래스란?

 
💡
Optional은 값이 있거나 없을 수 있는 객체를 감싸는 래퍼(wrapper) 클래스이다. Optional은 null을 반환하면 오류가 발생할 가능성이 매우 높은 경우에 '결과 없음'을 명확하게 드러내기 위해 메소드의 반환 타입으로 사용되도록 설계되었다.
 
 
package shop.mtcoding.blog.user; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import java.util.Optional; public interface UserJPARepository extends JpaRepository<User,Integer> { // <오브젝트 타입, pk의 타입> User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); User findByUsername(@Param("username")String username); }
 
JPARepository 를 위와 같이 작성하였다. 만약 findByUsernameAndPassword 을 실행했다면 DB에서 데이터를 조회했을 때 데이터가 없다면 NullPointException 오류가 발생하고 , findByUsername 를 실행했다면 회원가입시 동일한 아이디를 입력했을 때 오류가 발생하게 된다.
 
notion image
 
동일한 아이디를 입력했을 때 오류가 발생한다. 이렇게 오류가 발생하는 경우 Optional 을 사용해 에러 메세지를 띄워보자.
 

2. Optional 사용하기

 
package shop.mtcoding.blog.user; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import java.util.Optional; public interface UserJPARepository extends JpaRepository<User,Integer> { // <오브젝트 타입, pk의 타입> Optional<User> findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); Optional<User> findByUsername(@Param("username")String username); }
 
💡
JPARepository 를 통해 조회한 데이터를 Optional 클래스로 감싼다.
 
 
@RequiredArgsConstructor @Service //ioc 등록 public class UserService { private final UserJPARepository userJPARepository ; @Transactional public void 회원가입(UserRequest.JoinDTO requestDTO){ //1.유효성검사(컨트롤러 책임) //2. 중복검사 Optional<User> userOP = userJPARepository.findByUsername(requestDTO.getUsername()); if(userOP.isPresent()){ //아이디가 중복된다면 throw new Exception400("중복된 유저네임입니다."); } userJPARepository.save(requestDTO.toEntity()); } public User 로그인(UserRequest.LoginDTO requestDTO){ User sessionUser = userJPARepository.findByUsernameAndPassword(requestDTO.getUsername(),requestDTO.getPassword()) .orElseThrow(() -> new Exception401("인증되지 않았습니다.")); // 조회했을 때 값이 NULL 일때 THROW 를 날림 return sessionUser ; } }
 
 
💡
서비스 레이어를 만든다. 서비스 레이어는 레파지토리의 메서드를 조합해 실제 기능을 수행하는 레이어이다. 서비스 레이어에서 조회되는 데이터의 예외 경우를 throw 통해 메세지를 던진다.
 
notion image
 
Share article

{CODE-RYU};