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

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

OPEN SOURCE/FullCalendar

[FullCalendar] ํ’€์บ˜๋ฆฐ๋”(FullCalendar) ์†์„ฑ - 3, ์ด๋ฒคํŠธ ๊ด€๋ จ ์„ค์ • (Event Settings)

  Junesker   2025. 2. 6.
๋ฐ˜์‘ํ˜•

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

 

 

 

 

 

 

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

 

 

 

 

 


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

 

 

 

 

 

๐Ÿ“† 3. ์ด๋ฒคํŠธ ๊ด€๋ จ ์„ค์ • (Event Settings)


 

 

 

 

 

events

' ๋‹ฌ๋ ฅ์— ํ‘œ์‹œ ๋  ์ด๋ฒคํŠธ ๊ฐœ์ฒด์˜ ๋ฐฐ์—ด  '


FullCalendar์— ์ผ์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ events ์†์„ฑ์„ ํ†ตํ•ด์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. events ์†์„ฑ์€ ์ผ์ • ๊ฐ’๋“ค์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ฐฐ์—ด ํ˜•์‹์— ๋งž์ถฐ 'title', 'start', 'end', 'allDay' ๋“ฑ๋“ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค์ด ํฌํ•จ๋œ ๊ฐ์ฒด ์ •๋ณด๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ผ์ •์„ ํ‘œ์‹œํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ ๋’ค์—๋Š” ์‰ผํ‘œ๊ฐ€ ๊ผญ ์—†์–ด์•ผ ํ•œ๋‹ค. (Internet Explorer์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ) ์œ„ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋„ ํ˜„์žฌ ์‹œ์ ์—์„œ ๋ดค์„ ๋•Œ์—๋Š” IE๊ฐ€ ์„œ๋น„์Šค ์ข…๋ฃŒ๊ฐ€ ๋œ์ง€ ์ด๋ฏธ ์˜ค๋ž˜์ „์ด๋ผ ๋ฌธ์ œ๋Š” ์—†๊ฒ ์ง€๋งŒ, ์•„์ง๋„ IE๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ณณ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์‹๋ฌธ์„œ์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋‚ด์šฉ์„ ์•Œ๊ณ ๋งŒ ์žˆ์ž!

 

// 1. ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  events: [
    { title: '์ผ์ •1', start: '2025-02-10' },               		// ํ•˜๋ฃจ ์ผ์ •
    { title: '์ผ์ •2', start: '2025-02-12', end: '2025-02-15' }, 	// ๊ธฐ๊ฐ„ ์ผ์ •
    { title: '์ผ์ •3', start: '2025-02-18T14:00:00', allDays: false } 	// ์‹œ๊ฐ„ ํฌํ•จ ์ผ์ •
  ]
});
calendar.render();

// 2. ์™ธ๋ถ€ ๋งํฌ๋กœ ์—ฐ๊ฒฐ (url)
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  events: [
  	{ title: '์›น ์„ธ๋ฏธ๋‚˜ ์ฐธ๊ฐ€ํ•˜๊ธฐ', start: '2025-02-25', url: 'https://example.com/webinar' }
  ]
});
calendar.render();

// 3. JSON URL๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  events: '/api/events'    // ์„œ๋ฒ„์—์„œ ์ผ์ • JSON ๋ฐ์ดํ„ฐ ๋กœ๋“œ
});
calendar.render();

// 4. Ajax๋กœ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  events: function(fetchInfo, successCallback, failureCallback) {
    $.ajax({
      url: '/api/getEvents',
      dataType: 'json',
      data: {
        start: fetchInfo.startStr,
        end: fetchInfo.endStr
      },
      success: function(response) {
        successCallback(response);   // ์ผ์ • ๋กœ๋“œ ์„ฑ๊ณต ์‹œ ํ‘œ์‹œ
      },
      error: function() {
        failureCallback();           // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
      }
    });
  }
});
calendar.render();

 

Calendar ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, events ์†์„ฑ์— ๋ฐฐ์—ด ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋“ค์„ ๋งŒ๋“ค์–ด๊ฐ„๋‹ค. ๊ฐ์ฒด ์•ˆ์—์„œ ์‚ฌ์šฉ์ค‘์ธ ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ๊ฐ๊ฐ์˜ ์†์„ฑ๋“ค์€ ์•„๋ž˜ ํ‘œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

 

 

 

events ์†์„ฑ ํ™•์žฅํ˜•

 

์ด๋ฒคํŠธ ํ™•์žฅํ˜• ์˜ต์…˜์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฒคํŠธ ์†Œ์Šค๋Š” ์ด๋ฒคํŠธ ์†Œ์Šค ์˜ต์…˜๋“ค์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๊ณ  ํŠน์ • ์˜ต์…˜์„ ํŠน์ • ์ด๋ฒคํŠธ์—๋งŒ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด events ์†์„ฑ๊ณผ๋Š” ์ž‘์„ฑ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. eventsSources ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ events๋ฅผ ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ๋“ฑ๋กํ•œ๋‹ค.

 

events ์†์„ฑ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐ์ฒด์ •๋ณด๋“ค์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ํ•ด๋‹น ์ผ์— ๋‚˜ํƒ€๋‚  ์ผ์ • ๋‚ด์šฉ๋“ค์€ ์—ฌ๋Ÿฌ ์†์„ฑ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” 'id', 'groupId', 'allDay', 'start', 'end', 'startStr', 'endStr' ๋“ฑ๋“ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฒˆํ˜ธ ์†์„ฑ ๋‚ด์šฉ
1 id - ์ด๋ฒคํŠธ์˜ ๊ณ ์œ  ์‹๋ณ„์ž
2 groupId - ์ด๋ฒคํŠธ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋ฃนํ•‘ ๋œ ์‹๋ณ„์ž
3 allDay - ํ•ด๋‹น ๋ทฐ์˜ 'allDay'์ธ ํ•˜๋ฃจ์ข…์ผ ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
- ์ƒํƒœ ๊ฐ’์ด 'true'์ธ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ํ…์ŠคํŠธ๊ฐ€ ํ•จ๊ป˜ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.
4 start - ํ˜„์žฌ timeZone์„ ๋”ฐ๋ฅด๋Š” ๋‚ ์งœ ๊ฐ์ฒด
- ์‹œ์ž‘์ผ์„ ํ‘œ์‹œ
5 end - ํ˜„์žฌ timeZone์„ ๋”ฐ๋ฅด๋Š” ๋‚ ์งœ ๊ฐ์ฒด
- ์ข…๋ฃŒ์ผ์„ ํ‘œ์‹œํ•˜๊ณ  ์ง€์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ null
** ๋ฐฐํƒ€์ , ์ข…๋ฃŒ์ผ์ด '2024-06-19'์ผ ๋•Œ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์€ '2024-06-20'์ด ๋˜๊ธฐ ์ „์ด๋‹ค.
6 startStr - ์‹œ์ž‘์ผ์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„(ISO8601)
- ์‹œ์ž‘์ผ์— ํฌํ•จ์‹œํ‚ฌ ํ…์ŠคํŠธ(ํ•˜๋ฃจ ์ข…์ผ ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ถ€๋ถ„์ด ์—†์Œ.)
7 endStr - ์ข…๋ฃŒ์ผ์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„(ISO8601)
- ์ข…๋ฃŒ์ผ์— ํฌํ•จ์‹œํ‚ฌ ํ…์ŠคํŠธ(ํ•˜๋ฃจ ์ข…์ผ ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ถ€๋ถ„์ด ์—†์Œ.)
8 title - ์ด๋ฒคํŠธ์— ํ‘œ์‹œ๋  ํ…์ŠคํŠธ(์ผ์ •๋ช…)
9 url - ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋  URL
- ๋™์ž‘ ์ œ์–ด์˜ ์ž์„ธํ•œ ๋‚ด์šฉ์€ eventClick callback ์ฐธ์กฐ
10 classNames - class๋ช… ๋ฌธ์ž์—ด ๋ฐฐ์—ด
- ๋žœ๋”๋ง๋œ ์ด๋ฒคํŠธ์— ์ฒจ๋ถ€ํ•  className์„ ๊ฒฐ์ •
11 editable - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ์„ค์ •์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฐ’(true/false)
- true์ผ ๊ฒฝ์šฐ, ์ผ์ • bar๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋“œ๋ž˜๊ทธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- false์ผ ๊ฒฝ์šฐ, ์ผ์ • bar๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์—†๋‹ค.
12 startEditable - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventStartEditable ์„ค์ •์„ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฐ’(true/false)
- ๋“œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ
13 durationEditable - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventDurationEditable ์„ค์ •์„ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฐ’(true/false)
- ํฌ๊ธฐ ์กฐ์ •์„ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ
14 resourceEditable - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventResourceEditable ์„ค์ •์„ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฐ’(true/false)
- ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค ๊ฐ„์— ์ด๋ฒคํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
15 display - ์ด๋ฒคํŠธ์˜ ๋žœ๋”๋ง ์œ ํ˜•
- ๋žœ๋”๋ง ์œ ํ˜•์€ 'auto', 'block', 'list-item', 'background', 'inverse-background', 'none' ์ด ์žˆ๋‹ค.
- auto : default, daygrid์— ์žˆ์„ ๋•Œ ํ•˜๋ฃจ ์ข…์ผ ๋˜๋Š” ๋ฉฐ์น  ๋™์•ˆ ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ๋‹จ์ƒ‰ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋žœ๋”๋ง ํ•œ๋‹ค. ์‹œ๊ฐ„์ด ์ง€์ •๋œ ์ด๋ฒคํŠธ์ธ ๊ฒฝ์šฐ ์ ์œผ๋กœ ๋žœ๋”๋ง๋œ๋‹ค.
- block : daygrid์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ๋‹จ์ƒ‰ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋žœ๋”๋งํ•œ๋‹ค.
- list-item : daygrid์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ์ ์œผ๋กœ ๋žœ๋”๋งํ•œ๋‹ค.
- background : ๋ฐฐ๊ฒฝ ํ•˜์ด๋ผ์ดํŠธ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ด๋ฒคํŠธ, ์ •์‚ฌ๊ฐํ˜•์— ์ƒ‰๊น”๋งŒ ํ‘œ์‹œ๋จ.
- inverse-background : background์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€์ชฝ ๊ณต๊ฐ„์„ ๋ฐฐ๊ฒฝ ํ•˜์ด๋ผ์ดํŠธ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.
- none : ์ด๋ฒคํŠธ๋ฅผ ๋žœ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค.
16 overlap - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventOverlap ์„ค์ •์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฐ’
- false์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์œ„๋กœ ๋“œ๋ž˜๊ทธ/ํฌ๊ธฐ ์กฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
- false์ธ ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ํ•ด๋‹น ์ด๋ฒคํŠธ ์œ„๋กœ ๋“œ๋ž˜๊ทธ/ํฌ๊ธฐ ์กฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
17 constraint - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventConstraint ์žฌ์ •์˜
- ์ด๋ฒคํŠธ ๋“œ๋ž˜๊ทธ ๋ฐ ํฌ๊ธฐ ์กฐ์ •์„ ํŠน์ • ์‹œ๊ฐ„ ์ฐฝ์œผ๋กœ ์ œํ•œํ•œ๋‹ค.
- ์ผ์ • ์ฃผ๋ณ„, ์‹œ๊ฐ„๋ณ„, groupId ๋“ฑ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ œํ•œํ•œ๋‹ค.
18 backgroundColor - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventBackgroundColor ์žฌ์ •์˜
- ์บ˜๋ฆฐ๋”์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์„ค์ •ํ•œ๋‹ค.
- '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์™€ ๊ฐ™์€ CSS ์ƒ‰์ƒ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
19 borderColor - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventBorderColor ์žฌ์ •์˜
- ์บ˜๋ฆฐ๋”์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ์„ ์„ค์ •ํ•œ๋‹ค.
- '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์™€ ๊ฐ™์€ CSS ์ƒ‰์ƒ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
20 textColor - ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ eventTextColor ์žฌ์ •์˜
- ์บ˜๋ฆฐ๋”์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ์„ค์ •ํ•œ๋‹ค.
- '#f00', '#ff0000', '.rgb(255,0,0)', 'red'์™€ ๊ฐ™์€ CSS ์ƒ‰์ƒ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
21 extendedProps - ๊ตฌ๋ฌธ ๋ถ„์„ ์ค‘์— ์ง€์ •๋œ ๊ธฐํƒ€ ์†์„ฑ์„ ๋ณด์œ ํ•˜๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด
- ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋œ ExtendedProps Hash์˜ ์†์„ฑ๊ณผ ๊ธฐํƒ€ ๋น„ํ‘œ์ค€ ์†์„ฑ์„ ๋ฐ›๋Š”๋‹ค.
22 source - ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ์†Œ์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ
- addEvent๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ  source ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ null

 

var calendar = new FullCalendar.Calendar(calendarEl, {
    initialView : 'dayGridMonth',
    events: [
        {
            title: '์ผ์ •๋ช…์ž…๋‹ˆ๋‹ค.',
            start: '2024-06-19T09:00:00',
            end: '2024-06-19T12:50:00',
            startStr: 'Start ํ…์ŠคํŠธ',	// ์ผ์ • bar์— ์ถœ๋ ฅ์ด ๋˜์ง€๋Š” ์•Š์Œ
            endStr: 'End ํ…์ŠคํŠธ',		// ์ผ์ • bar์— ์ถœ๋ ฅ์ด ๋˜์ง€๋Š” ์•Š์Œ
            classNames:['custom-className1','custom-className2'],
            editable: false,
            display: 'block',	// ์ง์‚ฌ๊ฐํ˜• bar๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.
            overlap: false,
            backgroundColor: 'red',
            borderColor: 'blue',
            textColor: 'white'
        }
    ]
});

 

์œ„ ์™€ ๊ฐ™์€ ์†์„ฑ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์บ˜๋ฆฐ๋”์˜ events ์†์„ฑ์˜ ๊ฐ์ฒด์ •๋ณด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ผ์ •๋ช…์€ '์ผ์ •๋ช…์ž…๋‹ˆ๋‹ค.', ์‹œ์ž‘์ผ๊ณผ ์ข…๋ฃŒ์ผ์€ '2024๋…„ 6์›” 19์ผ ์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ 2024๋…„ 6์›” 19์ผ ์˜คํ›„ 12์‹œ 50๋ถ„', ์‹œ์ž‘ ๋ฌธ์ž์—ด๊ณผ ๋ ๋ฌธ์ž์—ด์€ 'Start ํ…์ŠคํŠธ', 'End ํ…์ŠคํŠธ', ํ•ด๋‹น ์ผ์ • bar์— ์ƒ์„ฑ๋  class๋Š” 'custom-className1', 'custom-className2', ๋“œ๋ž˜๊ทธ ๋ฐ ํฌ๊ธฐ ์กฐ์ • ๋ถˆ๊ฐ€๋Šฅ, ์ผ์ • ๋ณด์—ฌ์ง€๋Š” view ์˜ต์…˜์€ ์ง์‚ฌ๊ฐํ˜• bar๊ฐ€ ๋‚˜ํƒ€๋‚  'block', ์ด๋ฒคํŠธ์™€ ์ด๋ฒคํŠธ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ overlap false ๋“ฑ๋“ฑ์˜ ์„ค์ •๋“ค์„ ์ด์šฉํ•ด์„œ events ๊ฐ์ฒด์ •๋ณด๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.

 

events ์†์„ฑ์„ ํ™œ์šฉํ•ด ์ผ์ • ๊ฐ์ฒด ์ƒ์„ฑ

 

๊ฐ ์„ค์ •์— ์˜ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์บ˜๋ฆฐ๋” View์ด๋‹ค. ๋ณดํ†ต์€ ์ €๋ ‡๊ฒŒ ๋งŽ์€ ์†์„ฑ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ฐ’์œผ๋กœ์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ ์†์„ฑ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์บ˜๋ฆฐ๋” ์ผ์ •์„ ํ•ธ๋“ค๋งํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ๊ฐ ์†์„ฑ๋“ค์˜ ์„ค์ •์— ๋”ฐ๋ผ์„œ events ์†์„ฑ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ผ์ • ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ข€ ๋” detailํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ events ์†์„ฑ์ด ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์— ์˜ํ•ด์„œ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ์˜ ํ˜„ํ™ฉ์ด๋‹ค. 

 

 

events ์†์„ฑ์˜ ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ๊ฐ’์œผ๋กœ 1๊ฐœ์˜ ์ผ์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ๋ฐฐ๊ฒฝ์ƒ‰ ์„ค์ •, ํ…Œ๋‘๋ฆฌ ์ƒ‰ ์„ค์ •, class๋ช…์„ 'custom-className'์œผ๋กœ 2๊ฐœ ์„ค์ •ํ•˜์˜€๊ณ , ๋ณด์—ฌ์ง€๋Š” ๋ฐฉ์‹, ํŽธ์ง‘ ์—ฌ๋ถ€, ์‹œ์ž‘์ผ, ์ข…๋ฃŒ์ผ, ์ผ์ •๋ช… ๋“ฑ๋“ฑ์„ ์—ฌ๋Ÿฌ ์†์„ฑ์ •๋ณด๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•˜๋ฉด calendar ๊ฐ์ฒด์•ˆ์— events ์†์„ฑ ์ •๋ณด๋ฅผ ์—ด์–ด๋ณด๋ฉด ์™ผ์ชฝ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ์˜ ํ˜„ํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์„ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ๊ฐ‘์„ ์ปจํŠธ๋กค ํ•˜๋Š” ๊ฑด, ๊ฐ€์žฅ ํฐ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์€ ์ผ์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š”๋ฐ์— ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ์ด์™ธ์— ๋‹ค์–‘ํ•œ ์†์„ฑ ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค๋กœ์˜ ํ•ธ๋“ค๋ง์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๊ธฐ๋„ ํ•˜๋‹ค. events ์†์„ฑ์€ ๋‚ด๊ฐ€ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•œ ์—ฌ๋Ÿฌ ์ผ์ • ๋ฐ์ดํ„ฐ๋ฅผ index์˜ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, groupId ํ˜•ํƒœ๋กœ ๋ฌถ์–ด์„œ๋„ ์ปจํŠธ๋กค์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐ className์œผ๋กœ๋„ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜๋„ ์žˆ์„๊ฒƒ์ด๋‹ค. ๋” ๋‹ค์–‘ํ•œ ์†์„ฑ์ •๋ณด์™€ ์†์„ฑ ์ •๋ณด์— ๋”ฐ๋ฅธ ๋‚ด์šฉ์€ ๋ณธ ์ž‘์„ฑ๊ธ€ 1,2 ๋˜๋Š” ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ์‹œ๋‹ค.

 

 

 

 

 

eventColor

' ๋‹ฌ๋ ฅ์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ์˜ ๋ฐฐ๊ฒฝ ๊ณผ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ์„ ์„ค์ •  '


eventColor ์†์„ฑ์€ ์บ˜๋ฆฐ๋”์— ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  ์ผ์ •(Event)์˜ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  Event์˜ ์ผ์ •์„ ์ผ๊ด„ ์ƒ‰์ƒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅธ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ผ์ •์„ ์ปจํŠธ๋กคํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •๋ณด๋‹ค๋Š” ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ „์ฒด ์ด๋ฒคํŠธ ์ˆ˜์ •์„ ์ง„ํ–‰ํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๊ฐœ๋ณ„ ์ผ์ •์„ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐœ๋ณ„ ์ผ์ •์ด ์šฐ์„ ์œผ๋กœ ์ž‘์—…๋ฉ๋‹ˆ๋‹ค. Event์˜ ์ƒ‰์ƒ์€ CSS ์ƒ‰์ƒ ํ˜•์‹('#ff00', '#ff0011', 'rgb(255,0,0)', 'red')์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. eventBackgroundColor, eventBorderColor, eventTextColor ์˜ต์…˜์„ ํ†ตํ•ด ๋”์šฑ ์„ธ๋ถ€์ ์ธ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  color ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค๋ณ„๋กœ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ๋ณ„๋กœ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  eventColor: '#3788d8',  // ๊ธฐ๋ณธ ์ผ์ • ์ƒ‰์ƒ (ํŒŒ๋ž€์ƒ‰)
  events: [
    { title: '์ผ์ •1', start: '2025-02-10' },
    { title: '์ผ์ •2', start: '2025-02-12' },
    { title: '์ผ์ •3', start: '2025-02-15' }
  ]
});
calendar.render();

 

๋ชจ๋“  ์ผ์ •์ด ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ์ถœ๋ ฅ๋จ

 

 

eventColor์™€ ๊ฐœ๋ณ„ ์ผ์ • ์ƒ‰์ƒ ๋น„๊ต

 

โœ…  ๊ฐœ๋ณ„ ์ผ์ •์— backgroundColor ์‚ฌ์šฉ ์‹œ

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  eventColor: '#3788d8',  // ๊ธฐ๋ณธ ํŒŒ๋ž€์ƒ‰
  events: [
    { title: '๊ธด๊ธ‰ ์ผ์ •', start: '2025-02-14', backgroundColor: '#ff0000' }, // ๋นจ๊ฐ„์ƒ‰
    { title: '์ •๊ธฐ ์ผ์ •', start: '2025-02-18' }                            // ๊ธฐ๋ณธ ํŒŒ๋ž€์ƒ‰
  ]
});
calendar.render();

 

๊ธด๊ธ‰์ผ์ •์€ ๋นจ๊ฐ•์ƒ‰, ์ผ๋ฐ˜ ์ผ์ •์€ ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ์„ค์ •

 

๊ธฐ๋ณธ์ ์ธ ์ผ์ •๊ณผ ๊ธด๊ธ‰ํ•œ ์ผ์ •์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋“ค์„ ์ƒ‰๊น”์„ ๋ณ„๋„๋กœ ์„ค์ •ํ•˜์—ฌ ์บ˜๋ฆฐ๋”์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ „์ฒด์ ์ธ ์ผ์ •์— ๊ฐ™์€ ์ƒ‰๊น”๋กœ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐœ๋ณ„ ์ผ์ •์„ ์„ค์ •ํ•  ๋•Œ 'backgroundColor' ์†์„ฑ์„ ํ†ตํ•ด ๊ฐœ๋ณ„ ์ผ์ • ์ƒ‰์ƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

eventTextColor๋กœ ๊ธ€์ž ์ƒ‰์ƒ ๋ณ€๊ฒฝ

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'dayGridMonth',
  eventColor: '#4caf50',        // ์ดˆ๋ก์ƒ‰ ๋ฐฐ๊ฒฝ
  eventTextColor: '#ffffff',    // ํฐ์ƒ‰ ๊ธ€์ž
  events: [
    { title: '์ผ์ •1', start: '2025-02-20' },
    { title: '์ผ์ •2', start: '2025-02-22' }
  ]
});
calendar.render();

 

 

 

 

 

 

editable

' ๋‹ฌ๋ ฅ์— ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • '


editable ์˜ต์…˜์€ ์ด๋ฒคํŠธ๋ฅผ ๋“œ๋ž˜๊ทธ ํ•˜๊ณ  ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋‘๊ฐ€์ง€ ์˜ต์…˜์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” eventStartEdition ๋ฐ eventDurationEditable์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ต์…˜์€ ํ•„์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ( '@fullcalendar/core' )์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.  ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ 'index.global.js'์— ํฌํ•จ๋˜์–ด ์žˆ์–ด global.js๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌด๋ฆฌ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
		editable: true
        	// editable: false
	});
	calendar.render();
});

 

 

editable ์˜ต์…˜์ด 'false'๋กœ ๋น„ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด ์œ„ ์˜์ƒ์ฒ˜๋Ÿผ ์ด๋™ ๋ฐ resize๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์˜ต์…˜ ๊ฐ’์„ 'true'์ธ ํ™œ์„ฑ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด ์ด๋™ ๋ฐ resize๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 

dayMaxEvents

' ํ•˜๋ฃจ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜  '


dayMaxEvents๋Š” ์บ˜๋ฆฐ๋”์—์„œ ํ•˜๋ฃจ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์œผ๋กœ ํ•ด๋‹น ๊ฐ’๋ณด๋‹ค ๋” ๋งŽ์€ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๋‚˜๋จธ์ง€ ์ด๋ฒคํŠธ ๋ถ€๋ถ„์€ '+๋”๋ณด๊ธฐ'๋งํฌ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๋‚ ์งœ์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์—… ๋˜๋Š” ํ™•์žฅ ๋ทฐ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. dayMaxEvents ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ํ•˜๋ฃจ์— ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ์€ ๋‚  ๋ณด๋‹ค ๊น”๋”ํ•œ ์ผ์ •์„ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๊ณ  '+๋”๋ณด๊ธฐ'์™€ ๊ฐ™์€ ๋งํฌ๋กœ ๋‚˜๋จธ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
      initialView: 'dayGridMonth',
      events: [
        { title: 'ํšŒ์˜ 1', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 2', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 3', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 4', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 5', start: '2025-02-10' }
      ],
      dayMaxEvents: 3  // ํ•˜๋ฃจ์— ์ตœ๋Œ€ 3๊ฐœ์˜ ์ด๋ฒคํŠธ๋งŒ ํ‘œ์‹œ
      // dayMaxEvents: true // true๋กœ ์„ค์ • ์‹œ, ์ ์ ˆํ•œ ๊ฐœ์ˆ˜๋กœ ์ž๋™ ์„ค์ •๋จ
    });
    calendar.render();
});

 

dayMaxEvents ์†์„ฑ์˜ ์›ํ•˜๋Š” ์ผ์ • ์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, 'true' ๊ฐ’์œผ๋กœ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†์„ฑ์˜ ๊ฐ’์„ true๋กœ ์„ค์ • ์‹œ์—๋Š” ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์ผ์ • ๊ฐœ์ˆ˜๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

 

'+2 more' ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํŒ์—…๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋‚˜ํƒ€๋‚˜๋ฉด์„œ ์ „์ฒด ์ผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, more ๋ฒ„ํŠผ์„ ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 'moreLinkClick' ์†์„ฑ์„ ํ†ตํ•ด ํด๋ฆญ ํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
      initialView: 'dayGridMonth',
      events: [
        { title: 'ํšŒ์˜ 1', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 2', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 3', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 4', start: '2025-02-10' },
        { title: 'ํšŒ์˜ 5', start: '2025-02-10' }
      ],
      dayMaxEvents: 3,  // ํ•˜๋ฃจ์— ์ตœ๋Œ€ 3๊ฐœ์˜ ์ด๋ฒคํŠธ๋งŒ ํ‘œ์‹œ
      // dayMaxEvents: true // true๋กœ ์„ค์ • ์‹œ, ์ ์ ˆํ•œ ๊ฐœ์ˆ˜๋กœ ์ž๋™ ์„ค์ •๋จ
      moreLinkClick: function(info) {
          alert('๋”๋ณด๊ธฐ ํด๋ฆญ: ' + info.date);
          // ์—ฌ๊ธฐ์„œ ํŒ์—…์„ ์—ด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ–‰๋™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
          return false; // ๊ธฐ๋ณธ ํŒ์—… ์—ด๋ฆผ ๋ฐฉ์ง€(false: ํŒ์—… ์—ด๋ฆผ, true: ํŒ์—… ์•ˆ์—ด๋ฆผ)
      }
    });
    calendar.render();
});

 

 

 

 

 

eventOverlap

' ๋“œ๋ž˜๊ทธํ•˜๊ณ  ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์„œ๋กœ ๊ฒน์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • '


eventOverlap ์†์„ฑ์€ ์ผ์ •(Event)์ด ์„œ๋กœ ๊ฒน์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๊ฒน์นจ ํ—ˆ์šฉ/์ฐจ๋‹จ ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ 'true' ์ž…๋‹ˆ๋‹ค. ์„ค์ •์ด 'false'๋กœ ๋น„ํ™œ์„ฑํ™” ๋œ๋‹ค๋ฉด ์–ด๋– ํ•œ ์ด๋ฒคํŠธ๋„ ๊ฒน์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๊ฒน์นจ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์ด๋ฒคํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ์™€ ๊ฐ™์ด ๊ต์ฐจํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์Œ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜ธ์ถœ์€ eventOverlap ์†์„ฑ์˜ ๊ฐ’์ด 'true'๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ, ๋‘ ์ด๋ฒคํŠธ ๋ชจ๋‘๊ฐ€ ํ•˜๋ฃจ ์ข…์ผ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฒน์นจ์„ ํ˜€์šฉํ•ฉ๋‹ˆ๋‹ค.

 

// ๊ธฐ๋ณธ ์„ค์ •
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',
  events: [
    { title: '์ผ์ •1', start: '2025-02-10T10:00:00', end: '2025-02-10T12:00:00' },
    { title: '์ผ์ •2', start: '2025-02-10T11:00:00', end: '2025-02-10T13:00:00' }
  ]
});
calendar.render();


// ํŠน์ • ์ผ์ •์—๋งŒ ๊ฒน์นจ ํ™œ์„ฑํ™” (function์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•)
var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',
  eventOverlap: function(stillEvent, movingEvent) {
    // "์ค‘์š” ์ผ์ •"์€ ๊ฒน์น  ์ˆ˜ ์—†์Œ
    if (stillEvent.title === '์ค‘์š” ์ผ์ •1') {
      return false;  // ๊ฒน์นจ ๊ธˆ์ง€
    }
    return true;     // ๋‚˜๋จธ์ง€๋Š” ๊ฒน์นจ ํ—ˆ์šฉ
  },
  editable: true,
  events: [
    { title: '์ค‘์š” ์ผ์ •1', start: '2025-02-12T09:00:00', end: '2025-02-12T11:00:00' },
    { title: '์ผ๋ฐ˜ ์ผ์ •2', start: '2025-02-12T10:00:00', end: '2025-02-12T12:00:00' }
  ]
});
calendar.render();

 

๊ธฐ๋ณธ์„ค์ •์€ ์ผ์ •์ด ๊ฒน์น ์ˆ˜ ์žˆ์Œ

 

์†์„ฑ ์š”์•ฝ

์†์„ฑ ์„ค๋ช… ์˜ˆ์ œ ๊ฐ’
eventOverlap ์ผ์ • ๊ฐ„ ๊ฒน์นจ ํ—ˆ์šฉ ์—ฌ๋ถ€ true, false, function
overlap (๊ฐœ๋ณ„ ์ผ์ •) ํ•ด๋‹น ์ผ์ •์— ๋Œ€ํ•œ ๊ฒน์นจ ํ—ˆ์šฉ ์—ฌ๋ถ€ true, false

 

 

 

 

 

nowIndicator

' ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•  ์ง€ ์—ฌ๋ถ€ '


์‚ฌ์šฉ์ž๊ฐ€ ๋‹ฌ๋ ฅ์„ ๋ณด๋Š” ๋™์•ˆ ํ‘œ์‹œ๊ธฐ๊ฐ€ ํ˜„์žฌ ๋‚ ์งœ์˜ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ต์…˜์˜ ์„ค์ •์€ 'TimeGrid'์™€ ๊ฐ™์€ ์‹œ๊ฐ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๋‹น ์˜์—ญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ 2025๋…„ 02์›” 03์ผ ์˜คํ›„ 17์‹œ 10๋ถ„์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ์ผ์ž์˜ ํ•ด๋‹น ์‹œ๊ฐ„ ์˜์—ญ์˜ ํ‘œ์‹œ๊ธฐ๊ฐ€ ๋นจ๊ฐ„์ƒ‰ ์„ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
		nowIndicator : true
        	// nowIndicator : false
	});
	calendar.render();
});

 

TimeGird ๋ณด๊ธฐ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ
Timeline ๋ทฐ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ

 

๋‹ฌ๋ ฅ ๋‚ด, ํ•ด๋‹น ๋‚ ์งœ์˜ ํ˜„์žฌ ์‹œ๊ฐ„์„ ํ‘œ์‹œ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ์‹œ๊ฐ„์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

titleFormat

' headerToolbar์˜ ์ œ๋ชฉ์— ํ‘œ์‹œ๋  ํ…์ŠคํŠธ๋ฅผ ์„ค์ • '


headerToolbar ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด 'title'์— ํ•ด๋‹นํ•˜๋Š” ๋‚ ์งœ ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋‚ ์งœ ํ…์ŠคํŠธ๋ฅผ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. titleFormat์„ ์ด์šฉํ•˜์—ฌ ๋…„, ์›”, ์ผ์„ ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ํผ์œผ๋กœ ๋งž์ถฐ์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ 'year', 'month', 'day', 'weekday' ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๋…„/์›”/์ผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์†์„ฑ ๊ฐ’ ์ถœ๋ ฅ ์˜ˆ
year numeric '2024'
2-digit '24'
month long 'September'
short 'Sep'
narrow 'S'
numeric '1'
2-digit '01'
day numeric '3'
2-digit '03'
weekday long 'Wednesday'
short 'Wed'
narrow 'W'
hour numeric '5'
2-digit '05'
minute numeric '6'
2-digit '06'
second numeric '9'
2-digit '09'
hour12 true 12์‹œ๊ฐ„์ œ
false 24์‹œ๊ฐ„์ œ
timeZoneName short 'long'์€ FullCalendar์—์„œ ์ œ๊ณต X

 

์œ„ ํ‘œ์—์„œ ๋‚˜ํƒ€๋‚˜๋“ฏ์ด ๊ฐ ์†์„ฑ์— ํ•ด๋‹น ์†์„ฑ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ถœ๋ ฅ ํ˜•ํƒœ์˜ ํ…์ŠคํŠธ๋กœ 'title'์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด default๋กœ ์ œ๊ณต๋˜๋Š” title์„ ์ด์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ์ž๊ธฐ๋งŒ์˜ title์„ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
    headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay'
    },
    views: {
        dayGridMonth: {
            titleFormat: {
                year: 'numeric',
                month: '2-digit',
                day: '2-digit'
            }
        }
    }
});

 

titleFormat ์„ค์ •์„ ์ด์šฉํ•ด ๋‹ฌ๋ ฅ title ์„ค์ •

 

'title'์— ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ๋Š” ๋‚ ์งœ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ์†์„ฑ๊ณผ ์†์„ฑ ๊ฐ’๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Moment JS์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•ด๋„ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'titleFormat' ์†์„ฑ์— function์„ ์ง€์ •ํ•ด ์ง์ ‘ ์„œ์‹ ์ง€์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 

buttonText

' headerToolbar, footerToolbar์˜ ๋ฒ„ํŠผ์— ํ‘œ์‹œ๋  ํ…์ŠคํŠธ '


headerToolbar, footerToolbar์—์„œ ๋ฒ„ํŠผ์— ํ‘œ์‹œ๋  ํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 'today', 'month', 'week', 'day', 'list' ๋ฒ„ํŠผ์˜ ํ…์ŠคํŠธ๋Š” default ๊ฐ’์œผ๋กœ ์†์„ฑ๋ช…๊ณผ ๋™์ผํ•˜๋‹ค( 'today', 'month', 'week', 'day', 'list' ). ๋ฒ„ํŠผ๋ช…์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ์—๋Š” 'buttonText' ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ฒ„ํŠผ๋ช…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
    headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay',
    },
    buttonText: {
        today : 'ํ˜„์žฌ๋‚ ์งœ',
        month : '์›”',
        week: '์ฃผ',
        day: '์ผ',
        list: '๋ชฉ๋ก'
    }
});

 

buttonText ์†์„ฑ์„ ์„ค์ •ํ•  ๋•Œ

 

 

 

 

 

themeSystem

' ์ฃผ์–ด์ง„ ํ…Œ๋งˆ ์‹œ์Šคํ…œ์œผ๋กœ ๋‹ฌ๋ ฅ์„ ๋žœ๋”๋ง '


themeSystem ์†์„ฑ์€ FullCalendar์— ๊ธฐ๋ณธ CSS๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ฌ๋ ฅ ๋””์ž์ธ ํ˜•ํƒœ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ BootStrap์„ ์ด์šฉํ•˜์—ฌ ๋‹ฌ๋ ฅ ๋””์ž์ธ ํ˜•ํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. BootStrap4์™€ BootStrap5 ๋ฒ„์ „ ๋‘ ๊ฐœ ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. themeSystem ์†์„ฑ์€ 'standard'๊ฐ€ default๊ฐ’์ด๊ณ , 'bootstrap', 'bootstrap5' ๋‘ ๊ฐœ์˜ ์†์„ฑ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.

BootStrap5 ๋ฒ„์ „์œผ๋กœ ๋‹ฌ๋ ฅ ๋””์ž์ธ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ด€๋ จ CSS์™€ JS๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ƒ๋‹จ์— linkํƒœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ CSS๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•˜๋‹จ์—๋Š” scriptํƒœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ JS๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋ถ€ํŠธ์ŠคํŠธ๋žฉ 5 ๊ด€๋ จ CSS์™€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ Icon๊ด€๋ จ CSS๋ฅผ ์ถ”๊ฐ€

<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css' rel='stylesheet'>

 

๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 ๊ด€๋ จ JS๋ฅผ ์ถ”๊ฐ€

<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.14/index.global.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@fullcalendar/bootstrap5@6.1.14/index.global.min.js"></script>

 

var calendar = new FullCalendar.Calendar(calendarEl, {
    themeSystem: 'bootstrap5',	// BootStrap5 ๋ฒ„์ „์œผ๋กœ ๋””์ž์ธ ์„ค์ •
    headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay',
    },
    buttonText: {
        today : 'ํ˜„์žฌ๋‚ ์งœ',
        month : '์›”',
        week: '์ฃผ',
        day: '์ผ',
        list: '๋ชฉ๋ก'
    },
    events: 'https://fullcalendar.io/api/demo-feeds/events.json'
});

 

themeSystem ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 ๋””์ž์ธ ์ ์šฉ

 

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ด€๋ จ CSS์™€ JS๋ฅผ ํ™œ์šฉํ•˜์—ฌ FullCalendar JS themeSystem์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 ๋ฒ„์ „์˜ ๋‹ฌ๋ ฅ ๋””์ž์ธ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ธฐ์กด ๊ฒ€์€์ƒ‰์œผ๋กœ ๋””์ž์ธ๋˜์–ด ์žˆ๋˜ ๋ฒ„ํŠผ๋“ค์˜ ์ƒ‰๊น”๊ณผ ๋””์ž์ธ์ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ธฐ๋ณธ primary ์ข…๋ฅ˜์˜ ์ƒ‰๊น”๊ณผ ๋””์ž์ธ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

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

 

 

 

 

 

@Junesker


 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€