inblog logo
|
devJun
    Spring

    [Spring] Optional 클래스

    devJun's avatar
    devJun
    Aug 06, 2024
    [Spring] Optional 클래스
    Contents
    1. Optional 클래스란?2. 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
    Contents
    1. Optional 클래스란?2. Optional 사용하기

    devJun

    RSS·Powered by Inblog