전체 글 118

[MSA] 메시지 브로커란? RabbitMQ와 Kafka

order-service, payment-service 아예 서로 다른 프로그램이다 따라서 자바 메서드를 직접 호출할 수 없다paymentService.pay(orderId); // X// paymentService 객체가 주문 서비스 JVM 안에 없기 떄문// 게다가 DB도 분리되어 있어서 하나의 트랜잭션도 일반적으로 불가능order-service payment-serviceOrderService PaymentServiceOrder DB Payment DBJVM A JVM BMSA에서 두 가지 선택지1. 동기 통신주문 서비스 → HTTP 요청 → 결제 서비스주문 서비스 ← 결과 ← 결제 서비스 주문 서비스가 결제 결과를 기다린다 paymentC..

[CQRS]읽기와 쓰기를 분리하는 이유

User나 Review같은 하나의 엔티티(DB 테이블과 매핑되는 자바 클래스)를 만들어서 그 엔티티로 등록하고 조회도 하고 수정도 해야 한다 대부분의 서비스에선 이정도로 충분하다 문제는 서비스가 커졌을 때 생긴다 예를들어 쇼핑몰에서는 주문 생성은 한 번 일어나는데 내 주문 조회는 사용자가 새로 고침할 때마다 마이페이지 들어갈 때마다 계속 일어난다 즉, 쓰기는 적고 읽기는 훨씬 많이 발생하는 게 일반적이다 그런데 하나의 모델, 하나의 DB로 쓰기와 읽기를 같이 처리하면 이런 일이 생긴다Join 폭발주문 상세 화면 하나 그리려면 주문, 상품, 유저, 결제, 배송 테이블을 다 엮어야 하는데 조회가 몰리면 DB CPU가 이 JOIN 연산으로 계속 바빠진다자원 경합읽기와 쓰기가 직접 서로 락을 걸지 않아도 같은 ..

[Docker] VM과 Docker의 차이부터 컨테이너 실행까지

Docker가 해결하는 문제부터 이해하자내 컴퓨터에서는 되는데요? — 이 문제를 근본적으로 없애기 위해 나온 기술이 도커다 개발 환경, 테스트 서버, 운영 서버의 OS 버전, 라이브러리 버전, 환경 변수가 미묘하게 다르면 똑같은 코드도 다르게 동작한다 Docker는 애플리케이션 + 그것이 필요로 하는 모든 것(런타임, 라이브러리, 설정 파일)을 하나의 이미지라는 패키지로 묶어서 어디서 실행하든 100% 동일한 환경을 보장한다 내가 이전에 진행했던 개인프로젝트인 CoreBoard에서 Testcontainers를 썼었는데 로컬 PC든 CI 서버든 항상 똑같은 버전의 MySQL 컨테이너가 뜬다 그 이유가 바로 이식성 때문이다핵심 개념 4개Dockerfile (설계도, 텍스트 파일) │ docker bu..

내가 실습한 Spring Cloud MSA Dependencies

프로젝트 목적 필요한 의존성 추가 작업 / 비고 eureka-server서비스 등록소implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'메인 클래스에 @EnableEurekaServer 추가product-service상품 서비스implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'Eureka에 등록됨. spring.application.name이 중요order-service주문 서비스..

Backend/🌱 Spring 2026.07.01

[Spring Cloud] FeignClient와 CircuitBreaker는 왜 같이 사용할까?

오늘은 MSA 구조에서 서로 다른 서비스끼리 통신할 때 사용하는 FeignClient와, 장애 상황을 대비하기 위한 CircuitBreaker 개념을 학습했다처음에는 FeignClient와 CircuitBreaker가 따로 노는 개념처럼 느껴졌다FeignClient는 다른 서비스를 호출하는 도구이고, CircuitBreaker는 장애가 났을 때 대체 로직을 실행하는 도구라고만 이해했다그런데 흐름을 다시 정리해보니 둘은 같이 쓰일 때 의미가 더 명확했다1. FeignClient는 다른 서비스를 쉽게 호출하게 해준다MSA에서는 주문 서비스, 상품 서비스, 유저 서비스처럼 기능별로 서버가 나뉜다예를 들어 주문 서비스에서 주문을 생성하려면 상품 정보가 필요할 수 있다 이때 주문 서비스가 상품 서비스의 API를 ..

Backend/🌱 Spring 2026.06.30

[Spring Cloud] API Gateway, Eureka, Config Server가 연결되는 흐름

오늘은 Spring Cloud에서 API Gateway, Eureka, Config Server가 각각 어떤 역할을 하고, 서로 어떻게 연결되는지 실습했다. 처음에는 설정 파일이 많아져서 헷갈렸다Gateway 설정, Eureka 설정, Config 설정이 각각 따로 있는 것처럼 보였기 때문이다. 하지만 흐름을 다시 정리해보니 핵심은 하나였다여러 서비스가 직접 서로의 주소를 외우지 않게 만들고, 공통 설정도 각 서비스 안에 흩어지지 않게 관리하는 것1. API Gateway는 서비스의 입구 역할을 한다MSA 구조에서는 주문 서비스, 상품 서비스, 유저 서비스처럼 여러 서비스가 따로 실행된다 그런데 클라이언트가 각각의 서비스 주소를 직접 알고 요청해야 한다면 관리가 너무 복잡해진다 그래서 API Gatewa..

[Architecture] MSA (Microservice Architecture)

1. MSA란 무엇인가모놀리틱 아키텍처의 한계기존 방식인 모놀리틱(Monolithic) 아키텍처는 유저, 게시글, 주문, 결제 등 모든 기능이 하나의 프로젝트에 묶여 있는 구조다. 서버도 하나, DB도 하나다.이 방식은 서비스 규모가 커질수록 심각한 문제를 드러낸다.블랙프라이데이처럼 특정 기능에만 트래픽이 몰려도 서버 전체를 확장해야 한다기능 하나를 수정해도 전체 서비스를 재배포해야 한다특정 기능의 장애가 전체 서비스 장애로 번진다MSA의 등장MSA(Microservice Architecture) 는 하나의 큰 서비스를 기능 단위의 독립된 서비스로 쪼개는 설계 방식이다.[주문 서비스] - 독립 서버, 독립 DB[결제 서비스] - 독립 서버, 독립 DB[상품 서비스] - 독립 서버, 독립 DB[유저 ..