[Spring] @RequestBody, @ResponseBody

오영선·2023년 2월 11일
0

@RequestBody, @ResponseBody 에 대해 이야기 하기 전, 서버와 클라이언트의 통신 방법에 대해 알아보겠습니다.

우리가 사용하고 있는 https://, HTTP의 통신 방식은
'요청과 응답(request, response)'으로 이루어져 있습니다.

클라이언트가 요청(HttpRequest)을 서버에 보내면 서버는 클라이언트에게 응답(HttpResponse)하는 구조입니다.

예시로 간단하게 회원가입 request를 알아볼게요

HttpRequest는 start line, headers, body 세 부분으로 나누어져 있습니다.
HttpResponse는 status line, headers, body 세 부분으로 나누어져 있습니다.
Http에 대해서는 다음 번에 더 자세하게 알아보기로 하고,

위 예시에서 Body 안에는

//json data
{
    "username":"admin22",
    "password":"admin1"
}

HTTP 통신에서 요청(회원가입)과 응답을 보낼 때, 필요한 데이터가 json 형식으로 담겨있습니다.

이렇게 json형식으로 서버에 보내게 되면, Spring에서는 json데이터를 Java Object형식으로 변환해 주는 작업을 거쳐야 합니다.

@RequestBody, @ResponseBody 어노테이션을 명시함으로써 MessageConverter를 통한 데이터 변환 과정을 거칠 수 있습니다.

마찬가지로 요청된 서버에서 클라이언트로 responseBody를 보낼 때도 Java Object에서 JSON 같은 형식으로의 변환이 필요합니다. 이러한 과정을 해당 어노테이션들이 처리하게 됩니다.

//object
public class User{
		private String username;
       pricate String password; 
}


//controller
public Spring signup(@RequestBody User user){

	...
	return "success";
}

@RequestBody

클라이언트의 요청이 들어왔을 때 DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달해주게 됩니다.

이때 주의할 점으로는 일반적인 GET 매핑으로 요청하는 경우에는 body로 요청 데이터가 전달되는 것이 아니라, URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션이 아닌 @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 합니다.

@ResponseBody

마찬가지로 return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달하게 됩니다.

//object
public class User{
		private String username;
       pricate String password; 
}


//@controller ...
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.GET)
public User findAllUser(){

	...
	return user; <- 클라이언트에게 json 형태로 반환
}

@RestController

@RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로 HttpResponse의 본문 responseBody에 자바 객체가 매핑되어 전달됩니다.


@RestController
public class UserController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String helloSpring() {
        return "Hello Spring";
    }

}

0개의 댓글