Spring
Response 내려주는 방법
개발자 김혜린
2022. 4. 19. 23:00
TEXT로 내려주기 / JSON으로 내려주기 / 200 & 201 Status로 내려주기
package com.example.response.controller;
import com.example.response.dto.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class ApiController {
// TEXT
@GetMapping("/text")
public String test(@RequestParam String account){
return account;
}
//JSON
//user라는 객체를 @RequestBody로 받아 User로 리턴한다.
//request가 오면, object mapper를 통해 object로 바뀌게 된다.
//그리고 아래 method를 타게 되고, response 나갈 때 object를 던진다.
//그럼 도다시 object mapper를 통해 json으로 바뀌게 되어 response로 내려간다.
//req->object mapper->object->method->object->object mapper->json->response
@PostMapping("/json")
public User json(@RequestBody User user){
return user; // 200 ok
}
//put으로 생성되었다고 하면 201, 불러오면 200? 아무튼 200/201 둘다 내려옴
@PutMapping("/put")
public ResponseEntity<User> put(@RequestBody User user){
//ResponseEntity로 제네릭을 설정해줘서 response를 내려줄 때 status를 정해줄 것이다.
return ResponseEntity.status(HttpStatus.CREATED).body(user); //생성 시 명확하게 201 코드내려주고 body 싣기
// body에 user 데이터 보내는데 이것도 object mapper를 통해 json으로 바뀜
//응답에 대한 커스터마이징이 필요하면, ResponseEntity를 사용하면 된다
}
}
HTML 페이지 돌려주는 컨트롤러
PageController에서 JSON으로 내려주기(중요 : 원래는 보통 html만 내려줌!)
package com.example.response.controller;
import com.example.response.dto.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller //HTML 파일을 찾게 됨
public class PageController {
@RequestMapping("/main")
public String main(){
return "main.html"; //@Controller는 String으로 return 하면 리소스파일을 찾게 됨
}
// ResponseEntity
@ResponseBody //객체 자체를 return했을 때 리소스를 안찾고, ResponseBody를 만들어 보내겠다는 뜻
@GetMapping("/user")
public User user(){
//원래는 User user = new User();
var user = new User(); //자바 11버전부터 추가, 타입을 추론하여 축약됨
user.setName("Kim Hyerin");
user.setAddress("달리는 공룡");
return user;
}
}
public String으로 돌려주면,
return "main.html"; 을 하면
자동으로 resources 폴더의 static안의 html 파일을 찾아 내려주게 된다.
그렇다면 이 부분에서 Json은 어떻게 내려줄 것인가?
PageController에서 Json을 내려주려면
@ResponseBody
로 내려보내주면 된다.
Null로 리턴하지 않기
int는 primitive 값으로 입력하지 않으면 0이 들어간다.
Null로 리턴하고 싶으면 Integer로 타입을 지정해준다.
Null값 포함하지 않고 Response 내려주기
@JsonInclude(JsonInclude.Include.NON_NULL)
package com.example.response.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonNaming(value= PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String name;
private Integer age;
@JsonProperty("phone_number")
private String phoneNumber;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", phoneNumber='" + phoneNumber + '\'' +
", address='" + address + '\'' +
'}';
}
}