📌 콜드 스타트 (Cold Start)
서버리스(Serverless) 환경 또는 애플리케이션이 처음 호출될 때 발생하는 느린 응답 현상
- 서버리스 플랫폼(AWS Lambda 등)은 요청이 없을 때 자동으로 리소스를 줄이기 위해 인스턴스를 꺼버린다.
- 첫 요청이 오면 다시 "처음부터 시작해야 하므로 시간이 오래 걸림" → 이게 콜드 스타트
📌 로깅 방식
1. SLF4J + Logback
SLF4J
https://www.slf4j.org
- 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"} = 43
avg_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
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();
}
}
spring:
application:
name: boot-prometheus
management:
endpoints:
web:
exposure:
include: prometheus,health,metrics
endpoint:
prometheus:
access: unrestricted
prometheus:
metrics:
export:
enabled: true
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: 5s
docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
docker ps
- postman으로 실습할 수 있다.
GET http://localhost:8080/ok → 200
GET http://localhost:8080/not-ok → 400

📌 콜드 스타트 (Cold Start)
서버리스(Serverless) 환경 또는 애플리케이션이 처음 호출될 때 발생하는 느린 응답 현상
📌 로깅 방식
1. SLF4J + Logback
SLF4J
https://www.slf4j.org
Logback
또는 롬복 사용시
2. JUL (java.util.logging)
비교표
📌 Logging vs Metric
시스템의 동작을 관찰하고 문제를 진단하는 데 사용하는 두 가지 주요 모니터링 방식
이 둘은 목적과 방식이 다르며, 서로 보완적인 역할을 한다.
개념 비교
log.error("DB 연결 실패: {}", e.getMessage());http_requests_total = 1500, cpu_usage = 73%Logging
Metric
login_failure_total{status="401"} = 43avg_response_time{endpoint="/login"} = 120ms시각화나 툴
언제 무엇을 써야 하나?
결론
📌 Prometheus
GET http://localhost:8080/ok→ 200GET http://localhost:8080/not-ok→ 400