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

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

EnoughTT 2023. 8. 17. 17:04

편리한 부트 클래스 만들기

부트 : 시작을 편하게 처리해주는 것

 

hello.boot.MySpringApplication

 

어노테이션 만들기

hello.boot.MySpringBootApplication

만든 어노테이션으로 컴포넌트를 스캔 하기 때문에 HelloConfig에 어노테이션은 주석 처리

 

프로젝트를 실행 시키는 main클래스 생성 (많이 본 형태임)

hello.MySpringBootMain
실행

  • 패키지 위치가 중요 (hello)
  • 만든 어노테이션에 컴포넌트 스캔이 추가되어 해당 어노테이션이 붙은 클래스의 현재 패키지부터 하위 패키지까지 스캔 대상으로 사용
  • MySpringApplication.run(설정 정보, args) 실행하면 됨
  • @MySpringBootApplication 어노테이션과 MySpringApplication.run() 메서드만 기억하면 됨
  • 내장 톰캣, 스프링 컨테이너 생성, 디스패처 서블릿, 컴포넌트 스캔까지 한번에 동작함

 

스프링 부트 프로젝트 생성

스프링부트 스타터 링크

 

강의 들으면서 하기에 3.xx 사용

스프링부트스타터 사이트

 

build.gradle

라이브러리에 버전이 없는데 스프링부트가 관리해줌

build.gradle

 

동작 확인

스프링부트 시작

 

Whitelabel Error Page 가 나오면 정상 동작

Whitelabel Error Page

 

톰캣도 내장 되어있는지 확인

 

스프링 부트 실행 과정

  • 스프링 컨테이너 생성
  • WAS (내장 톰캣) 생성

 

스프링 컨테이너 생성

  • main() 메서드 SpringApplication.run() 을 호출
    • 메인 설정 정보를 넘겨줌, @SpringBootApplication 어노테이션이 있는 현재 클래스를 지정해 줌
      • @SpringBootApplication 어노테이션 안에는 컴포넌트 스캔을 포함한 여러 기능이 설정되어 있음
      • 현재 패키지와 하위 패키지 모두 스캔
  • 스프링 컨테이너 생성
    • org.springframework.boot.web.servlet.context.ServletWebServerApplicationContextFact 
      ory

  • new AnnotationConfigServletWebServerApplicationContext()
    • 스프링 컨테이너 생성

 

내장 톰캣 생성

org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory

  • Tomcat tomcat = new Tomcat() 으로 톰캣 생성

 

 

빌드와 배포

jar 빌드

gradlew clean build

 

jar 생성

 

jar 실행

java -jar boot-0.0.1-SNAPSHOT.jar

 

jar 압축 풀기
jar -xvf boot-0.0.1-SNAPSHOT.jar

  • META-INF
    • MANIFEST.MF
  • org/springframework/boot/loader
    • JarLauncher.class : 스프링 부트 main() 실행클래스
  • BOOT-INF
    • classes
    • lib 외부 라이브러리

jar 압축을 푼 결과를 보면 FatJar 가 아닌  jar 가 포함되어 있는 새로운 구조

 

 

스프링 부트 실행 가능 jar

다시 FatJar 단점

  • 어떤 라이브러리가 있는지 확인 불가능
  • 파일명 중복 해결 X

 

실행 가능 jar

위 단점을 해결하기 위해 jar 내부에 jar 를 포함할 수 있는 구조로 jar 를 만들고 실행할 수 있게 함

이것을 실행 가능 jar (Executable Jar) 라고 함

어떤 라이브러리가 있는지 확인이 가능하고, 파일명 중복을 해결할 수 있음 (jar 는 스프링 부트에서 새롭게 정의한 것)

 

 

실행 가능 Jar 내부 구조

  • jar 실행 시 META-INF/MANIFEST.MF 파일을 찾음
    • Main-Class 를 읽어 main() 을 실행 함 (Main-Class: org.springframework.boot.loader.JarLaunche 의 main()) 실행)
    • JarLauncher 는 스프링 부트가 빌드 시 넣어줌
      • jar 내부에 jar 와 클래스 정보를 읽어옴
    • Start-Class: 에 지정된 main() 을 호출함 (Start-Class: hello.boot.BootApplication 의 main())
  • BOOT-INF
    • 개발한 class 파일들과 리소스파일, 외부 라이브러리 관련 정보들이 있음
    • JarLauncher 를 통해서 여기에 있는 classes 와 lib 에있는 jar 파일들을 읽어들임

 

실행 과정

  • java -jar ***.jar 실행
  • MANIFEST.MF 인식
  • JarLauncher.main() dlstlr
    • BOOT-INF/classes
    • BOOT-INF/lib/ 
  • BootApplication.main() 실행

 

 

 

 

 

 

 

 

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