마이그레이션 가이드

Red Hat JBoss Enterprise Application Platform 8.0

Red Hat JBoss Enterprise Application Platform 주요 버전으로 업그레이드하는 방법

Red Hat Customer Content Services

초록

이 가이드에서는 이전 버전의 Red Hat JBoss Enterprise Application Platform에서 마이그레이션하는 방법에 대한 정보를 제공합니다.

JBoss EAP 문서에 대한 피드백 제공

오류를 보고하거나 문서를 개선하기 위해 Red Hat Jira 계정에 로그인하여 문제를 제출하십시오. Red Hat Jira 계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.

프로세스

  1. 티켓을 생성하려면 다음 링크를 클릭하십시오.
  2. 요약 에 문제에 대한 간략한 설명을 입력합니다.
  3. 설명에서 문제 또는 개선 사항에 대한 자세한 설명을 제공합니다. 문서에서 문제가 발생한 위치에 URL을 포함합니다.
  4. Submit 을 클릭하고 문제를 적절한 문서 팀으로 라우팅합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. Red Hat JBoss Enterprise Application Platform 마이그레이션 개요

시스템 관리자는 Red Hat JBoss Enterprise Application Platform 7에서 Red Hat JBoss Enterprise Application Platform 8.0으로 업그레이드할 수 있습니다. 이 가이드에서는 릴리스에서 사용 가능한 새로운 기능, 더 이상 사용되지 않으며 지원되지 않는 기능, 일관된 동작을 유지하기 위해 필요한 애플리케이션 및 서버 구성 업데이트에 대해 설명합니다.

또한 Java 애플리케이션 마이그레이션을 간소화하는 Migration Toolkit for Runtimes 와 서버 구성을 업데이트하는 JBoss Server Migration Tool 과 같은 마이그레이션에 도움이 되는 툴에 대한 정보도 제공합니다.

JBoss EAP 8.0을 성공적으로 배포하고 실행한 후 개별 구성 요소를 업그레이드하여 JBoss EAP 8.0의 새로운 기능과 기능을 사용할 수 있습니다.

참고

이전 릴리스의 JBoss EAP에서 마이그레이션하려면 먼저 JBoss EAP 7.4로 마이그레이션해야 합니다. 자세한 내용은 JBoss EAP 7.4 마이그레이션 가이드를 참조하십시오.

1.1. 마이그레이션 및 업그레이드 이해

이 섹션에서는 주요 업그레이드, 마이너 업데이트, 누적 패치 등 JBoss EAP 업그레이드 및 패치 패치에 대한 설명 및 지침을 설명합니다.

1.1.1. JBoss EAP의 주요 업그레이드

애플리케이션을 JBoss EAP 7에서 JBoss EAP 8.0으로 같은 주요 릴리스에서 다른 주요 릴리스로 이동할 때 주요 업그레이드 또는 마이그레이션이 필요합니다. 자카르타 EE 8 사양을 준수하거나 독점 코드를 포함하거나 더 이상 사용되지 않는 API를 사용하는 애플리케이션에는 JBoss EAP 8.0에서 실행하기 위해 애플리케이션 코드를 수정해야 할 수 있습니다. 자카르타 EE 10의 도입에는 JBoss EAP 8.0과의 호환성을 위해 자카르타 EE 애플리케이션 코드를 조정해야 하는 Java 패키지 이름 및 기타 측면을 변경해야 합니다. 또한 JBoss EAP 8.0에서 서버 구성이 변경되었으며 마이그레이션이 필요합니다. 이 유형의 마이그레이션은 이 가이드에서 다룹니다.

1.1.2. JBoss EAP의 마이너 업데이트

JBoss EAP의 마이너 업데이트는 버그 수정, 보안 수정 및 새로운 기능을 제공하는 포인트 릴리스입니다. 각 릴리스의 변경 사항은 Red Hat JBoss Enterprise Application Platform 8.0의 릴리스 노트에 설명되어 있습니다.

JBoss Server Migration Tool을 사용하여 한 시점에서 다른 지점으로 자동으로 업그레이드하십시오(예: JBoss EAP 7.0에서 JBoss EAP 7.1으로 자동 업그레이드). 자세한 내용은 JBoss Server 마이그레이션 툴 사용을 참조하십시오.

1.1.3. JBoss EAP의 누적 패치

JBoss EAP는 버그 및 보안 수정 사항이 포함된 누적 패치를 주기적으로 제공합니다. 누적 패치는 마지막 숫자가 릴리스(예: 버전 7.1.0에서 7.1.1)로 업그레이드합니다.

1.2. < EAP_HOME> 변수 사용

이 문서에서 &lt ;EAP_HOME& gt; 변수는 JBoss EAP 설치 경로를 나타냅니다. 이 변수를 JBoss EAP 설치의 실제 경로로 바꿉니다.

참고

<EAP_HOME >은 환경 변수가 아닙니다. 스크립트에서 JBOSS_HOME 환경 변수를 사용합니다.

JBoss EAP를 설치하도록 선택한 설치 옵션에 따라 다음과 같이 설치 디렉토리 또는 기본 경로를 찾을 수 있습니다.

  • 아카이브 설치 방법을 사용하여 JBoss EAP를 설치한 경우 설치 디렉터리는 아카이브를 추출한 jboss-eap-8.0 디렉터리입니다.
  • RPM 설치 방법을 사용하여 JBoss EAP를 설치한 경우 설치 디렉터리는 /opt/rh/eap8/root/usr/share/wildfly/ 입니다.
  • 설치 프로그램 애플리케이션을 사용하여 JBoss EAP를 설치한 경우 < EAP_HOME >의 기본 경로는 ${user.home}/EAP-8.0.0:입니다.

    • Red Hat Enterprise Linux 및 Oracle Solaris의 경우: /home/USER_NAME/EAP-8.0.0/
    • Microsoft Windows의 경우: C:\Users\USER_NAME\EAP-8.0.0\
  • Red Hat CodeReady Studio 설치 프로그램 애플리케이션을 사용하여 JBoss EAP 서버를 설치하고 구성한 경우 < EAP_HOME >의 기본 경로는 ${user.home}/devstudio/runtimes/jboss-eap:입니다.

    • Red Hat Enterprise Linux의 경우: /home/USER_NAME/devstudio/runtimes/jboss-eap/
    • Microsoft Windows의 경우: C:\Users\USER_NAME\devstudio\runtimes\jboss-eap 또는 C:\Documents 및 Settings\USER_NAME\devstudio\runtimes\jboss-eap\
참고

Red Hat CodeReady Studio에서 Target 런타임8.0 또는 최신 런타임 버전으로 설정하는 경우 프로젝트는 자카르타 EE 10 사양과 호환됩니다.

2장. JBoss EAP 8.0으로 마이그레이션 준비

시스템 관리자는 JBoss EAP 8.0으로의 마이그레이션을 계획해야 합니다. 이 업그레이드는 성능 향상, 보안 강화 및 Java 애플리케이션의 안정성 향상에 필수적입니다.

JBoss EAP 8.0은 JBoss EAP 7 애플리케이션에 대한 이전 버전과의 호환성을 제공합니다. 그러나 애플리케이션에서 JBoss EAP 8.0이 더 이상 사용되지 않거나 제거된 기능을 사용하는 경우 애플리케이션 코드를 수정해야 할 수 있습니다.

JBoss EAP 8.0 릴리스에는 애플리케이션 배포에 영향을 줄 수 있는 몇 가지 변경 사항이 추가되었습니다. 마이그레이션을 성공적으로 수행하려면 애플리케이션을 마이그레이션하기 전에 조사 및 계획을 수행합니다.

마이그레이션 프로세스를 시작하기 전에 다음 초기 단계를 따르십시오.

기능 변경, 개발 자료 및 마이그레이션을 지원할 수 있는 툴, 애플리케이션 및 서버 구성을 평가하여 JBoss EAP 8.0에서 실행하는 데 필요한 변경 사항을 확인합니다.

2.1. 자카르타 EE 10 기능 검토

Jakarta EE 10에서는 프라이빗 및 퍼블릭 클라우드에서 기능이 풍부한 애플리케이션의 개발 및 배포를 단순화하는 다양한 개선 사항을 도입했습니다. 이는 HTML5, WebSocket, JSON, Batch, Concurrency Cryostat와 같은 새로운 기능과 최신 표준을 통합합니다. 업데이트에는 Jakarta Persistence 3.1, Jakarta RESTful Web Services 3.1, Jakarta Servlet 6.0, Jakarta Expression Language 5.0, Java Message Service 3.1가 포함되어 있습니다. Jakarta Server Cryostats 4.0, Jakarta Enterprise Cryostats 4.0, Contexts 및 dependency Cryostat 2.0, Jakarta Cryostat Validation 3.0.

추가 리소스

2.2. JBoss EAP 8.0의 기능 검토

JBoss EAP 8.0에는 이전 릴리스보다 업그레이드 및 개선 사항이 포함되어 있습니다. JBoss EAP 8.0에 도입된 새로운 기능의 전체 목록은 Red Hat Customer Portal의 Red Hat JBoss Enterprise Application Platform 8.0 릴리스 노트 의 새로운 기능 및 개선 사항을 참조하십시오.

애플리케이션을 JBoss EAP 8.0으로 마이그레이션하기 전에 이전 릴리스의 일부 기능은 더 이상 지원되지 않거나 유지 관리 비용, 낮은 커뮤니티 관심 또는 더 나은 대안의 가용성으로 인해 더 이상 지원되지 않을 수 있습니다. JBoss EAP 8.0에서 더 이상 사용되지 않고 지원되지 않는 기능의 전체 목록은 Red Hat 고객 포털의 Red Hat JBoss Enterprise Application Platform 8.0 릴리스 노트 에서 지원되지 않거나 더 이상 사용되지 않으며 삭제된 기능을 참조하십시오.

2.3. JBoss EAP 시작하기 자료 검토

이 섹션에서는 JBoss EAP 시작하기 자료의 주요 구성 요소에 대해 설명하고 JBoss EAP를 시작하는 데 도움이 되는 필수 정보에 대한 간략한 개요를 제공합니다.

다음에 대한 자세한 내용은 JBoss EAP 시작하기 가이드를 검토하십시오.

  • JBoss EAP 8.0 다운로드 및 설치하여 환경을 효과적으로 설정합니다.
  • JBoss Tools를 다운로드하여 설치하여 개발 환경을 개선하십시오.
중요

JBoss Tools는 커뮤니티 프로젝트이며 Red Hat에서 지원하지 않습니다. JBoss Tools 인스턴스 설정 및 실행에 대한 지원은 커뮤니티 웹 사이트를 참조하십시오. JBoss Tools를 다운로드하려면 JBoss Tools 다운로드를 참조하십시오.

  • 개발 환경에 맞게 Maven 구성 및 프로젝트 종속성 관리.
  • 제품과 함께 제공되는 빠른 시작 예제 애플리케이션을 다운로드하여 실행합니다.

2.4. 데이터 백업 및 서버 상태 검토

이 섹션에서는 애플리케이션을 마이그레이션하기 전에 데이터를 백업하고 서버 상태를 검토하며 잠재적인 문제를 처리해야 할 필요성을 강조합니다. 배포를 보호하고, 개방형 트랜잭션을 관리하고, 타이머 데이터를 평가함으로써 원활한 마이그레이션을 보장할 수 있습니다.

마이그레이션을 시작하기 전에 다음과 같은 잠재적인 문제를 고려하십시오.

  • 마이그레이션 프로세스에서 임시 폴더를 제거할 수 있습니다. 마이그레이션하기 전에 data/content/ 디렉터리 내의 배포를 백업해야 합니다. 나중에 완료 후 데이터를 복원하여 누락된 콘텐츠로 인한 서버 실패를 방지합니다.
  • 마이그레이션 전에 열려 있는 트랜잭션을 처리하고 data/tx-object-store/ 트랜잭션 디렉터리를 삭제합니다.
  • 마이그레이션을 진행하기 전에 data/timer-service-data 에서 영구 타이머 데이터를 검토하여 업그레이드 후 애플리케이션을 확인합니다. 업그레이드하기 전에 해당 디렉터리에서 deployment-* 파일을 확인하여 아직 사용 중인 타이머를 확인합니다.

마이그레이션을 시작하기 전에 현재 서버 구성 및 애플리케이션을 백업해야 합니다.

2.5. RPM 설치로 JBoss EAP 마이그레이션

이 가이드의 마이그레이션 지침은 JBoss EAP의 RPM 설치 마이그레이션에도 적용되지만 아카이브 또는 jboss-eap-installation-manager 설치에 비해 RPM 설치에 맞게 JBoss EAP를 시작하는 방법과 같은 몇 가지 단계를 변경해야 할 수 있습니다.

중요

단일 Red Hat Enterprise Linux 서버에 두 개 이상의 RPM 설치 JBoss EAP 인스턴스가 있는 것은 지원되지 않습니다. 따라서 JBoss EAP 8.0으로 마이그레이션할 때 JBoss EAP 설치를 새 시스템으로 마이그레이션하는 것이 좋습니다.

2.6. JBoss EAP를 서비스로 마이그레이션

JBoss EAP 7을 서비스로 실행하는 경우 Red Hat JBoss Enterprise Application Platform 설치 방법에서 JBoss EAP 8.0에 대한 업데이트된 구성 지침을 검토하십시오.

2.7. 클러스터 마이그레이션

JBoss EAP 클러스터를 실행하는 경우 JBoss EAP 7.4 Patching 및 Upgrading Guide 의 클러스터 업그레이드 섹션의 지침을 따르십시오.

3장. 효과적인 툴을 사용하여 JBoss EAP 8.0 마이그레이션 간소화

시스템 관리자는 두 가지 필수 툴을 사용하여 JBoss EAP 8.0으로 마이그레이션 프로세스를 단순화할 수 있습니다. MTR(Migration Toolkit for Runtimes)은 애플리케이션을 분석하고 자세한 마이그레이션 보고서를 제공하는 반면, JBoss Server 마이그레이션 도구는 서버 구성을 업데이트하여 새로운 기능 및 설정을 포함합니다.

3.1. 마이그레이션 전 애플리케이션 분석

MOTR(Migration Toolkit for Runtimes)을 사용하여 JBoss EAP 6.4 및 7 애플리케이션의 코드 및 아키텍처를 JBoss EAP 8.0으로 마이그레이션하기 전에 분석할 수 있습니다. JBoss EAP 8.0으로 마이그레이션하기 위한 MTR 규칙 세트는 JBoss EAP 8.0으로 마이그레이션할 때 XML 설명자, 특정 애플리케이션 코드 및 매개 변수에 대한 보고서를 대체 구성으로 교체해야 합니다.

MTR은 Java 애플리케이션 마이그레이션을 단순화하는 데 도움이 되는 확장 가능하고 사용자 지정 가능한 규칙 기반 툴 세트입니다. MTR은 마이그레이션하려는 애플리케이션에서 사용하는 API, 기술 및 아키텍처를 분석하여 각 애플리케이션에 대한 자세한 마이그레이션 보고서를 제공합니다. 이러한 보고서는 다음 정보를 제공합니다.

  • 필요한 마이그레이션 변경에 대한 자세한 설명
  • 보고된 변경이 필수 또는 선택 사항인지 여부
  • 보고된 변경이 복잡하거나 간단한지 여부
  • 마이그레이션 변경이 필요한 코드 링크
  • 필요한 변경을 수행하는 방법에 대한 정보 팁 및 링크
  • 각 마이그레이션 문제에 대한 작업 수준 예상과 애플리케이션을 마이그레이션하기 위한 총 예상 노력

3.2. 서버 구성 마이그레이션 간소화

JBoss Server 마이그레이션 도구는 기존 구성을 유지하면서 JBoss EAP 8.0에 새로운 기능 및 설정을 포함하도록 서버 구성을 업데이트하는 기본 방법입니다. JBoss Server 마이그레이션 도구는 기존 JBoss EAP 서버 구성 파일을 읽고 새 하위 시스템에 대한 구성을 추가하고, 기존 하위 시스템 구성을 새 기능으로 업데이트하고, 더 이상 사용되지 않는 하위 시스템 구성을 제거합니다.

JBoss Server 마이그레이션 도구를 사용하여 독립 실행형 서버를 마이그레이션하고 도메인을 관리할 수 있습니다.

3.2.1. JBoss EAP 8.0으로 마이그레이션

JBoss Server 마이그레이션 도구는 JBoss EAP 버전 7의 모든 릴리스에서 JBoss EAP 8.0으로의 마이그레이션을 지원합니다.

참고

JBoss EAP 6.4에서 마이그레이션하려면 먼저 JBoss EAP 7.4의 최신 누적 패치(CP) 버전으로 마이그레이션해야 합니다. 자세한 내용은 JBoss EAP 7.4 마이그레이션 가이드를 참조하십시오. 그 후 JBoss EAP 7.4 CP 버전에서 JBoss EAP 8.0으로 마이그레이션할 수 있습니다.

사전 요구 사항

  • JBoss EAP가 실행되고 있지 않습니다.

프로세스

  1. JBoss EAP 다운로드 페이지에서 툴을 다운로드합니다.
  2. 다운로드한 아카이브를 추출합니다.

    $ unzip <NAME_OF_THE_FILE>
  3. MIGRATION_TOOL_HOME/bin 디렉터리로 이동합니다.
  4. jboss-server-migration 스크립트를 실행합니다.

    • Red Hat Enterprise Linux의 경우:

      $ ./jboss-server-migration.sh --source EAP_PREVIOUS_HOME --target EAP_NEW_HOME
    • Microsoft Windows의 경우:

      jboss-server-migration.bat --source EAP_PREVIOUS_HOME --target EAP_NEW_HOME
      참고

      EAP_PREVIOUS_HOMEEAP_NEW_HOME 을 JBoss EAP의 이전 및 새 설치에 대한 실제 경로로 교체합니다.

4장. Red Hat JBoss Enterprise Application Platform 애플리케이션 마이그레이션 Jakarta EE 8에서 10으로 마이그레이션

JBoss EAP 8.0은 자카르타 EE 10을 지원합니다. Jakarta EE 10은 JBoss EAP 7에서 지원하는 자카르타 EE 8 사양에 비해 자카르타 EE에 큰 변경을 제공합니다. 이 장에서는 애플리케이션 개발자가 JBoss EAP 7에서 JBoss EAP 8.0으로 애플리케이션을 마이그레이션할 때 인지해야 하는 Jakarta EE API의 호환성에 영향을 미치는 차이점에 대해 설명합니다.

참고

이 장은 Jakarta EE 8과 자카르타 EE 10의 차이점에 중점을 두고 있으며, 애플리케이션 개발자가 애플리케이션을 JBoss EAP 8.0으로 마이그레이션해야 할 수도 있습니다. 마이그레이션 방법은 다루지 않습니다. JBoss EAP 7에서 JBoss EAP 8.0 애플리케이션 마이그레이션 및 이를 지원하기 위해 제공되는 툴에 대한 자세한 내용은 효과적인 툴을 사용하여 JBoss EAP 8.0 마이그레이션을 단순화하고 애플리케이션 마이그레이션 변경 사항 이해 를 참조하십시오.

4.1. Javax에서 jakarta 패키지 네임스페이스로 변경

지금까지 Jakarta EE 8과 EE 10 간의 가장 큰 호환성에 영향을 미치는 차이점은 EE API Java 패키지 javax.* 에서 jakarta.* 로 변경되는 것입니다.

Java EE를 Eclipse Foundation으로 이동하고 Jakarta EE 및 Oracle은 Jakarta EE 커뮤니티에서 javax. 패키지 네임스페이스를 진화할 수 없다고 동의했습니다. 따라서 Jakarta EE 9부터 시작하여 EE API를 계속 발전시키기 위해 모든 EE API에 사용되는 패키지가 javax.* 에서 jakarta.* 로 변경되었습니다. 이 변경 사항은 Java SE의 일부인 javax 패키지에는 영향을 미치지 않습니다.

이 네임스페이스 변경에 대한 조정은 JBoss EAP 7에서 JBoss EAP 8로 애플리케이션을 마이그레이션하는 데 있어 가장 큰 변경 사항입니다. 자카르타 EE 10으로 마이그레이션하는 애플리케이션은 다음이 필요합니다.

  • import 구문 또는 기타 소스 코드에서 javax 패키지에서 EE API 클래스를 사용하는 모든 소스 코드를 jakarta로 업데이트합니다.
  • 대신 jakarta로 시작하는 이름이 있는 EE 지정 시스템 속성 또는 기타 구성 속성의 이름을 업데이트합니다.
  • Java. util.ServiceLoader 메커니즘을 사용하여 부트스트랩되는 추상 클래스의 경우 META-INF/services/jakarta.[rest_of _name] 에서 META-INF/services/jakarta.[rest_of_name]으로 구현 클래스를 식별하는 리소스의 이름을 변경합니다.
참고

Red Hat Migration Toolkit은 애플리케이션 소스 코드에서 네임스페이스를 업데이트하는 데 도움이 될 수 있습니다. 자세한 내용은 How to use Red Hat Migration Toolkit for Auto-Migration of an Application to the Jakarta EE 10 Namespace. 소스 코드 마이그레이션이 옵션이 아닌 경우 오픈 소스 Eclipse Transformer 프로젝트는 기존 Java 아카이브를 javax 네임스페이스에서 jakarta로 변환하기 위해 바이트 코드 변환 도구를 제공합니다.

4.2. 기타 변경 사항

패키지 네임스페이스가 변경되는 것 외에도 이전 EE 버전으로 작성된 애플리케이션은 자카르타 EE 10에 포함된 여러 사양의 변경 사항에 맞게 조정해야 할 수 있습니다. 다음 섹션에서는 이러한 변경 사항에 대해 설명하는데, 이는 대부분 장기 사용 중단된 API 요소가 제거됩니다.

다음 섹션에서는 javax 네임스페이스를 사용하는 제거된 API 요소의 인스턴스에 대해 자카르타 EE 9에서 사용되는 jakarta 네임스페이스에서 동등한 제거가 수행되었습니다. 따라서 javax 네임스페이스를 jakarta 로 교체하도록 애플리케이션을 업데이트한 경우 javax 를 언급하는 항목이 애플리케이션에 적용 가능한 것으로 가정합니다.

4.2.1. Jakarta Contexts and dependency Cryostat Discovery

CDI 4.0 사양 변경 노트에 따라 빈 beans.xml 파일이 있는 배포에서 Contexts 및 dependency Cryostat 또는 CDI 빈을 검색하는 기본 동작이 모두 주석 으로 변경되었습니다. 즉, 이러한 배포에서는 Quarkus 정의 주석이 있는 배포 클래스만 CDI에서 검색됩니다. 빈을 사용하는 모든 애플리케이션 클래스에 이러한 주석이 있는 경우 이 CDI 변경에 영향을 미치지 않습니다. 그러지 않으면 CDI에서 특정 8080을 제공하는 유형을 찾을 수 없는 경우 애플리케이션 배포가 실패할 수 있습니다.

이 변경으로 인해 애플리케이션에 영향을 받는 경우 다음과 같은 몇 가지 옵션이 있습니다.

  • beans.xml 파일을 비워 두지만 필요한 모든 클래스에 Quarkus 정의 주석을 추가합니다.
  • 클래스를 변경하지 않고 변경해도 beans.xml 파일을 다음과 같은 내용이 있는 빈 파일(< beansans-discovery-mode="all"></beans>)으로 변경합니다.
  • 애플리케이션을 변경하지 않고 변경하지 않고 서버의 weld 하위 시스템 구성을 변경하여 빈 beans.xml 파일을 다시 JBoss EAP 7 동작으로 복구합니다. 이 설정은 서버의 모든 배포에 영향을 미칩니다. 예를 들어 CLI를 사용합니다. /subsystem=weld:write-attribute(name=legacy-empty-beans-xml-treatment,value=true)

4.2.2. CDI API 변경 사항

Jakarta Contexts 및 dependency Cryostat 4.0은 더 이상 사용되지 않는 다음과 같은 API 요소를 제거했습니다.

  • javax.enterprise.inject.spi.Bean.isNullable() 메서드가 제거되었습니다. 이 방법은 수년 동안 항상 false 를 반환했기 때문에 호출 호출을 false 로 교체하거나 분기 논리를 제거하고 false 분기의 콘텐츠를 유지할 수 있습니다.
  • javax.enterprise.inject.spi.BeanManager.createInjectionTarget(AnnotatedType) 방법이 제거되었습니다. 이 메서드 호출을 Cryostat Manager.getInjectionTargetFactory(AnnotatedType) 로 교체하고 반환된 팩토리를 사용하여 주입 대상을 생성합니다. 자세한 내용은 Jakarta Contexts and dependency injection specification의 클래스에 대한 Obtaining an CryostatTarget 을 참조하십시오.
  • javax.enterprise.inject.spi.BeanManager.fireEvent(Object, Annotation) 방법이 제거되었습니다. Cryo statManager.getEvent() 를 유사한 API의 진입점으로 사용합니다. 자세한 내용은 Jakarta 컨텍스트 및 종속성 주입 사양에서 이벤트 실행을 참조하십시오.
  • javax.enterprise.inject.spi.BeforeBeanDiscovery.addAnnotatedType(AnnotatedType) 방법이 제거되었습니다. 애플리케이션이 이 메서드를 호출하는 경우 BeforeBeanDiscovery.addAnnotatedType(AnnotatedType, (String) null) 에 대한 호출로 교체할 수 있습니다.

4.2.3. Jakarta Enterprise Cryostats

Java SE 14는 java.security.Identity 클래스를 제거했기 때문에 Jakarta Enterprise Cryostats 4.0 API에서 사용이 제거되었습니다.

  • 더 이상 사용되지 않는 javax. Cryostat.EJBContext.getCallerIdentity() 메서드가 제거되었습니다. 대신 java. security.Principal 를 반환하는 migrationContext.getCallerPrincipal() 를 사용할 수 있습니다.
  • 더 이상 사용되지 않는 javax. Cryostat.EJBContext.isCallerInRole(Identity role) 방법이 제거되었습니다. 대신 handler Context.isCallerInRole(String roleName) 을 사용할 수 있습니다.
  • Jakarta XML RPC 사양이 Jakarta EE 10 Full Platform에서 제거되었으므로 javax. Cryostat.SessionContext.getMessageContext() 메서드를 반환한 javax.xml.rpc.rpc.MessageContext 가 제거되었습니다.
  • Jakarta XML RPC 사양은 자카르타 EE 8에서는 선택 사항이며 Red Hat JBoss EAP 7은 이를 지원하지 않습니다. 이 사양을 사용하면 IllegalStateException 이 발생했기 때문에 이 migration API 변경 사항은 JBoss EAP 7에서 실행되는 기존 애플리케이션에 영향을 미치지 않을 것으로 예상됩니다.
  • 더 이상 사용되지 않는 javax. Cryostat.EJBContext.getEnvironment() 메서드가 제거되었습니다. JNDI 이름 지정 컨텍스트 java:comp/env 를 사용하여 엔터프라이즈 빈 환경에 액세스합니다.

4.2.4. Jakarta Expression Language

javax.el.MethodExpression.isParmetersProvided() 메서드가 잘못 입력되었습니다. 대신 MethodExpression.isParametersProvided() 를 사용할 수 있습니다.

4.2.5. Jakarta JSON 바인딩

기본적으로 jakarta.json.bind.annotation.JsonbCreator 주석으로 주석이 달린 유형은 JSON 콘텐츠에서 모든 매개변수를 사용할 수 있을 필요가 없습니다. 구문 분석 중인 JSON이 매개변수 중 하나가 누락된 경우 기본값을 사용합니다. JSON에 모든 매개변수가 있어야 하는 EE 8 동작은 jakarta.json.bind.JsonbConfig().withCreatorParametersRequired(true) 를 호출하여 설정할 수 있습니다.

4.2.6. Jakarta facess

다음의 더 이상 사용되지 않는 기능은 자카르타 eyess 4.0에서 제거되었습니다.

4.2.6.1. Jakarta facess 및 Java Server Pages

Jakarta Server Pages(JSP) 지원은 자카르타 roles 2.0 이상에서 더 이상 사용되지 않습니다. JSP 지원은 자카르타 Cryostat 4.0에서 제거됩니다. Telelet은 JSP를 기본 보기 정의 언어(VDL)로 대체합니다. Keeps용 JSP를 사용하는 애플리케이션은 Telelet을 사용하여 수정할 수 있습니다. Cryostat Servletweb.xml*.jsp 접미사로 매핑하여 애플리케이션을 식별할 수 있습니다.

4.2.6.2. faces Managed-Beans

자카르타 컨텍스트 및 종속성 (CDI) 빈의 경우, 더 이상 사용되지 않는 자카르타 특정 관리 bean 개념이 Cryostat 4.0에서 제거되었습니다. Cryostat를 사용하는 애플리케이션(예: javax.faces.bean.ManagedBean 으로 주석이 달린 클래스 또는 faces-config.xml의 Managed-bean 요소에서 참조됨)은 다음과 같은 변경을 수행해야 할 수 있습니다.

  • javax.faces.bean.ManagedBean 으로 주석이 달린 클래스 또는 faces-config.xml 의 Managed-bean 요소에서 참조하는 클래스는 jakarta.inject.Namedfaces-config.xml 의 모든 managed-bean 요소를 제거해야 합니다.
  • javax.faces.bean.ManagedProperty 주석으로 주석이 달린 멤버는 jakarta.faces.annotation.ManagedProperty 를 대신 jakarta.inject.Inject 주석과 함께 사용해야 합니다. 이전 javax.faces.bean.ManagedBean(name="foo", eager=true) 과 유사한 시작 의미 체계를 얻으려면 공개 void xxx(@Observes jakarta.enterprise.event.Startup 이벤트) 메서드 또는 공용 void xxx(@Observes @#159d.class) Object) 메서드를 추가합니다. jakarta.enterprise.event.Startup 옵션은 CDI 4.0의 새로운 옵션입니다.
  • javax.faces.bean.ApplicationScoped 주석을 jakarta.enterprise.context.ApplicationScoped 로 교체해야 합니다.
  • javax.faces.bean.CustomScoped 주석은 CDI 사용자 지정 범위 및 jakarta.enterprise.context.spi.Context 로 교체해야 합니다. 자세한 내용은 새 범위 유형 정의 및 CDI 4.0 사양의 컨텍스트 인터페이스 정의를 참조하십시오.
  • javax.faces.bean.NoneScoped 주석을 사용하는 것은 거의 유사한 의미가 있는 CDI 기본 제공 범위인 jakarta.enterprise.context.Dependent 로 교체해야 합니다.
  • javax.faces.bean.RequestScoped 주석을 jakarta.enterprise.context.RequestScoped 로 교체해야 합니다.
  • javax.faces.bean.SessionScoped 주석을 jakarta.enterprise.context.SessionScoped 로 교체해야 합니다.

4.2.6.3. 기타 pasts API 변경 사항

javax.faces.bean.ViewScoped 주석이 제거되었습니다. 대신 jakarta.faces.view.ViewScoped 를 사용할 수 있습니다.

javax.faces.view.facelets.ResourceResolver 및' javax.faces.view.facelets.FaceletsResourceResolver 주석이 제거되었습니다. 애플리케이션의 ResourceResolvers의 경우 jakarta.faces.application.ResourceHandler 인터페이스를 구현하고 faces-config.xmlapplication/resource-handler 요소에 구현의 정규화된 클래스 이름을 등록합니다.

4.2.7. Jakarta Servlet

Jakarta Servlet 6.0은 대부분 서블릿 2.x 릴리스에서 더 이상 사용되지 않는 여러 API 클래스와 방법을 제거합니다.

javax.servlet.SingleThreadModel 마커 인터페이스가 제거되었으며 이 인터페이스를 구현하는 서블릿에서 인터페이스 선언을 제거하고 서블릿 코드가 상태 및 기타 리소스 액세스를 동시에 액세스하도록 해야 합니다. 예를 들어 인스턴스 변수를 사용하지 않도록 하거나 리소스에 액세스하는 코드 블록을 동기화합니다. 그러나 개발자가 성능에 대한 동기화의 영향으로 인해 서비스 메서드(또는 doGetdoPost 와 같은 메서드)를 동기화하지 않는 것이 좋습니다.

javax.servlet.http.HttpSessionContext 인터페이스가 javax.servlet.http.HttpSession.getSessionContext() 메서드와 함께 제거되었습니다. Servlet 2.1 이후 이 인터페이스에는 사용 가능한 데이터를 제공하지 않는 사양에 구현이 필요하기 때문에 이 인터페이스에 대한 사용 사례가 없었습니다.

javax.servlet.http.HttpUtils 유틸리티 클래스가 제거되었습니다. 애플리케이션은 다음 메서드 대신 ServletRequest 및 CryostatServletRequest 인터페이스를 사용해야 합니다.

  • parseQueryString(String s)parsePostData(int len, ServletInputStream in) - ServletRequest.getParameterMap() 을 사용합니다. 애플리케이션에서 쿼리 문자열 매개변수와 요청 본문 매개 변수를 구분해야 하는 경우 애플리케이션은 쿼리 문자열 자체를 구문 분석하여 수행하는 코드를 구현해야 합니다.
  • getRequestURL(HttpServletRequest req)- Use HttpServletRequest.getRequestURL().

또한 다음과 같은 기타 메서드 및 생성자가 제거되었습니다.

class/Interface제거됨대신 사용

javax.servlet.ServletContext

getServlet(문자열 이름)

교체 없음

 

getServlets()

교체 없음

 

getServletNames()

교체 없음

 

log(Exception 예외, 문자열 msg)

log(문자열 메시지, Throwable throwable)

javax.servlet.ServletRequest

getRealPath(문자열 경로)

ServletContext.getRealPath(String path)

javax.servlet.ServletRequestWrapper

getRealPath(문자열 경로)

ServletContext.getRealPath(String path)

javax.servlet.UnavailableException

getServlet()

교체 없음

 

UnavailableException(Servlet 서블릿, 문자열 msg)

UnavailableException(String)

 

UnavailableException(정수 초, 서블릿 서블릿, 문자열 msg)

UnavailableException(String, int)

javax.servlet.http.HttpServletRequest

isRequestedSessionIdFromUrl()

isRequestedSessionIdFromURL()

javax.servlet.http.HttpServletRequestWrapper

isRequestedSessionIdFromUrl()

isRequestedSessionIdFromURL()

javax.servlet.http.HttpServletResponse

encodeUrl(문자열 url)

encodeURL(문자열 URL)

 

encodeRedirectUrl(문자열 url)

encodeRedirectURL(문자열 url)

 

setStatus(int sc, string sm)

sendError(int, String)

javax.servlet.http.HttpServletResponseWrapper

encodeUrl(문자열 url)

encodeURL(문자열 URL)

 

encodeRedirectUrl(문자열 url)

encodeRedirectURL(문자열 url)

 

setStatus(int sc, string sm)

sendError(int, String)

javax.servlet.http.HttpSession

GetValue(문자열 이름)

getAttribute(문자열 이름)

 

getValueNames()

getAttributeNames()

 

putValue(문자열 이름, 오브젝트 값)

setAttribute(문자열 이름, 오브젝트 값)

 

removevalue(문자열 이름)

removeAttribute(문자열 이름)

4.2.8. 첨부 파일이 있는 Jakarta Soap

jaxm.properties 파일을 통한 공급자 조회 지원이 제거되었습니다.

더 이상 사용되지 않는 javax.xml.soap.SOAP CryostatFactory 클래스가 제거되었습니다. jakarta.xml.soap.SOAPFactory 를 사용하여음악을 생성합니다.

Cryostat CryostatFactory 방법LokiFactory와 동등한

newInstance()

newInstance()

생성(이름)

createElement(Name)

create(문자열)

create Cryostat(문자열)

create(문자열, 문자열, 문자열)

create Cryostat(문자열, 문자열, 문자열)

4.2.9. Jakarta XML Binding

xml 바인딩 파일에서 사용해야 하는 XML 네임스페이스가 변경되었습니다. http://java.sun.com/xml/ns/jaxb 네임스페이스는 https://jakarta.ee/xml/ns/jaxb 로 교체해야 합니다.

연결된 javax.xml.bind.createValidator() 메서드와 같이 더 이상 사용되지 않는 javax.xml.bind.Validator 인터페이스가 제거되었습니다. 마샬링 및 unmarshalling 작업을 검증하려면 javax.xml.validation.Schemajakarta.xml.bind.Marshaller.setSchema(Schema) 에 제공합니다.

CryostatB 1.0과의 호환성 지원이 제거되었습니다.

Cryostat BContext 구현 조회 알고리즘에서 더 이상 사용되지 않는 일부 단계가 제거되었습니다. jaxb.properties 파일, javax.xml.bind.factory 또는 jakarta.xml. bind.JAXBContext 속성 및 /META-INF/services/javax.xml.bind.JAXBContext 리소스 파일을 삭제하여 구현 클래스 이름을 검색합니다. 현재 구현 검색 알고리즘에 대한 자세한 내용은 Jakarta XML Binding 4.0 사양 을 참조하십시오.

javax.xml.bind.Marshaller 인터페이스에서 여러 메서드에 대한 일반 요구 사항은 다음과 같이 변경되었습니다.

Jakarta XML Binding 2.3 / 3.0Jakarta XML Binding 4.0

<a extends CryostatAdapter> void setAdapter(A adapter)

<A extends XmlAdapter<?, ?>> void setAdapter(A adapter)

<a extends CryostatAdapter> void setAdapter(Class<A> type, A adapter)

<a extends CryostatAdapter<?, ?>> void setAdapter(Class<A> 유형, 어댑터)

<a extends CryostatAdapter> getAdapter(Class<A> 유형)

<a extends CryostatAdapter<?, ?>> A getAdapter(Class<A> 유형)

Jakarta XML Binding API의 변경 사항 외에도 구현 라이브러리 EAP 8에서 패키지 이름이 크게 변경되어 구현 라이브러리에 직접 액세스하는 일부 애플리케이션에 영향을 줄 수 있습니다.

  • com.sun.xml.bind 패키지에서 클래스를 사용하는 경우 org.glassfish.jaxb.runtime 패키지의 클래스로 교체해야 합니다. com.sun.xml.bind 의 하위 패키지에 있는 클래스는 해당 org.glassfish.jaxb.runtime 하위 패키지의 클래스로 교체해야 합니다.
  • jakarta.xml.bind.Marshaller 속성 설정의 경우 속성 상수 이름을 com.sun.xml.bind.* 에서 org.glassfish.jaxb.* 로 변경합니다. 예를 들어 marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", 매퍼)marshaller.setProperty("org.glassfish.jaxb.namespacePrefixMapper", mapper) 가 됩니다.

5장. JBoss EAP 애플리케이션의 Maven 프로젝트를 JBoss EAP 8.0으로 마이그레이션

애플리케이션의 Maven 프로젝트를 JBoss EAP BOM을 사용하여 종속성을 관리하는 JBoss EAP 8.0으로 마이그레이션하는 경우 JBoss EAP 8.0 BOMs에서 도입된 다음과 같은 중요한 변경 사항으로 인해 pom.xml 파일을 업데이트해야 합니다.

참고

애플리케이션을 변경 없이 JBoss EAP 8.0으로 마이그레이션하면 애플리케이션이 잘못된 종속 항목으로 빌드되고 JBoss EAP 8.0에 배포되지 않을 수 있습니다.

5.1. JBoss EAP Jakarta EE 8 이름 변경

JBoss EAP Jakarta EE 8 BOM은 JBoss EAP EE 로 이름이 변경되었으며 Maven Coordinates는 org.jboss.bom:jboss-eap-jakartaee8 에서 org.jboss.bom:jboss-eap-ee. Maven 프로젝트(pom.xml)에서 이 BOM의 사용은 다음과 같은 종속성 관리 가져오기로 식별할 수 있습니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-jakartaee8</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

Maven 프로젝트(pom.xml)는 대신 새로운 "JBoss EAP EE" BOM을 종속성 관리로 가져와야 합니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-ee</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

5.2. 툴을 사용하여 JBoss EAP Jakarta EE 8 이름 변경

JBoss EAP Jakarta EE 8 with Tools BOM은 도구를 사용하여 JBoss EAP EE 로 이름이 변경되었으며 Maven Coordinates는 org.jboss.bom:jboss-eap-jakartaee8-with-tools 에서 org.jboss.bom:jboss-eap-ee-with-tools 로 변경되었습니다. Maven 프로젝트(pom.xml)에서 이 BOM의 사용은 다음과 같은 종속성 관리 가져오기로 식별할 수 있습니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-jakartaee8-with-tools</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

Maven 프로젝트(pom.xml)는 새로운 "JBoss EAP EE with Tools" BOM을 종속성 관리로 가져와야 합니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-ee-with-tools</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

5.3. JBoss EAP Jakarta EE 8 API 제거

JBoss EAP Jakarta EE 8 API BOMs가 JBoss EAP 8.0에서 제거되었으며 새 JBoss EAP EE BOM을 대신 사용해야 합니다. Maven 프로젝트(pom.xml)에서 이 BOM의 사용은 다음과 같은 종속성 관리 가져오기로 식별할 수 있습니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.spec</groupId>
           <artifactId>jboss-jakartaee-8.0</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
       <dependency>
           <groupId>org.jboss.spec</groupId>
           <artifactId>jboss-jakartaee-web-8.0</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

Maven 프로젝트(pom.xml)는 새 JBoss EAP EE BOM을 종속성 관리로 가져와야 합니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-ee</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

5.4. JBoss EAP 런타임 BOM 제거

JBoss EAP Runtime BOM은 더 이상 JBoss EAP 8.0과 함께 배포되지 않으며 대신 새 JBoss EAP EE BOM을 사용해야 합니다. Maven 프로젝트(pom.xml)에서 이 BOM의 사용은 다음과 같은 종속성 관리 가져오기로 식별할 수 있습니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>eap-runtime-artifacts</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

Maven 프로젝트(pom.xml)는 대신 새 JBoss EAP EE BOM을 종속성 관리로 가져와야 합니다.

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-ee</artifactId>
           <version>${version.bom}</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

5.5. Jakarta EE 및 JBoss API Maven Coordinates 변경

다음 Jakarta EE 및 JBoss API 아티팩트는 JBoss EAP BOM에서 제공하거나 Maven Coordinates가 변경되었거나 다른 아티팩트로 교체되었습니다.

  • com.sun.activation:jakarta.activation
  • org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec
  • org.jboss.spec.javax.security.auth.message:jboss-jaspi-api_1.0_spec
  • org.jboss.spec.javax.security.jacc:jboss-jacc-api_1.5_spec
  • org.jboss.spec.javax.batch:jboss-batch-api_1.0_spec
  • org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec
  • org.jboss.spec.javax.el:jboss-el-api_3.0_spec
  • org.jboss.spec.javax.enterprise.concurrent:jboss-concurrency-api_1.0_spec
  • org.jboss.spec.javax.faces:jboss-jsf-api_2.3_spec
  • org.jboss.spec.javax.interceptor:jboss-interceptors-api_1.2_spec
  • org.jboss.spec.javax.jms:jboss-jms-api_2.0_spec
  • com.sun.mail:jakarta.mail
  • org.jboss.spec.javax.resource:jboss-connector-api_1.7_spec
  • org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec
  • org.jboss.spec.javax.servlet.jsp:jboss-jsp-api_2.3_spec
  • org.apache.taglibs:taglibs-standard-spec
  • org.jboss.spec.javax.transaction:jboss-transaction-api_1.3_spec
  • org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec
  • org.jboss.spec.javax.xml.ws:jboss-jaxws-api_2.3_spec
  • javax.jws:jsr181-api
  • org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec
  • org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec
  • org.jboss.spec.javax.xml.soap:jboss-saaj-api_1.4_spec
  • org.hibernate:hibernate-core
  • org.hibernate:hibernate-jpamodelgen
  • org.jboss.narayana.xts:jbossxts

아티팩트가 변경되거나 교체된 경우 Maven 프로젝트(pom.xml)는 종속성의 Maven Coordinates를 업데이트하거나 아티팩트가 더 이상 지원되지 않는 경우 종속성을 제거해야 합니다.

<dependencies>
   <!-- replaces com.sun.activation:jakarta.activation -->
   <dependency>
       <groupId>jakarta.activation</groupId>
       <artifactId>jakarta.activation-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec -->
   <dependency>
       <groupId>jakarta.annotation</groupId>
       <artifactId>jakarta.annotation-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.security.auth.message:jboss-jaspi-api_1.0_spec -->
   <dependency>
       <groupId>jakarta.authentication</groupId>
       <artifactId>jakarta.authentication-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.security.jacc:jboss-jacc-api_1.5_spec -->
   <dependency>
       <groupId>jakarta.authorization</groupId>
       <artifactId>jakarta.authorization-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.batch:jboss-batch-api_1.0_spec -->
   <dependency>
       <groupId>jakarta.batch</groupId>
       <artifactId>jakarta.batch-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec -->
   <dependency>
       <groupId>jakarta.ejb</groupId>
       <artifactId>jakarta.ejb-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.el:jboss-el-api_3.0_spec -->
   <dependency>
       <groupId>org.jboss.spec.jakarta.el</groupId>
       <artifactId>jboss-el-api_5.0_spec</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.enterprise.concurrent:jboss-concurrency-api_1.0_spec -->
   <dependency>
       <groupId>jakarta.enterprise.concurrent</groupId>
       <artifactId>jakarta.enterprise.concurrent-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.faces:jboss-jsf-api_2.3_spec -->
   <dependency>
       <groupId>jakarta.faces</groupId>
       <artifactId>jakarta.faces-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.interceptor:jboss-interceptors-api_1.2_spec -->
   <dependency>
       <groupId>jakarta.interceptor</groupId>
       <artifactId>jakarta.interceptor-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.jms:jboss-jms-api_2.0_spec  -->
   <dependency>
       <groupId>jakarta.jms</groupId>
       <artifactId>jakarta.jms-api</artifactId>
   </dependency>
   <!-- replaces com.sun.mail:jakarta.mail -->
   <dependency>
       <groupId>jakarta.mail</groupId>
       <artifactId>jakarta.mail-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.resource:jboss-connector-api_1.7_spec -->
   <dependency>
       <groupId>jakarta.resource</groupId>
       <artifactId>jakarta.resource-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec -->
   <dependency>
       <groupId>jakarta.servlet</groupId>
       <artifactId>jakarta.servlet-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.servlet.jsp:jboss-jsp-api_2.3_spec -->
   <dependency>
       <groupId>jakarta.servlet.jsp</groupId>
       <artifactId>jakarta.servlet.jsp-api</artifactId>
   </dependency>
   <!-- replaces org.apache.taglibs:taglibs-standard-spec -->
   <dependency>
       <groupId>jakarta.servlet.jsp.jstl</groupId>
       <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.transaction:jboss-transaction-api_1.3_spec  -->
   <dependency>
       <groupId>jakarta.transaction</groupId>
       <artifactId>jakarta.transaction-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec  -->
   <dependency>
       <groupId>jakarta.xml.bind</groupId>
       <artifactId>jakarta.xml.bind-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.xml.ws:jboss-jaxws-api_2.3_spec and javax.jws:jsr181-api -->
   <dependency>
       <groupId>org.jboss.spec.jakarta.xml.ws</groupId>
       <artifactId>jboss-jakarta-xml-ws-api_4.0_spec</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec -->
   <dependency>
       <groupId>jakarta.websocket</groupId>
       <artifactId>jakarta.websocket-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec -->
   <dependency>
       <groupId>jakarta.ws.rs</groupId>
       <artifactId>jakarta.ws.rs-api</artifactId>
   </dependency>
   <!-- replaces org.jboss.spec.javax.xml.soap:jboss-saaj-api_1.4_spec -->
   <dependency>
       <groupId>org.jboss.spec.jakarta.xml.soap</groupId>
       <artifactId>jboss-saaj-api_3.0_spec</artifactId>
   </dependency>
   <!-- replaces org.hibernate:hibernate-core -->
   <dependency>
       <groupId>org.hibernate.orm</groupId>
       <artifactId>hibernate-core</artifactId>
   </dependency>
   <!-- replaces org.hibernate:hibernate-jpamodelgen -->
   <dependency>
       <groupId>org.hibernate.orm</groupId>
       <artifactId>hibernate-jpamodelgen</artifactId>
   </dependency>
   <!-- replaces org.jboss.narayana.xts:jbossxts -->
   <dependency>
       <groupId>org.jboss.narayana.xts</groupId>
       <artifactId>jbossxts-jakarta</artifactId>
       <classifier>api</classifier>
   </dependency>
</dependencies>

5.6. JBoss migration 클라이언트 레거시 BOM 제거

Maven groupId:artifactIdorg.jboss.eap:wildfly-client-legacy-bom 인 JBoss migration Client Legacy BOM은 더 이상 JBoss EAP에 제공되지 않습니다.

다음 예에 설명된 대로 Maven 프로젝트 pom.xml 구성 파일에서 종속성 참조로 사용된 BOM을 종속성 참조로 식별할 수 있습니다.

종속성 관리 가져오기의 예

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.jboss.bom</groupId>
      <artifactId>wildfly-ejb-client-legacy-bom</artifactId>
      <version>${version.bom}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

종속성 참조 예

<dependencies>
...
  <dependency>
    <groupId>org.jboss.bom</groupId>
    <artifactId>wildfly-ejb-client-legacy-bom</artifactId>
    <version>${version.bom}</version>
    <type>pom</type>
  </dependency>
...
</dependencies>

독립형 클라이언트 Java 애플리케이션은 JBoss EAP 8과 같이 제거된 BOM의 동일한 버전을 계속 사용할 수 있습니다(예: 버전 7.4.0.GA ). 그러나 EventListener Client Legacy API를 교체하는 것이 좋습니다. handler 클라이언트 구성에 대한 자세한 내용은 EAP 7.1 이상 / 8.0 이상에서 Clevis 클라이언트를 구성하는 방법을 참조하십시오. JBoss EAP 7.4의 Clevis Client Legacy API 사용 중단에 대한 자세한 내용은 Red Hat JBoss EAP(Enterprise Application Platform) 7에서 더 이상 사용되지 않음을 참조하십시오.

중요

JBoss EAP 7.4 클라이언트와 JBoss EAP 8.x 서버는 다른 제품 라이프사이클을 따릅니다. 자세한 내용은 JBoss EAP의 제품 라이프사이클을 참조하십시오.

6장. 서버 마이그레이션 변경

마이그레이션하기 전에 서버에 애플리케이션을 배포하고 Red Hat JBoss Enterprise Application Platform 8.0에서 업그레이드하는 데 필요한 마이그레이션 변경 사항을 이해해야 합니다.

6.1. 웹 서버 구성 변경

루트 컨텍스트 동작에 영향을 미치고 서버 정보의 보안을 강화하는 Red Hat JBoss Enterprise Application Platform 내의 mod_cluster 및 Cryostat 변경 사항에 대해 알아보십시오.

6.1.1. 기본 웹 모듈 동작 변경

JBoss EAP 7.0에서 웹 애플리케이션의 루트 컨텍스트는 mod_cluster 에서는 기본적으로 비활성화되어 있습니다.

JBoss EAP 7.1부터는 더 이상 그렇지 않습니다. 루트 컨텍스트를 비활성화해야 하는 경우 이로 인해 예기치 않은 결과가 발생할 수 있습니다. 예를 들어, 원하지 않는 노드로 요청이 잘못 라우팅되거나 노출해서는 안 되는 개인 애플리케이션은 공용 프록시를 통해 의도치 않게 액세스할 수 있습니다. 이제 Cryostat 위치는 명시적으로 제외되지 않는 한 mod_cluster 로드 밸런서에 자동으로 등록됩니다.

다음 관리 CLI 명령을 사용하여 modcluster 하위 시스템 구성에서 ROOT를 제외합니다.

/subsystem=modcluster/mod-cluster-config=configuration:write-attribute(name=excluded-contexts,value=ROOT)

다음 관리 CLI 명령을 사용하여 기본 시작 웹 애플리케이션을 비활성화합니다.

/subsystem=undertow/server=default-server/host=default-host/location=\/:remove
/subsystem=undertow/configuration=handler/file=welcome-content:remove
reload

6.1.2. Cryostat 하위 시스템 기본 구성 변경

Red Hat JBoss Enterprise Application Platform 7.2 이전에는 기본 undertow 하위 시스템 구성에 default-host 에 의해 각 HTTP 응답에 추가된 두 개의 응답 헤더 필터가 포함되었습니다.

  • 서버는 이전에 JBoss EAP/7 로 설정되었습니다.
  • X-Powered-By 는 이전에 Cryostat /1로 설정되었습니다.

이러한 응답 헤더 필터는 사용 중인 서버에 대한 정보의 의도하지 않은 공개를 방지하기 위해 기본 JBoss EAP 7.2 구성에서 제거되었습니다.

다음은 JBoss EAP 7.1의 기본 undertow 하위 시스템 구성의 예입니다.

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https"/>
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
            <http-invoker security-realm="ApplicationRealm"/>
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <response-header name="server-header" header-name="Server" header-value="JBoss-EAP/7"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    </filters>
</subsystem>

다음은 JBoss EAP 7.4의 기본 undertow 하위 시스템 구성의 예입니다.

<subsystem xmlns="urn:jboss:domain:undertow:12.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <http-invoker security-realm="ApplicationRealm"/>
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
</subsystem>

다음은 JBoss EAP 8.0의 기본 undertow 하위 시스템 구성의 예입니다.

<subsystem xmlns="urn:jboss:domain:undertow:14.0" default-virtual-host="default-host" default-servlet-container="default" default-server="default-server" statistics-enabled="${wildfly.undertow.statistics-enabled:${wildfly.statistics-enabled:false}}" default-security-domain="other">
    <byte-buffer-pool name="default"/>
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <https-listener name="https" socket-binding="https" ssl-context="applicationSSC" enable-http2="true"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <http-invoker http-authentication-factory="application-http-authentication"/>
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <application-security-domains>
        <application-security-domain name="other" security-domain="ApplicationDomain"/>
    </application-security-domains>
</subsystem>

6.2. Infinispan 서버 구성 변경

다음 측면을 고려하여 Red Hat JBoss Enterprise Application Platform 7.1 이상에서 사용자 정의 SFSB(상태 저장 세션 빈) 캐시를 구성합니다.

  • idle-timeout 속성 사용 중단
  • lazy 활성화 구현
  • 클러스터 이름 확인
  • 제거 및 만료의 적절한 구성
  • 성능 향상을 위해 캐시 컨테이너 전송 프로토콜의 수정

이러한 고려 사항을 준수하면 SFSB 캐시 구성을 최적화하여 JBoss EAP 7.1 이상에서 활성화를 개선할 수 있습니다.

6.2.1. 비활성화를 위한 사용자 정의 상태 저장 세션 빈 캐시 구성

JBoss EAP 7.1 이상 버전에서는 활성화가 활성화된 사용자 정의 상태 저장 세션 빈(SFSB) 캐시가 변경되었습니다. 비활성화를 사용하여 SFSB 캐시를 구성할 때 다음과 같은 주요 변경 사항을 고려하십시오.

  • idle-timeout 속성 사용 중단
  • 빠른 활성화에서 지연 활성화로 전환
  • 클러스터 이름 확인
  • Jakarta Enterprise Cryostats 캐시에서 제거 및 만료 구성

JBoss EAP 7.1 이상 버전에서 비활성화를 위해 사용자 지정 SFSB 캐시를 구성할 때 다음 제한 사항을 고려하십시오.

  • Cryostat 3 하위 시스템의 infinispan passivation-store 에 구성된 idle-timeout 속성은 JBoss EAP 7.1 이상에서 더 이상 사용되지 않습니다. JBoss EAP 7.1 이상에서는 max-size 임계값에 도달할 때 발생하는 지연 비활성화만 지원합니다.

    참고

    idle-timeout을 통한 동기 부여는 이러한 버전에서 더 이상 지원되지 않습니다.

  • JBoss EAP 7.1 이상에서는 jgroups 하위 시스템에 구성된 대로 Jakarta Enterprise Cryostats 클라이언트에서 사용하는 클러스터 이름은 채널의 실제 클러스터 이름에 따라 결정됩니다.
  • JBoss EAP 7.1 이상에서는 활성 임계값을 제어하도록 max-size 특성을 설정할 수 있습니다.

6.2.2. Infinispan 캐시 컨테이너 전송 변경

JBoss EAP 7.0 이상 버전 간의 동작 변경을 수행하려면 일괄 모드 또는 특수 헤더를 사용하여 캐시 컨테이너 전송 프로토콜에 대한 업데이트를 수행해야 합니다. 이 변경 사항은 JBoss EAP 서버 관리에 사용되는 툴에도 영향을 미칩니다.

다음은 JBoss EAP 7.0에서 캐시 컨테이너 전송 프로토콜을 구성하는 데 사용되는 관리 CLI 명령의 예입니다.

/subsystem=infinispan/cache-container=my:add()
/subsystem=infinispan/cache-container=my/transport=jgroups:add()
/subsystem=infinispan/cache-container=my/invalidation-cache=mycache:add(mode=SYNC)

다음은 JBoss EAP 7.1에서 동일한 구성을 수행하는 데 필요한 관리 CLI 명령의 예입니다. 명령은 일괄 처리 모드로 실행됩니다.

batch
/subsystem=infinispan/cache-container=my:add()
/subsystem=infinispan/cache-container=my/transport=jgroups:add()
/subsystem=infinispan/cache-container=my/invalidation-cache=mycache:add(mode=SYNC)
run-batch

배치 모드를 사용하지 않으려면 전송을 정의할 때 작업 헤더 allow-resource-service-restart=true 를 대신 지정할 수 있습니다.

스크립트를 사용하여 캐시 컨테이너 전송 프로토콜을 업데이트하는 경우 이를 검토하고 일괄 처리 모드를 추가해야 합니다.

6.2.3. CDI 하위 시스템 구성이 버전 8.0 이상에서 변경

JBoss EAP 8.0에서는 새 하위 시스템 및 여러 리소스에 대한 업데이트를 포함하여 SFSB(Distributedable stateful session beans)에 대한 EJB(Enterprise JavaBeans) 하위 시스템 구성 변경 사항이 도입되었습니다. JBoss EAP 6 및 7에서 사용되는 여러 리소스도 더 이상 사용되지 않습니다. 이러한 변경 사항을 통해 서버 구성 마이그레이션을 통해 애플리케이션이 향후 주요 릴리스와 호환되는지 확인할 수 있습니다.

JBoss EAP 8.0은 JBoss EAP 6 및 7에서 사용되는 더 이상 사용되지 않는 리소스를 분산형 SFSB 캐싱을 구성하기 위한 두 개의 새 리소스와 distributable - Cryostat 하위 시스템으로 대체합니다. 다음 표에는 더 이상 사용되지 않는 리소스와 해당 리소스를 대체하는 새 리소스가 요약되어 있습니다.

표 6.1. SFSB 캐시 구성 변경

더 이상 사용되지 않는 리소스배포 불가능한 새로운 SFSB 캐시새로운 배포 가능한 SFSB 캐시

/subsystem=ejb3/cache

/subsystem=ejb3/simple-cache

/subsystem=ejb3/distributable-cache

/subsystem=ejb3/passivation-store

해당 없음

/subsystem=ejb3/distributable-cache=”name”/bean-management"=..

배포 불가능한 SFSB 캐시, /subsystem= Cryostat3/simple-cache 는 JBoss EAP 7에서 사용된 SFSB 캐시인 /subsystem= Cryostat3/cache 와 동일합니다.

배포 가능한 SFSB 캐시 /subsystem= Cryostat3/distributable-cache 에는 배포 가능 - Cryostat 하위 시스템에서 해당 리소스를 참조하는 선택적 8080- management 특성이 포함되어 있습니다. 리소스를 정의하지 않으면 기본값은 distributable - Cryostat 하위 시스템 내의 8080 -management 리소스입니다.

JBoss EAP 8.0에서 업데이트된 접근 방식으로 서버 구성을 마이그레이션하는 것이 좋습니다. 현재 릴리스는 더 이상 사용되지 않는 리소스에서 계속 작동하지만 제거 시 향후 릴리스에서는 그렇지 않을 수 있습니다.

JBoss EAP 7과 기본 JBoss EAP 8.0 구성 간의 비교 예는 다음과 같습니다.

JBoss EAP 7 구성:

/subsystem=ejb3/cache=example-simple-cache:add()
/subsystem=ejb3/passivation-store=infinispan:add(cache-container=ejb, bean-cache=default, max-size=1024)
/subsystem=ejb3/cache=example-distributed-cache:add(passivation-store=infinispan)

기본 JBoss EAP 8.0 구성:

/subsystem=ejb3/simple-cache=example-simple-cache:add()
/subsystem=distributable-ejb=example-distributed-cache/infinispan-bean-management=example-bean-cache:add(cache-container=ejb, cache=default, max-active-beans=1024)
/subsystem=ejb3/distributable-cache=example-distributed-cache:add(bean-management=example-bean-cache)

기본 JBoss EAP 8.0 구성을 채택하면 서버가 최신 버전 및 향후 주요 릴리스와 호환됩니다. 또한 배포 가능한 SFSB를 위한 향상된 리소스 및 하위 시스템의 이점도 누릴 수 있습니다.

6.3. Jakarta Enterprise Cryostat 서버 구성 변경

JBoss EAP 7에서 Cryostat 3 하위 시스템을 구성하는 동안 엔터프라이즈 빈 애플리케이션을 배포하는 동안 서버 로그에 예외가 표시될 수 있습니다.

중요

JBoss Server 마이그레이션 도구를 사용하여 서버 구성을 업데이트하는 경우 Cryostat 3 하위 시스템이 올바르게 구성되어 Jakarta Enterprise Cryostats 애플리케이션을 배포할 때 문제가 발생하지 않아야 합니다. 툴 구성 및 실행에 대한 자세한 내용은 JBoss Server 마이그레이션 툴 사용을 참조하십시오.

6.3.1. 캐싱 변경으로 인한 DuplicateServiceException 해결

다음 DuplicateServiceException 오류는 JBoss EAP 7의 변경 사항을 캐싱하여 발생합니다.

서버 로그의 DuplicateServiceException

ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."mdb-1.0-SNAPSHOT.jar".cache-dependencies-installer: org.jboss.msc.service.StartException in service jboss.deployment.unit."mdb-1.0-SNAPSHOT.jar".cache-dependencies-installer: Failed to start service
...
Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.infinispan.ejb."mdb-1.0-SNAPSHOT.jar".config is already registered

JBoss EAP 7의 변경 사항 캐싱으로 인한 DuplicateServiceException 을 해결하려면 다음 명령을 실행하여 Cryostat 3 하위 시스템에서 캐싱을 재구성합니다.

/subsystem=ejb3/file-passivation-store=file:remove
/subsystem=ejb3/cluster-passivation-store=infinispan:remove
/subsystem=ejb3/passivation-store=infinispan:add(cache-container=ejb, max-size=10000)

/subsystem=ejb3/cache=passivating:remove
/subsystem=ejb3/cache=clustered:remove
/subsystem=ejb3/cache=distributable:add(passivation-store=infinispan, aliases=[passivating, clustered])

캐시를 재구성하면 이 오류를 해결하고 DuplicateServiceException 이 발생하지 않도록 할 수 있습니다.

6.4. 메시징 서버 구성 변경

Red Hat JBoss Enterprise Application Platform 8.0에서 Jakarta 메시징 지원 공급자 역할을 하는 구성 및 관련 메시징 데이터를 ActiveMQ Artemis로 마이그레이션하는 방법을 알아보십시오.

6.4.1. 메시징 데이터 마이그레이션

Red Hat JBoss Enterprise Application Platform에서 메시징 데이터를 마이그레이션하는 데 사용할 수 있는 접근 방식을 검토하십시오.

이전 JBoss EAP 7.x 릴리스에서 JBoss EAP 8.0으로 메시징 데이터를 마이그레이션하려면 내보내기 및 가져오기 방법을 사용하여 메시징 데이터를 마이그레이션할 수 있습니다. 이 방법은 이전 릴리스에서 메시징 데이터를 내보내고 관리 CLI import-journal 작업을 사용하여 JBoss EAP 8.0으로 가져와야 합니다. 이 방법은 파일 기반 메시징 시스템에 특히 적용됩니다.

버전 7과 마찬가지로 JBoss EAP 8.0은 ActiveMQ Artemis를 Jakarta Messaging 지원 공급자로 계속 사용하므로 마이그레이션 프로세스를 더 원활하게 수행할 수 있습니다.

6.4.1.1. 내보내기 및 가져오기 접근 방식을 사용하여 메시징 데이터 마이그레이션

다음 방법을 사용하여 이전 릴리스의 메시징 데이터를 XML 파일로 내보낸 다음 import-journal 작업을 사용하여 해당 파일을 가져옵니다.

중요

내보내기 및 가져오기 방법을 사용하여 스토리지에 JDBC 기반 저널을 사용하는 시스템 간에 메시징 데이터를 이동할 수 없습니다.

6.4.1.1.1. JBoss EAP 7.x 릴리스에서 메시징 데이터 내보내기

Red Hat JBoss Enterprise Application Platform 7.x 릴리스에서 메시징 데이터를 내보내려면 다음 절차를 따르십시오.

사전 요구 사항

  • JBoss EAP 7.x가 시스템에 설치되어 있습니다.
  • 터미널 또는 명령줄 인터페이스에 액세스할 수 있습니다.
  • 디렉터리를 탐색하고 명령을 실행하는 데 필요한 권한이 있습니다.

프로세스

  1. 터미널을 열고 JBoss EAP 7.x 설치 디렉터리로 이동하여 관리자 전용 모드에서 서버를 시작합니다.

    $ EAP_HOME/bin/standalone.sh -c standalone-full.xml --start-mode=admin-only
  2. 새 터미널을 열고 JBoss EAP 7.x 설치 디렉터리로 이동한 다음 관리 CLI에 연결합니다.

    $ EAP_HOME/bin/jboss-cli.sh --connect
  3. 다음 관리 CLI 명령을 사용하여 메시징 저널 데이터를 내보냅니다.

    /subsystem=messaging-activemq/server=default:export-journal()

검증

  • 명령 완료 시 로그에 오류 또는 경고 메시지가 없는지 확인합니다.
  • 운영 체제와 호환되는 도구를 사용하여 생성된 출력 파일에서 XML의 유효성을 검사합니다.
6.4.1.1.2. XML 형식의 메시징 데이터 가져오기

JBoss EAP 8.0에서 메시징 데이터를 내보낸 후에는 import-journal 작업을 사용하여 XML 파일을 JBoss EAP 8.0 이상으로 가져와야 합니다.

사전 요구 사항

  • 관리 CLI 마이그레이션 작업 또는 JBoss Server 마이그레이션 도구를 사용하여 JBoss EAP 8.0의 마이그레이션을 완료합니다.
  • 연결된 자카르타 메시징 클라이언트 없이 일반 모드에서 JBoss EAP 8.0 서버를 시작합니다.

프로세스

XML 파일을 JBoss EAP 8.0 또는 이후 버전으로 가져오려면 import-journal 작업을 사용하여 다음 단계를 따르십시오.

중요

대상 서버가 이미 일부 메시징 작업을 수행한 경우 가져오기 실패 시 데이터 손실을 방지하기 위해 import-journal 작업을 시작하기 전에 메시징 폴더를 백업해야 합니다. 자세한 내용은 메시징 폴더 데이터 백업을 참조하십시오.

  1. Jakarta Messaging 클라이언트가 연결되지 않은 상태에서 일반 모드에서 JBoss EAP 8.0 서버를 시작합니다.

    중요

    자카르타 메시징 클라이언트가 연결되지 않은 상태로 서버를 시작하는 것이 중요합니다. import-journal 작업이 Jakarta Messaging 생산자처럼 동작하기 때문입니다. 작업이 진행 중인 경우 즉시 메시지를 사용할 수 있습니다. 가져오기 및 자카르타 메시징 클라이언트가 연결되어 있는 동안 이 작업이 실패하면 자카르타 메시징 클라이언트가 이미 일부 메시지를 사용했을 수 있기 때문에 복구할 방법이 없습니다.

  2. 새 터미널을 열고 JBoss EAP 8.0 설치 디렉터리로 이동한 다음 관리 CLI에 연결합니다.

    $ EAP_HOME/bin/jboss-cli.sh --connect
  3. 다음 관리 CLI 명령을 사용하여 메시징 데이터를 가져옵니다.

    /subsystem=messaging-activemq/server=default:import-journal(file=OUTPUT_DIRECTORY/OldMessagingData.xml)
    중요

    이 명령을 두 번 이상 실행하지 마십시오. 이렇게 하면 중복 메시지가 발생합니다.

6.4.1.1.3. 가져오기 메시징 데이터 오류에서 복구

import-journal 작업이 실패하면 가져오기 메시징 데이터 오류에서 복구할 수 있습니다.

사전 요구 사항

  • JBoss EAP 8.0 서버 및 관리 CLI 명령에 대해 숙지합니다.
  • 메시징 저널 폴더의 디렉터리 위치에 대한 지식.
  • 사용 가능한 경우 대상 서버 메시징 데이터의 이전 백업입니다.

프로세스

  1. JBoss EAP 8.0 서버를 종료합니다.
  2. 메시징 저널 폴더를 모두 삭제합니다. 메시징 저널 폴더에 대한 올바른 디렉터리 위치를 확인하려면 관리 CLI 명령의 메시징 폴더 데이터 백업을 참조하십시오.
  3. 가져오기 전에 대상 서버 메시징 데이터를 백업한 경우 백업 위치의 메시징 폴더를 이전 단계에서 확인한 메시징 저널 디렉터리에 복사합니다.
  4. XML 형식의 메시징 데이터를 가져오는 단계를 반복합니다.

6.4.1.2. 메시징 브리지를 사용하여 메시징 데이터 마이그레이션

Jakarta Messaging 브리지는 소스 Jakarta 메시징 대기열 또는 주제의 메시지를 사용하여 다른 서버에 있는 대상 자카르타 메시징 큐 또는 주제로 보냅니다. Jakarta Messaging 3.1 표준을 준수하는 메시징 서버 간 메시지 브리징을 사용할 수 있습니다. Java Naming 및 Directory Interface를 사용하여 소스 및 대상 Jakarta 메시징 리소스를 검색하여 Java Naming 및 Directory Interface 조회용 클라이언트 클래스가 모듈에 번들되어 Jakarta Messaging 브리지 구성에서 모듈 이름을 선언합니다.

이 섹션에서는 서버를 구성하고 JBoss EAP 7에서 JBoss EAP 8.0으로 메시징 데이터를 이동하기 위한 메시징 브리지를 배포하는 방법에 대해 설명합니다. 이 작업을 수행하려면 다음 단계를 진행합니다.

6.4.1.2.1. JBoss EAP 8.0 서버 구성

모듈 종속성 및 큐 구성을 포함하여 메시징 데이터를 원활히 마이그레이션하기 위해 JBoss EAP 8.0에서 Jakarta 메시징 브릿지를 구성하려면 다음 절차를 따르십시오.

사전 요구 사항

  • JBoss EAP 8.0 서버가 설치되어 실행 중입니다.

프로세스

  1. JBoss EAP 8.0 서버의 messaging-activemq 하위 시스템에서 기본 서버에 대한 다음 jms-queue 구성을 생성합니다.

    jms-queue add --queue-address=MigratedMessagesQueue --entries=[jms/queue/MigratedMessagesQueue java:jboss/exported/jms/queue/MigratedMessagesQueue]
  2. messaging-activemq 하위 시스템 기본 서버에 다음과 유사한 InVmConnectionFactory 연결 요소에 대한 구성이 포함되어 있는지 확인합니다.

    <connection-factory name="InVmConnectionFactory" factory-type="XA_GENERIC" entries="java:/ConnectionFactory" connectors="in-vm"/>

    항목이 포함되지 않은 경우 다음 관리 CLI 명령을 사용하여 항목을 생성합니다.

    /subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:add(factory-type=XA_GENERIC, connectors=[in-vm], entries=[java:/ConnectionFactory])
  3. InQueue JMS 대기열에서 메시지를 읽고 이를 JBoss EAP 7.x 서버에 구성된 MigratedMessagesQueue 로 전송하는 Jakarta 메시징 브리지를 생성 및 배포합니다.

    /subsystem=messaging-activemq/jms-bridge=myBridge:add(add-messageID-in-header=true,max-batch-time=100,max-batch-size=10,max-retries=-1,failure-retry-interval=1000,quality-of-service=AT_MOST_ONCE,module=org.hornetq,source-destination=jms/queue/InQueue,source-connection-factory=jms/RemoteConnectionFactory,source-context=[("java.naming.factory.initial"=>"org.wildfly.naming.client.WildFlyInitialContextFactory"),("java.naming.provider.url"=>"http-remoting://legacy-host:8080")],target-destination=jms/queue/MigratedMessagesQueue,target-connection-factory=java:/ConnectionFactory)

    이렇게 하면 JBoss EAP 8.0 서버의 messaging-activemq 하위 시스템에 다음 jms-bridge 구성이 생성됩니다.

    <jms-bridge name="myBridge" add-messageID-in-header="true" max-batch-time="100" max-batch-size="10" max-retries="-1" failure-retry-interval="1000" quality-of-service="AT_MOST_ONCE">
        <source destination="jms/queue/InQueue" connection-factory="jms/RemoteConnectionFactory">
            <source-context>
                <property name="java.naming.factory.initial" value="org.wildfly.naming.client.WildFlyInitialContextFactory"/>
                <property name="java.naming.provider.url" value="http-remoting://legacy-host:8080"/>
            </source-context>
        </source>
        <target destination="jms/queue/MigratedMessagesQueue" connection-factory="java:/ConnectionFactory"/>
    </jms-bridge>
6.4.1.2.2. 메시징 데이터 마이그레이션

Red Hat JBoss Enterprise Application Platform 8.0에서 Red Hat JBoss Enterprise Application Platform 8.0으로 메시징 데이터를 마이그레이션하려면 다음 절차를 따르십시오.

사전 요구 사항

  • JBoss EAP 8.0 서버가 설치되어 실행 중입니다.

프로세스

  1. 다음 구성에 대해 제공한 정보가 올바른지 확인합니다.

    • 큐 및 주제 이름입니다.
    • Java Naming and Directory Interface 조회를 위한 java.naming.provider.url 입니다.
  2. 대상 Jakarta Messaging 대상을 JBoss EAP 8.0 서버에 배포했는지 확인합니다.
  3. 마이그레이션 프로세스와 관련된 JBoss EAP 7 서버를 포함하여 JBoss EAP 8.0 서버를 시작합니다.

6.4.1.3. 메시징 폴더 데이터 백업

데이터 무결성을 보장하려면 서버가 이미 메시지를 처리한 경우 변경하기 전에 대상 메시지 폴더를 백업하는 것이 좋습니다. 메시징 폴더의 기본 위치는 EAP_HOME/standalone/data/activemq/ 에서 찾을 수 있지만 구성할 수 있습니다. 메시징 데이터의 위치를 잘 모를 경우 다음 관리 CLI 명령을 사용하여 확인할 수 있습니다.

프로세스

  1. 다음 관리 CLI 명령을 사용하여 메시징 데이터의 위치를 확인합니다.

    /subsystem=messaging-activemq/server=default/path=journal-directory:resolve-path
    /subsystem=messaging-activemq/server=default/path=paging-directory:resolve-path
    /subsystem=messaging-activemq/server=default/path=bindings-directory:resolve-path
    /subsystem=messaging-activemq/server=default/path=large-messages-directory:resolve-path
    참고

    데이터를 복사하기 전에 서버를 중지했는지 확인합니다.

  2. 각 메시징 폴더를 해당 위치를 식별한 후 보안 백업 위치에 복사합니다.

6.4.2. Jakarta Messaging 리소스 어댑터 구성

타사 자카르타 메시징 공급자와 함께 사용할 일반 자카르타 메시징 리소스 어댑터를 구성하는 방식이 Red Hat JBoss Enterprise Application Platform 8.0에서 변경되었습니다. 자세한 내용은 JBoss EAP 7.4 Messaging 구성 가이드의 일반 Java Message Service 리소스 어댑터 배포를 참조하십시오.

6.4.3. 메시징 구성 변경

Red Hat JBoss Enterprise Application Platform 7.0에서 check-for-live-server 속성을 지정하지 않고 replication-primary 정책을 구성한 경우 기본값이 false 로 설정되었습니다. 이는 JBoss EAP 7.1 이상에서 변경되었습니다. check-for-live-server 속성의 기본값이 이제 true 로 설정됩니다.

다음은 check-for-live-server 특성을 지정하지 않고 replication-primary 정책을 구성하는 관리 CLI 명령의 예입니다.

/subsystem=messaging-activemq/server=default/ha-policy=replication-primary:add(cluster-name=my-cluster,group-name=group1)

관리 CLI를 사용하여 리소스를 읽을 때 check-for-live-server 속성 값이 true 로 설정되어 있는지 확인합니다.

/subsystem=messaging-activemq/server=default/ha-policy=replication-primary:read-resource(recursive=true)
{
    "outcome" => "success",
    "result" => {
        "check-for-live-server" => true,
        "cluster-name" => "my-cluster",
        "group-name" => "group1",
        "initial-replication-sync-timeout" => 30000L
    },
    "response-headers" => {"process-state" => "reload-required"}
}

6.4.4. 임베디드 브로커 메시징을 위한 Galleon 계층

JBoss EAP 7에서는 포함된 메시징 브로커가 기본 설치의 일부였습니다. JBoss EAP 8에서는 이 기능이 embedded-activemq 라는 새로운 Galleon 계층에 추가되었습니다.

이 새 계층은 기본 구성의 일부가 아니므로 JBoss EAP에 포함된 브로커를 사용하고자 하는 사용자는 구성에 명시적으로 포함해야 합니다.

이 계층은 고객이 OpenShift에서 전용 AMQ 클러스터를 사용하는 것을 권장하더라도 임베디드 브로커가 포함된 messaging-activemq 하위 시스템을 제공합니다. 또한 이 사용 사례를 지원하는 데 필요한 소켓 바인딩 및 필요한 종속성과 같은 보조 리소스도 프로비저닝합니다.

6.5. JBoss EAP 8.0의 보안 개선 사항

JBoss EAP 8.0부터는 레거시 보안 하위 시스템 및 기존 보안 영역을 더 이상 사용할 수 없으므로 Elytron을 사용해야 합니다. JBoss Server 마이그레이션 툴을 사용하여 Elytron 기본값을 구성할 수 있습니다. 따라서 레거시 보안 구성을 수동으로 마이그레이션해야 합니다.

6.5.1. 자격 증명 모음 마이그레이션

자격 증명 모음이 JBoss EAP 8.0에서 제거되었습니다. elytron 하위 시스템에서 제공하는 인증 정보 저장소를 사용하여 중요한 문자열을 저장합니다.

6.5.2. 레거시 보안 하위 시스템 및 보안 영역 제거

레거시 보안 하위 시스템 및 레거시 보안 영역이 JBoss EAP 8.0에서 제거되었습니다. elytron 하위 시스템에서 제공하는 보안 영역을 사용합니다.

6.5.4. Red Hat build of Keycloak OIDC 클라이언트 어댑터에서 JBoss EAP 하위 시스템으로 마이그레이션

keycloak 하위 시스템은 JBoss EAP 8.0에서 지원되지 않으며 elytron-oidc-client 하위 시스템으로 교체됩니다. JBoss Server 마이그레이션 도구는 기본적으로 마이그레이션을 수행합니다.

6.5.5. 사용자 정의 로그인 모듈 마이그레이션

JBoss EAP 8.0에서는 레거시 보안 하위 시스템이 제거되었습니다. elytron 하위 시스템에서 사용자 지정 로그인 모듈을 계속 사용하려면 새로운 JAAS(Java Authentication and Authorization Service) 보안 영역과 jaas-realm 을 사용합니다.

6.5.6. FIPS 모드 변경

JBoss EAP 7.1부터 자체 서명된 인증서의 자동 생성은 개발 목적으로 기본적으로 활성화됩니다. FIPS 모드에서 실행 중인 경우 자동 자체 서명 인증서 생성을 비활성화하도록 서버를 구성합니다. 이렇게 하지 않으면 서버를 시작할 때 다음과 같은 오류가 발생할 수 있습니다.

ERROR [org.xnio.listener] (default I/O-6) XNIO001007: A channel event listener threw an exception: java.lang.RuntimeException: WFLYDM0114: Failed to lazily initialize SSL context
...
Caused by: java.lang.RuntimeException: WFLYDM0112: Failed to generate self signed certificate
...
Caused by: java.security.KeyStoreException: Cannot get key bytes, not PKCS#8 encoded

6.6. mod_cluster 구성 변경

mod_cluster의 정적 프록시 목록에 대한 구성이 Red Hat JBoss Enterprise Application Platform 7.4에서 변경되었습니다.

JBoss EAP 7.4부터 proxy-list 속성은 더 이상 사용되지 않고 JBoss EAP 8.0에서 제거되었습니다.

아웃바운드 소켓 바인딩 이름 목록인 proxies 속성으로 교체되었습니다.

이러한 변경 사항은 예를 들어 mod_cluster에 대한 광고를 비활성화할 때 정적 프록시 목록을 정의하는 방법에 영향을 미칩니다. mod_cluster에 대한 광고를 비활성화하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 구성 가이드의 mod_cluster에 대한 광고 비활성화 를 참조하십시오.

JBoss EAP 8.0과의 호환성을 보장하기 위해 다음과 같이 사용자 스크립트 및 레거시 사용자 CLI 스크립트를 업데이트합니다.

  • 더 이상 사용되지 않는 ssl=configuration 을 적절한 elytron 기반 구성으로 바꿉니다.
  • /mod-cluster-config=CONFIGURATION 에서 /proxy=default 로 mod_cluster 구성 경로를 업데이트합니다.
  • 사용자 스크립트에서 동적 로드 공급자 경로를 업데이트하여 더 이상 사용되지 않는 경로를 provider=dynamic 으로 바꿉니다.
  • Cryostat 리스너를 참조하는 더 이상 사용되지 않는 커넥터 속성이 제거되었습니다. 리스너 속성을 교체로 사용하도록 사용자 스크립트를 업데이트합니다.

mod_cluster 특성에 대한 자세한 내용은 JBoss EAP 7.4 구성 가이드의 ModCluster 하위 시스템 속성을 참조하십시오.

6.7. 구성 변경 사항 보기

Red Hat JBoss Enterprise Application Platform 7을 사용하면 실행 중인 서버에 대한 구성 변경 사항을 추적할 수 있습니다. 권한 있는 사용자가 변경한 구성 변경 기록을 볼 수도 있습니다.

JBoss EAP 7.0에서는 core-service management CLI 명령을 사용하여 옵션을 구성하고 최근 구성 변경 목록을 검색해야 했습니다.

예: JBoss EAP 7.0의 구성 변경 사항 나열

/core-service=management/service=configuration-changes:add(max-history=10)
/core-service=management/service=configuration-changes:list-changes

JBoss EAP 7.1에는 실행 중인 서버에 대한 구성 변경 사항을 추적하도록 구성할 수 있는 새로운 core-management 하위 시스템이 도입되었습니다. JBoss EAP 7.1 이상에서 구성 변경 사항을 구성하고 보는 기본 방법입니다.

예: JBoss EAP 7.1 이상의 구성 변경 목록

/subsystem=core-management/service=configuration-changes:add(max-history=20)
/subsystem=core-management/service=configuration-changes:list-changes

JBoss EAP 7.1에 도입된 새로운 코어 관리 하위 시스템 사용에 대한 자세한 내용은 JBoss EAP 7.4 구성 가이드의 구성 변경 사항 보기를 참조하십시오.

7장. 애플리케이션 마이그레이션 변경 이해

이 섹션에서는 JBoss EAP 6.4 또는 7.x에서 JBoss EAP 8.0으로 애플리케이션을 마이그레이션하는 데 필요한 변경 사항에 대해 설명합니다.

7.1. 웹 서비스 애플리케이션 변경

JBossWS 5는 Apache CXF,Apache WSS4JApache Santuario 구성 요소의 업그레이드를 통해 JBoss EAP 7 웹 서비스에 새로운 기능 및 성능 향상을 제공합니다. JBoss EAP 8.0은 JBossWS 7을 사용하여 해당 기능을 지원합니다.

7.1.1. Cryostat-RPC 지원 변경 사항

JAX-RPC(Java API for XML-based RPC)는 Java EE 6에서 더 이상 사용되지 않으며 Java EE 7에서는 선택 사항입니다. JBoss EAP 7부터는 더 이상 지원되지 않습니다. Cryostat-RPC를 사용하는 애플리케이션은 현재 자카르타 EE 표준 웹 서비스 프레임워크인 Jakarta XML Web Services 를 사용하도록 마이그레이션해야 합니다.

Cryostat-RPC 웹 서비스의 사용은 다음과 같은 방법으로 식별할 수 있습니다.

  • root 요소가 < java-wsdl-mapping>인 XML 파일인 Cryostat-RPC 매핑 파일이 있습니다.
  • < jaxrpc-mapping-file> 하위 요소를 포함하는 < webservice-description > 요소가 포함된 webservices.xml XML 설명자 파일이 있습니다. 다음은 Cryostat-RPC 웹 서비스를 정의하는 webservices.xml 설명자 파일의 예입니다.

    <webservices xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd" version="1.1">
      <webservice-description>
        <webservice-description-name>HelloService</webservice-description-name>
        <wsdl-file>WEB-INF/wsdl/HelloService.wsdl</wsdl-file>
        <jaxrpc-mapping-file>WEB-INF/mapping.xml</jaxrpc-mapping-file>
        <port-component>
          <port-component-name>Hello</port-component-name>
          <wsdl-port>HelloPort</wsdl-port>
          <service-endpoint-interface>org.jboss.chap12.hello.Hello</service-endpoint-interface>
          <service-impl-bean>
            <servlet-link>HelloWorldServlet</servlet-link>
          </service-impl-bean>
        </port-component>
      </webservice-description>
    </webservices>
  • Cryostat -jar.xml 파일이 있으며, 여기에는 Cryostat-RPC 매핑 파일을 참조하는 < service-ref >가 포함되어 있습니다.

7.1.2. Apache CXF Spring 웹 서비스 변경

이전 릴리스의 JBoss EAP에서는 엔드포인트 배포 아카이브와 함께 jbossws-cxf.xml 구성 파일을 포함하여 JBossWS 및 Apache CXF 통합을 사용자 지정할 수 있습니다. 이에 대한 한 가지 사용 사례는 Apache CXF 버스에서 웹 서비스 클라이언트 및 서버 끝점에 대한 인터셉터 체인을 구성하는 것입니다. 이러한 통합에는 Spring이 JBoss EAP 서버에 배포되어야 했습니다.

JBoss EAP 8에서는 Spring 통합이 더 이상 지원되지 않습니다. jbossws-cxf.xml 설명자 구성 파일이 포함된 애플리케이션은 해당 파일에 정의된 사용자 지정 구성을 대체하도록 수정해야 합니다. Apache CXF API에 직접 액세스할 수는 있지만 애플리케이션은 이식할 수 없습니다.

제안된 접근 방식은 Spring 사용자 지정 구성을 가능한 경우 새 JBossWS 설명자 구성 옵션으로 교체하는 것입니다. JBossWS 설명자 기반 접근 방식은 클라이언트 엔드포인트 코드를 수정하지 않고도 유사한 기능을 제공합니다. 경우에 따라 Spring을 CDI(컨텍스트 종속성)로 교체할 수 있습니다.

7.1.2.1. Apache CXF 인터셉터

JBossWS 설명자는 클라이언트 엔드포인트 코드를 수정하지 않고도 인터셉터를 선언할 수 있는 새로운 구성 옵션을 제공합니다. 대신 cxf.interceptors.incxf.interceptors.out 속성의 인터셉터 목록을 지정하여 사전 정의된 클라이언트 및 엔드포인트 구성 내에서 인터셉터를 선언합니다.

다음은 이러한 속성을 사용하여 인터셉터를 선언하는 jaxws-endpoint-config.xml 파일의 예입니다.

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jakartaee="https://jakarta.ee/xml/ns/jakartaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:5.0 schema/jbossws-jaxws-config_5_0.xsd">
  <endpoint-config>
    <config-name>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointImpl</config-name>
    <property>
      <property-name>cxf.interceptors.in</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointInterceptor,org.jboss.test.ws.jaxws.cxf.interceptors.FooInterceptor</property-value>
    </property>
    <property>
      <property-name>cxf.interceptors.out</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointCounterInterceptor</property-value>
    </property>
  </endpoint-config>
</jaxws-config>

7.1.2.2. Apache CXF 기능

JBossWS 설명자를 사용하면 cxf.features 속성에 대한 기능 클래스 이름 목록을 지정하여 사전 정의된 클라이언트 및 엔드포인트 구성 내에서 기능을 선언할 수 있습니다.

다음은 이 속성을 사용하여 기능을 선언하는 jaxws-endpoint-config.xml 파일의 예입니다.

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jakartaee="https://jakarta.ee/xml/ns/jakartaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:5.0 schema/jbossws-jaxws-config_5_0.xsd">
  <endpoint-config>
    <config-name>Custom FI Config</config-name>
    <property>
      <property-name>cxf.features</property-name>
      <property-value>org.apache.cxf.feature.FastInfosetFeature</property-value>
    </property>
  </endpoint-config>
</jaxws-config>

7.1.2.3. Apache CXF HTTP 전송

Apache CXF에서 HTTP 전송 구성은 org.apache.cxf.transport.http.HTTPConduit 옵션을 지정하여 수행할 수 있습니다. JBossWS 통합을 통해 다음과 같이 Apache CXF API를 사용하여 프로그래밍 방식으로 conduit를 수정할 수 있습니다.

import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

// Set chunking threshold before using a JAX-WS port client
...
HTTPConduit conduit = (HTTPConduit)ClientProxy.getClient(port).getConduit();
HTTPClientPolicy client = conduit.getClient();

client.setChunkingThreshold(8192);
...

시스템 속성을 설정하여 Apache CXF HTTPConduit 기본값을 제어하고 재정의할 수도 있습니다.

속성유형설명

cxf.client.allowChunking

부울

청크를 사용하여 요청을 보낼지 여부를 지정합니다.

cxf.client.chunkingThreshold

정수

청크 모드에서 청크 모드로 전환되는 임계값을 설정합니다.

cxf.client.connectionTimeout

long

연결 시간 초과의 시간(밀리초)을 설정합니다.

cxf.client.receiveTimeout

long

수신 시간 초과의 시간(밀리초)을 설정합니다.

cxf.client.connection

문자열

Keep-Alive 또는 close 연결 유형을 사용할지 여부를 지정합니다.

cxf.tls-client.disableCNCheck

부울

CN 호스트 이름 검사를 비활성화할지 여부를 지정합니다.

7.1.3. WS-Security 변경

이 섹션에서는 JBoss EAP 6.4 및 JBoss EAP 7.0에서 애플리케이션에 대한 다양한 WS-Security 변경 사항에 대해 설명합니다.

  • 애플리케이션에 org.apache.ws.security.WSPasswordCallback 클래스에 액세스하는 사용자 지정 콜백 처리기가 포함된 경우 이 클래스가 패키지 org.apache.wss4j.common.ext 로 이동했음을 유의하십시오.
  • org.apache.ws.security.saml.ext 패키지의 대부분의 SAML 8080 개체는 org.apache.wss4j.common.saml 패키지로 이동되었습니다.
  • RSA v1.5 키 전송 및 모든 관련 알고리즘은 기본적으로 허용되지 않습니다.
  • STS(Security Token Service)는 이전에는 onBehalfOf 토큰에서만 검증되었습니다. 이제 ActAs 토큰도 검증합니다. 결과적으로 ActAs 토큰에 대해 제공되는 UsernameToken 에 유효한 사용자 이름과 암호를 지정해야 합니다.
  • 이제 SAML 전달자 토큰에 내부 서명이 필요합니다. org.apache.wss4j.dom.dom.SamlAssertionValidator 클래스에 서명 확인을 활성화하거나 비활성화하는 setRequireBearerSignature() 메서드가 있습니다.

7.1.4. JBoss 모듈 구조 변경

cxf-apicxf-rt-core JAR이 하나의 cxf-core JAR로 병합되었습니다. 그 결과 JBoss EAP의 org.apache.cxf 모듈에는 이제 cxf-core JAR이 포함되어 이전 릴리스보다 더 많은 클래스를 노출합니다.

7.1.5. Bouncy Castle 요구 사항 및 변경 사항

XML/WS-Security의 대칭 암호화에 Galois/Counter Mode(GCM)와 함께 AES 암호화를 사용하려면 BouncyCastle Security Provider가 필요합니다.

JBoss EAP 7부터 org.bouncycastle 모듈에 포함되었으며 JBossWS는 클래스 로더를 사용하여 BouncyCastle 보안 공급자를 가져오고 사용할 수 있었습니다. 따라서 더 이상 현재 JVM에 BouncyCastle을 정적으로 설치할 필요가 없습니다. 컨테이너 외부에서 실행되는 애플리케이션의 경우 클래스 경로에 BouncyCastle 라이브러리를 추가하여 JBossWS에서 보안 공급자를 사용할 수 있습니다.

서버의 jaxws-endpoint-config.xml 배포 설명자 파일에서 org.jboss.ws.cxf.noLocalBC 속성 값을 true 로 설정하거나 서버의 jaxws-client-config.xml 설명자 파일을 클라이언트에 대해 jaxws-client-config.xml 설명자 파일을 설정하여 이 동작을 비활성화할 수 있습니다.

JBoss EAP와 함께 제공되는 버전과 다른 버전을 사용하려면 BouncyCastle을 JVM에 정적으로 설치할 수 있습니다. 이 경우 정적으로 설치된 BouncyCastle Security Provider가 클래스 경로에 있는 공급자를 통해 선택됩니다. 문제가 발생하지 않도록 하려면 BouncyCastle 1.72 이상을 사용해야 합니다.

7.1.6. Apache CXF 버스 선택 전략

컨테이너에서 실행되는 클라이언트의 기본 버스 선택 전략이 THREAD_BUS 에서 TCCL_BUS 로 변경되었습니다. 컨테이너 외부에서 실행되는 클라이언트의 경우 기본 전략은 여전히 THREAD_BUS 입니다. 다음 방법 중 하나를 사용하여 이전 릴리스의 해당 동작을 복원할 수 있습니다.

  • 시스템 속성 org.jboss.ws.cxf.jaxws-client.strategy 값을 THREAD_BUS 로 설정하여 JBoss EAP 서버를 부팅합니다.
  • 클라이언트 코드에서 선택 전략을 명시적으로 설정합니다.

7.1.7. WebServiceRef에 대한 Jakarta XML Web Services 2.2 요구 사항

컨테이너는 웹 서비스 참조에 삽입된 클라이언트를 빌드하기 위해 WebServiceFeature 클래스를 생성자에 인수로 포함하는 Jakarta XML Web Services 2.2 스타일 생성자를 사용해야 합니다. JBossWS 4와 함께 제공되는 JBoss EAP 6.4는 이러한 요구 사항을 숨깁니다. JBossWS 5가 포함된 JBoss EAP 7부터 이 요구 사항은 숨겨지지 않습니다. 이는 사용자가 컨테이너에서 삽입한 서비스 클래스를 제공한 경우 하나 이상의 WebServiceFeature 인수를 포함하는 jakarta.xml.ws.Service 생성자를 사용하도록 기존 코드를 업데이트하여 Jakarta XML Web Services 2.2 이상을 구현해야 합니다.

protected Service(URL wsdlDocumentLocation,
       QName serviceName,
       WebServiceFeature... features)

7.1.8. IgnoreHttpsHost CN check change

이전 릴리스에서는 시스템 속성 org.jboss.security.ignoreHttpsHosttrue 로 설정하여 인증서에 지정된 서비스의 CN(Common Name)에 대해 HTTPS URL 호스트 이름을 비활성화할 수 있습니다. 이 시스템 속성 이름은 cxf.tls-client.disableCNCheck 로 교체되었습니다.

7.1.9. 서버 측 구성 및 클래스 로드

서비스 엔드포인트 및 서비스 클라이언트 처리기에 삽입을 사용하면 더 이상 org.jboss.as.webservices.server.integration JBoss 모듈에서 처리기 클래스를 자동으로 로드할 수 없습니다. 애플리케이션이 사전 정의된 지정된 구성에 종속된 경우 배포에 대한 새 모듈 종속성을 명시적으로 정의해야 할 수 있습니다. 자세한 내용은 명시적 모듈 종속 항목 마이그레이션 을 참조하십시오.

7.1.10. Java 지원 표준 덮어쓰기 메커니즘 사용 중단

Java 지원 표준 덮어쓰기 메커니즘 은 JDK 1.8_40에서 더 이상 사용되지 않으며 JDK 9에서 제거하려고 했습니다. 이 메커니즘을 통해 개발자는 JAR을 JRE 내의 보증 디렉터리에 배치하여 배포된 모든 애플리케이션에서 라이브러리를 사용할 수 있습니다.

JBoss EAP 7 릴리스부터 애플리케이션이 Apache CXF의 JBossWS 구현을 사용한 경우 필요한 종속 항목이 올바른 순서로 추가되므로 이러한 변경의 영향을 받지 않아야 합니다. 애플리케이션이 Apache CXF에 직접 액세스하는 경우 애플리케이션 배포의 일부로 JBossWS 종속성을 사용한 후 Apache CXF 종속 항목을 제공해야 합니다.

7.1.11. EAR 아카이브의 설명자 사양

이전 릴리스의 JBoss EAP에서는 JAR 아카이브의 META-INF/ 디렉터리에 있는 Jakarta Enterprise Cryostats 웹 서비스 배포에 대한 jboss-webservices.xml 배포 설명자 파일을 구성하거나 WAR 아카이브에 번들된 Jakarta Enterprise Cryostats 웹 서비스 끝점을 위한 article -INF/ 디렉터리에 구성할 수 있습니다.

JBoss EAP 7부터는 EAR 아카이브의 META-INF/ 디렉터리에 jboss-webservices.xml 배포 설명자 파일을 구성할 수 있습니다. jboss-webservices.xml 파일이 EAR 아카이브 및 JAR 또는 WAR 아카이브에 있는 경우 JAR에 대한 jboss-webservices.xml 파일의 구성 데이터가 EAR 설명자 파일의 해당 데이터를 덮어씁니다.

7.2. 원격 URL 커넥터 및 포트 업데이트

JBoss EAP 7부터 기본 커넥터가 remote 에서 http-remoting 으로 변경되었으며 기본 원격 연결 포트가 4447 에서 8080 으로 변경되었습니다. 기본 구성에 대한 JNDI 공급자 URL이 remote://localhost:4447 에서 http-remoting://localhost:8080 로 변경되었습니다.

7.3. 메시징 애플리케이션 변경

이 섹션에서는 JBoss EAP 7의 다양한 메시징 애플리케이션 변경 사항에 대해 설명합니다. 또한 다음을 수행하는 방법에 대해 자세히 알아볼 수 있습니다.

  • Jakarta Messaging 배포 설명자 변경
  • 외부 자카르타 메시징 클라이언트 업데이트
  • 더 이상 사용되지 않는 주소 설정 속성 교체
  • 필요한 메시징 애플리케이션 변경 구성

7.3.1. Jakarta Messaging 배포 설명자 교체 또는 업데이트

JBoss EAP 7부터는 이름 지정 패턴 -jms.xml 으로 식별되는 독점 HornetQ 메시징 리소스 배포 설명자 파일이 작동하지 않습니다. 다음은 JBoss EAP 6의 Java Message Service 리소스 배포 설명자 파일의 예입니다.

<?xml version="1.0" encoding="UTF-8"?>
<messaging-deployment xmlns="urn:jboss:messaging-deployment:1.0">
  <hornetq-server>
    <jms-destinations>
      <jms-queue name="testQueue">
        <entry name="queue/test"/>
        <entry name="java:jboss/exported/jms/queue/test"/>
      </jms-queue>
      <jms-topic name="testTopic">
        <entry name="topic/test"/>
        <entry name="java:jboss/exported/jms/topic/test"/>
      </jms-topic>
    </jms-destinations>
  </hornetq-server>
</messaging-deployment>

이전 릴리스에서 애플리케이션에서 -jms.xml Java Message Service 배포 설명자를 사용한 경우 Jakarta EE 플랫폼의 리소스 정의 및 구성 섹션에 지정된 표준 배포 설명자를 사용하도록 애플리케이션을 변환하거나 대신 messaging-activemq-deployment 스키마를 사용하도록 배포 설명자를 업데이트할 수 있습니다. 설명자를 업데이트하도록 선택하는 경우 다음과 같은 사항을 수정해야 합니다.

  • 네임스페이스를 "urn:jboss:messaging-deployment:1.0"에서 "urn:jboss:messaging-activemq-deployment:1.0"으로 변경합니다.
  • < hornetq-server > 요소 이름을 < server>로 변경합니다.

수정된 파일은 다음 예와 같아야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<messaging-deployment xmlns="urn:jboss:messaging-activemq-deployment:1.0">
  <server>
    <jms-destinations>
      <jms-queue name="testQueue">
        <entry name="queue/test"/>
        <entry name="java:jboss/exported/jms/queue/test"/>
      </jms-queue>
      <jms-topic name="testTopic">
        <entry name="topic/test"/>
        <entry name="java:jboss/exported/jms/topic/test"/>
      </jms-topic>
    </jms-destinations>
  </server>
</messaging-deployment>

7.3.2. HornetQ API 교체

JBoss EAP 6에는 애플리케이션 소스 코드에서 HornetQ API를 사용할 수 있는 org.hornetq 모듈이 포함되어 있었습니다.

Apache ActiveMQ Artemis는 JBoss EAP 7의 HornetQ를 대체하므로 Apache ActiveMQ Artemis API 를 사용하려면 HornetQ API를 사용하는 모든 코드를 마이그레이션해야 합니다. 이 API의 라이브러리는 org.apache.activemq.artemis 모듈에 포함되어 있습니다.

ActiveMQ Artemis는 HornetQ의 진화로, 많은 개념이 여전히 적용됩니다.

7.3.3. 더 이상 사용되지 않는 주소 설정 속성 교체

auto-create-jms-queues,auto-delete-jms-queues, auto-create-jms-topics ,auto-delete-jms-topics 속성 및 auto-delete-jms-topics 속성만 부분적으로 구현되고 JBoss EAP 7에서 완전히 구성할 수 없었습니다. 더 이상 사용되지 않는 이러한 속성은 기술 프리뷰 기능으로 만 제공되었으며 지원되지 않았습니다.

더 이상 사용되지 않는 이러한 특성을 다음과 같은 대체 속성으로 교체해야 합니다.

참고

JBoss EAP 8.0 이후 더 이상 사용되지 않는 속성은 이 기능을 구성하지 않으며 적용되지 않습니다. 교체 속성은 지원되지 않습니다. 최상의 노력으로 마이그레이션하기 위한 방법으로만 제공됩니다.

더 이상 사용되지 않는 속성대체 속성

auto-create-jms-queues

auto-create-queues

auto-delete-jms-queues

auto-delete-queues

auto-create-jms-topics

auto-create-addresses

auto-delete-jms-topics

auto-delete-addresses

JBoss EAP 6에서 기본 주소 설정 속성이 false 로 설정되었습니다. JBoss EAP 7부터는 대체 속성이 기본적으로 true 로 설정됩니다.

JBoss EAP 6 동작을 유지하려면 교체 속성을 false 로 설정해야 합니다.

이러한 교체 속성에 대한 자세한 내용은 JBoss EAP 7.4 Configuring Messaging Guide주소 설정 특성을 참조하십시오.

7.3.4. JBoss EAP 7에 필요한 메시징 애플리케이션 변경

JBoss EAP 7.2부터 클라이언트 애플리케이션이 Artemis 클라이언트 JAR(예: Artemis -jms-client ,artemis- commons, artemis-client 또는 artemis- selector )에 직접 의존하는 경우 wildfly-client-properties 에 대해 pom.xml 파일에 다음 종속성을 추가해야 합니다.

<dependency>
  <groupId>org.jboss.eap</groupId>
  <artifactId>wildfly-client-properties</artifactId>
</dependency>

이는 JBEAP-15889 에 설명된 대로 message.getJMSReplyTo() 에서 message.getJMSReplyTo()를 호출할 때 JMSRuntimeException 을 방지하기 위한 것입니다.

7.4. Jakarta RESTful 웹 서비스 및 REST Cryostat 애플리케이션 변경

JBoss EAP 6 번들 REST Cryostat 2는 Cryostat-RS 1.x의 구현이었습니다.

JBoss EAP 7 및 JBoss EAP 7.1에는 REST Cryostat 3.0.x가 포함되어 있습니다. 이 REST Cryostat 3.0.x는 Cryostat 339: Cryostat-RS 2.0: RESTful Web Services 사양에 정의된 대로 Cryostat-RS 2.0의 구현입니다.

JBoss EAP 7.4에는 Jakarta RESTful Web Services 2.1 의 구현인 REST Cryostat 3.15가 포함되어 있습니다. 이 릴리스에는 JDK 11에 대한 지원도 추가되었습니다. 일부 REST Cryostat 4 주요 기능을 제공하는 동안 이 릴리스는 REST Cryostat 3.0을 기반으로 하므로 이전 버전과의 호환성을 완전히 유지할 수 있습니다. 따라서 REST Cryostat 3.0에서 REST Cryostat 3.15로 마이그레이션할 때 몇 가지 문제가 발생할 수 있습니다. REST Cryostat REST Cryostat 3.15용 Java API에 대한 자세한 내용은 REST Cryostat Jakarta RESTful Web Services 3.15.0.Final API 를 참조하십시오.

JBoss EAP 8.0은 Jakarta RESTful Web Services 3.1 사양 을 구현하는 REST Cryostat 6.2를 지원합니다.

JBoss EAP 6.4에서 마이그레이션하는 경우 JBoss EAP에 포함된 Jackson 버전이 변경되었음을 유의하십시오. JBoss EAP 6.4에는 jackson 1.9.9가 포함되었습니다. JBoss EAP 7 이상에는 jackson 2.6.3 이상이 포함됩니다.

이 섹션에서는 이러한 변경 사항이 REST Cryostat 또는 Jakarta RESTful Web Services를 사용하는 애플리케이션에 미치는 영향에 대해 설명합니다.

7.4.1. REST Cryostat 더 이상 사용되지 않는 클래스

인터셉터 및 MessageBody 클래스

Cryostat 311: Cryostat-RS: RESTful Web Services용 Java™ API에는 인터셉터 프레임워크가 포함되어 있지 않아 REST Cryostat 2가 제공되었습니다. Cryostat 339: Cryostat-RS 2.0: RESTful Web Services를 위한 Java API는 공식 인터셉터 및 필터 프레임워크를 도입했기 때문에 REST Cryostat 2에 포함된 인터셉터 프레임워크는 더 이상 사용되지 않으며 REST Cryostat 3.x의 Jakarta REST 호환 인터셉터 기능으로 대체되었습니다. 관련 인터페이스는 jakarta.ws.rs.api 모듈의 jakarta.ws.ext 패키지에 정의됩니다.

다음 공급자가 JBoss EAP 8.0에서 제거되었습니다.

  • org.jboss.resteasy:resteasy-jackson-provider
  • org.jboss.resteasy:resteasy-jettison-provider
  • org.jboss.resteasy:resteasy-yaml-provider

다음은 Jakarta RESTful Web Services 대체가 있으므로 JBoss EAP 8.0에서 제거되었습니다.

참고

이전 REST Cryostat 릴리스의 모든 인터셉터는 새로운 Jakarta REST 필터 및 인터셉터 인터페이스와 병렬로 실행할 수 있습니다.

클라이언트 API

resteasy-jaxrs 의 REST Cryostat 클라이언트 프레임워크는 JBoss EAP 7.0의 Cryostat-RS 2.0 호환 resteasy-client 모듈로 교체되었습니다. 결과적으로 일부 REST Cryostat 클라이언트 API 클래스 및 메서드는 더 이상 사용되지 않습니다.

참고

org.jboss.resteasy.client.jaxrs API 클래스에 대한 자세한 내용은 REST Cryostat Jakarta REST JavaDoc 를 참조하십시오.

StringConverter

org.jboss.resteasy.spi.StringConverter 클래스는 REST Cryostat 3.x 및 JBoss EAP 8.0에서 더 이상 사용되지 않습니다. 이 기능은 Jakarta REST jakarta.ws.rs.ext.ParamConverterProvider 클래스를 사용하여 교체할 수 있습니다.

7.4.2. 제거 또는 REST Cryostat 클래스

ResteasyProviderFactory 메서드 추가

대부분의 org.jboss.resteasy.spi.ResteasyProviderFactory add() 메서드가 REST Cryostat 3.0에서 제거되거나 보호됩니다. 예를 들어 add builtInMessageBody Cryostat()addbuiltInMessageBodyWriter() 메서드가 제거되고 addMessageBody Cryostat()addMessageBodyWriter() 메서드가 보호되었습니다.

이제 registerProvider()registerProviderInstance() 메서드를 사용해야 합니다.

REST Cryostat 3에서 제거된 추가 클래스

Jakarta REST 메서드에 대한 응답을 캐시해야 하는 @org.jboss.resteasy.annotations.cache.ServerCached 주석은 REST Cryostat 3에서 제거되었으며 애플리케이션 코드에서 제거해야 합니다.

7.4.3. 추가 REST Cryostat 변경

이 섹션에서는 JBoss EAP용 REST Cryostat의 몇 가지 추가 변경 사항에 대해 설명합니다.

SignedInput 및 SignedOuput
  • resteasy-crypto 에 대한 SignedInputSignedOutput 의 경우 Content-TypeRequest 또는 Response 오브젝트에서 multipart/signed 또는 @Consumes 또는 @Produces 주석을 사용하여 multipart/signed로 설정해야 합니다.
  • SignedOutputSignedInput 을 사용하여 @Produces 또는 @Consumes 주석에 유형을 설정하여 바이너리 형식으로 application/pkcs7-signature MIME 유형 형식을 반환할 수 있습니다.
  • @Produces 또는 @Consumestext/plain MIME 유형인 경우 SignedOutput 은 base64로 인코딩되고 문자열로 전송됩니다.
보안 필터

@RolesAllowed,@PermitAll@DenyAll 에 대한 보안 필터는 이제 "401 Unauthorized" 대신 "403 Forbidden"을 반환합니다.

클라이언트 측 필터

Cryostat-RS 2.0에 도입된 클라이언트 측 필터는 REST Cryostat 3.0 이전 릴리스의 REST Cryostat 클라이언트 API를 사용할 때 바인딩 및 실행되지 않습니다.

비동기 HTTP 지원

Cryostat-RS 2.0 사양은 @Suspended 주석 및 AsynResponse 인터페이스를 사용하여 비동기 HTTP 지원을 추가했기 때문에 비동기 HTTP의 REST Cryostat 전용 API는 더 이상 사용되지 않으며 향후 REST Cryostat 릴리스에서 제거될 수 있습니다. 비동기 Tomcat 및 비동기 JBoss Web 모듈도 서버 설치에서 제거되었습니다. Servlet 3.0 컨테이너 이상을 사용하지 않는 경우 비동기 HTTP 서버 측 처리가 시뮬레이션되어 동일한 요청 스레드에서 동시에 실행됩니다.

서버 측 캐시

서버 측 캐시 설정이 변경되었습니다. 자세한 내용은 REST Cryostat 문서를 참조하십시오.

YAML 공급자 설정 변경 사항

이전 릴리스의 JBoss EAP에서는 REST Cryostat YAML 공급자 설정이 기본적으로 활성화되어 있었습니다. 이는 JBoss EAP 7에서 변경되었습니다. 이제 YAML 공급자가 기본적으로 비활성화되어 있습니다. 그 사용은 unmarshalling에 사용되는 SnakeYAML 라이브러리의 보안 문제로 인해 지원되지 않으며 애플리케이션에서 명시적으로 활성화해야 합니다. 애플리케이션에서 YAML 공급자를 활성화하고 Maven 종속성을 추가하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 Developing Web Services ApplicationsYAML 공급자 를 참조하십시오.

Content-Type Header의 기본 Charset UTF-8

JBoss EAP 7.1부터 resteasy.add.charset 매개 변수는 기본적으로 true 로 설정됩니다. 명시적 charset 없이 resource 메서드에서 text/* 또는 application/xml* 미디어 유형을 반환하면 REST Cryostat가 반환된 content-type 헤더에 charset=UTF-8 을 추가하지 않으려면 resteasy.add.charset 매개변수를 false 로 설정할 수 있습니다.

텍스트 미디어 유형 및 문자 세트에 대한 자세한 내용은 JBoss EAP 7.4 Developing Web Services Applications텍스트 미디어 유형 및 문자 집합 을 참조하십시오.

SerializableProvider

신뢰할 수 없는 소스에서 Java 개체를 역직렬화하는 것은 안전하지 않습니다. 이러한 이유로 JBoss EAP 7부터 org.jboss.resteasy.plugins.providers.SerializableProvider 클래스는 기본적으로 비활성화되어 있으며 이 공급자를 사용하지 않는 것이 좋습니다.

리소스 메서드에 대한 요청 일치

REST Cryostat 3에서는 Cryostat-RS 사양에 정의된 일치 규칙 구현에 대한 개선 및 수정이 수행되었습니다. 특히 하위 리소스 메서드 및 하위 리소스 메서드의 모호한 URI를 처리하는 방법에 대한 변경이 수행되었습니다.

REST Cryostat 2에서는 동일한 URI가 있는 다른 하위 리소스가 있는 경우에도 하위 리소스를 성공적으로 실행할 수 있었습니다. 이 동작은 사양에 따라 올바르지 않았습니다.

REST Cryostat 3에서는 하위 리소스 및 하위 리소스에 대한 모호한 URI가 있는 경우 하위 리소스를 호출하는 것은 성공할 수 있지만 하위 리소스 호출은 HTTP 상태 405 Method Not Allowed 오류가 발생합니다.

다음 예제에는 하위 리소스 메서드 및 하위 리소스 Cryostat에 대한 모호한 @Path 주석이 포함되어 있습니다. 두 끝점 모두에 대한 URI, anotherResourceanotherResourceLocator 는 동일합니다. 두 끝점의 차이점은 anotherResource 메서드가 REST 동사인 POST 와 연결되어 있다는 것입니다. anotherResourceLocator 메서드는 REST 동사와 연결되어 있지 않습니다. 사양에 따라 REST 동사가 있는 끝점(이 경우 anotherResource 메서드)이 항상 선택됩니다.

@Path("myResource")
public class ExampleSubResources {
    @POST
    @Path("items")
    @Produces("text/plain")
    public Response anotherResource(String text) {
        return Response.ok("ok").build();
    }

    @Path("items")
    @Produces("text/plain")
    public SubResource anotherResourceLocator() {
        return new SubResource();
    }
}

7.4.4. REST Cryostat SPI 변경

REST Cryostat SPI 공급자가 JBoss EAP 8에서 제거되었습니다.

SPI Exceptions

모든 SPI 실패 예외는 더 이상 사용되지 않으며 내부적으로 사용되지 않습니다. 해당 Jakarta REST 예외로 교체되었습니다.

더 이상 사용되지 않는 예외jaxrs-api 모듈의 Exception 교체

org.jboss.resteasy.spi.ForbiddenException

jakarta.ws.rs.ForbiddenException

org.jboss.resteasy.spi.MethodNotAllowedException

jakarta.ws.rs.NotAllowedException

org.jboss.resteasy.spi.NotAcceptableException

jakarta.ws.rs.NotAcceptableException

org.jboss.resteasy.spi.NotFoundException

jakarta.ws.rs.NotFoundException

org.jboss.resteasy.spi.UnauthorizedException

jakarta.ws.rs.NotAuthorizedException

org.jboss.resteasy.spi.UnsupportedMediaTypeException

jakarta.ws.rs.NotSupportedException

InjectorFactory 및 Registry

InjectorFactoryRegistry SPI가 변경되었습니다. 문서화 및 지원되는 REST Cryostat를 사용하는 경우 이 문제는 문제가 되지 않습니다.

7.4.5. jackson 공급자 변경

JBoss EAP 6.4에 포함된 jackson 버전이 변경되었습니다. JBoss EAP 7부터는 jackson 공급자가 resteasy-jackson-provider 에서 resteasy-jackson2-provider 로 변경되었습니다.

resteasy-jackson2-provider 로 업그레이드하려면 일부 패키지를 변경해야 합니다. 예를 들어 jackson 주석 패키지가 org.codehaus.jackson.annotate 에서 com.fasterxml.jackson.annotation 로 변경되었습니다.

7.4.6. Spring REST Cryostat 통합 변경 사항

JBoss EAP 8.0은 REST Cryostat 6.2를 지원합니다. JBoss EAP 8.0과 함께 Spring 6.0 프레임워크를 사용하려면 Java 17을 사용해야 합니다.

Spring 4.0 프레임워크에는 Java 8 지원이 도입되었습니다. REST Cryostat 3.x 통합을 Spring과 통합하려는 경우 JBoss EAP 7에서 지원하는 가장 빠른 안정적인 버전이므로 4.2.x를 배포에서 최소 Spring 버전으로 지정해야 합니다.

7.4.7. REST Cryostat Cryostattison JSON 공급자 변경

REST Cryostat Cryostattison JSON 공급자는 JBoss EAP 7 이후 더 이상 사용되지 않으며 기본적으로 배포에 더 이상 추가되지 않습니다. 권장되는 REST Cryostat Jackson 공급자로 전환하는 것이 좋습니다. 다음 예에 설명된 대로 Cryostat 공급자를 계속 사용하려면 jboss-deployment-descriptor.xml 파일에서 이에 대한 명시적 종속성을 정의해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
      <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
    </exclusions>
    <dependencies>
      <module name="org.jboss.resteasy.resteasy-jettison-provider" services="import"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

명시적 종속성을 정의하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드에서 배포에 Explicit 모듈 종속성 추가 를 참조하십시오.

7.4.8. MicroProfile for JBoss EAP

MicroProfile 은 개발자가 애플리케이션을 수정하거나 다시 패키징하지 않고도 여러 환경에서 실행되도록 애플리케이션 및 마이크로서비스를 구성하는 데 사용할 수 있는 사양의 이름입니다. 이전에는 MicroProfile 을 기술 프리뷰로 JBoss EAP 7.3에서 사용할 수 있었지만 이후 제거되었습니다. MicroProfile 은 이제 JBoss EAP XP에서만 사용할 수 있습니다.

추가 리소스

7.5. CDI 애플리케이션 변경

JBoss EAP 8.0에는 CDI 4.0 지원이 포함되어 있습니다. 결과적으로 이전 CDI 릴리스를 사용하여 작성된 애플리케이션에서 JBoss EAP 8.0으로 마이그레이션할 때 동작의 일부 변경 사항을 확인할 수 있습니다. 이 섹션에는 이러한 변경 사항 중 일부만 요약되어 있습니다.

Weld 및 CDI 4.0에 대한 자세한 내용은 다음을 참조하십시오.

7.5.1. Cryostat 아카이브

활성화된 빈의ans 클래스를 Quarkus 아카이브에 배포하여 CDI에서 검색되고 빈으로 처리되도록 해야 합니다.

CDI 1.1에서는 주석 또는 하나 이상의 세션 빈이 포함된 하나 이상의ans 클래스를 포함하는 아카이브인 암시적 chain 아카이브가 도입되었습니다. 암시적 Cryostat 아카이브는 CDI에서 스캔하며, 유형 검색 중에 annotations이 정의된 class만 검색됩니다. 자세한 내용은 Java 2.0의 Type 및 Cryostat Discovery: Contexts and dependency Cryostat for Java ™ 를 참조하십시오. 주석을 정의하는 Quarkus에 해당하는 Jakarta는 Jakarta ContextDependions 2.0 사양에 정의되어 있습니다.

In CDI 4.0:

  • 아카이브는 beans.xml의 버전 번호가 있는지 여부를 구분하지 않습니다.
  • 빌드 호환 확장 기능 외에도 아카이브에는 beans.xml 파일이 없는 아카이브도 포함되어 있습니다. 빌드 호환 확장은 metrics 아카이브가 아닙니다.
  • 빈 beans.xml 파일이 있는 아카이브의 기본 검색 모드는 all 대신 annotated 으로 설정됩니다. 예를 들어, beans.xml 파일이 비어 있는 경우 명시적VLAN 아카이브 대신 암시적 8080 아카이브입니다.
  • 두 경우 모두, 빈 검색 요소는 beans.xml 파일을 사용한 아카이브 간의 영향을 받지 않습니다.

CDI 4.0에 대한 자세한 내용은 자카르타 컨텍스트 및 종속성 4.0을 참조하십시오.

Cryostat 아카이브에는 모든 주석 또는주석 처리 모드가 있습니다. 비어 있지 않은 beans.xml을 포함하는 Cryostat 아카이브는 8080-discovery-mode 속성을 지정해야 합니다. 특성의 기본값은 주석이 있습니다.

다음과 같은 경우 아카이브는 Cryostat 아카이브가 아닙니다.

  • 빈.xml 파일이 포함되어 있으며, blank-discovery-modenone 입니다.
  • 이식 가능한 확장 또는 빌드 호환 확장 기능 및 beans.xml 파일이 포함되어 있습니다.

아카이브는 다음의 경우 명시적 Cryostat 아카이브입니다.

  • 아카이브에는 모든빈-discovery-mode 가 있는 beans.xml 파일이 포함되어 있습니다.

아카이브는 다음의 경우 암시적 Cryostat 아카이브입니다.

  • 아카이브에는 비어 있는 beans.xml 파일이 포함되어 있습니다.
  • 아카이브에는 beans.xml 파일이 포함되어 있지 않아도 annotations을 정의하는 Quarkus 클래스 또는 하나 이상의 세션 빈이 포함되어 있습니다.

CDI 1.2 제한을 통해 주석을 다음과 같이 정의합니다.

  • @ApplicationScoped,@SessionScoped,@ConversationScoped, @RequestScoped 주석
  • 기타 모든 일반 범위 유형
  • @intercept or 및 @Decorator 주석
  • @Stereotype으로 주석에 추가되는 모든stereotype 주석
  • @dependent scope 주석

7.5.2. 자세한 내용은 Conversation Resolution

CDI 사양 발행 CDI-411에 설명된 대로 서블릿 사양과의 충돌을 방지하기 위해 CDI 1.2에서 대화 컨텍스트 라이프사이클이 변경되었습니다. 대화 범위는 모든 서블릿 요청 중에 활성화되며 다른 서블릿 또는 서블릿 필터가 요청 본문 또는 문자 인코딩을 설정하지 못하도록해서는 안 됩니다. 자세한 내용은 Jakarta EE의 대화 컨텍스트 라이프사이클을 참조하십시오.

7.5.3. 관찰자 확인

CDI 1.2에서 이벤트 해상도를 부분적으로 다시 작성했습니다. CDI 1.0에서 관찰자 메서드에 모든 이벤트 한정자가 있는 경우 이벤트가 관찰자 메서드로 전달됩니다. CDI 1.2에서 관찰자 메서드에 이벤트 한정자가 없거나 이벤트 한정자의 하위 집합이 있는 경우 이벤트가 관찰자 메서드로 전달됩니다. 자세한 내용은 Observer resolution 을 참조하십시오.

7.6. HTTP 세션 ID 변경

HTTP 세션에 할당된 고유 ID를 가져오기 위해 request.getSession().getId() 호출에서 반환된 문자열이 JBoss EAP 6.4와 JBoss EAP 7 간에 변경되었습니다.

JBoss EAP 6.4는 session-id.instance-id 형식으로 세션 ID와 인스턴스 ID를 모두 반환했습니다.

JBoss EAP 7 및 EAP 8은 세션 ID만 반환합니다.

이러한 변경으로 인해 JBoss EAP 6에서 JBoss EAP 8로 일부 업그레이드에 대한 경로 없는 쿠키 문제가 발생할 수 있습니다. 애플리케이션이 이 메서드 호출의 반환 값을 기반으로 JSESSIONID 쿠키를 다시 생성하는 경우 원하는 동작을 제공하도록 애플리케이션 코드를 업데이트해야 할 수 있습니다.

7.7. 명시적 모듈 종속 항목 마이그레이션

이전 릴리스의 JBoss EAP에 모듈식 클래스 로드 시스템 및 JBoss 모듈이 도입되어 애플리케이션에서 사용할 수 있는 클래스를 세밀하게 제어할 수 있었습니다. 이 기능을 사용하면 애플리케이션의 MANIFEST.MF 파일 또는 jboss-deployment-structure.xml 배포 설명자 파일을 사용하여 명시적 모듈 종속성을 구성할 수 있습니다.

애플리케이션에 명시적 모듈 종속성을 정의한 경우 JBoss EAP 7에서 다음과 같은 변경 사항을 알고 있어야 합니다.

가용성에 대한 종속성 검토

JBoss EAP에 포함된 모듈이 변경되었습니다. 애플리케이션을 JBoss EAP 7로 마이그레이션할 때 MANIFEST.MFjboss-deployment-structure.xml 파일 항목을 검토하여 제품의 이 릴리스에서 제거되거나 더 이상 사용되지 않는 모듈을 참조하지 않는지 확인합니다.

주석 검사가 필요한 종속성

이전 릴리스의 JBoss EAP에서 Clevis 인터셉터를 선언할 때와 같이 주석 스캔 중에 종속성에 처리해야 하는 주석이 포함된 경우 새 JAR 파일에 Jandex 인덱스를 생성하고 추가한 다음 MANIFEST.MF 또는 jboss-deployment-structure.xml 배포 설명자 파일에 플래그를 설정해야 했습니다.

JBoss EAP 7은 이제 정적 모듈에 대한 자동 런타임 생성 주석 인덱스를 제공하므로 더 이상 수동으로 생성할 필요가 없습니다. 그러나 아래에 설명된 대로 애플리케이션의 MANIFEST.MF 파일 또는 jboss-deployment-structure.xml 배포 설명자 파일에 주석 플래그를 추가해야 합니다.

예: MANIFEST.MF 파일의 주석 플래그

Dependencies: com.company.my-ejb annotations, com.company.other

예: jboss-deployment-structure.xml 파일의 주석 플래그

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="com.company.my-ejb" annotations="true"/>
      <module name="com.company.other"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

7.8. Hibernate 변경

JBoss EAP 8에는 Java 프로그래밍 언어를 위한 개체 관계형 매핑 툴인 Hibernate ORM 6.2 지원이 포함되어 있습니다. Hibernate ORM 6.2 설명서에 대한 자세한 내용은 Hibernate ORM 6.2 를 참조하십시오.

JBoss EAP 7.4에서 JBoss EAP 8.0으로 마이그레이션하는 경우 Hibernate ORM 버전의 특정 Hibernate ORM 마이그레이션 설명서를 참조하십시오.

  • JBoss EAP 7.4에서 JBoss EAP 8로 마이그레이션하려면 다음 단계를 완료해야 합니다.

    • Hibernate ORM 5.3에서 5.4로 마이그레이션
    • Hibernate ORM 5.4에서 5.5로 마이그레이션
    • Hibernate ORM 5.5에서 5.6로 마이그레이션
    • Hibernate ORM 5.6에서 6.0으로 마이그레이션
    • Hibernate ORM 6.0에서 6.1으로 마이그레이션
    • Hibernate ORM 6.1에서 6.2로 마이그레이션
    • Hibernate ORM 입문
    • 더 이상 사용되지 않는 Hibernate ORM 클래스
    • Hibernate ORM 클래스 포함
    • Hibernate ORM 내부
  • 이전 버전의 JBoss EAP 및 Hibernate에서 마이그레이션하려면 다음 단계를 완료해야 합니다.

    • Hibernate ORM 4.3에서 Hibernate ORM 5.0으로 마이그레이션
    • Hibernate ORM 5.0에서 Hibernate ORM 5.1로 마이그레이션
    • Hibernate ORM 5.1 및 Hibernate ORM 5.2에서 Hibernate ORM 5.3으로 마이그레이션

7.8.1. Hibernate ORM 5.3에서 5.4로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 5.3에서 5.4로 마이그레이션할 때 필요한 변경 사항을 중점적으로 설명합니다. Hibernate ORM 5.3과 Hibernate ORM 5.4 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 5.4 마이그레이션 가이드를 참조하십시오.

알려진 변경 사항

다음은 Hibernate ORM 버전 5.3에서 5.4로 마이그레이션할 때의 몇 가지 변경 사항에 대해 설명합니다.

7.8.1.1. 지연된 ID 삽입 동작 덮어쓰기

  • Hibernate 5.3에서 DelayedPostInsertIdentifier 동작이 FlushMode 또는 FlushModeType 값에 따라 영향을 받을 수 있도록 지원이 제공되어 Extended PersistenceContext 지원이 향상되었습니다. 안타깝게도 이러한 변화에는 몇 가지 문제가 포함되어 있었습니다.
  • Hibernate 5.4에서는 가능한 한 많은 Hibernate 5.3 동작을 유지하고 선택한 사용 사례에 대해 매우 구체적인 지연PostInsertIdentifier 동작만 복원하기로 결정했습니다.
  • Hibernate 5.4를 보다 유연하게 만들기 위해 Hibernate 5.3 동작을 완전히 비활성화하고 Hibernate 5.2 및 이전 버전으로 되돌리는 임시 솔루션으로 구성 옵션이 추가되었습니다.

7.8.1.2. SQL Server JDBC Driver 버전이 최소 6.1.2로 업그레이드

HHH-12973 수정으로 인해 JDBC 드라이버 버전을 6.1.2로 업그레이드해야 합니다. 이 문제로 인해 이전 버전의 SQL Server JDBC 드라이버는 데이터베이스 연결을 닫지 않고 INFORMATION_SCHEMA.SEQUENCES 를 검사할 수 없습니다.

7.8.2. Hibernate ORM 5.4에서 5.5로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 5.4에서 5.5로 마이그레이션할 때 필요한 변경 사항을 중점적으로 설명합니다. Hibernate ORM 5.4와 Hibernate ORM 5.5 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 5.5 마이그레이션 가이드를 참조하십시오.

알려진 변경 사항

Hibernate ORM 5.5 버전은 5.4 유지 관리 릴리스에 적용된 모든 버그 수정을 포함하고 Jakarta 지속성 API에 대한 지원을 도입하므로 Hibernate ORM 5.4와 유사합니다.

7.8.2.1. Dom4J 기반 XML 매핑

Hibernate의 XML 매핑 정의 구문 분석 구현은 이 종속성을 제거하기 위한 지속적인 진행 상황을 보장하기 위해 Cryostat4J를 기반으로 재작업을 수행했습니다.

7.8.2.2. "enhanced proxies" 기능을 비활성화하는 기능 제거

"승인된 프록시" 기능은 Hibernate 5.3의 선택적 성능 개선 기능으로 도입되었습니다. 이 기능은 이제 영구적으로 활성화됩니다.

7.8.3. Hibernate ORM 5.5에서 5.6로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 5.5에서 5.6로 마이그레이션할 때 필요한 변경 사항을 중점적으로 설명합니다. Hibernate ORM 5.5 및 Hibernate ORM 5.6 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 5.6 마이그레이션 가이드를 참조하십시오.

더 이상 사용되지 않는 기능

Hibernate 5.6 버전은 이전 Hibernate 5.5 버전과 매우 유사하며, 이전 Hibernate 릴리스에서 더 이상 사용되지 않는 일부 기능은 제거되지 않습니다.

7.8.3.1. Javassist 제거

더 이상 엔터티의 바이트 코드 개선에 사용할 구현으로 javassist 를 선택할 수 없습니다. byte Buddy 는 기본값이며 javassist 는 잠시 더 이상 사용되지 않으며 이제 제거되었습니다. 이는 애플리케이션에 기능적인 영향을 미치지 않습니다 . hibernate.bytecode.provider=javassist 속성을 구성하는 데 더 이상 유효하지 않은 유일한 예외가 있습니다. 이 페타르를 사용하는 경우 이 속성을 제거할 수 있습니다. Hibenate ORM이 더 이상 종속 항목 간에 javassist 를 나열하지 않는 문제가 발생할 수 있습니다.

7.8.4. Hibernate ORM 5.6에서 6.0으로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 5.6에서 6.0으로 마이그레이션할 때 필요한 변경 사항을 설명합니다. Hibernate ORM 5.6과 Hibernate ORM 6.0 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 6.0 마이그레이션 가이드를 참조하십시오.

Hibernate 6.0 릴리스에는 다음과 같은 변경 사항이 포함되어 있습니다.

  • Java 11은 Hibernate 6.0의 최소 호환 가능 기준 버전입니다.
  • Jakarta Persistence: Hibernate ORM 6.0 릴리스의 또 다른 중요한 변경 사항은 Jakarta EE 사양에 정의된 Java EE 사양에서 자카르타 지속성에 정의된 대로 Java Persistence에서 정의한 대로 이동하는 것을 포함합니다. 이러한 변경으로 인한 가장 중요한 영향은 Java Persistence가 javax.persistence인 Java Persistence 대신 jakarta.persistence 클래스 jakarta.persistence 클래스를 사용하는 것입니다.*
  • JDBC에서 읽기: Hibernate ORM 6.0 버전의 개발의 또 다른 이유는 JDBC ResultSet에서 이름(read-by-name)에서 결과를 읽어 위치(읽기별)로 결과를 읽는 것입니다. 이러한 변경으로 처리량 테스트를 진행하여 스케일링을 개선했습니다.
  • 생성된 SQL: 이 기능으로 인해 다음과 같은 향상된 기능이 생성되었습니다.

    • 열 별칭은 더 이상 생성되지 않음
    • 열 참조는 "unique-d"입니다.
    • 조인의 정의 및 불필요한 조인의 더 나은 결정(두 번째 테이블, 상속 테이블)
  • Object - 이전 버전의 Hibernate에서는 모든 식별자 유형이 Serializable 을 구현해야 했으며, Hibernate 6.0에서는 식별자가 임의의 Object 가 될 수 있으므로 이 제한을 제거했습니다. 이 변경 사항은 Serializable 을 사용하여 이전에 정의한 많은 API 및 SPI 메서드에 영향을 미칩니다.
  • @IdGeneratorType: 이 릴리스에서는 @IdGeneratorType 주석을 사용하여 유형 안전한 방식으로 ID 생성을 위한 사용자 정의 생성기를 정의할 수 있습니다.
  • 암시적 식별자 시퀀스 및 테이블 이름: Hibernate가 식별자 생성과 연관된 시퀀스 및 테이블에 대한 암시적 이름을 결정하는 방법이 Hibernate 6.0에서 수정되었으며, 이는 사용자가 애플리케이션을 마이그레이션하는 데 영향을 미칠 수 있습니다. 이번 릴리스에서는 Hibernate가 기본적으로 단일 시퀀스 hibernate_sequence 대신 엔티티 계층 구조당 시퀀스를 생성합니다.
  • 암시적 시퀀스 생성기의 기본값: 이전에 hibernate_sequence 와 같은 Implicit 시퀀스는 이제 JPA @SequenceGenerator 주석의 기본값을 따릅니다. 즉, 시퀀스의 할당 크기는 50입니다.
  • 유형 시스템: Hibernate 6.0이 주요 릴리스이므로, 또 다른 중요한 변경 사항은 Hibernate의 매핑 주석을 수정하고 이를 보다 안전하게 만드는 것이었습니다. 이 기능은 이 릴리스에서 읽기별 변경 사항을 구현하기 위해 유형 관련 계약이 이미 변경되었기 때문에 이 기능을 제공하기로 결정했습니다.
  • 쿼리: 쿼리 기능에 많은 변경 사항이 도입되었습니다. 전용 트리 구조로 이동하여 HQL 및 Criteria 쿼리를 모델링하고, 삽입, 업데이트, 삭제와 같은 대규모 SQM DML 명령 구현, hibernate.criteria.copy_tree 속성의 동작 변경 및 이 릴리스에 패스스루 토큰 포함과 같은 쿼리 기능이 도입되었습니다.
  • #onSave 메서드의 서명 변경: #onSave 메서드의 서명이 부울 onSave(Object 엔터티, Serializable id, Object[] state, String[] propertyNames, Type[] 유형) 에서 부울 onSave(Object entity, Object[] state, Object [] state, Type[] propertyNames, Type[] types) 에서 부울로 변경되었습니다.
  • 가져오기 원형 결정: 이전 버전의 Hibernate가 깊이 우선적인 접근 방식을 사용하여 페치된 페치된 페치(Parther-first) 접근 방식을 사용하여, 경우에 따라 홀수의 "회용성" 결정이 초래되기도 합니다. Hibernate 6.0부터 이제 가져오기 결정이 먼저 너비를 사용하여 수행됩니다.
  • org.hibernate.loader 재구성: loader.collection 패키지의 콘텐츠가 loader.ast.spiloader.ast.internal 로 재구성되어 SQM API에 맞게 조정되었습니다.
  • SQL 패키지 재구성: sql.ordering 의 내용이 metamodel.mapping.ordering.ast 로 이동되었습니다.
  • hbm.xml 매핑 사용 중단: 레거시 hbm.xml 매핑 형식은 더 이상 사용되지 않으며 6.x 이상으로 더 이상 지원되지 않습니다.
  • lazy association adherance: Hibernate 6.0, fetch="join" 또는 @Fetch(FetchMode.JOIN)를 사용한 지연 연관은 id i. e.에 의해 로드될 때, Session#get/EntityManager#find 를 통해 쿼리가 lazy로 취급된 경우에도 원하는 것으로 간주되었습니다. Hibernate 6.0부터는 가져오기 메커니즘에 관계없이 이러한 연결의 게으름이 적절하게 유지됩니다. lazy="false" 또는 @ManyToOne( EAGER)/@OneToOne(fetch = EAGER)/@OneToMany(fetch = EAGER)/@OneToMany(fetch = EAGER) 를 지정하여 이전 버전과의 호환성을 달성할 수 있습니다.
  • hbm.xml < return-join/ > : Hibernate 6.0에 따라 < return-join/>의 동작을 변경하면 선택 항목을 추가하는 대신 연관을 가져옵니다.

이러한 기능에 대한 자세한 내용은 Hibernate ORM 6.0 마이그레이션 가이드를 참조하십시오.

Hibernate 6.0 릴리스에는 다음과 같이 나열된 이전 Hibernate 릴리스에서 많은 기능 제거 기능이 포함되어 있습니다.

  • HBM.xml 여러 < column/ >이 허용되지 않음 - 6.0에서 여러 열이 있는 기본 속성 매핑 지원이 제거되었습니다. 이제 구성 요소 클래스 특성에서 CompositeUserType 클래스 해석을 올바르게 지원합니다.
  • 레거시 Hibernate Criteria API - Hibernate 5.x에서 더 이상 사용되지 않는 레거시 Hibernate Criteria API는 Hibernate 6.0에서 제거되었습니다.
  • NativeQuery를 통해 호출 가능 - NativeQuery 를 사용하여 SQL 함수 및 프로시저를 더 이상 지원하지 않습니다. 대신 org.hibernate.procedure.ProcedureCall 또는 jakarta.persistence.StoredProcedureQuery 와 같은 방법을 사용합니다.
  • HQL fetch all properties clause - 모든 속성 절이 HQL 언어에서 제거되었습니다.
  • Cryostat 통합 - Hibernate는 더 이상 Cryostat 환경과의 통합을 위한 기본 지원을 제공하지 않습니다.
  • JACC 통합 - Hibernate는 더 이상 JACC 환경과의 통합을 위한 내장 지원을 제공하지 않습니다.

Hibernate 6.0에서 제거된 기능에 대한 자세한 내용은 Hibernate ORM 6.0 마이그레이션 가이드를 참조하십시오.

7.8.5. Hibernate ORM 6.0에서 6.1으로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 6.0에서 6.1으로 마이그레이션할 때 필요한 변경 사항을 설명합니다. Hibernate ORM 6.0과 Hibernate ORM 6.1 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 6.1 마이그레이션 가이드를 참조하십시오.

Hibernate 6.1 릴리스에는 다음과 같은 변경 사항이 포함되어 있습니다.

  • 기본 배열: byte[]/Byte[]char[]/Character[] 이외의 기본 배열과 기본 컬렉션(컬렉션의 하위 유형만)은 기본적으로 새 메서드 getArrayTypeName 에 의해 결정된 대로 SQL 표준 배열 유형에 매핑되며 org.hibernate.dialect.Dialect.Dialect의 standard Arrays를 지원합니다.
  • enum 매핑 변경: 이제 Enums는 TINYINT 에 매핑되기 전과 마찬가지로 기본적으로 type code>-< Type.SMALLINT 에 매핑됩니다. Java에서 32K enum 항목을 효과적으로 허용하므로 이 매핑은 거의 정확하지 않지만 TINYINT 는 1바이트 유형일 뿐입니다.

Hibernate 6.1에 포함된 기능에 대한 자세한 내용은 Hibernate ORM 6.1 마이그레이션 가이드를 참조하십시오.

7.8.6. Hibernate ORM 6.1에서 6.2로 마이그레이션

이 섹션에서는 Hibernate ORM 버전 6.1에서 6.2로 마이그레이션할 때 필요한 변경 사항을 중점적으로 설명합니다. Hibernate ORM 6.1과 Hibernate ORM 6.2 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 6.2 마이그레이션 가이드를 참조하십시오.

Hibernate 6.2 릴리스에는 다음과 같은 향상된 기능이 포함되어 있습니다.

DDL 유형 변경:

  • OffsetTime 매핑 변경 사항 - 이 릴리스에서 OffsetTime@TimeZoneStoragehibernate.timezone.default_storage 설정에 따라 다릅니다. 기본 설정은 TimeZoneStorageType.DEFAULT 이므로 이러한 열에 대한 DDL 기대치가 변경되었습니다.
  • MariaDB의 UUID 매핑 변경 사항 - MariaDB의 UUID 매핑 변경 사항 - MariaDB의 유형 code Cryostat Types.UUID 는 기본적으로 바이너리(16 를 사용했던 이전 위치와 비교하여 DDL 유형 uuid 를 나타냅니다. 이러한 변경으로 인해 기존 데이터베이스에서 스키마 유효성 검사 오류가 발생할 수 있습니다.
  • SQL ServerSQL Server의 UUID 매핑 변경 사항 - SQL Server의 UUID 매핑 변경 사항 - SQL Server의 유형 code CryostatTypes.UUID 는 기본적으로 binary(16 를 사용했던 이전과 비교했을 때 DDL 유형 uniqueidentifier 를 나타냅니다. 이러한 변경으로 인해 기존 데이터베이스에서 스키마 유효성 검사 오류가 발생할 수 있습니다.
  • Oracle 12.1 이상에서 JSON 매핑 변경 사항 - Oracle 12.1 이상에서 기본적으로 형식은 DDL 유형 blob 및 21+에서 json을 나타냅니다. 이러한 변경으로 인해 기존 데이터베이스에서 스키마 유효성 검사 오류가 발생할 수 있습니다.
  • H2 1.4.200 이상에서 JSON 매핑 변경 사항인 경우 기본적으로 code Cryostat Types.JSON 은 DDL 유형 JSON을 참조합니다. 이러한 변경으로 인해 기존 데이터베이스에서 스키마 유효성 검사 오류가 발생할 수 있습니다.
  • enums의 데이터 유형 - Hibernate 6.2부터 시작, enum을 저장하기 위한 암시적 SQL 데이터 형식의 선택이 enum 클래스에 정의된 항목 수에 민감합니다.
  • 시간대 및 오프셋 스토리지 - hibernate.timezone.default_storage 의 기본값은 DEFAULT 입니다.
  • byte[]/ Character[] 매핑 변경 - Hibernate 6.2를 사용하면 도메인 모델의 Cryostat [] 및 characters[] 매핑 변경의 매핑을 처리할 수 있습니다.
  • 선택적 일대일 매핑에 대한 Cryostat 제약 조건 - Hibernate의 이전 버전에서는 옵션으로 표시된 논리 일대일 연결에 대해 데이터베이스에 Cryostat 제약 조건을 생성하지 않았습니다. 이제 Hibernate 6.2부터 이러한 Cryostat 제약 조건이 생성됩니다.
  • Oracle의 기본 SQL 쿼리에서 숫자(n,0)에 대한 열 유형 유추 - Hibernate 6.0 이후 Oracle에서 스케일 0이 있는 유형 번호는 전체 범위에 따라 부울,tinyint,smallint,int 또는 bigint 로 해석되었습니다. 이제 scale 0이 있는 형식 번호의 열은 전체 범위에 따라 int 또는 bigint 로 해석됩니다.
  • 레거시 데이터베이스 버전 지원 제거 - Hibernate 6.2에는 Hibernate에서 지원하는 대부분의 데이터베이스 방언에 대해 지원되는 최소 데이터베이스 버전의 개념이 도입되었습니다.
  • CDI 처리 변경 - CDI를 사용할 수 있고 구성된 경우 Hibernate는 CDI Cryostat Manager 를 사용하여 다양한 Cryostat 참조를 해결할 수 있습니다. Hibernate 6.2부터 이러한 확장은 hibernate.cdi.extensionstrue 로 설정된 경우에만 CDI Cryostat Manager 에서 확인됩니다.
  • 개선 사항 기본값 및 사용 중단 변경 - enableLazyInitializationenableDirtyTracking 개선 툴 옵션, 글로벌 속성 hibernate.bytecode.use_reflection_optimizerhibernate.enhancer.enableLazyInitializationhibernate.enhancer.enableDirtyTracking 구성 설정이 더 이상 사용되지 않습니다.
  • org.hibernate.cfgorg.hibernate.loader 의 패키지 업데이트: org.hibernate.cfgorg.hibernate.loader 패키지가 업데이트되어 API, SPI 및 내부로 간주되는 계약 간의 구별이 명확하게 표시됩니다.
  • 통합 계약 변경 (SPI) - Hibernate ORM 6.2의 개발 중에 다음 SPI가 수정되었습니다. EntityPersister#lock,EntityPersister#multiLoad,Executable#afterDeserialize, JdbcType#getJdbcRecommended JavaTypeMapping().
  • 쿼리 경로 비교: Hibernate 6.2에 따라 경로 비교는 조기에 확인되었습니다.
  • batch Fetching 및 LockMode - LockModeREAD 보다 크면 Hibernate에서 배치 가져오기를 실행하지 않으므로 기존의 초기화되지 않은 프록시가 초기화되지 않습니다. 잠금 모드가 배치 가져오기 큐의 프록시 중 하나와 다르기 때문입니다.

7.8.7. Hibernate ORM 4.3에서 Hibernate ORM 5.0으로 마이그레이션

JBoss EAP 7.0에는 Hibernate ORM 5.0이 포함되어 있습니다. 이 섹션에서는 Hibernate ORM 버전 4.3에서 버전 5로 마이그레이션할 때 필요한 변경 사항을 중점적으로 설명합니다. Hibernate ORM 4와 Hibernate ORM 5 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 5.0 마이그레이션 가이드를 참조하십시오.

제거 및 더 이상 사용되지 않는 클래스

다음의 더 이상 사용되지 않는 클래스는 Hibernate ORM 5에서 제거되었습니다.

클래스 및 패키지에 대한 기타 변경 사항
유형 처리
  • built-in org.hibernate.type.descriptor.sql.SqlTypeDescriptor 구현은 org.hibernate.type.descriptor.sql.SqlTypeDescriptorRegistry 로 더 이상 자동 등록되지 않습니다. 내장 구현을 확장하고 해당 동작을 사용하는 사용자 지정 Cryostat TypeDescriptor 구현을 사용하는 애플리케이션은 Cryostat TypeDescriptorRegistry.addDescriptor() 를 직접 호출하도록 업데이트해야 합니다.
  • 생성된 UUID로 정의된 ID의 경우, 일부 데이터베이스는 비교가 제대로 작동하려면 BINARY (16) 를 생성하기 위해 @#187(length=16 )를 명시적으로 설정해야 합니다.
  • javax.persistence.EnumType.STRING 이름 매핑 . hbm.xml 에 정의된 EnumType 매핑 의 경우 useNamed(true) 설정을 사용하거나 12VARCHAR 값을 지정하여 명시적으로 지정해야 합니다.
트랜잭션 관리
  • 트랜잭션 SPI는 Hibernate ORM 5에서 중요한 역할을 했습니다. Hibernate ORM 4.3에서는 org.hibernate.Transaction API를 사용하여 다양한 백엔드 트랜잭션 전략에 직접 액세스했습니다. Hibernate ORM 5에는 간접 수준이 도입되었습니다. 백엔드에서 org.hibernate.Transaction 구현은 이제 백엔드 전략에 따라 지정된 세션의 트랜잭션 컨텍스트를 나타내는 org.hibernate.resource.TransactionCoordinator 와 통신합니다. 이는 개발자에게 직접적인 영향을 미치지 않지만 부트스트랩 구성에 영향을 미칠 수 있습니다. 이전 애플리케이션에서는 더 이상 사용되지 않는 hibernate. Cryostat.factory_class 속성을 지정하고 org.hibernate.engine.spi.TransactionFactory FQN(완전 자격을 갖춘 이름)을 참조했습니다. Hibernate ORM 5를 사용하면 hibernate. Cryostat.coordinator_class 설정을 지정하고 org.hibernate.resource.TransactionCoordinatorBuilder 를 참조합니다. 자세한 내용은 org.hibernate.cfg.AvailableSettings.TRANSACTION_COORD CryostatTOR_STRATEGY 를 참조하십시오.
  • 이제 다음과 같은 짧은 이름이 인식됩니다.

    • JDBC: JDBC java.sql.Connection 을 사용하여 트랜잭션을 관리합니다. 이는 비Jakarta 지속성 트랜잭션의 기본값입니다.
    • JTA : Jakarta 트랜잭션을 사용하여 트랜잭션을 관리합니다.

      중요

      Jakarta Persistence 애플리케이션에서 hibernate. Cryostat.coordinator_class 속성에 대한 설정을 제공하지 않으면 Hibernate는 지속성 유닛의 트랜잭션 유형에 따라 적절한 트랜잭션 코디네이터를 자동으로 빌드합니다.

      비Jakarta 지속성 애플리케이션에서 hibernate. Cryostat.coordinator_class 속성에 대한 설정을 제공하지 않으면 Hibernate는 기본적으로 트랜잭션 을 관리하기 위해 jdbc 로 설정됩니다. 이 기본값은 애플리케이션에서 실제로 Jakarta 트랜잭션을 사용하는 경우 문제가 발생합니다. Jakarta 트랜잭션을 사용하는 Jakarta Persistence 애플리케이션은 hibernate. Cryostat.coordinator_class 속성 값을 jta 로 명시적으로 설정하거나 Jakarta 트랜잭션과 적절하게 조정하는 org.hibernate.resource.TransactionCoordinator Builder 를 제공해야 합니다.

기타 Hibernate ORM 5 변경

7.8.8. Hibernate ORM 5.0에서 Hibernate ORM 5.1로 마이그레이션

JBoss EAP 7.1에는 Hibernate ORM 5.1이 포함되어 있습니다. 이 섹션에서는 Hibernate ORM 버전 5.0에서 버전 5.1로 마이그레이션할 때 필요한 차이점과 변경 사항을 중점적으로 설명합니다.

Hibernate ORM 5.1 기능

이 Hibernate 릴리스에는 성능 개선 및 버그 수정이 포함되어 있습니다. 자세한 내용은 7.1.0용 JBoss EAP 릴리스 노트Hibernate ORM 5.1 기능을 참조하십시오. Hibernate ORM 5.0과 Hibernate ORM 5.1 간에 구현된 변경 사항에 대한 자세한 내용은 Hibernate ORM 5.1 마이그레이션 가이드를 참조하십시오.

스키마 관리 툴링 변경

JBoss EAP 7의 스키마 관리 툴 변경

Hibernate ORM 5.1의 스키마 관리 툴링 변경 사항은 다음 영역에 중점을 두고 있습니다.

  • hbm2ddl.auto 의 처리와 hibernate의 Jakarta Persistence 스키마-generation에 대한 지원을 통합합니다.
  • NoSQL 데이터 저장소에 대한 Jakarta 지속성 지원을 제공하는 지속성 엔진인 Hibernate OGM을 효과적으로 대체하기 위해 JDBC 문제를 SPI에서 제거합니다.

스키마 관리 툴링 변경은 다음 클래스를 직접 사용하는 애플리케이션의 마이그레이션 문제일 뿐입니다.

  • org.hibernate.tool.hbm2ddl.SchemaExport
  • org.hibernate.tool.hbm2ddl.SchemaUpdate
  • org.hibernate.tool.hbm2ddl.SchemaValidator
  • org.hibernate.tool.schema.spi.SchemaManagementTool 또는 해당 대표

JBoss EAP 7.1의 스키마 관리 툴 변경

JBoss EAP 7.1에 포함된 Hibernate ORM 5.1.10에는 SchemaMigratorSchemaValidator 성능을 개선하는 데이터베이스 테이블을 검색하는 전략이 도입되었습니다. 이 전략은 단일 java.sql.DatabaseMetaData#getTables(String, string, String, String, String[]) 호출을 실행하여 각 javax.persistence.Entity 에 매핑된 데이터베이스 테이블이 있는지 확인합니다. 이는 기본 전략이며 hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=grouped 속성 설정을 사용합니다. 이 전략을 사용하려면 hibernate.default_schema 및/또는 hibernate.default_catalog 가 필요할 수 있습니다.

java.sql.DatabaseMetaData#getTables(String, String, String, String, String[]) 호출의 이전 전략을 사용하려면 hibernate . hbm2ddl.jdbc_metadata_extraction_strategy=individually 속성 설정을 사용합니다.

7.8.9. Hibernate ORM 5.1 및 Hibernate ORM 5.2에서 Hibernate ORM 5.3으로 마이그레이션

JBoss EAP 7.4에는 Hibernate ORM 5.3이 포함되어 있습니다. 이 섹션에서는 Hibernate ORM 5.1에서 Hibernate ORM 5.2로 마이그레이션한 다음 Hibernate ORM 5.3으로 마이그레이션할 때 필요한 몇 가지 변경 사항을 중점적으로 설명합니다.

Hibernate ORM 5.2 기능

Hibernate ORM 5.2는 Java 8 JDK를 사용하여 구축되었으며 런타임 시 Java 8 JRE가 필요합니다. 다음은 이 릴리스에서 수행된 일부 변경 사항 목록입니다.

  • hibernate-java8 모듈이 hibernate-core 로 병합되었으며 Java 8 날짜/시간 데이터 유형이 기본적으로 지원됩니다.
  • hibernate-entitymanager 모듈이 hibernate-core 로 병합되었습니다. HibernateEntityManagerHibernateEntityManagerFactory 는 더 이상 사용되지 않습니다.
  • 세션,StatelessSessionSessionFactory 클래스 계층 구조는 더 이상 사용되지 않는 클래스를 제거하고 Jakarta Persistence Metamodel API와 더 잘 일치하도록 리팩터링되었습니다.
  • org.hibernate.persisterorg.hibernate.튜플 패키지의 SPI가 변경되었습니다. 해당 SPI를 사용하는 모든 사용자 정의 클래스를 검토하고 업데이트해야 합니다.
  • LimitHandler 변경으로 인해 기본적으로 false 로 설정된 새로운 hibernate.legacy_limit_handler 설정이 도입되어 레거시 Hibernate 4.3 제한 처리기 동작을 사용하도록 설계되었습니다. 이는 제한된 방언 목록에 영향을 미칩니다.
  • SchemaMigratorSchemaValidator 성능을 개선하는 데이터베이스 테이블을 검색하는 새로운 전략이 도입되었습니다.
  • 이 릴리스에서는 PostgreSQL81Dialect 및 해당 하위 클래스를 사용할 때 @Lob 주석이 추가된 String,character [] 및 character[] 속성의 CLOB 값이 변경되어 있습니다.
  • @TableGenerator@SequenceGenerator 이름의 범위가 전역에서 로컬로 변경되었습니다.

Hibernate 5.2에서 구현된 변경 사항의 전체 목록은 Hibernate ORM 5.2 마이그레이션 가이드를 참조하십시오.

Hibernate ORM 5.3 기능

Hibernate ORM 5.3에서는 자카르타 지속성 2.2 사양에 대한 지원이 추가되었습니다. 이 릴리스에는 기타 개선 사항과 함께 이 사양을 준수하기 위한 변경 사항이 포함되어 있습니다. 다음은 이러한 변경 사항 중 일부 목록입니다.

  • 위치 쿼리 매개변수 처리에 대한 변경으로 인해 다음과 같은 변경 사항이 발생했습니다.

    • HQL/JPQL 쿼리에서 JDBC 스타일 매개변수 선언을 제거합니다.
    • Jakarta Persistence 위치 매개 변수는 이름이 지정된 매개변수처럼 더 많이 작동합니다.
    • 네이티브 쿼리의 JDBC 스타일 매개 변수 선언은 Jakarta 지속성과 일치하도록 0 기반 매개 변수 바인딩 대신 1부터 시작합니다. hibernate.query.sql.jdbc_style_params_base 속성을 true 로 설정하여 0 기반 바인딩으로 되돌릴 수 있습니다.
  • 자카르타 지속성 사양을 준수하기 위해 @TableGenerator 저장된 값에 의해 저장된 시퀀스 값은 마지막으로 생성된 값입니다. 이전에는 Hibernate가 다음 시퀀스 값을 저장했습니다. hibernate.id.generator.stored_last_used 속성을 사용하여 레거시 Hibernate 동작을 활성화할 수 있습니다. @TableGenerator 를 사용하고 Hibernate 5.3으로 마이그레이션하는 기존 애플리케이션은 hibernate.id.generator.stored_last_used 구성 속성을 false 로 설정해야 합니다.
  • org.hibernate.query.QueryParameter 클래스의 getType() 메서드는 getHibernateType() 로 이름이 변경되었습니다.
  • Hibernate의 두 번째 수준 캐시 SPI는 다양한 캐싱 공급자의 요구 사항을 보다 효과적으로 충족하도록 설계되었습니다. 자세한 내용은 HHH-11356 에서 확인할 수 있습니다.
  • HHH-11356 에 대한 변경 사항은 Hibernate 통계 시스템에 영향을 미치는 소비자의 변경 사항도 필요했습니다.
  • 일부 메서드는 일시적으로 org.hibernate.Query 클래스에 추가되어 네이티브 애플리케이션을 Hibernate ORM 5.1에서 5.3으로 보다 쉽게 마이그레이션하고 Hibernate 5.1 pagination 동작을 유지 관리했습니다. 이러한 방법은 더 이상 사용되지 않으며 향후 Hibernate 버전에서 이식하려면 Jakarta 지속성 방법을 사용하도록 애플리케이션을 업데이트해야 합니다.
  • Hibernate 2nd-level 캐시 공급자로 Infinispan 사용 지원이 Infinispan 프로젝트로 이동되었습니다. 그 결과 hibernate-infinispan 모듈이 삭제되었습니다.
  • org.hibernate.tool.enhance.EnhancementTask 의 API가 변경되었습니다. addFileset() 메서드는 setBase()setDir() 메서드를 대신해서 삭제되었습니다. 자세한 내용은 HHH-11795 에서 확인할 수 있습니다.
  • Hibernate 4.3에 도입된 버그로 인해 명시적으로 lazy로 매핑되는 경우에도 포함 가능한 컬렉션 요소 및 복합 ID에 대한 다대일 연관이 발생했습니다. Hibernate 5.3.2에서는 이 버그가 수정되었습니다. 결과적으로 이러한 연관은 매핑에 의해 지정된 대로 가져옵니다. 자세한 내용은 HHH-12687 에서 확인할 수 있습니다.
  • 이번 릴리스에서는 Jakarta Persistence 및 Hibernate 이벤트 리스너의 기본 구현이 통합되었습니다. 결과적으로 JpaIntegrator 클래스는 사용되지 않습니다. org.hibernate.jpa.event.spi.JpaIntegrator 를 확장하는 클래스는 org.hibernate.integrator.spi.Integrator 인터페이스를 구현하기 위해 이러한 클래스를 변경해야 합니다. 자세한 내용은 HHH-11264 에서 확인할 수 있습니다.
  • org.hibernate.persister 패키지의 SPI가 변경되었습니다. 해당 SPI를 사용하는 모든 사용자 정의 클래스를 검토하고 업데이트해야 합니다.

Hibernate 5.3에서 구현된 이러한 변경 사항 및 기타 변경 사항의 전체 목록은 Hibernate ORM 5.3 마이그레이션 가이드를 참조하십시오.

Hibernate 5.1과 Hibernate 5.3 간의 변경 사항 예외 처리

Hibernate 5.2 및 5.3에서는 Hibernate의 네이티브 부트스트랩을 사용하여 구축된 SessionFactory 에 대한 예외 처리, Jakarta Persistence 사양에 따라 HibernateException 을 래핑하거나 변환합니다. 이 동작에 대한 유일한 예외는 작업이 Hibernate에 특정한 경우입니다(예: Session.save() 또는 Session.saveOrUpdate() ).

Hibernate 5.3.3에서는 hibernate.native_exception_handling_51_compliance 속성이 추가되었습니다. 이 속성은 Hibernate의 네이티브 부트스트랩을 사용하여 구축된 SessionFactory 에 대한 예외 처리가 Hibernate ORM 5.1의 기본 예외 처리와 동일하게 작동하는지 여부를 나타냅니다. true 로 설정하면HibernateException 이 Jakarta Persistence 사양에 따라 래핑되거나 변환되지 않습니다. 이 설정은 Jakarta Persistence 부트스트랩을 사용하여 빌드된 SessionFactory 에서 무시됩니다.

호환성 변환기

JBoss EAP 7.4에는 더 이상 Hibernate ORM 5.1과 호환되지 않는 Hibernate ORM 5.3 API 방법을 처리하는 호환성 변형기가 포함되어 있습니다. 변환기는 Hibernate ORM 5.1을 사용하여 빌드된 애플리케이션이 JBoss EAP 7.4의 Hibernate 5.3과 동일한 동작을 표시할 수 있도록 하는 임시 조치입니다. 임시 솔루션이므로 이러한 메서드 호출을 권장되는 Jakarta 지속성 메서드 호출로 교체해야 합니다.

다음 방법 중 하나로 변환기를 활성화할 수 있습니다.

  • Hibernate51CompatibilityTransformer 시스템 속성을 true 로 설정하여 모든 애플리케이션에 대해 변환기를 전역적으로 활성화할 수 있습니다.
  • jboss-deployment-structure.xml 파일을 사용하여 애플리케이션 수준에서 변환자를 활성화할 수 있습니다.

    <jboss-deployment-structure>
      <deployment>
        <transformers>
          <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/>
        </transformers>
      </deployment>
      <sub-deployment name="main.war">
        <transformers>
          <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/>
        </transformers>
      </sub-deployment>
    </jboss-deployment-structure>

다음 표에는 변환된 Hibernate 5.1 방법과 다음과 같은 Hibernate 5.3 방법이 나열되어 있습니다.

7.9. Hibernate 검색 변경

JBoss EAP 7에 포함된 Hibernate Search 버전이 변경되었습니다. JBoss EAP의 이전 릴리스에는 Hibernate Search 4.6.x가 포함되어 있었습니다. JBoss EAP 7은 Hibernate Search 5.5.x에 포함되어 있습니다.

Hibernate 검색 5.5는 Apache Lucene 5.3.1을 기반으로 구축됩니다. 기본 Lucene API를 사용하는 경우 이 버전에 맞게 조정하십시오. Hibernate 검색 5.5.8.Final 은 버전 3과 버전 5 간에 이루어진 많은 Lucene API 변경의 복잡성을 감추고 숨기지만, 일부 클래스는 이제 더 이상 사용되지 않거나, 이름이 변경되거나, 다시 패키징됩니다. 이 섹션에서는 이러한 변경 사항이 애플리케이션 코드에 미치는 영향에 대해 설명합니다.

JBoss EAP 8.0에서는 Hibernate Search 5 API가 제거되었으며 Hibernate Search 6 API로 대체되었습니다.

추가 리소스

7.9.1. Hibernate Search 6에서 Hibernate Search 5 API를 대체

Hibernate Search 5 API가 제거되었으며 JBoss EAP 8.0에서 Hibernate Search 6 API로 대체되었습니다.

제거된 기능 목록을 보려면 JBoss EAP 7.4에서 더 이상 사용되지 않고 EAP 8.0에서 제거된 Hibernate Search 5 API를 참조하십시오.

참고

Hibernate Search 6 API는 Hibernate Search 5 API와 역호환 됩니다. 애플리케이션을 Hibernate Search 6으로 마이그레이션해야 합니다.

JBoss EAP 8.0에 포함된 Hibernate Search 6의 최신 버전은 6.2입니다. Hibernate Search 5에서 마이그레이션하는 경우 버전 6.0, 6.1 6.2로 마이그레이션해야 합니다.

자세한 내용은 다음 마이그레이션 가이드를 참조하십시오.

참고

Hibernate Search 6.2는 Hibernate ORM 6.2와 호환됩니다. 자세한 내용은 Hibernate Search 6.2 참조 문서의 Hibernate ORM 6 섹션을 참조하십시오.

7.9.2. Hibernate Search 6에서 Elasticsearch 지원

JBoss EAP 8.0은 또한 Hibernate Search 6의 Elasticsearch 백엔드를 사용하여 데이터를 원격 Elasticsearch 또는 OpenSearch 클러스터로 인덱싱할 수 있도록 지원합니다.

가능한 Hibernate 검색 아키텍처 및 백엔드 목록을 보려면 테이블 2를 참조하십시오. Hibernate Search 6.2 참조 문서의 아키텍처 비교.

Hibernate Search 6 구성에 대한 자세한 내용은 WildFly Developer 가이드의 Hibernate 검색 사용을 참조하십시오.

추가 리소스

7.10. 엔터티 빈을 자카르타 지속성으로 마이그레이션

엔터프라이즈 Java Cryostat 엔티티 빈 에 대한 지원은 Java EE 8에서는 선택 사항이며 JBoss EAP 7부터는 지원되지 않습니다.

이전 릴리스의 JBoss EAP에서 엔터티 빈은 javax. Cryostat.EntityBean 클래스를 확장하고 필요한 메서드를 구현하여 애플리케이션 소스 코드로 생성되었습니다. 그런 다음 Cryostat -jar.xml 파일에서 구성되었습니다. CMP 엔티티 square는 컨테이너 값이 있는 < persistence-type > 자식 요소를 포함하는 < entity > 요소를 사용하여 지정 되었습니다. BMP 엔티티 빈은 값이 Cryostat인 < persistence-type > 자식 요소를 포함하는 < entity > 요소를 사용하여 지정되었습니다.

JBoss EAP 7부터는 코드의 모든 CMP 및 BMP 엔터티 빈을 Jakarta Persistence 엔터티로 교체해야 합니다. Jakarta Persistence 엔티티는 jakarta.persistence.* 클래스를 사용하여 생성되며 persistence.xml 파일에 정의됩니다.

다음은 Jakarta Persistence 엔터티 클래스의 예입니다.

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
// User is a keyword in some SQL dialects!
@Table(name = "MyUsers")
public class MyUser {
    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String username;
    private String firstName;
    private String lastName;

    public Long getId() {
        return id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

다음은 persistence.xml 파일의 예입니다.

<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence
          https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
        version="3.0">
  <persistence-unit name="my-unique-persistence-unit-name">
    <properties>
      // properties...
    </properties>
  </persistence-unit>
</persistence>

자카르타 지속성 엔티티의 작업 예제는 JBoss EAP 8.0에 포함된 cmt 빠른 시작을 참조하십시오.

7.11. Jakarta 지속성 속성 변경

이 섹션에서는 JBoss EAP 7.0 및 7.1에 도입된 자카르타 지속성 속성 변경 사항에 대해 설명합니다.

Jakarta Persistence 속성 변경 사항이 JBoss EAP 7.0에 추가되었습니다.

이전 릴리스의 지속성 동작과 호환성을 제공하기 위해 새로운 지속성 속성인 jboss.as.jpa.deferdetach 가 추가되었습니다.

jboss.as.jpa.deferdetach 속성은 비Jakarta 트랜잭션 스레드에 사용된 트랜잭션 범위 지속성 컨텍스트가 각 EntityManager 호출 후 로드된 엔티티를 분리하는지 또는 예를 들어 세션 Cryostat 호출이 종료될 때 속성입니다. 속성 값은 기본적으로 false 로 설정됩니다. 즉, 각 EntityManager 호출 후 엔터티를 분리하거나 지웁니다. 자카르타 지속성 사양에 정의된 대로 올바른 기본 동작입니다. 속성 값이 true 로 설정되면 지속성 컨텍스트가 닫힐 때까지 엔터티가 분리되지 않습니다.

JBoss EAP 5에서 지속성은 jboss.as.jpa.deferdetach 속성이 true 로 설정된 것처럼 작동합니다. 다음 예와 같이 애플리케이션을 JBoss EAP 5에서 JBoss EAP 7로 마이그레이션할 때 동일한 동작을 얻으려면 persistence.xml 에서 jboss.as.jpa.deferdetach 속성 값을 true 로 설정해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="EAP5_COMPAT_PU">
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    <properties>
         <property name="jboss.as.jpa.deferdetach" value="true" />
    </properties>
  </persistence-unit>
</persistence>

JBoss EAP 6에서 지속성은 jboss.as.jpa.deferdetach 속성이 false 로 설정된 것처럼 작동합니다. 이는 JBoss EAP 7에 표시된 것과 동일한 동작이므로 애플리케이션을 마이그레이션할 때 변경 사항이 필요하지 않습니다.

JBoss EAP 7.1에 도입된 Jakarta 지속성 속성 변경

JBoss EAP 7.0에서 동기화되지 않은 지속성 컨텍스트 오류 검사는 다음 영역에서와 같이 엄격한 것이 아닙니다.

  • 동기화된 컨테이너 관리 지속성 컨텍스트는 Jakarta 트랜잭션과 연결된 동기화되지 않은 확장 지속성 컨텍스트를 사용할 수 있었습니다. 대신 동기화되지 않은 지속성 컨텍스트가 사용되지 않도록 IllegalStateException 이 throw되어야 합니다.
  • 배포 설명자에 지정된 동기화되지 않은 지속성 컨텍스트가 동기화된 것으로 처리되었습니다.

또한, JBoss EAP 7.0에서 @PersistenceContext 의 persistence Property 힌트가 실수로 무시되었습니다.

이러한 문제는 JBoss EAP 7.1 이상에서 해결되었습니다. 이러한 업데이트로 인해 애플리케이션 동작을 원치 않는 변경이 발생할 수 있으므로 이전 버전과의 호환성을 제공하고 이전 동작을 유지하기 위해 JBoss EAP 7.1에 두 개의 새로운 지속성 유닛 속성이 도입되었습니다.

속성설명

wildfly.jpa.skipmixedsynctypechecking

이 속성은 오류 검사를 비활성화합니다. 애플리케이션은 JBoss EAP 7.0에서 작동하여 JBoss EAP 7.1 이상에서 실패하는 상황에서 이전 버전과의 호환성을 위한 임시 조치로만 사용해야 합니다. 이 속성은 향후 릴리스에서 더 이상 사용되지 않을 수 있으므로 이를 수행할 수 있는 즉시 애플리케이션 코드를 수정하는 것이 좋습니다.

wildfly.jpa.allowjoinedunsync

이 속성은 wildfly.jpa.skipmixedsynctypechecking 의 대안입니다. 이를 통해 애플리케이션은 Jakarta 트랜잭션과 연결된 동기화되지 않은 지속성 컨텍스트를 동기화된 지속성 컨텍스트인 것처럼 처리할 수 있습니다.

7.12. Jakarta Enterprise Cryostats 클라이언트 코드 마이그레이션

이 섹션에서는 JBoss EAP 7.0의 Jakarta Enterprise Cryostats 클라이언트의 변경 사항에 대해 설명합니다. 또한 JBoss EAP 7.0에서 새로운 기본 원격 포트 및 커넥터를 사용하도록 클라이언트 코드를 수정하는 방법도 설명합니다. 또한 JBoss EAP 7.1 및 JBoss EAP 7.0에 도입된 필수 JBoss Ethernet 클라이언트 변경 사항도 설명합니다.

참고

JBoss EAP 7.0부터 엔터프라이즈 엔티티 빈은 지원되지 않습니다. 자세한 내용은 Entity Cryostat를 자카르타 지속성으로 마이그레이션 을 참조하십시오.

7.12.1. Jakarta Enterprise Cryostats 클라이언트의 JBoss EAP 7 변경

JBoss EAP 7부터 기본 원격 커넥터 및 포트가 변경되었습니다. 이 변경 사항에 대한 자세한 내용은 원격 URL 커넥터 및 포트 업데이트를 참조하십시오.

JBoss Server 마이그레이션 도구를 사용하여 서버 구성을 마이그레이션한 경우 이전 설정이 유지되며 여기에 자세히 변경할 필요가 없습니다. 그러나 새 JBoss EAP 8.0 기본 구성을 사용하는 경우 다음과 같은 사항을 변경해야 합니다.

7.12.1.1. 기본 원격 연결 포트 업데이트

jboss- Cryostat-client.properties 파일의 원격 연결 포트 값을 4447 에서 8080 으로 변경합니다. 다음은 이전 릴리스 및 현재 릴리스의 jboss- Cryostat-client.properties 파일의 예입니다.

예: JBoss EAP 6 jboss- Cryostat-client.properties 파일

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

예: JBoss EAP 8 jboss- Cryostat-client.properties 파일

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

7.12.1.2. 기본 커넥터 업데이트

새 JBoss EAP 7 구성을 사용하는 경우 기본 커넥터가 remote 에서 http-remoting 으로 변경되었습니다. 이러한 변경으로 인해 클라이언트가 하나의 JBoss EAP 릴리스의 라이브러리를 사용하여 다른 릴리스의 서버에 연결하는 데 영향을 미칩니다.

  • 클라이언트 애플리케이션이 JBoss EAP 6의 Jakarta Enterprise Cryostats 클라이언트 라이브러리를 사용하고 JBoss EAP 7 서버에 연결하려는 경우 8080 이외의 포트에 원격 커넥터를 노출하도록 서버를 구성해야 합니다. 그런 다음 클라이언트는 새로 구성된 커넥터를 사용하여 연결해야 합니다.
  • JBoss EAP 7의 Jakarta Enterprise Cryostats 클라이언트 라이브러리를 사용하고 JBoss EAP 6 서버에 연결하려는 클라이언트 애플리케이션은 서버 인스턴스에서 http-remoting 커넥터를 사용하지 않고 대신 원격 커넥터를 사용한다는 것을 알고 있어야 합니다. 이를 위해 새 클라이언트 측 연결 속성을 정의합니다.

    예: 원격 연결 속성

    remote.connection.default.protocol=remote

7.12.2. 원격 이름 지정 클라이언트 코드 마이그레이션

새로운 기본 JBoss EAP 7 구성으로 실행하는 경우 새 기본 원격 포트와 커넥터를 사용하도록 클라이언트 코드를 수정해야 합니다.

다음은 JBoss EAP 6의 클라이언트 코드에 원격 이름 지정 속성을 지정하는 방법의 예입니다.

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=remote://localhost:4447

다음은 JBoss EAP 7의 클라이언트 코드에서 원격 이름 지정 속성을 지정하는 방법의 예입니다.

java.naming.factory.initial=org.wildfly.naming.client.WildFlyInitialContextFactory
java.naming.provider.url=http-remoting://localhost:8080

7.12.3. JBoss EAP 7.1에 도입된 추가 JBoss migration 클라이언트 변경 사항

JBoss EAP 7.0은 JBoss Enterprise Java Cryostat 클라이언트 2.1.4에 포함되어 있으며 JBoss EAP 7.1 이상은 API에 대한 여러 변경 사항이 포함된 JBoss Enterprise Java Cryostat 클라이언트 4.0.x에 포함되었습니다.

참고

JBoss EAP 7부터 엔터프라이즈 엔티티 빈은 지원되지 않습니다. 엔터티 빈을 자카르타 지속성으로 마이그레이션하는 방법에 대한 자세한 내용은 Entity Cryostat를 Jakarta Persistence로 마이그레이션 을 참조하십시오.

  • org. Cryostat.client.EJBClientInvocationContext 클래스는 다음과 같은 새 메서드를 추가합니다.

    방법유형설명

    isBlockingCaller()

    boolean

    이 호출이 현재 호출 스레드를 차단하는지 여부를 확인합니다.

    isClientAsync()

    boolean

    메서드가 client-asynchronous로 표시되는지 여부를 확인합니다. 즉, 서버 측 메서드가 비동기 상태인지 여부에 관계없이 호출이 비동기적이어야 합니다.

    isIdempotent()

    boolean

    메서드가 idempotent로 표시되는지 여부를 확인합니다. 즉, 메서드 메서드를 추가 효과 없이 두 번 이상 호출합니다.

    setBlockingCaller(boolean)

    void

    이 호출이 현재 호출 스레드를 차단하는지 여부를 설정합니다.

    setLocator(EJBLocator<T>)

    <T> void

    호출 대상의 ECDSA를 설정합니다.

  • org. Cryostat.client.EJBLocator 클래스는 다음과 같은 새 메서드를 추가했습니다.

    방법유형설명

    asStateful()

    StatefulEJBLocator<T>

    이 값을 상태 저장 위치(있는 경우)로 반환합니다.

    asStateless()

    StatelessEJBLocator<T>

    이 값을 상태 비저장(stateless)으로 반환합니다(있는 경우).

    isEntity()

    boolean

    엔터티인지 확인합니다.

    isHome()

    boolean

    이것이 집인지 확인합니다.

    isStateful()

    boolean

    상태 저장 여부 확인.

    isStateless()

    boolean

    상태 비저장인지 확인합니다.

    withNewAffinity(Affinity)

    추상 migrationLocator<T>

    지정된 새 선호도를 사용하여 이 복사본을 생성합니다.

  • 권한 있는 엔터프라이즈 Java Cryostats 작업에 대한 액세스를 제어하기 위해 java.security.Permission 의 하위 클래스인 org. Cryostat.client.EJBClientPermission 클래스가 도입되었습니다. 다음과 같은 생성자를 제공합니다.

    • CryostatClientPermission(문자열 이름)
    • EthernetClientPermission(문자열 이름, 문자열 작업)
  • 다음과 같은 방법을 제공합니다.

    방법유형설명

    동일(EJBClientPermission obj)

    boolean

    두 개의 ClevisClientPermission 개체가 같은지 확인합니다.

    equals(Object obj)

    boolean

    두 개의 Permission 개체가 같은지 확인합니다.

    동일(Permission obj)

    boolean

    두 개의 Permission 개체가 같은지 확인합니다.

    getActions()

    문자열

    작업을 문자열로 반환합니다.

    hashcode()

    int

    Permission 개체의 해시 코드 값을 반환합니다.

    implies (EJBClientPermission 권한)

    boolean

    이 Clevis ClientPermission 개체의 작업에 의해 지정된 권한의 작업이 암시적 인지 확인합니다.

    권한 권한(Permission permission)

    boolean

    지정된 권한의 작업이 이 Permission 오브젝트의 동작에 의해 함축 되는지 확인합니다.

  • 특정 Enterprise Java Cryo stats 메서드를 찾기 위해 새로운 org. Cryostat.client.EJBMethodLocator 클래스가 도입되었습니다. 다음과 같은 생성자를 제공합니다.

    • dnsmasqMethodLocator(String methodName, String…​ parameterTypeNames)
  • 다음과 같은 방법을 제공합니다.

    방법유형설명

    equals(EJBMethodLocator 기타)

    boolean

    이 개체가 다른 개체와 같은지 확인합니다.

    equals(Object other)

    boolean

    이 개체가 다른 개체와 같은지 확인합니다.

    forMethod(Method 메서드)

    정적 migrationMethodLocator

    지정된 리플렉션 메서드에 대한 메서드 가져오기.

    getMethodName()

    문자열

    메서드 이름을 가져옵니다.

    getParameterCount()

    int

    매개변수 수를 가져옵니다.

    getParameterTypeName(int index)

    문자열

    지정된 인덱스에서 매개 변수의 이름을 가져옵니다.

    hashCode()

    int

    해시 코드를 가져옵니다.

  • 실패한 경우 새 org.jboss.client.EJBReceiverInvocationContext.ResultProducer.Failed 클래스가 도입되었습니다. 다음과 같은 생성자를 제공합니다.

    • failed(Exception 원인)
  • 다음과 같은 방법을 제공합니다.

    방법유형설명

    discardResult()

    void

    결과를 폐기하여 사용되지 않음을 나타냅니다.

    getResult()

    개체

    결과를 가져옵니다.

  • 즉각적인 결과를 위해 새로운 org.jboss.client.EJBReceiverInvocationContext.ResultProducer.Immediate 클래스가 도입되었습니다. 다음과 같은 생성자를 제공합니다.

    • failed(Exception 원인)
  • 다음과 같은 방법을 제공합니다.

    방법유형설명

    discardResult()

    void

    결과를 폐기하여 사용되지 않음을 나타냅니다.

    getResult()

    개체

    결과를 가져옵니다.

  • URI 선호도 사양에 대해 org.jboss. Cryostat.client.client.Affinity 의 하위 클래스인 org.jboss. Cryostat.client.Affinity 클래스가 도입되었습니다. Affinity.forUri(URI) 를 사용하여 생성됩니다.
  • 다음과 같은 방법을 제공합니다.

    방법유형설명

    equals(Affinity other)

    boolean

    다른 개체가 이 개체와 같은지 여부를 나타냅니다.Indicates whether another object is equal to this one.

    equals(Object other)

    boolean

    다른 개체가 이 개체와 같은지 여부를 나타냅니다.Indicates whether another object is equal to this one.

    동일 (URIAffinity 기타)

    boolean

    다른 개체가 이 개체와 같은지 여부를 나타냅니다.Indicates whether another object is equal to this one.

    getURI()

    URI

    연결된 URI를 가져옵니다.

    hashCode()

    int

    해시 코드를 가져옵니다.

    toString()

    문자열

    개체의 문자열 표현을 반환합니다.

  • org.jboss. Cryostat.client.EJBMetaDataImpl 클래스는 다음 메서드를 더 이상 사용하지 않습니다.

    • toAbstractEJBMetaData()
    • EJBMetaDataImpl(AbstractEJBMetaData<?,?>)

7.13. WildFly 구성 파일을 사용하도록 클라이언트 마이그레이션

JBoss EAP 7.1을 릴리스하기 전에 Enterprise Java Cryostat 및 naming과 같은 JBoss EAP 클라이언트 라이브러리는 다른 구성 전략을 사용했습니다. JBoss EAP 7.1은 서버 구성이 처리되는 방식과 유사한 방식으로 모든 클라이언트 구성을 하나의 단일 구성 파일로 통합하기 위한 용도로 wildfly-config.xml 파일을 도입했습니다.

예를 들어 JBoss EAP 7.1 이전에는 jboss- Cryostat-client.properties 파일을 사용하여 Enterprise Java Cryostat 클라이언트에 대한 새 InitialContext 를 생성하거나 속성 클래스를 사용하여 프로그래밍 방식으로 속성을 설정할 수 있습니다.

예: jboss- Cryostat-client.properties 속성 파일

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=one
remote.connection.one.port=8080
remote.connection.one.host=127.0.0.1
remote.connection.one.username=quickuser
remote.connection.one.password=quick-123

JBoss EAP 7.1 이상에서는 클라이언트 아카이브의 META-INF/ 디렉터리에 wildfly-config.xml 파일을 만듭니다. wildfly-config.xml 파일을 사용하는 것과 동일한 구성입니다.

예: wildfly-config.xml 파일을 사용한 동등한 구성

<configuration>
    <authentication-client xmlns="urn:elytron:client:1.7">
        <authentication-rules>
            <rule use-configuration="ejb"/>
        </authentication-rules>
        <authentication-configurations>
            <configuration name="ejb">
                <set-user-name name="quickuser"/>
                <credentials>
                    <clear-password password="quick-123"/>
                </credentials>
            </configuration>
        </authentication-configurations>
    </authentication-client>
    <jboss-ejb-client xmlns="urn:jboss:wildfly-client-ejb:3.2">
        <connections>
            <connection uri="remote+http://127.0.0.1:8080" />
        </connections>
    </jboss-ejb-client>
</configuration>

7.14. 배포 계획 구성 마이그레이션

Java EE 애플리케이션 배포 사양(JSR-88) 은 여러 공급업체의 툴에서 모든 Java EE 플랫폼 제품에서 애플리케이션을 구성하고 배포할 수 있는 표준 계약을 정의하기 위한 것입니다. 계약에는 Java EE 제품 공급자가 DeploymentManager 및 기타 javax.enterprise.deploy.spi 인터페이스를 구현해야 합니다. JBoss EAP 6의 경우 배포 계획은 아카이브 또는 JAR 아카이브에 번들된 deployment-plan.xml 이라는 XML 설명자로 식별됩니다.

이 사양은 대부분의 애플리케이션 서버 제품이 자체적인 "기능의 풍부한" 배포 솔루션을 제공하기 때문에 채택이 거의 없었습니다. 이러한 이유로 Cryostat-88 지원은 Java EE 7에서 중단되고 JBoss EAP 7에서 지원이 중단되었습니다.

Cryostat-88을 사용하여 애플리케이션을 배포하는 경우 다른 방법을 사용하여 애플리케이션을 배포해야 합니다. JBoss EAP 관리 CLI 배포 명령은 독립 실행형 서버 또는 관리형 도메인의 서버 그룹에 아카이브를 배포하는 표준 방법을 제공합니다. 관리 CLI에 대한 자세한 내용은 관리 CLI 가이드를 참조하십시오.

7.15. 사용자 정의 애플리케이션 생성 마이그레이션

사용자 정의 브릭 또는 jboss-web.xml XML 파일에 정의된 모든 브릭을 수동으로 마이그레이션해야 합니다. 여기에는 org.apache.catalina.valves.ValveBase 클래스를 확장하고 jboss-web.xml 설명자 파일의 < valve > 요소에 구성하여 생성된 구성 요소가 포함됩니다.

배포에서 Valves Configured 마이그레이션

JBoss EAP 6에서는 jboss-web.xml 웹 애플리케이션 설명자 파일에서 애플리케이션을 구성하여 애플리케이션 수준에서 사용자 정의 브릭을 정의할 수 있습니다. JBoss EAP 7부터는 Cryostat 핸들러에서도 이 작업을 수행할 수 있습니다.

다음은 JBoss EAP 6의 jboss-web.xml 파일에 구성된 구성의 예입니다.

<jboss-web>
    <valve>
        <class-name>org.jboss.examples.MyValve</class-name>
​        <param>
    ​        <param-name>myParam</param-name>
​            <param-value>foobar</param-value>
    ​    </param>
    </valve>
</jboss-web>

JBoss EAP에서 사용자 지정 처리기를 생성하고 구성하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드의 사용자 지정 처리기 생성 을 참조하십시오.

Custom Authenticator Valves 마이그레이션

인증기를 마이그레이션하는 방법에 대한 자세한 내용은 마이그레이션 인증기를 참조하십시오.

7.16. 보안 애플리케이션 변경

JBoss EAP 7 이후 JBoss Web을 대체하려면 보안 구성을 변경해야 합니다. JBoss EAP 8.0부터 Elytron은 더 이상 사용할 수 없으므로 기존 보안으로 사용해야 합니다.

7.16.1. Red Hat Enterprise Linux OpenStack Platform

JBoss EAP 6.4에서 AuthenticatorBase 를 확장한 사용자 정의 인증기를 생성한 경우 이를 JBoss EAP 7에서 사용자 지정 HTTP 인증 구현으로 교체해야 합니다. HTTP 인증 메커니즘은 elytron 하위 시스템에서 생성된 다음 undertow 하위 시스템에 등록됩니다. 사용자 지정 HTTP 인증 메커니즘을 구현하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드에서 사용자 지정 HTTP 메커니즘 개발을 참조하십시오.

7.16.3. Vault 제거

자격 증명 모음이 JBoss EAP 8.0에서 제거되었습니다. 애플리케이션에서 레거시 vault 표현식을 사용하는 경우 Elytron 암호화된 표현식을 마이그레이션하고 사용해야 합니다.

주석 또는 배포 설명자에 있을 수 있는 배포 파일에서 ${VAULT:: 인스턴스를 확인하고 해당 암호화된 표현식으로 교체합니다.

7.16.4. OIDC 클라이언트 마이그레이션

Keycloak OIDC 클라이언트 어댑터는 JBoss EAP 8.0에서 지원되지 않으며 기본 Elytron OIDC 클라이언트로 교체되어 유사한 기능과 구성을 제공합니다.

Keycloak OIDC 클라이언트 어댑터에서 기본 Elytron OIDC 클라이언트로 마이그레이션하려면 다음 단계를 따르십시오.

  • 애플리케이션의 web.xml 파일에서 < auth-method>KEYCLOAK</auth-method >를 확인하고 배포의 web.xml 파일에서 < auth-method>OIDC</auth-method >로 바꿉니다.
  • article -INF/keycloak.json 이 있는지 확인하고 이름을 internet -INF/oidc.json 으로 변경합니다.

7.16.5. 사용자 정의 로그인 모듈 마이그레이션

JBoss EAP 8.0에서는 레거시 보안 하위 시스템이 제거되었습니다. elytron 하위 시스템에서 사용자 지정 로그인 모듈을 계속 사용하려면 새로운 JAAS(Java Authentication and Authorization Service) 보안 영역과 jaas-realm 을 사용합니다.

7.16.6. 기타 보안 애플리케이션 변경

JBoss EAP 7.2 이상과 이전 버전에는 몇 가지 차이점이 있습니다.

  • jboss-web.xml 에는 NegotiationAuthenticator metal이 필요하지 않지만 web.xml 에 정의된 < security-constraint > 및 < login-config > 요소가 있어야 합니다. 보안되는 리소스를 결정하는 데 사용됩니다.
  • < login-config> 요소의 auth- method 요소는 이제 쉼표로 구분된 목록입니다. 정확한 값 Cryo statEGO 가 있어야 하며 해당 목록에서 먼저 표시되어야 합니다. FORM 인증이 폴백으로 필요한 경우 정확한 값은 Cryostat EGO,FORM 입니다.
  • jboss-deployment-structure.xml 파일은 필요하지 않습니다.

7.17. JBoss Logging 변경 사항

JBoss EAP 7부터 JBoss Logging을 사용하는 경우 org.jboss.logging 패키지의 주석이 더 이상 사용되지 않습니다. org.jboss.logging.annotations 패키지로 이동되었으므로 새 패키지를 가져오도록 소스 코드를 업데이트해야 합니다.

또한 주석이 별도의 Maven groupId:artifactId:version (GAV) ID로 이동했기 때문에 프로젝트 pom.xml 파일에 org.jboss.logging:jboss-logging-annotations 에 대한 새 프로젝트 종속성을 추가해야 합니다.

참고

로깅 주석만 이동되었습니다. org.jboss.logging.BasicLoggerorg.jboss.logging.Loggerorg.jboss.logging 패키지에 계속 있습니다.

다음 표에는 더 이상 사용되지 않는 주석 클래스 및 해당 교체가 나열되어 있습니다.

표 7.1. 더 이상 사용되지 않는 로깅 주석 교체

더 이상 사용되지 않는 클래스대체 클래스

org.jboss.logging.Cause

org.jboss.logging.annotations.Cause

org.jboss.logging.Field

org.jboss.logging.annotations.Field

org.jboss.logging.FormatWith

org.jboss.logging.annotations.FormatWith

org.jboss.logging.LoggingClass

org.jboss.logging.annotations.LoggingClass

org.jboss.logging.LogMessage

org.jboss.logging.annotations.LogMessage

org.jboss.logging.Message

org.jboss.logging.annotations.Message

org.jboss.logging.MessageBundle

org.jboss.logging.annotations.MessageBundle

org.jboss.logging.MessageLogger

org.jboss.logging.annotations.MessageLogger

org.jboss.logging.Param

org.jboss.logging.annotations.Param

org.jboss.logging.Property

org.jboss.logging.annotations.Property

7.18. Jakarta facess 코드 변경

이 섹션에서는 애플리케이션을 JBoss EAP로 마이그레이션할 때 자카르타 코드 변경의 영향에 대해 설명합니다.

4.0 이전 Jakarta Server Cryostat에 대한 지원 중단

참고

Jakarta Server facess는 JavaServer의 새로운 이름입니다.

JBoss EAP 6.4를 사용하면 jboss-deployment-structure.xml 파일을 생성하여 Jakarta Server Cryostat 1.2를 애플리케이션 배포와 함께 계속 사용할 수 있습니다. JBoss EAP 7.4에는 자카르타 서버 Cryostat 2.3이 포함되어 있으며 더 이상 자카르타 서버 Cryostat 1.2 API를 지원하지 않습니다. 애플리케이션에서 Jakarta Server Cryostats 1.2를 사용하는 경우 자카르타 서버 faces 2.3을 사용하도록 다시 작성해야 합니다.

JBoss EAP 8.0은 4.0 이전 버전의 Cryostat를 더 이상 지원하지 않습니다.

7.19. 대체면을 위한 MyFaces 통합

Galleon 기능 팩, Cryostat-myfaces-feature -pack 을 도입하여 JBoss EAP 내의 기본 Mojarra Jakarta Cryostats 구현 대신 대체 Jakarta faces 구현인 MyFaces 를 간단하게 설치할 수 있습니다. 이 기능 팩을 사용하여 JBoss EAP 내에서 다른 Jakarta Cryostat 구현을 프로비저닝할 수 있습니다.

MYFACES_VERSION 환경 변수를 사용하여 MyFace s 버전을 선택하려면 Cryostat-myfaces-feature-pack 을 사용할 수 있습니다. 이 기능 팩에는 MyFaces 라는 단일 계층이 도입되어 대안으로 MyFaces 를 설치하고 선택할 수 있는 옵션을 제공합니다. 자세한 내용은 EAP 8에서 Multi-JSF 기능을 구성하는 방법을 참조하십시오.

참고

JBoss EAP 8.0과의 호환성은 버전 4.x 이상으로 제한됩니다.

7.20. 변경 사항 로드 모듈 클래스

JBoss EAP 7에서는 여러 모듈에 동일한 클래스 또는 패키지가 포함된 경우 클래스 로드 동작이 변경되었습니다.

서로 의존하여 동일한 패키지 중 일부를 포함하는 두 개의 모듈 MODULE_AMODULE_B 가 있다고 가정합니다. JBoss EAP 6에서는 종속성에서 로드된 클래스 또는 패키지가 module.xml 파일의 resource-root 에 지정된 것보다 우선합니다. 즉, MODULE_A MODULE_BMODULE_B 용 패키지를 볼 수 있었습니다. 이 동작은 혼란스러웠으며 충돌을 일으킬 수 있습니다. 이 동작은 JBoss EAP 7에서 변경되었습니다. 이제 module.xml 파일의 resource-root 에 의해 지정된 클래스 또는 패키지가 종속성에서 지정한 클래스보다 우선합니다. 즉, MODULE_A 에는 MODULE_AMODULE_B 의 패키지가 MODULE_B 임을 알 수 있습니다. 이렇게 하면 충돌을 방지하고 더 적절한 동작을 제공합니다.

모듈 종속 항목에 중복된 클래스가 포함된 리소스 루트 라이브러리 또는 패키지가 포함된 사용자 지정 모듈이 있는 경우 JBoss EAP 7로 마이그레이션할 때 ClassCastException,LinkageError, 클래스 로드 오류 또는 기타 동작 변경 사항이 표시될 수 있습니다. 이러한 문제를 해결하려면 하나의 클래스 버전만 사용되도록 module.xml 파일을 구성해야 합니다. 이 작업은 다음 접근 방법 중 하나를 사용하여 수행할 수 있습니다.

  • 모듈 종속성에서 클래스를 복제하는 resource-root 를 지정하지 않을 수 있습니다.
  • importexports 요소의 includeexclude 하위 요소를 사용하여 module.xml 파일에서 클래스 로드를 제어할 수 있습니다. 다음은 클래스를 제외하는 내보내기 요소가 지정된 패키지에 있습니다.

    <exports>
      <exclude path="com/mycompany/duplicateclassespath/"/>
    </exports>

기존 동작을 유지하려면 filter 요소를 사용하여 module.xml 파일의 종속 resource-root 에서 종속성 패키지를 필터링 해야 합니다. 이를 통해 JBoss EAP 6에서 볼 수 있는 홀수 루프 없이 기존 동작을 유지할 수 있습니다. 다음은 지정된 패키지의 클래스를 필터링하는 root-resource 의 예입니다.

<resource-root path="mycompany.jar">
  <filter>
    <exclude path="com/mycompany/duplicateclassespath"/>
  </filter>
</resource-root>

모듈 및 클래스 로드에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드의 클래스 로드 및 모듈을 참조하십시오.

7.21. 애플리케이션 Cryostat 변경 사항

이 섹션에서는 애플리케이션을 JBoss EAP 6에서 JBoss EAP 8로 마이그레이션하는 데 필요한 클러스터링 변경 사항을 간략하게 설명합니다. 또한 이 섹션에서는 클러스터링 변경 사항이 애플리케이션을 JBoss EAP 8.0으로 마이그레이션하는 방법에 대해 설명합니다.

7.21.1. 새로운 클러스터링 기능 개요

다음 목록에서는 애플리케이션을 JBoss EAP 6에서 JBoss EAP 8.0으로 마이그레이션할 때 알아야 할 새로운 클러스터링 기능 중 일부를 설명합니다.

  • JBoss EAP 7에는 프로세스를 크게 단순화하는 싱글톤 서비스를 구축하기 위한 새로운 공용 API가 도입되었습니다. Singleton 서비스에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드HA Singleton 서비스를 참조하십시오.
  • 싱글톤 배포는 한 번에 클러스터의 단일 노드에서만 배포하고 시작하도록 구성할 수 있습니다. 자세한 내용은 JBoss EAP 7.4 개발 가이드의 HA Singleton 배포를 참조하십시오.
  • 클러스터형 싱글톤 Cryostat를 정의할 수 있습니다. 자세한 내용은 JBoss EAP 7.4 Developing Jakarta Enterprise Cryostats 애플리케이션의 Clustered Singleton Cryostat를 참조하십시오.
  • JBoss EAP 8.0에는 Cryostat mod_cluster 구현이 포함되어 있습니다. 이는 httpd 웹 서버가 필요하지 않은 순수 Java 로드 밸런싱 솔루션을 제공합니다. 자세한 내용은 JBoss EAP 7.4 구성 가이드의 JBoss EAP를 프런트 엔드 로드 밸런서로 구성을 참조하십시오.

7.21.2. 웹 세션 구현 변경 사항

JBoss EAP 7에는 새로운 웹 세션 클러스터링 구현이 도입되었습니다. 기존 JBoss Web 하위 시스템 소스 코드와 긴밀하게 연결된 이전 구현을 대체합니다.

새로운 웹 세션 클러스터링 구현은 애플리케이션을 jboss-web.xml JBoss EAP 소유 웹 애플리케이션 XML 설명자 파일에 구성하는 방법에 영향을 미칩니다. 다음은 이 파일에 남아 있는 유일한 클러스터링 구성 요소입니다.

<jboss-web>
  ...
  <max-active-sessions>...</max-active-sessions>
  ...
  <replication-config>
    <replication-granularity>...</replication-granularity>
    <cache-name>...</cache-name>
  </replication-config>
  ...
</jboss-web>

distributable-web 하위 시스템은 jboss-web.xml 의 < replication-config > 요소를 더 이상 사용하지 않습니다. 임시 배포 가능한 웹 세션 프로필을 생성하여 &lt ;replication-config >의 사용을 향상시킵니다.

세션 관리 프로필을 이름 또는 배포별 세션 관리 구성을 제공하여 기본 배포 가능한 세션 관리 동작을 재정의할 수 있습니다. 자세한 내용은 기본 배포 가능한 세션 관리 동작 덮어쓰기를 참조하십시오.

다음 표에서는 현재 사용되지 않는 jboss-web.xml 파일의 요소에 대해 유사한 동작을 수행하는 방법을 설명합니다.

구성 요소변경에 대한 설명

<max-active-sessions/>

이전에는 활성 세션 수가 < max-active-sessions/>에서 지정한 값을 초과한 경우 세션 생성이 실패했습니다.

새로운 구현에서는 &lt ;max-active-sessions/&gt;를 사용하여 세션 활성화를 활성화합니다. 세션 생성으로 인해 활성 세션 수가 < max-active-sessions/ >를 초과할 경우 세션 관리자에게 알려진 가장 오래된 세션은 새 세션을 위한 공간을 만들도록 활성화됩니다.

<passivation-config/>

JBoss EAP 7부터 이 구성 요소와 하위 요소는 더 이상 사용되지 않습니다.

<use-session-passivation/>

이전에는 이 속성을 사용하여 활성화되었습니다.

새 구현에서 < max-active-sessions/>에 대해 음수가 아닌 값을 지정하여 활성화가 활성화됩니다.

<passivation-min-idle-time/>

이전에는 세션이 활성화 후보가되기 전에 최소 시간 동안 활성화되어야했습니다. 이로 인해 활성화가 활성화된 경우에도 세션 생성이 실패할 수 있습니다.

새로운 구현은 이 논리를 지원하지 않으므로 서비스 거부(DoS) 취약성을 방지할 수 있습니다.

<passivation-max-idle-time/>

이전에는 특정 시간 동안 유휴 상태인 후 세션이 비활성화되었습니다.

새 구현은 지연 활성화만 지원합니다. 빠른 활성화는 지원하지 않습니다. 세션은 < max-active-sessions/>를 준수하는 데 필요한 경우에만 활성화됩니다.

<replication-config/>

distributable-web 하위 시스템은 이 요소를 더 이상 사용하지 않습니다. 자세한 내용은 JBoss EAP 7.4 Development Guide 의 Distributable Web Session Configurations의 배포 가능 웹 하위 시스템기본 배포 세션 관리 동작을 덮어씁니다.

<replication-trigger/>

이전에는 이 요소가 세션 복제가 트리거된 시기를 결정하는 데 사용되었습니다. 새로운 구현은 이 구성 옵션을 강력한 단일 전략으로 대체합니다. 자세한 내용은 JBoss EAP 7.4 개발 가이드의 변경 가능한 세션 속성 을 참조하십시오.

<use-jk/>

이전 버전에서는 <use-jk />에 지정된 값에 따라 mod_jk, mod_proxy_balancer, mod_cluster와 같은 로드 밸런서에서 사용하기 위해 지정된 요청을 처리하는 노드의 instance- idjsessionid 에 추가되었습니다.

새 구현에서 instance-id 가 정의된 경우 항상 jsessionid 에 추가됩니다.

<max-unreplicated-interval/>

이전에는 세션 속성이 변경되지 않은 경우 이 구성 옵션이 세션 타임스탬프의 복제를 방지하기 위한 최적화로 사용되었습니다. 세션 액세스에는 세션 속성이 변경되었는지 여부에 관계없이 캐시 트랜잭션 RPC가 필요하기 때문에 실제로는 RPC를 방지할 수 없습니다.

새 구현에서는 세션의 타임스탬프가 모든 요청에 복제됩니다. 이렇게 하면 장애 조치(failover) 이후 오래된 세션 메타데이터가 발생하지 않습니다.

<snapshot-mode/>

이전에는 < snapshot-mode/ >를 INSTANT 또는 INTERVAL 로 구성할 수 있었습니다. Infinispan의 비동기 복제를 사용하면 이 구성 옵션이 사용되지 않습니다.

<snapshot-interval/>

이는 < snapshot-mode>INTERVAL</snapshot-mode> 에서만 관련이 있었습니다. &lt ;snapshot-mode/&gt;는 더 이상 사용되지 않으므로 이 옵션도 더 이상 사용되지 않습니다.

<session-notification-policy/>

이전에는 이 속성에서 지정한 값으로 세션 이벤트를 트리거하는 정책을 정의했습니다.

새 구현에서 이 동작은 사양 중심이며 구성 불가능합니다.

이 새로운 구현에서는 write-through 캐시 저장소와 passivation 전용 캐시 저장소도 지원합니다. 일반적으로 나중 쓰기 캐시 저장소는 무효화 캐시와 함께 사용됩니다. 무효화 캐시와 함께 사용하면 JBoss EAP 6의 웹 세션 클러스터링 구현이 제대로 작동하지 않았습니다.

7.21.3. 기본 배포 가능한 세션 관리 동작 덮어쓰기

다음 방법 중 하나로 기본 배포 가능 세션 관리 동작을 재정의할 수 있습니다.

  • 이름으로 세션 관리 프로필 참조
  • 배포별 세션 관리 구성 제공
기존 세션 관리 프로필 참조
  • 기존 분산 세션 관리 프로필을 사용하려면 애플리케이션의 /WEB-INF 디렉터리에 있는 distributable-web.xml 배포 설명자를 포함합니다. 예를 들면 다음과 같습니다.

/WEB-INF/distributable-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<distributable-web xmlns="urn:jboss:distributable-web:1.0">
    <session-management name="foo"/>
</distributable-web>
  • 또는 기존 jboss-all.xml 배포 설명자 내에서 대상 분산 세션 관리 프로필을 정의합니다.

/META-INF/jboss-all.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns="urn:jboss:1.0">
    <distributable-web xmlns="urn:jboss:distributable-web:1.0">
        <session-management name="foo"/>
    </distributable-web>
</jboss>
배포별 세션 관리 프로필 사용

단일 웹 애플리케이션만 사용자 지정 세션 관리 구성을 사용하는 경우 배포 설명자 자체 내에서 구성을 정의할 수 있습니다. 애드혹 구성은 distributable-web 하위 시스템에서 사용하는 구성과 동일합니다.

  • 배포 설명자 내에서 사용자 지정 세션 관리 구성을 정의합니다. 예를 들면 다음과 같습니다.

/WEB-INF/distributable-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<distributable-web xmlns="urn:jboss:distributable-web:1.0">
    <infinispan-session-management cache-container="foo" cache="bar" granularity="SESSION">
        <primary-owner-affinity/>
    </infinispan-session-management>
</distributable-web>
  • 또는 기존 jboss-all.xml 배포 설명자 내에서 세션 관리 구성을 정의합니다.

/META-INF/jboss-all.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns="urn:jboss:1.0">
    <distributable-web xmlns="urn:jboss:distributable-web:1.0">
        <infinispan-session-management cache-container="foo" cache="bar" granularity="ATTRIBUTE">
            <local-affinity/>
        </infinispan-session-management>
    </distributable-web>
</jboss>

7.21.4. 상태 저장 세션 CDI 클러스터링 변경

JBoss EAP 6에서는 다음 방법 중 하나로 SFSB(상태 저장 세션 빈)에 대한 클러스터링 동작을 활성화해야 했습니다.

  • 세션 Cryostat에 org.jboss. Cryostat3.annotation.Clustered 주석을 추가할 수 있습니다.

    @Stateful
    @Clustered
    public class MyBean implements MySessionInt {
    
       public void myMethod() {
          //
       }
    }
  • < clustered> 요소를 jboss- Cryostat3.xml 파일에 추가할 수 있습니다.

    <c:clustering>
      <ejb-name>DDBasedClusteredSFSB</ejb-name>
      <c:clustered>true</c:clustered>
    </c:clustering>

JBoss EAP 7부터 더 이상 클러스터링 동작을 활성화할 필요가 없습니다. 기본적으로 HA 프로필을 사용하여 서버를 시작하면 SFSB의 상태가 자동으로 복제됩니다. 다음 방법 중 하나로 이 기본 동작을 비활성화할 수 있습니다.

  • Enterprise Java Cryostat 3.2 사양의 새로운 @Stateful(passivationCapable=false) 를 사용하여 단일 상태 저장 세션 빈의 기본 동작을 비활성화할 수 있습니다.
  • 서버 구성의 Cryostat 3 하위 시스템의 구성에서 전역적으로 이 동작을 비활성화할 수 있습니다.
참고

@Clustered 주석이 애플리케이션에서 제거되지 않으면 간단히 무시되며 애플리케이션 배포에 영향을 미치지 않습니다.

7.21.5. 클러스터링 서비스 변경

JBoss EAP 6에서 클러스터링 서비스 API는 개인 모듈에 있으며 지원되지 않았습니다.

JBoss EAP 7에는 애플리케이션에서 사용할 수 있는 공용 클러스터링 서비스 API가 도입되었습니다. 새로운 서비스는 경량화되고 쉽게 삽입할 수 있도록 설계되었으며 외부 종속성이 필요하지 않습니다.

  • org.wildfly.clustering.group.Group 인터페이스는 현재 클러스터 상태에 대한 액세스를 제공하며 클러스터 멤버십 변경 사항을 수신 대기할 수 있습니다.
  • 새로운 org.wildfly.clustering.dispatcher.CommandDispatcher 인터페이스를 사용하면 모두 또는 선택된 노드 하위 집합에서 클러스터에서 코드를 실행할 수 있습니다.

이러한 서비스는 이전 릴리스에서 사용 가능한 유사한 API, 즉 JBoss EAP 5 및 GroupCommunicationService,GroupMembershipNotifierGroupRpcDispatcher 의 JBoss EAP 6에서 사용 가능한 유사한 API를 대체합니다.

자세한 내용은 JBoss EAP 7.4 개발 가이드의 public API for Cryostat 서비스를 참조하십시오.

7.21.6. clustering HA Singleton 마이그레이션

JBoss EAP 6에서는 클러스터 전체 HA 싱글톤 서비스에 사용할 수 있는 공용 API가 없었습니다. 개인 org.jboss.as.clustering.singleton.* 클래스를 사용한 경우 애플리케이션을 JBoss EAP 8로 마이그레이션할 때 새 공개 org.wildfly.clustering.singleton.* 패키지를 사용하도록 코드를 변경해야 합니다.

HA 싱글톤 서비스에 대한 자세한 내용은 JBoss EAP 7.4 Development GuideHA Singleton 서비스를 참조하십시오. HA Singleton 배포에 대한 자세한 내용은 JBoss EAP 7.4 Development GuideHA Singleton 배포를 참조하십시오.

7.22. 컨텍스트 유형을 사용하여 ContextService 사용자 정의

자카르타 EE Concurrency 3.0의 일환으로 컨텍스트 유형을 사용하여 ContextService 속성을 사용자 지정할 수 있습니다. 트랜잭션 컨텍스트는 이러한 유형 중 하나입니다. 트랜잭션 컨텍스트는 use- Cryostat -setup-provider resource-definition 특성 사용을 대체합니다. use- Cryostat-setup-provider 속성이 true 로 설정된 경우 트랜잭션 컨텍스트가 지워지고 이 특성이 false 로 설정된 경우 트랜잭션 컨텍스트는 변경되지 않습니다.

Red Hat은 더 이상 벤더별 구성을 지원하지 않으므로 이러한 리소스 정의 특성이 더 이상 사용되지 않습니다. JBoss EAP 7에서 기본 구성은 use- Cryostat-setup-provider 속성을 false 로 정의했습니다. 즉, 스레드에서 컨텍스트가 실행될 때 트랜잭션 컨텍스트가 변경되지 않았습니다. 기본적으로 JBoss EAP 8에서 기본 ContextService 속성은 Jakarta EE Concurrency 3.0 사양에 맞춰져 컨텍스트 작업이 실행되기 전에 트랜잭션 컨텍스트를 지웁니다.

다른 ContextService 를 사용하려면 ContextServiceDefinition 주석을 사용하거나 XML로 지정하여 배포에 정의해야 합니다.

7.23. 더 이상 사용되지 않는 InitialContext 클래스 제거

org.jboss.naming.remote.client.InitialContextFactory 클래스는 JBoss EAP 8에서 제거됩니다. JBoss EAP 7에서 org.jboss.naming.remote.client.InitialContextFactory 클래스는 더 이상 사용되지 않으며 org.wildfly.naming.client.WildFlyInitialContextFactory 클래스로 교체되었습니다. 이 변경 사항을 반영하려면 소스 코드 또는 구성 파일을 마이그레이션해야 합니다.

구성 변경 이름:

  • 사용자 애플리케이션이 시스템 또는 환경 속성을 사용하는 경우 java.naming.factory.initial 속성을 java.naming.factory.initial=org.jboss.naming.client.InitialContextFactory.InitialContextFactory에서 java.naming.factory.initial=org.wildfly.naming.client.wildfly.naming.client 에서 마이그레이션해야 합니다.
  • 사용자 애플리케이션이 < soapjms:jndiInitialContextFactory >를 포함하는 WSDL 계약을 사용하는 경우 해당 값은 < soapjms:jndiInitialContextFactory>org에서 마이그레이션해야 합니다.jboss.naming.remote.client.InitialContextFactory<soapjms:jndiInitialContextFactory> < soapjms:jndiInitialContextFactory>org.wildfly.naming.client.WildFlyInitialContextFactory<soapjms:jndiInitialContextFactory > .
  • 사용자 애플리케이션이 Java 코드를 사용하여 원격 이름을 구성하는 경우 Properties env = new Properties();env.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.getName()); env.put(Context.INITIAL_CONTEXT_FACTORY) 에서 env.put(Context.INITIAL_CONTEXT_FACYTORY)에서 업데이트해야 합니다. org.wildfly.naming.client.WildFlyInitialContextFactory.class.getName());.

org.wildfly.client.ProviderEnvironment 클래스에서 아래 나열된 방법은 JBoss EAP 7에서 더 이상 사용되지 않으며 이제 코드, 문서 및 웹 속성에서 문제가 있는 언어를 교체하려는 Red Hat의 노력의 일부로 JBoss EAP 8에서 제거되었습니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

제거된 메서드가 포함된 모든 코드는 해당 교체를 사용하여 리팩토링해야 합니다.

  • getBlackList()getBlockList()로 교체됨
  • updateBlacklist(URI)updateBlockList(URI)로 교체됨
  • dropFromBlacklist(URI)dropFromBlocklist(URI)로 대체됨

7.24. 리소스 어댑터

Jakarta Connectors Resource Adapter를 사용하면 애플리케이션이 모든 메시징 공급자와 통신할 수 있습니다. Jakarta EE 구성 요소(예: Jakarta) 및 기타 Jakarta Enterprise Cryostats 및 Servlet도 메시지를 보내거나 수신할 수 있는 방법을 구성합니다.

7.24.1. IBM MQ Resource Adapter 배포

IBM MQ는 분산 시스템의 애플리케이션이 서로 통신할 수 있는 IBM의 메시징 오리엔드 미들웨어(MOM) 제품입니다. 이는 메시지 및 메시지 큐를 사용하여 수행됩니다. IBM MQ는 메시지 큐에 메시지를 전달하고 메시지 채널을 사용하여 다른 대기열 관리자에게 데이터를 전송합니다. IBM MQ에 대한 자세한 내용은 IBM MQ on the IBM products website를 참조하십시오.

요약

IBM MQ는 JBoss EAP 8.0의 외부 Java Message Service 공급자로 구성할 수 있습니다. 이 섹션에서는 JBoss EAP에서 IBM MQ 리소스 어댑터를 배포하고 구성하는 단계를 설명합니다. 이 배포 및 구성은 관리 CLI 도구 또는 웹 기반 관리 콘솔을 사용하여 수행할 수 있습니다. IBM MQ의 지원되는 구성에 대한 최신 정보는 JBoss EAP 지원 구성을 참조하십시오.

참고

구성 변경 사항을 적용하려면 IBM MQ 리소스 어댑터를 구성한 후 시스템을 다시 시작해야 합니다.

JBoss EAP 8.0은 자카르타 EE 10 구현이므로 모든 EE API에 사용되는 패키지가 javax에서 jakarta로 변경되었으며 Jakarta EE 10 호환 리소스 어댑터가 필요합니다. JBoss EAP 7.x 이전 버전에서 IBM MQ Resource 어댑터를 사용하는 경우 이 jakarta 네임스페이스를 사용하는 IBM MQ Resource Adapter인 wmq.jakarta.jmsra.rar 를 사용해야 합니다.

  • wmq.jmsra.rar 에 대한 이전 리소스 어댑터 구성을 제거 및 배포 해제하고 wmq.jakarta.jmsra.rar를 사용합니다.
  • wmq.jakarta.jmsra.rar 를 배포하고 이 섹션에 있는 단계에 따라 를 구성합니다.

사전 요구 사항

시작하기 전에 IBM MQ 리소스 어댑터의 버전을 확인하고 구성 속성을 이해해야 합니다.

  • IBM MQ 리소스 어댑터는 wmq.jakarta.jmsra.rar 라는 리소스 아카이브(RAR) 파일로 제공됩니다. /opt/mqm/java/lib/jca/ wmq.jakarta.jmsra.rar 에서 wmq.jakarta.jmsra.rar 파일을 가져올 수 있습니다. JBoss EAP의 각 릴리스에서 지원되는 특정 버전에 대한 자세한 내용은 JBoss EAP 지원 구성 을 참조하십시오.
  • 다음 IBM MQ 구성 값을 알고 있어야 합니다. 이러한 값에 대한 자세한 내용은 IBM MQ 제품 설명서를 참조하십시오.

    • MQ_QUEUE_MANAGER: IBM MQ 큐 관리자의 이름
    • MQ_HOST_NAME: IBM MQ 큐 관리자 연결에 사용되는 호스트 이름입니다.
    • MQ_CHANNEL_NAME: IBM MQ 큐 관리자 연결에 사용되는 서버 채널
    • MQ_QUEUE_NAME: 대상 대기열의 이름입니다.
    • MQ_TOPIC_NAME: 대상 주제의 이름
    • MQ_PORT: IBM MQ 큐 관리자 연결에 사용되는 포트
    • MQ_CLIENT: 전송 유형
  • 아웃바운드 연결의 경우 다음 구성 값도 숙지해야 합니다.

    • MQ_CONNECTIONFACTORY_NAME: 원격 시스템에 대한 연결을 제공할 연결 팩토리 인스턴스의 이름입니다.

프로세스

다음은 IBM에서 제공하는 기본 구성이며 변경될 수 있습니다. 자세한 내용은 IBM MQ 설명서를 참조하십시오.

  1. 먼저 wmq.jakarta.jmsra.rar 파일을 EAP_HOME/standalone/deployments/ 디렉터리에 복사하여 리소스 어댑터를 수동으로 배포합니다.
  2. 다음으로 관리 CLI를 사용하여 리소스 어댑터를 추가하고 구성합니다.

    /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar:add(archive=wmq.jakarta.jmsra.rar, transaction-support=XATransaction)

    transaction-support 요소는 XATransaction 으로 설정되었습니다. 트랜잭션을 사용하는 경우 아래 예제와 같이 XA 복구 데이터 소스의 보안 도메인을 제공해야 합니다.

    /subsystem=resource-adapters/resource-adapter=test/connection-definitions=test:write-attribute(name=recovery-security-domain,value=myDomain)

    XA 복구에 대한 자세한 내용은 JBoss EAP 7.4 구성 가이드의 XA 복구 구성을 참조하십시오.

    배포가 아닌 경우 트랜잭션 지원 값을 NoTransaction 으로 변경합니다.

    /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar:add(archive=wmq.jakarta.jmsra.rar, transaction-support=NoTransaction)
  3. 이제 리소스 어댑터가 생성되었으므로 필요한 구성 요소를 추가할 수 있습니다.

    1. 큐에 대한 admin-object 를 추가하고 해당 속성을 구성합니다.

      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=queue-ao:add(class-name=com.ibm.mq.jakarta.connector.outbound.MQQueueProxy, jndi-name=java:jboss/MQ_QUEUE_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=queue-ao/config-properties=baseQueueName:add(value=MQ_QUEUE_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=queue-ao/config-properties=baseQueueManagerName:add(value=MQ_QUEUE_MANAGER)
    2. 주제의 admin-object 를 추가하고 해당 속성을 구성합니다.

      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=topic-ao:add(class-name=com.ibm.mq.jakarta.connector.outbound.MQTopicProxy, jndi-name=java:jboss/MQ_TOPIC_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=topic-ao/config-properties=baseTopicName:add(value=MQ_TOPIC_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/admin-objects=topic-ao/config-properties=brokerPubQueueManager:add(value=MQ_QUEUE_MANAGER)
    3. 관리되는 연결 팩토리에 대한 연결 정의를 추가하고 해당 속성을 구성합니다.

      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd:add(class-name=com.ibm.mq.jakarta.connector.outbound.ManagedConnectionFactoryImpl, jndi-name=java:jboss/MQ_CONNECTIONFACTORY_NAME, tracking=false)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd/config-properties=hostName:add(value=MQ_HOST_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd/config-properties=port:add(value=MQ_PORT)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd/config-properties=channel:add(value=MQ_CHANNEL_NAME)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd/config-properties=transportType:add(value=MQ_CLIENT)
      
      /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar/connection-definitions=mq-cd/config-properties=queueManager:add(value=MQ_QUEUE_MANAGER)
  4. JBoss EAP의 OVS3 메시징 시스템의 기본 공급자를 JBoss EAP 8.0 메시징 시스템에서 IBM MQ로 변경하려면 관리 CLI를 사용하여 다음과 같이 Cryostat 3 하위 시스템을 수정합니다.

    /subsystem=ejb3:write-attribute(name=default-resource-adapter-name,value=wmq.jakarta.jmsra.rar)
  5. 다음과 같이 Cryostat 코드에서 @ActivationConfigProperty@ResourceAdapter 주석을 구성합니다.

    @MessageDriven(name="IbmMqMdb", activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "jakarta.jms.Queue"),
        @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "false"),
        @ActivationConfigProperty(propertyName = "hostName", propertyValue = "MQ_HOST_NAME"),
        @ActivationConfigProperty(propertyName = "port", propertyValue = "MQ_PORT"),
        @ActivationConfigProperty(propertyName = "channel", propertyValue = "MQ_CHANNEL_NAME"),
        @ActivationConfigProperty(propertyName = "queueManager", propertyValue = "MQ_QUEUE_MANAGER"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "MQ_QUEUE_NAME"),
        @ActivationConfigProperty(propertyName = "transportType", propertyValue = "MQ_CLIENT")
    })
    
    @ResourceAdapter(value = "wmq.jakarta.jmsra-VERSION.rar")
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public class IbmMqMdb implements MessageListener {
    }

    @ResourceAdapter 값의 VERSION 을 RAR 이름에 있는 실제 버전으로 교체해야 합니다.

  6. 리소스 어댑터를 활성화합니다.

    /subsystem=resource-adapters/resource-adapter=wmq.jakarta.jmsra.rar:activate()

7.24.1.1. IBM MQ 리소스 어댑터의 제한 사항 및 알려진 문제

다음 표에는 IBM MQ 리소스 어댑터의 알려진 문제가 나열되어 있습니다. version 열의 확인 표시를 통해 해당 리소스 어댑터 버전에 문제가 있음을 나타냅니다.

표 7.2. IBM MQ 리소스 어댑터의 알려진 문제

JIRA문제에 대한 설명IBM MQ 9

JBEAP-503

IBM MQ 리소스 어댑터는 Queue.toString()QueueBrowser.getQueue().toString() 메서드에 대해 다른 문자열 값을 반환합니다. queue은 Queue Browser. htmlQueueBrowser.getQueueBrowser.getQueue() 메서드에서 반환하는 com.ibm.mq.jms.MQQueue 클래스와 다른 com.ibm.mq.connector.outbound.MQQueue Proxy 클래스의 인스턴스입니다. 이러한 클래스에는 toString() 메서드의 다양한 구현이 포함됩니다. 이러한 toString() 메서드에 의존하여 동일한 값을 반환할 수 없습니다.

JBEAP-511, JBEAP-550, JBEAP-3686

IBM MQ의 메시지 속성 이름에 다음과 같은 제한 사항이 적용됩니다.

  • 배포 설명자의 activation-config 섹션에서 _,& amp; 또는 | 와 같은 특수 문자를 사용하여 destinationName 속성을 구성해서는 안 됩니다. 이러한 문자를 사용하면 Cryostat 배포가 com.ibm.msg.client.jms.DetailedInvalidDestinationException 예외와 함께 실패합니다.
  • 배포 설명자의 activation-config 섹션에서 java:/ 접두사를 사용하여 destinationName 속성을 구성해서는 안 됩니다. 이 접두사를 사용하면 Cryostat 배포가 com.ibm.msg.client.jms.DetailedInvalidDestinationException 예외와 함께 실패합니다.
  • 속성은 IBM MQ JMS 클래스에서 사용하도록 예약되므로 "JMS" 또는 "usr.JMS"로 시작하지 않아야 합니다. IBM Knowledge Center 웹 사이트에서 예외가 설명되어 있습니다.

메시지 속성 이름 제한 사항의 전체 목록은 IBM MQ, 버전 9.0 의 속성 이름 제한 사항을 참조하십시오.

JBEAP-549

@ActivationConfigProperty 주석을 사용하여 Cryostat의 대상 속성 이름 값을 지정하는 경우 모든 대문자를 사용해야 합니다. 예를 들면 다음과 같습니다.

@ActivationConfigProperty(propertyName = "destination", propertyValue = "QUEUE")

JBEAP-624

IBM MQ 리소스 어댑터를 사용하여 @JMSConnectionFactoryDefinition 주석을 사용하여 Jakarta EE 배포에 연결 팩토리를 생성하는 데 사용되는 경우 resourceAdapter 속성을 지정해야 합니다. 그러지 않으면 배포에 실패합니다.

@JMSConnectionFactoryDefinition(
    name = "java:/jms/WMQConnectionFactory",
    interfaceName = "javax.jms.ConnectionFactory",
    resourceAdapter = "wmq.jmsra",
    properties = {
        "channel=<channel>",
        "hostName=<hostname_wmq_broker>",
        "transportType=<transport_type>",
        "queueManager=<queue_manager>"
    }
)

JBEAP-2339

IBM MQ 리소스 어댑터는 연결이 시작되기 전에도 큐 및 주제의 메시지를 읽을 수 있습니다. 즉, 사용자가 연결을 시작하기 전에 메시지를 사용할 수 있습니다. 이 문제를 방지하려면 IBM MQ 리소스 어댑터에서 생성한 연결 팩토리가 아닌 external-context 를 사용하여 원격 IBM MQ 브로커가 생성한 연결 팩토리를 사용하십시오.

JBEAP-3685

< Cryostat -support>XATransaction</ Cryostat-support >가 설정되면 JMSContext 가 항상 JMSContext.SESSION_TRANSACTED 로 설정됩니다. 삽입을 사용하여 생성되었는지 여부에 관계없이 JMSContext는 항상 JMSContext.SESSION_TRANSACTED입니다.

다음 코드 예제에서는 @JMSSessionMode(JMSContext.DUPS_OK_ACKNOWLEDGE) 가 무시되고 JMSContext는 JMSContext.SESSION_TRANSACTED 로 유지됩니다.

@Inject
@JMSConnectionFactory("jms/CF")
@JMSPasswordCredential(userName="myusername", password="mypassword")
@JMSSessionMode(JMSContext.DUPS_OK_ACKNOWLEDGE)
transient JMSContext context3;

JBEAP-14633

JMS 사양에 따라 QueueSession 인터페이스는 게시/서브스크립션 도메인과 관련된 개체를 생성하는 데 사용할 수 없으며 Session 에서 상속하는 특정 메서드는 javax.jms.IllegalStateException 을 발생시켜야 합니다. 이러한 메서드 중 하나는 이러한 QueueSession.createTemporaryTopic() 입니다. IBM MQ 리소스 어댑터는 javax.jms.IllegalStateException 을 throw하는 대신 java.lang.NullPointerException 을 생성합니다.

JBEAP-14634

MQTopicProxy.getTopicName() 은 IBM MQ 브로커가 설정한 것과 다른 주제 이름을 반환합니다. 예를 들어 주제 이름이 topic://MYTOPIC?XMSC_WMQ_BROKER_PUBQ_QMGR=QM 로 설정된 경우 MQTopicProxytopic://MYTOPIC 을 반환합니다.

JBEAP-14636

JMSContext 의 기본 autoStart 설정은 false 입니다. 즉, 소비자가 생성될 때 JMSContext 에서 사용하는 기본 연결은 자동으로 시작되지 않습니다. 이 설정은 기본적으로 true 여야 합니다.

JBEAP-14640

IBM MQ 리소스 어댑터는 잘못된 인증 정보를 사용할 때 JMSSecurity Exception 대신 Detailed JMSException을 생성하고 서버 콘솔에 다음 오류를 기록합니다.

WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.PoolByCri] (EJB default - 7) IJ000604: Throwable while attempting to get a new connection: null: com.ibm.mq.connector.DetailedResourceException: MQJCA1011: Failed to allocate a JMS connection., error code: MQJCA1011 An internal error caused an attempt to allocate a connection to fail. See the linked exception for details of the failure.

다음은 이 문제를 일으킬 수 있는 코드의 예입니다.

QueueConnection qc = queueConnectionFactory.createQueueConnection("invalidUserName", "invalidPassword");

JBEAP-14642

MQMessageProducer.send(Destination destination, Message message)MQMessageProducer.send(Destination destination, MessageProducer.send(Destination destination, int deliveryMode, int priority, long timeToLive, CompletionListener completionListener) 방법의 리소스 어댑터에서 잘못된 클래스 캐스트 변환으로 인해 IBM MQ 리소스 어댑터가 JMSException 을 생성하고 다음 오류 메시지를 서버 콘솔에 기록합니다.

SVR-ERROR: Expected JMSException, received com.ibm.mq.connector.outbound.MQQueueProxy cannot be cast to com.ibm.mq.jms.MQDestination

큐 또는 주제 조회에 사용되는 JNDI 이름이 com.ibm.mq.connector.outbound.MQQueueProxy/MQTopicProxy 이기 때문입니다.

JBEAP-14643

JMSProducer 인터페이스의 setDeliveryDelay(expDeliveryDelay) 방법은 설정을 변경하지 않습니다. 이 메서드를 호출한 후에는 기본 설정 0 으로 유지됩니다.

JBEAP-14670

UserTransaction.begin() 이전에 생성된 QueueSession 에서 작업이 수행되는 경우 해당 작업은 트랜잭션의 일부로 간주되지 않습니다. 즉, 이 세션을 사용하여 큐로 전송된 메시지는 UserTransaction.commit() 에 의해 커밋되지 않으며 UserTransaction.rollback() 이후 메시지는 큐에 남아 있습니다.

JBEAP-14675

연결을 종료한 다음 동일한 clientID 를 사용하여 JMSContext 를 즉시 생성하면 IBM MQ 리소스 어댑터가 간헐적으로 서버 콘솔에 다음 오류를 기록합니다.

ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /jmsServlet-1.0-SNAPSHOT/: com.ibm.msg.client.jms.DetailedJMSRuntimeException: MQJCA0002: An exception occurred in the IBM MQ layer. See the linked exception for details.
A call to IBM MQ classes for Java(tm) caused an exception to be thrown.

이 문제는 동일한 clientID 와의 연결이 종료된 후 새 JMSContext 를 생성하는 데 지연이 있는 경우 발생하지 않습니다.

JBEAP-15535

컨테이너 관리 트랜잭션(CMT)에서 상태 저장 세션 빈이 메시지를 주제로 보내려고 하면 다음 메시지와 함께 메시지 전송이 실패합니다.

SVR-ERROR: com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ2007: Failed to send a message to destination 'MDB_NAME TOPIC_NAME'

스택 추적은 다음 예외로 인해 발생할 수 있음을 보여줍니다.

com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2072' ('MQRC_SYNCPOINT_NOT_AVAILABLE')
 

JBEAP-25561

JMSReplyTo 헤더 세트를 사용하여 대상으로 메시지가 전송되면 IBM MQ 9 브로커에 도달한 후 수정됩니다. 결과적으로 응답의 응답 메시지는 수정된 JMS_REPLY 헤더에 정의된 대상으로 전달됩니다.

예를 들어, JMSReplyTo 헤더가 헤더 message.setJMSReplyTo(queue)를 사용하여 이름이 queue:///MYQUEUE 인 queue 로 설정되고 QM 이라는 큐 관리자가 있는 IBM MQ 9.3 브로커로 전송된 경우 해당 이름이 queue://QM/MYQUEUE 로 변경됩니다.

7.24.2. Apache Log4j 버전 1 API 제거

JBoss EAP 8부터 Apache Log4j 버전 1 API에 대한 지원이 중지되었습니다. log4j.jarlog4j 구성을 패키징하지 않은 모든 애플리케이션을 업데이트해야 합니다.

영향:

로그 메시지는 로깅 하위 시스템을 기반으로 더 이상 라우팅되지 않습니다. 애플리케이션이 log4j.jar 패키징하지 않고 다음 명령문 중 하나라도 true인 경우 마이그레이션 변경 사항이 필요합니다.

  • 배포에서 log4j 를 사용하고 log4j 구성 파일을 포함하지 않는 경우 새 로깅 facade로 마이그레이션하거나 log4j 구성을 배포에 추가해야 합니다.
  • 배포에서 log4j.xml,log4j.properties 또는 jboss-log4j.xml 파일을 사용하는 경우 애플리케이션에 log4j.jar 를 패키징하지 않습니다. jboss-log4j.xml 파일인 경우 파일 이름을 log4j.xml 로 변경해야합니다.
  • custom-handler의 JBoss EAP Logging 하위 시스템에서 log4j v1 appender를 사용하면 더 이상 지원되지 않습니다.
  • 애플리케이션 클래스가 org.apache.log4j.Logger 와 같은 클래스를 가져오는 경우.
  • 애플리케이션에 jboss-deployment-structure.xml 이 포함되어 있거나 MANIFEST.MF 에 org.jboss.log4j.logmanager 에 대한 모듈 종속성을 선언하는 Dependencies 가 지정된 경우 이러한 종속 항목을 제거해야 합니다.

마이그레이션:

  • Apache Log4jv2 클래스를 사용하도록 애플리케이션 클래스를 업데이트하거나 JBoss EAP 8에서 제공하는 다른 로깅 API 중 하나를 사용합니다.
  • org.apache.log4j.Logger(log4j v1) 클래스를 org.apache.logging.log4j.Logger(log4j v2) 로 변경합니다.
  • 애플리케이션 패키지 log4j.properties,log4j.xml 또는 jboss-log4j.xml 인 경우::

    • JBoss EAP 구성에서 로깅을 구성합니다.
    • 애플리케이션에서 log4jv2 구성 파일이 지원되지 않으므로 애플리케이션에서 logging.properties 를 구성합니다.

또는

  • 로깅 API의 JBoss EAP 8에 따라 대신 Apache Log4j 버전 1 JAR을 애플리케이션에 패키징합니다. 로깅 하위 시스템의 jboss-deployment-structure.xml exclude-subsystems 를 통해 애플리케이션에서 JBoss Logging API를 제외할 수도 있습니다.

추가 세부 정보:

특정 배포에 대한 암시적 로깅 종속 항목 비활성화
  • 애플리케이션의 jboss-deployment-structure.xml 에서는 다음과 같은 로깅 하위 시스템을 제외하도록 exclude-subsystems 를 구성합니다.
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
  <deployment>
    <exclude-subsystems>
      <subsystem name="logging"/>
    </exclude-subsystems>
  </deployment>
</jboss-deployment-structure>
  • 애플리케이션이 EAR 파일이고 example.war 라는 하위 배포가 있는 경우, jboss-deployment-structure.xml 파일은 EAR 파일 위치 / META-INF/jboss-deployment-structure.xml 에 있으며 로깅 하위 시스템은 다음과 같은 하위 배포에서 선언하여 제외됩니다.
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
  <sub-deployment name="example.war">
    <exclude-subsystems>
      <subsystem name="logging"/>
    </exclude-subsystems>
  </sub-deployment>
</jboss-deployment-structure>
모든 배포에 대한 암시적 로깅 종속 항목 비활성화

기본적으로 배포에서 로깅 API를 사용할 수 없도록 하려면 다음 CLI 명령을 사용하여 add-logging-api-dependenciesfalse 로 설정합니다.

/subsystem=logging:write-attribute(name="add-logging-api-dependencies", value="false")

JBoss Module 및 Logging API를 종속성으로 설정하려면 jboss-deployment-structure.xml 또는 MANIFEST.MF 구성 파일을 수정합니다.

<subsystem xmlns="urn:jboss:domain:logging:8.0">
    <add-logging-api-dependencies value="false"/>
  ...
</subsystem>
참고

애플리케이션에서 Apache Log4j v1 JAR 및 log4j 구성을 패키징하는 애플리케이션: * 애플리케이션 로깅이 더 이상 EAP에서 관리되지 않는 경우 애플리케이션 관리입니다. * 로깅 프레임워크가 특정 로그 파일에 작성될 것으로 예상되므로 애플리케이션이 server.log 에 예기치 않은 결과를 쓰려고 시도하지 않아야 합니다.

자세한 내용은 JBoss EAP 8.0에서 Apache Log4j 버전 1이 더 이상 제공되지 않음을 참조하십시오.

8장. 기타 변경 사항

이 섹션에서는 이 릴리스에서 발생하는 다양한 기타 변경 사항에 대한 개요를 제공합니다.

8.1. JBoss EAP Natives 및 Apache HTTP Server 제공의 변경 사항

JBoss EAP 8.0 네이티브는 이 릴리스에서 JBoss EAP 6와 다르게 제공됩니다. 일부 구성 요소에는 Red Hat JBoss Core Services 제품이 포함되어 있으며, 이는 Red Hat JBoss 미들웨어 제품 중 많은 제품에 공통된 보조 소프트웨어 세트입니다. 새 제품을 사용하면 업데이트를 더 빠르게 배포하고 더 일관된 업데이트 환경을 제공할 수 있습니다. JBoss Core Services 제품은 Red Hat 고객 포털의 전용 위치에서 다운로드할 수 있습니다.

  • 다음 표에는 릴리스 간 제공 방법의 차이점이 나열되어 있습니다.

    패키지JBoss EAP 6JBoss EAP 8.0

    AIO Natives for Messaging

    별도의 "Native Cryostat" 다운로드에서 제품과 함께 제공

    JBoss EAP 배포판에 포함되어 있습니다.

    Apache HTTP Server

    별도의 "Apache HTTP Server" 다운로드에서 제품과 함께 제공

    새로운 JBoss Core Services 제품과 함께 제공

    mod_cluster, mod_jk, isapi 및 nsapi 커넥터

    별도의 "Webserver Connector Natives" 다운로드에서 제품과 함께 제공

    새로운 JBoss Core Services 제품과 함께 제공

    JSVC

    별도의 "Native Cryostat" 다운로드에서 제품과 함께 제공

    새로운 JBoss Core Services 제품과 함께 제공

    OpenSSL

    별도의 "Native Cryostat" 다운로드에서 제품과 함께 제공

    새로운 JBoss Core Services 제품과 함께 제공

    tcnatives

    별도의 "Native Components" 다운로드에서 제품과 함께 제공

    JBoss EAP 7에서는 tcnatives에 대한 지원이 제거되었습니다.

JBoss EAP Natives 및 Apache HTTP Server에 대한 추가 변경 사항

  • 다음 변경 사항도 알고 있어야 합니다.

    • Red Hat Enterprise Linux RPM 채널에서 Apache HTTP Server와 함께 사용되는 mod_cluster 및 mod_jk 커넥터에 대한 지원이 삭제되었습니다. Red Hat Enterprise Linux RPM 채널에서 Apache HTTP Server를 실행하고 JBoss EAP 8.0 서버에 대한 로드 밸런싱을 구성해야 하는 경우 다음 중 하나를 수행할 수 있습니다.

  • JBoss Core Services 에 대한 자세한 내용은 Apache HTTP Server 설치 가이드에서 확인할 수 있습니다.

8.2. Amazon EC2에 배포 변경

JBoss EAP 7의 Amazon Machine Images(AMI)에 대해 몇 가지 변경 사항이 있었습니다. 이 섹션에서는 이러한 변경 사항 중 일부를 간략하게 설명합니다.

  • Amazon EC2에서 비클러스터형 및 클러스터형 JBoss EAP 인스턴스 및 도메인을 시작하는 방식이 크게 변경되었습니다.
  • JBoss EAP 6에서 구성은 User Data: 필드에 의존했습니다. JBoss EAP 7에서는 User Data: 필드에서 구성을 구문 분석하고 인스턴스 시작 시 서버를 자동으로 시작하는 AMI 스크립트가 제거되었습니다.
  • Red Hat JBoss Operations Network 에이전트는 JBoss EAP 6에 설치되었습니다. JBoss EAP 7.0부터 별도로 설치해야 합니다.

Amazon EC2에 JBoss EAP 7을 배포하는 방법에 대한 자세한 내용은 Amazon Web Services에 JBoss EAP 배포를 참조하십시오.

8.3. 공유 모듈이 포함된 애플리케이션 제거

JBoss EAP 7.1 서버에 도입된 변경 사항 및 Maven 플러그인으로 인해 애플리케이션 제거를 시도할 때 다음과 같은 오류가 발생할 수 있습니다. 애플리케이션에 상호 작용하거나 서로 의존하는 모듈이 포함된 경우 이 오류가 발생할 수 있습니다.

WFLYCTL0184:    New missing/unsatisfied dependencies

예를 들어 data- sharing 모듈에서 관리하는 데이터를 공유하는 두 개의 Maven WAR 프로젝트 모듈인 application-Aapplication-B 가 포함된 애플리케이션이 있다고 가정합니다.

이 애플리케이션을 배포할 때 공유 데이터 공유 모듈을 먼저 배포한 다음 이를 사용하는 모듈을 배포해야 합니다. 배포 순서는 상위 pom.xml 파일의 <modules > 요소에 지정됩니다. 이는 JBoss EAP 6.4부터 JBoss EAP 8.0까지 마찬가지입니다.

JBoss EAP 7.1 이전의 릴리스에서는 다음 명령을 사용하여 상위 프로젝트의 루트에서 이 애플리케이션의 모든 아카이브 배포를 취소할 수 있습니다.

$ mvn wildfly:undeploy

JBoss EAP 7.1 이상에서는 먼저 공유 모듈을 사용하는 아카이브 배포를 취소한 다음 공유 모듈 배포를 취소해야 합니다. pom.xml 파일에서 배포 취소 순서를 지정할 수 없으므로 수동으로 모듈 배포를 취소해야 합니다. 상위 디렉터리의 루트에서 다음 명령을 실행하여 이 작업을 수행할 수 있습니다.

$ mvn wildfly:undeploy -pl application-A,application-B
$ mvn wildfly:undeploy -pl data-shared

업데이트된 배포 취소 동작이 더 정확하고 불안정한 배포 상태가 되지 않도록 합니다.

8.4. add-user 스크립트 변경

암호 정책이 변경되어 JBoss EAP 7에서 add-user 스크립트 동작이 변경되었습니다. JBoss EAP 6에는 엄격한 암호 정책이 있습니다. 결과적으로 add-user 스크립트는 최소 요구 사항을 충족하지 않은 약한 암호를 거부했습니다. JBoss EAP 7부터는 약한 암호가 허용되며 경고가 표시됩니다. 자세한 내용은 JBoss EAP 7.4 구성 가이드에서 사용자 유틸리티 암호 제한 설정을 참조하십시오.

8.5. OSGi 지원 제거

JBoss EAP 6.0 GA가 처음 출시되었을 때 OSGi 사양 구현인 JBoss OSGi는 기술 프리뷰 기능으로 포함되었습니다. JBoss EAP 6.1.0 릴리스와 함께 JBoss OSGi는 기술 프리뷰에서 Unsupported로 시연되었습니다.

JBoss EAP 6.1.0에서는 독립 실행형 서버의 configadminosgi 확장 모듈 및 하위 시스템 구성이 별도의 EAP_HOME/standalone/configuration/standalone-osgi.xml 구성 파일로 이동되었습니다. 지원되지 않는 이 구성 파일을 마이그레이션해서는 안 되므로 JBoss OSGi 지원을 제거해도 독립 실행형 서버 구성 마이그레이션에 영향을 미치지 않습니다. osgi 또는 configadmin 을 구성하기 위해 다른 독립 실행형 구성 파일을 수정한 경우 해당 구성을 제거해야 합니다.

관리형 도메인의 경우 osgi 확장 및 하위 시스템 구성이 JBoss EAP 6.1.0 릴리스의EAP_HOME/domain/configuration/domain.xml 파일에서 제거되었습니다. 그러나 configadmin 모듈 확장 및 하위 시스템 구성은 EAP_HOME/domain/configuration/domain.xml 파일에 남아 있습니다. JBoss EAP 7부터 이 구성은 더 이상 지원되지 않으며 제거해야 합니다.

8.6. Java용 Attachments API를 사용하여 Cryostat 변경

JBoss EAP 8.0으로 마이그레이션할 때 SAAJ 3.0 사양을 준수하도록 사용자 정의 Cryostat 처리기를 업데이트합니다.

9장. Elytron으로 마이그레이션

JBoss EAP 7.1에는 독립 실행형 서버와 관리형 도메인 모두에 대한 액세스를 관리하고 구성할 수 있는 단일 통합 프레임워크를 제공하는 Elytron이 도입되었습니다. 또한 JBoss EAP 서버에 배포된 애플리케이션에 대한 보안 액세스를 구성하는 데 사용할 수 있습니다.

JBoss EAP 8.0부터는 애플리케이션을 마이그레이션하는 데 기존 보안 하위 시스템으로 Elytron을 사용해야 합니다.

9.1. Elytron 개요

중요

Elytron과 CryostatetBox를 기반으로 하는 레거시 보안 하위 시스템의 아키텍처는 매우 다릅니다. Elytron을 사용하면 현재 운영 중인 동일한 보안 환경에서 작업할 수 있는 솔루션을 만들기 위한 시도가 이루어졌지만 Elytron에서 모든 CryostatetBox 구성 옵션에 동일한 구성 옵션이 있는 것은 아닙니다.

기존 보안 구현을 사용할 때 Elytron을 사용하여 유사한 기능을 달성하는 데 도움이 되는 문서에서 정보를 찾을 수 없는 경우 다음 방법 중 하나로 도움말을 찾을 수 있습니다.

  • Red Hat 개발 서브스크립션이 있는 경우 Red Hat 고객 포털에서 지원 케이스,솔루션기술 문서에 액세스할 수 있습니다. 기술 지원 케이스를 열고 아래에 설명된 대로 WildFly 커뮤니티에서 도움을 받을 수도 있습니다.
  • Red Hat Development 서브스크립션이 없는 경우에도 Red Hat 고객 포털에서 기술 문서에 계속 액세스할 수 있습니다. 또한 사용자 포럼과 실시간 채팅 에 참여하여 WildFly 커뮤니티의 질문을 할 수도 있습니다. WildFly 커뮤니티 오퍼링은 Elytron 엔지니어링 팀이 적극적으로 모니터링합니다.

elytron 하위 시스템에서 사용할 수 있는 새 리소스에 대한 개요는 JBoss EAP 7.4 Security Architecture 의 Elytron Cryostat 리소스 를 참조하십시오.

9.2. Secure Vault 및 속성 마이그레이션

Elytron을 사용하려면 보안 자격 증명 모음을 마이그레이션하여 인증 정보 스토리지를 보호하고 레거시 보안 속성을 Elytron 보안 속성으로 마이그레이션해야 합니다.

9.2.1. Secure Vault를 Secure Credential Storage로 마이그레이션

JBoss EAP 7.0의 레거시 보안 하위 시스템에서 일반 텍스트 문자열 암호화를 저장하는 데 사용되는 보안 자격 증명 모음은 JBoss EAP 7.1 이상에서 Elytron과 호환되지 않습니다. JBoss EAP 7.1 이상에서는 자격 증명 저장소를 사용하여 문자열을 저장합니다. 자격 증명은 JBoss EAP 구성 파일 외부의 스토리지 파일에 암호화 자격 증명을 저장합니다. Elytron에서 제공하는 구현을 사용하거나 인증 정보 저장소 API 및 SPI를 사용하여 구성을 사용자 지정할 수 있습니다. 각 JBoss EAP 서버에는 여러 인증 정보 저장소가 포함될 수 있습니다.

참고

이전에 vault 표현식을 사용하여 중요하지 않은 데이터를 매개 변수화하는 경우 데이터를 Elytron 보안 속성으로 교체해야 합니다. Elytron 보안 속성에 대한 자세한 내용은 Elytron 보안 속성을 참조하십시오.

인증 정보 저장소에 대한 자세한 내용은 JBoss EAP 7.4 서버 보안 구성 방법의 인증 정보 저장소를 참조하십시오.

9.2.1.1. WildFly Elytron 툴을 사용하여 자격 증명 모음 데이터 마이그레이션

JBoss EAP와 함께 제공되는 WildFly Elytron Tool은 자격 증명 모음 콘텐츠를 자격 증명 저장소로 마이그레이션하는 데 도움이 되는 vault 명령을 제공합니다. vault 명령을 실행하려면 EAP_HOME/bin 디렉터리에서 elytron-tool 스크립트를 실행합니다.

$ EAP_HOME/bin/elytron-tool.sh vault VAULT_ARGUMENTS

다음 명령을 사용하여 사용 가능한 모든 인수에 대한 설명을 가져올 수 있습니다.

$ EAP_HOME/bin/elytron-tool.sh vault --help
중요

인증 정보 저장소는 암호 보안에만 사용됩니다. 관리 모델에 사용된 자격 증명 모음 표현식 기능은 지원되지 않습니다. 자세한 내용은 Elytron에서 암호화된 표현 생성을참조하십시오.

다음 마이그레이션 옵션 중 하나를 선택합니다.

참고
  • WildFly Elytron Tool은 보안 자격 증명 모음 데이터 파일의 첫 번째 버전을 처리할 수 없습니다.
  • 다음 예와 같이 단일 자격 증명 모음 또는 일반 텍스트로 --keystore-password 인수를 마스킹된 형식으로 입력할 수 있습니다.
  • --salt--iteration 인수는 마스크된 암호를 해독하거나 출력에 마스크된 암호를 생성하는 정보를 제공하기 위해 제공됩니다. --salt--iteration 인수를 생략하면 기본값이 사용됩니다.
  • --summary 인수는 변환된 인증 정보 저장소를 JBoss EAP 구성에 추가하는 데 사용할 수 있는 형식의 관리 CLI 명령을 생성합니다. 일반 텍스트 암호는 요약 출력에 마스크됩니다.
9.2.1.1.1. 개별 보안 자격 증명 모음을 인증 정보 저장소로 마이그레이션

다음 예제를 사용하여 개별 보안 자격 증명 모음을 인증 정보 저장소로 마이그레이션합니다.

예: 단일 보안 자격 증명 모음을 인증 정보 저장소 명령으로 변환

$ EAP_HOME/bin/elytron-tool.sh vault --enc-dir vault_data/ --keystore vault-jceks.keystore --keystore-password MASK-2hKo56F1a3jYGnJwhPmiF5 --iteration 34 --salt 12345678 --alias test --location cs-v1.store --summary

이 명령은 보안 자격 증명 모음을 인증 정보 저장소로 변환하고 출력에서 변환하는 데 사용된 관리 CLI 명령의 요약을 출력합니다.

Vault (enc-dir="vault_data/";keystore="vault-jceks.keystore") converted to credential store "cs-v1.store"
Vault Conversion summary:
--------------------------------------
Vault Conversion Successful
CLI command to add new credential store:
/subsystem=elytron/credential-store=test:add(relative-to=jboss.server.data.dir,create=true,modifiable=true,location="cs-v1.store",implementation-properties={"keyStoreType"=>"JCEKS"},credential-reference={clear-text="MASK-2hKo56F1a3jYGnJwhPmiF5;12345678;34"})
9.2.1.1.2. 여러 보안 자격 증명 모음을 대량의 인증 정보 저장소로 마이그레이션

--bulk-convert 인수를 사용하고 대량 변환 설명자 파일을 가리키는 방식으로 여러 자격 증명 모음을 인증 정보 저장소로 변환할 수 있습니다.

사전 요구 사항

이 섹션의 예제에서는 다음과 같은 대규모 변환 설명자 파일을 사용합니다.

예: bulk-vault-conversion-descriptor.txt 파일

keystore:vault-v1/vault-jceks.keystore
keystore-password:MASK-2hKo56F1a3jYGnJwhPmiF5
enc-dir:vault-v1/vault_data/
salt:12345678
iteration:34
location:v1-cs-1.store
alias:test

keystore:vault-v1/vault-jceks.keystore
keystore-password:secretsecret
enc-dir:vault-v1/vault_data/
location:v1-cs-2.store
alias:test

# different vault vault-v1-more
keystore:vault-v1-more/vault-jceks.keystore
keystore-password:MASK-2hKo56F1a3jYGnJwhPmiF5
enc-dir:vault-v1-more/vault_data/
salt:12345678
iteration:34
location:v1-cs-more.store
alias:test

새 변환은 각 새 키 저장소가 발생할 때 시작됩니다.A new conversion starts when each new keystore: line is encountered. Salt,iterationproperties 제외한 모든 옵션은 필수입니다.

프로세스

  1. 대량 변환을 수행하고 관리 CLI 명령을 포맷하는 출력을 생성하려면 다음 명령을 실행합니다.
$ EAP_HOME/bin/elytron-tool.sh vault --bulk-convert path/to/bulk-vault-conversion-descriptor.txt --summary

이 명령은 파일에 지정된 모든 보안 자격 증명 모음을 인증 정보 저장소로 변환하고 출력에서 변환하는데 사용된 관리 CLI 명령의 요약을 출력합니다.

Vault (enc-dir="vault-v1/vault_data/";keystore="vault-v1/vault-jceks.keystore") converted to credential store "v1-cs-1.store"
Vault Conversion summary:
--------------------------------------
Vault Conversion Successful
CLI command to add new credential store:
/subsystem=elytron/credential-store=test:add(relative-to=jboss.server.data.dir,create=true,modifiable=true,location="v1-cs-1.store",implementation-properties={"keyStoreType"=>"JCEKS"},credential-reference={clear-text="MASK-2hKo56F1a3jYGnJwhPmiF5;12345678;34"})
--------------------------------------

Vault (enc-dir="vault-v1/vault_data/";keystore="vault-v1/vault-jceks.keystore") converted to credential store "v1-cs-2.store"
Vault Conversion summary:
--------------------------------------
Vault Conversion Successful
CLI command to add new credential store:
/subsystem=elytron/credential-store=test:add(relative-to=jboss.server.data.dir,create=true,modifiable=true,location="v1-cs-2.store",implementation-properties={"keyStoreType"=>"JCEKS"},credential-reference={clear-text="secretsecret"})
--------------------------------------

Vault (enc-dir="vault-v1-more/vault_data/";keystore="vault-v1-more/vault-jceks.keystore") converted to credential store "v1-cs-more.store"
Vault Conversion summary:
--------------------------------------
Vault Conversion Successful
CLI command to add new credential store:
/subsystem=elytron/credential-store=test:add(relative-to=jboss.server.data.dir,create=true,modifiable=true,location="v1-cs-more.store",implementation-properties={"keyStoreType"=>"JCEKS"},credential-reference={clear-text="MASK-2hKo56F1a3jYGnJwhPmiF5;12345678;34"})
--------------------------------------

9.2.2. Elytron으로 보안 속성 마이그레이션

다음 예제에서는 group.nameencoding.algorithm 보안 속성이 레거시 보안 하위 시스템에서 security -properties 로 정의되었다고 가정합니다.

보안 에 정의된 보안 속성:

<subsystem xmlns="urn:jboss:domain:security:2.0">
    ...
    <security-properties>
        <property name="group.name" value="engineering-group" />
        <property name="encoding.algorithm" value="BASE64" />
    </security-properties>
</subsystem>

elytron 하위 시스템에서 이러한 보안 속성을 정의하려면 다음 관리 CLI 명령을 사용하여 elytron 하위 시스템의 security-properties 속성을 설정합니다.

/subsystem=elytron:write-attribute(name=security-properties, value={ group.name = "engineering-group", encoding.algorithm = "BASE64" })

서버 구성 파일의 elytron 하위 시스템에서 security-properties 를 정의합니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
    <security-properties>
        <security-property name="group.name" value="engineering-group"/>
        <security-property name="encoding.algorithm" value="BASE64"/>
    </security-properties>
    ...
</subsystem>

이전 명령의 write-attribute 작업은 기존 속성을 덮어씁니다. 다른 보안 속성에 영향을 주지 않고 보안 속성을 추가하거나 변경하려면 관리 CLI 명령에서 작업을 사용합니다.

/subsystem=elytron:map-put(name=security-properties, key=group.name, value=technical-support)

유사한 방식으로 map-remove 작업을 사용하여 특정 보안 속성을 제거할 수 있습니다.

/subsystem=elytron:map-remove(name=security-properties, key=group.name)

9.3. 인증 구성 마이그레이션

이 섹션에서는 Elytron에 대한 속성 기반 인증 및 권한 부여에 대한 정보를 제공합니다. 또한 캐싱을 사용하여 Elytron에 캐싱을 사용하는 LDAP 인증, 데이터베이스 인증 구성, kerberos 인증, 복합 저장소, JACC 보안 및 보안 도메인 마이그레이션에 대한 정보도 포함되어 있습니다.

9.3.1. controlPlaneetBox 속성 기반 구성을 Elytron으로 마이그레이션

다음 예제를 사용하여 controlPlaneetBox 속성 기반 인증을 Elytron으로 마이그레이션합니다.

예: CryostatetBox 속성 기반 구성 명령

/subsystem=security/security-domain=application-security:add
/subsystem=security/security-domain=application-security/authentication=classic:add(login-modules=[{code=UsersRoles, flag=Required, module-options={usersProperties=file://${jboss.server.config.dir}/example-users.properties, rolesProperties=file://${jboss.server.config.dir}/example-roles.properties}}])

그러면 다음 서버 구성이 생성됩니다.

예: CryostatetBox 속성 기반 보안 도메인 구성

<security-domain name="application-security">
  <authentication>
    <login-module code="UsersRoles" flag="required">
      <module-option name="usersProperties" value="file://${jboss.server.config.dir}/example-users.properties"/>
      <module-option name="rolesProperties" value="file://${jboss.server.config.dir}/example-roles.properties"/>
    </login-module>
  </authentication>
</security-domain>

9.3.1.1. Elytron으로 속성 기반 인증 마이그레이션

다음 단계에 따라 CryostatetBox 속성 기반 인증을 Elytron으로 마이그레이션합니다.

사전 요구 사항

마이그레이션하려는 배포된 웹 애플리케이션은 양식 기반 인증을 요구하도록 구성해야 합니다. 애플리케이션은 CryostatetBox 보안 도메인을 참조하고 있으며 UsersRolesLoginModule 을 사용하여 example-users.propertiesexample-roles.properties 파일에서 사용자 정보를 로드합니다. 이 절차에서는 보안 도메인이 다음 관리 CLI 명령을 사용하여 레거시 보안 하위 시스템에 정의되어 있다고 가정합니다.

CryostatetBox 속성 기반 인증으로 시작했는지 확인합니다.

프로세스

  1. elytron 하위 시스템에서 CryostatetBox 속성 파일을 참조하는 새 보안 영역을 정의합니다.

    /subsystem=elytron/properties-realm=application-properties:add(users-properties={path=example-users.properties, relative-to=jboss.server.config.dir, plain-text=true, digest-realm-name="Application Security"}, groups-properties={path=example-roles.properties, relative-to=jboss.server.config.dir}, groups-attribute=Roles)
  2. elytron 하위 시스템에서 보안 도메인 하위 시스템을 정의합니다.

    /subsystem=elytron/security-domain=application-security:add(realms=[{realm=application-properties}], default-realm=application-properties, permission-mapper=default-permission-mapper)

    그러면 서버 구성 파일에 다음과 같은 elytron 하위 시스템 구성이 생성됩니다.

    <subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
      ...
      <security-domains>
        ...
        <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
          <realm name="application-properties"/>
        </security-domain>
      </security-domains>
      <security-realms>
        ...
        <properties-realm name="application-properties" groups-attribute="Roles">
          <users-properties path="example-users.properties" relative-to="jboss.server.config.dir" digest-realm-name="Application Security" plain-text="true"/>
          <groups-properties path="example-roles.properties" relative-to="jboss.server.config.dir"/>
        </properties-realm>
      </security-realms>
      ...
    </subsystem>
  3. 배포에서 참조하는 애플리케이션 보안 도메인을 undertow 하위 시스템에서 새로 정의된 HTTP 인증 팩토리에 매핑합니다.

    /subsystem=undertow/application-security-domain=application-security:add(security-domain=application-security)

    그러면 서버 구성 파일에 다음과 같은 undertow 하위 시스템 구성이 생성됩니다.

    <subsystem xmlns="urn:jboss:domain:undertow:12.0">
      ...
      <application-security-domains>
        <application-security-domain name="application-security" security-domain="application-security"/>
      </application-security-domains>
      ...
    </subsystem>
  4. 새 애플리케이션 보안 도메인 매핑을 적용하려면 서버를 다시 로드하거나 애플리케이션을 재배포해야 합니다.

이제 인증이 picketBox 구성과 동일하게 구성됩니다.

9.3.2. 기존 보안 영역 속성 기반 구성을 Elytron으로 마이그레이션

이 섹션에서는 사용자, 암호 및 그룹 정보를 속성 파일에서 JBoss EAP 7.4 및 이전 버전에서 Elytron으로 로드하는 레거시 보안 영역을 마이그레이션하는 방법을 설명합니다. 이러한 유형의 기존 보안 영역은 일반적으로 관리 인터페이스를 보호하거나 커넥터를 제거하는 데 사용되었습니다.

JBoss EAP 8.0에서는 filesystem-realm이 properties-realm보다 선호됩니다.

사전 요구 사항

마이그레이션하려는 배포된 웹 애플리케이션은 양식 기반 인증을 요구하도록 구성해야 합니다. 애플리케이션은 CryostatetBox 보안 도메인을 참조하고 있으며 UsersRolesLoginModule 을 사용하여 example-users.propertiesexample-roles.properties 파일에서 사용자 정보를 로드합니다. 이 절차에서는 보안 도메인이 다음 관리 CLI 명령을 사용하여 레거시 보안 하위 시스템에 정의되어 있다고 가정합니다.

예: 레거시 보안 Cryostat 명령

/core-service=management/security-realm=ApplicationSecurity:add
/core-service=management/security-realm=ApplicationSecurity/authentication=properties:add(relative-to=jboss.server.config.dir, path=example-users.properties, plain-text=true)
/core-service=management/security-realm=ApplicationSecurity/authorization=properties:add(relative-to=jboss.server.config.dir, path=example-roles.properties)

그러면 다음 서버 구성이 생성됩니다.

예: 레거시 보안 설정

<security-realm name="ApplicationSecurity">
  <authentication>
    <properties path="example-users.properties" relative-to="jboss.server.config.dir" plain-text="true"/>
  </authentication>
  <authorization>
    <properties path="example-roles.properties" relative-to="jboss.server.config.dir"/>
  </authorization>
</security-realm>

Elytron 보안을 애플리케이션 서버에 추가하는 이유 중 하나는 서버에서 일관된 보안 솔루션을 사용할 수 있도록 하는 것이었습니다. 속성 기반 레거시 보안 영역을 Elytron으로 마이그레이션하기 위한 초기 단계는 Elytron으로 ChecketBox 속성 기반 인증을 마이그레이션하는 데 사용되는 것과 유사합니다. 다음 단계에 따라 속성 기반 레거시 보안 영역을 Elytron으로 마이그레이션합니다.

프로세스

  1. 속성 파일을 참조하는 elytron 하위 시스템에서 새 보안 영역을 정의합니다.

    /subsystem=elytron/properties-realm=application-properties:add(users-properties={path=example-users.properties, relative-to=jboss.server.config.dir, plain-text=true, digest-realm-name="Application Security"}, groups-properties={path=example-roles.properties, relative-to=jboss.server.config.dir}, groups-attribute=Roles)
  2. elytron 하위 시스템에서 보안 도메인 하위 시스템을 정의합니다.

    /subsystem=elytron/security-domain=application-security:add(realms=[{realm=application-properties}], default-realm=application-properties, permission-mapper=default-permission-mapper)

    그러면 다음과 같은 Elytron 구성이 생성됩니다.

    <subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
      ...
      <security-domains>
        ...
        <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
          <realm name="application-properties"/>
        </security-domain>
      </security-domains>
      <security-realms>
        ...
        <properties-realm name="application-properties" groups-attribute="Roles">
          <users-properties path="example-users.properties" relative-to="jboss.server.config.dir" digest-realm-name="Application Security" plain-text="true"/>
          <groups-properties path="example-roles.properties" relative-to="jboss.server.config.dir"/>
        </properties-realm>
      </security-realms>
        ...
    </subsystem>
  3. 기존 보안 영역을 SASL(Simple Authentication Security Layer) 인증에 사용할 수 있도록 sasl-authentication-factory 를 정의합니다.

    /subsystem=elytron/sasl-authentication-factory=application-security-sasl:add(sasl-server-factory=elytron, security-domain=application-security, mechanism-configurations=[{mechanism-name=PLAIN}])

    그러면 다음과 같은 Elytron 구성이 생성됩니다.

    <subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
      ...
      <sasl>
        ...
        <sasl-authentication-factory name="application-security-sasl" sasl-server-factory="elytron" security-domain="application-security">
          <mechanism-configuration>
            <mechanism mechanism-name="PLAIN"/>
          </mechanism-configuration>
        </sasl-authentication-factory>
        ...
      </sasl>
    </subsystem>
  4. SASL 인증에 대한 원격 커넥터를 구성하고 기존 보안 영역과의 연결을 제거합니다.

    /subsystem=remoting/http-connector=http-remoting-connector:write-attribute(name=sasl-authentication-factory, value=application-security-sasl)

    이렇게 하면 서버 구성 파일의 하위 시스템이 제거될 때 다음 구성이 생성됩니다.

    <subsystem xmlns="urn:jboss:domain:remoting:4.0">
      ...
      <http-connector name="http-remoting-connector" connector-ref="default" sasl-authentication-factory="application-security-sasl"/>
    </subsystem>
  5. 두 인증 팩토리를 추가하여 Elytron으로 http-interface 를 보호합니다.

    /subsystem=elytron/http-authentication-factory=application-security-http:add(http-server-mechanism-factory=global, security-domain=application-security, mechanism-configurations=[{mechanism-name=BASIC}])
    /core-service=management/management-interface=http-interface:write-attribute(name=http-upgrade.sasl-authentication-factory, value=application-security-sasl)

    그러면 다음 구성이 생성됩니다.

    <management-interfaces>
      <http-interface http-authentication-factory="application-security-http">
        <http-upgrade enabled="true" sasl-authentication-factory="application-security-sasl"/>
        <socket-binding http="management-http"/>
      </http-interface>
    </management-interfaces>
    참고

    관리 인터페이스를 보호할 때 이 예제에서 사용된 이름으로 이름을 교체해야 합니다.

기존 속성 기반 구성을 Elytron으로 마이그레이션하는 작업이 완료되었습니다.

9.3.3. filesystem-realm 명령을 사용하여 파일 시스템 기반 Security Cryostat로 마이그레이션

elytron.sh 툴의 filesystem-realm 명령을 사용하여 레거시 속성 기반 보안 영역을 Elytron의 파일 시스템 기반 영역으로 마이그레이션합니다.

파일 시스템 기반 영역은 Elytron에서 사용자 ID를 저장하는 데 사용하는 파일 시스템 기반 ID 저장소입니다. filesystem-realm 명령은 properties-realm 파일을 filesystem-realm 로 변환합니다. 또한 이 영역과 보안 도메인을 elytron 하위 시스템에 추가하기 위한 명령을 생성합니다.

프로세스

  1. 속성 파일을 마이그레이션합니다.

    한 번에 단일 user-properties 파일을 마이그레이션하거나 속성 파일을 대량으로 마이그레이션할 수 있습니다. 다음 예제에서는 두 가지 마이그레이션 유형에 대한 절차를 보여줍니다.

    • 단일 속성 파일을 마이그레이션하려면 다음을 수행합니다.

      다음 예제에서는 관련 roles-properties 파일을 사용하여 단일 users-properties 파일을 filesystem-realm 으로 변환합니다. 이 예제에서는 레거시 보안 도메인에 다음 user-properties 및 role-properties 파일이 있다고 가정합니다.

      example-users.properties
      example-roles.properties

      예: 단일 사용자 속성 파일 마이그레이션

      $./bin/elytron-tool.sh filesystem-realm --users-file example-users.properties --roles-file example-roles.properties --output-location realms/example

      이렇게 하면 filesystem-realm 파일과 관리 CLI 명령이 포함된 스크립트가 생성됩니다. 이 스크립트는 realms/example 디렉터리에 저장됩니다.

    • 여러 속성 파일을 마이그레이션하려면 다음을 수행합니다.

      다음 예제에서는 대용량의 roles-properties 파일을 사용하여 users-properties 파일을 filesystem-realm 으로 변환합니다. 이 예제에서는 레거시 보안 도메인에 다음과 같은 속성 파일이 있다고 가정합니다.

      users-1.properties
      users-2.properties
      roles-1.properties
      roles-2.properties

      user-roles 파일을 대량으로 변환하려면 filesystem-realm 명령과 함께 사용할 설명자 파일을 생성해야 합니다. 이 예에서는 /bin 디렉터리에 있는 설명자 파일 example-descriptor-file 은 다음 콘텐츠를 사용하여 생성됩니다.

      예: 설명자 파일

      users-file:/full/path/to/users-1.properties
      roles-file:/full/path/to/roles-1.properties
      output-location:./realms/bulk-1-example
      filesystem-realm-name:exampleFileSystemRealm1
      security-domain-name:exampleSecurityDomain1
      
      users-file:/full/path/to/users-2.properties
      roles-file:/full/path/to/roles-2.properties
      output-location:./realms/bulk-2-example
      filesystem-realm-name:exampleFileSystemRealm2
      security-domain-name:exampleSecurityDomain2

      설명자 파일의 빈 행은 각 users-properties 파일에 대한 작업을 분리하는 데 사용됩니다.

      다음 예제에서는 설명자 파일을 사용하여 관련 roles-properties 파일을 사용하여 두 users-properties 파일을 filesystem-realm 으로 변환합니다.

      예:ulk 마이그레이션

      $./bin/elytron-tool.sh filesystem-realm --bulk-convert example-descriptor-file

      이렇게 하면 관리 CLI 명령이 포함된 filesystem-realm 파일과 스크립트가 생성됩니다. 스크립트는 설명자 파일의 output-location 속성에 지정된 디렉터리에 저장됩니다.

  2. Elytron 툴에서 생성한 CLI 명령을 사용하여 새 보안 영역과 보안 도메인을 elytron 하위 시스템에 추가합니다.

    예: filesystem-realm 추가

    /subsystem=elytron/filesystem-realm=converted-properties-filesystem-realm:add(path=/full/path/to/realms/example)
    
    /subsystem=elytron/security-domain=converted-properties-security-domain:add(realms=[{realm=converted-properties-filesystem-realm}],default-realm=converted-properties-filesystem-realm,permission-mapper=default-permission-mapper)

9.3.4. LDAP 인증 구성을 Elytron으로 마이그레이션

정보를 ID 속성으로 관리할 수 있도록 레거시 LDAP 인증을 Elytron으로 마이그레이션합니다.

사전 요구 사항

기존 LDAP 인증을 Elytron으로 마이그레이션하기 전에 Migrate Properties-based Authentication and Authorization to Elytron 섹션에 있는 콘텐츠를 읽어야 합니다. 이 내용은 여기에도 적용됩니다. 보안 도메인 및 인증 팩토리를 정의하는 방법과 인증에 사용할 매핑 방법에 중점을 두어야 합니다. 이 섹션은 해당 지침을 반복하지 않으므로 계속하기 전에 해당 섹션을 읽도록 합니다.

다음 예제에서는 그룹 또는 역할 정보가 LDAP에서 직접 로드되고 기존 LDAP 인증이 다음과 같이 구성되어 있다고 가정합니다.

프로세스

  1. LDAP 서버에는 다음 사용자 및 그룹 항목이 포함되어 있습니다.

    예: LDAP 서버 사용자 항목

    dn: uid=TestUserOne,ou=users,dc=group-to-principal,dc=wildfly,dc=org
    objectClass: top
    objectClass: inetOrgPerson
    objectClass: uidObject
    objectClass: person
    objectClass: organizationalPerson
    cn: Test User One
    sn: Test User One
    uid: TestUserOne
    userPassword: {SSHA}UG8ov2rnrnBKakcARVvraZHqTa7mFWJZlWt2HA==

    예: LDAP 서버 그룹 항목

    dn: uid=GroupOne,ou=groups,dc=group-to-principal,dc=wildfly,dc=org
    objectClass: top
    objectClass: groupOfUniqueNames
    objectClass: uidObject
    cn: Group One
    uid: GroupOne
    uniqueMember: uid=TestUserOne,ou=users,dc=group-to-principal,dc=wildfly,dc=org

    인증을 위해 사용자 이름은 uid 속성과 일치하며 결과 그룹 이름은 그룹 항목의 uid 속성에서 가져옵니다.

  2. LDAP 서버 및 관련 보안 영역에 대한 연결은 다음 관리 CLI 명령을 사용하여 정의됩니다.

    예: LDAP Security Cryostat 구성 명령

    batch
    /core-service=management/ldap-connection=MyLdapConnection:add(url="ldap://localhost:10389", search-dn="uid=admin,ou=system", search-credential="secret")
    
    /core-service=management/security-realm=LDAPRealm:add
    /core-service=management/security-realm=LDAPRealm/authentication=ldap:add(connection="MyLdapConnection", username-attribute=uid, base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org")
    
    /core-service=management/security-realm=LDAPRealm/authorization=ldap:add(connection=MyLdapConnection)
    /core-service=management/security-realm=LDAPRealm/authorization=ldap/username-to-dn=username-filter:add(attribute=uid, base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org")
    /core-service=management/security-realm=LDAPRealm/authorization=ldap/group-search=group-to-principal:add(base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org", iterative=true, prefer-original-connection=true, principal-attribute=uniqueMember, search-by=DISTINGUISHED_NAME, group-name=SIMPLE, group-name-attribute=uid)
    run-batch

    그러면 다음 서버 구성이 생성됩니다.

    예: LDAP Security Cryostat 구성

    <management>
      <security-realms>
        ...
        <security-realm name="LDAPRealm">
          <authentication>
            <ldap connection="MyLdapConnection" base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org">
              <username-filter attribute="uid"/>
            </ldap>
          </authentication>
          <authorization>
            <ldap connection="MyLdapConnection">
              <username-to-dn>
                <username-filter base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org" attribute="uid"/>
              </username-to-dn>
              <group-search group-name="SIMPLE" iterative="true" group-name-attribute="uid">
                <group-to-principal search-by="DISTINGUISHED_NAME" base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org" prefer-original-connection="true">
                  <membership-filter principal-attribute="uniqueMember"/>
                </group-to-principal>
              </group-search>
            </ldap>
          </authorization>
        </security-realm>
      </security-realms>
      <outbound-connections>
        <ldap name="MyLdapConnection" url="ldap://localhost:10389" search-dn="uid=admin,ou=system" search-credential="secret"/>
      </outbound-connections>
      ...
    </management>

  3. 다음 관리 CLI 명령은 LdapExtLoginModule 을 사용하여 사용자 이름과 암호를 확인하는 데 사용하는 CryostatetBox 보안 도메인을 구성하는 데 사용됩니다.

    예: 보안 도메인 구성 명령

    /subsystem=security/security-domain=application-security:add
    /subsystem=security/security-domain=application-security/authentication=classic:add(login-modules=[{code=LdapExtended, flag=Required, module-options={ java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, java.naming.provider.url=ldap://localhost:10389, java.naming.security.authentication=simple, bindDN="uid=admin,ou=system", bindCredential=secret, baseCtxDN="ou=users,dc=group-to-principal,dc=wildfly,dc=org", baseFilter="(uid={0})", rolesCtxDN="ou=groups,dc=group-to-principal,dc=wildfly,dc=org", roleFilter="(uniqueMember={1})", roleAttributeID="uid" }}])

    그러면 다음 서버 구성이 생성됩니다.

    예: 보안 도메인 구성

    <subsystem xmlns="urn:jboss:domain:security:2.0">
      ...
      <security-domains>
        ...
        <security-domain name="application-security">
          <authentication>
            <login-module code="LdapExtended" flag="required">
              <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
              <module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>
              <module-option name="java.naming.security.authentication" value="simple"/>
              <module-option name="bindDN" value="uid=admin,ou=system"/>
              <module-option name="bindCredential" value="secret"/>
              <module-option name="baseCtxDN" value="ou=users,dc=group-to-principal,dc=wildfly,dc=org"/>
              <module-option name="baseFilter" value="(uid={0})"/>
              <module-option name="rolesCtxDN" value="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
              <module-option name="roleFilter" value="(uniqueMember={1})"/>
              <module-option name="roleAttributeID" value="uid"/>
            </login-module>
          </authentication>
        </security-domain>
      </security-domains>
    </subsystem>

9.3.4.1. 레거시 LDAP 인증을 Elytron으로 마이그레이션

다음 단계에 따라 이전 LDAP 인증 예제 구성을 JBoss EAP 7.4 및 이전 버전에서 Elytron으로 마이그레이션합니다. 이 섹션은 기존 보안 LDAP 영역 의 마이그레이션 및 picket Box LDAP 보안 도메인에 적용됩니다.

프로세스

  1. elytron 하위 시스템에서 LDAP에 대한 연결을 정의합니다.

    /subsystem=elytron/dir-context=ldap-connection:add(url=ldap://localhost:10389, principal="uid=admin, ou=system", credential-reference={clear-text=secret})
  2. LDAP를 검색하고 제공된 암호를 확인하는 보안 영역을 생성합니다.

    /subsystem=elytron/ldap-realm=ldap-realm:add(dir-context=ldap-connection, direct-verification=true, identity-mapping={search-base-dn="ou=users, dc=group-to-principal, dc=wildfly, dc=org", rdn-identifier="uid", attribute-mapping=[{filter-base-dn="ou=groups, dc=group-to-principal, dc=wildfly, dc=org", filter="(uniqueMember={1})", from="uid", to="Roles"}]})

이러한 단계를 수행하면 서버 구성 파일에 다음과 같은 elytron 하위 시스템 구성이 생성됩니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-realms>
    ...
    <ldap-realm name="ldap-realm" dir-context="ldap-connection" direct-verification="true">
      <identity-mapping rdn-identifier="uid" search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org">
        <attribute-mapping>
          <attribute from="uid" to="Roles" filter="(uniqueMember={1})" filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
        </attribute-mapping>
      </identity-mapping>
    </ldap-realm>
  </security-realms>
  ...
  <dir-contexts>
    <dir-context name="ldap-connection" url="ldap://localhost:10389" principal="uid=admin,ou=system">
      <credential-reference clear-text="secret"/>
    </dir-context>
  </dir-contexts>
</subsystem>
참고

기본적으로 지정된 security-domain 에 대해 role-decoder 가 정의되지 않은 경우 "역할" ID 속성이 ID 역할에 매핑됩니다.

이제 LDAP에서 로드된 정보를 속성으로 ID와 연결할 수 있습니다. 이러한 속성은 역할에 매핑할 수 있지만 다른 용도로 로드 및 사용할 수도 있습니다. 새로 생성된 보안 영역은 이 가이드의 속성 기반 인증 및 권한 부여 섹션에 설명된 것과 동일한 방식으로 보안 도메인에서 사용할 수 있습니다.

9.3.5. 데이터베이스 인증 구성을 Elytron으로 마이그레이션

JDBC 데이터 소스 기반 CryostatetBox 인증을 Elytron으로 마이그레이션합니다. 보안 도메인 정의, 인증 팩토리를 정의하고 인증을 위해 매핑하는 방법은 속성 기반 인증 및 권한 부여 마이그레이션을 참조하십시오.

다음 예제에서는 사용자 인증 데이터가 다음 예제와 유사한 구문을 사용하여 생성된 데이터베이스 테이블에 저장된다고 가정합니다.

예: 데이터베이스 사용자 테이블을 만드는 구문

CREATE TABLE User (
    id BIGINT NOT NULL,
    username VARCHAR(255),
    password VARCHAR(255),
    role ENUM('admin', 'manager', 'user'),
    PRIMARY KEY (id),
    UNIQUE (username)
)

인증 목적을 위해 사용자 이름은 username 열에 저장된 데이터와 일치하며 암호 열에 암호 가 16으로 인코딩된 MD5 해시로 저장되고 권한 부여 목적으로 사용자 역할은 역할 열에 저장됩니다.

CryostatetBox 보안 도메인은 JBDC 데이터 소스를 사용하여 데이터베이스 테이블에서 데이터를 검색한 다음 이를 사용하여 사용자 이름과 암호를 확인하고 역할을 할당하도록 구성됩니다. picketBox 보안 도메인이 다음 관리 CLI 명령을 사용하여 구성되어 있다고 가정합니다.

예: CryostatetBox Database LoginModule 구성 명령

/subsystem=security/security-domain=application-security:add
/subsystem=security/security-domain=application-security/authentication=classic:add( login-modules=[ { code=Database, flag=Required, module-options={ dsJndiName="java:jboss/datasources/ExampleDS", principalsQuery="SELECT password FROM User WHERE username = ?", rolesQuery="SELECT role, 'Roles' FROM User WHERE username = ?", hashAlgorithm=MD5, hashEncoding=base64 } } ] )

그러면 레거시 보안 하위 시스템에 다음과 같은 로그인 모듈 구성이 생성됩니다.

예: CryostatetBox LoginModule 구성

<subsystem xmlns="urn:jboss:domain:security:2.0">
  <security-domains>
    ...
    <security-domain name="application-security">
      <authentication>
        <login-module code="Database" flag="required">
          <module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
          <module-option name="principalsQuery" value="SELECT password FROM User WHERE username = ?"/>
          <module-option name="rolesQuery" value="SELECT role, 'Roles' FROM User WHERE username = ?"/>
          <module-option name="hashAlgorithm" value="MD5"/>
          <module-option name="hashEncoding" value="base64"/>
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>

9.3.5.1. 레거시 데이터베이스 인증을 Elytron으로 마이그레이션

JBoss EAP 7.4 및 이전 릴리스의 경우 이전 데이터베이스 인증 예제 구성을 Elytron으로 마이그레이션하려면 Elytron의 JDBC 데이터 소스 액세스를 활성화하는 JDBC 영역을 정의해야 합니다.

프로세스

  1. 다음 관리 명령을 사용하여 jdbc-realm 을 정의합니다.
/subsystem=elytron/jdbc-realm=jdbc-realm:add(principal-query=[ { data-source=ExampleDS, sql="SELECT role, password FROM User WHERE username = ?", attribute-mapping=[{index=1, to=Roles } ] simple-digest-mapper={algorithm=simple-digest-md5, password-index=2} } ] )

그러면 서버 구성 파일의 elytron 하위 시스템에 다음 jdbc-realm 구성이 생성됩니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-realms>
    ...
    <jdbc-realm name="jdbc-realm">
      <principal-query sql="SELECT role, password FROM User WHERE username = ?" data-source="ExampleDS">
        <attribute-mapping>
          <attribute to="Roles" index="1"/>
        </attribute-mapping>
        <simple-digest-mapper password-index="2"/>
      </principal-query>
    </jdbc-realm>
    ...
  </security-realms>
  ...
</subsystem>

Elytron은 이제 JDBC 영역 구성을 사용하여 데이터베이스 인증을 관리합니다. Elytron은 하나의 SQL 쿼리를 사용하여 모든 사용자 속성 및 자격 증명을 가져온 다음 SQL 결과에서 데이터를 추출하고 인증에 사용할 속성의 매핑을 생성하기 때문에 Elytron보다 효율적입니다.

9.3.6. Kerberos 인증을 Elytron으로 마이그레이션

Kerberos 구성으로 작업할 때 JBoss EAP 서버는 환경의 구성 정보를 사용하거나 시스템 속성을 사용하여 키 구성을 지정할 수 있습니다.

이러한 시스템 속성은 레거시 구성과 마이그레이션된 Elytron 구성에 모두 적용할 수 있습니다.

예: Kerberos 시스템 속성 관리 CLI 명령

# Enable debugging
/system-property=sun.security.krb5.debug:add(value=true)
# Identify the Kerberos realm to use
/system-property=java.security.krb5.realm:add(value=ELYTRON.ORG)
# Identify the address of the KDC
/system-property=java.security.krb5.kdc:add(value=kdc.elytron.org)

예: Kerberos 시스템 속성 서버 구성

<system-properties>
  <property name="sun.security.krb5.debug" value="true"/>
  <property name="java.security.krb5.realm" value="ELYTRON.ORG"/>
  <property name="java.security.krb5.kdc" value="kdc.elytron.org"/>
</system-properties>

인증 메커니즘에 따라 다음 마이그레이션 옵션 중 하나를 선택합니다.

9.3.6.1. Kerberos HTTP 인증 마이그레이션

기존 보안 구성에서 다음과 같이 HTTP 관리 인터페이스에 대해 CryostatEGO 인증을 사용하도록 보안 영역을 정의할 수 있습니다.

사전 요구 사항

다음 예제에서는 시스템 속성을 사용하여 Kerberos가 구성되어 있다고 가정합니다.

예: HTTP 관리 인터페이스에 CryostatEGO 인증 사용

/core-service=management/security-realm=Kerberos:add
/core-service=management/security-realm=Kerberos/server-identity=kerberos:add
/core-service=management/security-realm=Kerberos/server-identity=kerberos/keytab=HTTP\/test-server.elytron.org@ELYTRON.ORG:add(path=/path/to/test-server.keytab, debug=true)
/core-service=management/security-realm=Kerberos/authentication=kerberos:add(remove-realm=true)

예: Kerberos Security Cryostat 구성

<security-realms>
  ...
  <security-realm name="Kerberos">
    <server-identities>
      <kerberos>
        <keytab principal="HTTP/test-server.elytron.org@ELYTRON.ORG" path="/path/to/test-server.keytab" debug="true"/>
      </kerberos>
    </server-identities>
    <authentication>
      <kerberos remove-realm="true"/>
    </authentication>
  </security-realm>
</security-realms>

애플리케이션에서 Kerberos HTTP 인증을 사용할 수 있도록 기존 보안 도메인 쌍도 정의할 수 있습니다.

예: 여러 보안 도메인 정의

# Define the first security domain
/subsystem=security/security-domain=host:add
/subsystem=security/security-domain=host/authentication=classic:add
/subsystem=security/security-domain=host/authentication=classic/login-module=1:add(code=Kerberos, flag=Required, module-options={storeKey=true, useKeyTab=true, principal=HTTP/test-server.elytron.org@ELYTRON.ORG, keyTab=path/to/test-server.keytab, debug=true}

# Define the second SPNEGO security domain
/subsystem=security/security-domain=SPNEGO:add
/subsystem=security/security-domain=SPNEGO/authentication=classic:add
/subsystem=security/security-domain=SPNEGO/authentication=classic/login-module=1:add(code=SPNEGO, flag=requisite,  module-options={password-stacking=useFirstPass, serverSecurityDomain=host})
/subsystem=security/security-domain=SPNEGO/authentication=classic/login-module=1:write-attribute(name=module, value=org.jboss.security.negotiation)
/subsystem=security/security-domain=SPNEGO/authentication=classic/login-module=2:add(code=UsersRoles, flag=required, module-options={password-stacking=useFirstPass, usersProperties=  /path/to/kerberos/spnego-users.properties, rolesProperties=  /path/to/kerberos/spnego-roles.properties, defaultUsersProperties=  /path/to/kerberos/spnego-users.properties, defaultRolesProperties=  /path/to/kerberos/spnego-roles.properties})

예: 보안 도메인 한 쌍을 사용한 구성

<subsystem xmlns="urn:jboss:domain:security:2.0">
  <security-domains>
    ...
    <security-domain name="host">
      <authentication>
        <login-module name="1" code="Kerberos" flag="required">
          <module-option name="storeKey" value="true"/>
          <module-option name="useKeyTab" value="true"/>
          <module-option name="principal" value="HTTP/test-server.elytron.org@ELYTRON.ORG"/>
          <module-option name="keyTab" value="/path/to/test-server.keytab"/>
          <module-option name="debug" value="true"/>
        </login-module>
      </authentication>
    </security-domain>
    <security-domain name="SPNEGO">
      <authentication>
        <login-module name="1" code="SPNEGO" flag="requisite" module="org.jboss.security.negotiation">
          <module-option name="password-stacking" value="useFirstPass"/>
          <module-option name="serverSecurityDomain" value="host"/>
        </login-module>
        <login-module name="2" code="UsersRoles" flag="required">
          <module-option name="password-stacking" value="useFirstPass"/>
          <module-option name="usersProperties" value="path/to/kerberos/spnego-users.properties"/>
          <module-option name="rolesProperties" value="  /path/to/kerberos/spnego-roles.properties"/>
          <module-option name="defaultUsersProperties" value="  /path/to/kerberos/spnego-users.properties"/>
          <module-option name="defaultRolesProperties" value="  /path/to/kerberos/spnego-roles.properties"/>
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>

그런 다음 레거시 애플리케이션은 CryostatEGO 보안 도메인을 참조하고 CryostatEGO 메커니즘으로 보호됩니다.

9.3.6.1.1. Kerberos HTTP 인증을 Elytron으로 마이그레이션

보안 영역 및 Kerberos 보안 팩토리를 사용하여 Elytron에서 관리 인터페이스와 애플리케이션을 보호합니다.

사전 요구 사항

다음 예제에서는 시스템 속성을 사용하여 Kerberos가 구성되어 있다고 가정합니다.

프로세스

  1. ID 정보를 로드하는 데 사용할 보안 영역을 정의합니다.

    /subsystem=elytron/properties-realm=spnego-properties:add(users-properties={path=path/to/spnego-users.properties, plain-text=true, digest-realm-name=ELYTRON.ORG}, groups-properties={path=path/to/spnego-roles.properties})
  2. 서버가 자체 Kerberos ID를 로드할 수 있는 Kerberos 보안 팩토리를 정의합니다.

    /subsystem=elytron/kerberos-security-factory=test-server:add(path=path/to/test-server.keytab, principal=HTTP/test-server.elytron.org@ELYTRON.ORG, debug=true)
  3. 정책 및 인증 정책에 대한 HTTP 인증 팩토리를 함께 가져올 보안 도메인을 정의합니다.

    /subsystem=elytron/security-domain=SPNEGODomain:add(default-realm=spnego-properties, realms=[{realm=spnego-properties, role-decoder=groups-to-roles}], permission-mapper=default-permission-mapper)
    /subsystem=elytron/http-authentication-factory=spnego-http-authentication:add(security-domain=SPNEGODomain, http-server-mechanism-factory=global,mechanism-configurations=[{mechanism-name=SPNEGO, credential-security-factory=test-server}])

    그러면 서버 구성 파일의 elytron 하위 시스템에 다음 구성이 생성됩니다.

    예: 마이그레이션된 Elytron 구성

    <subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
      ...
      <security-domains>
      ...
        <security-domain name="SPNEGODomain" default-realm="spnego-properties" permission-mapper="default-permission-mapper">
          <realm name="spnego-properties" role-decoder="groups-to-roles"/>
        </security-domain>
      </security-domains>
      <security-realms>
        ...
        <properties-realm name="spnego-properties">
          <users-properties path="path/to/spnego-users.properties" digest-realm-name="ELYTRON.ORG" plain-text="true"/>
          <groups-properties path="path/to/spnego-roles.properties"/>
        </properties-realm>
      </security-realms>
      <credential-security-factories>
        <kerberos-security-factory name="test-server" principal="HTTP/test-server.elytron.org@ELYTRON.ORG" path="path/to/test-server.keytab" debug="true"/>
      </credential-security-factories>
      ...
      <http>
        ...
        <http-authentication-factory name="spnego-http-authentication" http-server-mechanism-factory="global" security-domain="SPNEGODomain">
          <mechanism-configuration>
            <mechanism mechanism-name="SPNEGO" credential-security-factory="test-server"/>
          </mechanism-configuration>
        </http-authentication-factory>
        ...
      </http>
      ...
    </subsystem>

  4. 애플리케이션을 보호하려면 undertow 하위 시스템에서 애플리케이션 보안 도메인을 정의하여 보안 도메인을 이 http-authentication-factory 에 매핑합니다. 이 구성에 정의된 http-authentication-factory 를 참조하도록 HTTP 관리 인터페이스를 업데이트할 수 있습니다. 이 프로세스는 Elytron으로 속성 기반 인증 및 권한 부여 마이그레이션에 설명되어 있습니다.

9.3.6.2. Kerberos Remoting SASL 인증 마이그레이션

다음 정보를 사용하여 Kerberos 원격 SASL 인증을 마이그레이션합니다.

프로세스

  1. 기본 관리 인터페이스와 같은 인증을 활성화하는 데 사용할 Kerberos / GSSAPI SASL 인증을 위한 레거시 보안 영역을 정의합니다.

예: 관리 CLI 명령 제거를 위한 Kerberos 인증

/core-service=management/security-realm=Kerberos:add
/core-service=management/security-realm=Kerberos/server-identity=kerberos:add
/core-service=management/security-realm=Kerberos/server-identity=kerberos/keytab=remote\/test-server.elytron.org@ELYTRON.ORG:add(path=path/to/remote-test-server.keytab, debug=true)
/core-service=management/security-realm=Kerberos/authentication=kerberos:add(remove-realm=true)

예: Kerberos Remoting Security Cryostat 구성

<management>
  <security-realms>
    ...
    <security-realm name="Kerberos">
      <server-identities>
        <kerberos>
          <keytab principal="remote/test-server.elytron.org@ELYTRON.ORG" path="path/to/remote-test-server.keytab" debug="true"/>
        </kerberos>
      </server-identities>
      <authentication>
        <kerberos remove-realm="true"/>
      </authentication>
    </security-realm>
  </security-realms>
  ...
</management>

9.3.6.2.1. Kerberos Remoting SASL 인증을 Elytron으로 마이그레이션

다음 단계를 사용하여 Kerberos 원격 SASL 인증을 Elytron으로 마이그레이션합니다.

프로세스

  1. ID 정보를 로드하는 데 사용할 보안 영역을 정의합니다.

    /path=kerberos:add(relative-to=user.home, path=src/kerberos)
    /subsystem=elytron/properties-realm=kerberos-properties:add(users-properties={path=kerberos-users.properties, relative-to=kerberos, digest-realm-name=ELYTRON.ORG}, groups-properties={path=kerberos-groups.properties, relative-to=kerberos})
  2. 서버 ID에 대한 Kerberos 보안 팩토리를 정의합니다.

    /subsystem=elytron/kerberos-security-factory=test-server:add(relative-to=kerberos, path=remote-test-server.keytab, principal=remote/test-server.elytron.org@ELYTRON.ORG)
  3. 보안 도메인 및 SASL 인증 팩토리를 정의합니다.

    /subsystem=elytron/security-domain=KerberosDomain:add(default-realm=kerberos-properties, realms=[{realm=kerberos-properties, role-decoder=groups-to-roles}], permission-mapper=default-permission-mapper)
    /subsystem=elytron/sasl-authentication-factory=gssapi-authentication-factory:add(security-domain=KerberosDomain, sasl-server-factory=elytron, mechanism-configurations=[{mechanism-name=GSSAPI, credential-security-factory=test-server}])

그러면 서버 구성 파일의 elytron 하위 시스템에 다음 구성이 생성됩니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-domains>
    ...
    <security-domain name="KerberosDomain" default-realm="kerberos-properties" permission-mapper="default-permission-mapper">
      <realm name="kerberos-properties" role-decoder="groups-to-roles"/>
    </security-domain>
  </security-domains>
  <security-realms>
   ...
     <properties-realm name="kerberos-properties">
       <users-properties path="kerberos-users.properties" relative-to="kerberos" digest-realm-name="ELYTRON.ORG"/>
       <groups-properties path="kerberos-groups.properties" relative-to="kerberos"/>
     </properties-realm>
   </security-realms>
   <credential-security-factories>
     <kerberos-security-factory name="test-server" principal="remote/test-server.elytron.org@ELYTRON.ORG" path="remote-test-server.keytab" relative-to="kerberos"/>
   </credential-security-factories>
   ...
   <sasl>
     ...
     <sasl-authentication-factory name="gssapi-authentication-factory" sasl-server-factory="elytron" security-domain="KerberosDomain">
       <mechanism-configuration>
         <mechanism mechanism-name="GSSAPI" credential-security-factory="test-server"/>
       </mechanism-configuration>
     </sasl-authentication-factory>
     ...
   </sasl>
 </subsystem>

검증

이제 SASL 인증 팩토리를 참조하도록 관리 인터페이스 또는 리모팅 커넥터를 업데이트할 수 있습니다.

여기에 정의된 두 Elytron 예제를 결합하여 공유 보안 도메인 및 보안 영역을 사용하고 각각 고유한 Kerberos 보안 팩토리를 참조하는 프로토콜별 인증 팩토리를 사용할 수도 있습니다.

추가 리소스

동일한 Elytron 구성을 정의하는 다음 단계는 Kerberos HTTP 인증 마이그레이션 에 설명된 것과 매우 유사합니다.

9.3.7. Elytron으로 Composite Stores 마이그레이션

이 섹션에서는 여러 ID 저장소를 사용하는 Elytron Aggregate Security Cryostat Configuration 을 사용하는 Cryostatet Box 또는 레거시 보안 영역 구성을 마이그레이션하는 방법을 설명합니다.

CryostatetBox 또는 레거시 보안 영역을 사용하는 경우, 권한 부여에 사용되는 정보가 다른 저장소에서 로드되는 동안 하나의 ID 저장소에 대해 인증이 수행되는 구성을 정의할 수 있습니다. Elytron으로 마이그레이션할 때 집계 보안 영역을 사용하여 이 작업을 수행할 수 있습니다.

다음 예제에서는 example-users.properties 속성 파일을 사용하여 사용자 인증을 수행한 다음 LDAP를 쿼리하여 그룹 및 역할 정보를 로드합니다.

참고

표시된 구성은 추가 배경 정보를 제공하는 다음 섹션의 예제를 기반으로 합니다.

9.3.7.1. Cryostatetbox Composite Store 구성

이 시나리오의 CryostatetBox 보안 도메인은 다음 관리 CLI 명령을 사용하여 구성됩니다.

예: CryostatetBox 구성 명령

/subsystem=security/security-domain=application-security:add

/subsystem=security/security-domain=application-security/authentication=classic:add(login-modules=[ {code=UsersRoles, flag=Required, module-options={ password-stacking=useFirstPass, usersProperties=file://${jboss.server.config.dir}/example-users.properties}} {code=LdapExtended, flag=Required, module-options={ password-stacking=useFirstPass, java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, java.naming.provider.url=ldap://localhost:10389, java.naming.security.authentication=simple, bindDN="uid=admin,ou=system", bindCredential=secret, baseCtxDN="ou=users,dc=group-to-principal,dc=wildfly,dc=org", baseFilter="(uid={0})", rolesCtxDN="ou=groups,dc=group-to-principal,dc=wildfly,dc=org",roleFilter="(uniqueMember={1})", roleAttributeID="uid" }}])

그러면 다음 서버 구성이 생성됩니다.

예: CryostatetBox Security Domain Configuration

<security-domain name="application-security">
  <authentication>
    <login-module code="UsersRoles" flag="required">
      <module-option name="password-stacking" value="useFirstPass"/>
      <module-option name="usersProperties" value="file://${jboss.server.config.dir}/example-users.properties"/>
    </login-module>
    <login-module code="LdapExtended" flag="required">
      <module-option name="password-stacking" value="useFirstPass"/>
      <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
      <module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>
      <module-option name="java.naming.security.authentication" value="simple"/>
      <module-option name="bindDN" value="uid=admin,ou=system"/>
      <module-option name="bindCredential" value="secret"/>
      <module-option name="baseCtxDN" value="ou=users,dc=group-to-principal,dc=wildfly,dc=org"/>
      <module-option name="baseFilter" value="(uid={0})"/>
      <module-option name="rolesCtxDN" value="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
      <module-option name="roleFilter" value="(uniqueMember={1})"/>
      <module-option name="roleAttributeID" value="uid"/>
    </login-module>
  </authentication>
</security-domain>

자세한 내용은 집계 보안 영역을 구성하는 방법에 대한 Elytron Aggregate Security Cryostat Configuration 을 참조하십시오.

9.3.7.2. 레거시 보안 Composite Store 구성

JBoss EAP 7.4 및 이전 리클레의 경우 다음 관리 CLI 명령을 사용하여 기존 보안 영역 구성이 구성됩니다.

참고

레거시 보안 명령은 JBoss EAP 8에서 적용되지 않으므로 이러한 명령은 JBoss EAP 7.4 및 이전 릴리스에만 적용됩니다.

예: 레거시 보안 Cryostat 구성 명령

/core-service=management/ldap-connection=MyLdapConnection:add(url="ldap://localhost:10389", search-dn="uid=admin,ou=system", search-credential="secret")

/core-service=management/security-realm=ApplicationSecurity:add
/core-service=management/security-realm=ApplicationSecurity/authentication=properties:add(path=example-users.properties, relative-to=jboss.server.config.dir, plain-text=true)

batch
/core-service=management/security-realm=ApplicationSecurity/authorization=ldap:add(connection=MyLdapConnection)
/core-service=management/security-realm=ApplicationSecurity/authorization=ldap/username-to-dn=username-filter:add(attribute=uid, base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org")
/core-service=management/security-realm=ApplicationSecurity/authorization=ldap/group-search=group-to-principal:add(base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org", iterative=true, prefer-original-connection=true, principal-attribute=uniqueMember, search-by=DISTINGUISHED_NAME, group-name=SIMPLE, group-name-attribute=uid)
run-batch

그러면 다음 서버 구성이 생성됩니다.

예: 레거시 보안 설정

<security-realms>
  ...
  <security-realm name="ApplicationSecurity">
    <authentication>
      <properties path="example-users.properties" relative-to="jboss.server.config.dir" plain-text="true"/>
    </authentication>
    <authorization>
      <ldap connection="MyLdapConnection">
        <username-to-dn>
          <username-filter base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org" attribute="uid"/>
        </username-to-dn>
        <group-search group-name="SIMPLE" iterative="true" group-name-attribute="uid">
          <group-to-principal search-by="DISTINGUISHED_NAME" base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org" prefer-original-connection="true">
            <membership-filter principal-attribute="uniqueMember"/>
          </group-to-principal>
        </group-search>
      </ldap>
    </authorization>
  </security-realm>
</security-realms>
<outbound-connections>
  <ldap name="MyLdapConnection" url="ldap://localhost:10389" search-dn="uid=admin,ou=system" search-credential="secret"/>
</outbound-connections>

이 작업을 수행하기 위해 ely tron 하위 시스템에서 집계 보안 영역을 구성하는 방법은 Elytron Aggregate Security Cryostat Configuration 에서 참조하십시오.

9.3.7.3. Elytron Aggregate Security Cryostat

이 시나리오에 동일한 Elytron 구성은 다음 관리 CLI 명령을 사용하여 구성됩니다.

예: Elytron 구성 명령

/subsystem=elytron/dir-context=ldap-connection:add(url=ldap://localhost:10389, principal="uid=admin,ou=system", credential-reference={clear-text=secret})

/subsystem=elytron/ldap-realm=ldap-realm:add(dir-context=ldap-connection, direct-verification=true, identity-mapping={search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org", rdn-identifier="uid", attribute-mapping=[{filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org",filter="(uniqueMember={1})",from="uid",to="Roles"}]})

/subsystem=elytron/properties-realm=application-properties:add(users-properties={path=example-users.properties, relative-to=jboss.server.config.dir, plain-text=true, digest-realm-name="Application Security"})

/subsystem=elytron/aggregate-realm=combined-realm:add(authentication-realm=application-properties, authorization-realm=ldap-realm)

/subsystem=elytron/security-domain=application-security:add(realms=[{realm=combined-realm}], default-realm=combined-realm, permission-mapper=default-permission-mapper)
/subsystem=elytron/http-authentication-factory=application-security-http:add(http-server-mechanism-factory=global, security-domain=application-security, mechanism-configurations=[{mechanism-name=BASIC}])

그러면 다음 서버 구성이 생성됩니다.

예: Elytron Configuration

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-domains>
    ...
    <security-domain name="application-security" default-realm="combined-realm" permission-mapper="default-permission-mapper">
      <realm name="combined-realm"/>
    </security-domain>
  </security-domains>
  <security-realms>
    <aggregate-realm name="combined-realm" authentication-realm="application-properties" authorization-realm="ldap-realm"/>
      ...
      <properties-realm name="application-properties">
        <users-properties path="example-users.properties" relative-to="jboss.server.config.dir" digest-realm-name="Application Security" plain-text="true"/>
      </properties-realm>
      <ldap-realm name="ldap-realm" dir-context="ldap-connection" direct-verification="true">
        <identity-mapping rdn-identifier="uid" search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org">
          <attribute-mapping>
            <attribute from="uid" to="Roles" filter="(uniqueMember={1})" filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
          </attribute-mapping>
        </identity-mapping>
      </ldap-realm>
  </security-realms>
  ...
  <http>
    ...
    <http-authentication-factory name="application-security-http" http-server-mechanism-factory="global" security-domain="application-security">
      <mechanism-configuration>
        <mechanism mechanism-name="BASIC"/>
      </mechanism-configuration>
    </http-authentication-factory>
    ...
  </http>
  ...
  <dir-contexts>
    <dir-context name="ldap-connection" url="ldap://localhost:10389" principal="uid=admin,ou=system">
      <credential-reference clear-text="secret"/>
    </dir-context>
  </dir-contexts>
</subsystem>

elytron 하위 시스템에서 인증에 사용할 보안 영역과 권한 부여 결정에 사용할 보안 영역을 지정하는 집계-realm 이 정의되어 있습니다.

9.3.8. 캐싱을 사용하는 보안 도메인을 Elytron으로 마이그레이션

CryostatetBox를 사용하는 경우 보안 도메인을 정의하고 액세스를 위해 메모리 내 캐싱을 활성화할 수 있었습니다. 이를 통해 메모리의 ID 데이터에 액세스하고 ID 저장소에 대한 추가 직접 액세스를 방지할 수 있었습니다. Elytron을 사용하여 유사한 구성을 수행할 수 있습니다. 이 섹션에서는 Elytron을 사용할 때 CryostatetBox 구성 및 동등한 보안 도메인 캐싱 구성 예를 보여줍니다.

9.3.8.1. Cryostatetbox 캐시된 보안 도메인 구성

다음 명령은 JBoss EAP 7.4 및 이전 버전에서 캐싱을 활성화하는 데 필요한 보안 도메인 구성을 보여줍니다.

예: CryostatetBox Cached Security Domain Commands

/subsystem=security/security-domain=application-security:add(cache-type=default)
/subsystem=security/security-domain=application-security/authentication=classic:add(login-modules=[{code=LdapExtended, flag=Required, module-options={ java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, java.naming.provider.url=ldap://localhost:10389, java.naming.security.authentication=simple, bindDN="uid=admin,ou=system", bindCredential=secret, baseCtxDN="ou=users,dc=group-to-principal,dc=wildfly,dc=org", baseFilter="(uid={0})", rolesCtxDN="ou=groups,dc=group-to-principal,dc=wildfly,dc=org", roleFilter="(uniqueMember={1})", roleAttributeID="uid" }}])

그러면 다음 서버 구성이 생성됩니다.

예: CryostatetBox Cached Security Domain Configuration

<subsystem xmlns="urn:jboss:domain:security:2.0">
  <security-domains>
    ...
    <security-domain name="application-security" cache-type="default">
      <authentication>
        <login-module code="LdapExtended" flag="required">
          <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
          <module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>
          <module-option name="java.naming.security.authentication" value="simple"/>
          <module-option name="bindDN" value="uid=admin,ou=system"/>
          <module-option name="bindCredential" value="secret"/>
          <module-option name="baseCtxDN" value="ou=users,dc=group-to-principal,dc=wildfly,dc=org"/>
          <module-option name="baseFilter" value="(uid={0})"/>
          <module-option name="rolesCtxDN" value="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
          <module-option name="roleFilter" value="(uniqueMember={1})"/>
          <module-option name="roleAttributeID" value="uid"/>
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>

참고

이 명령과 결과 구성은 Elytron으로 마이그레이션 LDAP 인증 구성에 표시된 예제와 유사하지만 여기에서 속성 cache-type기본값 으로 정의됩니다. 기본 캐시 유형은 메모리 내 캐시입니다. CryostatetBox를 사용하는 경우 infinispan캐시 유형을 지정할 수도 있지만 이 유형은 Elytron에서는 지원되지 않습니다.

9.3.8.2. Elytron 캐시된 보안 도메인 구성

다음 단계에 따라 Elytron을 사용할 때 보안 도메인을 캐시하는 유사한 구성을 생성합니다.

프로세스

  1. 보안 영역을 정의하고 보안 영역을 캐싱 영역에서 래핑합니다. 그런 다음 캐싱 영역을 보안 도메인 및 나중에 인증 팩토리에서 사용할 수 있습니다.

    예: Elytron Security Cryostat 구성 명령

    /subsystem=elytron/dir-context=ldap-connection:add(url=ldap://localhost:10389, principal="uid=admin,ou=system", credential-reference={clear-text=secret})
    /subsystem=elytron/ldap-realm=ldap-realm:add(dir-context=ldap-connection, direct-verification=true, identity-mapping={search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org", rdn-identifier="uid", attribute-mapping=[{filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org",filter="(uniqueMember={1})",from="uid",to="Roles"}]})
    /subsystem=elytron/caching-realm=cached-ldap:add(realm=ldap-realm)

  2. 이전 단계에서 정의한 cached-ldap 영역을 사용하는 보안 도메인 및 HTTP 인증 팩토리를 정의합니다.

    예: Elytron Security Domain and Authentication factory 구성 명령

    /subsystem=elytron/security-domain=application-security:add(realms=[{realm=cached-ldap}], default-realm=cached-ldap, permission-mapper=default-permission-mapper)
    /subsystem=elytron/http-authentication-factory=application-security-http:add(http-server-mechanism-factory=global, security-domain=application-security, mechanism-configurations=[{mechanism-name=BASIC}])

    참고

    원래 영역이 아닌 caching-realm 을 참조해야 합니다. 그렇지 않으면 캐싱이 무시됩니다.

이러한 명령을 실행하면 서버 구성에 다음이 추가됩니다.

예: Elytron Cached Security Domain Configuration

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-domains>
    ...
    <security-domain name="application-security" default-realm="cached-ldap" permission-mapper="default-permission-mapper">
      <realm name="cached-ldap"/>
    </security-domain>
  </security-domains>
  ...
  <security-realms>
    ....
  <ldap-realm name="ldap-realm" dir-context="ldap-connection" direct-verification="true">
      <identity-mapping rdn-identifier="uid" search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org">
        <attribute-mapping>
          <attribute from="uid" to="Roles" filter="(uniqueMember={1})" filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
        </attribute-mapping>
      </identity-mapping>
    </ldap-realm>
    <caching-realm name="cached-ldap" realm="ldap-realm"/>
  </security-realms>
  ...
  <http>
    ...
    <http-authentication-factory name="application-security-http" http-server-mechanism-factory="global" security-domain="application-security">
      <mechanism-configuration>
        <mechanism mechanism-name="BASIC"/>
      </mechanism-configuration>
    </http-authentication-factory>
    ...
  </http>
   ...
  <dir-contexts>
    <dir-context name="ldap-connection" url="ldap://localhost:10389" principal="uid=admin,ou=system">
      <credential-reference clear-text="secret"/>
    </dir-context>
  </dir-contexts>
  ...

9.3.9. Jakarta 권한 부여 보안을 Elytron으로 마이그레이션

기본적으로 JBoss EAP 7.4 및 이전 버전은 레거시 보안 하위 시스템을 사용하여 Jakarta 인증 정책 공급자 및 팩토리를 구성합니다. 기본 구성은 CryostatetBox의 구현에 매핑됩니다.

elytron 하위 시스템은 JACC(Java Authorization Contract for Containers) 사양을 기반으로 기본 제공 정책 공급자를 제공합니다.

elytron 하위 시스템에서 Java Authorization Contract for Containers 정책 공급자를 활성화하고 정의하는 방법에 대한 자세한 내용은 JBoss EAP 7.4 개발 가이드에서 Jakarta 인증 정책 공급자 정의를 참조하십시오.

9.4. 애플리케이션 클라이언트 마이그레이션

이 섹션에서는 클라이언트 애플리케이션을 Elytron으로 마이그레이션하는 방법에 대한 정보를 제공합니다.

이름 지정 클라이언트 구성을 Elytron으로 마이그레이션

이 섹션에서는 org.jboss.naming.remote.client.InitialContext 클래스에서 지원하는 org.jboss.naming.remote.client .InitialContext Factory 클래스를 사용하여 원격 JNDI 조회를 수행하는 클라이언트 애플리케이션을 Elytron으로 마이그레이션하는 방법을 설명합니다.

다음 예제에서는 사용자 자격 증명 및 연결하는 이름 지정 공급자의 URL에 대한 속성을 지정하여 InitialContextFactory 클래스를 생성한다고 가정합니다.

예: InitialContext 코드 이전 릴리스에서 사용됨

Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
properties.put(Context.PROVIDER_URL,"http-remoting://127.0.0.1:8080");
properties.put(Context.SECURITY_PRINCIPAL, "bob");
properties.put(Context.SECURITY_CREDENTIALS, "secret");
InitialContext context = new InitialContext(properties);
Bar bar = (Bar) context.lookup("foo/bar");
...

다음 마이그레이션 방법 중 하나를 선택할 수 있습니다.

9.4.1. 구성 파일 접근 방식을 사용하여 이름 지정 클라이언트 마이그레이션

구성 접근 방식을 사용하여 이름 지정 클라이언트를 Elytron으로 마이그레이션합니다.

프로세스

  1. 클라이언트 애플리케이션 META-INF/ 디렉터리에 wildfly-config.xml 파일을 생성합니다. 파일에는 이름 지정 공급자에 대한 연결을 설정할 때 사용할 사용자 자격 증명이 포함되어야 합니다.

    예: wildfly-config.xml 파일

    <configuration>
      <authentication-client xmlns="urn:elytron:client:1.7">
        <authentication-rules>
          <rule use-configuration="namingConfig">
            <match-host name="127.0.0.1"/>
          </rule>
        </authentication-rules>
        <authentication-configurations>
          <configuration name="namingConfig">
            <set-user-name name="bob"/>
            <credentials>
              <clear-password password="secret"/>
            </credentials>
          </configuration>
        </authentication-configurations>
      </authentication-client>
    </configuration>

  2. 다음 예와 같이 InitialContext 를 생성합니다. InitialContextorg.wildfly.naming.client.wildFlyInitialContextFactory 클래스에서 지원합니다.

    예: InitialContext 코드

    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.wildfly.naming.client.WildFlyInitialContextFactory");
    properties.put(Context.PROVIDER_URL,"remote+http://127.0.0.1:8080");
    InitialContext context = new InitialContext(properties);
    Bar bar = (Bar) context.lookup("foo/bar");
    ...

9.4.2. 프로그래밍 방식의 접근 방식을 사용하여 이름 지정 클라이언트 마이그레이션

이 방법을 사용하면 애플리케이션 코드에서 직접 이름 지정 공급자에 대한 연결을 설정하는 데 사용되는 사용자 자격 증명을 제공합니다.

예: 프로그래밍 방식의 접근 방식을 사용하는 코드

// Create the authentication configuration
AuthenticationConfiguration namingConfig = AuthenticationConfiguration.empty().useName("bob").usePassword("secret");

// Create the authentication context
AuthenticationContext context = AuthenticationContext.empty().with(MatchRule.ALL.matchHost("127.0.0.1"), namingConfig);

// Create a callable that creates and uses an InitialContext
Callable<Void> callable = () -> {
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.wildfly.naming.client.WildFlyInitialContextFactory");
    properties.put(Context.PROVIDER_URL,"remote+http://127.0.0.1:8080");
    InitialContext context = new InitialContext(properties);
    Bar bar = (Bar) context.lookup("foo/bar");
    ...
    return null;
};

// Use the authentication context to run the callable
context.runCallable(callable);

9.4.3. Jakarta Enterprise Cryostats 클라이언트를 Elytron으로 마이그레이션

이 마이그레이션 예제에서는 jboss- Cryostat-client.properties 파일을 사용하여 원격 서버에 배포된 Jakarta Enterprise Cryostat를 호출하도록 클라이언트 애플리케이션이 구성되어 있다고 가정합니다. 클라이언트 애플리케이션 META-INF/ 디렉터리에 있는 이 파일에는 원격 서버에 연결하는 데 필요한 다음 정보가 포함되어 있습니다.

예: jboss- Cryostat-client.properties 파일

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port = 8080
remote.connection.default.username=bob
remote.connection.default.password=secret

클라이언트는 자카르타 Enterprise Cryostat를 조회하고 다음 예제와 유사한 코드를 사용하여 메서드 중 하나를 호출합니다.

예: 원격 Jakarta Enterprise Cryostat를 호출하는 클라이언트 코드

// Create an InitialContext
Properties properties = new Properties();
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext context = new InitialContext(properties);

// Look up the Jakarta Enterprise Beans and invoke one of its methods
RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup(
    "ejb:/ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
int sum = statelessRemoteCalculator.add(101, 202);

다음 마이그레이션 방법 중 하나를 선택할 수 있습니다.

9.4.3.1. 구성 파일을 사용하여 Jakarta Enterprise Cryostats 클라이언트 마이그레이션

구성 접근 방식을 사용하여 이름 지정 클라이언트를 Elytron으로 마이그레이션하려면 다음 단계를 따르십시오.

프로세스

  1. 클라이언트 애플리케이션 META-INF/ 디렉터리에 wildfly-config.xml 파일을 구성합니다. 파일에는 이름 지정 공급자에 대한 연결을 설정할 때 사용할 사용자 자격 증명이 포함되어야 합니다.

    예: wildfly-config.xml 파일

    <configuration>
      <authentication-client xmlns="urn:elytron:client:1.7">
        <authentication-rules>
          <rule use-configuration="ejbConfig">
            <match-host name="127.0.0.1"/>
          </rule>
        </authentication-rules>
        <authentication-configurations>
          <configuration name="ejbConfig">
            <set-user-name name="bob"/>
            <credentials>
              <clear-password password="secret"/>
            </credentials>
          </configuration>
        </authentication-configurations>
      </authentication-client>
      <jboss-ejb-client xmlns="urn:jboss:wildfly-client-ejb:3.0">
        <connections>
          <connection uri="remote+http://127.0.0.1:8080" />
        </connections>
      </jboss-ejb-client>
    </configuration>

  2. 다음 예와 같이 InitialContext 를 생성합니다. InitialContextorg.wildfly.naming.client.wildFlyInitialContextFactory 클래스에서 지원합니다.

    예: InitialContext 코드

    // Create an InitialContext
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.wildfly.naming.client.WildFlyInitialContextFactory");
    InitialContext context = new InitialContext(properties);
    
    // Look up an Jakarta Enterprise Beans and invoke one of its methods
    // Note that this code is the same as before
    RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup(
        "ejb:/ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
    int sum = statelessRemoteCalculator.add(101, 202);----

  3. 이제 해당 파일이 더 이상 필요하지 않으므로 더 이상 사용되지 않는 jboss- Cryostat-client.properties 파일을 삭제할 수 있습니다.

9.4.3.2. 프로그래밍 방식으로 Jakarta Enterprise Cryostats 클라이언트를 마이그레이션

다음 단계를 사용하여 프로그래밍 방식으로 Jakarta Enterprise Cryostats 클라이언트를 마이그레이션합니다.

프로세스

  • 애플리케이션 코드에서 원격 서버에 직접 연결하는 데 필요한 정보를 제공합니다.

예: 프로그래밍 방식을 사용하는 코드

// Create the authentication configuration
AuthenticationConfiguration ejbConfig = AuthenticationConfiguration.empty().useName("bob").usePassword("secret");

// Create the authentication context
AuthenticationContext context = AuthenticationContext.empty().with(MatchRule.ALL.matchHost("127.0.0.1"), ejbConfig);

// Create a callable that invokes the Jakarta Enterprise Beans
Callable<Void> callable = () -> {

    // Create an InitialContext
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
    properties.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080");
    InitialContext context = new InitialContext(properties);

    // Look up the Jakarta Enterprise Beans and invoke one of its methods
    // Note that this code is the same as before
    RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup(
        "ejb:/ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());
    int sum = statelessRemoteCalculator.add(101, 202);
    ...
    return null;
};

// Use the authentication context to run the callable
context.runCallable(callable);

이제 해당 파일이 더 이상 필요하지 않으므로 더 이상 사용되지 않는 jboss- Cryostat-client.properties 파일을 삭제할 수 있습니다.

9.5. SSL 구성 마이그레이션

Elytron을 사용하여 다음 정보를 사용하도록 애플리케이션에서 SSL 구성을 마이그레이션합니다.

간단한 SSL 구성을 Elytron으로 마이그레이션

보안 영역을 사용하여 JBoss EAP 서버에 대한 HTTP 연결을 보호한 경우 이 섹션에 제공된 정보를 사용하여 SSL 구성을 Elytron으로 마이그레이션합니다.

사전 요구 사항

보안 영역을 사용하여 JBoss EAP 서버에 대한 보안 HTTP 연결을 준비합니다.

다음 예제에서는 security-realm 에 다음 키 저장소가 구성되어 있다고 가정합니다.

예: Security Cryostat 키 저장소를 사용한 SSL 구성

<security-realm name="ApplicationRealm">
  <server-identities>
    <ssl>
      <keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="keystore_password" alias="server" key-password="key_password" />
    </ssl>
  </server-identities>
</security-realm>

Elytron을 사용하여 동일한 구성을 수행하려면 다음 단계를 완료합니다.

프로세스

  1. 키 저장소 의 위치와 암호화된 암호를 지정하는 elytron 하위 시스템에 키 저장소를 생성합니다. 이 명령은 keytool 명령을 사용하여 키 저장소가 생성되었으며 해당 유형은 JKS 라고 가정합니다.

    /subsystem=elytron/key-store=LocalhostKeyStore:add(path=server.keystore,relative-to=jboss.server.config.dir,credential-reference={clear-text="keystore_password"},type=JKS)
  2. 이전 단계에서 정의된 키 저장소, 별칭 및 키 암호를 지정하는 elytron 하위 시스템에 key- manager 를 생성합니다.

    /subsystem=elytron/key-manager=LocalhostKeyManager:add(key-store=LocalhostKeyStore,alias-filter=server,credential-reference={clear-text="key_password"})
  3. 이전 단계에서 정의한 key-manager 를 참조하는 elytron 하위 시스템에서 server-ssl-context 를 생성합니다.

    /subsystem=elytron/server-ssl-context=LocalhostSslContext:add(key-manager=LocalhostKeyManager)
  4. 기존 security-realm 에서 새로 생성된 Elytron ssl-contexthttps-listener 를 전환합니다.

    batch
    /subsystem=undertow/server=default-server/https-listener=https:undefine-attribute(name=security-realm)
    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=ssl-context,value=LocalhostSslContext)
    run-batch
  5. 서버를 다시 로드합니다.

    reload

그러면 서버 구성 파일에 다음과 같은 elytron 하위 시스템 구성이 생성됩니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" ...>
  ...
  <tls>
    <key-stores>
      <key-store name="LocalhostKeyStore">
        <credential-reference clear-text="keystore_password"/>
        <implementation type="JKS"/>
        <file path="server.keystore" relative-to="jboss.server.config.dir"/>
      </key-store>
    </key-stores>
    <key-managers>
      <key-manager name="LocalhostKeyManager" key-store="LocalhostKeyStore"  alias-filter="server">
        <credential-reference clear-text="key_password"/>
      </key-manager>
    </key-managers>
    <server-ssl-contexts>
      <server-ssl-context name="LocalhostSslContext" key-manager="LocalhostKeyManager"/>
    </server-ssl-contexts>
  </tls>
</subsystem>

그러면 서버 구성 파일에 다음과 같은 undertow 하위 시스템 구성이 생성됩니다.

<https-listener name="https" socket-binding="https" ssl-context="LocalhostSslContext" enable-http2="true"/>

자세한 내용은 Elytron Cryostat 및 How to Secure the Management Interfaces in the JBoss EAP 7.4 How to Configure Server Security 를 참조하십시오.

9.5.1. CLIENT-CERT SSL 인증을 Elytron으로 마이그레이션

CLIENT-CERT SSL 인증을 활성화하려면 인증 요소에 truststore 요소를 추가합니다.

<security-realm name="ManagementRealm">
  <server-identities>
    <ssl>
      <keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="KEYSTORE_PASSWORD" alias="server" key-password="key_password" />
    </ssl>
  </server-identities>
  <authentication>
    <truststore path="server.truststore" relative-to="jboss.server.config.dir" keystore-password="TRUSTSTORE_PASSWORD" />
    <local default-user="$local"/>
    <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
  </authentication>
</security-realm>
참고

CLIENT-CERT 인증이 발생하지 않으면 클라이언트가 로컬 메커니즘 또는 사용자 이름/암호 인증 메커니즘을 사용하도록 대체할 수 있습니다. CLIENT-CERT 기반 인증을 필수로 만들려면 로컬속성 요소를 제거합니다.

레거시 신뢰 저장소 는 다음 두 가지 방법으로 사용할 수 있습니다.

9.5.1.1. 기존 truststore 만 CA 포함

다음 단계에 따라 유효한 인증서 및 개인 키가 없는 사용자가 Elytron을 사용하여 서버에 액세스하지 못하도록 서버를 구성합니다.

프로세스

  1. 키 저장소 의 위치와 암호화된 암호를 지정하는 elytron 하위 시스템에 키 저장소를 생성합니다. 이 명령은 keytool 명령을 사용하여 키 저장소가 생성되었으며 해당 유형은 JKS 라고 가정합니다.

    /subsystem=elytron/key-store=LocalhostKeyStore:add(path=server.keystore,relative-to=jboss.server.config.dir,credential-reference={clear-text="keystore_password"},type=JKS)
  2. 신뢰 저장소의 위치와 암호화된 암호를 지정하는 elytron 하위 시스템에 키 저장소를 생성합니다. 이 명령은 keytool 명령을 사용하여 키 저장소가 생성되었으며 해당 유형은 JKS 라고 가정합니다.

    /subsystem=elytron/key-store=TrustStore:add(path=server.truststore,relative-to=jboss.server.config.dir,credential-reference={clear-text="truststore_password"},type=JKS)
  3. 이전에 정의된 LocalhostKeyStore 키 저장소, 별칭 및 키 암호를 지정하는 elytron 하위 시스템에 key-manager 를 생성합니다.

    /subsystem=elytron/key-manager=LocalhostKeyManager:add(key-store=LocalhostKeyStore,alias-filter=server,credential-reference={clear-text="key_password"})
  4. 이전에 생성한 신뢰 저장소의 키 저장소를 지정하는 elytron 하위 시스템에 trust- manager 를 생성합니다.

    /subsystem=elytron/trust-manager=TrustManager:add(key-store=TrustStore)
  5. 이전에 정의한 key-manager 를 참조하는 elytron 하위 시스템에서 server-ssl-context 를 생성하고, trust-manager 속성을 설정하고, 클라이언트 인증을 활성화합니다.

    /subsystem=elytron/server-ssl-context=LocalhostSslContext:add(key-manager=LocalhostKeyManager,trust-manager=TrustManager,need-client-auth=true)
  6. https-listener 를 새로 생성된 Elytron ssl-context 로 업데이트합니다.

    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=ssl-context,value=LocalhostSslContext)
  7. 서버를 다시 로드합니다.

    reload

그러면 서버 구성 파일에 다음과 같은 elytron 하위 시스템 구성이 생성됩니다.

<subsystem xmlns="urn:wildfly:elytron:4.0"...>
  ...
  <tls>
    <key-stores>
      <key-store name="LocalhostKeyStore">
        <credential-reference clear-text="keystore_password"/>
        <implementation type="JKS"/>
        <file path="server.keystore" relative-to="jboss.server.config.dir"/>
      </key-store>
      <key-store name="TrustStore">
        <credential-reference clear-text="truststore_password"/>
        <implementation type="JKS"/>
        <file path="server.truststore" relative-to="jboss.server.config.dir"/>
      </key-store>
    </key-stores>
    <key-managers>
      <key-manager name="LocalhostKeyManager" key-store="LocalhostKeyStore" alias-filter="server">
        <credential-reference clear-text="key_password"/>
      </key-manager>
    </key-managers>
    <trust-managers>
      <trust-manager name="TrustManager" key-store="TrustStore"/>
    </trust-managers>
    <server-ssl-contexts>
      <server-ssl-context name="LocalhostSslContext" need-client-auth="true" key-manager="LocalhostKeyManager" trust-manager="TrustManager"/>
    </server-ssl-contexts>
  </tls>
</subsystem>

그러면 서버 구성 파일에 다음과 같은 undertow 하위 시스템 구성이 생성됩니다.

<subsystem xmlns="urn:jboss:domain:undertow:14.0">
...
<https-listener name="https" socket-binding="https" ssl-context="LocalhostSslContext" enable-http2="true"/>
...
</subsystem>

9.5.1.2. Security Cryostat 및 Domains

보안 영역은 다음 두 가지 상황에서 사용됩니다.

  • 인증서 인증에 실패하면 암호 폴백 케이스에서 보안 영역이 사용됩니다.
  • 암호 및 인증서에 대한 권한 부여가 완료되면 영역은 개별 사용자의 역할을 제공합니다.

사전 정의된 Elytron ManagementDomain 보안 도메인 및 ManagementRealm 보안 영역을 사용할 수 있도록 사용자는 표준 속성 파일에 저장됩니다.

<security-domains>
    <security-domain name="ManagementDomain" default-realm="ManagementRealm" permission-mapper="default-permission-mapper">
        <realm name="ManagementRealm" role-decoder="groups-to-roles"/>
        <realm name="local"/>
    </security-domain>
</security-domains>
<security-realms>
    <properties-realm name="ManagementRealm">
        <users-properties path="mgmt-users.properties" relative-to="jboss.server.config.dir" digest-realm-name="ManagementRealm"/>
        <groups-properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/>
    </properties-realm>
</security-realms>

따라서 모든 클라이언트 인증서의 경우 사용자가 보안 영역에 있어야 합니다.

9.5.1.3. 주체 Decoder

인증서 인증이 사용되고 보안 영역에서 사용자 이름을 수락하여 ID를 확인하는 경우 클라이언트 인증서에서 사용자 이름을 가져오는 데 정의된 방법이 있어야 합니다.

이 경우 CN 속성은 인증서 제목에서 사용됩니다.

/subsystem=elytron/x500-attribute-principal-decoder=x500-decoder:add(attribute-name=CN)

9.5.1.4. HTTP 인증 internal

HTTP 연결의 경우 이전에 정의된 리소스를 사용하여 HTTP 인증 팩토리를 정의합니다. CLIENT_CERT 및 vmwareG EST 인증을 지원하도록 구성되어 있습니다.

속성 영역은 암호만 확인하고 클라이언트 인증서를 확인할 수 없으므로 먼저 구성 메커니즘 팩토리를 추가해야 합니다. 이렇게 하면 보안 영역에 대한 인증서 확인이 비활성화됩니다.

/subsystem=elytron/configurable-http-server-mechanism-factory=configured-cert:add(http-server-mechanism-factory=global, properties={org.wildfly.security.http.skip-certificate-verification=true})

HTTP 인증은 다음과 같이 생성할 수 있습니다.

./subsystem=elytron/http-authentication-factory=client-cert-digest:add(http-server-mechanism-factory=configured-cert,security-domain=ManagementDomain,mechanism-configurations=[{mechanism-name=CLIENT_CERT,pre-realm-principal-transformer=x500-decoder},{mechanism-name=DIGEST, mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])

위의 명령은 다음과 같습니다.

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <http>
    ...
    <http-authentication-factory name="client-cert-digest" http-server-mechanism-factory="configured-cert" security-domain="ManagementDomain">
      <mechanism-configuration>
        <mechanism mechanism-name="CLIENT_CERT" pre-realm-principal-transformer="x500-decoder"/>
        <mechanism mechanism-name="DIGEST">
          <mechanism-realm realm-name="ManagementRealm"/>
        </mechanism>
      </mechanism-configuration>
    </http-authentication-factory>
    ...
    <configurable-http-server-mechanism-factory name="configured-cert" http-server-mechanism-factory="configured-cert">
        <properties>
            <property name="org.wildfly.security.http.skip-certificate-verification" value="true"/>
        </properties>
    </configurable-http-server-mechanism-factory>
    ...
  </http>
  ...
</subsystem>

9.6. LDAP의 레거시 보안 동작 변경

Red Hat JBoss Enterprise Application Platform 8.0에서는 LDAP를 크게 변경합니다. 이러한 변경으로는 연결할 수 없는 LDAP 영역에 대한 HTTP 상태 변경, DN에서 역할 구문 분석에 사용할 수 있는 LDAP 보안 영역 활성화, JBoss EAP SSL 인증서를 LDAP 서버로 보내는 변경 사항이 포함됩니다.

  • Elytron 하위 시스템을 활용하는 JBoss EAP 8.0에서는 LDAP 영역에 연결할 수 없는 경우 "500 Internal Error"가 반환되어 연결할 수 없는 영역에 대한 HTTP 상태 변경을 나타냅니다.
  • JBoss EAP 8.0에서는 LDAP 보안 영역을 활성화하여 DN에서 역할을 구문 분석할 수 있습니다. LDAP에서 ID와 연결된 속성으로 정보를 로드하면 이러한 속성을 attribute-mapping 요소를 사용하여 역할에 매핑할 수 있습니다.

    설정 예

    <ldap-realm name="ldap-realm" dir-context="ldap-connection" direct-verification="true">
      <identity-mapping rdn-identifier="uid" search-base-dn="ou=users,dc=group-to-principal,dc=wildfly,dc=org">
        <attribute-mapping>
          <attribute from="dn" to="Roles" filter="(uniqueMember={1})" filter-base-dn="ou=groups,dc=group-to-principal,dc=wildfly,dc=org"/>
        </attribute-mapping>
      </identity-mapping>
    </ldap-realm>

  • JBoss EAP 8.0에서는 JBoss EAP SSL 인증서를 LDAP 서버로 전송하기 위해 양방향 또는 상호 TLS를 사용하도록 아웃바운드 LDAP 연결을 구성하는 옵션이 있습니다. 자세한 내용은 관리 인터페이스 및 애플리케이션에 대해 양방향 SSL/TLS 활성화를 참조하십시오.

부록 A. 참조 자료

JBoss EAP 사용자는 서로 다른 릴리스 간에 원활한 호환성과 상호 운용성을 기대할 수 있습니다. 추가 고려 사항이 필요한 특정 경우에만 다양한 클라이언트에서 서버에 연결할 수 있습니다.

A.1. 릴리스 간 호환성 및 상호 운용성

이 섹션에서는 JBoss EAP 6, JBoss EAP 7 및 JBoss EAP 8.0 릴리스 간의 클라이언트 및 서버 엔터프라이즈 빈 및 메시징 구성 요소의 호환성 및 상호 운용성에 대해 설명합니다.

A.1.1. Internet Inter-ORB 프로토콜을 통해 엔터프라이즈 빈 제거

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 서버로 연결
  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 6 서버에 연결

A.1.2. Java Naming and Directory Interface를 사용하여 엔터프라이즈 빈 제거

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결

JBoss EAP 6은 Enterprise Cryostat 3.1 사양을 지원하며 JBoss EAP 8.0에서 계속 사용되는 표준화된 글로벌 Java Naming 및 Directory Interface 네임스페이스 사용을 도입했습니다. Java Naming 및 Directory Interface 네임스페이스 이름 변경으로 인해 다음 구성에 대한 비호환성이 발생하지 않습니다.

  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 또는 JBoss EAP 7 서버에 연결
  • JBoss EAP 8.0 또는 JBoss EAP 7 클라이언트에서 JBoss EAP 6 서버로 연결

A.1.3. @WebService를 사용하여 엔터프라이즈 빈 제거

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 서버로 연결
  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 6 서버에 연결

A.1.4. 메시징 독립 실행형 클라이언트

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결

JBoss EAP 8.0 기본 제공 메시징은 프로토콜 호환성 문제로 인해 JBoss EAP 6와 함께 제공되는 HornetQ 2.3.x에 연결할 수 없습니다. 따라서 다음 구성이 호환되지 않습니다.

  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 6 서버에 연결
  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 서버로 연결

    참고

    이 연결을 사용하려면 Java Naming 및 Directory Interface를 통해 액세스할 수 있는 레거시 연결 팩토리를 생성해야 합니다.

A.1.5. 메시징 Cryostat

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결

JBoss EAP 8.0 기본 제공 메시징은 프로토콜 호환성 문제로 인해 JBoss EAP 6와 함께 제공되는 HornetQ 2.3.x에 연결할 수 없습니다. 따라서 다음 구성이 호환되지 않습니다.

  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 6 서버에 연결
  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 서버로 연결

    참고

    이 연결을 사용하려면 Java Naming 및 Directory Interface를 통해 액세스할 수 있는 레거시 연결 팩토리를 생성해야 합니다.

A.1.6. 메시징 브리지

다음 구성은 오류 없이 실행되어야 합니다.

  • JBoss EAP 6 클라이언트에서 JBoss EAP 8.0 서버로 연결
  • JBoss EAP 7 클라이언트에서 JBoss EAP 8.0 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 7 서버에 연결
  • JBoss EAP 8.0 클라이언트에서 JBoss EAP 6 서버에 연결

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.