You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
task buildJar(type : Jar) {
manifest {
attributes 'Main-Class' : 'hello.embed.EmbedTomcatSpringMain'
}
with jar
}
실행 결과
... % java -jar embed-0.0.1-SNAPSHOT.jar
Error: Unable to initialize main class hello.embed.EmbedTomcatSpringMain
Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/
WebApplicationContext
실행 결과를 보면 기대했던 내장 톰캣 서버가 실행되는 것이 아니라, 오류가 발생하는 것을 확인할 수 있다.
오류 메시지를 잘 읽어보면 스프링 관련 클래스를 찾을 수 없다는 오류이다. 무엇이 문제일까?
JAR를 푼 결과를 보면 스프링 라이브러리나 내장 톰캣 라이브러리가 전혀 보이지 않는다. 따라서 해당 오류가 발생한
것이다.
과거 WAR 푼 결과
jar 파일은 jar파일을 포함할 수 없다.
WAR와 다르게 JAR 파일은 내부에 라이브러리 역할을 하는 JAR 파일을 포함할 수 없다. 포함한다고 해도 인식이 안된다. 이것이 JAR 파일 스펙의 한계이다. 그렇다고 WAR를 사용할 수 도 없다. WAR는 웹 애플리케이션 서버(WAS) 위에서만 실행할 수 있다.
대안으로는 라이브러리 jar 파일을 모두 구해서 MANIFEST 파일에 해당 경로를 적어주면 인식이 되지만 매우 번거롭고, Jar 파일안에 Jar 파일을 포함할 수 없기 때문에 라이브러리 역할을 하는 jar 파일도 항상 함께 가지고 다녀야 한다. 이 방법은 권장하기 않기 때문에 따로 설명하지 않는다.
내장 톰캣5 - 빌드와 배포2
FatJar
대안으로는 fat jar 또는 uber jar 라고 불리는 방법이다.
Jar 안에는 Jar를 포함할 수 없다. 하지만 클래스는 얼마든지 포함할 수 있다.
라이브러리에 사용되는 jar 를 풀면 class 들이 나온다. 이 class 를 뽑아서 새로 만드는 jar 에 포함하는 것이다.
이렇게 하면 수 많은 라이브러리에서 나오는 class 때문에 뚱뚱한(fat) jar 가 탄생한다. 그래서 Fat Jar 라고 부
르는 것이다.
여기에 위치한 이유는 @MySpringBootApplication 에 컴포넌트 스캔이 추가되어 있는데, 컴포넌트 스캔의 기본 동작은 해당 애노테이션이 붙은 클래스의 현재 패키지 부터 그 하위 패키지를 컴포넌트 스캔의 대상으로 사용하기 때문이다 애노테이션이 붙은 hello.MySpringBootMain 클래스의 패키지 위치는 hello 이므로 그 하위의 hello.spring.HelloController 를 컴포넌트 스캔한다.
MySpringApplication.run(설정 정보, args) 이렇게 한줄로 실행하면 된다.
이 기능을 사용하는 개발자는 @MySpringBootApplication 애노테이션과 MySpringApplication.run() 메서드만 기억하면 된다.
이렇게 하면 내장 톰캣 실행, 스프링 컨테이너 생성, 디스패처 서블릿, 컴포넌트 스캔까지 모든 기능이 한번에 편리하게 동작한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
WAR 배포 방식의 단점
웹 애플리케이션을 구동하고 싶으면 웹 애플리케이션 서버를 별도로 설치해야 하는 구조이다.
과거에는 이렇게 웹 애플리케이션 서버와 웹 애플리케이션 빌드 파일(WAR)이 분리되어 있는것이 당연한 구조였다.
그런데 이런 방식은 다음과 같은 단점이 있다.
단점
고민
내장 톰캣1 - 설정
tomcat-embed-core: 톰캣라이브러리, 톰캣을 라이브러리로 포함해서 톰캣 서버를 자바 코드로 실행할 수 있다.buildJar,buildFatJar관련된 부분은 뒤에서 다시 설명한다.내장 톰캣2 - 서블릿
EmbedTomcatServletMain
주의
코드 추가
EmbedTomcatSpringMain
main() 메서드를 실행하면 다음과 같이 동작한다.
코드를 보면 알겠지만, 서블릿 컨테이너 초기화와 거의 같은 코드이다.
다만 시작점이 개발자가 main() 메서드를 직접 실행하는가, 서블릿 컨테이너가 제공하는 초기화 메서드를 통해서 실행하는가의 차이가 있을 뿐이다.
내장 톰캣4 - 빌드와 배포1
META-INF/MANIFEST.MF
Gradle의 도움을 받으면 이 과정을 쉽게 진행할 수 있다. 다음 코드를 참고하자.
build.gradle - buildJar 참고
실행 결과
오류 메시지를 잘 읽어보면 스프링 관련 클래스를 찾을 수 없다는 오류이다. 무엇이 문제일까?
것이다.
과거 WAR 푼 결과


jar 파일은 jar파일을 포함할 수 없다.
내장 톰캣5 - 빌드와 배포2
FatJar
르는 것이다.
build.gradle - buildFatJar 참고
jar 압축 풀기
Fat Jar 정리
Fat Jar의 장점
이전에 살펴보았던 WAR를 외부 서버에 배포하는 방식의 단점을 다시 확인해보자.
WAR 단점과 해결
Fat Jar의 단점
편리한 부트 클래스 만들기
MySpringApplication
@MySpringBootApplication
HelloConfig - 수정
MySpringBootAppMain
스프링 부트
일반적인 스프링 부트 사용법
Beta Was this translation helpful? Give feedback.
All reactions