본문 바로가기
공부/Spring

[Spring][인프런 스프링 MVC] 스프링 MVC HTTP 요청, 응답 여러가지 방법

by 웅대 2023. 3. 5.
728x90
반응형

본 포스팅은 김영한 강사님의 인프런 강의 "스프링 MVC 1편"을 정리한 포스팅으로 강의 자료에서 사용한 자료를 사용했음을 밝힙니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

스프링 MVC를 사용하면 HTTP 요청, 응답에 관한 처리를 쉽게 할 수 있는데 이에 관한 여러가지 방법에 대해 정리해보려 한다.

 

이전에 서블릿의 요청, 응답 처리 방법에 대해 정리한 적이 있는데 이를 보면 도움임 되지 않을까 싶다.

https://growth-coder.tistory.com/105

 

[Spring][스프링 MVC 1편] 서블릿 기초 사용법

본 포스팅은 김영한 강사님의 인프런 강의 "스프링 MVC 1편"을 정리한 포스팅입니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 |

growth-coder.tistory.com

 

요청 매핑

우선 클라이언트가 보내는 요청의 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);
}
728x90
반응형

댓글