목록Study/Spring Boot (14)
전공공부
모놀리스의 배경과 종류1. 모놀리스 아키텍처MSA가 생기기 전에는 존재조차 하지 않던 개념입니다.기본적으로 모든 종류의 서비스가 하나의 애플리케이션으로 구성되어있는 아키텍처를 의미합니다.DB Endpoint가 하나이므로 DB 관리 필요특징단 한줄만 코드 수정이 되더라도 애플리케이션 모두 재배포가 필요관리가 쉬워서 사용 할 수 밖에 없었음고려할 부분이 크지 않았음1 - 1.싱글모듈 아키텍처단일 모듈 내에 모든 소스가 존재함응집도와 결합도가 매우 높음설계 / 구현이 단순최상위 싱글 패키지유연성, 확장성이 제한적임1 - 2. 멀티모듈 아키텍처역할, 서비스 별로 모듈화 되어있음응집성과 결합도가 낮음모듈관 인터페이스 정의가 필요유연성, 확장성이 좋다.도메인 별로 모듈별로 별도 빌드하여 관리됩니다.쿠버네티스에 비유..
카카오페이와 일맥상통하는 Redisson 기반의 분산 락 적용기운영 중인 서비스에 분산 락 시스템을 적용하면서, 위의 카카오페이의 적용 사례를 참고 할 수 있을 것 같아 아래 사례 내역을 공유드립니다. Redisson 기반의 분산 락은 여러 서비스가 동시에 접근할 때, Redis를 통해 임계 영역의 데이터가 서로 침범되지 않도록 제어하는 데 사용됩니다. 분산 시스템에서는 이러한 충돌이 의도치 않은 결과를 초래할 수 있기 때문에, 정확하고 일관된 데이터 처리를 위해 필수적입니다. 기존 AOP 방식 코드아래는 기존에 사용하던 Aspect를 활용한 분산 락 코드입니다.// Aspect 정의@Aspect@Componentpublic class LockAspect { @Autowired private ..
문제점 Spring Security와 CompletableFuture를 함께 사용 할 시 Security Context가 null이 되는 문제가 있었습니다. 이 문제는 이런 상황에서 발생 할 수 있습니다. 아래 코드는 spring mvc - Security Context is null with CompletableFuture - Stack Overflow 비슷한 오류 상황을 가진 코드를 가져왔습니다. 저 중 getCurrentApplicationUser() 부분이 SecurityContextHolder.getContext.getAuthentication()을 부르는데 이것이 문제가 되었습니다. 이걸 부르는 곳 중에 타고 들어가면 RequestContextHolder이라는 객체가 있는데 이 객체는 Requ..

1. What is API Gateway? CNCF에서도 제시한 표준 MSA 구성 요소중 하나인 Gateway Pattern에 대해서 깊게 알아보려고 합니다. DDD 기반으로 MSA를 구성 하게 된다면 필히 이런 생각이 나실 겁니다. 서비스 별로 모든 역할을 나누는 건 알겠는데 이거 어떻게 나눠서 공통 인가처리를 하지..? 저도 처음 개인 프로젝트를 진행해보면서 JWT Token 인가처리 과정을 모든 Service에서 거쳐가야 하는데 이걸 모든 서비스에 둬서 체크를 해야 하나 싶었습니다. 하지만, 마이크로서비스를 구성 할 때 이런 부분을 모두 천재적인 선배 개발자 분들이 생각하고 만드셨습니다. API Gateway를 두고 사용하면 됩니다. 위 그림은 제가 실제로 구성중인 개인 프로젝트의 대략적인 구조를 ..

1. Spring Cloud Netflix Eureka Netflix에서 배포한 오픈 소스입니다. MSA 아키텍쳐를 구성 할 때 Client Side에서 각 서버의 Service를 연동하고 관리하는 것은 한 서버의 서비스 IP 또는, VM IP가 바뀌었을때 마다 대응이 힘들다고 판단하여서 Server 단에서 각 서비스의 IP를 관리하고 이를 사용하는 Client 단에서 각 서비스의 연동하는 name만 가져와서 사용 하게끔 합니다. 마치 K8S 내부의 Service와 같은 개념으로 각 Server를 관리하는데요. 이를 좀 더 유저 친화적으로 사용 할 수 있게끔 구현 한 것 입니다. 2. 서버 구현 Dependancy 등록 아래와 같이 의존성을 추가합니다. implementation 'org.springfr..

ReactiveRedisHashOperations @Bean public ReactiveHashOperations reactiveRedisOperations() { ReactiveRedisConnectionFactory connectionFactory = connectionFactory(); RedisSerializer stringRedisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); RedisSerializationContext serializationContext = RedisSerializationContext .n..

Personal Project 사이드 프로젝트를 진행하면서 개인적으로 공부 했던 점들을 직접 적용해보려 합니다. 사실, 팀 프로젝트로 진행을 하여야 더욱 더 개성있고 실 서비스에 가까운 프로젝트를 진행 할 수 있겠으나 아무래도 개인 프로젝트를 진행하면서 제 개인의 실력을 키우고 성장해내고 싶은 마음이 크고 제 자신의 능력을 보여주기 위해서는 개인 프로젝트 만큼 솔직 한 것이 없다고 생각합니다. (팀 프로젝트 특성상 공부하고 싶은 툴들을 제대로 쓰지 못 할 수 있고 일정에 많이 민감하기 때문에 구현하고 나서 보면 코딩 스타일 및 기본적인 틀이 잡히지 않을 가능성이 있습니다...) 따라서, 위와 같은 이유로 개인 프로젝트를 진행해보려고 합니다. 우선 Domain Driven Design + MSA를 합한 E..
String으로 바로 반환 하는 것과 Mono 의 형태로 바로 반환하는 것과 어떤 차이가 있을까요? @RestController public class TesterController { @GetMapping("/") Mono hello() { return Mono.just("Hello Webflux"); } } @RestController public class TesterController { @GetMapping("/") String hello() { return ("Hello Webflux"); } } 모노로 리턴하면 Publisher의 형태로 만들어진 객체를 Spring이 자동으로 onSubscribe 처리를 하는데 Mono가 만든 Publisher를 구독하고 이를 onNext로 진행해서 내가 진..