-
Q . SpringBoot 에서 경로를 어떻게 인식을 하는 것인가 ? part 1Java&Spring/Spring 2023. 8. 5. 15:29
질문이 나온 배경글이다.
https://chosunghyun18.tistory.com/126
SpringBoot 프래임워크를 사용하여 간단하게 어노테이션을 통하여 지금 까지 URL 경로들을 설정해 주었다.
원리가 뭘까 ? 어노테이션을 먼저 따라가 보자.
프렌젠테이션 레이어의 컨트롤러 코드의 예시이다.
@RestController
@RequestMapping("/place")
@RequiredArgsConstructor
public class PlaceApiController {
private final PlaceService placeService;
private final PlaceGptSearchService placeGptSearchService;
private final ImageFileService imageFileService;
@PostMapping(produces = "application/json;charset=UTF-8")
public ApiResponse<PlaceDetailDto> addNewPlace(@RequestBody PlacePostRequestDto request) {
return ApiResponse.success(placeService.addNewPlace(request));
}@RestController 에 관한 설명은 다음과 같다.
문서에 따르면 @RestController 는 @Controller + @ResponseBody 를 위한 편의성 주석인것을 알 수 가 있다.
또한 , 적절한 HandlerMapping-HandlerAdapter 쌍이 설정이 되어 있는경우 @RestController 가 작동을 한다라고 적혀있다.
스프링 MVC의 기본 설정인 RequestMappingHandlerMapping-RequestMappingHandlerAdapter 쌍이 이에 해당하고,
@RestController 가 @RequestMapping이 붙은 메서드를 찾아 해당 메서드를 호출하는 역할을 한다.
그럼 이어서 다음 어노테이션을 보자.
- > @RequestMapping 어노테이션
- 웹의 요청을 , 요청 처리하는 (핸들러 및 컨트롤러)클래스의 매서드에 매핑하는 어노테이션의 설명이다.
공식 문서와 토비의 스프링 2 권에 따르면 ,
외부 http request의 요청은 DispatcherServlet 이 컨트롤러를 호출하고 결과를 받는다라고 설명이 되어 있다.
스프링 프레임워크의 확장성을 위해 다음과 같은 전략으로 MVC 가 구성이 되어 있고,
DispatcherServlet <-> Adapter <-> Controller/handler
이때 @RequestMapping 과 @Controller 어노테이션을 통해 정의되는 컨트롤러의 경우 ,
DefaultAnnotaionHandlerMapping 에 의하여 핸들러가 결정이 되고 그에 대응하여 AnnotaionMethodHandleAdapter 에 의해 호출이 일어난다.
+ 추가로 Request mapping 에 있는 , mvc Uri components builder 관련 문서이다.
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-uri-building.html
요약 )
- DefaultAnnotaionHandlerMapping 전략 일시 . (DispatcherServlet 의 7가지 전략중 handler mapping 관련 2가지 중 하나 )
핸들러 매핑 : @RequestMapping 의 정보를 활용 , 컨트롤러 빈의 메소드에 매핑.
핸들러 어댑터 : 매핑된 메서드를 실체로 호출하는 역할
즉 그림으로 보면 다음과 같다.
" HTTP message" --> DispatcherServlet <--> HandlerAdapter <--> Controller/handler
|
|
HandlerMapping
@MVC , 어노테이션 기반의 mvc 로 인하여 , 주소 매핑을 타입과 메서드 레벨에서 가능하게 되었다.
즉 다음과 같이 메서드 레벨의 매팽 어노테이션은 클래스 래밸의 어노테이션을 상속 받는다고 보면 된다.
@PostMapping(produces = "application/json;charset=UTF-8") public ApiResponse<PlaceDetailDto> addNewPlace
이론 적인 설명 에 더하여 직접적인 디버깅이 필요할것 같아, 디버깅을 통해 확인해보자.
'Java&Spring > Spring' 카테고리의 다른 글
Spring vs Spring Boot (0) 2023.10.08 @Transactional (1) (1) 2023.08.09 @RequiredArgsConsructor ,@NoArgsConstructor , @AllArgsConstructor (0) 2023.02.15 @RequiredArgsConstructor, @NotNull, @Valid ,@NotBlank (0) 2023.02.15 em.persist 이후 get$ObjsectId() 가 가능 한가? (0) 2023.02.04