Develop/Java & Spring 22

[MSA] MSA 전환 프로젝트 - 9. 분산 트랜잭션 (2) with Kafka

1.Kafka란?Kafka는 '대규모 실시간 데이터 스트리밍'을 처리하는 데 사용되는 '분산 이벤트 스트리밍 플랫폼'이다.이렇게 단어들을 나열해 놓으면 이해하기 힘들 수 있으니 하나하나 짚어보자우선 '대규모 실시간 데이터 스트리밍'이란 실시간으로 발생하는 큰 양의 데이터를 지속적이고 빠르게 처리하는 것을 의미한다.예를 들면,SNS에서의 실시간 사용자 활동 기록온라인 쇼핑몰의 주문 결제 이벤트IoT 센서에서 발생하는 대량의 데이터 수집과 같은 순차적으로 끊이없이 생성되는 데이터를 최소한의 지연만으로 대규모의 데이터를 실시간으로 처리하고 여러 시스템으로 데이터를 효율적으로 전달하는데 특화되었다는 뜻이다.그리고 '분산 이벤트 스트리밍 플랫폼'에서'분산 이벤트'는 여러 시스템(서버, 애플리케이션 등)이 참여하여..

[MSA] MSA 전환 프로젝트 - 8. 분산 트랜잭션 (1) with SAGA 패턴

0. 들어가기 전기존의 모놀리식 구조에서는 각 도메인뿐만 아니라 도메인을 영속화하는 DB까지 하나의 애플리케이션에 존재했다.따라서, 두 개 이상의 서비스를 거쳐야하는 프로세스에서도 DBMS가 기본적으로 제공하는 트랜잭션 기능을 통해 한 번에 트랜잭션으로 묶어 원자성과 일관성을 유지할 수 있었다.하지만, MSA 환경에서는 각 서비스가 별도의 애플리케이션으로 동작하며, 각 서비스는 자체 DB를 가지는 경우가 많다.이로 인해 A 서비스의 DB에서 발생한 변경 사항을 B 서비스의 DB에 반영하려고 할 때는 두 서비스 간 통신 방식과 트랜잭션 처리가 중요한 과제가 된다.이전에 우리는 OpenFeign을 활용해 서비스 간 통신을 구현해 본 적이 있다.하지만 OpenFeign은 HTTP 기반 통신을 단순화하는 동기식..

[MSA] MSA 전환 프로젝트 - 7. 서비스 장애 처리(Circuit Breaker) with Resilience4J

1. 서비스 장애 처리는 왜 필요한가?이전 포스트에서 MSA의 마이크로 서비스 간 통신에 대해 알아보았는데 이렇게 현재 외부에서 필요한 데이터를 요청하는 구조를 가진 MSA에서 만약 데이터를 요청해야 하는 해당 서버에 장애가 생긴다면 어떤 일이 일어날까?이전 포스트의 예시처럼 user-service와 order-service 간 통신을 예로 들어 설명해보겠다.클라이언트 측에서 user의 정보 API 요청API Gateway에서 user-service로 요청 라우팅user-service에서 userDto에 포함되어야 하는 orderList를 받아오기 위해 order-service로 OpenFeign을 이용해 요청order-service의 orders DB에서 해당 user의 userID와 일치하는 orde..

[MSA] MSA 전환 프로젝트 - 6. 마이크로 서비스 간 통신 with Spring Cloud OpenFeign

프로젝트를 도메인 별로 각각의 마이크로 서비스로 만들어 Service Registry에 등록도 해보았고 등록된 서비스를 Api Gateway를 통해 하나의 진입점을 통해서 접속할 수 있도록 만들어 놓기도 했다.각각의 서비스는 분리해 놓으니 오히려 필요한 부분만 갖게 되어 혼자서는 이전보다 더 잘 동작하는 상황이 되었지만하나의 애플리케이션이 아닌 서비스 별로 각각 기동되는 애플리케이션끼리 필요한 데이터를 어떻게 주고받아야 하는가 하는 문제에 도달하게 되었다.1. 서비스 간 통신 방식의 종류서비스 간 통신을 하기 전에, 어떤 통신 방식이 있고 그 중 어떤 것을 활용해 볼지에 대해서 먼저 알아보자.서비스 간 통신의 종류는 크게 동기 방식과 비동기 방식으로 나뉘게 된다.동기 방식RestTemplateOpenFe..

[MSA] MSA 전환 프로젝트 - 5. Spring Cloud Bus

이전 포스트에서 Spring Cloud Config를 설정해 봤다.그럼 이제 Spring Cloud config 설정도 끝났겠다 외부의 설정파일을 마음대로 수정하면 처음에 말했던 대로 기동중인 애플리케이션의 설정 정보들이 실시간으로 바뀌게 될까?애석하게도 그렇지가 않다.바뀐 설정 정보가 적용되기 위해서는서비스 재기동Actuator RefreshSpring Cloud Bus이렇게 세 가지 방법이 필요한데 이 중에 서비스를 재기동 하는 방법은 애플리케이션을 끄고 설정을 변경하는 것과 다르지 않기 때문에 아래 두 가지 방법을 사용해야 한다.두가지 방법 모두 실습을 해볼 예정이기 때문에 우선은 Actuator Refresh를 활용하는 방법에 대해 먼저 알아보겠다.1. Actuator Refresh1-1. Dep..

[MSA] MSA 전환 프로젝트 - 4. Spring Cloud Config

1. 설정 파일 관리의 필요성현재 마이크로 서비스들의 설정 파일들은 각각의 애플리케이션 내부에 존재한다.이렇게 설정 파일들이 각 마이크로 서비스 내부에 존재하는 경우 생산성, 운영적 측면에서 문제가 발생하게 되는데예를 들어1. 성능 테스트를 위해 설정 파일에서 어떤 설정의 수치를 조절해가며 테스트해야 하는 상황이런 상황에서 애플리케이션 내부에 설정파일들이 존재한다면 어떤 일이 일어날까?수치를 한 번 조정하고 테스트할 때마다 애플리케이션을 새로 빌드하고 배포해야하는 과정이 필요하게 된다.단지 설정 값을 조정하는 작업 하나 때문에 애플리케이션을 다시 빌드하고 배포해야 하는 것이다.2. 여러 설정 파일에 공통으로 있는 어떤 설정 값을 변경해야 하는 상황이런 상황은 또 어떨까?예를 들어 인증을 위한 시크릿키를 ..

[MSA] MSA 전환 프로젝트 - 3. API Gateway & Spring Cloud Gateway

Chapter 2에서는 Service Discovery의 개념과 Eureka 라이브러리를 활용하여 Client-Side Discovery를 구현하고, 각 서비스의 연결 정보를 관리하는 체계를 구축하였다.이번 글에서는 이렇게 Eureka에 등록된 여러 서비스를 외부 클라이언트가 사용할 수 있도록 애플리케이션에 진입하는 API Gateway에 대해 알아보고, 이를 활용한 예제를 구현하려고 한다.1. API Gateway란?해당 개념에 대해 Chapter1에서 간략하게 소개한 적이 있다.Monolithic Architecture에서는 하나의 애플리케이션만 존재했기 때문에 모든 요청이 하나의 애플리케이션에 전달되면 되었다.그러나 MSA에서는 서비스 별로 애플리케이션이 분리되었기 때문에 클라이언트의 요청에 대해서..

[MSA] MSA 전환 프로젝트 - 2. Service Discovery & Eureka

저번 게시글에서는 MSA가 무엇이고 Monolithic Arcitecture나 SOA와는 어떤 부분이 다른지 알아보았다.이번에는 MSA에서 서비스간 통신을 하기 위한 핵심 기술인 Service Discovery 패턴이 무엇인지 그리고 그것을 어떻게 실제로 적용할 수 있는지 알아보고자 한다.01. Load Balancer 와 Load BalancingService Discovery가 무엇인지 알아보려면 Load Blancer가 어떤 것인지부터 알아야할 필요가 있다.2010년대 이후 소프트웨어 아키텍처는 Fragile한 Monolithic Arcitecture에서 Anti-Fragile한 Cloud Native Architecture로 점점 변해왔다.이 Cloud Native Architecture의 큰 특..

[MSA] MSA 전환 프로젝트 - 1. MSA란?

현재 진행중인 게시판 프로젝트의 버전업을 위해 기능 추가 말고 어떤 걸 할 수 있을까 고민하다가 예전에 얼핏 듣고 넘어갔던 MSA를 현재 프로젝트에 적용해 보기로 했다.Board와 Member 그리고 인증을 위한 JWT와 OAUTH로 이루어진 아주 작은 프로젝트지만 이 상태에서 MSA로 전환을 해보는 것이 MSA를 이해하는 데도 분명히 도움이 될 것이고 새로운 기능을 추가하고 확장해 나가는 것도 좋은 경험이 되리라 생각해서 지금 한 번 해보기로 했다.이제 실전으로 들어가기 전에 현재 프로젝트에서 사용중인 Monolithic Architecture는 무엇이고 MSA는 또 무엇인지 알아보는 것으로 시작해보자1. Monolithic Architecture란?지금 만들어진 프로젝트와 같이 규모가 작고 트래픽이 ..

[Spring Boot] 게시판 프로젝트 v2.0 - JWT를 이용한 회원가입 및 로그인 구현 #6 Config, Filter, DTO, Contoller

JWT 프로젝트도 이제 마무리에 다다랐다.Service를 구현한 것으로 굵직한 로직은 마무리 했기 때문에 이제는 실질적으로 클라이언트와 통신하기 위한 설정들을 해주면 된다.1. Configcom.security_board.config.DataConfigpackage com.security_board.config;@Configuration@RequiredArgsConstructor@EnableJpaRepositories(basePackages = { "com.security_board.board.repository", "com.security_board.security.member.repository" })@EnableRedisRepositories(basePackages = "com.security_b..