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
를 실행했다면 회원가입시 동일한 아이디를 입력했을 때 오류가 발생하게 된다.
동일한 아이디를 입력했을 때 오류가 발생한다. 이렇게 오류가 발생하는 경우 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 통해 메세지를 던진다.

Share article