[java] 서블릿과 스케줄링 기능

서블릿(Servlet)은 Java 웹 애플리케이션의 핵심 요소로, 웹 서버에서 동작하는 자바 클래스입니다. 서블릿은 클라이언트의 요청에 따라 동적으로 처리를 수행하고, HTTP 프로토콜을 통해 클라이언트와 상호작용합니다.

스케줄링(Scheduling)은 작업을 특정 시간에 주기적으로 실행하는 기능을 의미합니다. 스케줄링은 웹 애플리케이션에서 반복적으로 수행되어야 하는 작업을 자동으로 처리할 수 있도록 도와줍니다.

서블릿 스케줄링 기능

서블릿 컨테이너(예: Apache Tomcat)는 서블릿 스케줄링을 지원하기 위해 다양한 기능을 제공합니다. 이 중에서 가장 널리 사용되는 방법은 javax.servlet.ServletContextListenerjavax.servlet.ServletContextEvent 인터페이스를 구현하여 애플리케이션 시작 및 종료 시에 작업을 스케줄링하는 것입니다.

아래는 서블릿 스케줄링을 위한 예제 코드입니다:

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyScheduler implements ServletContextListener {
  
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 애플리케이션 시작 시에 수행되어야 할 작업
        // 예: 스케줄링된 작업 등록
    }
  
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 애플리케이션 종료 시에 수행되어야 할 작업
        // 예: 스케줄링된 작업 해제
    }
}

위의 코드는 MyScheduler 라는 클래스를 생성하여 ServletContextListener 를 구현합니다. contextInitialized 메서드에서는 애플리케이션 시작 시에 수행되어야 할 작업을 구현하며, contextDestroyed 메서드에서는 애플리케이션 종료 시에 수행되어야 할 작업을 구현합니다.

이제 @WebListener 애너테이션을 통해 이 클래스가 서블릿 컨테이너의 리스너로 등록되도록 지정해주면, 서블릿 스케줄링을 활용할 수 있습니다.

예제 활용

위의 예제 코드를 활용하여 주기적으로 특정 작업을 실행해보겠습니다.

public class MyScheduledJob implements Runnable {
    
    @Override
    public void run() {
        // 주기적으로 실행되어야 하는 작업 구현
    }
}

public class MyScheduler implements ServletContextListener {
    
    private ScheduledExecutorService scheduler;
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        
        // 주기적으로 MyScheduledJob 실행 (예: 1분마다)
        scheduler.scheduleAtFixedRate(new MyScheduledJob(), 0, 1, TimeUnit.MINUTES);
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        scheduler.shutdownNow();
    }
}

위의 코드에서 MyScheduledJob 클래스는 Runnable 인터페이스를 구현하여 주기적으로 실행되어야 하는 작업을 구현합니다. MyScheduler 클래스에서는 앞서 구현한 MyScheduledJob을 스케줄링하여 실행하기 위해 Executors.newSingleThreadScheduledExecutor()를 사용하여 ScheduledExecutorService를 생성합니다. 그런 다음 scheduleAtFixedRate 메서드를 사용하여 주기적으로 작업을 실행하는 스케줄링을 등록합니다.

이제 애플리케이션을 시작하면 MyScheduledJob의 작업이 1분마다 실행되는 것을 확인할 수 있습니다.

결론

서블릿을 활용하여 스케줄링 기능을 구현할 수 있습니다. 주기적으로 실행되어야 하는 작업이 있다면, ServletContextListener 인터페이스를 구현한 클래스를 생성하여 서블릿 컨테이너에서 스케줄링을 등록하면 됩니다. 이를 통해 웹 애플리케이션이 자동으로 작업을 수행할 수 있게 됩니다.

참고 자료: