1. Task Scheduling
μμ μ€μΌμ€λ§(Task Scheduling)μ μ»΄ν¨ν° μμ€ν μμ μμ μ΄λ νλ‘μΈμ€λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκ³ μ€ννκΈ° μν΄ μμ μ μμμ νμ΄λ°μ κ²°μ νλ κ³Όμ μ΄λ€. μμ μ€μΌμ€λ§μ μ΄μ 체μ , λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ μμ€ν , λΆμ° μμ€ν λ± λ€μν λΆμΌμμ μ€μν μν μ νλ€.
1.1 μμ μ€μΌμ€λ§μ μ£Όμ λͺ©ν
ν¨μ¨μ±: μμ€ν μμμ μ΅λν νμ©νμ¬ μμ μ ν¨μ¨μ μΌλ‘ μ²λ¦¬νλ€.μλ΅ μκ° μ΅μν: μμ μ μλ΅ μκ°μ μ΅μννμ¬ μ¬μ©μ κ²½νμ ν₯μμν¨λ€.곡μ μ±: λͺ¨λ μμ μ΄ κ³΅μ νκ² μμμ ν λΉλ°μ μ μλλ‘ νλ€.μ°μ μμ κ΄λ¦¬: μ€μν μμ μ΄ μ°μ μ μΌλ‘ μ²λ¦¬λ μ μλλ‘ μ°μ μμλ₯Ό κ΄λ¦¬νλ€.
1.2 μμ μ€μΌμ€λ§μ μ ν
μ μ ν μ€μΌμ€λ§(Preemptive Scheduling)- μμ μ΄ μ€ν μ€μΌ λ, λ λμ μ°μ μμμ μμ μ΄ λμ°©νλ©΄ νμ¬ μμ μ μ€λ¨νκ³ μλ‘μ΄ μμ μ μ€ννλ€.
- e.g. λΌμ΄λ λ‘λΉ(Round Robin), μ°μ μμ μ€μΌμ€λ§(Priority Scheduling)
λΉμ μ ν μ€μΌμ€λ§(Non-preemptive Scheduling)- μμ μ΄ μ€νμ μμνλ©΄, μμ μ΄ μλ£λ λκΉμ§ λ€λ₯Έ μμ μ΄ μ€νλμ§ μλλ€.
- e.g. FCFS(First-Come, First-Served), SJF(Shortest Job First)
1.3 μμ μ€μΌμ€λ§ μκ³ λ¦¬μ¦
FCFS (First-Come, First-Served): λ¨Όμ λμ°©ν μμ μ λ¨Όμ μ²λ¦¬νλ€.SJF (Shortest Job First): μ€ν μκ°μ΄ κ°μ₯ μ§§μ μμ μ λ¨Όμ μ²λ¦¬νλ€.Round Robin: κ° μμ μ μΌμ μκ° λμ λ²κ°μ κ°λ©° μ²λ¦¬νλ€.Priority Scheduling: μ°μ μμκ° λμ μμ μ λ¨Όμ μ²λ¦¬νλ€.Multilevel Queue Scheduling: μμ μ μ¬λ¬ κ°μ νλ‘ λλμ΄ κ° νμ λ€λ₯Έ μ€μΌμ€λ§ μκ³ λ¦¬μ¦μ μ μ©νλ€.
1.1 Task Schedulingμ μ©λ
- λ©μΌλ§ 리μ€νΈμ μΆμ² μν 리μ€νΈλ₯Ό μ£ΌκΈ°μ μΌλ‘ 보λ΄μ€λ.
- μ΄ μ’μμ κ°―μλ μ΄ μ‘°νμμ²λΌ νΉμ λ°μ΄ν°λ₯Ό μ£ΌκΈ°μ μΌλ‘ μ λ°μ΄νΈν λ
- μ£ΌκΈ°μ μΌλ‘ λ°μ΄ν°λ νμΌμ μ 리ν λ
- μ£ΌκΈ°μ μΌλ‘ λ°μ΄ν° λΆμ 리ν¬νΈλ₯Ό μ μν λ
- μ£ΌκΈ°μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€λ₯Ό λ°±μ ν λ
2. Cron λ¬Έλ²
μ΄ 0-59: 0μ΄λΆν° 59μ΄κΉμ§μ μ«μλ₯Ό μ λ ₯νλ€λΆ 0-59: 0λΆλΆν° 59λΆκΉμ§μ μ«μλ₯Ό μ λ ₯νλ€μ 0-23: 0μλΆν° 23μκΉμ§μ μ«μλ₯Ό μ λ ₯νλ€μΌ 1-31: 1μΌλΆν° 31μΌκΉμ§μ μ«μλ₯Ό μ λ ₯νλ€μ 1-12: 1μλΆν° 12μκΉμ§μ μ«μλ₯Ό μ λ ₯νλ€μμΌ 0-7: 0λΆν° 7κΉμ§μ μ«μκ° κ° [μΌ,μ,ν,μ,λͺ©,κΈ,ν ,μΌ]μ ν΄λΉλλ€. μΌμμΌμ λλ² μλ€
1* * * * * * μ€νν 컀맨λ2- - - - - -3| | | | | |4| | | | | +-- μμΌ (0 - 7) (μΌμμΌμ 0κ³Ό 7μ΄ λͺ¨λ κ°λ₯)5| | | | +---- μ (1 - 12)6| | | +------ μΌ (1 - 31)7| | +-------- μ (0 - 23)8| +---------- λΆ (0 - 59)9+------------ μ΄ (0 - 59)
*[λ³]: νλμ λͺ¨λ κ°μ λ§€μΉνλ€. (e.g. 1μ΄λ§λ€ μ€ν), [μ»΄λ§]: μ¬λ¬κ°μ κ°μ ꡬλΆνλ€. (e.g. βμΌβ μμΉμ 1,2,3 μ λ ₯ β 1μΌ, 2μΌ, 3μΌμ μ€ν)-[νμ΄ν]: λ²μλ₯Ό νννλ€. (e.g. βμμΌβ μμΉμ 1-3 μ λ ₯β μμμΌλΆν° μμμΌμ ν΄λΉλ λ)/ [μ¬λμ]: λ°°μλ₯Ό νννλ€. (e.g. βλΆβ μμΉμ*/15μ λ ₯ β 15λΆλ§λ€ μ€ν (0, 15, 30, 45λΆ)L [μνλ²³ μ]: λ¬μ λ§μ§λ§ λ μ μλ―Ένλ€. (e.g. βμμΌβ μμΉμ 5L μ λ ₯ β λ¬μ λ§μ§λ§ κΈμμΌ)W [μνλ²³ λλΈμ ]: βμΌβ μμΉμ μ λ ₯μ κ°κΉμ΄ νμΌ (e.g. βμΌβ μμΉμ 15W μ λ ₯ β 15μΌμ κ°μ₯ κ°κΉμ΄ νμΌ)# [μΎ]: λͺλ²μ§Έ μμΌμΈμ§ νννλ€. (e.g. βμμΌβ μμΉμ5#3μ λ ₯ β λ¬μ μΈλ²μ§Έ κΈμμΌ)
2.1 Cron μμ
1# 0μ΄λ§λ€ μ€ν(1λΆμ νλ² μ€ν)20 * * * * *34# μ νν μμ μ μ€ν (0μ΄ 0λΆ 0μ)50 0 0 * * *67# μΌμμΌ 3μ 0λΆ 30μ΄μ μ€ν (μΌμμΌ 3:00:30AM)830 0 3 * * 0910# λ§€μ λ§μ§λ§ λ 5μ 30λΆ 45μ΄μ μ€ν (λ§€μ λ§μ§λ§ λ 5:30:45PM)1145 30 17 L * *1213# μ,μ,κΈ 10μ15λΆμ μ€ν (μ,μ,κΈ 10:15:00AM)140 15 10 * * 1,3,51516# 0μ΄ 5λΆλ§λ€ μ€ν (5λΆλ§λ€ μ€ν, μ μ κ°μ μμ)170 */5 * * * *1819# 8μμ 20μ μ¬μ΄μ 2μκ°λ§λ€ μ€ν200 0 8-20/2 * * *2122# λ§€μ λ§μ§λ§ κΈμμΌ 11:00:00PMμ μ€ν230 0 23 * * 5L2425# 1μ΄λ§λ€ μ€ν26* * * * * *2728# 30μ΄λ§λ€ μ€ν29*/30 * * * * *
3. NestJS Schedule μ μΈν
1import { Injectable, Logger } from '@nestjs/common'2import { Cron } from '@nestjs/schedule'34@Injectable()5export class TaskService {6private readonly logger = new Logger(TaskService.name)78@Cron('45 * * * * *')9handleCron() {10this.logger.debug('Called when the current second is 45')11}12}
4. NestJS Schedule μ΅μ
1import { Injectable } from '@nestjs/common'2import { Cron, CronExpression } from '@nestjs/schedule'34@Injectable()5export class NotificationService {6@Cron('* * 0 * * *', {7name: 'notifications',8timeZone: 'Europe/Paris',9})10triggerNotification() {}11}
5. SchedulerRegistry ν¨μ
1addCronJob(name: string, seconds: string) {2const job = new CronJob(`${seconds} * * * * *`, () => {3this.logger.warn(`time (${seconds}) for job ${name} to run!`)4})56this.schedulerRegistry.addCronJob(name, job)7job.start()89this.logger.warn(10`job ${name} added for each minute at ${seconds} seconds`,11)12}13
stop(): μμ λ μμ μ μ€μ§νλ€.start(): stop()μ΄ μ€νλ μμ μ μ¬μ€ννλ€.setTime(time: CronTime): μμ μ μ€μ§νκ³ μλ‘μ΄ μ£ΌκΈ°λ₯Ό μ§μ νκ³ μμνλ€.lastDate(): λ§μ§λ§μΌλ‘ μμ μ΄ μ€νλ λ μ§λ₯Ό λ°ννλ€.nextDate(): λ€μμΌλ‘ μμ μ΄ μ€νλ λ μ§λ₯Ό λ°ννλ€.nextDates(count: number): λ€μμΌλ‘ μμ μ΄ μ€νλ λ μ§λ€μ nκ° λ°ννλ€
6. Versioning
URL Versioning: URIμ λ²μ μ΄ μ λ¬λλ€/v1/movieHeader VersioningHeaderμ λ²μ μ΄ μ λ¬λλ€version: 1Media Type Versioning: Headerμ Accept ν€μ λ²μ μ΄ μ λ¬λλ€.Accept: application/json;v=2