스프링에서 톰캣을 왜 쓸까?

Panda·2023년 5월 13일
1

Spring

목록 보기
37/45

맨날 스프링부트만 쓰면서
Dispatcher Servlet 이 스프링이 가진줄 알았고...
스프링 + 톰캣 구성으로 외부 톰캣쓰는거에 대해서 부정적인 시선을 가지고 있었습니다.

하지만 톰캣을 왜 쓰는지 점점 알게되면서 스프링과 톰캣을 바라보는 관점이 변화하여
톰캣을 왜 쓰는지에 대해 제대로 공부해보려고 공부했습니다.

톰캣

Servlet Container이자 WAS

톰캣과 스프링에 구성은 위에 사진과 같습니다.

Tomcat

  • FilterChain 소유
  • DelegatingFilterProxy로 스프링 FilterChain를 추가
  • Dispatcher Servlet 소유
  • 정적 파일 소유

Spring

  • Handler Mapping 소유
  • Interceptor 소유
  • Spring Security FilterChain 소유

즉 저희가 스프링 코드에서 Filter들을 추가했던 것은 Spring 측 FilterChain에 추가하여 사용했던 것입니다.

톰캣 실행 순서

스프링 + 톰캣 구성으로 실행을 할 때 Application Class가 없는데 실행이 되가지고 좀 놀랐습니다. 그래서 어떻게 톰캣이 스프링을 실행할까요?

  1. 웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 로딩.

  2. web.xml 에 등록되어있는 ContextLoaderListener 생성.

    • Spring ContextLoaderListener는 ServletContextListener 인터페이스를 구현하고있으며, ApplicationContext를 생성한다.
  3. ContextLoaderListener 가 root-context.xml 을 로딩.
    - ContextLoaderListener : 서블릿을 초기화하는 용도로 사용
    contextConfigLocation 파라미터를 사용하여, load할 수 있는 설정파일을 지정할 수 있다.

  4. root-context.xml 등록되어 있는 설정에 따라 Spring Container가 구동.

    • web.xml에 있는 context-param 옵션으로 root-context.xml 뿐만 아니라 다른 context.xml 파일들도 설정 가능
  5. 클라이언트로부터 Web Application에 요청.

  6. DispatcherServlet 생성.

  7. DispatcherServlet 이 servlet-context.xml 을 로딩.

  8. 이후 Spring Container 구동되며, 응답에 맞는 Controller들이 동작한다.

톰캣 디렉토리

톰캣 디렉토리 구조

  • bin : 톰캣을 실행하고, 종료시키는 스크립트 (.bat , .sh 등) 파일이 들어있다.
  • conf : webapps 에 적용하는 전역 설정. 설치시 다음을 기본으로 제공
  • lib : tomcat에서 사용하는 jar 파일 모음
  • logs : 예외 발생 사항 등의 로그 저장
  • webapps : 기본디렉토리 (localhost)(appbase)
  • work : 컴파일된 파일
  • temp : 톰캣 실행되는 동안 임시 파일 위치

핵심 파일

  • bin

    • startup.sh : 톰캣 실행 스크립트
    • shutodwn.sh : 톰캣 종료 스크립트
    • setenv.sh : 톰캣 구동 시 실행 환경 설정 스크립트 (처음에 직접 만들어줘야 함)
    • catalina.sh : 톰캣 로그 관련 설정 스크립트
  • conf

    • server.xml : Tomcat의 주 설정 파일로 접근/접속에 관한 설정이 주를 이룬다.
    • 다른 파일들도 가~~~끔 보긴하는데 사실상 server.xml 밖에 안봐요 ㅎㅎ
  • logs

    • 실행 로그(catalinah.out), 접근 로그(local_access) 등등 확인

저는 주로 이렇게 파일들을 보았던 것 같습니다.

느낀 점

결국 내장톰캣, 외부 톰캣을 쓰는 이유가 각각 존재하였고
저는 아무것도 알지도 못했는데 외부 톰캣을 사용하는 거에 대해 부정적인 시선을 가졌던 것 입니다.
이러한 생각이 있었다는게 창피하네요 ㅎㅎ

외부 톰캣을 쓰는 경우 톰캣만 버전업하여 사용할 수 있는 장점도 있고
해당 구성을 선택할 수 있는 다양한 상황들이 있는 것 같습니다.

이제 이해가 제대로 되어서 서버 구성을 제대로 할 수 것 같고
스프링 코드들을 작성 할 때도 어떠한 흐름으로 동작이 되는지 진짜 명쾌하게 이해가 된 것 같습니다.

profile
실력있는 개발자가 되보자!

0개의 댓글