Actuator와 Micrometer (2) - Micrometer로 메트릭 수집하고 Prometheus로 내보내기
1. 개요 1편에서는 Actuator의 health 로 "서버가 살아 있는가"를 확인했다. 하지만 운영에서는 "좌석 조회 API가 요즘 느려지지 않았나?", "오늘 예매가 몇 건 성공했나?"처럼 숫자로 답해야 하는 질문 도 많다. 이런 숫자를 메트릭 (metric)이라…
TAG
28개의 글
1. 개요 1편에서는 Actuator의 health 로 "서버가 살아 있는가"를 확인했다. 하지만 운영에서는 "좌석 조회 API가 요즘 느려지지 않았나?", "오늘 예매가 몇 건 성공했나?"처럼 숫자로 답해야 하는 질문 도 많다. 이런 숫자를 메트릭 (metric)이라…
1. 개요 공연 예매 서비스를 운영하다 보면 "서버가 지금 살아 있나?", "DB 연결은 괜찮나?", "좌석 조회 API가 요즘 느려지지 않았나?" 같은 질문에 답해야 한다. 로그만으로는 이런 질문에 빠르게 답하기 어렵다. Spring Boot는 이 문제를 두 도구로…
1. 개요 공연 예매 서비스에서 여러 사용자가 같은 좌석을 동시에 예매하면, 서버 로그에는 여러 요청의 로그가 한데 섞여 찍힌다. 이때 "이 로그 한 줄이 어느 요청에서 나왔는가"를 알 수 없으면 동시성 문제를 추적하기 어렵다. 이 글에서는 요청마다 짧은 식별자(요청…
1. 개요 내장 Tomcat과 DispatcherServlet 처럼 애플리케이션을 실행하기 위해 필요한 기술 객체까지 애플리케이션 클래스에 함께 두면, 비즈니스 코드와 기반 설정의 경계가 흐려진다. 이번 글에서는 여러 애노테이션을 하나로 묶는 합성 애노테이션(compo…
1. 개요 앞 글에서는 @Import 에 TomcatWebServerConfig 와 DispatcherServletConfig 를 직접 적어 인프라 빈을 분리했다. 구성 클래스가 몇 개뿐이라면 충분하지만, 라이브러리가 제공하는 기능이 많아지면 애노테이션 코드를 고칠 때…

1. 개요 앞 글에서 만든 @MyAutoConfiguration 에는 @Configuration(proxyBeanMethods = false) 가 들어 있다. false 하나가 무엇을 바꾸는지 알려면, @Bean 메서드가 일반 자바 메서드와 다르게 동작하는 이유부터 살…
1. 개요 앞 글에서는 스프링 컨테이너가 HelloController 와 HelloService 를 만들고 연결하도록 구성했다. 이번에는 그 연결 방식인 의존성 주입(DI, Dependency Injection) 을 테스트에 활용한다. DI를 적용하면 컨테이너를 띄우지…

1. 개요 앞 글에서는 내장 Tomcat과 서블릿을 직접 만들고 연결했다. 이 방식은 웹 요청이 처리되는 원리를 이해하기에 좋지만, 애플리케이션이 커질수록 객체를 만들고 연결하고 서버를 시작하는 코드가 main() 에 계속 쌓인다. 이 글에서는 이 작업을 스프링 컨테이…
1. 개요 /hello?name=etakyung 로 요청하면 Hello etakyung 를 돌려주는 작은 웹 애플리케이션을 만들어 보자. 이 예제는 내장 Tomcat과 서블릿을 직접 사용한다. HTTP 요청이 컨트롤러 메서드 호출로 바뀌고, 그 결과가 HTTP 응답으로…
1. 개요 지금까지 다룬 스프링 빈은 모두 컨테이너가 시작될 때 생성되어 종료될 때까지 유지되는 싱글톤이었다. 하지만 스프링은 이 외에도 빈이 살아있는 범위, 즉 스코프를 다양하게 지정할 수 있게 해준다. 특히 매번 새 인스턴스가 필요한 프로토타입 스코프를 싱글톤 빈과…
1. 개요 DB 커넥션 풀이나 네트워크 소켓처럼 외부 자원을 다루는 빈은 "애플리케이션이 뜰 때 연결하고, 종료될 때 끊는" 작업이 필요하다. 그런데 이 연결 작업을 생성자에 그냥 넣으면 문제가 생긴다. 스프링 빈은 객체가 먼저 만들어지고 그 다음에 의존관계(필드 값)…
1. 개요 앞 글에서는 같은 타입의 빈이 여러 개일 때 그중 하나만 골라서 주입받는 방법을 다뤘다. 그런데 반대로 같은 타입의 빈을 하나만 고르는 게 아니라 전부 다 받아서 써야 하는 경우도 있다. 스프링은 이럴 때 List 나 Map 으로 한 번에 주입받는 방법을 지…
1. 개요 @Autowired 는 타입을 기준으로 스프링 빈을 찾아서 주입한다. 지금까지 예제에서는 인터페이스를 구현한 빈이 하나뿐이었기 때문에 문제가 없었지만, 실무에서는 같은 인터페이스를 구현한 빈이 여러 개 등록되는 경우가 흔하다. 이번 글에서는 타입으로 조회했을…
1. 개요 앞 글에서 생성자 주입을 기본으로 써야 하는 이유를 정리했다. 그런데 막상 실무 코드를 짜보면 대부분의 의존관계가 final 필드이고, 그 필드들을 그대로 받아 대입해주는 생성자를 매번 손으로 채워 넣어야 한다. 필드가 늘어나면 생성자 파라미터도, 대입 코드…
1. 개요 앞 글까지는 @Autowired 를 생성자에 붙여서 의존관계를 주입하는 방식만 사용해왔다. 그런데 스프링이 의존관계를 주입하는 방법은 생성자뿐만이 아니다. 크게 네 가지 방법이 있고, 각각 동작 시점과 용도가 다르다. 이번 글에서는 네 가지 주입 방법을 비교…
1. 개요 앞 글에서는 @Component 가 붙은 클래스를 자동으로 찾아 빈으로 등록하는 컴포넌트 스캔의 기본 동작을 정리했다. 이번에는 스캔 대상을 원하는 대로 걸러내는 필터 옵션과, 스캔하다 보면 반드시 한 번은 마주치는 빈 이름 충돌 문제를 정리한다. 2. in…
1. 개요 지금까지는 @Bean 이 붙은 메서드를 하나하나 작성해서 스프링 빈을 등록했다. 등록할 빈이 몇 개 안 될 때는 문제가 없지만, 빈이 수십 수백 개로 늘어나면 이야기가 다르다. 설정 클래스가 끝없이 길어지고, 등록을 깜빡하는 실수도 생긴다. 스프링은 이 문제…
1. 개요 AppConfig 의 자바 코드를 그대로 읽어보면 이상한 부분이 있다. 여러 @Bean 메서드가 서로를 코드로 직접 호출하고 있는데, 그렇다면 의존 객체가 여러 번 new 되어야 하는 것이어야 하지 않나 라고 생각할 수 있다. @Configuration 이…
1. 개요 스프링은 대부분 여러 사용자가 동시에 요청을 보내는 웹 애플리케이션에서 사용된다. 그런데 지금까지 만들어 온 순수 자바 DI 컨테이너( AppConfig )는 빈을 요청할 때마다 new 로 객체를 새로 만든다. 트래픽이 많아지면 그만큼 객체가 계속 생성·소멸…
1. 개요 앞선 글에서 스프링 컨테이너를 만들고 그 안에 빈이 등록되는 과정을 살펴봤다. 이번에는 컨테이너에 등록된 빈을 확인하고 실제로 꺼내 쓰는 다양한 방법을 정리한다. 등록된 빈을 전체 조회하는 방법부터, 이름으로 찾는 가장 단순한 방법, 같은 타입의 빈이 여러…
1. 개요 이전 글에서 AppConfig 를 만들어 구현 객체를 생성·연결하는 책임을 클라이언트로부터 분리했다. 이번 글에서는 이 변화를 좀 더 일반적인 용어로 정리해본다. AppConfig 가 등장하면서 프로그램의 제어 흐름이 어떻게 바뀌었는지를 제어의 역전(IoC)…
1. 개요 앞선 글들에서는 순수한 자바 코드로 만든 AppConfig 가 DI 컨테이너 역할을 했다. 이제부터는 스프링이 직접 제공하는 컨테이너인 ApplicationContext 를 써볼 차례다. 이번 글에서는 이 컨테이너를 어떻게 만드는지, 그리고 만들어지는 동안…
1. 개요 이전 글에서 좋은 객체 지향 설계의 핵심은 다형성이고, 이를 실제로 잘 활용하기 위한 지침이 SOLID 원칙이라는 것을 정리했다. 이번 글에서는 애플리케이션에 새로운 할인 정책을 추가해보면서 다형성만으로는 OCP와 DIP를 지킬 수 없다는 것을 직접 확인하고…
1. 개요 스프링(Spring) 프레임워크는 한마디로 좋은 객체 지향 프로그래밍(OOP)을 쉽게 할 수 있도록 도와주는 프레임워크 이다. 스프링이 제공하는 DI(의존관계 주입), IoC(제어의 역전) 컨테이너는 그 자체가 목적이 아니라, 개발자가 다형성 을 활용해 SO…
https://spring.io/guides/gs/spring boot [Spring Boot] 빠르게 웹 애플리케이션 시작하기: 자동 설정부터 Actuator까지 Spring Boot는 개발자가 오직 비즈니스 로직 구현에만 집중할 수 있는 환경을 제공한다. Sprin…
https://spring.io/guides/gs/serving web content [Spring Boot] Spring MVC로 웹 콘텐츠 제공하기 (Thymeleaf, DevTools) 스프링 부트(Spring Boot) 환경에서 웹 애플리케이션을 개발할 때 가장…

https://spring.io/guides/gs/consuming rest 스프링 프레임워크 6.1 및 스프링 부트 3.2부터 기존의 RestTemplate 을 대체할 수 있는 동기식 HTTP 클라이언트인 RestClient 가 도입되었다. Fluent API 스타일…
https://spring.io/guides/gs/rest service [Spring Boot] RESTful 웹 서비스 구축하기 (Spring REST API) Spring Boot를 활용하면 복잡한 설정 없이 몇 분 만에 간단한 RESTful Web Service…