ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 톰캣(WAS)과 스프링 그리고 스프링부트 , 무슨 관계지?
    Spring & JPA 2023. 10. 16. 04:22

    스프링을 초반부분을 공부중이다.

     

    스프링의 MVC 패턴에서 배우는 핸들러나 디스패처 서블릿이 왜필요한지 정도를 공부한적도 있고,

     

    웹 서버와 웹 애플리케이션 서버의 차이에 대해 공부한적도 있는데

     

    스프링과 톰캣WAS)의 관계를 공부한적이 없다. 그냥 막연히 스프링부트가 톰캣 띄워주는 정도로 이해하고있었다.

     

    어느 강의에서 '옛날엔 톰캣 설정하다 시간 다갔다' 라는 말만 들어봤고 정확히는 몰라서 정리해보려한다.


     

    웹 서버와 웹 애플리케이션 서버의 차이를 모르신다면.. 

     

    해당글을 읽어보시는것을 추천드립니다.

     

    톰캣은 정적 처리를 돕는 웹 서버의 기능과 Sevlet Container가 합쳐진 WAS라고 이해하면 된다.

     

     

    톰캣과 스프링 사용 흐름도

     

    결국엔 웹서버만으로는 동적처리가 안되니까 무언가 추가를 하는것인디... 바로 서블릿이 해주는것이다. 

     

    정확히는 밀려들어오는 http패킷을 일일이 다 까서  개발자가 처리할수없으니

     

    로직에 집중할 수 있도록 도와주는 것이  서블릿의 역할이다.

     

     

    그 중 디스패쳐 서블릿은 맨 앞에 나서서 스프링의 다른 기능들에게 역할을 분배,위임 해주는 역할을 한다.

     

    위 그림상으로는 디스패쳐 서블릿이 톰캣에 있는데, 스프링 컨테이너에 넣은 사람도 있고 관점에 따라 다르게 보는 것 같다. 

     

    스프링이 있기 전, 아주아주 옛날에는 톰캣과 같은 WAS에 자바 코드를 작성해서 빌드했다고 한다.

     

    근데 지금은 워낙 동적 처리해야할게 커져서 스프링이라는 거대한 컨테이너가 생겼다고 한다.

     

     

    // package org.springframework.web.servlet;
    @SuppressWarnings("serial")
    public class DispatcherServlet extends FrameworkServlet {
    	
        ...
    
    	public void setDetectAllHandlerMappings(boolean detectAllHandlerMappings) {
    		this.detectAllHandlerMappings = detectAllHandlerMappings;
    	}
    
    	protected void initStrategies(ApplicationContext context) {
    		initMultipartResolver(context);
    		initLocaleResolver(context);
    		initThemeResolver(context);
    		initHandlerMappings(context);
    		initHandlerAdapters(context);
    		initHandlerExceptionResolvers(context);
    		initRequestToViewNameTranslator(context);
    		initViewResolvers(context);
    		initFlashMapManager(context);
    	}
    
    	@Override
    	protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ~~~
    	}
    
    	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ~~~
    	}
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            ~~~
        }
    
        protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            ~~~
        }
    
        ...
    }

     

    실제 디스패쳐 서블릿이 하는 일이다. 

     

     

     

    이건 꽤나 유명한 MVC패턴 그림인데,

    디스패쳐 서블릿을 주로 스프링에 업무를 위임해주고 상태,요청을 주고 받을수있는 통로 정도로 이해하면 되겠다.

     

    전체적인 흐름도


    서블릿 컨테이너가 하는 역할에 대해 정리를 해보면

     

    1.  웹서버와의 통신을 지원한다. 소켓을 만들고,통신 과정을 API로 제공받는게 많아서  복잡한 과정을 손쉽게 해결할 수 있다.

     

    2. 서블릿 생명주기 관리. GC가 존재해서 서블릿 내의 컨테이너 효율적인 관리가 가능하다.

     

    3. 서블릿 컨테이너에서는 스레드풀을 만들어서 관리하고, 멀티 쓰레드가 가능하다. 

     

    4. 웹 요청에 대해  HttpServletRequest,HttpServletResponse 를 생성해서 스프링 컨테이너로 넘겨준다.

     

     

     

    내가 공부한 시점에는

    (springboot web dependency를 추가한) 스프링부트를사용하고 있었기에 

    톰캣을 내장으로 설치가 되어있어 편하게 개발에 집중 할 수 있었던 것이다. 

     

     

     


    Reference

     

    https://velog.io/@jakeseo_me/%EC%9E%90%EB%B0%94-%EC%84%9C%EB%B8%94%EB%A6%BF%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90.-%EA%B7%BC%EB%8D%B0-%ED%86%B0%EC%BA%A3%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%84-%EC%82%B4%EC%A7%9D-%EA%B3%81%EB%93%A4%EC%9D%B8

    https://taes-k.github.io/2020/02/16/servlet-container-spring-container/

    https://gowoonsori.com/spring/architecture/

Designed by Tistory.