본문 바로가기

Spring

(12)
10분만에 구현하는 CircuitBreaker Spring AOP를 활용하여 CircuitBreaker를 구현해 보자. Annotation 기반의 AOP를 활용하기 위해 Annotation과 Aspect를 다음과 같이 만들어주자. @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CircuitBreaker {} @Aspect @Component public class CircuitBreakerAspect { @Around("@annotation(com.ms.circuitbreaker.CircuitBreaker)") public Object round(ProceedingJoinPoint joinP..
WebFlux에서 micrometer로 모니터링 데이터 수집하기 환경설정 필자는 gradle을 사용했고, 아래와 같이 webflux, actuator, prometheus 등의 dependency 설정이 필요하다 dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-webflux' runtimeOnly 'io.micrometer:micrometer-registry-prometheus' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementa..
JPA를 이용하여 cursor 기반 페이징 구현 언젠가부터 무한 스크롤을 이용한 페이징 방식이 우리들에 스며들기 시작했다. 이는 과거의 1, 2, 3... 의 페이지를 클릭하여 다음 콘텐츠를 보는 것이 아니라, 페이스북처럼 마지막 콘텐츠를 보게 되면 다음 페이지가 로딩되어 보이는 것을 의미한다. 그러나 SNS에서는 일반적으로 사용하는 Offset 기반의 페이징을 사용하게 되면 문제가 생길 수 있다. Offset Based Pagination SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 0, 10; SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 10, 10; SELECT * FROM BOARDS ORDER BY ID DESC LIMIT 20, 10; 위의 쿼리를 해석해보면 최신 게시글의 ..
Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까? 위 그림은 DZone 게시글 중 하나인 Spring WebFlux를 이용한 Boot2와 Spring MVC를 이용한 Boot1을 비교한 그래프이다. 해당 그래프에서는 두 가지 특징을 볼 수 있다. 첫 번째로는 유저가 적을 때에는 성능에 별반 차이가 없다. 두 번째로는 유저가 늘어나면 늘어날수록 극명한 성능 차이를 보여주고 있다. 어떻게 이런 차이가 일어날 수 있을까? 본글은 아래의 구성을 가지고 있다. I/O Event-Driven Spring Framework 먼저, 1과 2를 통해서 원리를 알아본 다음 3에서 이를 접목시켜서 위의 그래프가 나올수 있는 이유를 설명할 것이다. I / O Why was Spring WebFlux created? Part of the answer is the need f..
Spring Cache 구현 원리 Spring Cache 구현방식에 대해서 살펴보자. 최근 회사에서 spring-cache의 @Cacheable을 사용하게되었다. 사용하다 보니 토비의 스프링에서 본 관심사의 분리와 AOP와 겹쳐서 머릿속의 생각을 코드와 글로 써보려 한다.글로 다 표현하기에는 한계가 있는 듯하니 Github source와 함께 보면 좀 더 도움이 될 것 같다. 그리고 Test code도 작성하였으니, 이걸통해서 Test를 하면 될 것 같다. (단, cache의 유무만 중요하기에 assert문은 작성하지 않고, log만 찍었다.)요구사항은 다음과 같다. 나는 글로벌 게임을 만들고 있고, 유저들에게 웹사이트에서 랭킹을 보여주어야 한다. 단, 이용자는 100만명을 넘기때문에 모든 이용자를 Scan해서 순위를 실시간으로 보여주기..
Dubbo Spring Boot Apache Dubbo고성능, 가벼운 Java 기반 오픈 소스 RPC 프레임워크Interface 기반의 원격 호출(remote call)fault tolerance, load balancingService 자동 등록 및 감지 (Service Registry)RPC란?Remote Procedure Call외부 서비스를 함수나 메소드를 통해 호출하는 형태부가설명 분산서비스시 외부 서비스는 주로 HTTP를 통해 호출을 한다. 그리고 Application 레벨에서 header, body를 조작한다. 그러나 RPC는 마치 메소드를 호출하듯이 외부 서비스를 사용할 수 있는 간편함을 가지고 있다.백문이 불여일타! 직접 코드를 작성해보자. 필자는 Spring boot와 편의상 maven 멀티모듈 구조를 통해서 코드를 ..
AOP에 걸린 Method의 Parameter 이름 가져오기 먼저, AOP가 뭔지에 대해 알아보자.Aspect-Oriented Programming 이란 프로그램 구조에 대해 또 다른 사고방식을 제공함으로써 Object-Oriented Programming을 보완한다. OOP 모듈성의 핵심 단위는 클래스인 반면, AOP는 모듈화 단위가 관점(Aspect)이다. @Transactional이 대표적인 예이다. 공통의 기능(트랜잭션)을 분리 및 모듈화하여 여러 코드(insertUser, selectMoney)에 쉽게 적용할 수 있게 해준다. 특정 계정의 ID와 token을 통해 유효한지 확인하는 코드가 프로젝트 전반에 산재해 있다고 가정을 해보자. 그리고 이를 비즈니스 코드와는 크게 관계없는 하나의 공통된 관점으로 판단을 하고, AOP를 적용시켜보자. 자세한 코드는 g..
Spring Boot 1으로 Todo List를 만들어 보자 이번 게시글에서는 Todo List 만들기에 앞서 간단하게 세팅과 필수적인 기능들을 살펴보도록 하자. 대상은 Spring Project는 해봤으나 Boot는 접하지 못한 분들이다. Spring의 개념적인 부분보다는 동작하는 기능에 무게중심을 둘 예정이다.개념에 좀 더 관심이 있다면, 토비의 스프링이나 공식 문서를 확인하도록 하자. ( Spring Project, Spring Boot )개발 환경은 Mac OS와 Intellij로 진행이 되지만 Window나 이클립스를 쓰더라도 충분히 따라올 수 있을 것으로 보인다. 코드는 Github에 있으니 같이 보면서 하는 것이 도움이 될 것 같다. (본문코드와 조금 다를 수도 있다.) 이 포스팅은 크게 Project 생성, API구현, Test Code 작성 3가지..