Request, Response
클라이언트에서 서버로 통신하는 메시지를 요청(request) 메시지라고 하며, 서버에서 클라이언트로 통신하는 메시지를 응답(response) 메시지라고 한다.
클라이언트가 서버에게 요청(request)하면 서버는 클라이언트에게 응답(response) 해준다.
요청하고 응답해주는 데이터는 header와 body등으로 되어있다. body에는 실제 보내는 데이터가 담기고, header에는 body데이터의 형식등의 다양한 정보가 담긴다.
즉,
AJAX를 이용해 서버에게 요청을 하면 요청은 request body(요청 본문)에 담겨서 되고
클라이언트의 응답도 response body(응답 본문)에 담겨서 전달된다는 것이다.
스프링에서 데이터 주고받기
스프링에서 javascript쪽이 클라이언트, java쪽이 서버가 된다.
javascript에서 java쪽으로 데이터를 보낼때 AJAX를 통해 데이터를 보내게 된다.
데이터를 받는 java쪽에서는 이 데이터를 받을 수 있는 작업이 필요한데 그게 바로 @RequestBody이다.
또, java쪽에서 javascript로 데이터를 보낼 때도 @ResponseBody가 필요하다.
@RequestBody
HTTP요청 본문에 담긴 값을 Java객체로 변환한다.
Java객체로 Conversion(변환)할 때는 HttpConverter가 필요하다.
요청을 보낼 때 Content-Type을 설정하는데, 이것을 보고 적당한 Converter를 찾아서 변환해준다.
보통은 JSON으로 데이터를 보내는데 JSON을 java객체로 바꾸어 주는 라이브러리에는 jackson, gson등이 있다.
스프링에는 gson이 내장되어있어서 별도의 라이브러리 설치 없이 설정만 해주면 @RequestBody를 쓸 수 있다.
@ResponseBody
자바 객체를 HTTP응답 본문의 객체로 변환한다.
예시
다음 코드는 AJAX로 서버에 데이터를 보내는 코드이다.
아이디와 비밀번호를 post로 보낸다고 하자 (원래는 그냥 보내면 안되고 암호화해서 보내야 한다)
const httpRequest = new XMLHttpRequest();
const id = document.getElementById("id").value;
const pw = document.getElementById("pw").value;
const obj = { id : id, pw : pw};
httpRequest.onreadystatechange = () => {
if(httpRequest.readyState == XMLHttpRequest.DONE){
console.log("xmlHttpRequest Done");
if(httpRequest.satus == 200) {
console.log("status 200")
}
}
}
console.log(JSON.stringify(obj));
httpRequest.open("POST", GV.ctx + "/login.do", true);
httpRequest.setRequestHeader("Content-Type", "application/json;" );
httpRequest.send(JSON.stringify(obj));
AJAX는 여기에서 배우자
http://tcpschool.com/ajax/intro
Java에서 데이터를 받을 때는 @RequestBody를 사용해준다.
@ResponseBody
@PostMapping(value="/login.do")
public String login(@RequestBody MemberVO memberVO) throws Exception {
System.out.println("memberVO : "+memberVO);
return null;
}
반대로 응답해줄때는 @ResonponseBody를 사용해준다.
@ResponseBody
@PostMapping(value="/login.do")
public String login(@RequestBody MemberVO memberVO) throws Exception {
Gson gson = new Gson();
System.out.println("memberVO : "+memberVO);
List<MemberVO> member = authService.getMemberOne(memberVO); //로그인 동작
return gson.toJson(member);
}
그런데 @RequestBody를 사용하려면 dispatcher-servlet에
데이터를 java객체로 변환할 수 있도록 message converter를 설정해줘야 한다.
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter"/>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
참고
'java' 카테고리의 다른 글
[java] Lambda 람다란? (0) | 2022.06.10 |
---|---|
[Java] JDK 설치하기 (0) | 2022.02.26 |
[java] 컬렉션과 제네릭에 대해 알아보기 (0) | 2021.11.03 |
[JAVA] 추상클래스, 추상메소드와 인터페이스의 개념과 차이점 (0) | 2021.10.21 |
[java] 상속 개념 정리, extends (0) | 2021.10.20 |