paint-brush
백 투 더 퓨처: Java 8을 사용하여 GlassFish 4에서 Spring Boot 2 실행~에 의해@isharipov
345 판독값
345 판독값

백 투 더 퓨처: Java 8을 사용하여 GlassFish 4에서 Spring Boot 2 실행

~에 의해 ILia Sharipov8m2024/08/26
Read on Terminal Reader

너무 오래; 읽다

모든 개발자는 최신 기술을 사용하고 최신 상태를 유지하는 것을 꿈꿉니다. 사실, 오래되고 쓸모없고 종종 비효율적인 기술을 중심으로 강력한 채용 전략을 구축하는 것은 거의 불가능합니다. Spring Boot는 독립적으로 실행할 수 있을 때 애플리케이션 서버에 애플리케이션을 배포하는 데 사용할 수 있습니다. Java 8은 현재 프로젝트의 28%에서 여전히 사용됩니다.
featured image - 백 투 더 퓨처: Java 8을 사용하여 GlassFish 4에서 Spring Boot 2 실행
ILia Sharipov HackerNoon profile picture
0-item

거부, 분노, 협상, 우울증…

모든 개발자는 최신 기술을 사용하고 최신 상태를 유지하는 것을 꿈꿉니다. 사실, 오래되고 쓸모없고 종종 비효율적이며 심지어 사산된 기술을 중심으로 강력한 채용 전략을 구축하는 것은 거의 불가능합니다.


하지만 인생은 복잡하며, 모든 것이 항상 우리의 욕망에 달려 있는 것은 아닙니다.


승진을 제안받고 기술이 수년간 바뀌거나 업데이트되지 않은 프로젝트로 전근될 수도 있습니다. 아니면, 현재 기술 스택이 현재 당신에게 특별히 흥미롭지 않은 꿈의 회사에서 일자리를 얻을 수도 있습니다. 아마도 방금 대학을 졸업하고 첫 직장 경험을 쌓고 싶을 수도 있고, 이전 직장에서 해고되어 재정적 어려움을 피하기 위해 빨리 무언가를 찾아야 할 수도 있습니다.


또 다른 시나리오도 있습니다. 면접 중에 현재 스택으로 작업을 시작하지만 미래에 변경할 수 있는 많은 기회가 있을 것이라고 들었습니다. 아마도 가능할 수도 있지만...


수락…

하지만 솔직히 말해서, 이건 다 철학일 뿐입니다. 저도 동의하고, 도전적인 커리어 경로에서 마주칠 수 있는 실제 사례를 분석해 보자고 제안합니다.


JVM 스택을 좋아하는 모든 분들, 특히 Spring Framework를 좋아하는 분들을 위해 이 글을 써보았습니다. 계속 읽어주세요.


그런데, Spring Boot 애플리케이션을 독립적으로 실행할 수 있는데 왜 애플리케이션 서버에 배포해야 할까요? 결국, 그게 Spring Boot의 뛰어난 기능 중 하나잖아요.


따라서 이에 대한 이유는 여러 가지가 있을 수 있습니다.

  1. GlassFish 또는 다른 EE 애플리케이션 서버에서 애플리케이션을 배포하기 위한 인프라가 이미 설정되어 있을 수 있습니다. 이 경우 EE 애플리케이션 서버가 설치, 구성 및 완벽하게 지원됩니다. Spring Boot에서와 같이 애플리케이션이 독립적으로 실행될 수 있더라도 배포 및 런타임을 위한 인프라를 준비하고 유지 관리해야 합니다.
  2. 시간이 지나면 애플리케이션 서버를 포기하고 현재 환경에서 사용할 수 있는 기술을 미리 사용하기 시작할 것이라는 사실을 알고 계십니까?
  3. 팀의 다양한 경험과 전문성
  4. 실험 및 가설 검증

자바 8

Java 8은 2014년 3월 18일에 출시되었으며 오늘날까지 우리가 사용하는 획기적인 기능이 추가되었습니다.

예를 들어 설명할 필요는 없겠죠. 몇 가지만 소개해 드리겠습니다.

  • 람다 표현식

  • 스트림 API

  • 선택 수업

  • java.time 패키지(날짜 및 시간 API)

  • 등등등등


그 이후로 오늘( 2024년 8월 19일 )까지 3개의 LTS 버전이 출시되었습니다.

  • Java SE 11(55) - 2018년 9월 25일
  • Java SE 17(61) - 2021년 9월 14일
  • Java SE 21(65) - 2023년 9월 19일


New Relic에서 실시한 연구 에 따르면 Java 8은 현재 프로젝트의 28.8%에서 여전히 사용되고 있으며, 이는 동의하시겠지만 무시할 수 없는 수준은 아닙니다. 점유율이 매년 점차 감소하고 있지만, 이 기술을 완전히 무시하기에는 너무 이릅니다.

https://newrelic.com/resources/report/2024-state-of-the-java-ecosystem

글래스피쉬 4.1.2

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에 대한 모든 정보를 알고 이를 이용하여 애플리케이션을 배포해야 합니다.

스프링 부트 2

웹 개발 분야에서 이 인기 있는 프레임워크에 대해 한 번이라도 들어보지 않은 사람을 찾는 건 아마도 매우 어려울 겁니다.

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에 대한 상업적 지원이 가능합니다 .

함께 사용하기 시작하다

필수 조건:

  • 자바 8
  • 글래스피쉬 4.1.2
  • 스프링 부트 2.7.18
  • 메이븐


Spring Boot 커뮤니티는 EE 환경에서 Spring Boot 애플리케이션을 실행하는 방법에 대한 권장 사항과 공식 문서를 제공합니다 .

pom.xml

애플리케이션을 빌드하고 실행하기 위한 최소 및 충분한 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>


여기서 두 가지 사항에 주의해야 합니다.

  1. 웹 애플리케이션을 배포하고 있다는 사실을 애플리케이션 서버에 명확히 알리기 위해 애플리케이션을 war 파일로 패키징하고 있습니다.


     <packaging>war</packaging>


  1. 내장된 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 라는 별도 폴더에 배치합니다. 이제 결과 아티팩트를 실행하기 위한 최소 세 가지 옵션이 있습니다.


  • GlassFish에 배포 - 기본적으로 애플리케이션을 배포하는 방법은 세 가지가 있습니다 .
    • GlassFish 관리자 GUI
    • domain-dir/autodeploy 아래의 autodeploy 디렉토리에 보관 파일을 복사하세요.
    • asadmin API - 배포 명령
  • java -jar 사용하여 실행: spring-boot-maven-plugin 은 두 가지 아티팩트( warwar.original 를 생성합니다. 간단한 war lib-provided 포함하고, original war 는 포함하지 않습니다.
  • 좋아하는 IDE에서 애플리케이션을 시작합니다. IntelliJ IDEA Community Edition의 경우 실행/디버그 구성 아래에 다음 옵션을 추가해야 합니다.

다음 종속성을 제외하면 결과 아티팩트 크기를 줄일 수 있습니다.


 <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); } }


그래서 제가 위에서 언급했듯이, 두 가지 수정안이 있습니다.


  1. SpringBootServletInitializer 에서 Application 클래스를 상속합니다.
  2. 보호된 SpringApplicationBuilder configure(SpringApplicationBuilder builder) 메서드를 재정의합니다.


 @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>


배포 설명자 에 대해 자세히 알아보세요

클래스 로더 위임 에 대해 자세히 알아보세요

마무리하기

  1. 오래된 기술을 사용하는 것을 두려워하지 마십시오
  2. 호기심을 갖고 계속해서 기술을 개발하세요
  3. 행운을 빌어요



깃허브

링크드인