이번에야말로 진짜 정리한다
일단 이거 알아야함. 우리는 화면전환이 없는 통신, 즉 비동기통신을 위해서 데이터를 body에 담아 보낸다. 이때 데이터의 형식은 대표적으로 JSON이 있음!
@Controller
어노테이션을 사용하면 return으로 반환되는 문자열에 대해 view를 띄워줬었다. (뷰리졸버 게시물 참고!)
그런데 이제 프로젝트에 사용할 예제를 찾아보던중 @ResponseBody를 사용하는 컨트롤러가 있는것이다... 사실 여러번 봤는데 항상 완벽히 이해를 못하고 넘어가서 그런지 자꾸 까먹는다. 그래서 이번에 완벽히 이해해버렸는데..!
@ResponseBody를 이용하면 view가 아니라 반환값이 그대로 클라이언트에 return된다. 화면에 띄우는 실험을 해보면 알수있다. 텍스트가 그대로 뜬다. vo객체를 반환하면 json형태로 띄운다.
여기서 두 어노테이션의 용도가 감이오는데....
웹페이지에서 json으로 요청한 파라미터를 java단에서 받으려면 java Object로 변환해야하고, response시에도 java Object를 json으로 변환해줘야한다. 즉 두 어노테이션이 이 역할을 해주는것! JSON이나 XML형태의 데이터 송수신을 해줘버리는것이다!
: HTTP body 안의 JSON 데이터를 VO에 매핑한다. 즉 HTTP요청을 자바객체로 전달받는다.
: VO객체를 JSON으로 바꿔 HTTP body 안에 담는다. 즉 메소드 return값을 body에 담는것!
@ResponseBody
public void seatForm(@RequestBody String data) {
이런식으로 쓰이는것이다. @RequestBody로 요청객체의 JSON데이터를 java객체로 바꿔서 파라미터로 사용하고, 이 컨트롤러에서 만든 return값을 @ResponseBody를 이용해서 http body에 담아준다.
: 공부할때 @ResponseBody를 쓰면서 @RestController도 배웠었다. 매번 메소드마다 @ResponseBody를 써주기 귀찮으니까 @RestController로 퉁쳐주는것이다. 리턴값에 자동으로 ResponseBody가 붙어 리턴된다. 즉 Controller_RequestBody 역할인것
$.ajax({
type : 'post',
url : '${cPath}/fr/pay/fee/list',
contentType: 'application/json',
data : JSON.stringify(datas),
dataType : 'json',
success : function(data){
alert('ajax 완료!');
},
error : function(data){
alert("ajax 실패!");
}
})
post로 보낼거고, 보내는 타입은 json이니까 미리 넣어놓은 datas를 JSON.stringify를 이용해 json으로 변환해줌. 또한 컨트롤러로 보내서 받아올 데이터도 json형식으로 지정했음!
@ResponseBody
@PostMapping("/list")
public String feeListPost(@RequestBody FrFeeVO vo) {
// 일단 전월에 대한 납부액이 fee테이블에 들어가있다고 가정
// 이 회면에 딱 들어왔을때 전월에 대한 정보가 뜨면 된다.
System.out.println("===================전===========================");
System.out.println("===================전===========================");
System.out.println("===================전===========================");
System.out.println("===================전===========================");
System.out.println("===================전===========================");
System.out.println("===================전===========================");
System.out.println(vo);
vo = service.feeList(vo);
System.out.println("==================후============================");
System.out.println("==================후============================");
System.out.println("==================후============================");
System.out.println("==================후============================");
System.out.println("==================후============================");
System.out.println("==================후============================");
System.out.println(vo);
return "fr/pay/fee/feeList";
}
우선 파라미터를 먼저 보면, @RequestBody
어노테이션을 이용해 ajax요청이 왔을때 해당 http요청의 body에 존재하는 json 데이터를 파싱해서 vo에 자동으로 바인딩해준다.
또한 ajax는 json으로 데이터를 받기로 정했기 때문에 vo를 json으로 변환해 http body에 담을 수 있도록 @ResponsBody
어노테이션을 메소드에 달아준다...