Controller
@RestController
public class DummyControllerTest {
@Autowired // 의존성 주입(DI)
private UserRepository userRepository;
// {id} 주소로 파라미터를 전달 받을 수 있음.
//http://localhost:8001/blog/dummy/user/3
@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).get(); // null 이 리턴될리가 없을때 사용. 이건 좀 위험하다
User user = userRepository.findById(id).orElseGet(new Supplier<User>() {
@Override
public User get() { // 만약 없는 Id값이 들어왔을때 이 메소드를 탄다.
// TODO Auto-generated method stub
return new User(); // 비어있는 객체를 넣어준다 이건 null이 아님
}
}); // null이면 너가 객체를 만들어서 넣어줘
return user;
}
}
이 방법 말고도 더 좋은 방법이 있다.
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) {
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;
}
크롬에서 테스트해보자
http://localhost:8001/blog/dummy/user/3
별개로 람다식으로 작성하면 코드 길이를 매우 줄일 수 있다. 우린 안쓸꺼임..
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) {
// 람다식
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("해당 사용자는 없습니다. id : " + id);
})
return user;
}
근데 data를 리턴해주는 @RestController를 사용했고 반환값으로 return user; 을 했는데 어떻게 결과 값이 JSON 형식으로 나왔을까 ?
요청 : 웹 브러우저
user 객체 = 자바 오브젝트
변환 해야된다. (웹 브라우저가 이해할 수 있는 데이터) -> json (Gson 라이브러리)
하지만 스프링부트에서는 MessageConverter라는 애가 응답시에 자동으로 동작하게 된다.
만약에 자바 오브젝트를 리턴하게 되면 MessageConverter가 Jackson 라이브러리를 호출해서 User 오브젝트를 json으로 변환해서 브라우저에게 던져준다. 즉 자동으로 변환 시켜준다. 매우 편리함
크롬 개발자도구에서 확인결과 content-Type이 json 형식인것을 알 수 있다.