스프링 공부를 하고 스프링으로 과제와 프로젝트를 수행해본지도 한 6개월 남짓 된것 같다. 그 동안 스프링을 써오면서 "내부적으로 톰캣을 사용하는구나" 라고 생각했는데 이것은 완전히 틀린 생각이었다. 거꾸로 톰캣 안에서 스프링이 돌아간다고 보는것이 맞겠다. 톰캣의 servletContainer에 스프링 부트의 DispatcherServlet가 배포된다고 보는 것이 맞겠다.
처음에는 스프링에 '내장'된 웹 서버라는 생각을 하고 있었다. 내가 @RestController를 사용하여 컨트롤러를 만들어두면 톰캣은 Client의 요청을 받고 그 request를 내가 만든 Controller에 전달하는구나 라고 생각했다.
...쓰고 보니 이 표현 자체는 그렇게까지 틀린 표현은 아닌것 같다; 중요한 점은 톰캣은 단순한 정적 Web-Server가 아니며, Web-Server와 함께 Servlet-Container를 합쳐놓은 미들웨어라는 점이다. 그리고 이 톰캣의 Server-Container에 스프링의 DispatchServlet이 배포되어 실행된다. (참조 : https://taes-k.github.io/2020/02/16/servlet-container-spring-container/)
스프링이 뭐냐고 묻는다면 "자바 어플래케이션 개발을 위한 의존성 주입 프레임워크" 등 멋진말로 표현할 수 있겠지만 내게 중요한 개념은 그것이 아니다. 그 보다는 스프링 프레임워크의 중심에 있는 DispatcherServlet이 톰캣의 Servlet-Continer에 배포되어 돌아가는 Servlet중 하나일 뿐이라는 것을 아는게 더 중요하다. 어떻게 보면 우리가 그동안 짜왔던 수많은 스프링 코드들은 결국, 톰캣의 서블릿(DispatcherServlet) 하나를 배포하기 위해 해온것들이라고도 할 수 있겠다.
스프링 부트가 자동으로 톰캣을 실행시키고 DispatcherServlet을 배포하여 더 헷갈리는 개념이었다.
기본기부터 차분히 공부하자. 이번에 스프링 부트 강의를 듣기로 했는데 여기서 기본개념을 확실하게 잡고 갈수 있으면 좋겠다.