반응형
엑츄에이터란? 서비스를 운영하면서 장애는 언제든지 발생할 수 있지만, 이 장애를 잘 대응하는 것이 중요하다. 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하여 장애에 대응할 수 있다. 운영 환경에서 서비스할 때 필요한 이런 기능들을 프로덕션 준비 기능이라 한다. 프로덕션 준비 기능을 통해 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인하여 장애 발생에 미리 대응할 수 있어야 한다. 스프링 부트가 제공하는 액츄에이터는 이런 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능들을 제공한다. 더 나아가서 마이크로미터, 프로메테우스, 그라파나 같은 최근 유행하는 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한..
스프링에서 각 환경마다 서로 다른 설정 값을 사용하도록 "프로필" 기능을 지원한다. 그런데 설정 값 뿐만 아니라 각 환경마다 서로 다른 빈을 등록해야할 경우가 있을 수도 있다. 예를 들어서 결제 기능을 붙여야 하는데, 로컬 개발 환경에서는 실제 결제가 발생하면 문제가 되니 가짜 결제 기능이 있는 스프링 빈을 등록하고 운영 환경에서는 실제 결제 기능을 제공하는 스프링 빈을 등록한다고 가정해보자. @Profile 을 사용하여 아래처럼 등록되는 스프링 빈도 분리할 수 있다. @Slf4j @Configuration public class PayConfig { @Bean @Profile("default") // 기본값 프로필일 경우 이 빈이 등록 public LocalPayClient localPayClient(..
@ConfigurationProperties *.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션이다. ConfigurationProperties 장점 외부 설정을 객체로 편리하게 변환해서 사용할 수 있다. 외부 설정의 계층을 객체로 편리하게 표현할 수 있다. 외부 설정을 타입 안전하게 사용할 수 있다. (타입 오류시 컴파일 오류로 확인할 수 있음) (Bean Validation) 검증기를 적용할 수 있다. 사용법 *.properties, *.yml 파일의 설정 값을 @Value 을 사용하여 바인딩할 수 있다. 만약 application.properties의 설정 값이 다음과 같다면 my.test.url=test.db...
YAML이란? YAML이란? (JSON, XML과 비교) XML과 JSON 기존에는 XML, JSON 파일 포맷으로 데이터를 저장하고 주고 받는데 했었다. 하지만 이 두 파일 포맷은 정해진 포맷 규칙 때문에 데이터가 많아진다면 작성하기가 번거롭고 읽기가 힘들다 hstory0208.tistory.com application.yml 스프링은 설정 데이터를 사용할 때 application.properties 뿐만 아니라 application.yml 이라는 형식도 지원한다. application.properties에 다음과 같은 옵션 설정이 있을 때 YAML로 변환하면 다음과 같다. 주의할점 application.properties , application.yml 을 같이 사용하면 application.prop..
개발환경과 운영환경의 설정 분리 하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 예를 들어 개발환경과 운영환경이 필요할 경우 어플리케이션이 개발환경 DB에 접근하는 설정 정보와, 운영환경 DB에 접근하는 설정 정보가 다르다. 이를 해결 하기 위한 방법으로 하나의 내부 설정 파일 "application.properties"에서 스프링이 지원하는 "프로필"으로 각 환경 별 설정을 작성하여 관리 할 수 있다. application.properties spring.config.activate.on-profile=dev url=dev.db.com my_username=dev_user password=dev_pw #--- spring.config.activate.on-profile=prod url..
스프링은 프록시 방식의 AOP를 사용합니다. 스프링 AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록하고, 스프링은 의존관계 주입시에 항상 프록시 객체를 주입합니다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하게 됩니다. 어떤 문제가 발생하는지 간단한 예시를 통해 알아보겠습니다. CallService에서 external() 메서드를 호출하는데 그 안에서 CallService 자기 자신의 메서드인 internal()을 호출하는 상황 package hello.aop.internalcall.aop; ... @Slf4j @Componen..