[Spring Boot] 스프링 부트와 내장 톰캣

Jimin Lim·2023년 6월 26일
0

Spring

목록 보기
6/18
post-thumbnail
post-custom-banner

✅ Fat jar

jar 파일은 jar를 포함할 수 없다. 따라서 라이브러리에 들어있는 jar를 풀어 나오는 class를 새롭게 jar로 만들도록 한다. (= fat jar)

//Fat Jar 생성
task buildFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'hello.embed.EmbedTomcatSpringMain'
    }
    duplicatesStrategy = DuplicatesStrategy.WARN
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

위와 같이 라이브러리 클래스를 다 가져와 jar 파일로 만든다. 하지만 war의 외장 톰캣에 비해 장점이 존재하지만, 단점도 존재한다.

  1. 어떤 라이브러리가 포함되어 있는지 확인이 힘들다.
  2. 파일명 중복을 해결할 수 없다. -> 중복되는 파일 둘 중 하나는 포함되지 않아 정상 동작하지 않게 된다.

✅ 스프링 부트의 실행 과정

@SpringBootApplication
public class BootApplication {

	public static void main(String[] args) {
		SpringApplication.run(BootApplication.class, args);
	}

}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
  • @SpringBootApplication 어노테이션 내에서는 componentScan이 존재해, 해당 클래스가 존재하는 패키지 하위가 컴포넌트 스캔 대상이 되도록 한다.
  • (1) 스프링 컨테이너를 생성하고, (2) 내장 톰캣(WAS)를 생성하는 과정을 거친다.

✅ 스프링 부트 실행 가능 Jar

./gradlew clean build 로 jar 파일을 만든 후, jar -xvf boot-0.0.1-SNAPSHOT jar 파일을 열어보면 아래와 같은 구조를 가진다. (모두 class로 가지는 fat jar와는 다르다)

자바 표준이 아닌 스프링부트에서 정의한 Executable Jar 는 (1)어떤 라이브러리가 포함되어 있는지 쉽게 확인할 수 있고, (2) 폴더 구조이므로 파일명 중복을 해결하게 해준다.

🔗 구조

MANIFEST.MF 에서 실행 정보를 받아온다.

  • JarLauncher: Main class이며 이를 통해 jar내의 jar를 읽어들이도록 한다. 클래스, 라이브러리를 인식한 후 Start-Class를 호출한다.
  • Spring-Boot-Version : 스프링 부트 버전
  • Spring-Boot-Classes : 개발한 클래스 경로
  • Spring-Boot-Lib : 라이브러리 경로
  • Spring-Boot-Classpath-Index : 외부 라이브러리 모음
  • Spring-Boot-Layers-Index : 스프링 부트 구조 정보
profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️
post-custom-banner

0개의 댓글