[Nexacro N] Combo — 드롭다운 목록의 구조와 데이터 바인딩

Nexacro N Combo 컴포넌트의 innerdataset·codecolumn·displaycolumn 바인딩, 정적 데이터 초기화, 서버 데이터 연동, onchanged 이벤트, 드롭다운 스타일 설정, 연동 Combo 패턴을 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 Radio와 CheckBox로 미리 정해진 항목을 선택하는 방법을 살펴봤습니다. 선택 항목이 많아지면 Radio 대신 Combo 컴포넌트가 적합합니다. Combo는 드롭다운 목록에서 항목을 선택하는 UI로, 코드/명칭 구조의 데이터를 표시하고 선택하는 데 특화되어 있습니다. Nexacro N의 Combo는 Dataset과의 바인딩 구조가 명확하게 설계되어 있어, 한번 이해하면 매우 유연하게 활용할 수 있습니다.

Combo 컴포넌트 구조

Combo는 화면에 현재 선택 항목을 표시하는 박스 영역과 클릭 시 펼쳐지는 드롭다운 목록으로 구성됩니다. 사용자가 항목을 선택하면 드롭다운이 닫히고 선택 항목이 박스에 표시됩니다.

핵심은 코드(code)와 명칭(name)의 분리입니다. 사용자에게는 명칭(예: “개발팀”)을 보여주지만, 내부적으로는 코드(예: “02”)를 저장합니다.

데이터 바인딩 3요소

// Combo 데이터 바인딩 설정
function Form_onload(obj, e) {
    // innerdataset: 목록 데이터 소스 Dataset
    this.cmbDept.set_innerdataset("dsCode");
    // codecolumn: value에 저장될 컬럼 (코드)
    this.cmbDept.set_codecolumn("DEPT_CD");
    // displaycolumn: 화면에 표시될 컬럼 (명칭)
    this.cmbDept.set_displaycolumn("DEPT_NM");
}

이 세 가지만 설정하면 dsCode Dataset의 데이터가 드롭다운 목록으로 표시됩니다. 사용자가 항목을 선택하면 cmbDept.value에는 DEPT_CD 컬럼의 값이 저장됩니다.

Combo — 데이터 바인딩 구조

정적 데이터 초기화

항상 고정된 코드 목록(성별, 사용 여부 등)은 Dataset에 하드코딩합니다.

// Dataset에 직접 데이터 추가
function fn_initGenderCombo() {
    var ds = this.dsGender;
    ds.clearData();
    // 전체 선택 항목 추가 (공백 코드)
    ds.addRow();
    ds.setColumn(0, "CD", "");
    ds.setColumn(0, "NM", "-- 선택 --");
    // 실제 코드 항목
    ds.addRow();
    ds.setColumn(1, "CD", "M");
    ds.setColumn(1, "NM", "남성");
    ds.addRow();
    ds.setColumn(2, "CD", "F");
    ds.setColumn(2, "NM", "여성");
    // 바인딩
    this.cmbGender.set_innerdataset("dsGender");
    this.cmbGender.set_codecolumn("CD");
    this.cmbGender.set_displaycolumn("NM");
}

”— 선택 —” 같은 기본 선택 항목을 첫 행에 추가하면 사용자가 필수 입력 여부를 쉽게 알 수 있습니다.

서버에서 공통 코드 로딩

실무에서는 공통 코드를 서버에서 가져와 Combo에 바인딩합니다.

// 공통 코드 조회 트랜잭션
function fn_loadCodeCombo(sSvcCd) {
    var sUrl = "svc/common/getCodeList.do";
    var sInput = "dsParam:dsParam";
    var sOutput = "dsCode:dsCode";

    // 조회 조건 Dataset에 서비스 코드 입력
    this.dsParam.clearData();
    this.dsParam.addRow();
    this.dsParam.setColumn(0, "SVC_CD", sSvcCd);

    this.transaction(
        "fnLoadCode",
        sUrl,
        sInput,
        sOutput,
        "",
        "fn_loadCodeCombo_cb"
    );
}

// 콜백
function fn_loadCodeCombo_cb(sSvcId, nErrorCode, sErrorMsg) {
    if (nErrorCode < 0) {
        alert("코드 조회 실패: " + sErrorMsg);
        return;
    }
    this.cmbDept.set_innerdataset("dsCode");
    this.cmbDept.set_codecolumn("DEPT_CD");
    this.cmbDept.set_displaycolumn("DEPT_NM");
}

onchanged 이벤트

Combo에서 선택이 바뀔 때 onchanged가 발생합니다.

function cmbDept_onchanged(obj, e) {
    var sDeptCd = obj.value;       // 선택된 코드
    var sDeptNm = obj.displayvalue; // 화면 표시 명칭
    trace("선택: " + sDeptCd + " / " + sDeptNm);
    // 부서 선택 시 담당자 목록 리로드
    this.fn_loadManagerList(sDeptCd);
}

obj.value는 코드, obj.displayvalue는 현재 표시 중인 명칭을 반환합니다.

Combo — 데이터 초기화 패턴

연동 Combo 패턴 (Cascading)

첫 번째 Combo 선택에 따라 두 번째 Combo 목록이 바뀌는 패턴입니다.

// 시도 Combo 변경 → 시군구 Combo 갱신
function cmbSido_onchanged(obj, e) {
    var sSidoCd = obj.value;
    if (!sSidoCd) {
        this.dsGungu.clearData();
        return;
    }
    // 시군구 데이터 서버 조회
    this.fn_loadGungu(sSidoCd);
}

function fn_loadGungu(sSidoCd) {
    this.dsGunguParam.clearData();
    this.dsGunguParam.addRow();
    this.dsGunguParam.setColumn(0, "SIDO_CD", sSidoCd);
    this.transaction(
        "fnLoadGungu",
        "svc/common/getGungu.do",
        "dsGunguParam:dsGunguParam",
        "dsGungu:dsGungu",
        "",
        "fn_loadGungu_cb"
    );
}

function fn_loadGungu_cb(sSvcId, nErrorCode, sErrorMsg) {
    if (nErrorCode < 0) return;
    this.cmbGungu.set_innerdataset("dsGungu");
    this.cmbGungu.set_codecolumn("GUNGU_CD");
    this.cmbGungu.set_displaycolumn("GUNGU_NM");
    this.cmbGungu.set_value(""); // 첫 번째 항목으로 초기화
}

드롭다운 스타일 설정

드롭다운 높이, 항목 간격, 폰트 크기 등은 dropdowncount, itemheight 속성으로 조절합니다.

// 최대 표시 항목 수 (기본 5~7)
this.cmbDept.set_dropdowncount(8);

// 항목 높이 (픽셀)
this.cmbDept.set_itemheight(24);

Combo 초기화 (선택 해제)

현재 선택을 해제하려면 set_value("")를 사용합니다.

// Combo 선택 초기화
function fn_clearCombos() {
    this.cmbDept.set_value("");
    this.cmbGender.set_value("");
}

빈 문자열을 설정하면 ”— 선택 —” 항목(코드가 빈 문자열인 첫 번째 항목)이 선택됩니다. 첫 번째 항목이 빈 코드가 아니면 드롭다운이 아무것도 선택되지 않은 상태가 됩니다.

Combo와 Edit 차이점

항목ComboEdit
입력 방식목록에서 선택직접 타이핑
자유 입력기본 불가가능
코드/명칭 분리내장 지원별도 처리 필요
목록 표시드롭다운없음
데이터 오류 위험낮음 (목록 내에서만)높음

항목이 고정된 경우, 특히 코드/명칭 구조의 데이터는 항상 Combo를 선택하는 것이 안전합니다.


지난 글: Radio / CheckBox — 선택 컴포넌트 활용 가이드

다음 글: Select / MultiSelect — 리스트 박스 선택 컴포넌트


읽어주셔서 감사합니다. 😊