본문으로 건너뛰기

DatePicker

이 컨트롤은 무엇인가요?

DatePicker<syn_datepicker> 태그 하나로 "달력 아이콘 버튼 + 날짜 입력창"을 만들어 주는 레거시 내부 JS UI 컨트롤입니다. 실제 화면에서는 Pikaday 라이브러리를 내부적으로 사용해서 달력 팝업을 그리고, 선택한 날짜를 텍스트 입력창(input[type=text])에 채워 넣습니다.

syn.loader.js가 페이지에 있는 <syn_datepicker> 태그를 찾아서 자동으로 다음을 처리합니다.

  • DatePicker.js / DatePicker.css 등 필요한 스크립트·스타일 자동 주입
  • 원래 태그를 숨김 처리(display: none)하고, 그 옆에 실제 보이는 input과 달력 버튼을 생성
  • syn.uicontrols.$datepicker 싱글턴 객체에 컨트롤 정보 등록 (getValue / setValue / clear 등으로 제어 가능)

이름은 $datepicker 이지만, 페이지에서 사용하는 태그명은 syn_datepicker 입니다. 이 문서 전체에서 "DatePicker 컨트롤"이라 하면 이 둘을 함께 가리킵니다.

언제 사용하나요?

  • 회원 가입일, 계약일, 마감일처럼 날짜 1개만 입력받아야 할 때 사용합니다.
  • 조회 시작일/종료일처럼 날짜 2개(기간) 를 하나의 짝으로 다루어야 한다면 DatePicker를 2개 두고 useRangeSelect 옵션으로 서로 연동시키거나(아래 API.md 참고), 또는 형제 컨트롤인 DatePeriodPicker (syn.uicontrols.$dateperiodpicker) 를 사용하는 것이 더 간단합니다. DatePeriodPicker는 시작일~종료일을 하나의 컨트롤에서 한 번에 관리하도록 설계된 별도 컨트롤입니다.
  • 요약하면:
    • 날짜 1개, 단순 입력 → DatePicker
    • 날짜 1개씩이지만 두 개를 서로 최소/최대로 연동하고 싶다 → DatePicker + useRangeSelect
    • 처음부터 "기간(period)" 개념으로 다루고 싶다 → DatePeriodPicker

빠른 시작

<form autocomplete="off" id="form1" syn-datafield="MainForm">
<syn_datepicker id="dtpBirthday" syn-datafield="Birthday"></syn_datepicker>
</form>

<script src="/js/syn.loader.js"></script>

이렇게만 작성해도 syn.loader.js가 알아서 필요한 리소스를 불러오고, 화면에는 텍스트 입력창과 달력 아이콘 버튼이 나타납니다. 버튼을 누르면 달력이 열리고, 날짜를 클릭하면 입력창에 값이 채워집니다.

값을 코드로 다루고 싶다면 아래처럼 syn.uicontrols.$datepicker를 사용합니다.

// 값 읽기
var value = syn.uicontrols.$datepicker.getValue('dtpBirthday'); // 예: '2026-07-06'

// 값 설정
syn.uicontrols.$datepicker.setValue('dtpBirthday', '2026-01-01');

// 값 초기화
syn.uicontrols.$datepicker.clear('dtpBirthday');

예제 실행하기

이 폴더의 example 하위 폴더에 있는 HTML 파일을 웹서버(예: rdy 실행 중인 wwwroot)를 통해 브라우저로 열어보세요. file://로 직접 열면 syn.loader.js가 정상 동작하지 않을 수 있으니 반드시 프로젝트를 실행한 상태에서 접속해야 합니다.

  • example/basic.html : 가장 단순한 날짜 1개 선택 예제
  • example/format.html : format, minDate, maxDate 등 옵션 예제
  • example/events.html : 선택(onselect) 이벤트, getValue/setValue/clear 버튼 데모

각 HTML은 같은 이름의 .js 파일과 짝을 이루며, 화면 하단 로그 영역에 syn.$l.eventLog로 동작 로그가 출력됩니다.

더 알아보기

  • 상세 옵션·메서드·이벤트 표는 아래 API 참조 섹션 문서를 참고하세요.
  • 달력 팝업 자체의 세부 동작(연/월 이동, 다중 월 표시 등)은 내부적으로 사용하는 Pikaday 라이브러리 문서를 참고하세요: https://github.com/Pikaday/Pikaday
  • 기간(시작일~종료일)을 한 번에 다루려면 형제 컨트롤 DatePeriodPicker(syn.uicontrols.$dateperiodpicker)를 확인하세요.
  • 소스 위치: uicontrols/DatePicker/DatePicker.js, uicontrols/DatePicker/DatePicker.css

실전 예제 페이지

/uicontrols/DatePicker/example/ 경로의 예제를 아래 iframe에서 바로 확인할 수 있습니다.

basic.html

events.html

format.html

소스와 로드 파일

항목내용
컨트롤DatePicker
전역 별칭syn.uicontrols.$datepicker
버전v2025.10.1
소스uicontrols/DatePicker/DatePicker.js
스타일uicontrols/DatePicker/DatePicker.css

API 참조

소스 근거: uicontrols/DatePicker/DatePicker.js (syn.uicontrols.$datepicker, version v2025.10.1)

마크업

<syn_datepicker
id="dtpTourDate"
syn-datafield="TourDate"
syn-options="{belongID: ['UD01', 'MD01']}">
</syn_datepicker>
  • id : 컨트롤 식별자. 필수. 이 id로 getValue/setValue/clear/getControl을 호출합니다.
  • syn-datafield : 폼 전송/바인딩 시 사용할 데이터 필드명. 생략 가능.
  • syn-options : 아래 "Options" 표의 값을 JSON 형태 문자열로 지정. 생략 가능.
  • syn-events : 내부적으로 생성되는 실제 input 요소에 그대로 전달됩니다(예: ['change']). 다만 날짜 선택 관련 이벤트는 아래 "이벤트" 절의 {elID}_onselect 관례를 사용하는 것을 권장합니다.

로더가 처리한 뒤 실제 DOM 구조는 다음과 같이 바뀝니다.

  • 원래 <syn_datepicker id="dtpTourDate"> 태그 → id="dtpTourDate_hidden"으로 변경되고 display:none 처리(내부 설정 보관용)
  • 그 자리에 실제 보이는 <input id="dtpTourDate" type="text"> 생성 (마스크 9999-99-99, editType: 'date' 자동 적용)
  • 바로 뒤에 달력 아이콘 버튼 <button id="dtpTourDate_Button"> 생성

Options (defaultSetting)

옵션타입기본값설명
elIDstring''내부적으로 자동 설정됨(직접 지정 불필요)
widthstring'100%'컨트롤 너비
valuestring''초기값. 'now', 'day:N', 'week:N', 'month:N', 'year:N' 형태 지정 가능(N은 양/음수). 예: 'day:-7' → 오늘 기준 7일 전
placeholderstring''입력창 placeholder. 값이 없을 때(달력 닫힘 시점 기준) 자동 적용
defaultDateDate/nullnull달력을 열었을 때 기본으로 표시할 날짜(Pikaday 옵션)
setDefaultDatebooleanfalsetruedefaultDate를 실제 선택값으로도 사용
minDateDate/nullnull선택 가능한 최소 날짜
maxDateDate/nullnull선택 가능한 최대 날짜
boundbooleantrue입력 필드에 종속되어 포커스/클릭 시 달력을 여닫을지 여부(Pikaday 옵션)
formatstring'YYYY-MM-DD'표시 날짜 포맷(moment.js 포맷 문자열)
ariaLabelstring'날짜를 선택 하세요'접근성 라벨
i18nobject한국어 월/요일 명 세트달력에 표시할 월/요일 이름(직접 바꿀 일은 거의 없음)
showWeekNumberbooleanfalse주차 번호 표시 여부
showMonthAfterYearbooleantrue헤더에서 "연도 뒤에 월" 표시 순서
showDaysInNextAndPreviousMonthsbooleantrue이전/다음 달 날짜를 회색으로 함께 표시할지 여부
enableSelectionDaysInNextAndPreviousMonthsbooleantrue이전/다음 달의 흐린 날짜도 클릭 선택 가능하게 할지 여부
yearSuffixstring'년'연도 뒤에 붙는 접미사
firstDaynumber0한 주의 시작 요일(0=일요일)
useRangeSelectbooleanfalsetrue로 설정하면 다른 DatePicker와 시작일/종료일로 연동(2개 이상 짝)
rangeStartControlIDstring/nullnulluseRangeSelect: true일 때 시작일 컨트롤 id. 생략 시 자기 자신 id
rangeEndControlIDstring/nullnulluseRangeSelect: true일 때 종료일 컨트롤 id. 생략 시 자기 자신 id
numberOfMonthsnumber1달력에 동시에 표시할 개월 수
dataTypestring'string'값 데이터 타입
belongIDstring/array/nullnull하위 텍스트박스 컨트롤에 전달되는 소속 그룹 식별자(예: 컨테이너/폼 그룹 연동용). 값이 있으면 배열/문자열 여부에 따라 자동으로 JSON 처리되어 내부 inputsyn-options에 전달됨
getterbooleanfalse값 조회 시 커스텀 처리 여부(프레임워크 공통 옵션)
setterbooleanfalse값 설정 시 커스텀 처리 여부(프레임워크 공통 옵션)
controlTextany/nullnull표시용 텍스트 커스터마이즈(프레임워크 공통 옵션)
validatorsany/nullnull유효성 검사 규칙(프레임워크 공통 옵션)
transactConfigany/nullnull트랜잭션 연동 설정(프레임워크 공통 옵션)
triggerConfigany/nullnull트리거 연동 설정(프레임워크 공통 옵션)

useRangeSelect 사용 예:

<syn_datepicker id="dtpStart" syn-options="{useRangeSelect: true, rangeEndControlID: 'dtpEnd'}"></syn_datepicker>
<syn_datepicker id="dtpEnd" syn-options="{useRangeSelect: true, rangeStartControlID: 'dtpStart'}"></syn_datepicker>

시작일을 선택하면 종료일의 minDate가 자동으로 갱신되고, 종료일을 선택하면 시작일의 maxDate가 자동으로 갱신됩니다.

메서드

메서드시그니처설명
getValuegetValue(elID, meta)입력창(실제 input)에 표시된 현재 값을 문자열로 반환
setValuesetValue(elID, value, meta)지정한 값으로 날짜를 설정(Pikaday setDate 사용). valueDate 객체 또는 파싱 가능한 날짜 문자열
clearclear(elID, isControlLoad)선택값을 초기화(Pikaday clear 사용)
getControlgetControl(elID)객체 설정 형태의 내부 컨트롤 객체 반환. picker는 Pikaday 인스턴스(Pikaday 메서드 문서 참고: getDate(), setDate(), show(), hide(), setMinDate(), setMaxDate() 등)
updateRangeDateupdateRangeDate(elID, date)useRangeSelect 연동 컨트롤 간 날짜 갱신(내부용, 직접 호출할 일 거의 없음)
setLocalesetLocale(elID, translations, control, options)로케일 훅(현재 구현은 비어 있음 — 다국어 전환 시 확장 지점)

이벤트 (syn-events)

DatePicker는 다른 컨트롤처럼 syn-events 속성에 이벤트 이름을 나열하는 방식이 아니라, 페이지 스크립트의 event 객체에 {elID}_onselect 함수를 정의해두면 자동으로 호출되는 관례를 사용합니다.

이벤트(관례 함수명)호출 시점콜백 인자
{elID}_onselect(elID, date)달력이 열릴 때(onOpen), 닫힐 때(onClose), 날짜를 클릭해 선택할 때(onSelect) 모두 동일하게 호출됨elID : 컨트롤 id(string), date : 현재 Pikaday getDate() 결과(Date 객체, 선택 안 됐으면 null일 수 있음)

예:

let $mypage = {
event: {
dtpTourDate_onselect(elID, date) {
syn.$l.eventLog('dtpTourDate_onselect', elID + ' => ' + date);
}
}
}

이 외에 실제 생성되는 input 요소는 텍스트박스 컨트롤(syn.uicontrols.$textbox)의 표준 이벤트(change 등)도 syn-events 속성을 통해 그대로 사용할 수 있습니다.

참고

  • 내부적으로 Pikadaymoment.js를 사용합니다.
  • 기간(시작~종료) 개념 자체를 컨트롤 하나로 다루려면 형제 컨트롤 DatePeriodPicker(syn.uicontrols.$dateperiodpicker)를 사용하세요.
  • 예제: example/basic.html, example/format.html, example/events.html