기술나눔

springboot에서 예약된 작업 작성

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1부: 소개

1.1 예정된 작업의 중요성

현대 소프트웨어 개발에서 예약된 작업은 애플리케이션 자동화 및 운영 효율성의 핵심 구성 요소입니다. 데이터 백업, 시스템 상태 점검, 정기적인 보고서 생성 또는 사용자 활동에 의해 트리거되는 자동화된 프로세스 등 예약된 작업은 필수적인 역할을 합니다. 이는 비즈니스 로직의 연속성과 시스템의 자체 유지 관리 기능을 보장합니다.

1.2 다양한 분야의 예정된 작업 적용
  • 전사적자원관리(ERP) 시스템: 예약된 작업을 사용하여 재무 보고서, 재고 업데이트 등을 생성할 수 있습니다.
  • 콘텐츠 관리 시스템(CMS): 정기적으로 콘텐츠 게시, 캐시 지우기 등
  • 고객관계관리(CRM) 시스템: 마케팅 이메일, 고객 후속 알림 등을 정기적으로 보냅니다.
  • 온라인 광고 플랫폼: 정기적으로 광고 전략을 조정하고, 광고 표시를 최적화하는 등
1.3 기존의 예약된 작업 구현 시의 과제

기존 개발 모델에서 예약된 작업을 구현하려면 운영 체제의 예약된 작업(예: Linux의 crontab)에 의존하거나 복잡한 비즈니스 로직을 작성해야 하는 경우가 많습니다. 이러한 방법에는 많은 불편함이 있습니다.

  • 복잡한 구성: 운영 체제의 작업 스케줄러에 대한 심층적인 이해가 필요합니다.
  • 유지관리가 어렵다: 업무가 다양한 시스템과 애플리케이션에 분산되어 있어 통일적으로 관리하고 모니터링하기가 어렵습니다.
  • 확장성이 좋지 않음: 비즈니스가 성장함에 따라 작업을 추가하거나 수정하는 것이 복잡해지고 시간이 많이 걸립니다.
1.4 스프링 부트 솔루션

널리 사용되는 Java 프레임워크인 Spring Boot는 예약된 작업을 구현하는 보다 우아하고 통합된 방법을 제공합니다. 구성을 단순화하고 풍부한 API를 제공하므로 개발자는 예약된 작업 기능을 애플리케이션에 신속하게 통합할 수 있습니다.

1.5 예약된 작업에 대한 Spring Boot의 지원

스프링 부트 합격@EnableScheduling그리고@Scheduled 주석을 사용하면 Spring 애플리케이션에서 예약된 작업을 작성하고 구성하는 것이 매우 쉬워집니다. 또한 Spring Boot는 Spring Task Scheduler와의 통합도 제공하여 보다 고급 예약 작업 요구 사항을 지원합니다.

1.6 예약된 작업을 구현하기 위해 Spring Boot를 선택하는 이유
  • 구성 단순화: 예약된 작업은 주석과 약간의 구성을 통해 구현할 수 있습니다.
  • 통합이 용이함: Spring 생태계와 완벽하게 통합되어 트랜잭션 관리, 종속성 주입 등과 같은 다른 Spring 기능을 활용할 수 있습니다.
  • 강력한 커뮤니티 지원: Spring Boot에는 많은 리소스와 모범 사례를 제공하는 대규모 개발자 커뮤니티가 있습니다.
  • 테스트하기 쉬움: Spring Boot의 예약된 작업을 통해 단위 테스트 및 통합 테스트를 쉽게 수행할 수 있습니다.

2부: 스프링 부트 소개

2.1 스프링 부트 개요

Spring Boot는 Pivotal 팀(현재 VMware의 일부)에 의해 개발되었으며 Spring 프레임워크를 기반으로 하는 모듈식의 신속한 개발 및 배포 프레임워크입니다. 일련의 기본 구성을 제공하여 Spring 애플리케이션의 초기 설정 및 개발 프로세스를 단순화하고 개발자의 구성 작업을 줄이는 것을 목표로 합니다.

2.2 스프링 부트의 핵심 기능
  • 자동 구성: Spring Boot는 프로젝트의 종속성을 기반으로 Spring 애플리케이션을 자동으로 구성할 수 있습니다.
  • 독립적으로 운영: Spring Boot 애플리케이션에는 내장 HTTP 서버(예: Tomcat, Jetty 또는 Undertow)가 포함되어 있으며 외부 서버에 배포할 필요가 없습니다.
  • XML 구성이 필요하지 않습니다.: Spring Boot는 여전히 XML 구성을 지원하지만 XML 구성 파일을 사용할 필요가 없습니다.
  • 마이크로서비스 지원: Spring Boot는 마이크로서비스 아키텍처에 매우 적합하며 구축, 배포, 확장이 쉽습니다.
2.3 스프링 부트 시작 메커니즘

Spring Boot 애플리케이션은 다음을 통해 시작됩니다.SpringApplication.run() 메소드가 구현되면 Spring 애플리케이션 컨텍스트가 자동으로 생성 및 구성됩니다. Spring Boot는 또한 애플리케이션을 모니터링하고 관리하기 위한 명령줄 인터페이스(CLI)와 Actuator 엔드포인트를 제공합니다.

2.4 스프링 부트 의존성 관리

스프링 부트 합격spring-boot-starter-parent 종속성 관리를 제공하고 Maven 및 Gradle 프로젝트 구성을 단순화합니다. 버전 번호와 종속성 범위를 미리 정의하여 종속성 충돌과 버전 제어를 더 쉽게 관리할 수 있습니다.

2.5 Spring Boot의 커뮤니티와 플러그인 생태계

Spring Boot에는 다음과 같은 특정 기능을 구축하는 데 필요한 종속성을 포함하는 수많은 플러그인과 "스타터"를 제공하는 활성 오픈 소스 커뮤니티가 있습니다.spring-boot-starter-webRESTful 애플리케이션 구축용.

2.6 예: 간단한 Spring Boot 애플리케이션 생성

다음은 간단한 Spring Boot 애플리케이션을 생성하는 단계와 해당 샘플 코드입니다.

  1. 프로젝트 구조 생성: 프로젝트 구조를 빠르게 생성하려면 Spring 초기화(https://start.spring.io/)를 사용하세요.
  2. 종속성 추가: 예를 들어 필요한 스타터를 선택합니다.spring-boot-starter-web
  3. 기본 애플리케이션 클래스 작성
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MyApp {
        public static void main(String[] args) {
            SpringApplication.run(MyApp.class, args);
        }
    }
    
  4. REST 컨트롤러 만들기
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyController {
        @GetMapping("/")
        public String home() {
            return "Hello, Spring Boot!";
        }
    }
    
2.7 Spring Boot 배포 방법
  • JAR로 패키지됨: Spring Boot 애플리케이션은 다음을 통해 실행 가능한 JAR 파일로 패키징될 수 있습니다.java -jar명령이 실행됩니다.
  • 컨테이너화된 배포: Spring Boot 애플리케이션은 Docker와 같은 컨테이너화 기술에 매우 적합하며 클라우드 환경에 배포하기 쉽습니다.
2.8 Spring Boot와 Spring Framework의 관계

Spring Boot는 Spring Framework를 대체하는 것이 아니라 Spring Framework 기반의 신속한 개발 방법입니다. 이는 Spring Framework의 모든 기능과 유연성을 유지하면서 Spring 애플리케이션을 시작하는 빠른 방법을 제공합니다.

2.9 왜 스프링부트를 선택하는가?
  • 급속 성장: Spring Boot의 자동 설정과 단순화된 설정으로 개발 속도가 빨라집니다.
  • 배포가 용이함: 내장된 HTTP 서버 및 컨테이너화 지원으로 배포가 간단해집니다.
  • 지역사회 지원: Spring Boot 커뮤니티는 풍부한 리소스, 플러그인 및 모범 사례를 제공합니다.
2.10 결론

Spring Boot는 최신 Java 개발을 위해 설계된 프레임워크로, 구성을 단순화하고 일련의 기본 기능을 제공하므로 개발자는 인프라 구축이 아닌 비즈니스 로직 구현에 집중할 수 있습니다. 다음 장에서는 예약된 작업에서 Spring Boot를 적용하는 방법을 자세히 살펴보고 해당 기능을 사용하여 효율적이고 안정적인 자동화 작업을 구축하는 방법을 보여줍니다.

3부: 예약된 작업의 기본 개념

3.1 예약된 작업의 정의

예약된 작업은 미리 결정된 시간에 자동으로 실행되는 코드 또는 프로그램입니다. 일회성 또는 주기적일 수 있으며 데이터 백업, 알림 전송, 예약된 검사 수행 등과 같은 자동화된 작업을 수행하는 데 사용됩니다.

3.2 예약된 작업 유형
  • 일회성 작업: 일반적으로 특정 초기화 또는 정리 작업을 위해 한 번만 실행됩니다.
  • 주기적인 작업: 특정 시간 간격(고정 간격 또는 달력 기반 시간)으로 반복적으로 실행됩니다.
3.3 예약된 작업의 적용 시나리오
  • 데이터 백업: 데이터 보안을 위해 정기적으로 데이터베이스를 백업하세요.
  • 보고서 생성: 의사결정에 도움이 되는 사업보고서를 정기적으로 생성합니다.
  • 시스템 모니터링: 주기적으로 시스템 상태를 확인하여 적시에 문제를 발견하고 해결합니다.
  • 사용자 알림: 사용자 행동이나 특정 이벤트를 기반으로 미리 알림을 보냅니다.
3.4 예약된 작업의 중요성

예약된 작업은 시스템을 계속 가동하고 실행하며 비즈니스 프로세스를 자동화하는 데 중요합니다. 수동 개입을 줄이고 효율성을 높이며 작업의 적시성과 정확성을 보장할 수 있습니다.

3.5 예약된 작업 구현의 과제
  • 시간 정확도: 예정된 시간에 작업이 정확하게 실행되는지 확인합니다.
  • 오류 처리: 실행 중 발생할 수 있는 오류를 적절하게 처리합니다.
  • 자원 관리: 작업 실행 중 시스템 성능에 영향을 주지 않도록 리소스를 합리적으로 할당합니다.
3.6 예약된 작업을 구현하는 방법
  • 운영 체제 수준: crontab 또는 Windows 작업 스케줄러를 사용하세요.
  • 프로그래밍 언어 수준: Java와 같은 언어별 라이브러리나 프레임워크를 사용합니다.java.util.Timer
  • 애플리케이션 프레임워크 수준: Spring과 같은 프레임워크에서 제공하는 예약된 작업 지원을 사용합니다.@Scheduled
3.7 예: 자바 사용java.util.Timer예약된 작업 구현

다음은 Java 표준 라이브러리를 사용하는 예입니다.Timer클래스로 구현된 간단한 예약 작업의 예:

import java.util.Timer;
import java.util.TimerTask;

public class SimpleTimerTask {
    public static void main(String[] args) {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行定时任务:"   System.currentTimeMillis());
            }
        };
        Timer timer = new Timer();
        long delay = 0;
        long intervalPeriod = 1000; // 间隔1秒执行一次
        timer.scheduleAtFixedRate(task, delay, intervalPeriod);
    }
}
3.8 예: cron 표현식 사용

Cron 표현식은 예약된 작업의 실행 시간을 구성하는 강력한 방법입니다. 다음은 매일 오전 1시에 작업을 실행하는 cron 표현식의 예입니다.

0 0 1 * * ?
3.9 Spring Boot의 예약된 작업

스프링 부트 합격@Scheduled 주석은 예약된 작업의 구성 및 구현을 단순화합니다.여기 용도가 있습니다@Scheduled주석이 달린 Spring Boot 예약 작업 예:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
    
    @Scheduled(fixedRate = 5000) // 每5秒执行一次
    public void reportCurrentTime() {
        System.out.println("当前时间:"   System.currentTimeMillis());
    }
    
    @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
    public void scheduleTask() {
        System.out.println("执行定时任务:"   System.currentTimeMillis());
    }
}
3.10 예정된 작업의 모니터링 및 관리
  • 벌채 반출: 문제 추적 및 성능 모니터링을 용이하게 하기 위해 작업 실행을 기록합니다.
  • 건강검진: 예약된 작업의 상태를 정기적으로 확인하여 정상적으로 실행되고 있는지 확인합니다.

4부: Spring Boot에서 타이밍 작업 구현

4.1 이용@Scheduled주석

@Scheduled 예약된 작업의 구현을 단순화하기 위해 Spring에서 제공하는 주석입니다. 간단한 주석 구성을 통해 주기적으로 실행되는 메서드를 생성할 수 있습니다.

4.2 @Scheduled주석 구성
  • fixedRate: 두 작업 실행 사이의 고정 시간 간격(밀리초)을 지정합니다.
  • fixedDelay: 마지막 작업 실행 종료와 다음 작업 시작 사이의 고정 시간 간격을 지정합니다.
  • initialDelay: 작업이 처음 실행되기까지의 지연 시간을 지정합니다.
  • cron: cron 표현식을 사용하여 작업 실행 일정을 지정합니다.
4.3 예: 사용fixedRate

다음 예에서는 5초마다 실행되는 메서드를 보여줍니다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedRateTask {

    @Scheduled(fixedRate = 5000)
    public void taskWithFixedRate() {
        System.out.println("任务执行:"   LocalDateTime.now());
    }
}
4.4 예: 사용fixedDelay

다음 예에서는 이전 작업 실행이 완료된 후 1초 후에 실행되는 메서드를 보여줍니다.

@Scheduled(fixedDelay = 1000)
public void taskWithFixedDelay() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.5 예: 사용initialDelay

다음 예에서는 애플리케이션이 시작된 후 처음 10초 동안 실행되고 그 다음에는 5초마다 실행되는 메서드를 보여줍니다.

@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void taskWithInitialDelay() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.6 크론 표현식 사용

Cron 표현식은 보다 복잡한 시간 설정을 제공하므로 특정 실행 시간을 지정할 수 있습니다. 다음 예에서는 매일 오전 1시에 실행되는 메서드를 보여줍니다.

@Scheduled(cron = "0 0 1 * * ?")
public void taskWithCronExpression() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.7 작업 실행 예외 처리

예약된 작업에서 예외가 발생할 수 있습니다. Spring은 다음을 제공합니다.@Async작업을 비동기적으로 수행하고 사용하기 위한 주석@ExceptionHandler예외를 처리합니다.

@Async
@Scheduled(cron = "0 0/30 * * * ?")
public void taskWithExceptionHandling() {
    if (Math.random()