다시 웹, 백엔드로/스프링

스프링 부트와 내장 톰캣 - 1

EnoughTT 2023. 8. 17. 16:29

WAR 배포 방식의 단점

  • WAS 를 별도로 설치해야함
  • 개발 환경 설정이 복잡함
  • 배포 과정이 복잡함
  • 톰캣 버전을 변경하려면 톰캣을 다시 설치해야함

 

외장 서버 VS 내장 서버

 

왼쪽은 WAS 를 실행해서 동작하는 방식, 오른쪽은 JAR안에서 WAS 라이브러리가 포함되는 방식

 

 

내장 톰캣 - 설정

서블릿 관련해서도 다 들어있음

내장 톰캣 추가
톰캣 - 서블릿 관련

 

내장 톰캣 - 서블릿

  • 내장 톰캣 생성해서, 8080 포트에 연결
  • 서블릿 등록
    • tomcat.addServlet() 서블릿 등록
    • context.addServletMappingDecoded() 서블릿 경로를 매핑
  • tomcat.start() 톰캣 시작

실행 시

 

내장 톰캣 - 스프링

스프링 연동

  • 내장 톰캣 (8080) 포트 연결
  • 스프링 컨테이너 빈 (Bean) 등록
  • 스프링 MVC 디스패처 서블릿을 만들고 스프링 컨테이너에 연결
  • 디스패처 서블릿 내장 톰캣에 등록
  • 실행

 

내장 톰캣 - 빌드 및 배포

jar 형식으로 빌드해야 함, 그리고 META-INF/MANIFEST.MF 파일에 main() 메서드를 지정해줘야 함

그냥 만들면 깨지기 때문에 build.gradle 에 작성을 해줌

build.gradle
jar 형식으로 build
jar 압축 풀기

 

jar 파일들

딱 컴파일 된 소스들만 있고, 스프링 라이브러리나 톰캣 관련 라이브러들이 안보임

 

war 의 경우 라이브러리 역할을 하는 jar 파일을 포함

  • WEB-INF
    • classes
      • hello/servlet/TestServlet.class
    • libs
      • jakarta.servlet-api-6.0.0.jar
  • index.html

 

jar 파일은 jar 를 포함 할 수 없음

jar 스펙의 한계, WAR를 사용하기엔 WAS 위에서만 실행이 가능함

 

 

내장 톰캣 - 빌드 및 배포 - 대안 FatJar (uber jar)

jar를 포함 할 수 없지만 클래스는 포함 할 수 있음

라이브러리에 사용되는 jar를 풀면 class들이 나오는데, 이 class들을 새로 만드는 jar에 포함해줌

수 많은 class 때문에 뚱뚱한 (fat) jar로 불림

build.gradle

다시 빌드 (Encountered duplicate path 경고는 무시)

FatJar build

jar 실행

jar 실행

SEVERE: A child container failed during start 오류가 났는데 build\libs\tomcat.8080\webapps 경로로 잘 해줘야함

 

동작 확인

FatJar

  • 장점
    • 하나의 jar 파일로 배포 ~ 웹 서버 설치 + 실행까지 단순화 할 수 있음
  • 단점
    • 어떤 라이브러리가 있는지 확인이 어려움
    • 파일명 중복 해결 불가능

 

스프링부트가 해결해 줌

 

 

 

 

 

 

feat. 스프링부트 - 핵심 원리와 활용 (김영한)