1. 소개

이 빠른 사용방법(예제)에서는 Spring @RequestBody@ResponseBody 어노테이션에 대한 간결한 개요를 제공합니다.

2. @요청 본문

간단히 말해 @RequestBody 어노테이션은 HttpRequest 본문을 전송 또는 도메인 객체에 매핑 하여 인바운드 HttpRequest 본문을 Java 객체로 자동 역직렬화할 수 있도록 합니다.

먼저 Spring 컨트롤러 메서드를 살펴보겠습니다.

@PostMapping("/request")
public ResponseEntity postController(
  @RequestBody LoginForm loginForm) {
 
    exampleService.fakeAuthenticate(loginForm);
    return ResponseEntity.ok(HttpStatus.OK);
}

Spring은 적절한 유형이 지정되었다고 가정하고 자동으로 JSON을 Java 유형으로 역직렬화합니다.

기본적으로 @RequestBody 어노테이션으로 어노테이션을 다는 유형은 클라이언트 측 컨트롤러에서 보낸 JSON과 일치해야 합니다.

public class LoginForm {
    private String username;
    private String password;
    // ...
}

여기에서 HttpRequest 본문 을 나타내는 데 사용하는 개체는 LoginForm 개체 에 매핑됩니다 .

CURL을 사용하여 이것을 테스트해 봅시다:

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data 
  '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"

이것이 @RequestBody 어노테이션을 사용하는 Spring REST API 및 Angular 클라이언트에 필요한 전부입니다.

3. @ResponseBody

@ResponseBody 어노테이션은 반환 된 개체가 자동으로 JSON으로 직렬화되고 HttpResponse 개체로 다시 전달됨을 컨트롤러에 알립니다.

사용자 지정 Response 개체 가 있다고 가정 합니다.

public class ResponseTransfer {
    private String text; 
    
    // standard getters/setters
}

다음으로 관련 컨트롤러를 구현할 수 있습니다.

@Controller
@RequestMapping("/post")
public class ExamplePostController {

    @Autowired
    ExampleService exampleService;

    @PostMapping("/response")
    @ResponseBody
    public ResponseTransfer postResponseController(
      @RequestBody LoginForm loginForm) {
        return new ResponseTransfer("Thanks For Posting!!!");
     }
}

브라우저의 개발자 콘솔에서 또는 Postman과 같은 도구를 사용하여 다음 응답을 볼 수 있습니다.

{"text":"Thanks For Posting!!!"}

Spring이 기본적으로 수행하기 때문에 @RestController 어노테이션 이 달린 컨트롤러에 @ResponseBody 어노테이션 을 달 필요가 없다는 것을 기억하십시오 .

3.1. 콘텐츠 유형 설정

@ResponseBody 어노테이션 을 사용할 때 여전히 메서드가 반환하는 콘텐츠 유형을 명시적으로 설정할 수 있습니다.

이를 위해 @RequestMapping 의  생성 속성 을 사용할 수 있습니다 . @PostMapping , @GetMapping 등과 같은 어노테이션은 해당 매개변수의 별칭을 정의합니다.

이제 JSON 응답을 보내는 새 Endpoints을 추가해 보겠습니다.

@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseTransfer postResponseJsonContent(
  @RequestBody LoginForm loginForm) {
    return new ResponseTransfer("JSON Content!");
}

예제에서는 MediaType.APPLICATION_JSON_VALUE 상수를 사용했습니다. 또는 application/json 을 직접 사용할 수 있습니다.

다음으로 동일한 /content 경로에 매핑되지만 대신 XML 콘텐츠를 반환하는 새 메서드를 구현해 보겠습니다.

@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public ResponseTransfer postResponseXmlContent(
  @RequestBody LoginForm loginForm) {
    return new ResponseTransfer("XML Content!");
}

이제 요청 헤더에서 전송된 Accept 매개변수 의 값에 따라 다른 응답을 받게 됩니다.

이것을 실제로 봅시다:

curl -i \ 
-H "Accept: application/json" \ 
-H "Content-Type:application/json" \ 
-X POST --data 
  '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../content"

CURL 명령은 JSON 응답을 반환합니다.

HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 20 Feb 2020 19:43:06 GMT

{"text":"JSON Content!"}

이제 Accept 매개변수를 변경해 보겠습니다.

curl -i \
-H "Accept: application/xml" \
-H "Content-Type:application/json" \
-X POST --data
  '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../content"

예상대로 이번에는 XML 콘텐츠를 얻습니다.

HTTP/1.1 200
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 20 Feb 2020 19:43:19 GMT

<ResponseTransfer><text>XML Content!</text></ResponseTransfer>

4. 결론

@RequestBody  및 @ResponseBody 어노테이션 을 사용하는 방법을 보여주는 Spring 앱용 간단한 Angular 클라이언트를 구축했습니다 .

또한 @ResponseBody 를 사용할 때 콘텐츠 유형을 설정하는 방법을 보여주었습니다 .

항상 그렇듯이 코드 샘플은 GitHub에서 사용할 수 있습니다 .

REST footer banner