@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다. @RequestParam은 필수 여부가 true이기 때문에 반드시 해당 파라미터가 전송되어야 하며, 파라미터가 전송되지 않으면 400 에러가 발생한다. 반드시 필요한 값이 아니라면 required를 false로 설정해주면 되고, defaultValue 옵션을 사용하면 기본값 역시 지정할 수 있다.
클라이언트와 서버의 비동기 통신

클라이언트에서 서버로 통신하는 메시지를 요청(request) 메시지라고 하며, 서버에서 클라이언트로 통신하는 메시지를 응답(response) 메시지라고 한다.
웹에서 화면전환(새로고침) 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다.
비동기통신을 하기위해서는 클라이언트에서 서버로 요청 메세지를 보낼 때, 본문에 데이터를 담아서 보내야 하고, 서버에서 클라이언트로 응답을 보낼때에도 본문에 데이터를 담아서 보내야 한다.
이 본문이 바로 body 이다(요청본문 requestBody, 응답본문 responseBody 을 담아서 보내야 한다)
이때 본문에 담기는 데이터 형식은 여러가지 형태가 있겠지만 가장 대표적으로 사용되는 것이 JSON 이다.
즉, 비동기식 클라-서버 통신을 위해 JSON 형식의 데이터를 주고받는 것이다.
클라이언트에서 서버로 필요한 데이터를 전송하기 위해서 JSON이라는 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환 시켜, 객체에 저장시킵니다.
서버에서 클라이언트로 응답 데이터를 전송하기 위해서 @ResponseBody 를 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송시키는 역할을 합니다.
Spring MVC Controller와 Restful Controller의 가장 큰 차이점은 HTTP Response Body가 생성되는 방식에 있습니다.
기존 MVC Controller
view 기술을 사용하며, 주로 view(화면)을 반환하기 위해 사용합니다.
Restful 웹 서비스 Controller
객체를 반환하기만 하면 객체 데이터는 JSON/XML 형식의 HTTP 응답을 작성하여 return 합니다.
Data를 return하는 것이 주 용도입니다.
Spring MVC 전통적인 흐름


결론은 ResponseEntity Http 요청에 응답 Entity로 사용될 수 있는 클래스이다. 결과값! 상태코드! 헤더값!을 모두 프론트에 넘겨줄 수 있고, 에러코드 또한 섬세하게 설정해서 보내줄 수 있다는 장점이 있다
RestController는 별도의 View를 제공하지 않는 형태로 서비스를 실행한다.
때문에 결과데이터가 예외적인 상황에서 문제가 발생할 수 있다.
ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR 와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어가 필요한 경우 사용한다.
ResponseEntity는 응답 헤더, 본문 양식을 맞추어 반환하므로 @ResponseBody가 필요 없다.
따라서 @RestController 대신 @Controller를 등록해도 잘 동작한다.
그렇다면 RestController를 안 써도 될까? 어차피 ResponseEntity로 감싸면 Header, Status, body까지 다 관리해줄 수 있으니..
ResponseEntity의 body에 객체를 넣고 보내주면 json형식으로 주고받아진다.
@Controller
public class HelloController {
@GetMapping(path = "/hello")
public ResponseEntity<MoveDto> hello() {
MoveDto moveDto = new MoveDto("start", "finish");
return ResponseEntity.ok(moveDto);
}
}

@Controller
public class HelloController {
@GetMapping("/hello")
public ResponseEntity<String> hello() {
return ResponseEntity.ok().body("hello");
}
}
위와 같은 방식으로 통신을 하면 아래처럼 Content-Type이 text/plain으로 나오게 된다.

따라서 Json으로 통신할 일이 있다면 @RestController를 활용하자