Spring Boot Admin으로 마이크로서비스 모니터링 시스템 구축하기: 실시간으로 애플리케이션 건강 상태 한눈에 파악하기 🚀

안녕, 개발자 친구들! 🙋♂️ 마이크로서비스 아키텍처를 도입했는데 모니터링이 골치 아프다고? 여러 서비스의 상태를 일일이 확인하느라 시간 낭비하고 있니? 오늘은 그 고민을 한방에 해결해 줄 Spring Boot Admin으로 마이크로서비스 모니터링 시스템을 구축하는 방법을 알려줄게! 코드 한 줄 한 줄 함께 따라오면서 실시간으로 서비스 상태를 한눈에 파악할 수 있는 멋진 대시보드를 만들어보자!
📑 목차
- 마이크로서비스와 모니터링의 중요성
- Spring Boot Admin이란?
- Spring Boot Admin 서버 구축하기
- 클라이언트 애플리케이션 연결하기
- 보안 설정 적용하기
- 알림 시스템 구성하기
- 커스터마이징과 확장
- 실제 운영 환경에서의 모니터링 전략
- 트러블슈팅과 모범 사례
- Spring Boot Admin 3.0 신기능 살펴보기
1. 마이크로서비스와 모니터링의 중요성 🏗️
요즘 개발 트렌드는 모노리틱에서 마이크로서비스로 빠르게 전환되고 있어. 마이크로서비스는 작고 독립적인 서비스들이 API를 통해 통신하면서 하나의 큰 애플리케이션을 구성하는 아키텍처야. 이런 구조는 확장성, 유연성, 개발 속도 측면에서 많은 장점이 있지만, 모니터링이라는 새로운 도전 과제를 가져왔어.
마이크로서비스 모니터링의 도전 과제 🤔
- 수십, 수백 개의 서비스 상태를 개별적으로 확인하기 어려움
- 서비스 간 의존성 파악이 복잡함
- 장애 발생 시 원인 추적이 어려움
- 리소스 사용량 모니터링의 필요성
- 로그 수집 및 분석의 복잡성
이런 도전 과제를 해결하기 위해 통합 모니터링 시스템이 필수적이야. 여러 도구가 있지만, 자바 생태계에서는 Spring Boot Admin이 특히 강력한 솔루션으로 자리 잡고 있어. 2025년 현재, 많은 기업들이 Spring Boot Admin을 활용해 마이크로서비스 모니터링을 효율적으로 관리하고 있지.
위 그림에서 볼 수 있듯이, 마이크로서비스 환경에서는 각 서비스가 독립적으로 동작하면서 API Gateway를 통해 통신해. 그리고 Spring Boot Admin은 이 모든 서비스를 모니터링하는 중앙 허브 역할을 하지. 이제 이 강력한 도구를 어떻게 구축하고 활용할 수 있는지 알아보자!
2. Spring Boot Admin이란? 🧐
Spring Boot Admin은 Codecentric AG에서 개발한 오픈소스 프로젝트로, Spring Boot Actuator 엔드포인트를 활용해 애플리케이션을 모니터링하고 관리할 수 있는 웹 애플리케이션이야. 2025년 3월 기준으로 최신 버전은 3.2.1이 릴리즈되어 있어.
Spring Boot Admin의 주요 기능 ✨
- 헬스 체크: 각 서비스의 상태를 실시간으로 모니터링
- 메트릭 수집: CPU, 메모리 사용량 등 다양한 메트릭 시각화
- 로그 조회: 각 애플리케이션의 로그를 중앙에서 확인
- JVM 상태: 스레드 덤프, 힙 덤프 등 JVM 정보 제공
- 환경 설정: 프로퍼티, 환경 변수 등 설정 정보 조회
- 알림 기능: 서비스 다운 등 이슈 발생 시 이메일, Slack 등으로 알림
- 인스턴스 관리: 애플리케이션 재시작, 종료 등 원격 관리
Spring Boot Admin의 아키텍처는 서버-클라이언트 모델로 구성돼. Admin Server는 모니터링 대시보드를 제공하고, 각 마이크로서비스는 클라이언트로 등록되어 자신의 상태 정보를 서버에 전송하는 구조야.
이 구조의 가장 큰 장점은 중앙 집중식 모니터링이 가능하다는 거야. 수십, 수백 개의 마이크로서비스가 있더라도 하나의 대시보드에서 모든 서비스의 상태를 한눈에 파악할 수 있지. 재능넷과 같은 다양한 서비스를 제공하는 플랫폼에서도 이런 모니터링 시스템이 매우 유용하게 활용될 수 있어. 특히 트래픽이 많은 시간대에 실시간으로 서비스 상태를 모니터링하면서 사용자 경험을 최적화할 수 있지.
Spring Boot Admin vs 다른 모니터링 도구 비교 🔍
Spring Boot Admin: Spring Boot 애플리케이션에 특화된 모니터링 도구로, 설정이 간편하고 Spring 생태계와의 통합이 뛰어남
Prometheus + Grafana: 더 범용적인 모니터링 솔루션으로, 다양한 메트릭 수집과 시각화에 강점이 있지만 설정이 복잡함
ELK Stack: 로그 수집과 분석에 특화되어 있으며, 대규모 시스템에서 로그 기반 모니터링에 적합
Datadog/New Relic: 상용 APM 도구로, 더 많은 기능을 제공하지만 비용이 발생함
다음 섹션에서는 Spring Boot Admin 서버를 직접 구축하는 방법을 알아볼게. 코드 한 줄 한 줄 따라오면서 함께 만들어보자! 🛠️
3. Spring Boot Admin 서버 구축하기 🏗️
이제 본격적으로 Spring Boot Admin 서버를 구축해볼 차례야! 먼저 필요한 의존성과 기본 설정부터 시작해보자.
3.1 프로젝트 생성하기
Spring Initializr(https://start.spring.io/)를 사용해서 프로젝트를 생성할 수 있어. 다음과 같은 설정으로 프로젝트를 만들어보자:
Project: Maven
Language: Java
Spring Boot: 3.2.3 (2025년 3월 기준 최신 안정 버전)
Group: com.example
Artifact: admin-server
Dependencies: Spring Web, Spring Boot Actuator
프로젝트를 다운로드하고 압축을 풀었다면, 이제 Spring Boot Admin 서버 의존성을 추가해야 해. pom.xml
파일에 다음 의존성을 추가해줘:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>3.2.1</version>
</dependency>
3.2 Admin 서버 활성화하기
Spring Boot Admin 서버를 활성화하려면 메인 애플리케이션 클래스에 @EnableAdminServer
애노테이션을 추가해야 해. 다음과 같이 수정해보자:
package com.example.adminserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class, args);
}
}
이제 기본적인 설정은 완료됐어! 하지만 실제 운영 환경에서는 몇 가지 추가 설정이 필요해. application.properties
또는 application.yml
파일에 다음과 같은 설정을 추가해보자:
# application.yml
server:
port: 8080
spring:
application:
name: admin-server
boot:
admin:
ui:
title: 마이크로서비스 모니터링 시스템
brand: <img src="assets/logo.png"><span>모니터링 대시보드</span>
notify:
mail:
enabled: false # 메일 알림 비활성화 (나중에 설정)
management:
endpoints:
web:
exposure:
include: "*" # 모든 Actuator 엔드포인트 노출
endpoint:
health:
show-details: always # 상세 헬스 정보 표시
위 설정에서 management.endpoints.web.exposure.include는 Actuator 엔드포인트를 노출하는 설정이야. 실제 운영 환경에서는 보안을 위해 필요한 엔드포인트만 노출하는 것이 좋아.
3.3 UI 커스터마이징
Spring Boot Admin은 UI를 커스터마이징할 수 있는 다양한 옵션을 제공해. 로고, 색상, 타이틀 등을 변경할 수 있지. 다음은 간단한 커스터마이징 예시야:
# application.yml에 추가
spring:
boot:
admin:
ui:
title: 우리 회사 마이크로서비스 모니터링
brand: 마이크로서비스 대시보드
favicon: favicon.png
favicon-danger: favicon-danger.png
available-languages:
- ko-KR
- en-US
external-views:
- label: "재능넷"
url: https://www.jaenung.net
order: 2000
위 설정에서 external-views는 외부 링크를 Admin UI에 추가하는 기능이야. 재능넷과 같은 서비스 플랫폼을 운영한다면, 모니터링 대시보드에서 바로 서비스 페이지로 이동할 수 있는 링크를 추가하면 편리하지!
위 이미지는 Spring Boot Admin UI의 예시야. 각 서비스의 상태를 직관적으로 확인할 수 있고, 문제가 있는 서비스는 빨간색으로 표시돼. 이렇게 시각적으로 상태를 확인할 수 있어서 문제 발생 시 빠르게 대응할 수 있어.
3.4 서비스 디스커버리 설정
대규모 마이크로서비스 환경에서는 서비스 디스커버리를 통해 자동으로 클라이언트를 등록하는 것이 편리해. Spring Cloud와 함께 사용하면 Eureka, Consul 등의 서비스 디스커버리를 활용할 수 있어. 여기서는 Eureka를 예로 들어볼게.
먼저 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
그리고 application.yml
에 Eureka 설정을 추가해:
spring:
application:
name: admin-server
cloud:
discovery:
client:
simple:
instances:
service1:
- uri: http://service1-host:8081
metadata:
management.context-path: /actuator
service2:
- uri: http://service2-host:8082
metadata:
management.context-path: /actuator
eureka:
client:
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
leaseRenewalIntervalInSeconds: 10
health-check-url-path: /actuator/health
metadata-map:
startup: ${random.int}
management.context-path: /actuator
이제 메인 애플리케이션 클래스에 @EnableDiscoveryClient
애노테이션을 추가해:
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class AdminServerApplication {
// ...
}
이렇게 설정하면 Eureka에 등록된 모든 서비스가 자동으로 Spring Boot Admin에 클라이언트로 등록돼. 서비스가 추가되거나 제거될 때마다 수동으로 설정을 변경할 필요가 없어 관리가 훨씬 편리해져.
💡 Pro Tip
Spring Boot Admin 서버는 별도의 애플리케이션으로 실행하는 것이 좋아. 모니터링 대상 애플리케이션과 분리해서 운영하면 모니터링 대상에 문제가 생겨도 모니터링 시스템은 계속 작동할 수 있어.
이제 기본적인 Spring Boot Admin 서버 설정이 완료됐어! 다음 섹션에서는 클라이언트 애플리케이션을 연결하는 방법을 알아볼게.
4. 클라이언트 애플리케이션 연결하기 🔌
Spring Boot Admin 서버를 구축했다면, 이제 모니터링할 마이크로서비스들을 클라이언트로 연결해야 해. 클라이언트 연결 방법은 크게 두 가지가 있어:
- 직접 등록 방식: 각 클라이언트가 Admin 서버에 직접 등록
- 서비스 디스커버리 방식: Eureka, Consul 등을 통한 자동 등록
4.1 직접 등록 방식
먼저 가장 간단한 직접 등록 방식부터 알아볼게. 모니터링할 Spring Boot 애플리케이션의 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
그리고 application.yml
파일에 다음 설정을 추가해:
spring:
application:
name: user-service # 서비스 이름
boot:
admin:
client:
url: http://admin-server:8080 # Admin 서버 URL
instance:
metadata:
tags:
environment: production # 환경 태그 추가
management:
endpoints:
web:
exposure:
include: "*" # 모든 Actuator 엔드포인트 노출
endpoint:
health:
show-details: always # 상세 헬스 정보 표시
info:
env:
enabled: true # 환경 정보 노출
include: "*" 설정은 모든 Actuator 엔드포인트를 노출하는 설정이야. 실제 운영 환경에서는 보안을 위해 필요한 엔드포인트만 노출하는 것이 좋아. 예를 들면 include: "health,info,metrics"
와 같이 설정할 수 있어.
이제 애플리케이션을 실행하면 자동으로 Admin 서버에 등록되고, 대시보드에서 확인할 수 있어!
4.2 서비스 디스커버리 방식
대규모 마이크로서비스 환경에서는 서비스 디스커버리를 통한 자동 등록 방식이 더 효율적이야. Eureka를 사용하는 예시를 살펴볼게.
클라이언트 애플리케이션의 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
그리고 application.yml
파일에 다음 설정을 추가해:
spring:
application:
name: product-service
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
leaseRenewalIntervalInSeconds: 10
health-check-url-path: /actuator/health
metadata-map:
startup: ${random.int}
management.context-path: /actuator
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
메인 애플리케이션 클래스에 @EnableDiscoveryClient
애노테이션을 추가해:
@SpringBootApplication
@EnableDiscoveryClient
public class ProductServiceApplication {
// ...
}
이 방식의 장점은 새로운 서비스 인스턴스가 추가되거나 제거될 때 자동으로 Admin 서버에 반영된다는 거야. 특히 오토스케일링을 사용하는 환경에서 매우 유용해!
4.3 클라이언트 메타데이터 활용
Spring Boot Admin은 클라이언트의 메타데이터를 활용해 추가 정보를 표시할 수 있어. 메타데이터를 통해 환경, 버전, 담당자 등의 정보를 추가할 수 있지:
eureka:
instance:
metadata-map:
version: @project.version@
team: payment-team
contact: payment-team@example.com
environment: production
region: us-east
이렇게 설정한 메타데이터는 Admin 대시보드에서 확인할 수 있고, 필터링이나 그룹화에도 활용할 수 있어.
⚠️ 주의사항
Actuator 엔드포인트를 노출할 때는 보안에 주의해야 해. 민감한 정보가 노출될 수 있으므로, 프로덕션 환경에서는 반드시 보안 설정을 적용해야 해.
다음 섹션에서는 Spring Boot Admin의 보안 설정에 대해 알아볼게. 모니터링 시스템은 중요한 정보를 다루기 때문에 보안이 매우 중요해!
5. 보안 설정 적용하기 🔒
Spring Boot Admin은 중요한 시스템 정보와 관리 기능을 제공하기 때문에 적절한 보안 설정이 필수야. 이 섹션에서는 Spring Security를 사용해 Admin 서버와 클라이언트의 보안을 설정하는 방법을 알아볼게.
5.1 Admin 서버 보안 설정
먼저 Admin 서버에 Spring Security를 적용해보자. pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
그리고 Security 설정 클래스를 만들어:
package com.example.adminserver.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final AdminServerProperties adminServer;
public SecurityConfig(AdminServerProperties adminServer) {
this.adminServer = adminServer;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler =
new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http
.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(this.adminServer.path("/assets/**")).permitAll()
.requestMatchers(this.adminServer.path("/login")).permitAll()
.anyRequest().authenticated()
)
.formLogin(formLogin ->
formLogin
.loginPage(this.adminServer.path("/login"))
.successHandler(successHandler)
)
.logout(logout -> logout.logoutUrl(this.adminServer.path("/logout")))
.httpBasic(httpBasic -> {})
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers(
this.adminServer.path("/instances"),
this.adminServer.path("/actuator/**")
)
);
return http.build();
}
@Bean
public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.withUsername("admin")
.password(passwordEncoder.encode("admin-password"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위 설정은 Admin 서버에 기본적인 폼 로그인 인증을 적용하고, 정적 리소스와 로그인 페이지는 인증 없이 접근할 수 있도록 허용해. 실제 운영 환경에서는 더 강력한 비밀번호를 사용하고, 가능하면 데이터베이스 기반 사용자 관리나 OAuth2와 같은 더 안전한 인증 방식을 사용하는 것이 좋아.
5.2 클라이언트-서버 간 보안 통신
Admin 서버에 보안을 적용했다면, 클라이언트도 이에 맞게 설정해야 해. 클라이언트 애플리케이션의 application.yml
에 다음 설정을 추가해:
spring:
boot:
admin:
client:
url: http://admin-server:8080
username: admin
password: admin-password
instance:
metadata:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
이 설정은 클라이언트가 Admin 서버에 등록할 때 인증 정보를 제공하도록 해. 또한 Admin 서버가 클라이언트의 Actuator 엔드포인트에 접근할 때 필요한 인증 정보도 메타데이터로 제공해.
5.3 HTTPS 적용
프로덕션 환경에서는 HTTPS를 사용하는 것이 필수야. Spring Boot에서 HTTPS를 적용하는 방법을 알아보자.
먼저 키스토어를 생성해:
keytool -genkeypair -alias adminserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore adminserver.p12 -validity 3650
그리고 application.yml
에 다음 설정을 추가해:
server:
port: 8443
ssl:
key-store: classpath:adminserver.p12
key-store-password: your-password
key-store-type: PKCS12
key-alias: adminserver
이제 Admin 서버는 HTTPS로 통신하게 돼. 클라이언트 설정도 HTTPS URL로 업데이트해야 해:
spring:
boot:
admin:
client:
url: https://admin-server:8443
username: admin
password: admin-password
💡 Pro Tip
실제 운영 환경에서는 자체 서명된 인증서보다는 신뢰할 수 있는 CA에서 발급받은 인증서를 사용하는 것이 좋아. Let's Encrypt와 같은 무료 CA를 활용할 수 있어.
5.4 IP 기반 접근 제한
추가적인 보안 계층으로 IP 기반 접근 제한을 적용할 수 있어. 특정 IP 또는 IP 범위에서만 Admin 서버에 접근할 수 있도록 설정할 수 있지:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// ... 기존 설정 ...
http.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(this.adminServer.path("/assets/**")).permitAll()
.requestMatchers(this.adminServer.path("/login")).permitAll()
.requestMatchers(this.adminServer.path("/**"))
.hasIpAddress("192.168.1.0/24") // 내부 네트워크 IP 범위
.anyRequest().authenticated()
);
// ... 나머지 설정 ...
return http.build();
}
이 설정은 내부 네트워크 IP 범위(192.168.1.0/24)에서만 Admin 서버에 접근할 수 있도록 제한해. 클라우드 환경에서는 VPC나 네트워크 보안 그룹을 통해 비슷한 제한을 적용할 수 있어.
보안은 끊임없이 개선해야 하는 영역이야. 정기적으로 보안 설정을 검토하고 업데이트하는 것이 중요해. 다음 섹션에서는 알림 시스템을 구성하는 방법을 알아볼게!
6. 알림 시스템 구성하기 🔔
모니터링 시스템의 핵심 기능 중 하나는 문제 발생 시 즉시 알림을 보내는 것이야. Spring Boot Admin은 다양한 알림 채널을 지원해. 이메일, Slack, Microsoft Teams, Telegram 등 여러 채널로 알림을 보낼 수 있어.
6.1 이메일 알림 설정
가장 기본적인 알림 방식인 이메일 알림부터 설정해보자. Admin 서버의 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
그리고 application.yml
에 다음 설정을 추가해:
spring:
mail:
host: smtp.gmail.com
port: 587
username: your-email@gmail.com
password: your-app-password
properties:
mail:
smtp:
auth: true
starttls:
enable: true
boot:
admin:
notify:
mail:
enabled: true
to: alerts@example.com
cc: team-leads@example.com
from: spring-boot-admin@example.com
template: classpath:/templates/email.html # 커스텀 템플릿 (선택사항)
Gmail을 사용할 경우 앱 비밀번호를 생성해서 사용해야 해. 2단계 인증을 활성화하고, 앱 비밀번호를 생성한 후 password
필드에 입력하면 돼.
6.2 Slack 알림 설정
요즘 많은 개발팀이 Slack을 사용하고 있어. Slack으로 알림을 받으려면 다음과 같이 설정해:
spring:
boot:
admin:
notify:
slack:
enabled: true
webhook-url: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
channel: '#monitoring'
icon: ':warning:'
message: '*#{instance.registration.name}* (#{instance.id}) is *#{event.statusInfo.status}*'
Slack 알림을 설정하려면 먼저 Slack 워크스페이스에서 Incoming Webhook을 생성해야 해. Slack 앱 디렉토리에서 "Incoming Webhooks" 앱을 추가하고, 채널을 선택한 후 웹훅 URL을 생성하면 돼.
6.3 Microsoft Teams 알림 설정
Microsoft Teams를 사용하는 조직이라면 다음과 같이 설정할 수 있어:
spring:
boot:
admin:
notify:
ms-teams:
enabled: true
webhook-url: https://outlook.office.com/webhook/...
title: "Status changed"
theme-color: "#ff0000" # 상태에 따라 색상 변경 가능
Microsoft Teams에서도 Incoming Webhook을 생성해야 해. 채널 설정에서 "커넥터"를 선택하고 "Incoming Webhook"을 추가한 후 웹훅 URL을 생성하면 돼.
6.4 Telegram 알림 설정
Telegram으로 알림을 받고 싶다면 다음과 같이 설정해:
spring:
boot:
admin:
notify:
telegram:
enabled: true
auth-token: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
chat-id: -0123456789
Telegram 알림을 설정하려면 BotFather를 통해 봇을 생성하고 토큰을 받아야 해. 그리고 봇을 그룹에 추가한 후 채팅 ID를 확인해야 해.
6.5 알림 트리거 조건 설정
모든 상태 변경에 대해 알림을 받으면 너무 많은 알림이 발생할 수 있어. 특정 조건에서만 알림을 받도록 설정할 수 있어:
spring:
boot:
admin:
notify:
mail:
enabled: true
to: alerts@example.com
trigger:
status-changed:
status: DOWN # DOWN 상태로 변경될 때만 알림
slack:
enabled: true
webhook-url: https://hooks.slack.com/services/...
trigger:
status-changed:
status: DOWN,OFFLINE,UNKNOWN # 여러 상태 지정 가능
이 설정은 서비스가 DOWN 상태로 변경될 때만 이메일 알림을 보내고, DOWN, OFFLINE, UNKNOWN 상태로 변경될 때 Slack 알림을 보내도록 설정한 거야.
6.6 알림 그룹화 및 필터링
대규모 시스템에서는 알림이 너무 많이 발생할 수 있어. 알림을 그룹화하거나 필터링하는 것이 중요해:
spring:
boot:
admin:
notify:
mail:
enabled: true
to: alerts@example.com
# 알림 그룹화 설정
group-frequency: 10000 # 10초 동안 발생한 알림을 그룹화
ignore-changes:
- "UNKNOWN:UP" # UNKNOWN에서 UP으로 변경되는 알림은 무시
이 설정은 10초 동안 발생한 알림을 그룹화해서 한 번에 보내고, UNKNOWN에서 UP으로 상태가 변경될 때는 알림을 보내지 않도록 설정한 거야.
💡 Pro Tip
알림 피로(Alert Fatigue)는 너무 많은 알림으로 인해 중요한 알림을 놓치게 되는 현상이야. 정말 중요한 이벤트에 대해서만 알림을 설정하고, 가능하면 알림을 그룹화하는 것이 좋아.
효과적인 알림 시스템은 모니터링의 핵심이야. 적절한 알림 설정으로 문제가 발생했을 때 빠르게 대응할 수 있어. 다음 섹션에서는 Spring Boot Admin을 커스터마이징하고 확장하는 방법을 알아볼게!
7. 커스터마이징과 확장 🛠️
Spring Boot Admin은 다양한 방식으로 커스터마이징하고 확장할 수 있어. 기본 UI를 변경하거나, 새로운 기능을 추가하거나, 기존 기능을 확장할 수 있지. 이 섹션에서는 Spring Boot Admin을 커스터마이징하는 다양한 방법을 알아볼게.
7.1 UI 커스터마이징
Spring Boot Admin의 UI는 Vue.js로 구현되어 있어. 로고, 색상, 타이틀 등을 변경할 수 있어:
spring:
boot:
admin:
ui:
title: 재능넷 마이크로서비스 모니터링
brand: <img src="assets/logo.png"><span>재능넷 모니터링</span>
favicon: "assets/favicon.png"
favicon-danger: "assets/favicon-danger.png"
login-icon: "assets/login-icon.svg"
remember-me-enabled: true
available-languages:
- ko-KR
- en-US
external-views:
- label: "재능넷"
url: https://www.jaenung.net
order: 1000
- label: "API 문서"
url: https://api-docs.example.com
order: 2000
로고나 아이콘을 변경하려면 src/main/resources/static/assets/
디렉토리에 이미지 파일을 추가하면 돼. external-views 설정을 통해 외부 링크를 추가할 수도 있어.
7.2 CSS 커스터마이징
CSS를 커스터마이징해서 UI의 스타일을 변경할 수 있어. src/main/resources/static/css/custom.css
파일을 생성하고 다음과 같이 설정해:
spring:
boot:
admin:
ui:
css:
- "assets/css/custom.css"
custom.css
파일에는 다음과 같이 스타일을 정의할 수 있어:
/* custom.css */
:root {
--primary-color: #4CAF50;
--secondary-color: #2196F3;
--success-color: #8BC34A;
--danger-color: #F44336;
--warning-color: #FFC107;
}
.navbar {
background-color: var(--primary-color) !important;
}
.sidebar {
background-color: #f5f5f5 !important;
}
.instance-status-UP {
background-color: var(--success-color) !important;
}
.instance-status-DOWN {
background-color: var(--danger-color) !important;
}
이렇게 하면 UI의 색상과 스타일을 회사 브랜드에 맞게 변경할 수 있어. 재능넷의 브랜드 색상과 로고를 적용하면 더 일관된 사용자 경험을 제공할 수 있지!
7.3 커스텀 엔드포인트 추가
Spring Boot Admin은 기본적으로 Spring Boot Actuator의 엔드포인트를 사용해. 하지만 커스텀 엔드포인트를 추가해서 더 많은 정보를 제공할 수 있어:
@RestController
@Endpoint(id = "custom")
public class CustomEndpoint {
@ReadOperation
public Map<string object> customInfo() {
Map<string object> info = new HashMap<>();
info.put("version", "1.0.0");
info.put("buildTime", LocalDateTime.now().toString());
info.put("environment", "production");
info.put("team", "backend-team");
return info;
}
}</string></string>
이 엔드포인트를 활성화하려면 application.yml
에 다음 설정을 추가해:
management:
endpoints:
web:
exposure:
include: "*,custom"
endpoint:
custom:
enabled: true
이제 Admin 대시보드에서 커스텀 엔드포인트의 정보를 확인할 수 있어!
7.4 커스텀 알림 채널 구현
Spring Boot Admin은 다양한 알림 채널을 지원하지만, 필요하다면 커스텀 알림 채널을 구현할 수도 있어:
@Component
public class CustomNotifier extends AbstractStatusChangeNotifier {
private final Logger logger = LoggerFactory.getLogger(CustomNotifier.class);
public CustomNotifier(InstanceRepository repository, NotifierProperties properties) {
super(repository, properties);
}
@Override
protected Mono<void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent statusChangedEvent) {
logger.info("Instance {} ({}) changed status from {} to {}",
instance.getRegistration().getName(),
instance.getId(),
statusChangedEvent.getStatusInfo().getStatus(),
statusChangedEvent.getStatusInfo().getStatus());
// 여기에 커스텀 알림 로직 구현
// 예: 사내 메시징 시스템, SMS, 음성 알림 등
}
});
}
}</void>
이 커스텀 알림 채널을 활성화하려면 application.yml
에 다음 설정을 추가해:
spring:
boot:
admin:
notify:
custom:
enabled: true
7.5 대시보드 확장
Spring Boot Admin 3.0부터는 대시보드를 확장할 수 있는 기능이 추가됐어. 커스텀 카드나 위젯을 추가할 수 있지:
@Configuration
public class UiConfig {
@Bean
public CustomUiExtension customUiExtension() {
return new CustomUiExtension();
}
public static class CustomUiExtension implements UiExtension {
@Override
public String getResourcePath() {
return "classpath:/META-INF/spring-boot-admin-server-ui/extensions/custom/";
}
@Override
public String getExtensionName() {
return "custom";
}
}
}
그리고 src/main/resources/META-INF/spring-boot-admin-server-ui/extensions/custom/
디렉토리에 Vue.js 컴포넌트를 추가하면 돼. 이 기능을 활용하면 비즈니스에 특화된 모니터링 위젯을 추가할 수 있어!
커스텀 대시보드 예시: 트래픽 모니터링
재능넷과 같은 플랫폼에서는 실시간 트래픽 모니터링이 중요해. 다음과 같은 커스텀 위젯을 추가할 수 있어:
- 시간대별 API 호출 수 그래프
- 서비스별 응답 시간 비교
- 사용자 활동 히트맵
- 오류 발생 빈도 차트
이런 위젯을 통해 서비스 성능을 더 직관적으로 모니터링하고, 사용자 경험을 개선하는 데 도움이 될 수 있어!
Spring Boot Admin의 커스터마이징과 확장 기능을 활용하면 팀의 요구사항에 맞는 맞춤형 모니터링 시스템을 구축할 수 있어. 다음 섹션에서는 실제 운영 환경에서의 모니터링 전략에 대해 알아볼게!
8. 실제 운영 환경에서의 모니터링 전략 📊
Spring Boot Admin을 구축했다면, 이제 실제 운영 환경에서 효과적으로 활용하기 위한 전략이 필요해. 이 섹션에서는 마이크로서비스 환경에서의 모니터링 전략과 모범 사례를 알아볼게.
8.1 다층 모니터링 접근법
효과적인 모니터링을 위해서는 다층 모니터링 접근법이 필요해. 다음과 같은 계층으로 나눠서 모니터링할 수 있어:
- 인프라 모니터링: 서버, 네트워크, 스토리지 등의 하드웨어 자원
- 플랫폼 모니터링: 쿠버네티스, Docker, 데이터베이스 등의 플랫폼
- 애플리케이션 모니터링: Spring Boot Admin이 담당하는 영역
- 비즈니스 모니터링: 비즈니스 KPI, 사용자 경험 등
Spring Boot Admin은 주로 애플리케이션 계층에 집중하지만, 다른 모니터링 도구와 함께 사용하면 더 포괄적인 모니터링 시스템을 구축할 수 있어.
8.2 핵심 성능 지표(KPI) 모니터링
효과적인 모니터링을 위해서는 핵심 성능 지표(KPI)를 정의하고 모니터링해야 해. 마이크로서비스 환경에서 중요한 KPI는 다음과 같아:
마이크로서비스 핵심 성능 지표(KPI)
- 가용성(Availability): 서비스의 업타임 비율
- 응답 시간(Response Time): 요청에 대한 응답 시간
- 처리량(Throughput): 초당 처리할 수 있는 요청 수
- 오류율(Error Rate): 전체 요청 중 오류 발생 비율
- 포화도(Saturation): 리소스 사용량(CPU, 메모리 등)
- SLA 준수율: 서비스 수준 계약 준수 비율
Spring Boot Admin에서는 이러한 KPI를 모니터링하기 위해 Actuator 엔드포인트를 활용할 수 있어. 특히 /metrics
엔드포인트는 다양한 메트릭을 제공해.
8.3 로그 집계 및 분석
마이크로서비스 환경에서는 로그 집계 및 분석이 중요해. 여러 서비스에서 생성되는 로그를 중앙에서 수집하고 분석해야 해. Spring Boot Admin은 기본적인 로그 조회 기능을 제공하지만, 대규모 환경에서는 ELK 스택(Elasticsearch, Logstash, Kibana)과 같은 전용 로그 분석 도구와 함께 사용하는 것이 좋아.
# logback-spring.xml 설정 예시
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>logstash-host:5000</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdc>true</includeMdc>
<customFields>{"app_name":"${spring.application.name}"}</customFields>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
이 설정은 로그를 Logstash로 전송하고, 애플리케이션 이름을 포함시켜 어떤 서비스에서 생성된 로그인지 쉽게 식별할 수 있도록 해.
8.4 분산 추적
마이크로서비스 환경에서는 분산 추적(Distributed Tracing)이 중요해. 하나의 요청이 여러 서비스를 거치면서 어디서 지연이 발생하는지, 어떤 서비스에서 오류가 발생하는지 추적해야 해. Spring Cloud Sleuth와 Zipkin을 사용해 분산 추적을 구현할 수 있어:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
그리고 application.yml
에 다음 설정을 추가해:
spring:
sleuth:
sampler:
probability: 1.0 # 모든 요청 추적 (프로덕션에서는 낮은 값 사용)
zipkin:
base-url: http://zipkin-server:9411
이렇게 설정하면 모든 서비스에서 생성되는 추적 정보가 Zipkin 서버로 전송되고, 요청의 흐름을 시각적으로 확인할 수 있어.
8.5 자동화된 대응
모니터링의 궁극적인 목표는 문제를 감지하고 해결하는 것이야. 자동화된 대응 시스템을 구축하면 문제가 발생했을 때 자동으로 조치를 취할 수 있어:
- 자동 스케일링: 부하가 증가하면 자동으로 인스턴스 추가
- 자동 재시작: 서비스가 응답하지 않으면 자동으로 재시작
- 서킷 브레이커: 의존성 있는 서비스가 실패하면 대체 로직 실행
- 롤백: 배포 후 오류율이 증가하면 자동으로 이전 버전으로 롤백
Spring Boot Admin의 Actuator 엔드포인트를 활용해 이러한 자동화된 대응을 구현할 수 있어. 예를 들어, /actuator/restart
엔드포인트를 호출해 서비스를 재시작할 수 있지.
💡 Pro Tip
재능넷과 같은 플랫폼에서는 사용자 경험이 매우 중요해. 모니터링 시스템을 통해 성능 이슈를 사전에 감지하고 해결함으로써 사용자 만족도를 높일 수 있어. 특히 결제나 사용자 인증과 같은 핵심 서비스의 모니터링에 더 많은 리소스를 투자하는 것이 좋아!
효과적인 모니터링 전략은 단순히 도구를 설치하는 것을 넘어, 비즈니스 요구사항과 기술적 특성을 고려한 종합적인 접근이 필요해. 다음 섹션에서는 Spring Boot Admin을 사용하면서 발생할 수 있는 문제와 해결 방법을 알아볼게!
9. 트러블슈팅과 모범 사례 🔧
Spring Boot Admin을 운영하다 보면 다양한 문제가 발생할 수 있어. 이 섹션에서는 자주 발생하는 문제와 해결 방법, 그리고 모범 사례를 알아볼게.
9.1 클라이언트 연결 문제
가장 흔한 문제 중 하나는 클라이언트가 Admin 서버에 연결되지 않는 문제야. 다음과 같은 원인과 해결 방법이 있어:
클라이언트 연결 문제 해결
-
문제: Admin 서버 URL이 잘못 설정됨
해결:spring.boot.admin.client.url
설정을 확인하고 올바른 URL로 수정 -
문제: Actuator 엔드포인트가 노출되지 않음
해결:management.endpoints.web.exposure.include
설정을 확인하고 필요한 엔드포인트 노출 -
문제: 보안 설정으로 인한 접근 제한
해결: 클라이언트와 서버의 보안 설정을 확인하고, 인증 정보가 올바르게 설정되었는지 확인 -
문제: 네트워크 연결 문제
해결: 방화벽 설정을 확인하고, 클라이언트와 서버 간 네트워크 연결이 가능한지 확인 -
문제: 서비스 디스커버리 설정 오류
해결: Eureka나 Consul 같은 서비스 디스커버리 설정을 확인하고 올바르게 설정
문제 해결을 위해 로그를 확인하는 것이 중요해. Admin 서버와 클라이언트 모두 디버그 로그를 활성화하면 더 자세한 정보를 얻을 수 있어:
logging:
level:
de.codecentric.boot.admin: DEBUG
org.springframework.web: DEBUG
9.2 메모리 사용량 최적화
Spring Boot Admin은 클라이언트 정보를 메모리에 저장해. 클라이언트가 많아지면 메모리 사용량이 증가할 수 있어. 다음과 같은 방법으로 메모리 사용량을 최적화할 수 있어:
- 메트릭 수집 간격 조정:
spring.boot.admin.monitor.period
설정을 통해 메트릭 수집 간격을 늘려 부하 감소 - 불필요한 엔드포인트 비활성화: 필요한 엔드포인트만 노출해 데이터 양 감소
- JVM 옵션 최적화: Admin 서버의 JVM 힙 크기를 적절하게 설정
- 데이터 보관 기간 설정:
spring.boot.admin.monitor.status-lifetime
설정을 통해 데이터 보관 기간 제한
spring:
boot:
admin:
monitor:
period: 15000 # 15초마다 메트릭 수집 (기본값: 10000)
status-lifetime: 30000 # 30초 동안 상태 정보 보관 (기본값: 10000)
9.3 보안 모범 사례
Spring Boot Admin은 중요한 시스템 정보에 접근할 수 있기 때문에 보안이 매우 중요해. 다음과 같은 보안 모범 사례를 따르는 것이 좋아:
- 강력한 인증 적용: 기본 인증 대신 OAuth2나 LDAP 같은 강력한 인증 방식 사용
- HTTPS 사용: 모든 통신은 HTTPS를 통해 암호화
- 최소 권한 원칙: 필요한 엔드포인트만 노출하고, 필요한 권한만 부여
- 네트워크 분리: Admin 서버를 내부 네트워크에 배치하고, 외부에서 직접 접근 불가능하도록 설정
- 정기적인 보안 감사: 로그를 모니터링하고 비정상적인 접근 패턴 확인
9.4 고가용성 설정
모니터링 시스템은 항상 가용해야 해. Admin 서버가 다운되면 모니터링이 불가능해져. 다음과 같은 방법으로 고가용성을 확보할 수 있어:
- 다중 인스턴스 배포: Admin 서버를 여러 인스턴스로 배포하고 로드 밸런서 사용
- 데이터 지속성: 인스턴스 정보를 데이터베이스에 저장해 인스턴스 재시작 시에도 정보 유지
- 장애 복구 자동화: 헬스 체크를 통해 Admin 서버 장애 시 자동으로 복구
- 백업 모니터링 시스템: 다른 모니터링 도구와 함께 사용해 이중화
Spring Boot Admin의 데이터를 데이터베이스에 저장하려면 다음과 같이 설정할 수 있어:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
@Bean
public InstanceRepository instanceRepository(InstanceRepository delegate, DataSource dataSource) {
return new JdbcInstanceRepository(delegate, dataSource);
}
9.5 성능 모니터링 팁
Spring Boot Admin 자체의 성능도 모니터링해야 해. 다음과 같은 팁을 활용할 수 있어:
- Admin 서버 메트릭 모니터링: Admin 서버 자체도 Actuator를 활성화해 모니터링
- JVM 튜닝: GC 로그를 활성화하고 메모리 사용량 모니터링
- 부하 테스트: 많은 클라이언트를 연결했을 때 성능 테스트
- 리소스 사용량 제한: CPU와 메모리 제한을 설정해 과도한 리소스 사용 방지
⚠️ 주의사항
모니터링 시스템이 너무 많은 리소스를 사용하면 오히려 모니터링 대상 시스템의 성능에 영향을 줄 수 있어. 모니터링의 부하를 최소화하고, 필요한 정보만 수집하는 것이 중요해.
Spring Boot Admin을 효과적으로 운영하기 위해서는 지속적인 모니터링과 최적화가 필요해. 문제가 발생했을 때 빠르게 대응할 수 있도록 준비하는 것이 중요해. 다음 섹션에서는 Spring Boot Admin 3.0의 새로운 기능을 알아볼게!
10. Spring Boot Admin 3.0 신기능 살펴보기 🎉
Spring Boot Admin 3.0은 2023년에 출시되었고, 2025년 3월 현재 3.2.1 버전까지 릴리즈됐어. 이 섹션에서는 Spring Boot Admin 3.0의 주요 신기능과 개선사항을 알아볼게.
10.1 UI 개선
Spring Boot Admin 3.0에서는 UI가 완전히 새롭게 디자인됐어. 모던하고 직관적인 인터페이스로 개선되었고, 다크 모드도 지원해:
- 반응형 디자인: 모바일 기기에서도 편리하게 사용 가능
- 다크 모드: 눈의 피로를 줄이고 야간 작업에 적합
- 개선된 대시보드: 더 많은 정보를 한눈에 확인 가능
- 커스터마이징 옵션: 더 다양한 UI 커스터마이징 옵션 제공
spring:
boot:
admin:
ui:
theme: dark # 다크 모드 활성화
brand: "재능넷 모니터링"
title: "마이크로서비스 모니터링"
favicon: "assets/favicon.png"
view-settings:
# 대시보드에 표시할 정보 설정
dashboard-order:
- "instances"
- "journal"
- "wallboard"
10.2 향상된 메트릭 시각화
Spring Boot Admin 3.0에서는 메트릭 시각화 기능이 크게 향상됐어. 더 다양한 차트와 그래프를 제공하고, 커스텀 대시보드를 구성할 수 있어:
- 실시간 차트: 메트릭 데이터를 실시간으로 시각화
- 히스토그램: 분포 데이터를 더 직관적으로 표현
- 히트맵: 복잡한 데이터 패턴을 시각적으로 표현
- 커스텀 대시보드: 필요한 메트릭만 모아서 볼 수 있는 기능
Spring Boot 3.0의 Micrometer 통합을 통해 더 풍부한 메트릭 데이터를 수집하고 시각화할 수 있어.
10.3 확장된 알림 옵션
Spring Boot Admin 3.0에서는 알림 시스템이 더욱 강화됐어. 더 다양한 알림 채널과 세밀한 알림 설정이 가능해:
- Discord 알림: Discord 채널로 알림 전송 지원
- Google Chat 알림: Google Chat으로 알림 전송 지원
- PagerDuty 통합: PagerDuty와 통합해 온콜 알림 지원
- 알림 템플릿 커스터마이징: 알림 메시지 형식을 자유롭게 커스터마이징
spring:
boot:
admin:
notify:
discord:
enabled: true
webhook-url: https://discord.com/api/webhooks/...
message: "서비스 상태 변경: #{instance.registration.name} (#{instance.id})가 #{event.statusInfo.status} 상태로 변경되었습니다."
googlechat:
enabled: true
webhook-url: https://chat.googleapis.com/v1/spaces/...
10.4 보안 강화
Spring Boot Admin 3.0에서는 보안 기능이 강화됐어. OAuth2와의 통합이 개선되고, 더 세밀한 접근 제어가 가능해:
- OAuth2 통합 개선: 최신 OAuth2 표준 지원 및 통합 개선
- RBAC 지원: 역할 기반 접근 제어로 더 세밀한 권한 관리
- CSRF 보호 강화: 더 강력한 CSRF 보호 메커니즘
- 보안 헤더 개선: 보안 관련 HTTP 헤더 자동 설정
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(this.adminServer.path("/assets/**")).permitAll()
.requestMatchers(this.adminServer.path("/login")).permitAll()
.requestMatchers(this.adminServer.path("/instances")).hasRole("ADMIN")
.requestMatchers(this.adminServer.path("/actuator/**")).hasRole("ACTUATOR_ADMIN")
.anyRequest().authenticated()
)
// 나머지 설정...
return http.build();
}
10.5 Spring Boot 3.0 통합
Spring Boot Admin 3.0은 Spring Boot 3.0과 완벽하게 통합돼. Spring Boot 3.0의 새로운 기능을 모두 활용할 수 있어:
- Jakarta EE 9+ 지원: Java EE에서 Jakarta EE로의 전환 지원
- GraalVM 네이티브 이미지 지원: 더 빠른 시작 시간과 낮은 메모리 사용량
- Observability 통합: Micrometer Tracing과의 통합으로 더 나은 관찰성 제공
- Virtual Thread 지원: Java 19+의 Virtual Thread 지원으로 성능 향상
Spring Boot 3.0의 새로운 Actuator 엔드포인트와 메트릭도 모두 지원해. 특히 Observability 기능이 강화되어 분산 추적과 메트릭 수집이 더욱 편리해졌어.
10.6 성능 개선
Spring Boot Admin 3.0에서는 전반적인 성능이 개선됐어. 더 적은 리소스로 더 많은 클라이언트를 모니터링할 수 있어:
- 메모리 사용량 최적화: 더 효율적인 메모리 사용으로 대규모 환경 지원
- 비동기 처리 개선: 리액티브 프로그래밍 모델 적용으로 성능 향상
- 캐싱 메커니즘 개선: 더 효율적인 캐싱으로 응답 시간 단축
- 데이터베이스 저장 최적화: 인스턴스 정보 저장 방식 개선
이러한 성능 개선으로 대규모 마이크로서비스 환경에서도 Spring Boot Admin을 효율적으로 운영할 수 있어.
마치며
지금까지 Spring Boot Admin을 활용한 마이크로서비스 모니터링 시스템 구축에 대해 알아봤어. 기본 설정부터 고급 기능까지 다양한 내용을 다뤘지.
마이크로서비스 아키텍처는 많은 장점이 있지만, 효과적인 모니터링 없이는 그 장점을 제대로 활용하기 어려워. Spring Boot Admin은 Spring Boot 기반 마이크로서비스를 위한 강력한 모니터링 솔루션을 제공해.
재능넷과 같은 플랫폼에서도 이러한 모니터링 시스템을 구축하면 서비스 안정성을 높이고 사용자 경험을 개선하는 데 큰 도움이 될 거야. 특히 다양한 재능을 거래하는 플랫폼에서는 서비스 안정성이 매우 중요하니까!
Spring Boot Admin을 시작으로 모니터링 시스템을 구축하고, 점진적으로 개선해 나가길 바라! 🚀
참고 자료
- Spring Boot Admin 공식 문서: https://codecentric.github.io/spring-boot-admin/
- Spring Boot Actuator 문서: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html
- Spring Security 문서: https://docs.spring.io/spring-security/reference/index.html
- 마이크로서비스 모니터링 전략: https://microservices.io/patterns/observability/application-metrics.html
- Spring Cloud 문서: https://spring.io/projects/spring-cloud
1. 마이크로서비스와 모니터링의 중요성 🏗️
요즘 개발 트렌드는 모노리틱에서 마이크로서비스로 빠르게 전환되고 있어. 마이크로서비스는 작고 독립적인 서비스들이 API를 통해 통신하면서 하나의 큰 애플리케이션을 구성하는 아키텍처야. 이런 구조는 확장성, 유연성, 개발 속도 측면에서 많은 장점이 있지만, 모니터링이라는 새로운 도전 과제를 가져왔어.
마이크로서비스 모니터링의 도전 과제 🤔
- 수십, 수백 개의 서비스 상태를 개별적으로 확인하기 어려움
- 서비스 간 의존성 파악이 복잡함
- 장애 발생 시 원인 추적이 어려움
- 리소스 사용량 모니터링의 필요성
- 로그 수집 및 분석의 복잡성
이런 도전 과제를 해결하기 위해 통합 모니터링 시스템이 필수적이야. 여러 도구가 있지만, 자바 생태계에서는 Spring Boot Admin이 특히 강력한 솔루션으로 자리 잡고 있어. 2025년 현재, 많은 기업들이 Spring Boot Admin을 활용해 마이크로서비스 모니터링을 효율적으로 관리하고 있지.
위 그림에서 볼 수 있듯이, 마이크로서비스 환경에서는 각 서비스가 독립적으로 동작하면서 API Gateway를 통해 통신해. 그리고 Spring Boot Admin은 이 모든 서비스를 모니터링하는 중앙 허브 역할을 하지. 이제 이 강력한 도구를 어떻게 구축하고 활용할 수 있는지 알아보자!
2. Spring Boot Admin이란? 🧐
Spring Boot Admin은 Codecentric AG에서 개발한 오픈소스 프로젝트로, Spring Boot Actuator 엔드포인트를 활용해 애플리케이션을 모니터링하고 관리할 수 있는 웹 애플리케이션이야. 2025년 3월 기준으로 최신 버전은 3.2.1이 릴리즈되어 있어.
Spring Boot Admin의 주요 기능 ✨
- 헬스 체크: 각 서비스의 상태를 실시간으로 모니터링
- 메트릭 수집: CPU, 메모리 사용량 등 다양한 메트릭 시각화
- 로그 조회: 각 애플리케이션의 로그를 중앙에서 확인
- JVM 상태: 스레드 덤프, 힙 덤프 등 JVM 정보 제공
- 환경 설정: 프로퍼티, 환경 변수 등 설정 정보 조회
- 알림 기능: 서비스 다운 등 이슈 발생 시 이메일, Slack 등으로 알림
- 인스턴스 관리: 애플리케이션 재시작, 종료 등 원격 관리
Spring Boot Admin의 아키텍처는 서버-클라이언트 모델로 구성돼. Admin Server는 모니터링 대시보드를 제공하고, 각 마이크로서비스는 클라이언트로 등록되어 자신의 상태 정보를 서버에 전송하는 구조야.
이 구조의 가장 큰 장점은 중앙 집중식 모니터링이 가능하다는 거야. 수십, 수백 개의 마이크로서비스가 있더라도 하나의 대시보드에서 모든 서비스의 상태를 한눈에 파악할 수 있지. 재능넷과 같은 다양한 서비스를 제공하는 플랫폼에서도 이런 모니터링 시스템이 매우 유용하게 활용될 수 있어. 특히 트래픽이 많은 시간대에 실시간으로 서비스 상태를 모니터링하면서 사용자 경험을 최적화할 수 있지.
Spring Boot Admin vs 다른 모니터링 도구 비교 🔍
Spring Boot Admin: Spring Boot 애플리케이션에 특화된 모니터링 도구로, 설정이 간편하고 Spring 생태계와의 통합이 뛰어남
Prometheus + Grafana: 더 범용적인 모니터링 솔루션으로, 다양한 메트릭 수집과 시각화에 강점이 있지만 설정이 복잡함
ELK Stack: 로그 수집과 분석에 특화되어 있으며, 대규모 시스템에서 로그 기반 모니터링에 적합
Datadog/New Relic: 상용 APM 도구로, 더 많은 기능을 제공하지만 비용이 발생함
다음 섹션에서는 Spring Boot Admin 서버를 직접 구축하는 방법을 알아볼게. 코드 한 줄 한 줄 따라오면서 함께 만들어보자! 🛠️
3. Spring Boot Admin 서버 구축하기 🏗️
이제 본격적으로 Spring Boot Admin 서버를 구축해볼 차례야! 먼저 필요한 의존성과 기본 설정부터 시작해보자.
3.1 프로젝트 생성하기
Spring Initializr(https://start.spring.io/)를 사용해서 프로젝트를 생성할 수 있어. 다음과 같은 설정으로 프로젝트를 만들어보자:
Project: Maven
Language: Java
Spring Boot: 3.2.3 (2025년 3월 기준 최신 안정 버전)
Group: com.example
Artifact: admin-server
Dependencies: Spring Web, Spring Boot Actuator
프로젝트를 다운로드하고 압축을 풀었다면, 이제 Spring Boot Admin 서버 의존성을 추가해야 해. pom.xml
파일에 다음 의존성을 추가해줘:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>3.2.1</version>
</dependency>
3.2 Admin 서버 활성화하기
Spring Boot Admin 서버를 활성화하려면 메인 애플리케이션 클래스에 @EnableAdminServer
애노테이션을 추가해야 해. 다음과 같이 수정해보자:
package com.example.adminserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class, args);
}
}
이제 기본적인 설정은 완료됐어! 하지만 실제 운영 환경에서는 몇 가지 추가 설정이 필요해. application.properties
또는 application.yml
파일에 다음과 같은 설정을 추가해보자:
# application.yml
server:
port: 8080
spring:
application:
name: admin-server
boot:
admin:
ui:
title: 마이크로서비스 모니터링 시스템
brand: <img src="assets/logo.png"><span>모니터링 대시보드</span>
notify:
mail:
enabled: false # 메일 알림 비활성화 (나중에 설정)
management:
endpoints:
web:
exposure:
include: "*" # 모든 Actuator 엔드포인트 노출
endpoint:
health:
show-details: always # 상세 헬스 정보 표시
위 설정에서 management.endpoints.web.exposure.include는 Actuator 엔드포인트를 노출하는 설정이야. 실제 운영 환경에서는 보안을 위해 필요한 엔드포인트만 노출하는 것이 좋아.
3.3 UI 커스터마이징
Spring Boot Admin은 UI를 커스터마이징할 수 있는 다양한 옵션을 제공해. 로고, 색상, 타이틀 등을 변경할 수 있지. 다음은 간단한 커스터마이징 예시야:
# application.yml에 추가
spring:
boot:
admin:
ui:
title: 우리 회사 마이크로서비스 모니터링
brand: 마이크로서비스 대시보드
favicon: favicon.png
favicon-danger: favicon-danger.png
available-languages:
- ko-KR
- en-US
external-views:
- label: "재능넷"
url: https://www.jaenung.net
order: 2000
위 설정에서 external-views는 외부 링크를 Admin UI에 추가하는 기능이야. 재능넷과 같은 서비스 플랫폼을 운영한다면, 모니터링 대시보드에서 바로 서비스 페이지로 이동할 수 있는 링크를 추가하면 편리하지!
위 이미지는 Spring Boot Admin UI의 예시야. 각 서비스의 상태를 직관적으로 확인할 수 있고, 문제가 있는 서비스는 빨간색으로 표시돼. 이렇게 시각적으로 상태를 확인할 수 있어서 문제 발생 시 빠르게 대응할 수 있어.
3.4 서비스 디스커버리 설정
대규모 마이크로서비스 환경에서는 서비스 디스커버리를 통해 자동으로 클라이언트를 등록하는 것이 편리해. Spring Cloud와 함께 사용하면 Eureka, Consul 등의 서비스 디스커버리를 활용할 수 있어. 여기서는 Eureka를 예로 들어볼게.
먼저 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
그리고 application.yml
에 Eureka 설정을 추가해:
spring:
application:
name: admin-server
cloud:
discovery:
client:
simple:
instances:
service1:
- uri: http://service1-host:8081
metadata:
management.context-path: /actuator
service2:
- uri: http://service2-host:8082
metadata:
management.context-path: /actuator
eureka:
client:
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
leaseRenewalIntervalInSeconds: 10
health-check-url-path: /actuator/health
metadata-map:
startup: ${random.int}
management.context-path: /actuator
이제 메인 애플리케이션 클래스에 @EnableDiscoveryClient
애노테이션을 추가해:
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class AdminServerApplication {
// ...
}
이렇게 설정하면 Eureka에 등록된 모든 서비스가 자동으로 Spring Boot Admin에 클라이언트로 등록돼. 서비스가 추가되거나 제거될 때마다 수동으로 설정을 변경할 필요가 없어 관리가 훨씬 편리해져.
💡 Pro Tip
Spring Boot Admin 서버는 별도의 애플리케이션으로 실행하는 것이 좋아. 모니터링 대상 애플리케이션과 분리해서 운영하면 모니터링 대상에 문제가 생겨도 모니터링 시스템은 계속 작동할 수 있어.
이제 기본적인 Spring Boot Admin 서버 설정이 완료됐어! 다음 섹션에서는 클라이언트 애플리케이션을 연결하는 방법을 알아볼게.
4. 클라이언트 애플리케이션 연결하기 🔌
Spring Boot Admin 서버를 구축했다면, 이제 모니터링할 마이크로서비스들을 클라이언트로 연결해야 해. 클라이언트 연결 방법은 크게 두 가지가 있어:
- 직접 등록 방식: 각 클라이언트가 Admin 서버에 직접 등록
- 서비스 디스커버리 방식: Eureka, Consul 등을 통한 자동 등록
4.1 직접 등록 방식
먼저 가장 간단한 직접 등록 방식부터 알아볼게. 모니터링할 Spring Boot 애플리케이션의 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
그리고 application.yml
파일에 다음 설정을 추가해:
spring:
application:
name: user-service # 서비스 이름
boot:
admin:
client:
url: http://admin-server:8080 # Admin 서버 URL
instance:
metadata:
tags:
environment: production # 환경 태그 추가
management:
endpoints:
web:
exposure:
include: "*" # 모든 Actuator 엔드포인트 노출
endpoint:
health:
show-details: always # 상세 헬스 정보 표시
info:
env:
enabled: true # 환경 정보 노출
include: "*" 설정은 모든 Actuator 엔드포인트를 노출하는 설정이야. 실제 운영 환경에서는 보안을 위해 필요한 엔드포인트만 노출하는 것이 좋아. 예를 들면 include: "health,info,metrics"
와 같이 설정할 수 있어.
이제 애플리케이션을 실행하면 자동으로 Admin 서버에 등록되고, 대시보드에서 확인할 수 있어!
4.2 서비스 디스커버리 방식
대규모 마이크로서비스 환경에서는 서비스 디스커버리를 통한 자동 등록 방식이 더 효율적이야. Eureka를 사용하는 예시를 살펴볼게.
클라이언트 애플리케이션의 pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
그리고 application.yml
파일에 다음 설정을 추가해:
spring:
application:
name: product-service
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
leaseRenewalIntervalInSeconds: 10
health-check-url-path: /actuator/health
metadata-map:
startup: ${random.int}
management.context-path: /actuator
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
메인 애플리케이션 클래스에 @EnableDiscoveryClient
애노테이션을 추가해:
@SpringBootApplication
@EnableDiscoveryClient
public class ProductServiceApplication {
// ...
}
이 방식의 장점은 새로운 서비스 인스턴스가 추가되거나 제거될 때 자동으로 Admin 서버에 반영된다는 거야. 특히 오토스케일링을 사용하는 환경에서 매우 유용해!
4.3 클라이언트 메타데이터 활용
Spring Boot Admin은 클라이언트의 메타데이터를 활용해 추가 정보를 표시할 수 있어. 메타데이터를 통해 환경, 버전, 담당자 등의 정보를 추가할 수 있지:
eureka:
instance:
metadata-map:
version: @project.version@
team: payment-team
contact: payment-team@example.com
environment: production
region: us-east
이렇게 설정한 메타데이터는 Admin 대시보드에서 확인할 수 있고, 필터링이나 그룹화에도 활용할 수 있어.
⚠️ 주의사항
Actuator 엔드포인트를 노출할 때는 보안에 주의해야 해. 민감한 정보가 노출될 수 있으므로, 프로덕션 환경에서는 반드시 보안 설정을 적용해야 해.
다음 섹션에서는 Spring Boot Admin의 보안 설정에 대해 알아볼게. 모니터링 시스템은 중요한 정보를 다루기 때문에 보안이 매우 중요해!
5. 보안 설정 적용하기 🔒
Spring Boot Admin은 중요한 시스템 정보와 관리 기능을 제공하기 때문에 적절한 보안 설정이 필수야. 이 섹션에서는 Spring Security를 사용해 Admin 서버와 클라이언트의 보안을 설정하는 방법을 알아볼게.
5.1 Admin 서버 보안 설정
먼저 Admin 서버에 Spring Security를 적용해보자. pom.xml
에 다음 의존성을 추가해:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
그리고 Security 설정 클래스를 만들어:
package com.example.adminserver.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final AdminServerProperties adminServer;
public SecurityConfig(AdminServerProperties adminServer) {
this.adminServer = adminServer;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler =
new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http
.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(this.adminServer.path("/assets/**")).permitAll()
.requestMatchers(this.adminServer.path("/login")).permitAll()
.anyRequest().authenticated()
)
.formLogin(formLogin ->
formLogin
.loginPage(this.adminServer.path("/login"))
.successHandler(successHandler)
)
.logout(logout -> logout.logoutUrl(this.adminServer.path("/logout")))
.httpBasic(httpBasic -> {})
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers(
this.adminServer.path("/instances"),
this.adminServer.path("/actuator/**")
)
);
return http.build();
}
@Bean
public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.withUsername("admin")
.password(passwordEncoder.encode("admin-password"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위 설정은 Admin 서버에 기본적인 폼 로그인 인증을 적용하고, 정적 리소스와 로그인 페이지는 인증 없이 접근할 수 있도록 허용해. 실제 운영 환경에서는 더 강력한 비밀번호를 사용하고, 가능하면 데이터베이스 기반 사용자 관리나 OAuth2와 같은 더 안전한 인증 방식을 사용하는 것이 좋아.
5.2 클라이언트-서버 간 보안 통신
Admin 서버에 보안을 적용했다면, 클라이언트도 이에 맞게 설정해야 해. 클라이언트 애플리케이션의 application.yml
에 다음 설정을 추가해:
spring:
boot:
admin:
client:
url: http://admin-server:8080
username: admin
password: admin-password
instance:
metadata:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
이 설정은 클라이언트가 Admin 서버에 등록할 때 인증 정보를 제공하도록 해. 또한 Admin 서버가 클라이언트의 Actuator 엔드포인트에 접근할 때 필요한 인증 정보도 메타데이터로 제공해.
5.3 HTTPS 적용
프로덕션 환경에서는 HTTPS를 사용하는 것이 필수야. Spring Boot에서 HTTPS를 적용하는 방법을 알아보자.
먼저 키스토어를 생성해:
keytool -genkeypair -alias adminserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore adminserver.p12 -validity 3650
그리고 application.yml
에 다음 설정을 추가해:
server:
port: 8443
ssl:
key-store: classpath:adminserver.p12
key-store-password: your-password
key-store-type: PKCS12
key-alias: adminserver
이제 Admin 서버는 HTTPS로 통신하게 돼. 클라이언트 설정도 HTTPS URL로 업데이트해야 해:
spring:
boot:
admin:
client:
url: https://admin-server:8443
username: admin
password: admin-password
💡 Pro Tip
실제 운영 환경에서는 자체 서명된 인증서보다는 신뢰할 수 있는 CA에서 발급받은 인증서를 사용하는 것이 좋아. Let's Encrypt와 같은 무료 CA를 활용할 수 있어.
5.4 IP 기반 접근 제한
추가적인 보안 계층으로 IP 기반 접근 제한을 적용할 수 있어. 특정 IP 또는 IP 범위에서만 Admin 서버에 접근할 수 있도록 설정할 수 있지:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// ... 기존 설정 ...
http.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(this.adminServer.path("/assets/**")).permitAll()
.requestMatchers(this.adminServer.path("/login")).permitAll()
.requestMatchers(this.adminServer.path("/**"))
.hasIpAddress("192.168.1.0/24") // 내부 네트워크 IP 범위
.anyRequest().authenticated()
);
// ... 나머지 설정 ...
return http.build();
}
이 설정은 내부 네트워크 IP 범위(192.168.1.0/24)에서만 Admin 서버에 접근할 수 있도록 제한해. 클라우드 환경에서는 VPC나 네트워크 보안 그룹을 통해 비슷한 제한을 적용할 수 있어.
보안은 끊임없이 개선해야 하는 영역이야. 정기적으로 보안 설정을 검토하고 업데이트하는 것이 중요해. 다음 섹션에서는 알림 시스템을 구성하는 방법을 알아볼게!
- 지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.
© 2025 재능넷 | All rights reserved.
댓글 0개