-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
📌 콜드 스타트 (Cold Start)
서버리스(Serverless) 환경 또는 애플리케이션이 처음 호출될 때 발생하는 느린 응답 현상
- 서버리스 플랫폼(AWS Lambda 등)은 요청이 없을 때 자동으로 리소스를 줄이기 위해 인스턴스를 꺼버린다.
- 첫 요청이 오면 다시 "처음부터 시작해야 하므로 시간이 오래 걸림" → 이게 콜드 스타트
📌 로깅 방식
1. SLF4J + Logback
SLF4J
- Simple Logging Facade for Java의 약자
- 다양한 로깅 구현체들(Logback, Log4j 등)과 연결할 수 있는 로깅 추상화 API
- 직접 로그를 찍지는 않고, 중간 추상 계층 역할만 수행
Logback
- SLF4J의 기본 구현체
- Logback은 SLF4J의 제작자가 만든 로깅 구현체이며, SLF4J와 매우 밀접하게 통합
- Spring Boot에서 기본 제공 로깅 시스템
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyService {
private static final Logger log = LoggerFactory.getLogger(MyService.class);
public void process() {
log.info("정보 로그");
log.error("에러 발생: {}", "에러 내용");
}
}또는 롬복 사용시
@Slf4j
public class MyService {
public void process() {
log.debug("디버깅 정보");
}
}2. JUL (java.util.logging)
- Java SE에 기본 내장된 로깅 API
- java.util.logging.Logger 클래스를 통해 사용
- 추가 의존성 없이 즉시 사용 가능
import java.util.logging.Logger;
public class MyService {
private static final Logger logger = Logger.getLogger(MyService.class.getName());
public void process() {
logger.info("정보 로그");
logger.warning("경고 로그");
logger.severe("심각한 오류");
}
}비교표
| 항목 | SLF4J + Logback | JUL (java.util.logging) |
|---|---|---|
| 제공 방식 | 외부 라이브러리 | JDK 기본 내장 |
| 주요 클래스 | LoggerFactory, Logger | Logger |
| 로그 레벨 | TRACE, DEBUG, INFO, WARN, ERROR | FINEST, FINER, FINE, INFO, WARNING, SEVERE |
| 성능 | 지연 문자열 평가 지원 → 효율적 | 문자열 결합 즉시 실행 |
| 설정 유연성 | 매우 유연 (XML/YAML 설정) | 제한적 (properties 기반) |
| Spring Boot 통합 | 기본 내장, 최적화 완료 | 별도 설정 필요 |
| 실무 사용률 | 🌟 매우 높음 (사실상 표준) | ❌ 낮음 (레거시, 교육용 또는 간단한 앱) |
📌 Logging vs Metric
시스템의 동작을 관찰하고 문제를 진단하는 데 사용하는 두 가지 주요 모니터링 방식
이 둘은 목적과 방식이 다르며, 서로 보완적인 역할을 한다.
개념 비교
| 항목 | Logging (로깅) | Metric (메트릭) |
|---|---|---|
| 정의 | 시스템의 실행 흐름이나 상태를 텍스트 형태로 기록 | 수치 기반의 시스템 상태 데이터를 수집하고 집계 |
| 형태 | 로그 메시지 (예: INFO, DEBUG, ERROR 등) | 수치 값 (예: CPU 사용률, 요청 수, 평균 응답 시간 등) |
| 목적 | 문제 발생 시 원인을 추적하고 디버깅 | 시스템 상태의 지속적인 모니터링 및 알림 |
| 저장 형식 | 문자열 기반 텍스트 (JSON 또는 일반 텍스트) | 시계열 DB (Time Series Data) |
| 처리 방식 | 이벤트 중심, 상세 로그 기록 | 수치 수집, 집계 및 시각화 |
| 용도 | 에러 분석, 비즈니스 이벤트 추적, 예외 로그 | 대시보드, SLA 추적, 알림 조건 설정 |
| 예시 | log.error("DB 연결 실패: {}", e.getMessage()); |
http_requests_total = 1500, cpu_usage = 73% |
Logging
log.error("User login failed for ID {}", userId);- 로그인 실패 이유, 사용자의 IP, 요청 파라미터 등을 남김
- 사건의 정황을 상세히 남김
- 디버깅과 오류 분석에 적합
Metric
login_failure_total{status="401"} = 43avg_response_time{endpoint="/login"} = 120ms- 로그인 실패 횟수, 평균 응답 시간 등의 수치화된 지표
- 그래프화, 알림 설정, 트렌드 분석에 적합
시각화나 툴
| 항목 | Logging | Metric |
|---|---|---|
| 주요 도구 | ELK Stack (Elasticsearch, Logstash, Kibana), Fluentd, Loki | Prometheus, Grafana, CloudWatch, Datadog |
| 시각화 | Kibana, Grafana + Loki | Grafana, CloudWatch Dashboards |
| 알림 설정 | 로그 패턴 기반 알림 가능 (e.g. error > 100회) | 특정 수치 임계값 기반 (e.g. CPU > 90%) |
언제 무엇을 써야 하나?
| 목적 | 추천 방식 |
|---|---|
| 오류 추적 / 예외 확인 | Logging |
| 시스템 부하 감지 / 리소스 사용량 모니터링 | Metric |
| 사용자 행동 분석 (클릭, 로그인 시도 등) | 둘 다 사용 가능 (로그로 상세히, 메트릭으로 집계) |
| 서비스 안정성 모니터링 (SLO/SLA 추적) | Metric |
결론
- Logging = 텍스트 중심, 상세 원인 분석용
- Metric = 수치 중심, 모니터링/경보/시각화용
- 실무에서는 둘을 병행 사용하며, Prometheus + Grafana(메트릭), ELK Stack or Loki(로깅) 조합이 많이 쓰인다.
📌 Prometheus
- Controller.java
package org.example.bootprometheus.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/ok")
public ResponseEntity<Void> ok() {
return ResponseEntity.ok().build();
}
@GetMapping("/not-ok")
public ResponseEntity<Void> notOk() {
return ResponseEntity.badRequest().build();
}
}- application.yml
spring:
application:
name: boot-prometheus
management:
endpoints:
web:
exposure:
include: prometheus,health,metrics
endpoint:
prometheus:
access: unrestricted
prometheus:
metrics:
export:
enabled: true- prometheus.yml
global:
scrape_interval: 15s # 기본 수집 간격
evaluation_interval: 15s # 규칙 평가 간격
scrape_configs:
- job_name: 'spring-boot-monitoring'
metrics_path: '/actuator/prometheus'
scrape_interval: 10s # 이 job의 수집 간격
static_configs:
- targets: ['host.docker.internal:8080']
scrape_timeout: 5sdocker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
docker ps- postman으로 실습할 수 있다.
GET http://localhost:8080/ok→ 200GET http://localhost:8080/not-ok→ 400
- http://localhost:9090/ 접속
- 입력창에 http_server_requests_seconds_count 입력
