![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
모든 개발자는 최신 기술을 사용하고 최신 상태를 유지하는 것을 꿈꿉니다. 사실, 오래되고 쓸모없고 종종 비효율적이며 심지어 사산된 기술을 중심으로 강력한 채용 전략을 구축하는 것은 거의 불가능합니다.
하지만 인생은 복잡하며, 모든 것이 항상 우리의 욕망에 달려 있는 것은 아닙니다.
승진을 제안받고 기술이 수년간 바뀌거나 업데이트되지 않은 프로젝트로 전근될 수도 있습니다. 아니면, 현재 기술 스택이 현재 당신에게 특별히 흥미롭지 않은 꿈의 회사에서 일자리를 얻을 수도 있습니다. 아마도 방금 대학을 졸업하고 첫 직장 경험을 쌓고 싶을 수도 있고, 이전 직장에서 해고되어 재정적 어려움을 피하기 위해 빨리 무언가를 찾아야 할 수도 있습니다.
또 다른 시나리오도 있습니다. 면접 중에 현재 스택으로 작업을 시작하지만 미래에 변경할 수 있는 많은 기회가 있을 것이라고 들었습니다. 아마도 가능할 수도 있지만...
하지만 솔직히 말해서, 이건 다 철학일 뿐입니다. 저도 동의하고, 도전적인 커리어 경로에서 마주칠 수 있는 실제 사례를 분석해 보자고 제안합니다.
JVM 스택을 좋아하는 모든 분들, 특히 Spring Framework를 좋아하는 분들을 위해 이 글을 써보았습니다. 계속 읽어주세요.
그런데, Spring Boot 애플리케이션을 독립적으로 실행할 수 있는데 왜 애플리케이션 서버에 배포해야 할까요? 결국, 그게 Spring Boot의 뛰어난 기능 중 하나잖아요.
따라서 이에 대한 이유는 여러 가지가 있을 수 있습니다.
Java 8은 2014년 3월 18일에 출시되었으며 오늘날까지 우리가 사용하는 획기적인 기능이 추가되었습니다.
예를 들어 설명할 필요는 없겠죠. 몇 가지만 소개해 드리겠습니다.
람다 표현식
스트림 API
선택 수업
java.time 패키지(날짜 및 시간 API)
등등등등
그 이후로 오늘( 2024년 8월 19일 )까지 3개의 LTS 버전이 출시되었습니다.
New Relic에서 실시한 연구 에 따르면 Java 8은 현재 프로젝트의 28.8%에서 여전히 사용되고 있으며, 이는 동의하시겠지만 무시할 수 없는 수준은 아닙니다. 점유율이 매년 점차 감소하고 있지만, 이 기술을 완전히 무시하기에는 너무 이릅니다.
Eclipse GlassFish에 대한 Project Eclipse 웹사이트 에 따르면:
Eclipse GlassFish®는 Jakarta EE 사양을 구현하는 완전한 애플리케이션 서버입니다. GlassFish에는 모든 필수 및 선택 Jakarta EE API의 구현이 포함되어 있으며 모든 Jakarta EE TCK를 통과합니다. GlassFish에는 완전한 관리 콘솔, 클러스터링 지원 및 기타 개발자 및 프로덕션 중심 도구와 기능도 포함되어 있습니다.
안타깝게도 이 웹사이트에서 5.1.0보다 낮은 버전을 다운로드할 수 없지만, 5.1.0보다 낮은 버전을 사용하기로 했기 때문에 Oracle 웹사이트 로 가야 합니다. 여기서 다운로드 섹션에서 이 제품의 이전 버전을 여러 개 찾을 수 있습니다. 하지만 라이선스에 주의하고 샌드박스 외부에서 이 폴더의 어떤 것도 사용하지 마세요.
배포 파일을 컴퓨터의 어딘가에 놓고 bin
폴더로 이동한 후 다음 명령을 실행하세요.
./asadmin start-domain --verbose
잠시 기다렸다가 http://localhost:4848/을 열어보세요. 기본적으로 Admin Console을 사용할 수 있어야 하며 어떤 종류의 자격 증명도 요구하지 않아야 합니다. 왼쪽 패널에서 Applications 탭을 찾을 수 있으며, 클릭하면 애플리케이션을 배포, 배포 취소, 활성화 및 비활성화할 수 있는 메뉴에 액세스할 수 있습니다.
지금으로선 GlassFish에 대한 모든 정보를 알고 이를 이용하여 애플리케이션을 배포해야 합니다.
웹 개발 분야에서 이 인기 있는 프레임워크에 대해 한 번이라도 들어보지 않은 사람을 찾는 건 아마도 매우 어려울 겁니다.
Spring Boot 2는 2021년에 출시되었으며 최소 버전으로 Java 8이 필요한 반면, Spring Boot 3은 최소 버전으로 Java 17이 필요합니다 .
최신 기능, 보안 패치, 일부 최적화를 사용하려면 Java 8을 지원하는 최신 버전을 찾아야 합니다.
그리고 여기 2.7.18이 있습니다. 블로그 에 따르면 2.7.18은 Spring Boot 2.x를 지원하는 최신 버전이 되었고 그에 따라 Java 8과 Java 11도 지원합니다.
5.5년과 121개의 릴리스 이후, 2.7.18은 Spring Boot 2.x에 대한 오픈 소스 지원의 종료를 알립니다. 가능한 한 빨리 Spring Boot 3으로 업그레이드하세요. 아직 업그레이드할 준비가 되지 않았다면 Spring Boot 2.7.x에 대한 상업적 지원이 가능합니다 .
Spring Boot 커뮤니티는 EE 환경에서 Spring Boot 애플리케이션을 실행하는 방법에 대한 권장 사항과 공식 문서를 제공합니다 .
애플리케이션을 빌드하고 실행하기 위한 최소 및 충분한 pom.xml은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>io.github.isharipov</groupId> <artifactId>sb2-to-gf4</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
여기서 두 가지 사항에 주의해야 합니다.
웹 애플리케이션을 배포하고 있다는 사실을 애플리케이션 서버에 명확히 알리기 위해 애플리케이션을 war 파일로 패키징하고 있습니다.
<packaging>war</packaging>
내장된 Tomcat을 제외하고 spring-boot-starter-tomcat 종속성을 추가하고 두 개의 내부 종속성을 제외하고 제공된 범위를 추가합니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency>
이 접근 방식을 사용하면 Tomcat을 포함하고 Spring Boot 런타임에서만 사용할 수 있으므로 애플리케이션 서버와 독립적으로 애플리케이션을 실행할 수 있습니다. 이러한 분리는 중요합니다. Spring은 이 종속성을 결과 아티팩트 내의 lib-provided 라는 별도 폴더에 배치합니다. 이제 결과 아티팩트를 실행하기 위한 최소 세 가지 옵션이 있습니다.
domain-dir/autodeploy
아래의 autodeploy 디렉토리에 보관 파일을 복사하세요.asadmin
API - 배포 명령java -jar
사용하여 실행: spring-boot-maven-plugin 은 두 가지 아티팩트( war
와 war.original
를 생성합니다. 간단한 war
lib-provided
포함하고, original
war 는 포함하지 않습니다.다음 종속성을 제외하면 결과 아티팩트 크기를 줄일 수 있습니다.
<exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion>
애플리케이션 서버에서 Spring Boot 애플리케이션을 실행하려면 기본 애플리케이션 클래스를 두 가지 수정해야 합니다.
일반적으로 간단한 웹 애플리케이션을 설정하려면 main
메서드가 있는 공개 클래스를 만들고 @SpringBootApplication 주석을 추가합니다.
@SpringBootApplication public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
그래서 제가 위에서 언급했듯이, 두 가지 수정안이 있습니다.
@SpringBootApplication public class Application extends SpringBootServletInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { LOGGER.debug("From main"); SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { LOGGER.debug("From configure"); return application.sources(Application.class); } }
마지막으로 배포 설명자를 추가해야 합니다.
따라서 main → src → webapp → WEB-INF 폴더에 다음 파일을 넣어야 합니다 - glassfish-web.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app> <class-loader delegate="false"/> <session-config> <session-manager/> </session-config> <jsp-config/> </glassfish-web-app>
배포 설명자 에 대해 자세히 알아보세요
클래스 로더 위임 에 대해 자세히 알아보세요