Dispatcher-servlet 에서 Controller 는?
@Controller ( or @RestController ) 가 붙어있는 클래스 내부에 @RequestMapping 이 있다면, Dispatcher-servlet 이, 해당 클래스에 요청을 전달한다.
기본적으로 @Controller , @RestController 를 등록하게 되면, RequestMappingHandlerMapping 을 통해서 작업이 수행이 된다.
RequestMappingHandlerMapping 에서 mappingRegistry 에 registry 에 등록이 되는 것을 확인 할 수 있었다.
-> 세부적으로 찾는 방식은 확인 해봐야 하겠지만.. pathLookup 변수 ( Map<String,ArrayList> )가 존재하고, 해당 key 값이 Request Path 인 것으로 보아, 해당 Path Lookup 으로 찾는 것으로 보인다. ( ** 뇌지컬이다.. => 디테일하게 찾는 것은 진짜 필요할 때 찾아보자 )
Dispatcher-servlet 에서, HandlerMapping 인스턴스 중, 처리가 가능한 핸들러를 가져오는 메소드 getHandler 를 통해
HandlerExcutionChain을 반환받아 처리하는데, HandlerExcutionChain 에는 처리를 선처리를 하기 위한 InterceptorList 와, 해당 처리를 진행할, 메소드가 들어가 있는 ( reflection Method ) Handler 를 가지고 있는 객체를 이용하여 처리를 진행한다.
( 내가 확인했을 때는 이렇고.. 정확한 정보는 아닙니다. Dispatcher-servlet 에 debug 찍고 진행했을 때, 나오는 handler 가져오는 부분 )
WebMvcConfigurer 를 상속받아, addViewControllers 를 통해, View Controller 를 URL 을 통해 등록하는 경우에는 SimpleUrlHandlerMapping 을 통해 진행을 하는 것을 확인 했다.
서버사이드 렌더링(SSR) 이 필요한 경우에는 간단히 ViewController 를 등록하여 진행하는 것도 좋은 방법으로 보인다.
RequestMapping 및 디테일한 Mapping
@RequestMapping , ( GetMapping, PostMapping ... etc )
---
@RestController
@Controller
위 2가지 어노테이션 하위에 어노테이션으로 기입이 되어있는 경우에 Spring Framework 에서 자동으로 Bean 에 등록 후, RequestHandler에 매핑이 된다.
** RequestMapping 에 필수인 값은 없다. 기본적으로 / 를 Path 로 가진다.
@RequestMapping 파라미터 설명 ( RequsetMapping Annotation Doc )
- name : String
( org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder
org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy )
에서 사용 되는 것으로 보인다.
( ** 실지로 사용해본적이 없는.. 자주 사용하는것은 대체로 value, path 를 이용한 경로 매핑 )
혹은 JSP 에서 사용되는 예제를 찾아서 첨부한다.
JSP 에서 사용되는 taglib 에서 mvcUrl 을 이용하여 처리하는 방법이다. 위의 예제는 다음과 같은 상황일때 적용하는 방법이다.<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> <a href="${s:mvcUrl('AdminController#BlogComments').arg("1","123").build()}">Get Person</a>
출처 : https://stackoverflow.com/questions/61152283/what-are-the-use-cases-of-the-name-property-of-the-requestmapping-annotation@Controller @ResponseBody @RequestMapping(name = "AdminController") class BlogController { @RequestMapping(name="BlogComments", path="blog/{blog}/comments/{page}") public List<Comment> listBlogComments(@PathVariable Blog blog, @PathVariable Long page) { ... } }
What are the use cases of the `name` property of the `RequestMapping` annotation in Spring Framework?
Apologies, if you find this question dumb... I am new to Spring framework. I spent hours looking up an answer... According to the official Spring Framework documentation, you can assign a name to a
stackoverflow.com
- value & path (alias 를 이용하여 동일 하다고 처리 된다) : String[]
- 배열 형태 ( 매핑 할 주소를 나열한다. )
- 혹은 한개만 기록도 가능
- placeholder 이용도 가능하다 ( 프로퍼티를 가져와 사용 가능 ) - params : String[]
- 파라미터를 강제한다. 파라미터에 값이 들어가 있으면, URL 파라미터는 필수적으로 들어가 있어야, 핸들러가 인식해서 진행이 가능하다.
- Get 메소드를 이용할 때, 파라미터 값이 있어야 처리가 가능한 경우에 처리도 가능할 것이다. - headers : String[]
- 헤더에 특정 값이 있어야 처리가 된다라는 마크 - consumes : String[] (class MediaType 안에 static 변수 사용 가능)
- Content-Type 에 특정 Media Type 을 강제할 수 있다.
- ! 연산자를 통해 특정 Media Type 만 빼고 이용도 가능하다. - produces : String[] (class MediaType 안에 static 변수 사용 가능)
- Accept 에 특정 Media Type 을 강제할 수 있다.
- ! 연산자를 통해 특정 Media Type 만 빼고 이용도 가능하다. - method : RequestMethod[]
- 허용하는 Http Method 를 정의 할 수 있는 파라미터
- 해당 파라미터만 하위 어노테이션에서 정의한 상태로 제공한다. ( GetMapping, PostMapping ... etc )
특징
- Class 에 RequestMapping 을 붙일 수 있다. 해당 RequsetMapping 을 붙이고, RequestMapping 에 URL 을 적는 ( path or value ) 에 값을 적으면, Class 에 붙어있는 RequestMapping 을 기본 URL (BaseURl) 로 된다.
- Method 에 RequestMapping 이 있는 경우, 해당 메소드를 이용하여 URL 의 행위를 처리한다는 내용으로, 처리가 된다. ( path or value) 에 값이 있으면, 해당 값으로 들어오는 Request 를 처리하겠다는 의미이다. ( Dispatcher Servlet 이 처리 )
- path , value 는 모두 배열 형태로, 여러개의 url 처리가 가능하다.
- params 값도 있는데, url 에 param 이 있는 경우에 처리가 가능하다. ( param 이 있는 경우에는 매핑이 되야 한다. )
- @PathVariable 을 사용할 수 있게 value, path 에 ( value = "/url/{pathVariableValue}/... ") 로 입력이 가능하다.
- 만일 value 값이 겹치는 부분이 있어서 선택하는데 우선순위는 더욱 디테일하게 적혀져 있는 RequestMapping 으로 처리한다.
'Spring' 카테고리의 다른 글
| JWT 를 이용한 권한 검증 및 처리 # jws (0) | 2022.09.15 |
|---|---|
| [번외] [JSP] Include & Forward 방식의 차이 (0) | 2022.01.11 |
| [Spring] Controller & RestController (0) | 2022.01.09 |