Spring

    서킷브레이커 정리 및 resilience4j 적용기

    서킷브레이커 정리 및 resilience4j 적용기

    resilience4jMSA 환경에서 서킷브레이커, 유량제어는 매우 중요한 개념으로 보다 더 안전한 서비스 운영을 위해 사용되는 개념이다.서비스가 확장되면서 같은 팀 내에서 분리된 서비스가 한 쪽으로 의존(트래픽)을 하면서 A의 서버가 B의 API를 비동기로 호출하면서 데이터를 가져오는 상황이 발생한다.A의 서버를 개발하는 나는 몇 가지 상황을 대비해야한다.B의 서버가 죽어있다면?B의 서버가 CPU 자원 부족으로 죽기 직전이라면?B의 서버가 순간적인 에러를 뱉는다면?여기서 A서버는 B의 서버가 회복할 수 있도록 기다려줌과 동시에 장애가 전파되지 않도록 막아야한다. 여기서 내가 가져올 수 있는 것은 서킷브레이커이다.서킷브레이커란? 집에서 사용하는 두꺼비집이라 불리는 누전차단기, 회로차단기가 서킷브레이커이다..

    [Spring] @Async vs WebFlux

    Spring @Async vs Spring WebFlux 글을 작성하게된 계기 실무에서 서버간 통신을 할때 비동기로 호출해야하는 경우가 있었다. 처음에는 @Async를 사용하였는데 좀 더 깊게 파보니 Spring WebFlux도 많이 사용하는 것을 확인하고 WebFlux도 동시에 써보았는데 WebFlux가 더 빠른 것을 보았다. Spring @Async 설명 @Async 어노테이션은 Spring에서 제공하는 비동기 실행 방법으로 메서드를 별도의 스레드에서 비동기적으로 실행한다. @Async는 Spring의 AOP 기능을 활용하여 메서드 호출을 비동기적으로 처리한다. 이는 스레드 풀을 사용하여 별도의 스레드에서 실행되며, 비동기 작업의 결과 또는 상태는 Future 객체를 통해 관리할 수 있다. @Asyn..

    [Spring] 의존관계 자동 주입

    의존관계 자동 주입 형태 - 생성자 주입 - 수정자 주입(setter 주입) - 필드 주입 - 일반 메서드 주입 생성자 주입 @Autowired public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } - 특징 생성자 호출 시점에 1번만 호출되는 것이 보장 불변, 필수 의존관계에 사용 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입된다. 수정자 주입(setter 주입) @Autowired public..

    [Spring] 컴포넌트 스캔(Component Scan)

    [Spring] 컴포넌트 스캔(Component Scan)

    Component 구성요소, 독립적인 단위 모듈이다. 유저가 사용하는 시스템에 대한 조작장치를 뜻한다. 컴포넌트 스캔과 자동 의존 관계 주입 동작 1. @ComponentScan @ComponentScan은 @Component가 붙은 모듈 클래스를 스프링 빈으로 등록한다. - 빈 이름 기본 전략: CustomerServiceImpl -> customerServiceImpl - 빈 이름 직접 지정: @Component("customerService") 2. @Autowired 의존관계 자동 주입 생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다. 따라서, 생성자에 파라미터가 많아도 찾아서 자동으로 주..

    [Spring] 웹 애플리케이션과 싱글톤

    [Spring] 웹 애플리케이션과 싱글톤

    웹 애플리케이션과 싱글톤 - 스프링은 기업용 온라인 서비스 기술을 지원하기 위해 탄생하였다. - 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다. - 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContatiner(){ AppConfig appConfig = new AppConfig(); //1. 조회: 호출할때마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할때마다 객체를 생성 MemberService memberService2 = appConfi..