{"componentChunkName":"component---src-templates-blog-post-js","path":"/vue/vue-js-한글-입력/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"edce05a4-e625-5aef-8863-2931bdbb34c7","excerpt":"Vue Js 한글 입력 과 IME IME…","html":"<p><img src=\"/assets/vue-logo.png\" alt=\"Vue Js 한글 입력 과 IME\" title=\"Vue Js 한글 입력 과 IME\"></p>\n<h2 id=\"ime\" style=\"position:relative;\"><a href=\"#ime\" aria-label=\"ime permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>IME</h2>\n<p>입력기 또는 입력 방식 편집기는 한국어, 중국어, 일본어, 한자처럼 컴퓨터 자판에 있는 글자보다 수가 더 많은 문자를 계산하거나 조합하여 입력해 주는 시스템 소프트웨어이다. 원래 윈도우에서 사용하던 인터페이스에서 유래했고, 한국어, 중국어, 일본어 윈도우에서만 지원했으나, 현재는 일반화되어서 임의의 환경에서 임의의 문자를 입력하는 것을 도와 주는 소프트웨어를 가리키기도 한다.</p>\n<h3 id=\"ime-발생-메시지\" style=\"position:relative;\"><a href=\"#ime-%EB%B0%9C%EC%83%9D-%EB%A9%94%EC%8B%9C%EC%A7%80\" aria-label=\"ime 발생 메시지 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>IME 발생 메시지</h3>\n<table>\n<thead>\n<tr>\n<th>메시지</th>\n<th>발생되는 경우</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>WM<em>IME</em>SETCONTEXT</td>\n<td>윈도우가 활성화 될때 기본 IME의 초기화를 위해서 발생된다. 내 프로그램에서 미완성된 글자를 표시한다면 lParam에서 ISC<em>SHOWUICOMPOSITIONWINDOW 와 ISC</em>SHOWUIALLCANDIDATEWINDOW 을 제거해야 한다. 그러면 미완성된 문자가 Default IME옆에 나타나지 않는다.</td>\n</tr>\n<tr>\n<td>WM<em>IME</em>STARTCOMPOSITION</td>\n<td>한글입력이 시작되었을때 발생</td>\n</tr>\n<tr>\n<td>WM<em>IME</em>ENDCOMPOSITION</td>\n<td>한글입력도중 한글이외의 문자가 입력되었을때 발생</td>\n</tr>\n<tr>\n<td>WM<em>IME</em>COMPOSITION</td>\n<td>한글입력을 알리는 메세지</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"ime-관련된-함수\" style=\"position:relative;\"><a href=\"#ime-%EA%B4%80%EB%A0%A8%EB%90%9C-%ED%95%A8%EC%88%98\" aria-label=\"ime 관련된 함수 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>IME 관련된 함수</h3>\n<table>\n<thead>\n<tr>\n<th>함수</th>\n<th>설명</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ImmAssociateContext</td>\n<td>특정윈도우와 IME를 매핑시킨다. Default IME를 사용할 수 있지만 새로운 IME를 생성해서 내 윈도우 특성에 맞게 사용할수 있다.</td>\n</tr>\n<tr>\n<td>ImmCreateContext</td>\n<td>새로운 IME를 생성한다. 나중에 반드시 ImmDestroyContext를 호출해야 한다.</td>\n</tr>\n<tr>\n<td>ImmDestroyContext</td>\n<td>IME를 반환한다.</td>\n</tr>\n<tr>\n<td>ImmGetDefaultIMEWnd</td>\n<td>Default IME 핸들의 얻는다. 나중에 반드시 ImmReleaseContext 를 호출해야 한다.</td>\n</tr>\n<tr>\n<td>ImmReleaseContext</td>\n<td>Default IME 핸들을 OS에 반환한다.</td>\n</tr>\n<tr>\n<td>ImmGetConversionStatus</td>\n<td>IME의 상태를 취득한다.</td>\n</tr>\n<tr>\n<td>ImmSimulateHotKey</td>\n<td>한/영, 전각/반각, 한자등의 키를 Simulation 해 준다.</td>\n</tr>\n<tr>\n<td>ImmGetCompositionString</td>\n<td>현재 IME에 입력되어 있는 한글코드의 크기 및 내용을 취득한다.</td>\n</tr>\n<tr>\n<td>IsDBCSLeadByte</td>\n<td>한글 두 Byte중에서 첫번째 Byte인지 검사해 주는 함수이지만 조합형 한글은 첫번째 Byte에 올수 있는 코드와 두번째 Byte에 올 수 있는 코드의 범위가 같아서 이 함수로 검사할 수 없다. 따라서 이 함수를 사용하지 말고 직접 만들어서 사용하는 것이 바람직하다.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"vue-v-model-디렉티브-한글-입력\" style=\"position:relative;\"><a href=\"#vue-v-model-%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5\" aria-label=\"vue v model 디렉티브 한글 입력 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue v-model 디렉티브 한글 입력</h2>\n<p>아래와 같이 v-model 과 watch 를 활용하여 실시간 검색 기능을 제공 한다고 가정해 보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;template&gt;\n  &lt;div id=&quot;app&quot;&gt;\n    &lt;input v-model=&quot;keyword&quot; /&gt;\n    &lt;p&gt;keyword : {{ keyword }}&lt;/p&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script&gt;\nexport default {\n  data() {\n    return {\n      keyword: &quot;&quot;,\n    }\n  },\n  watch: {\n    keyword: function (value) {\n      console.log(`검색어 : ${value}`)\n    },\n  },\n}\n&lt;/script&gt;</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// 동작 예시\n\"검색어 : \"\n\"검색어 : 한\"\n\"검색어 : 한글\"</code></pre></div>\n<p><img src=\"/assets/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5-%EA%B3%BC-ime-1.gif\" alt=\"Vue Js 한글 입력 과 IME 결과코드 1\" title=\"Vue Js 한글 입력 과 IME 결과코드 1\"></p>\n<p>위와 같이 <code class=\"language-text\">한글</code> 을 입력 하면 처음에는 빈값 두번째 <code class=\"language-text\">글</code> 을 입력 했을때 <code class=\"language-text\">한</code> 이라고 출력 되는것을 확인 할수 있을것이다. 이렇게 입력 되는 이유는 컴퓨터 자판에 있는 글자수 보다 많은 글자를 입력 했기 때문이다. 그래서 Vue 공식문서에서 공개한 내용을 보면 아래와 같이 설명 되어 있다.</p>\n<blockquote>\n<p>IME가 필요한 언어 (한국어,중국어,일본어,한자 등)의 경우에는 IME 구성 중에 v-model이 업데이트 되지 않을 수 있습니다. 약만 IME가 필요한 언어를 사용하고자 한다면 v-model 디렉티브 대신 @input 이벤트를 사용하세요.</p>\n</blockquote>\n<p><a href=\"https://vuejs.org/v2/guide/forms.html#Basic-Usage\" title=\"Vue Form Input Bindings\">Vue Form Input Bindings</a></p>\n<p>해결 방안은 공식문서 가이드대로 @input 을 활용하여 코드를 작성해 주면 바로 해결이 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;template&gt;\n  &lt;div id=&quot;app&quot;&gt;\n    &lt;input :value=&quot;keyword&quot; @input=&quot;keywordInput&quot; /&gt;\n    &lt;p&gt;keyword : {{ keyword }}&lt;/p&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script&gt;\nexport default {\n  data() {\n    return {\n      keyword: &quot;&quot;,\n    }\n  },\n  watch: {\n    keyword: function (value) {\n      console.log(`검색어 : ${value}`)\n    },\n  },\n  methods: {\n    keywordInput(event) {\n      this.keyword = event.target.value\n    },\n  },\n}\n&lt;/script&gt;</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// 실행 예시\n\"검색어 : ㅎ\"\n\"검색어 : 하\"\n\"검색어 : 한\"\n\"검색어 : 한ㄱ\"\n\"검색어 : 한그\"\n\"검색어 : 한글\"</code></pre></div>\n<p><img src=\"/assets/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5-%EA%B3%BC-ime-2.gif\" alt=\"Vue Js 한글 입력 과 IME 결과코드 2\" title=\"Vue Js 한글 입력 과 IME 결과코드 2\"></p>\n<p><a href=\"https://codepen.io/bottlehs/pen/abyeQNw\" title=\"https://codepen.io/bottlehs/pen/abyeQNw\">https://codepen.io/bottlehs/pen/abyeQNw</a></p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/vue/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5/#ime\">IME</a></p>\n<ul>\n<li><a href=\"/vue/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5/#ime-%EB%B0%9C%EC%83%9D-%EB%A9%94%EC%8B%9C%EC%A7%80\">IME 발생 메시지</a></li>\n<li><a href=\"/vue/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5/#ime-%EA%B4%80%EB%A0%A8%EB%90%9C-%ED%95%A8%EC%88%98\">IME 관련된 함수</a></li>\n</ul>\n</li>\n<li><a href=\"/vue/vue-js-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5/#vue-v-model-%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%95%9C%EA%B8%80-%EC%9E%85%EB%A0%A5\">Vue v-model 디렉티브 한글 입력</a></li>\n</ul>","wordCount":{"words":189},"fields":{"slug":"/vue/vue-js-한글-입력/","image":"/assets/vue-logo.png","faq":[]},"frontmatter":{"title":"Vue Js 한글 입력 과 IME","date":"2021년 11월 27일","dateISO":"2021-11-27T15:11:34.709Z","updatedISO":null,"category":"vue","description":"IME란 한국어, 중국어, 일본어, 한자처럼 컴퓨너 자판에 있는 글자보다 더 많은 수의 문자를 계산서나 조합하여 입력해 주는 시스템 소프트웨어이다. 이러한 조합이 필요한 언어들은 v-model 디렉티브를 활용할 때 제대로 동작 안되는 문제가 있어, @input 이벤트를 활용하여 v-model 디렉티브 기능을 대신 구현해야 정확한 데이터 바인딩을 할 수 있다.","tags":["vue","javascript","framework","frontend","web","ime"]}}},"pageContext":{"slug":"/vue/vue-js-한글-입력/","previous":{"fields":{"slug":"/vue/vue-js-서버-사이드-렌더링/"},"frontmatter":{"title":"Vue Js 서버 사이드 렌더링","tags":["vue","javascript","framework","frontend","web","ssr"]}},"next":{"fields":{"slug":"/etc/flutter-and-react-native/"},"frontmatter":{"title":"Flutter, React Native","tags":["flutter","reactnative","dart","javascript","크로스플랫폼이"]}}}},"staticQueryHashes":["213619243","3262363727"]}