본문 바로가기
Study/백기선님의 스프링 부트 강의

Day 2. Executable JAR 어떻게 만들고 어떻게 동작하는가

반응형

백기선님의 스프링 부트 2.0 유튜브 강의를 보고 정리한 내용입니다
스프링 부트 2.0 Day 2. Executable JAR 어떻게 만들고 어떻게 동작하는가 - 백기선
해당 영상은 spring-boot 공식 reference를 보며 학습하는 내용입니다.


Creating on Executable Jar

  • 실행 가능한 jar 파일 만들기
  • fat JAR
  • jar 파일안에 여러 jar파일들이 들어있고, 실행 가능한 의존성 관련 컴파일된 클래스들이 packaging 되어있다.

Springboot의 fat Jar 만들기

  • Springboot ClassLoader module에는 실행 가능한 jar 파일이나 war 파일을 지원해주는 기능이 들어있다.
  • maven이나 gradle plugin을 이용하면 자동으로 생성 시켜준다.

Nested Jar 파일

  • Jar파일 안에 여러 jar 파일들이 packaging 되어 있는 경우 java(JVM)만으로는 읽어낼 방법이 없다.
  • Springboot에서는 org.springframework.boot.loader.jar.JarFile, 자체 loader를 통해
    Nested Jar 파일들을 읽어온다.
  • 처음 로딩될때 Fat Jar 파일의 각 클래스를 물리적인 주소로 나눠서 offset을 기록해두고, load가 될때 해당 주소의 컴파일된 클래스를 불러온다

Launching Executable Jar file

  • org.springframework.boot.loader.Launcher( Jar or War )
    Executable Jar 파일을 실행시키는 main class
  • @SpringbootApplication 어노테이션이 붙은 클래스를 찾아 main method를 실행시킨다.

Build System

  1. dependency, 의존성 관리를 지원하는 Build System을 사용하길 강력히 권장한다고 한다
  2. Maven 중앙 저장소에 공개된 아티팩트(jar파일)를 가져와 사용할 수 있는 시스템, Maven, Gradle중 하나를 선택해서 사용하길 권장한다
    • 그외의 시스템도 사용 가능하나, 특별히 지원하진 않는다. ( 권장하지 않음 )

Dependency Management

  • SpringBoot가 관리하는 의존성 목록을 지원한다
  • parent version은 명시해야하나, 이외의 version은 custom을 할 경우가 아니면 명시할 필요가 없다

spring-boot-starter-parent

  • Maven 시스템을 사용하는 어플리케이션은, spring-boot-starter-parent을 상속받아서 사용할 수 있는데 센스있는 default값들을 사용할 수 있다
  • Java version, encoding, dependencyManaging, resource filtering, plugin, profile등을 설정해주며, 필요하면 해당 설정을 override해서 custom할 수 있다

부가 설명

  • Springboot는 slf4j Facade를 앞에 두고 logback, log4j, log4j2등을 사용한다

  • 그러나 다른 ClassLoader를 사용하는 java.util.Logging(시스템 클래스 로더)을 쓰면 안된다

  • 스냅샷, M 버전, RC 버전의 차이

    1. 스냅샷: 데일리 빌드 수준 ( 개발 버전 )
    2. M 버전: 적당한 개발 버전 (마일스톤 버전)
      • 스냅샷과 M 버전에 추가된 Class나 interface는 바뀔 가능성이 있다
    3. RC 버전: 마일스톤 버전을 한번 더 정리한 버전 ( Release Candidate )
    4. GA 버전: 메이븐 저장소에 올라가는 최종 릴리즈 버전
  • resource filtering( spring-boot-starter-parent )

    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/application*.yml</include>
          <include>**/application*.yaml</include>
          <include>**/application*.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <excludes>
          <exclude>**/application*.yml</exclude>
          <exclude>**/application*.yaml</exclude>
          <exclude>**/application*.properties</exclude>
        </excludes>
      </resource>
    </resources>
  • ClassPath내 yml, yaml, properties 파일들을 자동으로 읽는다.

728x90
반응형