본 포스팅은 김영한 강사님의 인프런 강의 "스프링 MVC 1편"을 정리한 포스팅으로 강의 자료에서 사용한 자료를 사용했음을 밝힙니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC를 사용하면 HTTP 요청, 응답에 관한 처리를 쉽게 할 수 있는데 이에 관한 여러가지 방법에 대해 정리해보려 한다.
이전에 서블릿의 요청, 응답 처리 방법에 대해 정리한 적이 있는데 이를 보면 도움임 되지 않을까 싶다.
https://growth-coder.tistory.com/105
요청 매핑
우선 클라이언트가 보내는 요청의 url 경로에 따라서 다른 로직을 실행하기 위해 요청을 매핑해야 한다.
요청을 매핑할 때는 @RequestMapping 어노테이션을 사용한다.
@Controller
@RequestMapping("/api/users")
public class ControllerPractice {
@RequestMapping(method = RequestMethod.POST) //Post 요청 받음
public String save() {
...
}
@RequestMapping(method = RequestMethod.GET) //Get 요청 받음
public String get() {
...
}
@RequestMapping(method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE)
//메소드가 Get이고 HTTP 요청의 Content-Type 헤더가 application/json인 요청 받음
public String get() {
...
}
@RequestMapping(method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE)
//메소드가 GET이고 HTTP 요청의 HTTP 요청의 Accept 헤더가 "text/plain"인 요청 받음
public String get() {
...
}
//consume은 들어오는 타입, produce는 나가는 타입
}
@RequestMapping 어노테이션을 클래스에 사용하면 해당 url로 들어오는 모든 요청은 해당 클래스에서 처리한다는 의미이다.
위 코드에서는 "api/users"로 시작하는 요청은 모두 ControllerPractice에서 처리한다.
@RequestMapping 어노테이션을 메소드에 사용하면 해당 url로 들어오는 요청은 해당 메소드에서 처리한다는 의미이다.
그리고 method 속성을 사용하여 메소드를 제한할 수 있다. 사용하지 않으면 GET, POST 등등 모든 메소드를 처리한다.
혹은 간단하게 이러한 속성 제한이 걸려있는 어노테이션인 @GetMapping, @PostMapping, @PutMapping 등등의 어노테이션을 사용할 수도 있다.
공통 url은 클래스 단위에서 설정하고
구체적 url 및 메소드는 클래스 내부의 메소드에 설정하는 것이 일반적이다.
요청 헤더
@RequestHeader : 요청 헤더
가져오고 싶은 헤더를 인자로 넣어주면 된다.
@RequestMapping("/header")
public String getHeader(@RequestHeader("host") String host) {
...
}
요청 파라미터
@PathVariable : url 파라미터
"/api/users/1", "/api/users/2" 이렇게 url 경로를 통해 값을 전달할 경우 다음과 같이 @PathVariable을 사용한다.
@Controller
@RequestMapping("/api/users")
public class ControllerPractice {
@RequestMapping("/{id}")
public String get(@PathVariable(name = "id") Long id) {
//이처럼 파라미터 이름과 name이 동일하면 name 속성을 생략해도 된다.
...
}
}
@RequestParam : 쿼리 스트링 조회
쿼리 파라미터나 Html form으로 들어온 파라미터를 조회할 수 있다.
@RequestMapping("/param")
public String getHeader(
@RequestParam("name") String name,
@RequestParam("age") Integer age
// //이처럼 파라미터 이름과 name이 동일하면 name 속성을 생략해도 된다.
) {
...
}
"/param?name={name}&age={age}"
쿼리 스트링 형식을 조회할 수 있다.
required, defaultValue등의 속성을 사용할 수도 있고 모든 파라미터를 Map 형식으로 받을 수도 있다.
@ModelAttribute : 파라미터를 객체 형식으로
name과 age를 파라미터로 받을 때 아래와 객체를 같이 만들고
@Getter @Setter
public class Person {
private String name;
private int age;
}
@ModelAttribute를 사용하면 "/param?name={name}&age={age}" 이러한 형식의 파라미터를 사용할 수 있다.
@RequestMapping
public String model(
@ModelAttribute Person person
){
...
}
@RequestParam과 @ModelAttribute는 어노테이션 자체를 생략할 수도 있다.
요청 메시지 바디
@RequestBody : 메시지 바디로 들어오는 요청 정보 조회
일반 String 및 객체를 가져올 수 있다.
@RequestMapping
public String body(
@RequestBody Person person
){
...
}
@RequestMapping
public String body(
@RequestBody String string
){
...
}
이는 메시지 바디와 관련된 어노테이션으로 생략하면 파라미터와 관련된 @RequestParam 및 @ModelAttribute로 받아들이기 때문에 생략하지 않는다.
HTTP 응답
@ResponseBody : 메시지 바디에 응답 데이터
메시지 바디에 응답 데이터를 넣기 위해선 @ResponseBody 어노테이션이 필요하다.
일반 String 및 객체 또한 응답 가능하다.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String save() {
...
return "ok";
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public Member save() {
Member member = new Member();
...
return member;
}
@ResponseEntity : 메시지 바디 이외에도 상태 코드 설정 가능
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Person> responseEntity() {
Person person = new Person();
...
return new ResponseEntity<>(person, HttpStatus.OK);
}
'공부 > Spring' 카테고리의 다른 글
[Spring][인프런 스프링 MVC] @ModelAttribute와 검증 (Validation) (0) | 2023.03.07 |
---|---|
[Spring][인프런 MVC 1편] 로그(logger) 사용법 (0) | 2023.03.06 |
[Spring][스프링 MVC 1편] 스프링 MVC 어댑터 패턴 (controller v5) (0) | 2023.03.04 |
[Spring][인프런 스프링 MVC] MVC 구를 직접 개선해가며 스프링 MVC 구조를 이해하기 (controller v1~v4) (0) | 2023.03.01 |
[Spring] 스프링 mysql 데이터베이스와 jpa 연동 (2) | 2023.02.17 |
댓글