슬기로운 개발생활

[Spring] @RequestBody와 @ResponseBody 개념 알아보기

by coco3o
반응형

@RequestBody 와 @ResponseBody 어노테이션

웹 서비스와 REST 방식이 시스템을 구성하는 주요 요소로 자리 잡으면서 XML이나 JSON 등의 형식으로 데이터를 주고 받는 경우가 증가하고 있습니다.

예를 들어 JSON으로 request한 파라미터들을 Java에서 받으려면 Java Object로의 변환이 필요하며,
마찬가지로 response 시에도 Java Object에서 JSON으로 변환이 필요합니다.

여기서 @RequestBody 와 @ResponseBody 어노테이션이 이러한 작업들을 자동으로 처리해줍니다.
컨트롤러에 어노테이션을 추가해주면, JSON이나 key/value 방식 xml 등으로 송수신 할 수 있습니다.

@RequestBody 어노테이션은 HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할을 하고,
@ResponseBody 어노테이션은 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할을 합니다.

( ※ 클라이언트측에서 요청 데이터를 body에 담고 content-type을 application/json으로 설정해줘야 동작합니다. )

...
$.ajax({
     url: '/replies/',
     method: 'post',
     data: JSON.stringify(reply),
     contentType: 'application/json; charset=utf-8',
     dataType: 'json',
     })
...


예제코드

@RestController
@RequestMapping("/replies/")
@RequiredArgsConstructor
public class ReplyController {

    private final ReplyService replyService;

    @PostMapping("")
//  @ResponseBody  
    public ResponseEntity<Long> register(@RequestBody ReplyDTO replyDTO) {

        Long rno = replyService.register(replyDTO);

        return new ResponseEntity<>(rno, HttpStatus.OK);
    }
}

위의 예제 코드에서는 JSON으로 들어오는 데이터를 자바 객체로 받기 위해
@RequestBody를 사용하였습니다.
@ResponseBody를 사용하지 않은 이유는 @RestController를 사용하였기 때문입니다.
@Controller와는 다르게 @RestController는
@ResponseBody가 포함되어 있어 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달됩니다.
( ※ @Controller인 경우에는 @ResponseBody를 적어줘야 합니다. )

RestController.java

/**
 * A convenience annotation that is itself annotated with
 * {@link Controller @Controller} and {@link ResponseBody @ResponseBody}.
 * <p>
 * Types that carry this annotation are treated as controllers where
 * {@link RequestMapping @RequestMapping} methods assume
 * {@link ResponseBody @ResponseBody} semantics by default.
 *
 * <p><b>NOTE:</b> {@code @RestController} is processed if an appropriate
 * {@code HandlerMapping}-{@code HandlerAdapter} pair is configured such as the
 * {@code RequestMappingHandlerMapping}-{@code RequestMappingHandlerAdapter}
 * pair which are the default in the MVC Java config and the MVC namespace.
 *
 * @author Rossen Stoyanchev
 * @author Sam Brannen
 * @since 4.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
...

참고

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기