스프링 핵심 원리 (5) - 스프링 빈 조회와 BeanFactory
1. 개요 앞선 글에서 스프링 컨테이너를 만들고 그 안에 빈이 등록되는 과정을 살펴봤다. 이번에는 컨테이너에 등록된 빈을 확인하고 실제로 꺼내 쓰는 다양한 방법을 정리한다. 등록된 빈을 전체 조회하는 방법부터, 이름으로 찾는 가장 단순한 방법, 같은 타입의 빈이 여러 개일 때, 상속 관계에 있는 빈을 조회할 때 각각 어떻게 동작하는지 확인하고, 마지...
1. 개요 앞선 글에서 스프링 컨테이너를 만들고 그 안에 빈이 등록되는 과정을 살펴봤다. 이번에는 컨테이너에 등록된 빈을 확인하고 실제로 꺼내 쓰는 다양한 방법을 정리한다. 등록된 빈을 전체 조회하는 방법부터, 이름으로 찾는 가장 단순한 방법, 같은 타입의 빈이 여러 개일 때, 상속 관계에 있는 빈을 조회할 때 각각 어떻게 동작하는지 확인하고, 마지...
1. 개요 앞선 글에서 CQRS의 개념과 Kafka의 기초를 정리했으니, 이번 글에서는 Spring Boot로 실제 쓰기(Command)/읽기(Query) 서비스를 나눠 만들고 Kafka로 두 서비스를 연결하는 예제를 구현한다. 쓰기 서비스(cqrs_write)는 MariaDB에 도서 데이터를 저장하는 역할을, 읽기 서비스(cqrs_read)는 Mo...
1. 개요 CQRS(Command and Query Responsibility Segregation)는 데이터 저장소로부터 읽기와 업데이트 작업을 분리하는 아키텍처 패턴이다. 이름 그대로 상태를 변경하는 Command와 상태를 조회하는 Query의 책임을 나눠서, 하나의 데이터 모델이 조회와 수정을 모두 떠맡던 기존 방식의 한계를 해결하는 것이 목표...
1. 개요 여러 애플리케이션이 서로 직접 데이터를 주고받는 구조에서는 파이프라인 개수가 늘어날수록 소스 코드와 버전 관리가 복잡해지고, 타깃 애플리케이션 하나에 장애가 나면 그 영향이 소스 애플리케이션까지 그대로 전파되는 문제가 생긴다. Kafka는 이런 문제를 해결하기 위해 LinkedIn 내부 데이터 흐름을 개선할 목적으로 개발된 오픈소스 메시지...
1. 개요 앞선 글들에서는 순수한 자바 코드로 만든 AppConfig가 DI 컨테이너 역할을 했다. 이제부터는 스프링이 직접 제공하는 컨테이너인 ApplicationContext를 써볼 차례다. 이번 글에서는 이 컨테이너를 어떻게 만드는지, 그리고 만들어지는 동안 내부에서 어떤 순서로 일이 벌어지는지를 정리한다. 2. 스프링 컨테이너 생성 /...
1. 개요 이전 글에서 AppConfig를 만들어 구현 객체를 생성·연결하는 책임을 클라이언트로부터 분리했다. 이번 글에서는 이 변화를 좀 더 일반적인 용어로 정리해본다. AppConfig가 등장하면서 프로그램의 제어 흐름이 어떻게 바뀌었는지를 제어의 역전(IoC) 으로, 그 결과 객체 사이의 의존관계가 외부에서 연결되는 것을 의존관계 주입(DI) ...
1. 개요 이전 글에서 좋은 객체 지향 설계의 핵심은 다형성이고, 이를 실제로 잘 활용하기 위한 지침이 SOLID 원칙이라는 것을 정리했다. 이번 글에서는 애플리케이션에 새로운 할인 정책을 추가해보면서 다형성만으로는 OCP와 DIP를 지킬 수 없다는 것을 직접 확인하고, 이 문제를 해결하는 관심사의 분리와 AppConfig라는 개념을 통해 스프링 D...
문제 디스크 컨트롤러 문제 풀이 아이디어 운영체제의 프로세스 스케줄링 알고리즘 중 하나를 구현하는 문제로, 비선점형(Non-preemptive) 방식으로 동작하는 스케줄러를 작성해야 한다. 우선순위 큐를 이용하면 될 것 같다는 것은 운영체제를 공부한 사람이라면 어렵지 않게 알 수 있다. 굳이 운영체제를 공부하지 않았어도 우선순위가 높은 것을 먼...
1. 개요 스프링(Spring) 프레임워크는 한마디로 좋은 객체 지향 프로그래밍(OOP)을 쉽게 할 수 있도록 도와주는 프레임워크이다. 스프링이 제공하는 DI(의존관계 주입), IoC(제어의 역전) 컨테이너는 그 자체가 목적이 아니라, 개발자가 다형성을 활용해 SOLID 원칙을 지키는 애플리케이션을 만들 수 있도록 지원하는 수단이다. 2. 객체...
1. 개요 자바에서 멀티스레드 프로그래밍을 할 때 new Thread()를 통해 직접 스레드를 생성하고 관리하는 방식은 여러 한계를 지닌다. 스레드 생성과 파괴에 소요되는 오버헤드가 크고, 무분별한 스레드 생성은 시스템 자원 고갈로 이어질 수 있다. 자바 5부터 도입된 Executor 프레임워크는 이러한 스레드 생성 및 관리 작업을 캡슐화하여 개발...