<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C</id>
	<title>핸드온테이블 그리드 ORACLE DB 연결 예제 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;action=history"/>
	<updated>2026-04-04T04:28:49Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2329&amp;oldid=prev</id>
		<title>Devcafe: /* 서버 */</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2329&amp;oldid=prev"/>
		<updated>2025-10-17T07:23:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;서버&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 10월 17일 (금) 16:23 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l279&quot;&gt;279번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;279번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;서버 &lt;/del&gt;===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Flask + 오라클 연결하여 데이터 조회/입력/삭제/수정 &lt;/ins&gt;===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=html&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=html&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2328&amp;oldid=prev</id>
		<title>Devcafe: /* 화면 */</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2328&amp;oldid=prev"/>
		<updated>2025-10-17T07:22:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;화면&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 10월 17일 (금) 16:22 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;1번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 화면 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;기본 &lt;/ins&gt;화면 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=html&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=html&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l278&quot;&gt;278번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;278번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 서버 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 서버 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2327&amp;oldid=prev</id>
		<title>2025년 10월 17일 (금) 07:18에 Devcafe님의 편집</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2327&amp;oldid=prev"/>
		<updated>2025-10-17T07:18:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;amp;diff=2327&amp;amp;oldid=2326&quot;&gt;차이 보기&lt;/a&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2326&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: &lt;source lang=html&gt;  &lt;!DOCTYPE html&gt; &lt;html lang=&quot;ko&quot;&gt; &lt;head&gt;     &lt;meta charset=&quot;UTF-8&quot;&gt;     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;     &lt;title&gt;Handsontable 데이터 그리드&lt;/title&gt;     &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.css&quot;&gt;     &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.js&quot;&gt;&lt;/script&gt;     &lt;style&gt;         * {             m...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%95%B8%EB%93%9C%EC%98%A8%ED%85%8C%EC%9D%B4%EB%B8%94_%EA%B7%B8%EB%A6%AC%EB%93%9C_ORACLE_DB_%EC%97%B0%EA%B2%B0_%EC%98%88%EC%A0%9C&amp;diff=2326&amp;oldid=prev"/>
		<updated>2025-10-17T07:05:09Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;lt;source lang=html&amp;gt;  &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;quot;ko&amp;quot;&amp;gt; &amp;lt;head&amp;gt;     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;     &amp;lt;title&amp;gt;Handsontable 데이터 그리드&amp;lt;/title&amp;gt;     &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.css&amp;quot;&amp;gt;     &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;     &amp;lt;style&amp;gt;         * {             m...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;ko&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Handsontable 데이터 그리드&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/handsontable/12.3.1/handsontable.full.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        * {&lt;br /&gt;
            margin: 0;&lt;br /&gt;
            padding: 0;&lt;br /&gt;
            box-sizing: border-box;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        body {&lt;br /&gt;
            font-family: &amp;#039;Segoe UI&amp;#039;, Tahoma, Geneva, Verdana, sans-serif;&lt;br /&gt;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            min-height: 100vh;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .container {&lt;br /&gt;
            max-width: 1400px;&lt;br /&gt;
            margin: 0 auto;&lt;br /&gt;
            background: white;&lt;br /&gt;
            border-radius: 15px;&lt;br /&gt;
            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);&lt;br /&gt;
            padding: 30px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        h1 {&lt;br /&gt;
            color: #333;&lt;br /&gt;
            margin-bottom: 10px;&lt;br /&gt;
            font-size: 28px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .subtitle {&lt;br /&gt;
            color: #666;&lt;br /&gt;
            margin-bottom: 25px;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            gap: 10px;&lt;br /&gt;
            margin-bottom: 20px;&lt;br /&gt;
            flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        button {&lt;br /&gt;
            padding: 10px 20px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
            font-weight: 600;&lt;br /&gt;
            transition: all 0.3s;&lt;br /&gt;
            color: white;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-add {&lt;br /&gt;
            background: #10b981;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-add:hover {&lt;br /&gt;
            background: #059669;&lt;br /&gt;
            transform: translateY(-2px);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-remove {&lt;br /&gt;
            background: #ef4444;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-remove:hover {&lt;br /&gt;
            background: #dc2626;&lt;br /&gt;
            transform: translateY(-2px);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-export {&lt;br /&gt;
            background: #3b82f6;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-export:hover {&lt;br /&gt;
            background: #2563eb;&lt;br /&gt;
            transform: translateY(-2px);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-clear {&lt;br /&gt;
            background: #f59e0b;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .btn-clear:hover {&lt;br /&gt;
            background: #d97706;&lt;br /&gt;
            transform: translateY(-2px);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #grid-container {&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            height: 500px;&lt;br /&gt;
            overflow: hidden;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .info {&lt;br /&gt;
            margin-top: 20px;&lt;br /&gt;
            padding: 15px;&lt;br /&gt;
            background: #f3f4f6;&lt;br /&gt;
            border-radius: 8px;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
            color: #374151;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .info-item {&lt;br /&gt;
            margin-bottom: 5px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .info-item strong {&lt;br /&gt;
            color: #1f2937;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;📊 Handsontable 데이터 그리드&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;p class=&amp;quot;subtitle&amp;quot;&amp;gt;실시간 데이터 편집 및 관리 시스템&amp;lt;/p&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;btn-add&amp;quot; onclick=&amp;quot;addRow()&amp;quot;&amp;gt;➕ 행 추가&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;btn-remove&amp;quot; onclick=&amp;quot;removeRow()&amp;quot;&amp;gt;➖ 선택 행 삭제&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;btn-export&amp;quot; onclick=&amp;quot;exportData()&amp;quot;&amp;gt;💾 CSV 내보내기&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;btn-clear&amp;quot; onclick=&amp;quot;clearFilters()&amp;quot;&amp;gt;🔄 필터 초기화&amp;lt;/button&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div id=&amp;quot;grid-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;info-item&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;🔍 기능:&amp;lt;/strong&amp;gt; 셀 편집, 정렬, 필터링, 행/열 크기 조정&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;info-item&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;💡 팁:&amp;lt;/strong&amp;gt; 컬럼 헤더를 클릭하여 정렬, 드롭다운에서 필터 선택 가능&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;info-item&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;⌨️ 단축키:&amp;lt;/strong&amp;gt; Ctrl+C(복사), Ctrl+V(붙여넣기), Delete(삭제)&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        // 샘플 데이터 생성&lt;br /&gt;
        const data = [&lt;br /&gt;
            { id: 1, name: &amp;#039;김철수&amp;#039;, department: &amp;#039;개발팀&amp;#039;, position: &amp;#039;팀장&amp;#039;, salary: 5500, email: &amp;#039;kim@example.com&amp;#039;, joinDate: &amp;#039;2020-01-15&amp;#039; },&lt;br /&gt;
            { id: 2, name: &amp;#039;이영희&amp;#039;, department: &amp;#039;영업팀&amp;#039;, position: &amp;#039;대리&amp;#039;, salary: 4200, email: &amp;#039;lee@example.com&amp;#039;, joinDate: &amp;#039;2021-03-20&amp;#039; },&lt;br /&gt;
            { id: 3, name: &amp;#039;박민수&amp;#039;, department: &amp;#039;개발팀&amp;#039;, position: &amp;#039;과장&amp;#039;, salary: 4800, email: &amp;#039;park@example.com&amp;#039;, joinDate: &amp;#039;2019-07-10&amp;#039; },&lt;br /&gt;
            { id: 4, name: &amp;#039;최지현&amp;#039;, department: &amp;#039;인사팀&amp;#039;, position: &amp;#039;사원&amp;#039;, salary: 3500, email: &amp;#039;choi@example.com&amp;#039;, joinDate: &amp;#039;2022-05-01&amp;#039; },&lt;br /&gt;
            { id: 5, name: &amp;#039;정수진&amp;#039;, department: &amp;#039;마케팅팀&amp;#039;, position: &amp;#039;차장&amp;#039;, salary: 5200, email: &amp;#039;jung@example.com&amp;#039;, joinDate: &amp;#039;2018-11-30&amp;#039; },&lt;br /&gt;
            { id: 6, name: &amp;#039;강동원&amp;#039;, department: &amp;#039;영업팀&amp;#039;, position: &amp;#039;부장&amp;#039;, salary: 6000, email: &amp;#039;kang@example.com&amp;#039;, joinDate: &amp;#039;2017-02-14&amp;#039; },&lt;br /&gt;
            { id: 7, name: &amp;#039;윤서영&amp;#039;, department: &amp;#039;개발팀&amp;#039;, position: &amp;#039;사원&amp;#039;, salary: 3800, email: &amp;#039;yoon@example.com&amp;#039;, joinDate: &amp;#039;2023-01-10&amp;#039; },&lt;br /&gt;
            { id: 8, name: &amp;#039;임하늘&amp;#039;, department: &amp;#039;마케팅팀&amp;#039;, position: &amp;#039;대리&amp;#039;, salary: 4300, email: &amp;#039;lim@example.com&amp;#039;, joinDate: &amp;#039;2021-08-25&amp;#039; },&lt;br /&gt;
            { id: 9, name: &amp;#039;송민호&amp;#039;, department: &amp;#039;인사팀&amp;#039;, position: &amp;#039;과장&amp;#039;, salary: 4900, email: &amp;#039;song@example.com&amp;#039;, joinDate: &amp;#039;2020-06-15&amp;#039; },&lt;br /&gt;
            { id: 10, name: &amp;#039;한지우&amp;#039;, department: &amp;#039;영업팀&amp;#039;, position: &amp;#039;사원&amp;#039;, salary: 3600, email: &amp;#039;han@example.com&amp;#039;, joinDate: &amp;#039;2022-09-01&amp;#039; }&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
        const container = document.getElementById(&amp;#039;grid-container&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
        const hot = new Handsontable(container, {&lt;br /&gt;
            data: data,&lt;br /&gt;
            colHeaders: [&amp;#039;ID&amp;#039;, &amp;#039;이름&amp;#039;, &amp;#039;부서&amp;#039;, &amp;#039;직급&amp;#039;, &amp;#039;급여(만원)&amp;#039;, &amp;#039;이메일&amp;#039;, &amp;#039;입사일&amp;#039;],&lt;br /&gt;
            columns: [&lt;br /&gt;
                { data: &amp;#039;id&amp;#039;, type: &amp;#039;numeric&amp;#039;, readOnly: true },&lt;br /&gt;
                { data: &amp;#039;name&amp;#039;, type: &amp;#039;text&amp;#039; },&lt;br /&gt;
                { &lt;br /&gt;
                    data: &amp;#039;department&amp;#039;, &lt;br /&gt;
                    type: &amp;#039;dropdown&amp;#039;,&lt;br /&gt;
                    source: [&amp;#039;개발팀&amp;#039;, &amp;#039;영업팀&amp;#039;, &amp;#039;인사팀&amp;#039;, &amp;#039;마케팅팀&amp;#039;, &amp;#039;재무팀&amp;#039;]&lt;br /&gt;
                },&lt;br /&gt;
                { &lt;br /&gt;
                    data: &amp;#039;position&amp;#039;, &lt;br /&gt;
                    type: &amp;#039;dropdown&amp;#039;,&lt;br /&gt;
                    source: [&amp;#039;사원&amp;#039;, &amp;#039;대리&amp;#039;, &amp;#039;과장&amp;#039;, &amp;#039;차장&amp;#039;, &amp;#039;부장&amp;#039;, &amp;#039;팀장&amp;#039;]&lt;br /&gt;
                },&lt;br /&gt;
                { data: &amp;#039;salary&amp;#039;, type: &amp;#039;numeric&amp;#039;, numericFormat: { pattern: &amp;#039;0,0&amp;#039; } },&lt;br /&gt;
                { data: &amp;#039;email&amp;#039;, type: &amp;#039;text&amp;#039; },&lt;br /&gt;
                { data: &amp;#039;joinDate&amp;#039;, type: &amp;#039;date&amp;#039;, dateFormat: &amp;#039;YYYY-MM-DD&amp;#039; }&lt;br /&gt;
            ],&lt;br /&gt;
            rowHeaders: true,&lt;br /&gt;
            width: &amp;#039;100%&amp;#039;,&lt;br /&gt;
            height: 500,&lt;br /&gt;
            licenseKey: &amp;#039;non-commercial-and-evaluation&amp;#039;,&lt;br /&gt;
            dropdownMenu: true,&lt;br /&gt;
            filters: true,&lt;br /&gt;
            columnSorting: true,&lt;br /&gt;
            contextMenu: true,&lt;br /&gt;
            manualColumnResize: true,&lt;br /&gt;
            manualRowResize: true,&lt;br /&gt;
            stretchH: &amp;#039;all&amp;#039;,&lt;br /&gt;
            autoWrapRow: true,&lt;br /&gt;
            autoWrapCol: true,&lt;br /&gt;
            fillHandle: {&lt;br /&gt;
                direction: &amp;#039;vertical&amp;#039;,&lt;br /&gt;
                autoInsertRow: false&lt;br /&gt;
            },&lt;br /&gt;
            language: &amp;#039;ko-KR&amp;#039;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // 행 추가 함수&lt;br /&gt;
        function addRow() {&lt;br /&gt;
            const newId = hot.countRows() + 1;&lt;br /&gt;
            const newRow = {&lt;br /&gt;
                id: newId,&lt;br /&gt;
                name: &amp;#039;&amp;#039;,&lt;br /&gt;
                department: &amp;#039;개발팀&amp;#039;,&lt;br /&gt;
                position: &amp;#039;사원&amp;#039;,&lt;br /&gt;
                salary: 3000,&lt;br /&gt;
                email: &amp;#039;&amp;#039;,&lt;br /&gt;
                joinDate: new Date().toISOString().split(&amp;#039;T&amp;#039;)[0]&lt;br /&gt;
            };&lt;br /&gt;
            hot.alter(&amp;#039;insert_row_below&amp;#039;, hot.countRows(), 1);&lt;br /&gt;
            hot.setDataAtRow(hot.countRows() - 1, [&lt;br /&gt;
                newRow.id, &lt;br /&gt;
                newRow.name, &lt;br /&gt;
                newRow.department, &lt;br /&gt;
                newRow.position, &lt;br /&gt;
                newRow.salary, &lt;br /&gt;
                newRow.email, &lt;br /&gt;
                newRow.joinDate&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 선택 행 삭제 함수&lt;br /&gt;
        function removeRow() {&lt;br /&gt;
            const selected = hot.getSelected();&lt;br /&gt;
            if (selected &amp;amp;&amp;amp; selected.length &amp;gt; 0) {&lt;br /&gt;
                const startRow = selected[0][0];&lt;br /&gt;
                const endRow = selected[0][2];&lt;br /&gt;
                const rowCount = endRow - startRow + 1;&lt;br /&gt;
                &lt;br /&gt;
                if (confirm(`선택된 ${rowCount}개의 행을 삭제하시겠습니까?`)) {&lt;br /&gt;
                    hot.alter(&amp;#039;remove_row&amp;#039;, startRow, rowCount);&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&amp;#039;삭제할 행을 선택해주세요.&amp;#039;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // CSV 내보내기 함수&lt;br /&gt;
        function exportData() {&lt;br /&gt;
            const exportPlugin = hot.getPlugin(&amp;#039;exportFile&amp;#039;);&lt;br /&gt;
            exportPlugin.downloadFile(&amp;#039;csv&amp;#039;, {&lt;br /&gt;
                bom: true,&lt;br /&gt;
                columnDelimiter: &amp;#039;,&amp;#039;,&lt;br /&gt;
                columnHeaders: true,&lt;br /&gt;
                exportHiddenColumns: false,&lt;br /&gt;
                exportHiddenRows: false,&lt;br /&gt;
                fileExtension: &amp;#039;csv&amp;#039;,&lt;br /&gt;
                filename: &amp;#039;employee_data_[YYYY]-[MM]-[DD]&amp;#039;,&lt;br /&gt;
                mimeType: &amp;#039;text/csv&amp;#039;,&lt;br /&gt;
                rowDelimiter: &amp;#039;\r\n&amp;#039;,&lt;br /&gt;
                rowHeaders: false&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 필터 초기화 함수&lt;br /&gt;
        function clearFilters() {&lt;br /&gt;
            const filtersPlugin = hot.getPlugin(&amp;#039;filters&amp;#039;);&lt;br /&gt;
            filtersPlugin.clearConditions();&lt;br /&gt;
            filtersPlugin.filter();&lt;br /&gt;
            hot.render();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 데이터 변경 이벤트&lt;br /&gt;
        hot.addHook(&amp;#039;afterChange&amp;#039;, function(changes, source) {&lt;br /&gt;
            if (source !== &amp;#039;loadData&amp;#039;) {&lt;br /&gt;
                console.log(&amp;#039;데이터 변경:&amp;#039;, changes);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>