zenn.skin 무료버전 배포중!
자세히보기

2024/10 8

Web/Spring
Spring은 비동기 처리를 한 후에 어떻게 응답할까? - 1 : 요청 쓰레드의 반환

Spring의 동기와 비동기Spring에서는 @Async 애노테이션을 사용하면 내부에서 ThreadExecutorTaskPool을 사용해 비동기 처리를 위한 쓰레드 풀을 관리한다. 비동기 처리를 사용하지 않으면 서블릿 컨테이너가 요청부터 응답까지의 처리를 수행하게 된다. DispatcherServlet에 Request가 들어와서 DAO를 통해 데이터를 받아 응답할 때까지 서블릿의 쓰레드는 결과를 기다리고 있다가 응답값을 반환하게 된다. @Async 애노테이션을 사용하면 조금 다르게 동작한다. 요청은 비동기 처리를 수행하는 쓰레드 풀에게 위임하고 서블릿의 쓰레드는 다시 서블릿 쓰레드 풀로 반환되게 된다. 이때, 서블릿의 쓰레드는 비동기 처리를 하는 쓰레드 풀로 요청에 대한 처리를 위임하고 Completab..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - SSR 렌더링 과정

DispatcherServlet은 SpringMVC의 메인이라고 할 수 있을만큼 여러 기능을 수행한다. 그림에서 볼 수 있듯이 여러 컴포넌트들의 사이에서 중개자 역할을 하며 요청을 HandlerAdapter에 넘겨 처리하고, 처리한 결과를 응답에 맞게끔 후처리해주는 역할을 한다. 코드를 뜯어보면서 DispatcherServlet의 각 메서드가 어떤 역할을 하는지 살펴봤는데, 이번에는 정리하는 겸 각 역할을 하는 메서드를 살펴보며 마무리해보려 한다. HandlerMapping 조회// DispatcherServlet@Nullableprotected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { if (th..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - Multipart & ExceptionHandling

MultipartcheckMultipartHTTP 요청이 멀티파트 요청인지 확인하고, 멀티파트 요청인 경우 이를 적절하게 처리하는 역할을 한다.멀티파트 요청은 파일 업로드와 관련된 요청을 처리할 때 사용된다.protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException { if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) { if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) { ..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - view 관련

doDispatch, doService 코드를 보고 나머지 코드들을 보려니까 마음이 편하다.render메서드와 resolveViewName, applyDefaultViewName 메서드는 모두 view와 관련한 코드들로 handler로부터 받은 값을 처리해주는 역할을 한다.Renderrender 메서드의 동작은 다음과 같다.1. Locale 설정2. View 객체 가져오기3. ModelAndView의 View 객체 사용4. 응답 상태 설정 및 렌더링protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { // ModelAndView 객체에서 local..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - dispatch

드디어 dispatcherServlet의 주요 기능인 dispatch 부분에 대해 공부해보려 한다. 아직 render나 viewResolver, multipart 같은 부분이 남아있는데, 먼저 dispatch 부분을 살펴보고 나머지 코드도 살펴보려 한다. doServiceprotected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { /** * 1. 요청 로그를 남기는 메서드 호출 */ this.logRequest(request); /** * 요청 속성을 백업 - jsp 관련 코드 */ Map attributesSnapshot = ..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - getter & setter

getter요소에 대한 getter@Nullablepublic final MultipartResolver getMultipartResolver() { return this.multipartResolver;}@Nullablepublic final List getHandlerMappings() { return this.handlerMappings != null ? Collections.unmodifiableList(this.handlerMappings) : null;}getter에서 mutlpartResolver, handlerMappings는 말그대로 dispatcherServlet이 갖는 속성값을 반환해준다.크게 얘기할 부분이 없다. request에 사용되는 getter@Nullableprot..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - Constructor & init

이번에는 init 관련 메서드를 정의해보려 한다. getter, setter와 함께 보려 했는데 init 관련 함수만 해도 생각보다 양이 많아서 나누어 정리해보려 한다. Constructorpublic DispatcherServlet() { this.setDispatchOptionsRequest(true);}public DispatcherServlet(WebApplicationContext webApplicationContext) { super(webApplicationContext); this.setDispatchOptionsRequest(true);}dispatcherServlet은 코드양에 비해 아주 간단한 생성자를 가진다.wac을 받거나 받지 않는 경우인데, wac을 매개변수로 받..

Web/Spring
[Spring Web 6.1] DispatcherServlet 뜯어보기 - Deprecated & Static

Spring을 공부하면서 라이브러리를 직접 뜯어봐도 재미있을 것 같아 시간이 날 때마다 하나씩 뜯어보려고 한다.워낙 코드가 많기 때문에 web 서버에서 빠질 수 없는 Spring web의 dispatcherServlet의 코드를 보려고 한다.DispatcherServlet 코드만 900줄 가까이 되기 때문에 이론상으로만 알고 있던 내부 로직을 코드로 직접 뜯어보고 느껴보는 것도 많은 도움이 될 것 같아.Spring Web 6.1을 기준으로 코드를 분석해보려 하고, deprecated된 코드부터 살펴보려 한다.변수에 대한 내용은 그 때, 그 때 메서드를 분석할 때마다 같이 공부해보려 한다. Deprecated1) setThrowExceptionIfNoHandlerFound/** @deprecated */@..