
@RequestMapping은 어떤 역할을 수행하고 어떤 기능을 가지고 있는지 알아보자
@RequestMapping
@RequestMapping은 단순하게 설명하자면 영단어 뜻 그대로 요청을 매핑해주는 역할을 수행하지만 이 어노테이션이 어떻게 동작하는지 깊게는 알 수 없어도 조금만 들여다보자. 아래 글에서도 다룬적이 있기때문에 아래글을 보는 것을 추천한다.
Spring MVC - Dispatcher Servlet과 View Resolver
Spring MVC의 구조를 깊이 있게 알기위해서는 기존의 MVC패턴의 전체 구조를 알고 이해하는 것이 도움이 될 것이다. Spring MVC의 범위는 매우크고 기능 또한 매우 많기때문에 기본 베이스 없이 Spring MV
lee-dev-log.tistory.com
MVC패턴과 변천사 - 핸들러와 핸들러어댑터 패턴 적용
이전 포스팅에서는 Model개념을 적용하여 request.serAttribute로 수행하던 파라미터 값을 가져오는 것을 Model을 통해 해결함으로 Servlet에 종속성을 제거하였다. 또 뷰 리졸버를 사용해서 각 컨트롤러
lee-dev-log.tistory.com
@RequestMapping 어노테이션 자체는 클라이언트의 HTTP요청을 특정 핸들러 메서드에 매핑하는 역할을 수행한다.
이렇게 말로만 설명하면 어려울 수 있으니 아래 코드를 살펴보자
@RestController
public class RequestMappingExam {
@RequestMapping("/calc/add")
public String add(){
return "add";
}
@RequestMapping("/calc/minus")
public String minus(){
return "minus";
}
@RequestMapping("/calc/mul")
public String mul() {
return "mul";
}
}
@RestController는 지금 당장은 컨트롤러이지만 단순히 각 메서드가 반환하는 문자열 자체를 응답페이지에 띄운다고만 알아두자
위에 코드에서 add, minus, mul 연산을 수행하는 임의의 메서드들이 있다.
여기서 @RequestMapping 어노테이션에 괄호안에 있는 문자열 값은 사용자가 보내는 요청으로 "/calc/add"를 사용자가 요청하였을 경우 서버는 그에 매핑되는 메서드를 호출하여 실행한다.
따라서 /calc/add를 URL을 통해 요청하였을 때 위와 같은 결과를 얻을 수 있다.
minus, mul메서드도 마찬가지이다.
Reqeust요청을 아래 코드와 같이 배열로 다중 값을 처리할 수 있다.
@RequestMapping({"/calc/add", "/calc/plus"})
public String add(){
return "add";
}
지금까지의 간단한 예제코드를 통해 @RequestMapping 어노테이션이 단순하게 어떤 역할을 수행하는지 확인할 수 있었을 것이다.
이제 이 @RequestMapping 어노테이션이 어떻게 동작하는지 구조를 간단하게 살펴보자.
RequestMappingHandlerMapping
@RequestMapping이라는 어노테이션은 바로 RequestMappingHandlerMapping과 ReqeustMappingHandlerAdapter의 ReqeustMapping이 공통으로 들어간다는 부분에서 따왔다. 이는 이 둘로부터 @RequestMapping이 파생됐다고 해도 과언이 아닐 것이다. 그러므로 이들은 어떤 역할을 하며 무슨 기능을 하는지 알아보자.
ReqeustMappingHandlerMapping은 @ReqeustMapping어노테이션이 붙은 클래스나 메서드를 스캔하고 어떤 URL요청이 들어왔을 때 그에 맞는 URL요청을 어떤 메서드에 매핑되어 있는지 파악하는 역할을 하며 매핑되어있는 정보를 바탕으로 핸들러(메서드)를 찾는 역할을 한다.
이 매핑정보는 Spring MVC가 시작될 때 @RequestMapping 어노테이션을 스캔하여 Spring에서 관리하게 된다.
@RestController
public class RequestMappingExam {
@RequestMapping("/calc/add")
public String add(){
return "add";
}
@RequestMapping("/calc/minus")
public String minus(){
return "minus";
}
@RequestMapping("/calc/mul")
public String mul() {
return "mul";
}
}
위 코드로 설명하자면 Spring MVC가 시작되면,
/calc/add - String add()
/calc/minus - String minus()
/calc/mul - String mul()
과 같이 요청 URL에 맞는 메서드를 호출하기위해 Spring은 위 3개의 매핑 정보를 갖게되는 것이다.
여기서 알아야할 점은 ReqeustMappingHandlerMapping 단지 요청URL과 실행 될 메서드를 매핑해줄 뿐 직접 호출하고 실행하지는 않는다는 점이다.
RequestMappingHandlerAdapter
매핑된 정보를 기반으로하여 요청된 URL에 맞는 매핑된 메서드를 호출하고 실행하는 역할은 ReqeustMappingHandlerAdapter가 수행한다.
Handler Adapter는 메서드 파라미터로 Model이나 HttpServletReqeust가 필요할 경우 이를 제공하고 메서드의 반환 값으로 String, ModelAndView등이 반환될 때 이를 처리할 수 있도록 응답을 생성하는 역할을 합니다.
이러한 기능을 제공하기 때문에 SpringMVC를 유연하게 사용할 수 있게 해줍니다.
HTTP 메서드 지원
Spring MVC는 HTTP메서드인 Get, Post, Put등등 모든 HTTP메서드와의 호환도 지원한다.
아래 코드와 같이 사용하려는 HTTP 메서드에 맞추어서 ReqeustMapping어노테이션을 수정할 수 있다.
@RestController
public class RequestMappingExam {
@GetMapping({"/calc/add", "/calc/plus"})
public String add(){
return "add";
}
@PostMapping("/calc/minus")
public String minus(){
return "minus";
}
@RequestMapping("/calc/mul")
public String mul() {
return "mul";
}
}
PathVariable(경로 변수)
아래 코드와 같이 {num}처리 하였을 경우 num에 맞는 변수를 num1으로 치환해주는 기능도 있으며, 이 때 Integer.parse처리도 같이 수행해주므로 편리하게 사용할 수 있다.
@RequestMapping("/calc/minus/{num}")
public String minus(@PathVariable("num") int num1){
System.out.println("num1 = " + num1);
return "minus";
}
만약 경로 변수명과 매개변수의 이름이 같다면 아래와 같이 생략할수 있다.
@RequestMapping("/calc/minus/{num}")
public String minus(@PathVariable int num){
System.out.println("num = " + num);
return "minus";
}
'Framework > Spring' 카테고리의 다른 글
[Spring] JdbcTemplate (0) | 2024.06.16 |
---|---|
Spring - 메시지 기능으로 HTML하드코딩 제거하기 (0) | 2024.04.23 |
Spring MVC - 프레임워크 사용 전과 후 & @Controller (0) | 2024.04.15 |
Spring MVC - Dispatcher Servlet과 View Resolver (0) | 2024.04.15 |
스프링 컨테이너와 싱글톤 (0) | 2024.03.23 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!