Skip to content
Merged

prod #390

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.time.LocalDate;

@Slf4j
@CronJob(cron = "0 0 6 20 10 ?", name = "examNumberGeneratorJob_20251026")
@CronJob(cron = "0 0 3 22 10 ?", name = "examNumberGeneratorJob_20251026")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

이 PR은 크론 실행 시간만 변경하고 있지만, 현재 잡(Job) 구현 방식은 장기적인 유지보수성에 문제가 될 수 있습니다.

@CronJob 애노테이션의 cron 표현식, name, 그리고 execute 메소드 내부의 examDate (LocalDate.of(2025, 10, 26))가 모두 하드코딩되어 있습니다. 이 값들은 서로 논리적으로 강하게 연결되어 있지만, 코드상으로는 분리되어 있어 하나만 수정하고 다른 부분을 놓칠 경우 버그가 발생할 위험이 큽니다.

또한, ExamNumberGenerationJobRound1과 같이 시험 일정마다 새로운 잡 클래스를 생성하는 방식은 코드 중복을 야기하고 확장성을 저해합니다.

개선 제안:
장기적으로는 시험 일정(시험일, 수험번호 생성일 등)을 데이터베이스나 설정 파일에 저장하고, 이를 바탕으로 동적으로 Quartz 잡을 등록하는 일반화된 잡을 만드는 것을 고려해보시는 것이 좋습니다. JobDataMap을 사용하면 잡 실행 시 동적으로 시험 날짜를 전달할 수 있습니다.

// 예시: 동적 잡 등록
JobDetail jobDetail = JobBuilder.newJob(GenericExamNumberGenerationJob.class)
    .withIdentity("examNumberJob-" + examId)
    .usingJobData("examDate", "2025-10-26")
    .build();

Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("examNumberTrigger-" + examId)
    .withSchedule(CronScheduleBuilder.cronSchedule("0 0 3 22 10 ?")) // DB나 설정에서 읽어온 값
    .forJob(jobDetail)
    .build();

scheduler.scheduleJob(jobDetail, trigger);

이러한 리팩토링은 코드 변경 없이 새로운 시험 일정을 추가하거나 수정할 수 있게 하여 시스템을 훨씬 유연하고 안정적으로 만듭니다.

@DisallowConcurrentExecution
@RequiredArgsConstructor
public class ExamNumberGenerationJobRound2 implements Job {
Expand Down