개발 공부/Spring

[SpringBoot] Resopnse

journey 2022. 2. 16. 00:49
728x90

07. Resopnse 내려주기

String

  • 일반 Text Type 응답

예제 코드

  • Controller.java
@RestController
@RequestMapping("/api")
public class ApiController {

    // TEXT
    @GetMapping("/text")
    public String text(@RequestParam String account) {
        return account;
    }
}
  • API 결과
  • Content-type이 text인 것을 확인 할 수있다.

Object

  • 자동으로 Json 변환되어 응답 상태값은 항상 200 OK

예제 코드

  • Controller.java
@RestController
@RequestMapping("/api")
public class ApiController {

    // Json
    // request -> Object mapper -> object -> method -> object -> object mapper -> json -> response
    @PostMapping("/json")
    public User json(@RequestBody User user) {

        return user;    // 200 OK
    }
}
  • API 결과
  • Content-type이 json인 것을 확인 할 수있다.

ResponseEntity

  • Body의 내용을 Object로 설정상황에 따라서 Http Status Code 설정

예제 코드

  • UserDto.java
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class User {

    private String name;
    private int age;

   //  @JsonProperty("phone_number")
    private String phoneNumber;
    private String address;

    .... getter and setter ....

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  • Controller.java
@RestController
@RequestMapping("/api")
public class ApiController {

    // ResponseEntity
    // create http 코드 201에 대한 응답 내리기.
    @PutMapping("/put")
    // 응답을 내려줄 때 HttpStatus를 정해 줄 수 있다. ResponseEntity<>객체를 통해서 내려준다.
    public ResponseEntity<User> put(@RequestBody User user) {
        // ResponseEntity.ok(user)  -> (바디) 넣기
        return ResponseEntity.status(HttpStatus.CREATED).body(user);
        // ResponseEntity란 곳에 명확한 http status 코드 지정하기. body에 데이터 넣기. 데이터도 오브젝트 매퍼를 통해서 json으로 바뀌어져서 내려간다.
        // 여러가지 값들에게 각각의 응답에 대한 커스터마이징이 필요할 때 사용한다. 명확하게 값을 만들어서 값을 만들어낸다.
    }
}
  • HttpStatus.java

  • API 결과
  • HttpStatus Code가 201인 것을 확인할 수있다.

@ResponseBody

  • RestController가 아닌 곳(Controller)에서 Json 응답을 내릴 때

1. 실제 html 리턴하기 - 예제 코드

  • 컨트롤러 return 자체가 String이 되면 자동으로 resource폴더에 있는 html 파일을 찾아간다.
  • Controller.java
@Controller
public class PageController {

    // 실제 html 페이지를 리턴하는 컨트롤러.
    @RequestMapping("/main")
    public String main() {
        return "main.html";
    }
}
  • main.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Main Html Spring Boot</h1>
</body>
</html>
  • API 결과

  • html 결과

  • 하이어라키 구조

2. json 객체 리턴하기- 예제 코드

  • Controller.java
@Controller
public class PageController {

    // json 내리기
    // ResponseEntity
    @ResponseBody   // 객체를 resource에서 찾지 않고 ResponseBody로 만들어서 json객체로 리턴하겠다.
    @GetMapping("/user")
    public User user() {

        var user = new User();      // 타입 추론
        user.setName("짱구");
        user.setAddress("떡잎마을");
        return user;
    }
}
  • API 결과
  • phone_number 셋팅을 안해줬기 때문에 null 값이 나온다.

  • UserDto.java
  • @JsonInclude(JsonInclude.Include.NON_NULL)을 추가한다.
    • json의 null값을 제외하기. 속성으로 지정할 수있다. 보통은 그냥 안 쓴 상태인 default로 둔다.
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)   // json의 null값을 제외하기. 속성으로 지정할 수있다. 보통은 그냥 default로 둔다.
public class User {

    private String name;
    private int age;

   //  @JsonProperty("phone_number")
    private String phoneNumber;
    private String address;

..... getter and setter ....

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  • API 결과
  • null값은 제외 된 상태로 결과가 나온다.