Java @RequestBody와 @ResponseBody

Java

문제점 😅

오늘 오전부터 어노테이션(Annotation)에 관해 쓰다가, 너무 내용도 허접하고.. 쓰다보니 나도 대충 아는 내용의 어노테이션이 있어서 그 내용만 정리해보려고 한다.

해결책 😏

컨트롤러(Controller)에서 Ajax와 같은 비동기 처리인 경우에 메서드에서 @RequestBody와 @ResponseBody를 자주 보게된다. 화면전환 없이 사용자 목록 조회를 하는 기능을 예로 들어보자.

1. list.jsp 중 Ajax를 이용하여 사용자 목록 조회

function selectUserListAjax() {
      var searchInfo = {};
      searchInfo['gender'] = $("#searchForm input[name='gender']").val();
      searchInfo['job'] = $("#searchForm input[name='job']").val();

      $.ajax({
              contentType: 'application/json; charset=utf-8'
             ,type: 'post'
             ,dataType: 'json'
             ,url: '${pageContext.request.contextPath}/comm/selectUserList.json'
             ,data: JSON.stringify(searchInfo)
             ,success: function(data) {
                              console.log("결과 DATA 출력");
                              console.log(data);
                        }
      });
}

2. CommonController.java 중 사용자 목록 조회

@Controller
public class CommonController {

      @Autowired
      private CommonService svc;
      
      /**
       * 사용자 목록 조회
       * @param SearchVo
       * @return List<UserVo>
       * @throws Exception
       */
      @RequestMapping(value="/comm/selectUserList.json", method=RequestMethod.POST, headers="Accept=application/json")
      public @ResponseBody List<UserVo> selectUserList(@RequestBody SearchVo searchVo) throws Exception {
            List<UserVo> list = svc.selectUserList(searchVo);
            return list;
      }
}

클라이언트 측의 list.jsp에서 selectUserListAjax()가 실행되면 searchInfo를 JSON으로 변환하여 서버측에 요청한다. CommonController.java의 selectUserList()을 보니 @RequestBody와 @ResponseBody가 있다.

@RequestBody

서버(CommonController.java)기준으로 보면, 클라이언트(list.jsp)로부터 전달된 HTTP Body 내용에는 JSON으로 변환된 searchInfo가 있다. @RequestBody는 클라이언트가 전송하는 HTTP Body 내용(JSON)을 자바 객체(VO)로 변환하는 스프링 어노테이션이다. 즉, 클라이언트의 searchInfo 파라미터가 서버의 selectUserList() 함수의 파라미터 searchVo에 자동으로 매핑된 것이다.

@RequestBody를 사용함에 있어서, GET방식은 URI 또는 URL의 파라미터로 요청 데이터가 전달되기 때문에 GET방식으로 요청 내용을 받을 수 없다. GET방식은 @RequestParam 등의 어노테이션을 통해서 데이터를 전달받아야 한다.

@ResponseBody

@RequestBody의 반대라고 생각하면 될 것 같다. @ResponseBody는 HTTP Body에 자바 객체(VO)를 JSON으로 변환하여 담는 스프링 어노테이션이다.

public class CommonController{...} 구문 위에 @Controller 어노테이션이 쓰인것을 볼 수있다. 이 경우 해당 클래스가 컨트롤러임을 지칭하는 것인데, @Controller 대신 @RestController가 쓰이는 경우 @ResponseBody는 생략 가능하다. @RestController 내부에 @Controller와 @ResponseBody가 존재하기 때문이다.

아마 클라이언트(list.jsp)에서의 Ajax 결과값은.. 아래와 비슷하지 않을까 생각된다..

// list.jsp 중
console.log("결과 DATA 출력");
console.log(data);

// 콘솔 출력값
결과 DATA 출력
{"name":"광수","age":31} ,{"name":"영철","age":35},{"name":"영호","age":32}

마무리 😎

이 외에도 수많은 어노테이션이 있다. 필요 할 때마다 찾아보자.

참고문헌 📝

https://cheershennah.tistory.com/179
https://doctorson0309.tistory.com/406
https://2ham-s.tistory.com/294