프레임워크/Spring, Spring Boot

[메타코딩] 스프링부트 강좌 26강(블로그 프로젝트) - id로 select 테스트

고용인 2022. 7. 28. 11:45

DummyControllerTest 내에 id 조회용 메서드를 생성합니다.

// http://localhost:8000/blog/dummy/user/5
// {id} 주소로 파라메터를 전달 받을 수 있음.
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) {
    // user/4을 찾으면 내가 데이터베이스에서 못찾아오게 되면 user가 null이 될 것 아냐?
    // 그럼 return null이 리턴이 되자나... 그럼 프로그램에 문제가 있지 않겠니?
    // Optional로 너의 User객체를 감싸서 가져올테니 null인지 아닌지 판단해서 return해!!!

    User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
        @Override
        public IllegalArgumentException get() {
            // TODO Auto-generated method stub
            return new IllegalArgumentException("해당 유저는 없습니다. id : " + id);
        }
    });

    return user;
}

이때 {id}는 주소로 파라메터를 전달 받을 수 있는 규칙입니다.

(단, 메서드 파라메터 부분에 @PathVariable을 추가해줘야 합니다.)

 

JPA를 통해 userRepository.findById 이용시 반환 타입은 Optional입니다.

필자는 User 객체로 반환하기 위해 findById 이후 orElseThrow를 사용합니다.

이때, findById의 상세내용을 봐보면 아래와 같습니다.

/**
 * Retrieves an entity by its id.
 *
 * @param id must not be {@literal null}.
 * @return the entity with the given id or {@literal Optional#empty()} if none found.
 * @throws IllegalArgumentException if {@literal id} is {@literal null}.
 */
Optional<T> findById(ID id);

만약 해당 값이 없을 경우에 대해서는 IllegalArgumentException으로 예외처리하기를 권장합니다.

 

먼저 orElseThrow를 사용하기에 앞서 orElseGet()을 통해 해당 메서드 내에서 Supplier객체를 선언하여 빈 객체를 던지도록 작성 할 수 있습니다.

User user = userRepository.findById(id).orElseGet(new Supplier<User>() {
    @Override
    public User get() {
        return new User();
    }
});

그러나 앞서 말씀드린것처럼 예외처리하는 방향을 선호하기에 orElseThrow를 통해 코드 작성을 마무리 짓습니다.

 

잘못된 id 값을 집어 넣었을 경우 아래와 같은 결과로 표출됩니다.

 

번외로 위의 코드와 같이 어떤 객체를 리턴하며, 어떤 exception을 넣어야하는지에 대한 불편함을 해소하는 방법으로 람다식을 이용 할 수 있습니다.

// 람다식
User user = userRepository.findById(id).orElseThrow(() -> {
    return new IllegalArgumentException("해당 사용자는 없습니다.");
});

 

작성 된 코드를 보게되면 return 타입이 User 객체임을 알 수 있습니다.

그러나 웹브라우저를 통한 요청에서는 해당 User 객체인 자바 오브젝트를 인식 할 수 없습니다.

기존의 스프링에서는 이를 위해서 json으로 변환을 하고자 Gson 라이브러리를 이용하였으나,

스프링 부트에서는 MessageConverter가 Jackson 라이브러리를 호출하여 자동적으로 변환하여 응답해줍니다.

 

 

 

 

 

강의 주소 : https://youtu.be/z_yxfFUX1xI