[스프링 인 액션] 18. JMS로 스프링 모니터링 하기 / 19. 스프링 배포하기

김하영·2021년 8월 26일
0
post-custom-banner
  • 이 장에서 배우는 내용
    액추에이터 엔드포인트 MBeans 사용하기
    스프링 빈을 MBeans로 노출하기
    알림 발행(전송)하기

JMX는 자바 애플리케이션을 모니터링, 관리하는 표준 방법이고, MBeans라는 컴포넌트를 노출함으로서 외부의 JMX 클라이언트가 오퍼레이션 호출, 속성 검사, MBeans의 이벤트 모니터링을 통해 애플리케이션을 관리할 수 있다.

JMX는 스프링 부트 앱에 기본적으로 활성화되며 그에 따라 모든 액추에이터 엔드포인트가 MBeans로 노출된다. 또한 그 외의 다른 스프링 애플리케이션 컨텍스트의 빈도 노출시킬 수 있다.

이번 장에서는 액추에이터 엔드포인트가 어떻게 MBeans로 노출되는지 살펴보면서 스프링과 JMX를 살펴본다.

요약

  • 대부분의 액추에이터 앤드포인트는 JMX 클라이언트로 모니터링할 수 있는 Mbean로 사용할 수 있다.
  • 스프링은 스프링 애플리케이션 컨텍스트의 빈을 모니터링하기 위해 자동으로 JMX를 활성화한다.
  • 스프링 빈에 @ManagedResource 애노테이션을 지정하면 Mbean로 노출될 수 있다.
    그리고 해당 빈의 메서드에 @ManagedOperation을 지정하면 관리 오퍼레이션으로 노출될 수 있으며,
    속성에 @ManagedAttribute를 지정하면 관리 속성으로 노출 될 수 있다.
  • 스프링 빈은 NotificationPublisher를 사용하여 JMX 클라이언트에게 알림을 전송할 수 있다.

  • 이 장에서 배우는 내용
    스프링 애플리케이션을 WAR나 JAR 파일로 빌드하기
    스프링 애플리케이션을 클라우드 파운드리에 푸시하기
    스프링 애플리케이션을 도커 컨테이너에 패키징하기

19.1 배포 옵션

스프링 부트 애플리케이션은 다음 몇 가지 방법으로 빌드하고 실행할 수 있다.

  1. STS 나 IntelliJ IDEA 등의 IDE 에서 애플리케이션을 빌드하고 실행한다.
  2. 메이븐 spring:run이나 그래들 bootRun 태스크를 사용하여 명령행에서 애플리케이션을 빌드하고 실행한다.
  3. 메이븐이나 그래들을 사용해서 실행 가능한 JAR 파일(명령행에서 실행되거나 클라우드에 배포될 수 있음)을 생성한다.
  4. 메이븐이나 그래들을 사용해서 WAR 파일을 생성한다.

자바 애플리케이션 서버에 배포하기 (WAR 파일)
톰캣, 웹스피어, 웹로직 등의 웹서버 또는 자바 애플리케이션 배포한다. 선택의 여지없이 WAR 파일로 애플리케이션을 빌드해야 한다.

클라우드에 배포하기
클라우드 파운드리, AWS, 마이크로소프트 Azure, 구글 클라우드 플랫폼 같은 클라우드 플랫폼에 배포.
여러 클라우드 플랫폼으로 애플리케이션을 배포한다면 실행 가능한 JAR 파일 배포가 최상의 선택이다.

19.4 도커 컨테이너에서 스프링 부트 실행하기

도커는 클라우드에서 모든 종류의 애플리케이션을 배포하는 사실상의 표준이 되었다.
도커로 생성되는 것과 같은 컨테이너 애플리케이션의 아이디어는 실세계의 컨테이너에서 비롯되었다.

컨테이너 애플리케이션은 공통된 컨테이너 형식을 공유하므로 컨테이너에 포함된 애플리케이션과 무관하게 어디서든 배포 및 실행할 수 있다.

Spotify(스포티파이)의 메이븐 플러그인을 사용하면 스프링 부트 빌드의 결과를 더 쉽게 도커 컨테이너로 생성할 수 있다.

<build>
    <plugins>
    ...
    <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-file-maven-plugin</artifactId>
    <version>1.4.3</version>
    <configuration>
        <repository>
             ${docker.image.prefix}/${project.artifactId}
        </repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
    </plugin>
    </plugin>
</build>

블록 아래에는 도커 이미지 생성에 필요한 속성들을 설정한다.
요소에는 도커 리퍼지터리에 나타나는 도커 이미지의 이름을 지정한다.

여기서 지정했듯이 이름의 제일 앞에는 docker.image.prefix 라는 이름의 메이븐 속성 값이 지정되고 그 다음에는 메이븐 프로젝트의 artifact ID가 붙는다.

프로젝트의 artifact ID는 바로 위의 artifactId 요소에 지정되어 있으며 docker.image.prefix 속성은 다음과 같이 properties 요소에 지정해야 한다.

요소 아래에는 도커 이미지에 포함시키기 위해 메이븐 빌드가 생성되는 JAR 파일을 지정한다.
이때 target 디렉터리에 있는 JAR 파일의 이름을 결정하기 위해 메이븐 속성인 project.build.finalName 을 사용한다.

<properties>
...
<docker.image.prefix>tacocloud</docker.image.prefix>
</properties>

이것이 타코 클라우드 식자재 서비스의 pom.xml 파일이었다면
결과로 생성되는 도커 이미지는 도커 리퍼지터리의 tacocloud/ingredient-service에 저장되었을 것이다.

이처럼 메이븐 빌드 명세에 제공한 정보 외의 다른 모든 도커 이미지 정보는 Dockerfile이라는 이름의 파일에 정의된다.

도커 이미지 docker 파일

FROM openjdk:8-jdk-alpine
ENV SPRING_PROFILES_ACTIVE docker
VOLUMN /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", `
            "-Djava.security.egd=file:/dev/.urandom", `
            "-jar", `
            "/app.jar"]

FROM에는 새 이미지의 기반이 되는 이미지를 지정한다.
새 이미지는 기본 이미지를 확장한다.
여기서는 기본 이미지가 OpenJDK 버전 8을 기반으로 하는 컨테이너 이미지인 openjdk:8-jdkalpine이다.

ENV에는 환경 변수를 설정한다.
여기서는 활성 프로파일을 기반으로 스프링 부트 애플리케이션의 구성 속성을 변경할 것이므로 환경 변수인 SPRING_PROFILES_ACTIVE docker로 설정하였다.
스프링 부트 애플리케이션이 docker 활성 프로파일로 시작하도록 하기 위해서다.

VOLUME은 컨테이너의 마운트 지점을 생성한다.
여기서는 필요 시에 컨테이너가 /tmp 디렉터리에 데이터를 쓸 수 있도록 /tmp에 마운트 지점을 생성한다.

ARG에는 빌드 시에 전달할 수 있는 인자를 선언한다.
여기서는 메이븐 플러그인의 블록에 지정된 인자와 동일한 JAR_FILE이라는 이름의 인자를 선언한다.

COPY는 지정된 경로의 파일을 다른 경로로 복사한다. 여기서는 메이븐 플러그인에 지정된 JAR 파일을 app.jar라는 이름의 파일로 도커 이미지에 복사한다.

ENTRYPOINT에는 컨테이너가 시작될 때 실행하기 위한 명령행 코드를 배열로 지정한다.
여기서는 실행 가능한 app.jar 파일을 실행시키지 위해 명령행에서 java를 사용하도록 지정한다.

일반적으로 스프링 부트 애플리케이션을 포함하는 컨테이너 이미지에는 SPRING_PROFILES_ACTIVE 환경 변수를 ENV에 설정하는 것이 좋다.
이렇게 하면 도커에서 실행되는 애플리케이션에 고유한 빈과 구성 속성을 구성할 수 있기 때문이다.

식자재 서비스와 몽고 데이터 베이스에 연결

식자재 서비스의 경우는 별개의 컨테이너에서 실행되는 몽고 데이터 베이스에 우리 애플리케이션을 연결할 방법이 필요하다.

기본적으로 스프링 데이터는 localhost의 27017 포트를 리스닝하는 몽고 데이터베이스와의 연결을 시도한다.
그러나 이것은 로컬로 실행될 대만 가능하고 컨테이너일 때는 다르다. 따라서 spring.data.mongodb.host 속성을 구성하여 몽고 데이터베이스를 사용할 수 있는 호스트 이름을 스프링 데이터에 알려주어야 한다.

다음의 도커에 특정된 구성을 application.yml 파일에 추가하여 docker 프로파일이 활성화될 때 스프링 데이터가 mongo라는 호스트의 몽고 데이터베이스를 연결하도록 구성할 수 있다.

spring:
   profiles: docker
   data: 
   mongodb:
      host: mongo

이렇게 하면 도커 컨테이너가 시작되는 즉시 mongo 호스트가 다른 컨테이너에서 실행 중인 몽고 데이터베이스로 연결된다. (..자동으로 몽고db로 연결되는 건가? 접속 정보 이런거 입력을 안해도?)

이제는 도커 이미지를 빌드할 준비가 되었으므로 메이븐 래퍼를 사용해서 package와 dockerfile:build를 실행시켜 JAR 파일을 빌드하면 도커 이미지가 생성된다.

mvnw package dockerfile:build

식자재 서비스 컨테이너를 시작하기에 앞서 몽고 데이터베이스의 컨테이너를 먼저 시작해야한다.

$ docker run --name tacocloud-mongo -d  mongo:3.7.9-xenial

마지막으로 식자재 서비스 컨테이너를 실행하면 된다. 이때 방금 시작된 몽고 컨테이너와 연결한다.

$ docker run -p  8080:8081 \
             --link tacocloud-mongo:mongo
             tacocloud/ingredient-service

컨테이너의 스프링 부트 애플리케이션이 8081 포트로 실행되도록 구성했으므로 -p 매개변수에서는 내부 포트를 호스트의 8080 포트로 연결시킨다.

--link 매개변수는 이 컨테이너를 tacocloud-mongo 컨테이너와 연결시킨다.
그리고 이때 tacocloud-mongo 컨테이너의 호스트 이름을 mongo로 지정한다. 스프링 데이터가 이 호스트 이름을 사용해서 연결할 수 있도록 하기 위해서다.

마지막으로 새 컨테이너에서 실행되는 이미지의 이름 (tacocloud/ingredient-service)을 지정한다.

요약

  • 스프링 애플리케이션은 종전의 애플리케이션 서버, 클라우드 파운드리와 같은 Paas, 도커 컨테이너 등을 포함해서 서로 다른 환경에 배포할 수 있다.

  • WAR 파일을 빌드할 때는 스프링의 DispatcherServlet이 적합하게 구성되도록 SpringBootServletInitializr의 서브 클래스를 포함해야 한다.

  • 실행 가능 JAR 파일을 빌드하면 WAR 파일의 부담 없이 스프링 부트 애플리케이션을 다수의 클라우드 플랫폼에 배포할 수 있다.

  • Spotify의 메이븐 플러그인을 사용하면 스프링 애플리케이션을 컨테이너에 패키징하기 쉽다. 이 플러그인은 실행 가능 JAR 파일을 도커 컨테이너에 랩핑하므로 도커 컨테이너가 배포될 수 있는 곳이면 어디든지 애플리케이션을 배포할 수 있다.

profile
Back-end Developer
post-custom-banner

0개의 댓글