🧵 Thread & Spring Threading & Scheduling
✅ Thread
📌 정의
- 프로그램(프로세스) 내에서 실행되는 작업의 단위 또는 흐름
- 하나의 자바 프로세스에는 최소 1개의 스레드가 존재
- 자바는
main() 함수 실행 시 main 스레드 1개가 자동 실행됨
✅ Multi-Thread
📌 정의
main 스레드 외에 새로운 작업 스레드를 실행하는 방식
- 병렬 처리를 통해 동시에 여러 작업을 수행
✅ Spring Thread
📌 특징
- Spring Framework는 기본적으로 Multi-Thread 환경을 지원
- 비교:
Node.js는 단일 스레드 기반으로 소규모에 적합
📌 사용처
- REST API
- 여러 사용자가 서로 다른 URL 요청 시, 각각의 요청을 다른 스레드로 처리
- JDBC
- 동기화 / 비동기화 처리
🔄 Spring 동기화 vs 비동기화
✅ 동기화 (Synchronous)
📌 정의
- 여러 스레드가 하나의 메소드를 호출할 때, 요청 순서대로 처리하는 방식
📌 특징
- 순서 보장
- 메소드가 끝날 때까지 대기 상태
- Spring은 기본적으로 동기화 방식을 사용
📌 사용처
✅ 비동기화 (Asynchronous)
📌 정의
- 여러 스레드가 하나의 메소드를 호출할 때, 처리 순서와 관계없이 응답하는 방식
📌 특징
- 순서 보장 없음
- 메소드 결과를 먼저 반환하고, 백그라운드 스레드에서 처리
📌 사용처
- 사용자가 기다릴 필요 없는 작업
- 대량 데이터 연산
- 외부 API 연동
- 이메일 전송
- 알림(Push)
- 로그 기록 등
📌 사용법
@SpringBootApplication
@EnableAsync
public class AppStart {
public static void main(String[] args) {
SpringApplication.run(AppStart.class);
}
}
@Service
public class ThreadService {
@Async
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);
}
}
}
}
🧵 Thread Pool
📌 정의
- 한정된 스레드 개수 내에서 작업을 처리하는 방식
📌 목적
- 대량의 작업 스레드 생성 방지
- 안정적인 병렬 작업 수행
📌 Spring Thread Pool 설정 예시
@Configuration
public class ThreadPoolConfig {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(20);
executor.initialize();
return executor;
}
}
⏰ Spring Scheduling
📌 정의
- 일정한 간격으로 특정 서비스를 자동 실행하는 기능
📌 목적
📌 사용법
@SpringBootApplication
@EnableScheduling
public class AppStart {
public static void main(String[] args) {
SpringApplication.run(AppStart.class);
}
}
@Service
public class ScheduleService {
@Scheduled( fixedRate = 3000 )
public void task1(){
System.out.println("[ 3초 ] ScheduleService.task1");
}
@Scheduled(fixedRate = 5000)
public void task2(){
System.out.println("[ 5초 ] ScheduleService.task2");
}
@Scheduled( cron = "0/5 * * * * *")
public void task3(){
System.out.println(" [ 5초 ] ScheduleService.task3");
}
@Scheduled( cron = "0 */1 * * * *")
public void task4(){
System.out.println(" [ 1분 ] ScheduleService.task3");
}
}
📌 패턴 종류
| 어노테이션 | 설명 |
|---|
@Scheduled(fixedRate = 1000) | 1초마다 실행 (단위: ms) |
@Scheduled(fixedDelay = 1000) | 이전 작업 종료 후 1초 뒤 실행 |
@Scheduled(cron = "* * * * * *") | cron 표현식 기반 실행 |
📌 cron 표현식 설명
| 위치 | 의미 | 범위 |
|---|
| 1 | 초 | 0–59 |
| 2 | 분 | 0–59 |
| 3 | 시 | 0–23 |
| 4 | 일 | 1–31 |
| 5 | 월 | 1–12 |
| 6 | 요일 | 0(일)–6(토) |
📌 예시
@Scheduled(cron = "0 0 10 * * 0,6")
@Scheduled(cron = "0 0 9 * * 0")
@Scheduled(cron = "0 0 8 1 * *")
⚠️ 주의점
- Scheduling은 백그라운드 기반 처리이므로 HTTP 응답 불가
- 해결방안: Socket 통신 또는 DB 저장 후 조회 방식 사용