본문 바로가기
IT 공부/자바와 웹 애플리케이션

[톰캣] - 프로젝트 배포 시 라이브러리 위치

by exdus3156 2024. 1. 3.

1. 톰캣 자체 내장 라이브러리

자바 웹 백엔드 프로젝트는 여러 라이브러리에 의존한다. 따라서 실제 배포를 할 때는 내가 사용하고 있는 라이브러리를 잘 분류하고 관리할 수 있어야 한다. 예를 들어, 롬복(lombok)처럼 소스코드를 수정만 할 뿐, 일단 컴파일하고 나면 더 이상 사용하지 않는 라이브러리는 배포할 때는 필요 없을 것이다. JUnit과 같은 테스트 프로그램도 마찬가지다. 배포 시에는 JUnit 라이브러리는 필요 없다.

이때 필수적인 의존성 라이브러리 중 일부는 너무나 중요한 기술이기 때문에 이미 톰캣 프로그램 자체에서 라이브러리가 내장된 경우가 있다. 예를 들어, Serlvet이 그러한 기술이다. 톰캣이 서블릿 객체를 관리하고 실행하는 서블릿 컨테이너이기 때문에 서블릿 코드를 이미 확보하고 있어야 할 것이다. 톰캣 자체에서 이미 구현 코드를 가지고 있기 때문에, 프로젝트 빌드 및 배포 시 Servlet은 굳이 같이 배포할 필요가 없다.

 

 

실제로 위 그림을 보면, 톰캣 설치 파일의 라이브러리(lib) 디렉토리에는 이미 중요한 JavaEE 스펙 기술을 구현한 라이브러리가 배포되어 있다. Servlet, JSP, el (jsp 문법 일부), ...

서블릿 컨테이너 스펙 또한 JavaEE 일부이기 때문에 이클립스나 인테리제이 등의 IDE는 알아서 Servlet 라이브러리를 컴파일 시에만 사용할 수 있도록 메이븐(혹은 그레이들) 설정을 관리해준다. 나중에 빌드를 하고 war를 배포할 때는 컴파일할 때 사용했던 Serlvet 라이브러리를 배포하지 않는다. 톰캣과 같은 서블릿 컨테이너가 이미 가지고 있기 때문이다.

이러한 사항들이 메이븐이나 그레이들과 같은 빌드툴에 적용되어야 한다. 그래야 불필요한 배포를 막을 수 있을 것이다. 서블릿 API는 오직 컴파일할 때만 사용될 뿐이며, 테스트 프로그램(JUnit) 또한 test 단계에서만 사용된다.

 

maven
gradle

maven은 scope가 provided로, gradle은 compileOnly로 의존성이 잡혀 있는 것을 확인할 수 있다.

 

 


2. 함께 배포되는 것.

특별히 함께 배포될 필요가 없는 것들은 컴파일이나 테스트를 할 때만 필요하다고 명시하면 된다. 위에서 설명한 바와 같이 Servlet, JSP 구현 코드도 그렇고, JDK 표준 라이브러리도 JVM이 있는 이상 배포할 이유가 전혀 없다. 쓸데 없이 용량만 차지할 것이다.

그러나 배포 후 실행 환경에서도 사용되어야 하는 단독 라이브러리들은 반드시 해당 라이브러리가 배포 파일에 포함되어야 한다.

예를 들어, 특정 데이터베이스 드라이버의 경우가 그렇다. 애플리케이션이 실행되면서 드라이버의 로직을 요청하기 때문에 반드시 배포 파일에 함께 있어야 할 것이다.

배포 위치는 WEB-INF의 lib 디렉터리다. 프로젝트를 war 패키지로 빌드하면 자동으로 빌드툴이 필요한 라이브러리만을 추출해서 함께 배포해준다. 위 라이브러리 중 하나라도 빠지면, 애플리케이션이 수행하다가 필요한 클래스를 로드하고 요청하려 할 때 실패할 것이다. 클래스를 못 찾기 때문이다.