Spring Kafka (2) - Transactional Outbox로 CQRS 이벤트 안전하게 발행하기
Spring Kafka (1)에서는 KafkaTemplate 으로 메시지를 보내고 @KafkaListener 로 받는 가장 기본적인 흐름을 정리했다. 하지만 실제 서비스에서 "DB에 데이터를 저장하고, 그 사실을 Kafka로 알린다"는 요구사항을 곧이곧대로 구현하면 문…
CATEGORY
23개의 글
Spring Kafka (1)에서는 KafkaTemplate 으로 메시지를 보내고 @KafkaListener 로 받는 가장 기본적인 흐름을 정리했다. 하지만 실제 서비스에서 "DB에 데이터를 저장하고, 그 사실을 Kafka로 알린다"는 요구사항을 곧이곧대로 구현하면 문…
Kafka를 애플리케이션에 연결하려면 Producer와 Consumer의 클라이언트 설정, 직렬화 방식, 리스너 실행 등을 준비해야 한다. Spring Kafka는 이 과정을 Spring의 빈과 애노테이션으로 구성할 수 있게 해 주는 프로젝트다. 이번 글에서는 Spri…
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) 환경에서 웹 애플리케이션을 개발할 때 가장…
Spring MVC 는 Spring 프레임워크에서 제공하는 웹 애플리케이션 개발용 서블릿 기반 MVC(Model View Controller) 프레임워크 이다. 웹 요청을 받아 적절히 처리하고, 그 결과를 클라이언트(브라우저, 앱 등)에게 응답으로 돌려주는 전체적인 웹…
https://spring.io/guides/gs/rest hateoas Spring HATEOAS로 구현하는 하이퍼미디어 기반 REST Web Service REST API를 다루다 보면 단순히 데이터(JSON)만 반환하는 방식을 넘어, 클라이언트가 다음 동작을 수행…
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…