스프링 - Request Handler, HandlerMapping, DispatcherServlet, Errorconfig, RestAPI

JungWooLee·2022년 9월 24일
0

Spring

목록 보기
1/5
post-thumbnail

스프링에 대해 이해하기

블로그를 통하여 정보를 찾다 보면 문득 돌아보면 스프링의 동작 방식에 대해서는 정작 자세하게 공부할 시간이 없어서 시작하게 됨

Request Handled?

컨트롤러를 통하여 GetMapping 하였을 때 스프링에서는 어떻게 동작할까?

처음에 스프링 프로젝트를 빌드할때에 spring-boot-starter-web 디펜던시를 추가하였다면 디스패처 서블릿은 이 디펜던시를 통하여 자동으로 디스패처서블릿 bean 을 생성한다

즉, 컨트롤러로 url을 통한 요청이 들어온다면 다음과 같은 과정을 거치게 된다

  1. 프로젝트를 실행하면 spring-boot-starter-web에 의하여 내장 톰캣 빈이 생성된다

  2. 이후 디스패처 서블릿 빈이 생성된다

  3. 웹에서 컨트롤러를 호출하면 url 을 전송한다

  4. query stirng (url) 을 UTF-8 로 인코딩

  5. 쿠키 정보 파싱, AuthConfig 에 설정한 인증 정보를 갖고와 유효한지 확인

  6. 디스패처 서블릿 시작, 유효한 해당 요청을 매핑한 Handler 매핑이 있다면 핸들러매핑에게 넘겨줌

  7. 핸들러 매핑은 매핑된 컨트롤러에게 요청을 전달

  8. 컨트롤러에서 요청을 처리, 이때 RestContoller 라면 JacksonHttpMessageConverters 에 의하여 json 형태로 값을 반환

  9. 디스패처 서블릿은 이 값을 브라우저에 반환

아래는 예시로 실행해본 실제 구동 디버그

2022-09-24T20:07:15.930+09:00 DEBUG 36532 --- [nio-8080-exec-1] org.apache.tomcat.util.http.Parameters   : Set query string encoding to UTF-8
2022-09-24T20:07:15.931+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.a.t.util.http.Rfc6265CookieProcessor   : Cookies: Parsing b[]: Idea-1abc5923=d4c376a8-57cb-4c7d-958a-72e4e89ac5c0
2022-09-24T20:07:15.933+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.a.c.authenticator.AuthenticatorBase    : Security checking request GET /users
2022-09-24T20:07:15.933+09:00 DEBUG 36532 --- [nio-8080-exec-1] org.apache.catalina.realm.RealmBase      :   No applicable constraints defined
2022-09-24T20:07:15.935+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.a.c.a.jaspic.AuthConfigFactoryImpl     : Loading persistent provider registrations from [C:\Users\wjddn\AppData\Local\Temp\tomcat.8080.6994140009362026280\conf\jaspic-providers.xml]
2022-09-24T20:07:15.935+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.a.c.authenticator.AuthenticatorBase    : Not subject to any constraint
2022-09-24T20:07:15.936+09:00  INFO 36532 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-09-24T20:07:15.936+09:00  INFO 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-09-24T20:07:15.936+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected StandardServletMultipartResolver
2022-09-24T20:07:15.936+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected AcceptHeaderLocaleResolver
2022-09-24T20:07:15.936+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected FixedThemeResolver
2022-09-24T20:07:15.937+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@78bd3d75
2022-09-24T20:07:15.937+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.support.SessionFlashMapManager@2300f000
2022-09-24T20:07:15.937+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2022-09-24T20:07:15.937+09:00  INFO 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2022-09-24T20:07:15.942+09:00 DEBUG 36532 --- [nio-8080-exec-1] org.apache.tomcat.util.http.Parameters   : Set encoding to UTF-8
2022-09-24T20:07:15.944+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : GET "/users", parameters={}
2022-09-24T20:07:15.948+09:00 DEBUG 36532 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.in28menutes.rest.webservices.restfulweb0services.user.UserResource#retrieveAllUsers()
2022-09-24T20:07:15.948+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-09-24T20:07:15.967+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.h.stat.internal.StatisticsInitiator    : Statistics initialized [enabled=false]
2022-09-24T20:07:15.982+09:00 DEBUG 36532 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json]
2022-09-24T20:07:15.982+09:00 DEBUG 36532 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Writing [[User{id=1, name='Adam', birthDate=1992-09-24}, User{id=2, name='Eve', birthDate=1997-09-24}, User{i (truncated)...]
2022-09-24T20:07:16.012+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-09-24T20:07:16.013+09:00 DEBUG 36532 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

😊 이래서 Spring boot 를 씁니다.

앞서 말한 디스패처서블릿, 잭슨컨버터 등과 같이 web starter 디펜던시만 있다면 스프링 컨테이너가 자동으로 빈을 등록해주고 이들을 Auto Configure(자동설정) 해주기 때문!!


로깅을 통해 확인해보면 자동으로 config 빈을 생성해주는 것을 알수 있다


JacksonHttpMessageConverters ?

어떻게 클래스였던 것이 Json 으로 요청을 반환하는 것일까?
✔ : @ResponseBody + JacksonHttpMessageConverters 때문

ResponseBody 의 경우 @RestController 를 선언하였기 때문에 이미 정의를 하였던 것을 알 수 있다
RestController 에 포함된 어노테이션은 다음과 같다

JacksonHttpMessageConverters 의 역할 : 컨트롤러에서 자바 빈을 통하여 반환하였을 때 message conversion이 발생하는데 default로 json 타입으로 변환한뒤 반환

JacksonHttpMessageConverters 의 경우에도 spring boot 의 강력한 auto configuration이 해결해주는데 로깅에서 찾아볼 수 있다


스프링 에러 처리

누가 에러에 대한 매핑을 관제하는가?

현재 다음과 같은 컨트롤러가 있다하였을 때 올바르지 않은 url 을 입력했을때의 브라우저의 모습은 다음과 같다

누가 이러한 에러에 대한 설정들을 담당하는가?
✔ : 이 또한 부트의 auto configuration에서 관리한다 → ErrorMvcAutoConfiguration

이에 대해서 자세히 보고 싶다면 ErrorMvcAutoConfiguration 를 검색해본다면 white label 에러에대한 html 을 빌더로 작성되어있는 것을 확인 할 수 있다

0개의 댓글