Java
-
Spring Boot 3 에서 동적 스케줄링이 필요해 어떤 방법으로 할까 고민하다가 비동기 형태의 방식으로ThreadPool 을 만들어 실행했다. 어플리케이션의 메인쓰레드, TaskScheduler 의 쓰레드, TaskExecutor 쓰레드는 각각 다른Thread Pool 을 만들어놓고 사용한다. 여기서 @Async 는 TaskExecutor 의 쓰레드를 사용해 비동기 처리한다. 1. @Async 사용을 위한 Config 설정package com.deotis.wisevoiceweb.system.config;import java.util.concurrent.Executor;import org.springframework.context.annotation.Bean;import org.springframewo..
Spring Boot @Async 어노테이션과 비동기 설정Spring Boot 3 에서 동적 스케줄링이 필요해 어떤 방법으로 할까 고민하다가 비동기 형태의 방식으로ThreadPool 을 만들어 실행했다. 어플리케이션의 메인쓰레드, TaskScheduler 의 쓰레드, TaskExecutor 쓰레드는 각각 다른Thread Pool 을 만들어놓고 사용한다. 여기서 @Async 는 TaskExecutor 의 쓰레드를 사용해 비동기 처리한다. 1. @Async 사용을 위한 Config 설정package com.deotis.wisevoiceweb.system.config;import java.util.concurrent.Executor;import org.springframework.context.annotation.Bean;import org.springframewo..
2025.05.21 -
Runnable 인터페이스란?작업(Task)을 정의하기 위한 함수형 인터페이스이다.주로 스레드에서 실행할 작업을 정의할 때 사용된다. @FunctionalInterfacepublic interface Runnable { void run();} 추상 메서드인 void run() 메서드만 존재한다.@FuntionalInterface 가 붙어있는 함수형 인터페이스라서 람다식으로 표현 가능하다.결과값이 없고 예외도 throws 하지 않는 단순한 실행 작업을 나타낸다. ✅ 언제 사용하나요? Thread 생성 시 실행할 작업 정의ExecutorService 같은 스레드 풀에 작업 제출할때 사용 ✅ Thread와 함께 사용하는 예 일반 클래스package com.obo.controller;public cl..
Runnable 인터페이스, ExecutorService 인터페이스Runnable 인터페이스란?작업(Task)을 정의하기 위한 함수형 인터페이스이다.주로 스레드에서 실행할 작업을 정의할 때 사용된다. @FunctionalInterfacepublic interface Runnable { void run();} 추상 메서드인 void run() 메서드만 존재한다.@FuntionalInterface 가 붙어있는 함수형 인터페이스라서 람다식으로 표현 가능하다.결과값이 없고 예외도 throws 하지 않는 단순한 실행 작업을 나타낸다. ✅ 언제 사용하나요? Thread 생성 시 실행할 작업 정의ExecutorService 같은 스레드 풀에 작업 제출할때 사용 ✅ Thread와 함께 사용하는 예 일반 클래스package com.obo.controller;public cl..
2025.05.16 -
Spring 의 @Scheduled 어노테이션을 통해 정적 스케쥴링은 해봤으나DB 데이터 기반으로 동적스케쥴링을 설정 해본적이 없어 진행한다. SchedulingConfigurer 란?Spring 의 스케줄링 설정을 프로그래밍적으로 커스터마이즈할 수 있게 해주는 인터페이스이다.@EnableScheduling 어노테이션과 함께 사용되며 스케줄링 작업을 코드 기반으로 등록할 수 있게해주는 인터페이스다. 주요 특징동적 스케줄링 설정 가능@Scheduled 어노테이션의 정적 스케쥴링 한계 극복런타임에 스케줄 작업 추가/수정✅ 언제 사용하나? 상황 사용 이유 @Scheduled가 부족할 때실행 주기를 DB에서 동적으로 제어하거나, 조건적으로 등록/제거하고 싶을 때여러 작업을 코드로 한꺼번에 등록하고 싶을 때코드..
Spring Boot 3 동적 스케줄링 설정해보기Spring 의 @Scheduled 어노테이션을 통해 정적 스케쥴링은 해봤으나DB 데이터 기반으로 동적스케쥴링을 설정 해본적이 없어 진행한다. SchedulingConfigurer 란?Spring 의 스케줄링 설정을 프로그래밍적으로 커스터마이즈할 수 있게 해주는 인터페이스이다.@EnableScheduling 어노테이션과 함께 사용되며 스케줄링 작업을 코드 기반으로 등록할 수 있게해주는 인터페이스다. 주요 특징동적 스케줄링 설정 가능@Scheduled 어노테이션의 정적 스케쥴링 한계 극복런타임에 스케줄 작업 추가/수정✅ 언제 사용하나? 상황 사용 이유 @Scheduled가 부족할 때실행 주기를 DB에서 동적으로 제어하거나, 조건적으로 등록/제거하고 싶을 때여러 작업을 코드로 한꺼번에 등록하고 싶을 때코드..
2025.05.15 -
ShedLock 이란?Java 에서 ShedLock 은 분산 작업 환경에서 스케쥴러가 동시에 여러 인스턴스에서 실행되는 것을 방지하기 위해사용하는 분산 락 라이브러리다.쉽게 말해 Java 에서 스케쥴러가 돌고 있다고 치면 동시에 여러 스케쥴러가 같은 시간에 같은 동작을 하면안되기 때문에 Lock 을 걸어 같은 작업을 동시에 못하도록 막아버린다. 예를 들어 Spring Boot 어플리케이션이 이중화되어 2대가 있다고 하면@Scheduled 어노테이션이 존재하는 클래스가 2개가 존재하고 작업을 실행했을 때별도의 조치가 없다면 2개의 스케쥴 작업이 진행된다. 이때 데이터 중복 처리나 성능 문제가발생할 수 있기 때문에 ShedLock 을 사용하여 Lock 을 걸어 동시성 문제를 해결한다. 🔧 동작 원리 1...
Java ShedLock 이란?ShedLock 이란?Java 에서 ShedLock 은 분산 작업 환경에서 스케쥴러가 동시에 여러 인스턴스에서 실행되는 것을 방지하기 위해사용하는 분산 락 라이브러리다.쉽게 말해 Java 에서 스케쥴러가 돌고 있다고 치면 동시에 여러 스케쥴러가 같은 시간에 같은 동작을 하면안되기 때문에 Lock 을 걸어 같은 작업을 동시에 못하도록 막아버린다. 예를 들어 Spring Boot 어플리케이션이 이중화되어 2대가 있다고 하면@Scheduled 어노테이션이 존재하는 클래스가 2개가 존재하고 작업을 실행했을 때별도의 조치가 없다면 2개의 스케쥴 작업이 진행된다. 이때 데이터 중복 처리나 성능 문제가발생할 수 있기 때문에 ShedLock 을 사용하여 Lock 을 걸어 동시성 문제를 해결한다. 🔧 동작 원리 1...
2025.05.13 -
환경 : Spring Boot 3, HikariCPSpring Boot 에서 DBCP 의 Connection Pool 에서 풀 안의 커넥션이 유효한지에 대한 쿼리문을 날리는데그게 ValidationQuery 이다.해당 쿼리문의 시간을 설정하고 로그로 확인하기 위해 작성하는 글이다. 1. pom.xml 에 log4j2 dependency 추가하기 org.springframework.boot spring-boot-starter-log4j2 2. Spring Boot 기본 logback 제외하기Spring Boot 의 기본 log 라이브러리인 logback 을 제외시킨다. org.springframework.boot spring-boot-starter org.springframewo..
Spring Boot log4j2 설정하기 (Spring Boot3, HikariCP)환경 : Spring Boot 3, HikariCPSpring Boot 에서 DBCP 의 Connection Pool 에서 풀 안의 커넥션이 유효한지에 대한 쿼리문을 날리는데그게 ValidationQuery 이다.해당 쿼리문의 시간을 설정하고 로그로 확인하기 위해 작성하는 글이다. 1. pom.xml 에 log4j2 dependency 추가하기 org.springframework.boot spring-boot-starter-log4j2 2. Spring Boot 기본 logback 제외하기Spring Boot 의 기본 log 라이브러리인 logback 을 제외시킨다. org.springframework.boot spring-boot-starter org.springframewo..
2025.04.30 -
Spring Security 5 에서 6 버전으로 넘어가면서 변경된 SecurityContextPersistenceFilter 와 SecurityContextHolderFilter 를알아보자 SecurityContextPersistenceFilter 인증 처리 과정요청이 들어오면 SecurityContextRepository.loadContext() 를 호출해서 기존 인증 정보를 로딩한다.=> 인증정보가 들어있는 SecurityContext를 가져옴로딩된 SecurityContext를 SecurityContextHolderStrategy.setContext() 로 ThreadLocal 에 저장함=> SecurityContextHolderStrategy 는 실제로 ThreadLocalSecurityCont..
Spring Security 5에서 6로 변경된 필터 확인하기(SecurityContextPersistenceFilter, SecurityContextHolderFilter)Spring Security 5 에서 6 버전으로 넘어가면서 변경된 SecurityContextPersistenceFilter 와 SecurityContextHolderFilter 를알아보자 SecurityContextPersistenceFilter 인증 처리 과정요청이 들어오면 SecurityContextRepository.loadContext() 를 호출해서 기존 인증 정보를 로딩한다.=> 인증정보가 들어있는 SecurityContext를 가져옴로딩된 SecurityContext를 SecurityContextHolderStrategy.setContext() 로 ThreadLocal 에 저장함=> SecurityContextHolderStrategy 는 실제로 ThreadLocalSecurityCont..
2025.04.22