Java @RequestBody와 @ResponseBody
문제점 😅
오늘 오전부터 어노테이션(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