-
Q . SpringBoot 에서 경로를 어떻게 인식을 하는 것인가 ? part 1Java&Spring/Spring 2023. 8. 5. 15:29
질문이 나온 배경글이다.
https://chosunghyun18.tistory.com/126
경로 에러 추가 하기
프로젝트 중 경로를 잘못 입력했을때 500 에러가 나는 것을 확인 했다. api 를 설계하는데 있어 사용자에게 서버 로직에러인 500 에러를 알려주는것은 좋은 설계가 아니라고 한다. 이를 바꿔 보자.
chosunghyun18.tistory.com
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
URI Links :: Spring Framework
In views such as Thymeleaf, FreeMarker, or JSP, you can build links to annotated controllers by referring to the implicitly or explicitly assigned name for each request mapping. Consider the following example: @RequestMapping("/people/{id}/addresses") publ
docs.spring.io
요약 )
- 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