Part3 - CH4. 스프링 부트 시작하기(3) 응답, ObjectMapper
Response 내려주기
응답코드
//ResponseEntity
@PutMapping("/put")
public ResponseEntity<User> put(@RequestBody User user){
return ResponseEntity.status(HttpStatus.CREATED).body(user);
}
스프링에 있는 ResponseEntity객체와 HttpStatus Enum을 이용하여 응답을 내릴 수 있다.
Controller
지금까지 배운 RESTController의 경우, 응답내용을 실어서 보내는 컨트롤러라면 Controller 의 경우, 응 답하는 html페이지를 리턴해준다.
- Controller
@Controller
public class PageController {
@RequestMapping("/main")
public String main() {
return "main.html";
}
}
@RestController 어노테이션이 아니라 @Contoller어노테이션을 붙여주고, main이라는 url로 요청했을 때, main.html을 내려준다고 정의해둔다.
resource -> static 폴더 안에 main.html을 만들어둔다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Main Html Spring Boot
</body>
</html>
그럼 여기서 controller에서 json으로 응답할때는 어떻게 할 것인가? 아래와 같이 한다.
@ResponseBody
@GetMapping("/user")
public User user() {
// var user = new User(); // java11부터 가능
User user = new User();
user.setName("dboo");
user.setAddress("패스트캠퍼스");
return user;
}
@ResponseBody어노테이션과 함께 RestController에서 했던 것처럼 객체의 인스턴스를 리턴해주면 된다.
추가팁) int형으로 선언하게 될 경우, 객체에 값을 정해주지않으면 디폴트 값인 0이 응답에 들어오게 된다. 이 를 null값으로 해주고 싶다면 int형이 아닌 Integer형으로 선언해주게 되면 null로 들어오게 된다.
그런데 null값을 내려주면 응답을 받아서 사용하는 쪽에 null처리가 되어있지 않을 수 있기 때문에 이를 방지 하기 위해서 null값의 응답값을 아예 빼버리고 싶다면 다음과 같이 할 수 있다.
@JsonInclude(JsonInclude.Include.NON_NULL)
NON_NULL인 값만 포함한다는 의미이고 빈값이나 다른 옵션으로도 가능하다.
Object Mapper
System.out.println("-----");
// ObjectMapper란?
// Text JSON -> Object
// Object -> Text JSON
// controller req json(text) -> object
// response object -> json
var objectMapper = new ObjectMapper();
// 1. object -> text
// object mapper는 get메소드를 활용한다.(없을시 에러)
// ! 주의 ! 객체에 개발자가 직접정의한 get~~메소드가 있을 시, object mapper가 프로퍼티를 매핑하는 과정에 오류가 발생한다.
// 따라서 object mapper가 참조하는 클래스에서는 get~~으로 시작하는 메소드명을 사용하지 않는것이 좋다.
var user = new User("dboo", 31, "010-1111-2222");
var text = objectMapper.writeValueAsString(user);
System.out.println(text);
// 2. text -> object
// object mapper 는 기본 생성자를 활요한다. 디폴트 생성자가 없으면 에러가 발생한다.
var objectUser = objectMapper.readValue(text, User.class);
System.out.println(objectUser);