Spring
-
Spring Cloud Kubernetes: ConfigMap 변경 시 전체 서비스 갱신Spring/Spring 2024. 1. 10. 00:01
Kubernetes 환경에서 Spring Cloud를 사용하면 ConfigMap 변경 시 전체 서비스가 갱신되는 기능을 제공한다. 이는 spring-cloud-starter-kubernetes-client-config 라이브러리를 통해 가능하다.ConfigMap 감지Spring Cloud Kubernetes는 Kubernetes API 서버와 통신하여 ConfigMap의 변경을 감지한다. 이를 위해 Kubernetes Watch API를 사용하여 ConfigMap 리소스를 모니터링한다. Watch API는 Kubernetes 리소스의 생성, 업데이트, 삭제 등의 이벤트를 실시간으로 스트리밍한다.이벤트 수신 및 트리거ConfigMap이 변경되면, Watch API는 해당 변경 이벤트를 Spring Clou..
-
Spring Batch에서 Job Completed 이후 종료되지 않을때Spring/Spring 2023. 9. 9. 19:14
Spring Batch를 사용하여 배치 작업을 처리할 때 Job이 Completed 된 후 어플리케이션이 종료되지 않는다면, TaskExecutor 를 사용하고 있지 않은지 확인해보자. batch 에서 병렬 처리를 통해 성능을 최적화하는 것은 매우 중요하다. 이를 위해 TaskExecutor를 사용하여 병렬 작업을 수행할 수 있다. 하지만 병렬 작업이 완료된 후 애플리케이션이 정상적으로 종료되지 않는 문제를 겪을 수 있다. TaskExecutor 를 설정했다면 Job이 완료된이후 shutdown 시켜주어야 한다.TaskExecutor 설정Spring Batch에서 병렬 작업을 위해 TaskExecutor를 설정하는데 ThreadPoolTaskExecutor를 사용하여 적절한 설정을 하는 방법은 다음과 같..
-
Spring Batch 3.0 이상에서 JPA 사용시 PlatformTransactionManager 설정Spring/Spring 2023. 6. 1. 18:05
소개Spring Batch는 대용량 데이터 처리를 위한 강력한 프레임워크이다. 특히 Spring Batch 3.0 이상에서는 JPA를 사용하여 데이터베이스와 상호작용할 때 적절한 트랜잭션 관리가 중요하다. Spring Batch 3.0 이상에서 JPA를 사용할 때 PlatformTransactionManager를 설정하는 방법에 대해 알아보자.Spring Batch와 JPA 트랜잭션 관리Spring Batch에서 JPA를 사용하여 데이터베이스와 상호작용할 때는 JPA 트랜잭션 관리자를 사용하는 것이 적절하다. Spring Batch는 기본적으로 JDBC를 사용하지만, JPA와 함께 사용할 때는 JpaTransactionManager를 설정해야 한다. 이를 통해 JPA 엔티티의 상태를 관리하고, 데이터베이..
-
스프링 배치 반복 및 오류 제어Spring/Spring Boot 2022. 3. 30. 23:39
Repeat 스프링 배치에서 반복을 종료할 것인지 여부를 결정하는 세가지 항목 1. RepeatStatus 스프링 배치의 처리가 끝났는지 판별 위한 열거형 CONTINUABLE, FINISEHD 2. CompletionPolicy 정상 종료를 알리는데 사용. RepeatTemplate 의 iterate 메서드 안에서 반복을 중단할지 결정 3. ExceptionHandler 비정상 종료를 알림. RepeatCallback 안에서 예외 발생시 해당 핸들러를 참조해서 예외를 다시 던질지 여부 결정 RepeatContext - 일시적으로 사용할 필요가 있는 데이터를 저장 tasklet 을 수행하다가 예외가 발생했다고 가정하자. 이 때 ExceptionHandler를 설정했다면 반복여부를 결정 할 수 있다. 설정..
-
SubscribeOn , PublishOnSpring/Spring 2021. 12. 23. 10:28
1. SubscribeOn 와 PublishOn이 혼용된 코드 1.1. Code 1 2 3 4 5 6 Flux.range(1,5) .publishOn(Schedulers.newSingle("pub1")) .map(i -> i * 10) .subscribeOn(Schedulers.newSingle("sub1")) .log() .subscribe(); cs subscribeOn 이후에 log() 를 봐보자. 어떤 쓰레드에서 log() 가 실행될까? 리엑터 공식 문서를 보면 subscribeOn을 호출한 객체를 구독할 때는 해당 스트림 전체가 해당 스케쥴러로 다 바뀐다고 하였다. 따라서 "sub1" 이라는 쓰레드에서 실행이 될까? 아니면 그 위에 publishOn에 의해 "pub1" 이라는 쓰레드에서 실행 될..
-
스프링 트랜잭션 전파Spring/Spring Boot 2021. 11. 9. 23:59
트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 수행하면 어떻게 될까? 기존 트랜잭션과 별도의 트랜잭션을 진행해야 할까? 아니면 기존 트랜잭션을 그대로 이어 받아서 트랜잭션을 수행해야 할까? 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 한다. 참고로 스프링은 다양한 트랜잭션 전파 옵션을 제공한다. 1. 외부 트랜잭션이 수행중인데, 내부 트랜잭션이 추가로 수행됨 - 기본 전파 옵션인 REQUIRED 기준 스프링에서는 이 경우 외부 트랜잭션과 내부 트랜잭션을 묶어서 하나의 트랜잭션을 만들어준다. 내부 트랜잭션이 외부 트랜잭션에 참여하는 것이며 이것이 기본 동작이고 옵션을 통해 다른 동작방식도 선택할 수 있다. 스프링은 논리 트랜잭션과 물리 트랜잭션이라는 개념을 나눈다..
-
스프링 @Transaction 이해Spring/Spring Boot 2021. 10. 29. 12:10
스프링의 트랜잭션 우리는 선언적 트랜잭션 관리를 주로 사용하는데 @Transactional` 애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라 하며 스프링 부트로 개발한다면 주로 이 어노테이션 방법으로 개발하게 된다. @Transaction 애노테이션을 선언한다면 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션을 처리하는 프록시를 적용해준다. 구체적으로 @Transactional`애노테이션이 특정 클래스나 메서드에 하나라도 있으면 트랜잭션 AOP는 cglib 기반의 프록시 클래스를 만들어서 스프링 컨테이너에 등록한다. 따라서 실제 객체 대신에 프록시인 {클래스}$$CGLIB 을 스프링 빈으로 등록한다. 그리고 프록시는 내부에 실제 객체를 참조하게 된다...
-
Reactor List가 비어있을 때의 switchIfEmpty와 defaultIfEmptySpring/Spring 2021. 10. 14. 11:47
Reactor 에서 Mono나 Flux가 비어 있는 경우 대체 값을 제공하는 switchIfEmpty와 defaultIfEmpty 연산자는 매우 유용하다. 이 글에서는 이 두 연산자의 차이점과 사용 예제, 그리고 이를 통해 얻을 수 있는 장점을 살펴보자.switchIfEmpty와 defaultIfEmpty의 차이점switchIfEmptyswitchIfEmpty는 원래 Mono나 Flux가 비어 있을 때 (즉, Mono.empty()나 Flux.empty()인 경우) 대체 Mono나 Flux를 제공하는 연산자이다. 이는 데이터 스트림이 비어 있는 상황에서 다른 데이터 소스로 대체할 때 유용하다.fun getKeywords(info: String, key: String): Mono> { return i..