@Controller
: 컨트롤러 어노테이션에 들어가보면 @Component 어노테이션이 붙어있는 것을 확인할 수 있다.
즉, 컨트롤러 어노테이션이 있다면 스프링 빈에 등록이 되고 컴포넌트 스캔의 대상이 된다.
리턴 타입이 String
인 경우 뷰 이름으로 리턴한다.
@RestController
: HTTP 메시지 바디에 바로 입력한다.
@ResponseBody
와 @Controller
를 더했다고 생각하면 된다.
GET
: 조회할때 주로 사용하는 메소드로 URL의 쿼리 파라미터에 데이터를 포함해서 전달한다
POST
: 저장, 등록할때 주로 사용하는 메소드로 메시지 바디에 쿼리 파라미터 형식으로 전달한다.
PATCH
: 수정할 때 주로 사용하는 메소드로 메시지 바디에 데이터를 담아 기존 리소스의 일부를 수정한다.
DELETE
: 삭제할 때 주로 사용하는 메소드이다
@ModelAttribute
: 개발을 할때 파라미터를 받아서 객체를 만들고 해당하는 값을 넣어주어야 한다.
스프링에서는 @ModelAttribute
기능을 제공한다.
@RequestParam
: 스프링이 제공하는 어노테이션으로 HTTP 요청 파라미터를 받는다 servlet에서 request.getParameter("parameter")
와 같다.
GET 쿼리스트링, POST Form 둘다 지원한다.
파라미터 이름과 변수명이 같으면 @RequestParam("parameter")
에서 ("parameter")
생략 가능하다
String, int, Integer등의 단순 타입에서는 @RequestParam
도 생략 가능하다
하지만 너무 생략을 하면 혼란스러울 수 있다.
필수 파라미터 여부 설정
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
// 여기서 @RequestParam을 생략 가능
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age
) {
log.info("username={}, age={}", username, age);
return "ok";
}
HTTP message body에 데이터를 직접 담아서 요청하는 경우
주로 JSON 형식으로 요청한다.
요청 파라미터와 다르게 메시지 바디를 통해 데이터가 직접 넘어오는 경우
@RequestParam
, @ModelAttribute
를 사용하지 못한다.
스프링 내부에서 HTTP 메시지 컨버터(HttpMessageConverter) 기능을 사용하여 메시지 바디를 문자나 객체로 변환해준다.
@RequestBody
를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다.
(요청시 content-type이 application/json인지 확인)
바인딩할 User 클래스
@Getter
@Setter
public class User {
private String name;
private Long age;
}
@Controller
@Slf4j
public class MainController {
@ResponseBody
@RequestMapping("/model/attribute")
public String modelAttribute(@RequestBody User user) {
log.info("name={}, age={}", user.getName(), user.getAge());
return "OK";
}
}
POST MAN을 이용하여 JSON으로 해당 경로에 요청할 경우
이렇게 HTTP 메시지 컨버터가 문자 뿐만아니라 JSON타입은 객체로 변환해주는 것을 로그출력 결과를 통해 확인할 수 있다.