주말에 THREE.JS를 이용해 만든 것

제 유튜브 채널을 통해 강좌로 소개할 것들에 대해 먼저 결과 만을 찍어 먼저 올려 봅니다. 아마 바로 돌아오는 이번주 토요일 쯤.. 아래 2개 중 한 개를 찍어 올릴 듯 합니다.

제 유튜브 채널 이름은 GIS Developer 입니다. 채널을 구독하시면 영상 업로드 시 바로 알 수 있습니다.

#GWC UI Library : gwcInput 함수

웹 UI 라이브러리인 GWC에서 제공하는 gwcInput 함수에 대한 예제 코드입니다.

먼저 DOM 구성은 다음과 같습니다.

그리고 CSS 구성은 다음과 같구요.

.center {
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
    gap: 3em;
}

js 코드는 다음과 같습니다.

window.onload = () => {
    button.onclick = event => { 
        gwcInput({
            message: "폴더 이름을 입력하세요",
            value: "이름", // optional
            onOkay: (value) => { // 확인 버튼 처리
                console.log(value);
                if(value.trim().length === 0) {
                    gwcMessage("값을 입력하세요.", true);
                    return false; // false를 반환하면 입력창이 닫히지 않음
                } else {
                    gwcMessage(`입력한 값은 ${value} 입니다.`);
                }
            },
            onCancel: (value) => { // 취소 버튼 처리
                // false를 반환하면 입력창이 닫히지 않음
                //return false; 
            }
        });
    };
};

실행 결과는 다음과 같습니다.

gwcInput 함수는 표시되는 대화상자에 대한 객체를 반환합니다. 이 객체가 dlg라고 할때 내부에 표시되는 메세지를 1초마다 변경하다가 수초 경과 후 자동으로 닫히게 하는 코드는 다음과 같습니다.

let i = 0;
setInterval(() => {
    i++;
    dlg.message = i;

    if(i === 4) dlg.remove();
}, 1000);

GWC UI Library를 이용한 입력폼 개발

GWC 라이브러리를 이용해 실제 프로젝트에 적용한 예입니다. 아래의 영상은 GWC 라이브러리만을 이용해 만든 UI입니다.

JS 코드는 다음과 같습니다.

const dlg = gwcCreateModalDialog("SHP 파일을 레이어로 추가");
dlg.content = `
    
이곳을 클릭하거나
이곳에 파일을 드래그 하세요.
4326 5174 5178 5179 5181 3857
`; dlg.content.querySelector("gwc-button").addEventListener("click", () => { dlg.remove(); }); dlg.show(); GeoServiceWebComponentManager.instance.update();

위의 코드에서 사용한 css는 다음과 같습니다.

/* common */

.vertical-linear-layout {
    display: flex;
    flex-direction: column;
    gap: 0.3em;
}

.horizontal-linear-layout {
    display: flex;
    gap: 0.3em;
    flex-direction: row;
    padding: 0 1em;
}

.v-center {
    align-items: center;
}

.h-center {
    justify-content: center;
}

.v-space {
    margin-top: 0.5em;
    margin-bottom: 0.5em;
}

gwc-toolbutton {
    zoom: 0.45;
}

gwc-button {
    zoom: 0.9;
}

gwc-select {
    zoom: 0.8;
}

/* AddSHPFileDialog */

.add-shp-file-dialog .file-zone {
    font-size: 1em;
    width: 20em;
    height: 10em;
    
    color: white;
    text-align: center;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    border: 1px dashed rgba(255,255,255,0.3);
    background-color: rgba(0,0,0,0.4);
    box-shadow: inset 1px 1px 20px black, 1px 1px 5px black;
    border-radius: 0.4em;
}

.add-shp-file-dialog gwc-label {
    width: 120px;
}

.add-shp-file-dialog gwc-select {
    width: 10em;
}

.add-shp-file-dialog .title {
    width: 20em;
}

.add-shp-file-dialog .folder {
    width: 17.3em;
}

.add-shp-file-dialog gwc-resizable-panel {
    position:relative;
    width: calc(20em + 7px);
    height: 10em
}

.add-shp-file-dialog gwc-resizable-panel gwc-memo {
    width: 100%;
    height: 100%;
}

#GWC UI Library : gwcCreateModalDialog 함수 [DEPRECATED]

웹 UI 라이브러리인 GWC에서 제공하는 gwcCreateModalDialog 함수에 대한 예제 코드입니다.

먼저 DOM 구성은 다음과 같습니다.

그리고 CSS 구성은 다음과 같구요.

.center {
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    gap: 1em;
}

.hcenter {
    display: flex;
    align-items: center;
    flex-direction: column;
    padding: 0.3em;
    gap: 0.6em;
 }

.vcenter {
    display: flex;
    align-items: center;
}

gwc-textinput {
    width: 20em;
}

js 코드는 다음과 같습니다.

window.onload = () => {
    btn.addEventListener("click", () => {
        const dlg = gwcCreateModalDialog("모달 대화상자");
        dlg.content = `
            
`; dlg.content.querySelector("gwc-button").addEventListener("click", () => { dlg.remove(); }); dlg.show(); }); //GeoServiceWebComponentManager.instance.update(); };

실행 결과는 다음과 같습니다.

PostreSQL의 PL/pgSQL에서, 최대값을 구해 다음 값으로 데이터 추가하기

먼저 다음과 같은 테이블이 있습니다.

-- DIRECTORY
CREATE TABLE directory (
    id INTEGER, -- 디렉토리 ID
    parent_id INTEGER, -- 부모 디렉토리 (null 값일 때 루트)
    user_id INTEGER NOT NULL, -- 사용자 ID

    PRIMARY KEY (id, user_id),
    CONSTRAINT fk_parent_i FOREIGN KEY(user_id, parent_id) REFERENCES directory(user_id, id) ON DELETE CASCADE
);

그리고 이 테이블에 데이터를 추가하는 함수는 다음과 같습니다.

-- 신규 데이터 추가 함수
CREATE OR REPLACE FUNCTION add(_parent_id INTEGER, _user_id INTEGER) RETURNS INTEGER
LANGUAGE plpgsql AS $$
DECLARE
    max_id INTEGER;
    next_id INTEGER;
BEGIN
    -- 해당 user에 대해서 최대값의 id 값을 구해서 max_id 변수에 할당
    SELECT MAX(id) INTO max_id FROM directory WHERE user_id = _user_id;

    IF max_id IS NULL THEN -- max_id 값이 없다면
        next_id := 0; -- 다음 id 값은 0으로 할당
    ELSE
        next_id := max_id + 1; -- 다음 id 값은 최대값에 1을 더해서 할당
    END IF;
	
    -- 다음 id 값을 콘솔에 출력해서 확인
    RAISE NOTICE 'next_id = %', next_id;
	
    -- 다음 id 값으로 데이터 추가
    INSERT INTO directory VALUES (next_id, _parent_id, _user_id);

    -- 다음 id 값 반환
    RETURN next_id;
END $$