JAVA Spring 스레드 & 스케줄링

윤슬·2025년 9월 23일

스프링 스레드 & 스케줄링 정리

1. 스레드 (Thread)

  • 프로그램(프로세스) 내에서 실행되는 작업 흐름/단위
  • 하나의 프로세스에는 최소 1개의 스레드 존재
  • 자바는 main() 함수 실행 시 main 스레드 1개 포함
public static void main(String[] args) {
    SpringApplication.run(AppStart.class);
}

2. 멀티스레드

  1. main 스레드 외 새로운 작업 스레드 실행
  2. 병렬처리: 동시에 여러 작업 수행

3. 스프링 스레드

  1. 정의: 스프링 프레임워크는 기본적으로 멀티스레드(대규모) 환경
    vs Node.js: 단일스레드(소규모)

  2. 사용처:

    1. REST API: 여러 사람이 서로 다른 URL 요청 시 각각 다른 스레드 처리
      예: /member/login, /member/info 동시 요청 시 서로 다른 스레드가 처리
    2. JDBC(DAO)
    3. 동기화, 비동기화

    4. 스프링 동기화 vs 비동기화

4-1. 동기화

  • 여러 스레드가 하나의 메소드를 호출할 때 요청 순서대로 응답
  • 순서 보장
  • 메소드가 끝날 때까지 대기상태
  • 사용처: (사용자가 기다릴 필요 있는) 즉시 처리 후 결과 반환
    예: 1명의 회원가입, 로그인

4-2. 비동기화

  • 여러 스레드가 하나의 메소드를 호출할 때 처리 순서대로 응답
  • 순서 보장 안함
  • 메소드를 먼저 반환, 이후 다른 스레드(백그라운드)에서 처리
  • 사용처: (사용자가 기다릴 필요 없는)
    대량 데이터 연산, 외부 API 연동, 이메일 전송, 알림/푸시 알림, 로그 등

4-3. 비동기화 사용법

  1. AppStart 클래스 위에 @EnableAsync 어노테이션 사용 → 비동기화 활성화
  2. 비동기화 사용할 서비스 메소드 위에 @Async 어노테이션 사용 → 새로운 작업 스레드 생성, 백그라운드 실행

4-4. 스레드풀 (Thread Pool)

  • 정의: 정해진(한정된) 스레드 개수로 안정적인 병렬 작업 수행, 대량의 작업 스레드 생성 방지
  • 예시: 고객센터 직원 10명(스레드 10개)
    • 먼저 요청한 사람이 대기 중인 스레드를 점유
    • 대기 중인 직원이 없으면 요청 대기

4-4-1. 스프링 스레드풀 커스텀 방법

  1. MVC 폴더 내 config 폴더 생성 → ThreadPoolConfig 클래스 생성
  2. 클래스 위에 @Configuration 어노테이션 등록 → 스프링 컨테이너에 빈 등록(IoC)
  3. 예시 코드:
@Configuration
public class ThreadPoolConfig {
    @Bean
    public Executor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize( ? );    // 기본(최소) 실행 스레드 개수
        executor.setMaxPoolSize( ? );     // 최대 실행 스레드 개수
        executor.setQueueCapacity( ? );   // 최대 대기 개수, 초과 시 503 오류 발생
        executor.initialize();            // 스레드풀 초기화
        return executor;
    }
}

5. 스프링 스케줄링 (Scheduling)

5-1. 정의

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

5-2. 목적

  1. 백그라운드 자동 실행
  2. 자동화 구현

5-3. 사용법

  1. AppStart 클래스 위에 @EnableScheduling 어노테이션 작성
  2. 백그라운드에서 실행할 서비스 메소드 위에 @Scheduled 어노테이션 작성
  3. 패턴 종류:
    • @Scheduled(fixedRate = 밀리초)
    • @Scheduled(fixedDelay = 밀리초)
    • @Scheduled(cron = "초 분 시 일 월 요일") → 권장 (서버/PC 시스템 기준)

5-4. cron 패턴

  • 형식: @Scheduled("* * * * * *")
    1. 첫번째 * : 초 0 ~ 59
    2. 두번째 * : 분 0 ~ 59
    3. 세번째 * : 시 0 ~ 23
    4. 네번째 * : 일 1 ~ 31
    5. 다섯번째 * : 월 1 ~ 12
    6. 여섯번째 * : 요일 0 ~ 6 (0=일요일, 1=월요일, …, 6=토요일)

5-5. 예시

// 주말(일/토) 오전 10시
@Scheduled(cron = "0 0 10 * * 0,6")

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

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

5-6. 주의할 점

  1. 백그라운드 기반 처리이므로 HTTP Response 응답 불가
    • REST Controller 없이 실행되므로 응답할 수 없음
  2. 해결 방안
    • HTTP 통신(연결 비 유지) 대신 Socket(연결 유지) 방식으로 응답 처리 가능
profile
우상향그래프

0개의 댓글