Spring_10_Spring Threading & Scheduling

OngTK·2025년 9월 15일

Spring

목록 보기
10/25

🧵 Thread & Spring Threading & Scheduling


✅ Thread

📌 정의

  • 프로그램(프로세스) 내에서 실행되는 작업의 단위 또는 흐름
  • 하나의 자바 프로세스에는 최소 1개의 스레드가 존재
  • 자바는 main() 함수 실행 시 main 스레드 1개가 자동 실행됨

✅ Multi-Thread

📌 정의

  • main 스레드 외에 새로운 작업 스레드를 실행하는 방식
  • 병렬 처리를 통해 동시에 여러 작업을 수행

✅ Spring Thread

📌 특징

  • Spring Framework는 기본적으로 Multi-Thread 환경을 지원
  • 비교: Node.js는 단일 스레드 기반으로 소규모에 적합

📌 사용처

  1. REST API
    • 여러 사용자가 서로 다른 URL 요청 시, 각각의 요청을 다른 스레드로 처리
  2. JDBC
  3. 동기화 / 비동기화 처리

🔄 Spring 동기화 vs 비동기화

✅ 동기화 (Synchronous)

📌 정의

  • 여러 스레드가 하나의 메소드를 호출할 때, 요청 순서대로 처리하는 방식

📌 특징

  • 순서 보장
  • 메소드가 끝날 때까지 대기 상태
  • Spring은 기본적으로 동기화 방식을 사용

📌 사용처

  • 즉시 처리 후 결과를 반환해야 하는 경우

✅ 비동기화 (Asynchronous)

📌 정의

  • 여러 스레드가 하나의 메소드를 호출할 때, 처리 순서와 관계없이 응답하는 방식

📌 특징

  • 순서 보장 없음
  • 메소드 결과를 먼저 반환하고, 백그라운드 스레드에서 처리

📌 사용처

  • 사용자가 기다릴 필요 없는 작업
    • 대량 데이터 연산
    • 외부 API 연동
    • 이메일 전송
    • 알림(Push)
    • 로그 기록 등

📌 사용법

// [1] AppStart 클래스에 비동기 활성화

@SpringBootApplication
@EnableAsync // 비동기 사용 활성화 Annotation
public class AppStart {
    public static void main(String[] args) {
        SpringApplication.run(AppStart.class);

    } // main end
} // class end

//==========================================================================//

// [2] Service 클래스의 메소드에 비동기 처리

@Service
public class ThreadService {
    @Async      // 비동기화 Annotation
    // AppStart의 @EnableAsync 와 세트
    // 단, Thread.sleep으로 결과 처리 전, 비동기로 결과를 선반환 후 service 내에서 연산은 진행
    public void thread2() {
        int result = 0 ;
        for(int i = 1 ; i <= 10 ; i ++ ){
            try{
                result += i;
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println("ThreadService.thread2 " + e);
            }
        } // for end        
    } // func end
} // class end

🧵 Thread Pool

📌 정의

  • 한정된 스레드 개수 내에서 작업을 처리하는 방식

📌 목적

  • 대량의 작업 스레드 생성 방지
  • 안정적인 병렬 작업 수행

📌 Spring Thread Pool 설정 예시

@Configuration // Spring Container에 Bean 등록
public class ThreadPoolConfig {

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);    // 기본 스레드 수
        executor.setMaxPoolSize(10);    // 최대 스레드 수
        executor.setQueueCapacity(20);  // 대기열 수용량, 대기열 초과시 503 오류 코드 발생
        executor.initialize();          // 초기화, 서버 재실행마다 초기화
        return executor;
    }
}

⏰ Spring Scheduling

📌 정의

  • 일정한 간격으로 특정 서비스를 자동 실행하는 기능

📌 목적

  • 백그라운드 자동 실행
  • 반복 작업 자동화

📌 사용법

// [1] AppStart 클래스에 스케줄링 활성화
@SpringBootApplication
@EnableScheduling       // 스케쥴링 활성화 어노테이션
public class AppStart {
    public static void main(String[] args) {
        SpringApplication.run(AppStart.class);
    } // main end
} // class end

//==========================================================================//

// [2] Service 클래스의 메소드에 스케줄링 설정
@Service
public class ScheduleService {

    // [1] 3초마다 자동 실행하는 서비스 메소드
    @Scheduled( fixedRate = 3000 )
    // (unit : milli-sec)
    // value 자리에 변수 사용 x , 상수(final)은 사용 가능
    public void task1(){
        System.out.println("[ 3초 ] ScheduleService.task1");
    } // func end
    // 비동기방식, 멀티스레드 사용 >> background에서 작동

    
    // [2] 5초마다 자동 실행하는 서비스 메소드
    @Scheduled(fixedRate = 5000)
    public void task2(){
        System.out.println("[ 5초 ] ScheduleService.task2");
    } // func end
    

    // [3] 시스템 날짜/시간 기준으로 자동 실행 스케쥴링
    // 시스템의 매 시간 (X:X:05)가 될 때마다 자동 실행되는 메소드
    // unit : sec min hr day month week
    @Scheduled( cron = "0/5 * * * * *")
    // */5 : 5초 마다 실행
    // 0/5 : *분 5초가 될때 마다 실행
    public void task3(){
        System.out.println(" [ 5초 ] ScheduleService.task3");
    }
    

    @Scheduled( cron = "0 */1 * * * *")
    // 매 1분 0초 마다 실행
    public void task4(){
        System.out.println(" [ 1분 ] ScheduleService.task3");
    }
    
}

📌 패턴 종류

어노테이션설명
@Scheduled(fixedRate = 1000)1초마다 실행 (단위: ms)
@Scheduled(fixedDelay = 1000)이전 작업 종료 후 1초 뒤 실행
@Scheduled(cron = "* * * * * *")cron 표현식 기반 실행

📌 cron 표현식 설명

위치의미범위
10–59
20–59
30–23
41–31
51–12
6요일0(일)–6(토)

📌 예시

// 주말 오전 10시마다 실행
@Scheduled(cron = "0 0 10 * * 0,6")

// 일요일 오전 9시마다 실행
@Scheduled(cron = "0 0 9 * * 0")

// 매월 1일 오전 8시마다 실행
@Scheduled(cron = "0 0 8 1 * *")

⚠️ 주의점

  • Scheduling은 백그라운드 기반 처리이므로 HTTP 응답 불가
  • 해결방안: Socket 통신 또는 DB 저장 후 조회 방식 사용
profile
2025.05.~K디지털_풀스택 수업 수강중

0개의 댓글