제 유튜브 채널을 통해 강좌로 소개할 것들에 대해 먼저 결과 만을 찍어 먼저 올려 봅니다. 아마 바로 돌아오는 이번주 토요일 쯤.. 아래 2개 중 한 개를 찍어 올릴 듯 합니다.
제 유튜브 채널 이름은 GIS Developer 입니다. 채널을 구독하시면 영상 업로드 시 바로 알 수 있습니다.

공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
제 유튜브 채널을 통해 강좌로 소개할 것들에 대해 먼저 결과 만을 찍어 먼저 올려 봅니다. 아마 바로 돌아오는 이번주 토요일 쯤.. 아래 2개 중 한 개를 찍어 올릴 듯 합니다.
제 유튜브 채널 이름은 GIS Developer 입니다. 채널을 구독하시면 영상 업로드 시 바로 알 수 있습니다.
웹 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 라이브러리를 이용해 실제 프로젝트에 적용한 예입니다. 아래의 영상은 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%;
}
웹 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();
};
실행 결과는 다음과 같습니다.

먼저 다음과 같은 테이블이 있습니다.
-- 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 $$