๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋…ธ๋ ฅ์„ ์ด๊ธฐ๋Š” ์žฌ๋Šฅ์€ ์—†๊ณ 
๋…ธ๋ ฅ์„ ์™ธ๋ฉดํ•˜๋Š” ๊ฒฐ๊ณผ๋„ ์—†๋‹ค.
- ์ด์ฐฝํ˜ธ 9๋‹จ

OPEN SOURCE/FullCalendar

[FullCalendar] ํ’€์บ˜๋ฆฐ๋”(FullCalendar) ์†์„ฑ - 2, ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์„ค์ • (Date & Time)

  Junesker   2024. 6. 24.
๋ฐ˜์‘ํ˜•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค FullCalendar

 

 

 

 

 

 

ํ’€์บ˜๋ฆฐ๋”(FullCalendar) ์†์„ฑ - 2

 

 

 

 


FullCalendar JS๋ฅผ ํ™œ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ ์†์„ฑ๊ณผ ์ด๋ฒคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์ด ์–ด๋–ค ํŠน์ง•๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ํ’€์บ˜๋ฆฐ๋”๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋ฒคํŠธ์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์–ด๋–ค ๋™์ž‘๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ๋“ฑ์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. FullCalendar JS ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” Documents ํŒŒ์ผ์„ ๋ณด๊ธด ํ•˜์ง€๋งŒ Docs ๋ฌธ์„œ๋“ค์„ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์•„์ง ์ต์ˆ™์ง€ ์•Š์€ ์‚ฌ๋žŒ์€ ๋ฌธ์„œ ๋ณด๋Š” ๋ฐฉ๋ฒ•์กฐ์ฐจ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ FullCalendar JS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ๋“ค์„ ํ•˜๋‚˜์‹ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋ฌผ๋ก  100% ๋ชจ๋“  ์†์„ฑ๋“ค์„ ์ „๋ถ€ ๋ณด๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์†์„ฑ๋“ค ์œ„์ฃผ๋กœ ํ™•์ธํ•ด ๋ณด๊ณ  ๊ทธ ์™ธ์— ์†์„ฑ๋“ค์€ ์ง์ ‘ Documents๋ฅผ ํ™•์ธํ•ด ๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

 

 

 

 

 

๐Ÿ“† 2. ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์„ค์ • (Date & Time)


 

 

 

 

 

slotMinTime

' ๊ฐ ์š”์ผ์— ํ‘œ์‹œ๋  ์ฒซ๋ฒˆ์งธ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฒฐ์ • '


slotMinTime ์†์„ฑ์€ ์ผ์ • ์‹œ๊ฐ„ ๋ทฐ์—์„œ ํ•˜๋ฃจ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ '00:00:00'์œผ๋กœ ํ•˜๋ฃจ์˜ ์‹œ์ž‘(์ž์ •)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹์€ 'HH:mm:ss' ๋˜๋Š” 'HH:mm'๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',  // ์‹œ๊ฐ„ ๊ทธ๋ฆฌ๋“œ ๋ทฐ
  slotMinTime: '09:00:00',      // ์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ ํ‘œ์‹œ
  events: [
    { title: '์ผ์ •1', start: '2025-02-12T10:00:00' },
    { title: '์ผ์ •2', start: '2025-02-12T12:30:00' }
  ]
});
calendar.render();

 

์ผ์ •์˜ ์ฒซ ์‹œ์ž‘์ด 9์‹œ ๋ถ€ํ„ฐ๋กœ ํ‘œ๊ธฐ

 

์ฃผ์š” ์„ค์ • ๊ฐ’

'00:00:00' (๊ธฐ๋ณธ๊ฐ’) ์ž์ •(0์‹œ)๋ถ€ํ„ฐ ์‹œ์ž‘ 0์‹œ๋ถ€ํ„ฐ ๋ชจ๋“  ์‹œ๊ฐ„ ํ‘œ์‹œ
'06:00:00' ์˜ค์ „ 6์‹œ๋ถ€ํ„ฐ ํ‘œ์‹œ ์ด๋ฅธ ์•„์นจ ์Šค์ผ€์ค„ ๊ด€๋ฆฌ์— ์ ํ•ฉ
'09:00:00' ์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ ํ‘œ์‹œ (์ผ๋ฐ˜์  ๊ทผ๋ฌด์‹œ๊ฐ„) ์—…๋ฌด ์‹œ๊ฐ„๋Œ€์— ์ตœ์ ํ™”
'12:00:00' ์ •์˜ค(12์‹œ)๋ถ€ํ„ฐ ํ‘œ์‹œ ์˜คํ›„ ์ผ์ •๋งŒ ํ‘œ์‹œํ•  ๋•Œ ํ™œ์šฉ
'-02:00:00' ์ „๋‚ ์˜ 22์‹œ๋ถ€ํ„ฐ ํ‘œ์‹œ ์•ผ๊ฐ„ ๊ทผ๋ฌด ์‹œ๊ฐ„ ๊ด€๋ฆฌ์— ์ ํ•ฉ
๐Ÿšฉ Tip: '-02:00:00'์ฒ˜๋Ÿผ ์Œ์ˆ˜ ๊ฐ’์„ ์ฃผ๋ฉด ์ „๋‚  ์‹œ๊ฐ„๋ถ€ํ„ฐ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

 

 

 

slotMaxTime

' ๊ฐ ์š”์ผ์— ํ‘œ์‹œ๋  ๋งˆ์ง€๋ง‰ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฒฐ์ • '


slotMaxTime ์†์„ฑ์€ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ทฐ(timeGridWeek, timeGridDay)์—์„œ ํ•˜๋ฃจ์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ ํƒ€์  ์ข…๋ฃŒ ์‹œ๊ฐ„์œผ๋กœ ์ง€์ •๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ '24:00:00'์œผ๋กœ ํ•˜๋ฃจ์˜ ๋งˆ์ง€๋ง‰(์ž์ •)์ด ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹์€ 'HH:mm:ss' ๋˜๋Š” 'HH:mm'๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ์บ˜๋Ÿฐ๋”๊ฐ€ ์ž์ •๊นŒ์ง€๊ฐ€ ์•„๋‹Œ ์›ํ•˜๋Š” ์‹œ๊ฐ„๊นŒ์ง€๋งŒ ํ‘œ์‹œ๋˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',   // ์ฃผ๊ฐ„ ์‹œ๊ฐ„ ๊ทธ๋ฆฌ๋“œ ๋ทฐ
  slotMinTime: '09:00:00',       // ์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ ์‹œ์ž‘
  slotMaxTime: '16:00:00',       // ์˜คํ›„ 4์‹œ๊นŒ์ง€ ํ‘œ์‹œ
  events: [
    { title: '์ผ์ •1', start: '2025-02-12T10:00:00' },
    { title: '์ผ์ •2', start: '2025-02-12T13:00:00' }
  ]
});
calendar.render();

 

์ผ์ •์˜ ๋งˆ์ง€๋ง‰ ์‹œ๊ฐ„์ด ์˜คํ›„ 4์‹œ๊นŒ์ง€๋กœ ํ‘œ๊ธฐ

 

์ฃผ์š” ์„ค์ • ๊ฐ’

์„ค์ • ๊ฐ’ ์„ค๋ช… ๊ฒฐ๊ณผ ์˜ˆ์‹œ
'24:00:00' (๊ธฐ๋ณธ๊ฐ’) ์ž์ •๊นŒ์ง€ ํ‘œ์‹œ ํ•˜๋ฃจ ์ „์ฒด ์‹œ๊ฐ„ ํ‘œ์‹œ ๊ฐ€๋Šฅ
'18:00:00' ์˜คํ›„ 6์‹œ๊นŒ์ง€๋งŒ ํ‘œ์‹œ ์ผ๋ฐ˜์ ์ธ ์—…๋ฌด ์‹œ๊ฐ„ ๊ด€๋ฆฌ์— ์ ํ•ฉ
'12:00:00' ์ •์˜ค๊นŒ์ง€๋งŒ ํ‘œ์‹œ ์˜ค์ „ ์ผ์ •๋งŒ ํ‘œ์‹œํ•  ๋•Œ ํ™œ์šฉ
'02:00:00' ์ƒˆ๋ฒฝ 2์‹œ๊นŒ์ง€๋งŒ ํ‘œ์‹œ ์‹ฌ์•ผ ์ผ์ • ๊ด€๋ฆฌ์— ์ ํ•ฉ
'30:00:00' ๋‹ค์Œ ๋‚  ์˜ค์ „ 6์‹œ๊นŒ์ง€ ํ‘œ์‹œ ์•ผ๊ฐ„ ๊ทผ๋ฌด ๋ฐ 24์‹œ๊ฐ„ ์บ˜๋ฆฐ๋”์— ์ ํ•ฉ
๐Ÿšฉ Tip: 24:00:00๋ณด๋‹ค ํฐ ๊ฐ’(30:00:00)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ๋‚ ๊นŒ์ง€ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

 

 

 

slotDuration

' ์‹œ๊ฐ„ ์Šฌ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ๋นˆ๋„ '


slotDuration ์†์„ฑ์€ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ทฐ(timeGridWeek, timeGridDay)์—์„œ ์‹œ๊ฐ„ ์Šฌ๋กฏ(ํ–‰)์˜ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ '00:30:00'์œผ๋กœ 30๋ถ„ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ํ˜•์‹์€ 'HH:mm:ss' ๋˜๋Š” 'HH:mm'๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ์บ˜๋ฆฐ๋”์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋” ์ด˜์ด˜ํ•˜๊ฑฐ๋‚˜ ๋„“๊ฒŒ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',   // ์ฃผ๊ฐ„ ์‹œ๊ฐ„ ๊ทธ๋ฆฌ๋“œ ๋ทฐ
  slotDuration: '00:15:00',      // 15๋ถ„ ๋‹จ์œ„๋กœ ์‹œ๊ฐ„ ์Šฌ๋กฏ ํ‘œ์‹œ
  events: [
    { title: '์ผ์ •1', start: '2025-02-12T09:15:00' },
    { title: '์ผ์ •2', start: '2025-02-12T10:45:00' }
  ]
});
calendar.render();

 

์ผ์ •์˜ ๊ฐ„๊ฒฉ์„ 15๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์„ค์ •

 

์ฃผ์š” ์„ค์ • ๊ฐ’

์„ค์ • ๊ฐ’ ์„ค๋ช… ๊ฒฐ๊ณผ ์˜ˆ์‹œ
'00:15:00' 15๋ถ„ ๋‹จ์œ„๋กœ ์Šฌ๋กฏ ํ‘œ์‹œ ์ด˜์ด˜ํ•œ ์ผ์ • ๊ด€๋ฆฌ์— ์ตœ์ ํ™”
'00:30:00' (๊ธฐ๋ณธ๊ฐ’) 30๋ถ„ ๋‹จ์œ„๋กœ ์Šฌ๋กฏ ํ‘œ์‹œ ์ผ๋ฐ˜์ ์ธ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ
'01:00:00' 1์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์Šฌ๋กฏ ํ‘œ์‹œ ๊ฐ„๋‹จํ•œ ์ผ์ • ๊ด€๋ฆฌ์— ์ ํ•ฉ
'02:00:00' 2์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์Šฌ๋กฏ ํ‘œ์‹œ ๋Œ€๊ทœ๋ชจ ์ผ์ • ๋˜๋Š” ์ด๋ฒคํŠธ ๊ด€๋ฆฌ์šฉ
'24:00:00' ํ•˜๋ฃจ๋ฅผ ํ•œ ์Šฌ๋กฏ์œผ๋กœ ํ‘œ์‹œ ํ•˜๋ฃจ ๋‹จ์œ„ ์ผ์ • ๊ด€๋ฆฌ์— ํ™œ์šฉ ๊ฐ€๋Šฅ
๐Ÿšฉ Tip: slotDuration์€ ์„ธ๋ถ€ ์ผ์ • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค!

 

 

 

 

 

now

' ๋‹ฌ๋ ฅ์— ํ‘œ์‹œ ๋  ํ˜„์žฌ ๋‚ ์งœ  '


Calendar๊ฐ€ load ๋˜๋ฉด์„œ, ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•˜๋Š”๋ฐ ์ด๋•Œ, default ๋‚ ์งœ๋ฅผ ์–ด๋–ค ๋‚ ์งœ๋กœ ํ‘œ์‹œํ• ๊ฑด์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ default๋Š” ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •๋œ๋‹ค. 

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
		now: '2025-02-07'
	});
	calendar.render();
});

 

 

ํ•„์ž๊ฐ€ ์ž‘์„ฑํ•œ ํ•ด๋‹น ๋‚ ์งœ๋Š” 2025๋…„ 02์›” 03์ผ์ด๋‹ค. ํ•˜์ง€๋งŒ, now ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ '2025-02-07'๋กœ ์„ค์ •๋˜์–ด ์บ˜๋ฆฐ๋” ๋‹ฌ๋ ฅ ๋‚ด, ํ˜„์žฌ ๋‚ ์งœ ํ‘œ์‹œ๊ฐ€ 02์›” 07์ผ์ž๋กœ ์„ค์ •๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

businessHours

' ํŠน์ • ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฐ•์กฐ '

๊ธฐ๋ณธ์ ์œผ๋กœ ์›”-๊ธˆ, ์˜ค์ „9์‹œ-์˜คํ›„5์‹œ


businessHours ์†์„ฑ์€ ์บ˜๋ฆฐ๋”์—์„œ ์—…๋ฌด ์‹œ๊ฐ„์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์ผ์ • ์ƒ์„ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์„ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์›”์š”์ผ-๊ธˆ์š”์ผ, ์˜ค์ „9์‹œ-์˜คํ›„5์‹œ์ด๊ณ , ๊ธฐ๋ณธ false๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. businessHours ์†์„ฑ์˜ ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๋ฉด ๊ธฐ๋ณธ ์‹œ๊ฐ„์— ๋งž์ถฐ ์—…๋ฌด ์‹œ๊ฐ„์ด ํ‘œ์‹œ๋˜๋Š”๋ฐ ํšŒ์ƒ‰ ์Œ์˜์œผ๋กœ ํ‘œ์‹œ ๋˜๊ธฐ๋•Œ๋ฌธ์— ๊ตฌ๋ถ„ํ•˜๊ธฐ ์‰ฝ๋‹ค. 

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',
  businessHours: true,    // ๊ธฐ๋ณธ ์—…๋ฌด ์‹œ๊ฐ„ (์›”~๊ธˆ, 09:00~17:00)
  events: [
    { title: 'ํŒ€ ํšŒ์˜', start: '2025-02-12T10:00:00' },
    { title: '์—…๋ฌด ๋ฆฌ๋ทฐ', start: '2025-02-13T15:00:00' }
  ]
});
calendar.render();

 

๊ธฐ๋ณธ ์„ค์ •์— ์˜ํ•œ ์ผ์ • ์˜์—ญ ํ‘œ์‹œ

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',
  businessHours: [ // specify an array instead
	{
    	daysOfWeek: [ 1, 2, 3 ], // Monday, Tuesday, Wednesday
        startTime: '08:00', // 8am
        endTime: '18:00' // 6pm
    },
    {
    	daysOfWeek: [ 4, 5 ], // Thursday, Friday
    	startTime: '10:00', // 10am
    	endTime: '16:00' // 4pm
    }
  ],
  events: [
    { title: 'ํŒ€ ํšŒ์˜', start: '2025-02-12T10:00:00' },
    { title: '์—…๋ฌด ๋ฆฌ๋ทฐ', start: '2025-02-13T15:00:00' }
  ]
});
calendar.render();

 

์›”,ํ™”,์ˆ˜์™€ ๋ชฉ,๊ธˆ ์ผ์ •์— ๋”ฐ๋ฅธ ์ผ์ • ์˜์—ญ ํ‘œ์‹œ

 

์ฃผ์š” ์†์„ฑ ์„ค๋ช…

์†์„ฑ ์„ค๋ช… ์˜ˆ์‹œ ๊ฐ’
daysOfWeek ์—…๋ฌด ์š”์ผ ์„ค์ • (0=์ผ, 1=์›”, ..., 6=ํ† ) [1, 2, 3, 4, 5]
startTime ์—…๋ฌด ์‹œ์ž‘ ์‹œ๊ฐ„ ์„ค์ • (24์‹œ๊ฐ„ ํ˜•์‹) '08:30', '09:00'
endTime ์—…๋ฌด ์ข…๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • '17:00', '15:00'
rendering ์—…๋ฌด ์‹œ๊ฐ„์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹ ์„ค์ • (background ์‚ฌ์šฉ) 'background'
overlap ์ผ์ • ๊ฐ„ ์ค‘์ฒฉ ํ—ˆ์šฉ ์—ฌ๋ถ€ true / false

 

 

 

 

 

firstDay

' ๊ฐ ์ฃผ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์š”์ผ '


firstDay ์†์„ฑ์€ ์บ˜๋ฆฐ๋”์˜ ํ•œ ์ฃผ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์š”์ผ์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ์›”์š”์ผ๋ถ€ํ„ฐ ์ฃผ๊ฐ€ ์‹œ์ž‘๋˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ์ผ์š”์ผ ๋˜๋Š” ๋‹ค๋ฅธ ์š”์ผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ Locale์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ ๊ฐ’์€ '0-6'๊นŒ์ง€๋กœ ์š”์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ '0(์ผ์š”์ผ)' ์ž…๋‹ˆ๋‹ค.

 

  • ๊ธฐ๋ณธ๊ฐ’: 0 (์ผ์š”์ผ๋ถ€ํ„ฐ ์‹œ์ž‘)
  • ๊ฐ’์˜ ๋ฒ”์œ„: 0 ~ 6
    • 0 = ์ผ์š”์ผ (Sunday)
    • 1 = ์›”์š”์ผ (Monday)
    • 2 = ํ™”์š”์ผ (Tuesday)
    • 3 = ์ˆ˜์š”์ผ (Wednesday)
    • 4 = ๋ชฉ์š”์ผ (Thursday)
    • 5 = ๊ธˆ์š”์ผ (Friday)
    • 6 = ํ† ์š”์ผ (Saturday)
๐Ÿšฉ Tip: ๋งŽ์€ ์œ ๋Ÿฝ ๊ตญ๊ฐ€์—์„œ๋Š” firstDay: 1๋กœ ์„ค์ •ํ•˜์—ฌ ์›”์š”์ผ์„ ์ฃผ์˜ ์‹œ์ž‘์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',   // ์›”๊ฐ„ ๋‹ฌ๋ ฅ ๋ทฐ
  firstDay: 0,                   // ์ผ์š”์ผ๋ถ€ํ„ฐ ์‹œ์ž‘ (๊ธฐ๋ณธ๊ฐ’)
  events: [
    { title: '์ผ์ •1 start: '2025-02-09' },
    { title: '์ผ์ •2 start: '2025-02-14' }
  ]
});
calendar.render();

 

์ผ์š”์ผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์บ˜๋ฆฐ๋” ๋ทฐ

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',   // ์›”๊ฐ„ ๋‹ฌ๋ ฅ ๋ทฐ
  firstDay: 2,                   // ํ™”์š”์ผ๋ถ€ํ„ฐ ์‹œ์ž‘
  events: [
    { title: '์ผ์ •1 start: '2025-02-09' },
    { title: '์ผ์ •2 start: '2025-02-14' }
  ]
});
calendar.render();

 

ํ™”์š”์ผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์บ˜๋ฆฐ๋” ๋ทฐ

 

firstDay ์†์„ฑ์„ ํ†ตํ•ด ์ˆ˜๋™์ ์œผ๋กœ ์›ํ•˜๋Š” ์ฃผ์˜ ์‹œ์ž‘์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Locale์— ๋”ฐ๋ผ์„œ ์ž๋™ ์„ค์ •๋˜๊ธฐ๋„ ํ•œ๋‹ค. locale์„ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ๊ตญ๊ฐ€์˜ ๊ธฐ๋ณธ ์š”์ผ์ด ์ž๋™ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ locale์„ ์„ค์ •ํ•ด์„œ ์ž๋™์„ค์ • ๋˜์ง€๋งŒ firstDay ์†์„ฑ์œผ๋กœ ์žฌ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

firstDay์™€ ๊ด€๋ จ๋œ ์†์„ฑ

์†์„ฑ ์„ค๋ช… ์˜ˆ์ œ ๊ฐ’
firstDay ํ•œ ์ฃผ์˜ ์‹œ์ž‘ ์š”์ผ ์„ค์ • 0 (์ผ์š”์ผ), 1 (์›”์š”์ผ)
locale ์–ธ์–ด ๋ฐ ์ง€์—ญ ์„ค์ • 'ko', 'en', 'fr'
weekends ์ฃผ๋ง ํ‘œ์‹œ ์—ฌ๋ถ€ ์„ค์ • true / false
hiddenDays ํŠน์ • ์š”์ผ ์ˆจ๊ธฐ๊ธฐ [0, 6] (์ผ, ํ†  ์ˆจ๊น€)

 

 

 

 

 

validRange

' ์‚ฌ์šฉ์ž๊ฐ€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ ์งœ์™€ ์ด๋ฒคํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ œํ•œ '


validRange ์†์„ฑ์€ ์บ˜๋ฆฐ๋”์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ ์งœ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ผ์ • ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ํŠน์ • ๊ธฐ๊ฐ„์œผ๋กœ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฒ”์œ„ ์™ธ ๋‚ ์งœ๋ฅผ ์„ ํƒ ๋ถˆ๊ฐ€๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ทฐ์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋‚ ์งœ ์ฆ‰ ๊ฐ€์šฉ ๋ฒ”์œ„ ์™ธ์—๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ด ์˜์—ญ์œผ๋กœ ๋Œ์–ด์˜ค๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ—ค๋” ๋„๊ตฌ ๋ชจ์Œ์˜ ์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ์€ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๋ฒ”์œ„๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. (์ด์ „/๋‹ค์Œ ์•ˆ๋จ)

 

// ์‹œ์ž‘๊ณผ ๋์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์™ธ์— ๋ฒ”์œ„๋Š” ์„ค์ • ๋ถˆ๊ฐ€๋Šฅ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',   // ์›”๊ฐ„ ๋‹ฌ๋ ฅ ๋ทฐ
  validRange: {
    start: '2025-02-07',	// ์‹œ์ž‘ ๋‚ ์งœ
    end: '2025-02-10'		// ์ข…๋ฃŒ ๋‚ ์งœ (์ด๋‚ ์€ ํฌํ•จ๋˜์ง€ ์•Š์Œ)
  },
  events: [
    { title: '์ผ์ •1 start: '2025-02-09' },
    { title: '์ผ์ •2 start: '2025-02-14' }
  ]
});
calendar.render();

// ์‹œ์ž‘ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์™ธ์— ๋ฒ”์œ„๋Š” ์„ค์ • ๋ถˆ๊ฐ€๋Šฅ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',   // ์›”๊ฐ„ ๋‹ฌ๋ ฅ ๋ทฐ
  validRange: {
    start: '2025-02-07'	// ์‹œ์ž‘ ๋‚ ์งœ
  },
  events: [
    { title: '์ผ์ •1 start: '2025-02-09' },
    { title: '์ผ์ •2 start: '2025-02-14' }
  ]
});
calendar.render();

// ์˜ค๋Š˜ ๋‚ ์งœ๋ถ€ํ„ฐ 30์ผ ํ›„ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์™ธ์— ๋ฒ”์œ„๋Š” ์„ค์ • ๋ถˆ๊ฐ€๋Šฅ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',   // ์›”๊ฐ„ ๋‹ฌ๋ ฅ ๋ทฐ
  validRange: function(now) {
    return {
      start: now,                     // ์˜ค๋Š˜ ๋‚ ์งœ
      end: now.add(30, 'days')        // ์˜ค๋Š˜๋ถ€ํ„ฐ 30์ผ ํ›„๊นŒ์ง€
    };
  },
  events: [
    { title: '์ผ์ •1 start: '2025-02-09' },
    { title: '์ผ์ •2 start: '2025-02-14' }
  ]
});
calendar.render();

 

 

์ฃผ์š” ์†์„ฑ ์„ค๋ช…

์†์„ฑ ์„ค๋ช… ์˜ˆ์‹œ ๊ฐ’
start ์œ ํšจํ•œ ๋ฒ”์œ„์˜ ์‹œ์ž‘ ๋‚ ์งœ (ํฌํ•จ๋จ) '2025-02-01'
end ์œ ํšจํ•œ ๋ฒ”์œ„์˜ ์ข…๋ฃŒ ๋‚ ์งœ (ํฌํ•จ๋˜์ง€ ์•Š์Œ) '2025-02-28'
function ๋™์ ์œผ๋กœ ๋ฒ”์œ„ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ function(now) { ... }

 

 

 

 

 

FullCalendar JS๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์€, FullCalendar ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋‚ด์šฉ์„ ์ ๊ทน ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋œ ๊ธ€์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‚ด์šฉ์€ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ๋ฉ”์ธ ๋‚ด์šฉ ๋ฐ Documents๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

@Junesker


 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€