성능 지표(Metrics)는 애플리케이션이나 시스템의 상태와 성능을 수치로 나타낸 것입니다. 이를 통해 시스템이 얼마나 효율적으로 작동하고 있는지 문제가 발생했는지 파악할 수 있습니다.
모니터링은 실시간으로 시스템의 상태와 성능 지표를 수집하고 분석하는 과정입니다. 이를 통해 문제가 발생했을 때 신속하게 대응할 수 있으며, 시스템의 안정성을 유지할 수 있습니다.
@RestController
public class MyController {
private final Counter requestCounter;
public MyController(MeterRegistry registry) {
this.requestCounter = registry.counter("requests.total");
}
@GetMapping("/hello")
public String hello() {
requestCounter.increment();
return "Hello, World!";
}
}
management.endpoints.web.exposure.include=health,info,metrics
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
scrape_configs:
- job_name: 'spring-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
모니터링 도구를 통해 특정 조건(예: 응답 시간 증가, 에러율 상승)이 발생하면 알림을 받을 수 있습니다. 예를 들어, Prometheus의 Alertmanager와 연동하여 슬랙, 이메일 등으로 알림을 받을 수 있습니다.
모니터링과 함께 로그 관리는 매우 중요합니다. 로그는 문제의 원인을 파악하는데 도움을 줍니다.
Spring Boot 애플리케이션의 /api/users 엔드포인트의 성능을 모니터링한다고 가정.
취업 준비 중인 신입 Java 및 Spring 백엔드 개발자라면, 성능 지표(Metrics)와 모니터링(Monitoring)에 대한 이해를 실제 프로젝트를 통해 심화시키는 것이 매우 중요합니다. 실습을 통해 이론을 적용해보고, 포트폴리오에 추가할 수 있는 프로젝트를 만드는 것은 취업에 큰 도움이 될 것입니다. 아래에 신입 개발자가 실습하기에 적합한 몇 가지 프로젝트 아이디어와 단계별 가이드를 제공해드릴게요.
먼저, 모니터링과 성능 지표를 적용할 수 있는 간단한 Spring Boot 애플리케이션을 만드세요. 예를 들어, 사용자 관리(User Management) API를 개발할 수 있습니다.
기능
기술 스택
Spring Boot 프로젝트 생성
엔티티 및 리포지토리 생성
User 엔티티 클래스를 생성하고, UserRepository 인터페이스를 작성합니다.@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
public interface UserRepository extends JpaRepository<User, Long> {}
컨트롤러 작성
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return userRepository.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
return userRepository.findById(id)
.map(user -> {
user.setName(userDetails.getName());
user.setEmail(userDetails.getEmail());
return ResponseEntity.ok(userRepository.save(user));
})
.orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
return userRepository.findById(id)
.map(user -> {
userRepository.delete(user);
return ResponseEntity.ok().<Void>build();
})
.orElse(ResponseEntity.notFound().build());
}
}
애플리케이션 실행 및 테스트
애플리케이션의 성능 지표를 수집하기 위해 Spring Actuator와 Micrometer를 통합합니다.
의존성 추가
pom.xml 또는 build.gradle에 Spring Actuator와 Micrometer 의존성을 추가합니다.<!-- Maven 예시 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
애플리케이션 설정
application.properties 또는 application.yml에 Actuator와 Prometheus 설정을 추가합니다.# application.properties 예시
management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.metrics.export.prometheus.enabled=true
커스텀 메트릭 추가 (선택 사항)
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserRepository userRepository;
private final Counter createUserCounter;
public UserController(UserRepository userRepository, MeterRegistry registry) {
this.userRepository = userRepository;
this.createUserCounter = registry.counter("users.created.total");
}
@PostMapping
public User createUser(@RequestBody User user) {
createUserCounter.increment();
return userRepository.save(user);
}
// 나머지 엔드포인트...
}
애플리케이션 재실행 및 메트릭 확인
http://localhost:8080/actuator/prometheus에 접속하여 메트릭이 정상적으로 노출되는지 확인합니다.수집된 메트릭을 시각화하고 모니터링하기 위해 Prometheus와 Grafana를 설정합니다.
Docker 설치 (선택 사항)
Prometheus 설정
prometheus.yml)을 생성합니다.global:
scrape_interval: 15s
scrape_configs:
- job_name: 'spring-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080'] # Docker 사용 시 호스트 주소 확인
Prometheus 실행
docker run -d \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
Grafana 설정 및 실행
docker run -d -p 3000:3000 grafana/grafana
Grafana에 Prometheus 데이터 소스 추가
http://localhost:3000에 접속합니다. 기본 로그인은 admin / admin입니다.http://host.docker.internal:9090).대시보드 생성
모니터링 시스템에서 특정 조건이 발생했을 때 알림을 받을 수 있도록 설정합니다. 예를 들어, 응답 시간이 일정 수준 이상일 경우 슬랙으로 알림을 받을 수 있습니다.
Alertmanager 설정 (Prometheus와 연동)
alertmanager.yml 파일을 생성합니다.global:
resolve_timeout: 5m
route:
receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXXX/XXXX/XXXX'
channel: '#alerts'
Prometheus 설정 파일에 Alertmanager 추가
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- "alerts.yml"
경고 규칙 작성 (alerts.yml)
groups:
- name: example
rules:
- alert: HighResponseTime
expr: http_server_requests_seconds_max{uri="/api/users"} > 1
for: 1m
labels:
severity: warning
annotations:
summary: "High response time detected"
description: "Response time for /api/users is above 1s for more than 1 minute."
Prometheus 및 Alertmanager 재시작
Slack Webhook 설정
alertmanager.yml에 api_url을 추가합니다.효과적인 모니터링을 위해 로그 관리는 필수적입니다. ELK Stack(Elasticsearch, Logstash, Kibana) 또는 다른 중앙 집중식 로그 관리 도구를 사용할 수 있습니다.
Spring Boot 로그 설정
application.properties에 로그 레벨과 패턴을 설정합니다.logging.level.org.springframework=INFO
logging.file.name=application.log
Logstash 설정 (Docker 사용 시)
logstash.conf)을 생성합니다.input {
file {
path => "/path/to/application.log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMMONAPACHELOG}" }
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
}
}
ELK Stack 실행
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
logstash:
image: docker.elastic.co/logstash/logstash:7.9.2
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
docker-compose up -d
Kibana에서 로그 시각화
http://localhost:5601에 접속하여 Kibana를 설정하고 로그를 시각화합니다.위의 단계를 통해 기본적인 모니터링 시스템을 구축한 후, 이를 포트폴리오 프로젝트로 발전시킬 수 있습니다.
성능 지표와 모니터링은 백엔드 개발에서 시스템의 안정성과 효율성을 유지하는 데 중요한 역할을 합니다. 위의 실습 프로젝트를 통해 Java와 Spring 환경에서의 모니터링 시스템 구축 과정을 경험하고, 이를 포트폴리오에 추가함으로써 취업 준비에 큰 강점을 가질 수 있습니다. 실습을 진행하면서 발생하는 문제를 해결하고, 다양한 도구를 탐구하는 과정에서 실무 역량도 자연스럽게 향상될 것입니다. 화이팅입니다!