프레임워크/Spring

[Spring] @RequestBody란 무엇인가? 사용법은?

멍토 2021. 4. 24.

이전에 Header와 Parameter를 이용하여 데이터를 가져오는 내용을 정리했다.

위와 같은 방식은 GET이나 DELETE와 같이 Body가 없을때 사용하는 방식이다.(혹은 인증이나)

그렇지만 위와 같은 방식은 보안이 취약해지거나 데이터가 많아지면 문제가 발생한다.

그래서 생성과 수정의 역할을 담당하는 POST와 PUT에는 Body를 붙여 사용할 수 있다.

Body에 있는 데이터를 가져오는 방법은 아래와 같다.

@PostMapping("/users/body")
public ResponseEntity requestBody(@RequestBody Map<String, String> body) {
    User newUser = new User(1L, body.get("name"), body.get("email"));
    return ResponseEntity.created(URI.create("/users/" + newUser.getId())).body(newUser);
}

이것 역시 key와 value로 이루어져 있기 때문에 map을 이용하여 처리가 가능하다.

그렇지만 이러한 방식은 우리가 객체에 데이터를 매핑해줘야 한다는 귀찮음이 발생한다.

HttpMessageConverter를 이용하여 Key와 일치하는 필드를 매핑시켜주어 편하게 처리가 가능하다.

해당 기능을 사용하기 위해서는 기본 생성자가 필요하다.

필드를 가져오기 위해서 ObjectMapper는 Getter나 Setter가 필요하다.

public class User {
    private Long id;
    private String name;
    private String email;

    public User() {
    }

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

}

 

@PostMapping("/users/body")
public ResponseEntity requestBody(@RequestBody User user) {
    User newUser = new User(1L, user.getName(), user.getEmail());
    return ResponseEntity.created(URI.create("/users/" + newUser.getId())).body(newUser);
}

위와 차이점은 위에서는 Key와 Value로 이루어진 Map으로 처리하였으나 여기에서는 User 객체에 매핑하여 데이터를 가져왔다.

이러한 방식을 이용하면 더 깔끔한 방식으로 데이터 처리가 가능해진다.

추가적으로 Valid 적용이 가능하여 유효성검사를 추가할 수 있다.

@PostMapping("/accounts")
public void handle(@Valid @RequestBody Account account, BindingResult result) {
    // ...
}

유효성을 통과하지 못한다면 400 BAD REQUEST가 반환되게 된다.

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-requestbody

https://velog.io/@conatuseus/RequestBody%EC%97%90-%EC%99%9C-%EA%B8%B0%EB%B3%B8-%EC%83%9D%EC%84%B1%EC%9E%90%EB%8A%94-%ED%95%84%EC%9A%94%ED%95%98%EA%B3%A0-Setter%EB%8A%94-%ED%95%84%EC%9A%94-%EC%97%86%EC%9D%84%EA%B9%8C-3-idnrafiw

댓글

💲 광고입니다.