Spring Retry 적용 방법@RequiredArgsConstructor @Service public class GreetService implements GreetUseCase { private final GreetRepository greetRepository; private static final String DEFAULT_GREET = "안녕하세요."; @Retryable( retryFor = { RuntimeException.class }, noRetryFor = { NullPointerException.class, IllegalArgumentException.class }, maxAttempts = 3..
출처: https://www.geeksforgeeks.org/java/introduction-to-java-nio-with-examples/ Introduction to Java NIO with Examples - GeeksforGeeksYour All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.www.geeksforg..
DeferredResult는 Spring 3.2 이상 부터 지원하는 API로, 기존 톰캣 서블릿 기반의 비동기 처리를 지원하기 위한 도구이다. 1. Client -> Tomcat [요청] 2. Tomcat -> Thread1 [할당] 3. Thread1 -> Logic [처리] 4. Thread1 -> Tomcat [반환] 5. Tomcat -> Response [응답]Tomcat은 하나의 요청에 하나의 쓰레드가 할당되어 책임이고 처리하는 구조였다.이 경우 쓰레드 블로킹으로 자원 낭비가 발생하였고, 따라서 비동기 처리를 통해 최적화할 필요가 생겼다. 1. Client -> Tomcat [요청] 2. Tomcat -> Thread1 [할당] 3. Thread1 -..
현상Spring Web 기반의 API 응답에 Future 타입은 제네릭으로 선언한 반환 타입을 반환하지 않는다.@GetMapping("/async/future") public Future> greetAsyncFuture(@RequestParam String locale) { Locale mappedLocale = getLocale(locale); Callable> callable = () -> { String greetMessage = greetUseCase.greet(mappedLocale); return ResponseEntity.ok(greetMessage); }; return executorService.submit(call..
컨테이너컨테이너란 물리적인 하드웨어 위의 Host OS 상에 논리적인 구획을 만들고,애플리케이션 작동을 위한 라이브러리나 파일을 모아,별도의 서버처럼 사용할 수 있게 만든 것이다. Container vs VM컨테이너와 VM의 가장 큰 차이점은 응용 프로그램을 실행하는 방식의 차이다.VM은 Host OS 위에 하이퍼바이저가 올라가서 각 VM을 관리하고, VM별로 가지는 Guest OS 위에서 응용 프로그램이 수행된다.컨테이너는 Host OS 위에 컨테이너 엔진이 올라가 있고, 그 위에 컨테이너 단위로 응용 프로그램이 실행된다. 따라서 VM의 경우에는 Host OS - Hypervisor - Guest OS - App 간의 통신이 발생하여 오버헤드가 크다.컨테이너는 Host OS - Docker Engine..
서비스 운영 중에 모든 알림에 대해 발송이 안되거나 중복 발송되는 현상이 발생했다.AWS MSK와 EKS 클러스터를 운영하고 있으며, 그 외의 내용은 임의로 가정한 환경으로 포스팅한다. 서비스 구성 환경MSA 기반의 여러 마이크로 서비스가 알림 발송을 위해 Kafka로 publish하고, 이를 알림 마이크로서비스가 subscribe하는 구조이다. 시스템항목값KafkaPartition Count24Consumer Group Namegojs_groupConsumer(알림 서버)replicas4concurrency3max.poll.interval.ms300000max.poll.records500enable.auto.commitfalseackModeMANUAL문제 해결에 필요했던 기본적인 설정값은 위와 같다. ..
이전 글: https://gojs.tistory.com/72 테스트 코드의 장점 활용하기테스트 코드를 작성하는 것은 단순하게 구현된 기능을 테스트한다는 의미 이상의 효과를 발휘한다.여러 긍정적인 효과를 발휘하고 테스트 자체로도 품질 지표가 되기도 한다.그렇다면 테스트gojs.tistory.com 단위 테스트는 코드 내의 단위(클래스, 메서드) 범위를 테스트하기 때문에 다른 객체나 외부 리소스에 의존성을 가지는 경우 테스트를 작성하기 까다롭다.예를 들면 데이터베이스에 의존하는 경우 데이터베이스에 데이터가 준비되어있어야 한다던지, 테스트하고자하는 영역 이외에 신경써야할 부분이 많아진다.또한 그렇게 테스트를 진행한다고 하더라도 데이터베이스 연결까지 포함하여 테스트하기 때문에 단위 테스트보다는 통합 테스트나 기..
이전 글: https://gojs.tistory.com/70 테스트의 종류와 필요성여러가지 개발 서적을 접하다보면 단위 테스트의 필요성을 자주 강조하고 있다.그렇다면 여러 가지 종류의 테스트 중에서 단위 테스트는 무엇이며, 단위 테스트가 필요한 이유는 무엇일까? 테gojs.tistory.com 테스트 코드를 작성하는 것은 단순하게 구현된 기능을 테스트한다는 의미 이상의 효과를 발휘한다.여러 긍정적인 효과를 발휘하고 테스트 자체로도 품질 지표가 되기도 한다.그렇다면 테스트 코드를 작성함으로써 프로젝트 전반에 끼치게 되는 긍정적인 효과를 알아보자. 테스트 커버리지테스트 커버리지가 높으면 안정적으로 리팩토링이 가능하기 때문에, 이상적으로는 테스트 커버리지를 100% 달성하는 것이 좋다.테스트 커버리지를 높히기..
https://docs.spring.io/spring-boot/api/java/org/springframework/boot/context/event/package-summary.html org.springframework.boot.context.event (Spring Boot 3.4.4 API)package org.springframework.boot.context.eventdocs.spring.io위 링크를 보면 org.springframework.boot.context.event 패키지의 클래스들의 spring docs를 확인할 수 있다.스프링이 기동되는 시점에 여러 이벤트가 발생하고 필요한 경우에는 해당 이벤트의 리스너를 구현할 수도 있다. 그렇다면 이벤트의 종류를 스프링의 코드를 기반으로 학습해..
여러가지 개발 서적을 접하다보면 단위 테스트의 필요성을 자주 강조하고 있다.그렇다면 여러 가지 종류의 테스트 중에서 단위 테스트는 무엇이며, 단위 테스트가 필요한 이유는 무엇일까? 테스트 유형단위 테스트통합 테스트시스템 테스트인수 테스트테스트의 범위가 작은 것 부터 위와 같이 테스트 유형을 분류할 수 있다. 단위 테스트단위 테스트는 소스 코드의 메서드나 클래스를 테스트하여 해당 코드가 정상 동작하는지 확인한다.따라서 좋은 단위 테스트가 작성되어 있을 때 코드를 변경하는 경우, 기존 코드에 대한 영향도를 쉽게 파악할 수 있다. 통합 테스트통합 테스트는 여러 개의 컴포넌트가 정상적으로 상호작용하는지 확인한다.예를 들어 객체 간의 협력, 외부 리소스와의 연동 등을 테스트한다. 시스템 테스트시스템 테스트는 시스..