Spring Boot 컨테이너 애플리케이션을 APM으로 모니터링 하는 방법
Spring Boot는 Java 기반의 오픈소스 프레임워크로 복잡한 설정 없이 빠르게 독립 실행형 (Standalone) 애플리케이션을 만들 수 있도록 도와주는 기술입니다.
Spring Boot 컨테이너 애플리케이션을 APM으로 모니터링 하는 방법
1. Spring Boot란 무엇인가
Spring Boot는 Java 기반의 오픈소스 프레임워크로 복잡한 설정 없이 빠르게 독립 실행형(Standalone) 애플리케이션을 만들 수 있도록 도와주는 기술입니다.
Spring Framework를 기반으로 하지만 XML 설정이 거의 필요하지 않으며 Tomcat이나 Jetty 같은 내장 서버를 자동으로 구성해 개발자는 즉시 실행 가능한 애플리케이션을 만들 수 있습니다.
특징은 다음과 같습니다.
- 내장 WAS: 별도의 톰캣 설치 없이 실행 가능합니다 (java -jar app.jar)
- 의존성 자동 설정: spring-boot-starter-* 구조로 공통 라이브러리를 자동 관리합니다.
- 프로덕션 지향 설정: Actuator, Metrics, Health Check 기능을 기본 제공합니다.
- 컨테이너 친화적 구조: Dockerfile, Buildpacks 등과 쉽게 통합됩니다.
2. Spring Boot는 누가, 언제, 왜 만들었는가
Spring Boot는 Pivotal Software(현재 VMware Tanzu 소속)에서 2013년에 개발을 시작해 2014년 4월에 1.0 버전을 출시했습니다.
당시 개발 배경은 “Spring Framework는 유연하지만 설정이 너무 복잡하다”는 불만 때문이었습니다.
이에 따라 “개발자가 최소한의 설정으로 즉시 실행 가능한 애플리케이션을 만들 수 있도록 하자”는 목표로 만들어졌습니다.
이 철학은 공식 슬로건으로 요약됩니다.
“Convention over Configuration (관습을 따르는 설정)”
3. 왜 컨테이너 환경에서 Spring Boot를 사용하는가
- 일관된 배포 환경을 제공합니다. 컨테이너에 담으면 어떤 서버에서도 동일하게 실행할 수 있습니다.
- 경량화된 실행 단위로, Spring Boot의 단일 JAR 구조는 이미지 패키징에 적합합니다.
- 클라우드 네이티브 아키텍처에 대응할 수 있습니다. Kubernetes, OpenShift, Rancher 등과 쉽게 연동됩니다.
- 자동 스케일링 및 롤링 업데이트에 유리합니다.
즉, Spring Boot와 컨테이너의 조합은 마이크로서비스 환경에서 Java 진영이 민첩하게 대응할 수 있는 표준 구조입니다.
4. Spring Boot 로 hello world 작성하기
파일 구조
sample_app/
├── Dockerfile
├── docker-compose.yml
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── springboot
│ └── helloworld
│ └── HelloWorldApplication.java
└── resources
└── application.properties
디렉터리 생성
mkdir -p springboot-helloworld/src/main/java/com/springboot/helloworld springboot-helloworld/src/main/resources
pom.xml 작성
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>java21-springboot3.4.4-helloworld</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.4</version>
<relativePath/>
</parent>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
샘플 애플리케이션 작성
- springboot-helloworld/src/main/java/com/springboot/helloworld/HelloWorldApplication.java
package com.springboot.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class HelloWorldApplication {
@GetMapping("/")
public String hello() {
return "Hello, World!";
}
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
application.properties 작성
- src/main/resources/application.properties
server.port=8080
Dockerfile 작성
FROM maven:3.9.9-eclipse-temurin-21 AS builder WORKDIR /workspace COPY pom.xml . COPY src src RUN mvn clean package -DskipTests FROM eclipse-temurin:21-jdk WORKDIR /app COPY --from=builder /workspace/target/*.jar springboot-helloworld.jar ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.yml 작성
- environment에 OPENMARU APM 환경변수 추가
- volumes 절에 OPENMARU APM 설정파일 및 Agent 파일 추가
services:
springboot-app:
image: springboot344
container_name: springboot344
ports:
- "8080:8080"
environment:
JAVA_OPTS: "-Dkhan.config.file=khan-agent.conf -Dfile.encoding=UTF-8 -noverify -javaagent:/opt/khan-agent/khan-agent-5.1.0.jar"
OMAPM_HOST: "IP 주소"
OMAPM_PORT: "80"
OMAPM_TLS: "false"
OMAPM_AGENT_ENABLE: "true"
OMAPM_APPLICATION_NAME: "container_apps"
OMAPM_INSTANCE_ID: "helloworld_app"
restart: unless-stopped
volumes:
- /root/khan-agent/khan-agent.conf:/opt/khan-agent/khan-agent.conf
- /root/khan-agent/khan-agent-5.1.0.jar:/opt/khan-agent/khan-agent-5.1.0.jar
이미지 빌드 및 실행
docker compose build docker compose up -d
확인
docker ps curl http://localhost:8080
출력 결과
Hello, World!
5. APM 연동 화면
위에서 작성한 샘플 애플리케이션인 HelloWorldApplication 을 OPENMARU APM 으로 모니터링 되는 모습을 안내해 드리겠습니다.
연동 확인 알림
- 컨테이너 실행 시 helloworld-app 컨테이너 모니터링이 시작됨을 알립니다.
연동된 컨테이너 정보
OPENMARU APM에서 모니터링 중인 helloworld-app 컨테이너 대시보드
- 개별 항목에 대한 설명을 다룬 문서는 아래 링크를 참조해 주세요.







클라우드 네이티브 무상 컨설팅 – 서울 강서 소재 미디어 커머스 기업
/카테고리: OPENMARU, Seminar, 발표자료/작성자: OM marketingK-AI PaaS Summit 2024 – 오픈마루가 여러분을 초대합니다
/카테고리: OPENMARU, Seminar/작성자: OM marketing찾아가는 클라우드 네이티브 컨설팅 – 서울 영등포구 소재 금융 공공기관
/카테고리: OPENMARU, Seminar/작성자: OM marketing