<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발새발, 써놓기</title>
    <link>https://development-writing.tistory.com/</link>
    <description>개발새발 써놓는 나의 프로그래밍 공부</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 12:23:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>호쏘2</managingEditor>
    <image>
      <title>개발새발, 써놓기</title>
      <url>https://tistory1.daumcdn.net/tistory/4810179/attach/1a232bf92f46426da7f21472ca92ac48</url>
      <link>https://development-writing.tistory.com</link>
    </image>
    <item>
      <title>테스트 데이터</title>
      <link>https://development-writing.tistory.com/429</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250409_024530278.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkmZok/btsNb7epiZO/Lz142i2E80isn1XkfkG6v0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkmZok/btsNb7epiZO/Lz142i2E80isn1XkfkG6v0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkmZok/btsNb7epiZO/Lz142i2E80isn1XkfkG6v0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkmZok%2FbtsNb7epiZO%2FLz142i2E80isn1XkfkG6v0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;209&quot; height=&quot;279&quot; data-filename=&quot;KakaoTalk_20250409_024530278.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/429</guid>
      <comments>https://development-writing.tistory.com/429#entry429comment</comments>
      <pubDate>Wed, 9 Apr 2025 02:44:10 +0900</pubDate>
    </item>
    <item>
      <title>File-Tree-Generator 프로젝트 구조 트리 생성기</title>
      <link>https://development-writing.tistory.com/428</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode &amp;gt; extention &amp;gt; file-tree-generator 추천추천&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db00Ra/btsMRWK0j1g/YXQc1SM1EZpDA3FdSNS5H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db00Ra/btsMRWK0j1g/YXQc1SM1EZpDA3FdSNS5H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db00Ra/btsMRWK0j1g/YXQc1SM1EZpDA3FdSNS5H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb00Ra%2FbtsMRWK0j1g%2FYXQc1SM1EZpDA3FdSNS5H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1174&quot; height=&quot;1079&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/428</guid>
      <comments>https://development-writing.tistory.com/428#entry428comment</comments>
      <pubDate>Fri, 21 Mar 2025 19:50:23 +0900</pubDate>
    </item>
    <item>
      <title>유용한 정보: favicon generator, adobe color-wheel</title>
      <link>https://development-writing.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;favicon generator : &lt;a href=&quot;https://favicon.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://favicon.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741271522333&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Favicon.io - The Ultimate Favicon Generator (Free)&quot; data-og-description=&quot;With Favicon.io you can quickly generate a favicon for your website for free!&quot; data-og-host=&quot;favicon.io&quot; data-og-source-url=&quot;https://favicon.io/&quot; data-og-url=&quot;https://favicon.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvBIJA/hyYmThpyXk/a8hj4atZ3q3KqHPNtnZuk0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627&quot;&gt;&lt;a href=&quot;https://favicon.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://favicon.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvBIJA/hyYmThpyXk/a8hj4atZ3q3KqHPNtnZuk0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Favicon.io - The Ultimate Favicon Generator (Free)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;With Favicon.io you can quickly generate a favicon for your website for free!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;favicon.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.favicon-generator.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.favicon-generator.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741305158939&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Favicon &amp;amp; App Icon Generator&quot; data-og-description=&quot;Upload an image (PNG to ICO, JPG to ICO, GIF to ICO) and convert it to a Windows favicon (.ico) and App Icons. Learn more about favicons.&quot; data-og-host=&quot;www.favicon-generator.org&quot; data-og-source-url=&quot;https://www.favicon-generator.org/&quot; data-og-url=&quot;https://www.favicon-generator.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.favicon-generator.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.favicon-generator.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Favicon &amp;amp; App Icon Generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Upload an image (PNG to ICO, JPG to ICO, GIF to ICO) and convert it to a Windows favicon (.ico) and App Icons. Learn more about favicons.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.favicon-generator.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어울리는 색 조합찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://color.adobe.com/ko/create/color-wheel&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://color.adobe.com/ko/create/color-wheel&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/427</guid>
      <comments>https://development-writing.tistory.com/427#entry427comment</comments>
      <pubDate>Thu, 6 Mar 2025 23:32:35 +0900</pubDate>
    </item>
    <item>
      <title>한글을 Typing할 때 composition 이벤트가 있다.</title>
      <link>https://development-writing.tistory.com/426</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionstart_event&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionstart_event&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ를 입력하면 초성, 중성, 종성을 조합을 할 수 있게 되면서 compositionstart가 trigger되는 듯 하다.&lt;/p&gt;
&lt;pre id=&quot;code_1737103919358&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;document.addEventListener('compositionstart', function(e){
	debugger;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보/Front</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/426</guid>
      <comments>https://development-writing.tistory.com/426#entry426comment</comments>
      <pubDate>Fri, 17 Jan 2025 17:52:59 +0900</pubDate>
    </item>
    <item>
      <title>HtmlEditor 브라우저별 동작 차이 (feat. sencha htmlEditor)</title>
      <link>https://development-writing.tistory.com/425</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&lt;/a&gt;&amp;nbsp; // 용어공부&lt;/p&gt;
&lt;figure id=&quot;og_1736499157164&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;위지위그 - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전. 위지위그(WYSIWYG: What You See Is What You Get, &amp;quot;보는 대로 얻는다&amp;quot;)[1]는 인쇄된 문서, 웹 페이지, 슬라이드 프레젠테이션 등 완성된 결과물로서 인쇄 또는 표시될 때의 &quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%84%EC%A7%80%EC%9C%84%EA%B7%B8#cite_note-2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;위지위그 - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;위키백과, 우리 모두의 백과사전. 위지위그(WYSIWYG: What You See Is What You Get, &quot;보는 대로 얻는다&quot;)[1]는 인쇄된 문서, 웹 페이지, 슬라이드 프레젠테이션 등 완성된 결과물로서 인쇄 또는 표시될 때의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sencha htmlEditor를 이용할 때 IE와 Chrome에서 동작 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sencha extjs의 htmlEditor: &lt;a href=&quot;https://examples.sencha.com/extjs/7.8.0/examples/kitchensink/#froala-document-ready&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://examples.sencha.com/extjs/7.8.0/examples/kitchensink/#froala-document-ready&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 IE디버깅을 위해서는 Edge를 켜고 IE로 로드, IE 개발자도구 (%systemroot%\system32\f12\IEChooser.exe) 를 통해 IE전용 디버그 툴을 열어야 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 htmlEditor에 줄바꿈을 넣고 싶었는데,&amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;을 두개 넣어야 cursor까지 옮길 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;br&amp;gt;을 하나만 넣었을 때는 입력하고있던 cursor가 옮겨지지 않았는데 두개 넣으니 옮겨지더라.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stackoverflow의 아래를 읽고 시도해보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1737101191766&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How does execCommand &amp;quot;insertBrOnReturn&amp;quot; work?&quot; data-og-description=&quot;I tried the following code on Chrome: document.execCommand(&amp;quot;insertBrOnReturn&amp;quot;, false, true); http://jsfiddle.net/uVcd5/ Wether I set the last parameter to true or false, the behaviour doesn't ch...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&quot; data-og-url=&quot;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8iBkE/hyX4vfvAKX/EYQfpBS3I5Yi8qheoCTYmK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/20552474/how-does-execcommand-insertbronreturn-work&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8iBkE/hyX4vfvAKX/EYQfpBS3I5Yi8qheoCTYmK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How does execCommand &quot;insertBrOnReturn&quot; work?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I tried the following code on Chrome: document.execCommand(&quot;insertBrOnReturn&quot;, false, true); http://jsfiddle.net/uVcd5/ Wether I set the last parameter to true or false, the behaviour doesn't ch...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 차이점, &amp;lt;br&amp;gt; 태그 chrome에서는 사라지고 IE에서는 남아있다.&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd8H4A/btsLQU1l3t1/kfT1lrjr8WD69P3FSWXDO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd8H4A/btsLQU1l3t1/kfT1lrjr8WD69P3FSWXDO0/img.png&quot; data-alt=&quot;줄바꿈 직 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd8H4A/btsLQU1l3t1/kfT1lrjr8WD69P3FSWXDO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd8H4A%2FbtsLQU1l3t1%2FkfT1lrjr8WD69P3FSWXDO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;148&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;줄바꿈 직 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cisvoM/btsLQRjirWI/ldAqxOpQeYX3vHoKDrYGuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cisvoM/btsLQRjirWI/ldAqxOpQeYX3vHoKDrYGuK/img.png&quot; data-alt=&quot;텍스트 입력 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cisvoM/btsLQRjirWI/ldAqxOpQeYX3vHoKDrYGuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcisvoM%2FbtsLQRjirWI%2FldAqxOpQeYX3vHoKDrYGuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;128&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텍스트 입력 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 입력 후에 두번째 &amp;lt;br&amp;gt;이 사라져있음을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 IE에서는 ?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqIZz5/btsLQEj9p2t/OtOfvUcPCaGO1quTeh4YCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqIZz5/btsLQEj9p2t/OtOfvUcPCaGO1quTeh4YCk/img.png&quot; data-alt=&quot;줄바꿈 직 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqIZz5/btsLQEj9p2t/OtOfvUcPCaGO1quTeh4YCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqIZz5%2FbtsLQEj9p2t%2FOtOfvUcPCaGO1quTeh4YCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;142&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;줄바꿈 직 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Yub0/btsLQO1aOzq/p00YCouy5lQ9XdSQNywzGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Yub0/btsLQO1aOzq/p00YCouy5lQ9XdSQNywzGk/img.png&quot; data-alt=&quot;텍스트 입력 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Yub0/btsLQO1aOzq/p00YCouy5lQ9XdSQNywzGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Yub0%2FbtsLQO1aOzq%2Fp00YCouy5lQ9XdSQNywzGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;125&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텍스트 입력 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 &amp;lt;br&amp;gt;태그가 여전히 남아있는 것으로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p태그를 추가하였을 때, 재밌는 현상이 있는데,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEqi2f/btsLSA1nzao/DY1gOyWOf8NRlu7wh4RjO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEqi2f/btsLSA1nzao/DY1gOyWOf8NRlu7wh4RjO1/img.png&quot; data-alt=&quot;enter 직 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEqi2f/btsLSA1nzao/DY1gOyWOf8NRlu7wh4RjO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEqi2f%2FbtsLSA1nzao%2FDY1gOyWOf8NRlu7wh4RjO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;123&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;enter 직 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;br&amp;gt;태그도 같이 생성된다는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9zUO/btsLSkkgI1E/JqNfG79Rpp5k6oFqFgIbU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9zUO/btsLSkkgI1E/JqNfG79Rpp5k6oFqFgIbU0/img.png&quot; data-alt=&quot;텍스트 입력 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9zUO/btsLSkkgI1E/JqNfG79Rpp5k6oFqFgIbU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9zUO%2FbtsLSkkgI1E%2FJqNfG79Rpp5k6oFqFgIbU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;91&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텍스트 입력 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트를 입력하면 (개발자도구에서 해당 element를 선택해놓고 텍스트입력을 해보면) &amp;lt;br&amp;gt;태그가 텍스트 입력했을 때 사라져있음을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 IE에서는 텍스트를 입력했어도 뒤에 &amp;lt;br /&amp;gt; 태그가 남아있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXcWz/btsLQN2jIQq/IabK7BKp2kJytVSrRkgQC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXcWz/btsLQN2jIQq/IabK7BKp2kJytVSrRkgQC1/img.png&quot; data-alt=&quot;enter 직 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXcWz/btsLQN2jIQq/IabK7BKp2kJytVSrRkgQC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXcWz%2FbtsLQN2jIQq%2FIabK7BKp2kJytVSrRkgQC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;134&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;enter 직 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6IU9/btsLSotlAQ5/sZo6pJBJ2isTMgDWfDVCwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6IU9/btsLSotlAQ5/sZo6pJBJ2isTMgDWfDVCwK/img.png&quot; data-alt=&quot;텍스트 입력 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6IU9/btsLSotlAQ5/sZo6pJBJ2isTMgDWfDVCwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6IU9%2FbtsLSotlAQ5%2FsZo6pJBJ2isTMgDWfDVCwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;97&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텍스트 입력 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 차이점, range의 범위가 다르다.&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1737103746840&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let selection = document.getSelection();
let range = selection.getRangeAt(0);
let currentNode = range.startContainer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;currentNode를 확인해보면 Chrome에서는 한글을 입력에 enter를 쳐서 확인해도 range의 startOffset과 endOffset이 같은데,&amp;nbsp; IE에서는 한글을 입력중에 엔터를 친 경우에 아직 조합이 끝났다고 보지않아 startOffset과 endOffset이 차이가 있었다.&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/425</guid>
      <comments>https://development-writing.tistory.com/425#entry425comment</comments>
      <pubDate>Fri, 10 Jan 2025 17:52:54 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트의 일치연산자(==, ===)</title>
      <link>https://development-writing.tistory.com/424</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/comparison&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735256856289&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;비교 연산자&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/comparison&quot; data-og-url=&quot;https://ko.javascript.info/comparison&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jM99C/hyXSBHDiJM/m3bhLfSOvxAo9nCk5g5h91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cxx2vl/hyXSsYcMUS/YXpkkYJaaDMrsKpLXiij60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/comparison&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/comparison&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jM99C/hyXSBHDiJM/m3bhLfSOvxAo9nCk5g5h91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cxx2vl/hyXSsYcMUS/YXpkkYJaaDMrsKpLXiij60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;비교 연산자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 97px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;equality operator (==)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;strict equality operator (===)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;0과 false를 구별하지 못한다.&lt;br /&gt;''(빈문자열)과 false를 구별하지 못한다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;자료형의 동등여부까지 검사한다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;비교할 때 피연산자를 숫자형으로 바꾼다.&lt;br /&gt;'01' == 1 // true&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;형 변환 없이 값을 비교할 수 있다.&lt;br /&gt;'01' === 1 // false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;피연산자가 undefined나 null일 때 형 변환을 하지 않는다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735257500795&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alert('01' == 1); //true
alert('01' === 1); //false

alert(null &amp;gt;= 0); //true
alert(null &amp;lt;= 0); //true
alert(null == 0); //false
alert(null == undefined); //true

alert(undefined &amp;gt;= 0); //false
alert(undefined &amp;lt;= 0); //false

alert(isNaN(undefined)); //true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null은 기타 비교 연산자(&amp;gt;, &amp;lt;. &amp;gt;=, &amp;lt;=)와 연산될 때는 숫자형으로 변환돼 0으로 취급된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;undefined는 숫자형으로 변환될 때 NaN으로 변환된다. NaN이 피연산자인 경우 비교 연산자는 항상 false를 반환한다.&lt;/p&gt;</description>
      <category>정보/Language</category>
      <category>Javascript</category>
      <category>동등연산자</category>
      <category>비교연산자</category>
      <category>자바스크립트</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/424</guid>
      <comments>https://development-writing.tistory.com/424#entry424comment</comments>
      <pubDate>Fri, 27 Dec 2024 09:09:42 +0900</pubDate>
    </item>
    <item>
      <title>EXCEL 문자열 ERROR 시</title>
      <link>https://development-writing.tistory.com/423</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 포스팅 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/xl/sharedStrings.xml ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xlsx 확장자를 zip으로 바꾼 후 /xl/sharedStrings.xml 파일을 열어 error가 나는 문자열을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bathildis.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bathildis.tistory.com/76&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1733895280574&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ABAP] 엑셀다운로드 후 파일이 깨질 때 원인 찾는 방법&quot; data-og-description=&quot;읽을 수 없는 내용을 복구하거나 제거하여 파일을 열 수 있습니다. 제거된 요소: XML 오류가 있는 /xl/sharedStrings.xml 부분. (문자열) 잘못된 xml 문자입니다. 1 행, 440759 열. 제거된 레코드: /xl/worksheets/&quot; data-og-host=&quot;bathildis.tistory.com&quot; data-og-source-url=&quot;https://bathildis.tistory.com/76&quot; data-og-url=&quot;https://bathildis.tistory.com/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DpBJ1/hyXKmqtEDs/WKnTOKPVqk9GWHCSObTWDk/img.png?width=510&amp;amp;height=274&amp;amp;face=0_0_510_274,https://scrap.kakaocdn.net/dn/yWcgw/hyXKtQFdJ2/lKr6wv64EsWxgVpehDdluk/img.png?width=510&amp;amp;height=274&amp;amp;face=0_0_510_274,https://scrap.kakaocdn.net/dn/bZzVit/hyXKvOua9d/eJd6KpbaJfWb8unXpDUnm0/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440&quot;&gt;&lt;a href=&quot;https://bathildis.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bathildis.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DpBJ1/hyXKmqtEDs/WKnTOKPVqk9GWHCSObTWDk/img.png?width=510&amp;amp;height=274&amp;amp;face=0_0_510_274,https://scrap.kakaocdn.net/dn/yWcgw/hyXKtQFdJ2/lKr6wv64EsWxgVpehDdluk/img.png?width=510&amp;amp;height=274&amp;amp;face=0_0_510_274,https://scrap.kakaocdn.net/dn/bZzVit/hyXKvOua9d/eJd6KpbaJfWb8unXpDUnm0/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ABAP] 엑셀다운로드 후 파일이 깨질 때 원인 찾는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;읽을 수 없는 내용을 복구하거나 제거하여 파일을 열 수 있습니다. 제거된 요소: XML 오류가 있는 /xl/sharedStrings.xml 부분. (문자열) 잘못된 xml 문자입니다. 1 행, 440759 열. 제거된 레코드: /xl/worksheets/&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bathildis.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@hslim8888/%EC%97%91%EC%85%80%EC%9D%B4-ZIP-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EC%97%88%EB%8B%A4%EB%8B%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@hslim8888/%EC%97%91%EC%85%80%EC%9D%B4-ZIP-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EC%97%88%EB%8B%A4%EB%8B%88&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733895301535&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;엑셀이 ZIP 파일이었다니!!&quot; data-og-description=&quot;외부에 엑셀 파일 업로드 API를 연동했는데, 에러가 난다고 해 살펴보니 xlsx 포맷이 아니라 csv 포맷을 올려서 문제였던 것.openpyxl 라이브러리를 이용해 엑셀 파일을 열게끔 코드가 짜져있었는데, &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hslim8888/%EC%97%91%EC%85%80%EC%9D%B4-ZIP-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EC%97%88%EB%8B%A4%EB%8B%88&quot; data-og-url=&quot;https://velog.io/@hslim8888/엑셀이-ZIP-파일이었다니&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGd8CS/hyXKuhKD3H/5GAoxG2KlCM3ABMpI8QtF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@hslim8888/%EC%97%91%EC%85%80%EC%9D%B4-ZIP-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EC%97%88%EB%8B%A4%EB%8B%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hslim8888/%EC%97%91%EC%85%80%EC%9D%B4-ZIP-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EC%97%88%EB%8B%A4%EB%8B%88&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGd8CS/hyXKuhKD3H/5GAoxG2KlCM3ABMpI8QtF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;엑셀이 ZIP 파일이었다니!!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;외부에 엑셀 파일 업로드 API를 연동했는데, 에러가 난다고 해 살펴보니 xlsx 포맷이 아니라 csv 포맷을 올려서 문제였던 것.openpyxl 라이브러리를 이용해 엑셀 파일을 열게끔 코드가 짜져있었는데,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)?redirectedfrom=MSDN&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)?redirectedfrom=MSDN&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733895309617&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;XML Spreadsheet Reference&quot; data-og-description=&quot;XML Spreadsheet Reference Article 06/14/2014 In this article --&amp;gt; This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most rec&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)?redirectedfrom=MSDN&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bp6Sjt/hyXKnv8zPm/qXN0uY8g8vHhGLOgAiSAhK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)?redirectedfrom=MSDN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10)?redirectedfrom=MSDN&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bp6Sjt/hyXKnv8zPm/qXN0uY8g8vHhGLOgAiSAhK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;XML Spreadsheet Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;XML Spreadsheet Reference Article 06/14/2014 In this article --&amp;gt; This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most rec&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/423</guid>
      <comments>https://development-writing.tistory.com/423#entry423comment</comments>
      <pubDate>Wed, 11 Dec 2024 14:36:15 +0900</pubDate>
    </item>
    <item>
      <title>이모지 EMOJI 정규식 REGEX</title>
      <link>https://development-writing.tistory.com/422</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;str.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2580-\u27BF]|\uD83E[\uDD10-\uDDFF])/g, '');&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733895098155&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How to remove emoji code using javascript?&quot; data-og-description=&quot;How do I remove emoji code using JavaScript? I thought I had taken care of it using the code below, but I still have characters like  . function removeInvalidChars() { return this.replace(/[\...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&quot; data-og-url=&quot;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZMlkz/hyXKnXeiG5/3b2jKhGcKmvY4TyEzvisPK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/10992921/how-to-remove-emoji-code-using-javascript&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZMlkz/hyXKnXeiG5/3b2jKhGcKmvY4TyEzvisPK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How to remove emoji code using javascript?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;How do I remove emoji code using JavaScript? I thought I had taken care of it using the code below, but I still have characters like  . function removeInvalidChars() { return this.replace(/[\...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/422</guid>
      <comments>https://development-writing.tistory.com/422#entry422comment</comments>
      <pubDate>Wed, 11 Dec 2024 14:31:41 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] The Basics: Using a ScrollView, Using List Views</title>
      <link>https://development-writing.tistory.com/421</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ScrollView는 여러 컴포넌트와 view를 담을 수 있는 스크롤되는 container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactnative.dev/docs/using-a-scrollview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reactnative.dev/docs/using-a-scrollview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733202946292&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Using a ScrollView &amp;middot; React Native&quot; data-og-description=&quot;The ScrollView is a generic scrolling container that can contain multiple components and views. The scrollable items can be heterogeneous, and you can scroll both vertically and horizontally (by setting the horizontal property).&quot; data-og-host=&quot;reactnative.dev&quot; data-og-source-url=&quot;https://reactnative.dev/docs/using-a-scrollview&quot; data-og-url=&quot;https://reactnative.dev/docs/using-a-scrollview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sKGqV/hyXGAoO64J/MmfKzijyI8i4pqOSUKCfW0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbdlXD/hyXGA3pFP9/K9WkhO3mh5SwSvxcs0WJH0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://reactnative.dev/docs/using-a-scrollview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://reactnative.dev/docs/using-a-scrollview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sKGqV/hyXGAoO64J/MmfKzijyI8i4pqOSUKCfW0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbdlXD/hyXGA3pFP9/K9WkhO3mh5SwSvxcs0WJH0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Using a ScrollView &amp;middot; React Native&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The ScrollView is a generic scrolling container that can contain multiple components and views. The scrollable items can be heterogeneous, and you can scroll both vertically and horizontally (by setting the horizontal property).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;reactnative.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733200190873&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import {Image, ScrollView, Text} from 'react-native';

const logo = {
  uri: 'https://reactnative.dev/img/tiny_logo.png',
  width: 64,
  height: 64,
};

// 아래로 스크롤바를 밀어서 페이지 이동할 수 있다. 
// pagiongEnabled prop을 넣으면 swipe 될 때 scroll view의 size 몇 개를 넘기고 멈춘다. 
// 자세한 사항: https://reactnative.dev/docs/scrollview#pagingenabled
// maximumZoomScale, minimumZoomScale prop을 통해서 사용자가 줌인, 줌아웃 가능하게 할 수도 있음.
// 화면에 맞지 않는 긴 리스트가 있다면 FlatList 사용 권장
const App = () =&amp;gt; (
  &amp;lt;ScrollView&amp;gt;
    &amp;lt;Text style={{fontSize: 96}}&amp;gt;Scroll me plz&amp;lt;/Text&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Text style={{fontSize: 96}}&amp;gt;If you like&amp;lt;/Text&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Text style={{fontSize: 96}}&amp;gt;Scrolling down&amp;lt;/Text&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Text style={{fontSize: 96}}&amp;gt;What's the best&amp;lt;/Text&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Text style={{fontSize: 96}}&amp;gt;Framework around?&amp;lt;/Text&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Image source={logo} /&amp;gt;
    &amp;lt;Text style={{fontSize: 80}}&amp;gt;React Native&amp;lt;/Text&amp;gt;
  &amp;lt;/ScrollView&amp;gt;
);

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FlastList 변하지만 구조적으로 유사한 데이터의 스크롤되는 리스트를 담는 컴포넌트. 시간이 지남에 따라 변하는 아이템이 있는 데이터의 긴 리스트에 잘 작동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;★ 일반적인 ScrollView와 달리 화면에 현재 보이는 요소들만 렌더링한다. 한 번에 모드 요소를 렌더링하지 않음. ★&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FlastList 컴포넌트는 data와 rederItem 두 가지의 prop이 필수이다. data는 리스팅할 데이터. renderItem은 데이터에서 하나 꺼내서 렌더링되는 컴포넌트를 돌려준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733203682028&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import {FlatList, StyleSheet, Text, View} from 'react-native';

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 22,
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
});

const FlatListBasics = () =&amp;gt; {
  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;FlatList
        data={[
          {key: 'Devin'},
          {key: 'Dan'},
          {key: 'Dominic'},
          {key: 'Jackson'},
          {key: 'James'},
          {key: 'Joel'},
          {key: 'John'},
          {key: 'Jillian'},
          {key: 'Jimmy'},
          {key: 'Julie'},
        ]}
        // 데이터들을 전부 Text 컴포넌트로 렌더링 된다. 
        renderItem={({item}) =&amp;gt; &amp;lt;Text style={styles.item}&amp;gt;{item.key}&amp;lt;/Text&amp;gt;}
      /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default FlatListBasics;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;section header 를 통해 논리적으로 구분되는 데이터를 렌더링하고 싶으면 SectionList를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733208756188&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import {SectionList, StyleSheet, Text, View} from 'react-native';

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 22,
  },
  sectionHeader: {
    paddingTop: 2,
    paddingLeft: 10,
    paddingRight: 10,
    paddingBottom: 2,
    fontSize: 14,
    fontWeight: 'bold',
    backgroundColor: 'rgba(247,247,247,1.0)',
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
});

const SectionListBasics = () =&amp;gt; {
  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;SectionList
        sections={[
          {title: 'D', data: ['Devin', 'Dan', 'Dominic']},
          {
            title: 'J',
            data: [
              'Jackson',
              'James',
              'Jillian',
              'Jimmy',
              'Joel',
              'John',
              'Julie',
            ],
          },
        ]}
        renderItem={({item}) =&amp;gt; &amp;lt;Text style={styles.item}&amp;gt;{item}&amp;lt;/Text&amp;gt;}
        renderSectionHeader={({section}) =&amp;gt; (
          &amp;lt;Text style={styles.sectionHeader}&amp;gt;{section.title}&amp;lt;/Text&amp;gt;
        )}
        keyExtractor={item =&amp;gt; `basicListEntry-${item}`}
      /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default SectionListBasics;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list view 공통의 특징으로 서버에서 가져오는 데이터를 보여준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 가져오는 데이터에 관한 자세한 문서: &lt;a href=&quot;https://reactnative.dev/docs/network&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reactnative.dev/docs/network&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보/App</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/421</guid>
      <comments>https://development-writing.tistory.com/421#entry421comment</comments>
      <pubDate>Tue, 3 Dec 2024 15:55:49 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] The Basics: Handling Text Input</title>
      <link>https://development-writing.tistory.com/420</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Text input은 사용자가 글을 입력할 수 있게하는 핵심 컴포넌트.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onChangeText: 텍스트가 변할때마다 호출되는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onSubmitEditing: submit될 때 호출되는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactnative.dev/docs/handling-text-input&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reactnative.dev/docs/handling-text-input&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732668047542&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Handling Text Input &amp;middot; React Native&quot; data-og-description=&quot;TextInput is a Core Component that allows the user to enter text. It has an onChangeText prop that takes a function to be called every time the text changed, and an onSubmitEditing prop that takes a function to be called when the text is submitted.&quot; data-og-host=&quot;reactnative.dev&quot; data-og-source-url=&quot;https://reactnative.dev/docs/handling-text-input&quot; data-og-url=&quot;https://reactnative.dev/docs/handling-text-input&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oS6lM/hyXDcompnM/MKmlyYAi0f8IJPK0d104Q0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbKcDe/hyXDni6fty/7T4z129c8ku2hyzwarHv80/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://reactnative.dev/docs/handling-text-input&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://reactnative.dev/docs/handling-text-input&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oS6lM/hyXDcompnM/MKmlyYAi0f8IJPK0d104Q0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbKcDe/hyXDni6fty/7T4z129c8ku2hyzwarHv80/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Handling Text Input &amp;middot; React Native&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TextInput is a Core Component that allows the user to enter text. It has an onChangeText prop that takes a function to be called every time the text changed, and an onSubmitEditing prop that takes a function to be called when the text is submitted.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;reactnative.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732667972151&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, {useState} from 'react';
import {Text, TextInput, View} from 'react-native';

const PizzaTranslator = () =&amp;gt; {
  // text는 시간에 따라 변하므로 state에 저장한다.
  const [text, setText] = useState('');
  return (
    &amp;lt;View style={{padding: 10}}&amp;gt;
      &amp;lt;TextInput
        style={{height: 40}}
        placeholder=&quot;Type here to translate!&quot;
        onChangeText={newText =&amp;gt; setText(newText)}
        defaultValue={text}
      /&amp;gt;
      &amp;lt;Text style={{padding: 10, fontSize: 42}}&amp;gt;
        {text
          .split(' ')
          .map(word =&amp;gt; word &amp;amp;&amp;amp; ' ')
          .join(' ')}
      &amp;lt;/Text&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default PizzaTranslator;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ 변하는 것만 re-render 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1732668052123&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;&amp;lt;input&amp;gt; &amp;ndash; React&quot; data-og-description=&quot;The library for web and native user interfaces&quot; data-og-host=&quot;react.dev&quot; data-og-source-url=&quot;https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable&quot; data-og-url=&quot;https://react.dev/reference/react-dom/components/input&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dKgZwg/hyXC7UR7fk/u4Z1AJgYfKIoQKiIRwZRF0/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/Hw8CB/hyXDfrPV2a/ydEhKfvsdwtWY98KkPQGx1/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567&quot;&gt;&lt;a href=&quot;https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dKgZwg/hyXC7UR7fk/u4Z1AJgYfKIoQKiIRwZRF0/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/Hw8CB/hyXDfrPV2a/ydEhKfvsdwtWY98KkPQGx1/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;input&amp;gt; &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The library for web and native user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;react.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732668373230&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// AS-IS
function App() {
  /* 여기에서 키보드 타자를 칠 때마다 (onChange될 때 마다) 
     setFirstName 을 통해 함수를 호출하고 다시 렌더링 되는데, 
     re-rendering performance를 최적화 하기 위해서는,
     &amp;lt;PageContent /&amp;gt; 는 input의 state에 영향을 받지 않으므로
     input의 state를 다루는 컴포넌트를 따로 만든다. */
  const [firstName, setFirstName] = useState('');
  return (
    &amp;lt;&amp;gt;
      &amp;lt;form&amp;gt;
        &amp;lt;input value={firstName} onChange={e =&amp;gt; setFirstName(e.target.value)} /&amp;gt;
      &amp;lt;/form&amp;gt;
      &amp;lt;PageContent /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

// TO-BE
function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;SignupForm /&amp;gt;
      &amp;lt;PageContent /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

function SignupForm() {
  const [firstName, setFirstName] = useState('');
  return (
    &amp;lt;form&amp;gt;
      &amp;lt;input value={firstName} onChange={e =&amp;gt; setFirstName(e.target.value)} /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
/* 이 경우 performance가 상당히 향상되는데, 
   이제는 키입력에 따라 onChange 이벤트가 호출될 때,
   SignupForm만 다시 렌더링하기 때문이다. */&lt;/code&gt;&lt;/pre&gt;</description>
      <category>정보/App</category>
      <author>호쏘2</author>
      <guid isPermaLink="true">https://development-writing.tistory.com/420</guid>
      <comments>https://development-writing.tistory.com/420#entry420comment</comments>
      <pubDate>Wed, 27 Nov 2024 09:48:15 +0900</pubDate>
    </item>
  </channel>
</rss>