자바 공부/스프링공부

스프링부트 Scheduled 사용법

ari0930 2024. 9. 17. 22:42

스프링부트 Scheduled 사용법

스프링부트에서 스케줄러를 사용하기 위해서는 Application에 @ EnableScheduling 해줘야 한다.

현재 시간이 시작 시간과 종료시간 사이이면 현재 상태가 진행 중이라 표기되고 그렇지 않으면 대기 중이라고 표시 되록 만들 예정이다 위의 사진은 완성한 예시이다.

 

스케줄러 dto

package org.example.study1.scheduled;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ScheduleDto {
    private String title;
    private int  startTime;
    private  int  endTime;
    private  int status; // 0 이면  현재 대기 1이면 실행중 인거. db에는 0으로만 값을 넣을꺼다.

}

 

스케줄러 등록하는 부분은 알아서 만들어보자.

 

스케줄러 목록 불러오기

나는 1분마다 서버가 자동으로 db에 접근하여 스케줄러 목록을 불러와 현재대기 중인지 진행 중인지를 1분마다 계속 저장하도록 만들었다.

 

@Service

public class ScheduleService {

    private  List<ScheduleDto> data =new CopyOnWriteArrayList<>();

    private final ScheduleMapper scheduleMapper;

    public ScheduleService(ScheduleMapper scheduleMapper) {
        this.scheduleMapper = scheduleMapper;
    }

    //스케줄 목록 조회
    public List<ScheduleDto> selectSchedule(){
        return data;
    }


    //스케줄 등록
    public void register(ScheduleDto scheduleDto) {
        scheduleMapper.register(scheduleDto);
        dataSet();
    }

    //경매가능한 목록 조회 하기
    @Scheduled(fixedRate = 60000)  // 1분마다 실행
    public void dataSet(){
        List<ScheduleDto> newData=scheduleMapper.selectSchedule();
        int nowTime= LocalTime.now().getMinute();
        for (ScheduleDto newDatum : newData) {
            int startTime = newDatum.getStartTime();
            int endTime = newDatum.getEndTime();
            if (startTime <= nowTime && nowTime <= endTime) {
                newDatum.setStatus(1);
            }

        }
        this.data=newData;
    }

}

여기서 1분마다 db에서 조회한 값을 저장할 이름을 data라 하는 리스트에 저장하는데 왜 CopyOnWriteArrayList가 사용되었냐면

나는 등록할 때마다 다시 조회하도록 만들었기 때문에 서로 충돌이 일어나지 말라고 CopyOnWriteArrayList를 사용하였다. 

CopyOnWriteArrayList는 여러 스레드가 동시에 이 data에 접근할 때 복사본을 생성하여 동시성 문제를 방지할 수 있다.

 

 

    @Scheduled(fixedRate = 60000)  // 1분마다 실행
    public void dataSet(){
        List<ScheduleDto> newData=scheduleMapper.selectSchedule();
        int nowTime= LocalTime.now().getMinute();
        for (ScheduleDto newDatum : newData) {
            int startTime = newDatum.getStartTime();
            int endTime = newDatum.getEndTime();
            if (startTime <= nowTime && nowTime <= endTime) {
                newDatum.setStatus(1);
            }

        }
        this.data=newData;
    }

스케줄러 코드 부분의 for문은 현재 시간하고 시작시간과 끝나는 시간이 그 사이에 있는지 확인하여 데이터를 수정하여 전달하기 우해 만든 부분이다.

 

반응형