Post가 x-www-form-urlencoded(form 태그를 만들어 데이터 전송) 으로 데이터를 담아 보낸다는 예시로 전략을 살펴보면, 데이터는 key=value 형태이다.
PostMapping("/test")
public String test(String username, String email){
return "test";
}
PostMapping("/test")
public String test(User user){
return "test";
}
{
"username":"yj",
"password":"123"
}
위의 형태가 json 데이터이다.
이런 형태는 스프링이 파싱해서 오브젝트로 받지 못한다.
따라서 @RequestBdoy를 붙여 MessageConverter 클래스를 구현한 Jackson 라이브러리가 동작하면 json 데이터를 자바 오브젝트로 파싱할 수 있게 된다.
PostMapping("/test")
public String home(@RequestBody User user){
return "test";
}
업데이트(수정)을 하고자 한다.
// email과 password만 수정 가능하도록 함
// 기존의 email, password 불러오기
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) { // json 데이터로 받기 위해 @RequestBdoy 사용 (<-> key=value 데이터는 @RequestBody 사용 X)
// json 데이터 요청 -> Java Object : 스프링의 MessageConverter의 Jackson 라이브러리가 반환해서 받아줌.
System.out.println("id:"+id);
System.out.println("password:"+requestUser.getPassword());
System.out.println("email:"+requestUser.getEmail());
requestUser.setId(id);
userRepository.save(requestUser); // save -> 만약 id가 이미 있다면 업데이트 역할을 함
return null;
}
이렇게 보내면 에러가 뜬다.
username이 null 값이라는 에러! User Entity에서 username을 notnull로 지정해놨는데,
password와 email만 수정했으므로 현재 requestUser에는 id, password, email만 들어가있는 상태가 되는 것이다.
// email과 password만 수정 가능하도록 함
// 기존의 email, password 불러오기
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) { // json 데이터로 받기 위해 @RequestBdoy 사용 (<-> key=value 데이터는 @RequestBody 사용 X)
// json 데이터 요청 -> Java Object : 스프링의 MessageConverter의 Jackson 라이브러리가 반환해서 받아줌.
System.out.println("id:"+id);
System.out.println("password:"+requestUser.getPassword());
System.out.println("email:"+requestUser.getEmail());
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("수정에 실패하였습니다.");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
userRepository.save(user); // save -> 만약 id가 이미 있다면 업데이트 역할을 함
return null;
}
컨트롤러를 고쳐보았다.
id로 기존의 User 객체를 불러오고, 그 객체에 받아온 requestUser를 set 하는 방식을 사용했다.
그러면 기존의 User는 null이 없으므로 정상적인 수정이 가능할 것이다.
// email과 password만 수정 가능하도록 함
// 기존의 email, password 불러오기
@Transactional
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) { // json 데이터로 받기 위해 @RequestBdoy 사용 (<-> key=value 데이터는 @RequestBody 사용 X)
// json 데이터 요청 -> Java Object : 스프링의 MessageConverter의 Jackson 라이브러리가 반환해서 받아줌.
System.out.println("id:"+id);
System.out.println("password:"+requestUser.getPassword());
System.out.println("email:"+requestUser.getEmail());
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("수정에 실패하였습니다.");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
return null;
}
save를 하지 않고 @Transactional 어노테이션을 추가하였다.
-> 정상 작동한다 !!