<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꿀노잼개발 저장소</title>
    <link>https://w94dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 05:43:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>curioser</managingEditor>
    <image>
      <title>꿀노잼개발 저장소</title>
      <url>https://tistory1.daumcdn.net/tistory/3503089/attach/560b0aefcd5144cd952291963acb5d6a</url>
      <link>https://w94dev.tistory.com</link>
    </image>
    <item>
      <title>C# :: ExcelDatareader DLL 을 이용한 엑셀데이터 가져오기</title>
      <link>https://w94dev.tistory.com/59</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthFull&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTJnw9/btsytu8ioGK/Gz8H4oHqlSWu5qisiKfANK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTJnw9/btsytu8ioGK/Gz8H4oHqlSWu5qisiKfANK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTJnw9/btsytu8ioGK/Gz8H4oHqlSWu5qisiKfANK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTJnw9%2Fbtsytu8ioGK%2FGz8H4oHqlSWu5qisiKfANK%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;b&gt; 오늘의 목적&lt;/b&gt;&lt;br&gt;xlsx 파일을 넣고 해당 엑셀 데이터를 가져오자&lt;br&gt;&lt;br&gt;&lt;b&gt;  ExcelDatareader DLL 다운로드하기&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;br&gt;[C# :: 엑셀 데이터 불러오기 , 가져오기 (Read data from excel file)&lt;br&gt;예전에 SheetJS를 이용해서 엑셀데이터를 가져오고 엑셀을 시트별로 만드는 것을 했었는데 javascript :: SheetJS 테이블들 엑셀 시트 별로 다운로드하기 이번에 엑셀다운로드를 구현하는 일을 맡게 되&lt;br&gt;w94dev.tistory.com](&lt;a href=&quot;https://w94dev.tistory.com/53&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://w94dev.tistory.com/53&lt;/span&gt;&lt;/a&gt;)&lt;br&gt;ExcelDatareader DLL을 통해 엑셀 데이터를 가져오는 방법을 예전에 한 번 작성한 적이 있다.&lt;br&gt;이 포스팅대로 Nuget 패키지관리에서 ExcelDatareader DLL 두 가지를 모두 다운로드 받아서 사용하면 된다.&lt;br&gt;&lt;br&gt;&lt;b&gt;  CS 파일&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using ExcelDataReader;
using OfficeOpenXml;

protected void ChkWithDB(object sender, EventArgs e)
{

    HttpPostedFile upFile= fileUpload.PostedFile;
    if (upFile== null || upFile.ContentLength == 0)
    {
        // 경고 메세지 띄워주기
        return;
    }

    //첨부파일 스트림
    var upFileStream = upFile.PostedFile.InputStream;

    //첨부파일 데이터 읽어오는 부분
    using (var reader = ExcelReaderFactory.CreateReader(upFileStream )) //ExcelDataReader
    {
        var result = reader.AsDataSet().Tables[0];
    }

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;먼저 엑셀을 사용하기 위해 using ExcelDataReader;을 해준다.&lt;br&gt;업로드한 xlsx 파일을 읽어오기 위해 using OfficeOpenXml;도 해준다.&lt;br&gt;업로드한 파일을 읽어오는 부분에서 나는 무조건 'xlsx' 형태의 파일만 넣을 계획이라 ExcelReaderFactory.CreateReader 를 사용하여 데이터를 읽어오기로 했다.&lt;br&gt;엑셀에도 다양한 파일 형식이 있기 때문에 해당 형식에 따라 알맞은 함수를 사용하면 된다.&lt;br&gt;해당 내용은 위에 첨부한 &lt;a href=&quot;https://w94dev.tistory.com/53&quot; target=&quot;_self&quot;&gt;&lt;span&gt;엑셀데이터 불러오기 포스팅&lt;/span&gt;&lt;/a&gt;에 자세하게 적혀있습니다  &lt;br&gt;이렇게 2편도 끝!&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  관련글&lt;/b&gt;&lt;br&gt;&lt;b&gt;0.&lt;/b&gt; &lt;a href=&quot;https://w94dev.tistory.com/57&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;b&gt;C# :: 엑셀 데이터와 데이터 베이스 데이터 비교하여 결과 엑셀 다운로드 하기 (0편)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;b&gt;1.&lt;/b&gt; &lt;a href=&quot;https://w94dev.tistory.com/58&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;b&gt;C# :: ASP프레임 워크에서 클릭된 버튼 ID 가져오기 (How to get the ID of the clicked button)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;b&gt;2. &lt;/b&gt;&lt;a href=&quot;https://w94dev.tistory.com/59&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;b&gt;C# :: ExcelDatareader DLL 을 이용한 엑셀데이터 가져오기&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot;&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <category>c#</category>
      <category>ExcelDataReader</category>
      <category>엑셀데이터가져오기</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/59</guid>
      <comments>https://w94dev.tistory.com/59#entry59comment</comments>
      <pubDate>Sat, 14 Oct 2023 08:39:24 +0900</pubDate>
    </item>
    <item>
      <title>C# :: ASP프레임 워크에서 클릭된 버튼 ID 가져오기 (How to get the ID of the clicked button)</title>
      <link>https://w94dev.tistory.com/58</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthFull&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1c2C/btsys60JKtX/OoJLI1MMmcharrkvCuj4vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1c2C/btsys60JKtX/OoJLI1MMmcharrkvCuj4vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1c2C/btsys60JKtX/OoJLI1MMmcharrkvCuj4vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1c2C%2Fbtsys60JKtX%2FOoJLI1MMmcharrkvCuj4vK%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 오늘의 목적&lt;/b&gt;&lt;br /&gt;Button A와 Button B에 따라 기능을 다르게 실행하기 위해 클릭된 버튼의 ID를 가져오는 것을 해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  aspx페이지&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;cphContent&quot; runat=&quot;Server&quot;&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;input type=&quot;file&quot; id=&quot;fUp&quot; name=&quot;fUp&quot; accept=&quot;.xlsx&quot; runat=&quot;server&quot; /&amp;gt;
        &amp;lt;asp:Button ID=&quot;BtnA&quot; runat=&quot;server&quot; Text=&quot;Button A&quot; OnClick=&quot;ChkWithDB&quot; /&amp;gt;
        &amp;lt;asp:Button ID=&quot;BtnB&quot; runat=&quot;server&quot; Text=&quot;Button B&quot; OnClick=&quot;ChkWithDB&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/asp:Content&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id가 fUp인 input 태그 안에 파일을 첨부 한 후 BtnA 또는 BtnB가 클릭되었는지 알기 위해서&lt;br /&gt;그 밑에 ASP Button 두 개를 추가로 만들어 준다.&lt;br /&gt;버튼을 클릭하면 ChkWithDB 메서드로 가도록 해두었다.&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;b&gt;  cs페이지&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using System.Web.UI.WebControls;

protected void ChkWithDB (object sender, EventArgs e)
{

    Button targetBtn = (Button)sender;

    switch (targetBtn.ID)
    {

        case &amp;ldquo;BtnA&amp;rdquo; :
            //BtnA 기능 실행
            break;

        case &amp;ldquo;BtnB&amp;rdquo; :
            //BtnB 기능 실행
            break;

    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button 클래스를 사용하기 위해서는 상단에 using System.Web.UI.WebControls; 을 추가해주어야 한다.&lt;br /&gt;어떤 버튼이 클릭되었는지 알기 위해서 매개변수인 sender를 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sender를 Button으로 캐스팅하여 버튼의 속성을 가져올 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 선언 후 targetBtn.ID 를 통해 클릭된 버튼의 아이디를 가져오면 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 switch - case 구문을 써서 소스를 구현하기로 했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  관련글&lt;/b&gt;&lt;br /&gt;&lt;b&gt;0.&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://w94dev.tistory.com/57&quot;&gt;&lt;b&gt;C# :: 엑셀 데이터와 데이터 베이스 데이터 비교하여 결과 엑셀 다운로드 하기 (0편)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://w94dev.tistory.com/58&quot;&gt;&lt;b&gt;C# :: ASP프레임 워크에서 클릭된 버튼 ID 가져오기 (How to get the ID of the clicked button)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://w94dev.tistory.com/59&quot;&gt;C# :: ExcelDatareader DLL 을 이용한 엑셀데이터 가져오기&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>C#</category>
      <category>ASP</category>
      <category>c#</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/58</guid>
      <comments>https://w94dev.tistory.com/58#entry58comment</comments>
      <pubDate>Fri, 13 Oct 2023 20:31:22 +0900</pubDate>
    </item>
    <item>
      <title>C# :: 엑셀 데이터와 데이터 베이스 데이터 비교하여 결과 엑셀 다운로드 하기 (0편)</title>
      <link>https://w94dev.tistory.com/57</link>
      <description>&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;widthFull&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxPgn/btsylCyMscJ/kyNyKJZwneKwZpKlKPkfJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxPgn/btsylCyMscJ/kyNyKJZwneKwZpKlKPkfJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxPgn/btsylCyMscJ/kyNyKJZwneKwZpKlKPkfJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxPgn%2FbtsylCyMscJ%2FkyNyKJZwneKwZpKlKPkfJK%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;이번에 할 것은 엑셀과 데이터베이스 데이터들을 비교한 후 다른 데이터를 엑셀로 다운로드하기&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;매우 장황해보이지만 4단계에 걸쳐서 글을 작성할 예정이다.&lt;br /&gt;사용언어는 C#, 프레임워크는 ASP.NET, 데이터베이스는 MSSQL&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  구현 과정&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;엑셀 파일을 추가한 후 버튼에 따라 어떤 데이터베이스를 가져올지 가르기 위해 버튼 id를 가져온다&lt;/li&gt;
&lt;li&gt;엑셀데이터를 가져온다&lt;/li&gt;
&lt;li&gt;데이터베이스에서 데이터를 가져온 후 엑셀과 비교를 진행한다&lt;/li&gt;
&lt;li&gt;차이가 나는 데이터를 엑셀로 다운로드 한다&lt;/li&gt;
&lt;li&gt;완성!&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: left;&quot; 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;2000&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA50gB/btsyktuYmQd/UGER9LDIKY5ibxmGKPn1FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA50gB/btsyktuYmQd/UGER9LDIKY5ibxmGKPn1FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA50gB/btsyktuYmQd/UGER9LDIKY5ibxmGKPn1FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA50gB%2FbtsyktuYmQd%2FUGER9LDIKY5ibxmGKPn1FK%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;430&quot; height=&quot;72&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;파일선택을 클릭 후 엑셀파일을 넣은 다음 버튼에 따라 기능이 나뉘어서&lt;br /&gt;1편을 버튼 아이디를 가져오는 걸로 썼는데&lt;br /&gt;엑셀이랑 데이터베이스 비교만 원한다면 2편부터 봐도 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;투비컨티뉴드 &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  관련글&lt;/b&gt;&lt;br /&gt;&lt;b&gt;0.&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://w94dev.tistory.com/57&quot;&gt;&lt;b&gt;C# :: 엑셀 데이터와 데이터 베이스 데이터 비교하여 결과 엑셀 다운로드 하기 (0편)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://w94dev.tistory.com/58&quot;&gt;&lt;b&gt;C# :: ASP프레임 워크에서 클릭된 버튼 ID 가져오기 (How to get the ID of the clicked button)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://w94dev.tistory.com/59&quot;&gt;C# :: ExcelDatareader DLL 을 이용한 엑셀데이터 가져오기&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>C#</category>
      <category>ASP</category>
      <category>c#</category>
      <category>MSSQL</category>
      <category>데이터베이스</category>
      <category>엑셀</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/57</guid>
      <comments>https://w94dev.tistory.com/57#entry57comment</comments>
      <pubDate>Thu, 12 Oct 2023 23:01:29 +0900</pubDate>
    </item>
    <item>
      <title>C# :: String.Equals 메소드 사용하기</title>
      <link>https://w94dev.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnIo8/btsxSziPp2B/WqJyvYpHwbaK4axPeiPkz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnIo8/btsxSziPp2B/WqJyvYpHwbaK4axPeiPkz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnIo8/btsxSziPp2B/WqJyvYpHwbaK4axPeiPkz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmnIo8%2FbtsxSziPp2B%2FWqJyvYpHwbaK4axPeiPkz0%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;업무중에 한 분 께서 Equals함수를 사용할 때 “문자열”.Equals(변수) 의 형태로 사용하는 것을 보고 이유를 물어봤다.&lt;br&gt;그렇게 알게 되어서 정리하는 &lt;b&gt;C# 의 String.Equals 메서드 사용방법&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;br&gt;❓&lt;b&gt;&quot;개발&quot;.Equals(strDev)와 strDev.Equals(&quot;개발&quot;)의 차이는 무엇인가?&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;br&gt;  &lt;b&gt;&quot;개발&quot;.Equals(strDev)&lt;/b&gt;는 문자열인 “개발”이 strDev의 객체를 비교한다. 만약 다른 형식의 객체이거나, null인경우 예외로 빠지는것이 아니라 false를 반환하여 조건문을 끝낸다&lt;br&gt;  &lt;b&gt;strDev.Equals(&quot;개발&quot;)&lt;/b&gt;는 strDev가 문자열인 “개발’과 비교를한다. 만약 strDev가 다른형식이거나 null이면 예외가 throw 된다.&lt;br&gt;&lt;br&gt;❗따라서 null비교를 하거나 다른 예외처리를 통해 또 다른 함수를 호출한다면 strDev.Equals(&quot;개발&quot;)의 형식을 사용하고&lt;br&gt;만약 이것이 필요하지 않다면 &quot;개발&quot;.Equals(strDev)를 통해서 한 번에 이런 문제를 해결할 수가 있다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;true&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot;&gt;&lt;/figure&gt;</description>
      <category>C#</category>
      <category>c#</category>
      <category>Equals함수</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/56</guid>
      <comments>https://w94dev.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 11 Oct 2023 13:57:00 +0900</pubDate>
    </item>
    <item>
      <title>javascript :: CapsLock 버튼 감지하기</title>
      <link>https://w94dev.tistory.com/55</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4o3ZU/btsxsp9cQn6/uFFoRIHAFgLrK9HbQND9Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4o3ZU/btsxsp9cQn6/uFFoRIHAFgLrK9HbQND9Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4o3ZU/btsxsp9cQn6/uFFoRIHAFgLrK9HbQND9Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4o3ZU%2Fbtsxsp9cQn6%2FuFFoRIHAFgLrK9HbQND9Z1%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;로그인 시 사용자들은 대부분&lt;br&gt;자기가 비밀번호를 잘못설정해놨다고 생각하지&lt;br&gt;이게 대소문자 때문이라고는 생각하지 못하는 경우가 많다.&lt;br&gt;비밀번호 오류나면&lt;br&gt;관리자도 귀찮고 사용자도 귀찮으니&lt;br&gt;로그인 페이지 구현시 해두면 좋은&lt;br&gt;'Caps Lock' 여부 알려주는 기능 구현해보기 !&lt;br&gt;&lt;b&gt; &lt;/b&gt; &lt;b&gt;javascript 기능 중 getModifierState 를 이용해봅시다 !&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;head&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
window.onload = function() {
document.getElementById(&quot;njInput&quot;).addEventListener(&quot;keydown&quot;, function(event) {
var cLAlert = document.getElementById(&quot;cLAlert&quot;);
    if (event.getModifierState(&quot;CapsLock&quot;)) {
            cLAlert.style.display = &quot;block&quot;;
        } else {
            cLAlert.style.display = &quot;none&quot;;
        }
    });
}
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;input type=&quot;text&quot; id=&quot;njInput&quot;&amp;gt;
&amp;lt;div id=&quot;cLAlert&quot;&amp;gt;Caps Lock이 켜져있습니다.&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;해당 소스를 이용해서 코드를 만든 후&lt;br&gt;css 조금 변경해주면 아래와 같이 caps Lock 버튼이 눌려져있음을&lt;br&gt;알려주는 창이 뜬다&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZpC9/btsx48RbYIs/U4ZNFb5qxO6YPXR8qEkWCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZpC9/btsx48RbYIs/U4ZNFb5qxO6YPXR8qEkWCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZpC9/btsx48RbYIs/U4ZNFb5qxO6YPXR8qEkWCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZpC9%2Fbtsx48RbYIs%2FU4ZNFb5qxO6YPXR8qEkWCk%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;264&quot; height=&quot;121&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;capsLock 키를 구분해내기 위해 getModifierState 함수를 사용했는데&lt;br&gt;Alt, NumLock 등에서도 사용할 수 있다.&lt;br&gt;더 자세한 내용은 &lt;a href=&quot;http://%20https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;b&gt;getModifierState문서&lt;/b&gt;&lt;/span&gt;&lt;/a&gt; 에서 확인할 수 있다&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot;&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>CapsLock</category>
      <category>getModifierState</category>
      <category>javascript</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/55</guid>
      <comments>https://w94dev.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 10 Oct 2023 21:20:31 +0900</pubDate>
    </item>
    <item>
      <title>IT 전문가로 사는 법</title>
      <link>https://w94dev.tistory.com/54</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;32485080978.20220527075114.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JwXtl/btrSDE4ub9b/d3kWrljYUv4h9xJMhaKlI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JwXtl/btrSDE4ub9b/d3kWrljYUv4h9xJMhaKlI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JwXtl/btrSDE4ub9b/d3kWrljYUv4h9xJMhaKlI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJwXtl%2FbtrSDE4ub9b%2Fd3kWrljYUv4h9xJMhaKlI1%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;300&quot; height=&quot;444&quot; data-filename=&quot;32485080978.20220527075114.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이 책이 2016년에 나왔다는 점이 가장 놀랍다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후반에 가면 '미래 읽기는 IT전문가의 영원한 화두이며 특권이다'라고 한다.&lt;br /&gt;그와 관련하여 몇가지 예시가 나오는데 클라우드와 자동차의 소프트웨어가 중요해질 것이라는 저자의 전망이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드가 2016년 부터 슬금슬금 시작하였지만 우리나라도 최근 몇년에 들어서야 클라우드열풍이 불기 시작했지 이 당시에서부터 이렇게 내다보았다는게 흥미로웠다.&lt;br /&gt;트렌드를 읽고 미래를 예측하는 것을 최근 몇 년 주식을 시작 하며 관심을 가지게 되었는데 이런 통찰력을 내 커리어에도 써먹어 봐야겠구나 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT 전문가로 사는 법이라는 책을 개발자라는 직업으로 회사에 입사했을 때 읽어봤던 책인데 그 당시에는 잘 이해도 안 가고 IT가 이런 세계구나~ 정도였는데 , 몇년 일하고 나니 공감도 잘 가고 이해도 쏙쏙 된다.&lt;br /&gt;그렇다고 신입 개발자가 읽기에 비추한다는 말은 아니다. 이론책을 처음 공부했을 때는 이해가 안가다가 직접 일을 해보면 나중에 그 이론책이 이해가 되는 것처럼 , 이 책도 신입 개발자에서 부터 컨설턴트가 되기까지의 과정과 그 과정에서 얻은 노하우들을 알려주고 있기 때문에 읽어보는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종이책은 절판되었는데 이번에 읽고 너무 공감가고 하나하나 진심을 다해 쓴 책이라 느껴져 소장하기로 결심해서 이북으로 구매했다. 난 이제 'chapter2 중견사원으로 발돋움하여 더 넓은 IT 분야로 나가라'의 부분에 해당하는 팀원으로 이 부분을 꼼꼼히 봤던 것 같다.&lt;br /&gt;개발자는 참 다양한 커리어의 길이 있는 것 같아 재미있는 직업이라고 생각한다. 몇년 후에는 어떤일을 하고 있을지 이 책의 어떤부분에 공감할지 기대가 된다.&lt;/p&gt;</description>
      <category>생각저장소/서재</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/54</guid>
      <comments>https://w94dev.tistory.com/54#entry54comment</comments>
      <pubDate>Fri, 2 Dec 2022 00:11:38 +0900</pubDate>
    </item>
    <item>
      <title>C# :: 엑셀 데이터 불러오기 , 가져오기 (Read data from excel file)</title>
      <link>https://w94dev.tistory.com/53</link>
      <description>&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;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKMh1G/btrHbUY0pe9/KDKpRbuuDYFjNNKySYeNR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKMh1G/btrHbUY0pe9/KDKpRbuuDYFjNNKySYeNR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKMh1G/btrHbUY0pe9/KDKpRbuuDYFjNNKySYeNR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKMh1G%2FbtrHbUY0pe9%2FKDKpRbuuDYFjNNKySYeNR1%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예전에 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SheetJS를 이용해서 엑셀데이터를 가져오고&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엑셀을 시트별로 만드는 것을 했었는데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;javascript :: SheetJS 테이블들 엑셀 시트 별로 다운로드하기&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;이번에 엑셀다운로드를 구현하는 일을 맡게 되었다. 이전까지는 엑셀 다운로드를 할 때 단일 시트형식이었기 때문에 큰 어려움은 없었다. 하지만 이번에는 테이블에 따라 시트를 나눠달라는 요&quot; data-og-host=&quot;w94dev.tistory.com&quot; data-og-source-url=&quot;https://w94dev.tistory.com/43?category=746638&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zuxK3/hyO4M5tzwe/tbm0Krfn8rPvyyxMrPLnFK/img.png?width=501&amp;amp;height=501&amp;amp;face=0_0_501_501,https://scrap.kakaocdn.net/dn/buFv4X/hyO4IhFh8l/eyDc59ctD2HTIWh7ikqVQk/img.png?width=501&amp;amp;height=501&amp;amp;face=0_0_501_501,https://scrap.kakaocdn.net/dn/bggLdD/hyO4Efg8qL/XrJAjvrTNAafIWgZrOPItk/img.png?width=640&amp;amp;height=598&amp;amp;face=0_0_640_598&quot; data-og-url=&quot;https://w94dev.tistory.com/43&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://w94dev.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://w94dev.tistory.com/43?category=746638&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zuxK3/hyO4M5tzwe/tbm0Krfn8rPvyyxMrPLnFK/img.png?width=501&amp;amp;height=501&amp;amp;face=0_0_501_501,https://scrap.kakaocdn.net/dn/buFv4X/hyO4IhFh8l/eyDc59ctD2HTIWh7ikqVQk/img.png?width=501&amp;amp;height=501&amp;amp;face=0_0_501_501,https://scrap.kakaocdn.net/dn/bggLdD/hyO4Efg8qL/XrJAjvrTNAafIWgZrOPItk/img.png?width=640&amp;amp;height=598&amp;amp;face=0_0_640_598');&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;javascript :: SheetJS 테이블들 엑셀 시트 별로 다운로드하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번에 엑셀다운로드를 구현하는 일을 맡게 되었다. 이전까지는 엑셀 다운로드를 할 때 단일 시트형식이었기 때문에 큰 어려움은 없었다. 하지만 이번에는 테이블에 따라 시트를 나눠달라는 요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;w94dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C# DLL을 다운받아 직접 엑셀데이터를 가져와보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;첫 번째 / DLL 다운받기  &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엑셀 데이터를 가져오기 위해서는 먼저 DLL을 다운받아야한다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;솔루션탐색기&amp;gt;마우스 오른쪽 버튼 클릭&amp;gt; NuGet패키지관리 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J0Kuo/btrG8QwnfyW/pRKgqfmbsKiwuqtpAPMlLk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J0Kuo/btrG8QwnfyW/pRKgqfmbsKiwuqtpAPMlLk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J0Kuo/btrG8QwnfyW/pRKgqfmbsKiwuqtpAPMlLk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/J0Kuo/btrG8QwnfyW/pRKgqfmbsKiwuqtpAPMlLk/img.gif&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;745&quot; height=&quot;251&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ExcelDatareader와 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ExcelDataReader.DataSet을 다운로드 받는다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;둘 다 받아야 한다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째 / ExcelDataReader참조로 넣기 &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엑셀 데이터를 부를 소스페이지에 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;using ExcelDataReader; 를 추가해주어 엑셀 데이터를 가져올 준비를 끝낸다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;사용 예시  &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;DataSet dsExcel = null;

using (var stream = File.Open(filepath, FileMode.Open, FileAccess.Read))
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExcelReaderConfiguration conf = new ExcelReaderConfiguration();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 한글 인코딩
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conf.FallbackEncoding = Encoding.GetEncoding(&quot;ks_c_5601-1987&quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var dtreader = ExcelReaderFactory.CreateCsvReader(stream, conf))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dsExcel = dtreader.AsDataSet();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

foreach (DataTable datatableExcel in dsExcel.Tables)
{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (DataRow DtRw in datatableExcel.Rows)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{

	for (int i=0; i&amp;lt; exDtRw.ItemArray.Length; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(exDtRw[i].ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;❗ ExcelDataReader 사용 시 일어날 수 있는 문제 &lt;b&gt;❗&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp; &amp;nbsp;한글인코딩&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에 엑셀 데이터를 가져왔을 때 한글 깨짐현상이 있었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때는 다음 인코딩을 추가해준다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ExcelReaderConfiguration conf = new ExcelReaderConfiguration();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;conf.FallbackEncoding = Encoding.GetEncoding(&quot;ks_c_5601-1987&quot;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;&amp;nbsp;엑셀 유형 문제&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나는 정해진 엑셀 형식이 csv였기 때문에 &lt;b&gt;ExcelReaderFactory.CreateCsvReader&lt;/b&gt;를 사용했다 .&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엑셀에서 xlsx, xls , csv 형식이 존재하기 때문에 형식에 맞는 함수를 사용해주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;형식이 모두 필요하다면 switch 구문이나 if문으로 구분해서 사용하면 될 듯하다 &lt;/span&gt;&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: 49.0698%; height: 140px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Method&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해당 형식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CreateBinaryReader&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;xls&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CreateOpenXmlReader&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;xlsx&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CreateCsvReader&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;csv&lt;/span&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>C#</category>
      <category>c#엑셀데이터가져오기</category>
      <category>ExcelDataReader</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/53</guid>
      <comments>https://w94dev.tistory.com/53#entry53comment</comments>
      <pubDate>Wed, 13 Jul 2022 15:05:55 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 :: 오픈채팅방 (Java) 알고리즘 풀이</title>
      <link>https://w94dev.tistory.com/48</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2lZBC/btrvS8mhBc8/YrEIsC76fT8HGXOECekhs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2lZBC/btrvS8mhBc8/YrEIsC76fT8HGXOECekhs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2lZBC/btrvS8mhBc8/YrEIsC76fT8HGXOECekhs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2lZBC%2FbtrvS8mhBc8%2FYrEIsC76fT8HGXOECekhs1%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;501&quot; height=&quot;501&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;b&gt;  || 정리&lt;/b&gt;&lt;br&gt;문제에서 '첫 단어는 Enter, Leave, Change 중 하나이다.'&lt;br&gt;첫 단어를 조건으로 구분하기로 했다.&lt;br&gt;아이디와 닉네임 , key 값과 value 이렇게 떠올라서 Map을 쓰기로 했다.&lt;br&gt;그리고 배열에 저장할 값들을 일단 ArrayList에 저장한 후 &lt;br&gt;ArrayList에 저장된 id 값을 닉네임으로 Replace하려고 했다.   &lt;b&gt;여기서부터 문제 발생&lt;/b&gt;&lt;br&gt; &lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;	public static void main(String[] args) {	
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	HashMap&amp;lt;String, String&amp;gt; resultMap = new HashMap&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;String&amp;gt; resultArr = new ArrayList&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] arrRecord ;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0; i&amp;lt;record.length; i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	if(record[i].split(&quot; &quot;)[0].toUpperCase().equals(&quot;ENTER&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultMap.put(record[i].split(&quot; &quot;)[1] , record[i].split(&quot; &quot;)[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultArr.add(record[i].split(&quot; &quot;)[1] +&quot;님이 들어왔습니다.&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else if (record[i].split(&quot; &quot;)[0].toUpperCase().equals(&quot;LEAVE&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultArr.add(record[i].split(&quot; &quot;)[1] +&quot;님이 나갔습니다.&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;leave msg : &quot; + record[i].split(&quot; &quot;)[1] +&quot;님이 나갔습니다.&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else if (record[i].split(&quot; &quot;)[0].toUpperCase().equals(&quot;CHANGE&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultMap.put(record[i].split(&quot; &quot;)[1] , record[i].split(&quot; &quot;)[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0; i&amp;lt;resultArr.size(); i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	for(String key : resultMap.keySet()){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		if(resultArr.get(i).contains(key)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;			System.out.println(&quot;bef msg : &quot; + resultArr.get(i));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;			resultArr.set(i, resultArr.get(i).replace(key, resultMap.get(key)));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;			System.out.println(&quot;af msg : &quot; + resultArr.get(i));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;			break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] answer = resultArr.toArray(new String[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 이런식으로 코드를 짰다.&lt;br&gt;테스트케이스는 일단 성공했지만 &lt;br&gt;성공률 32프로.. 출력이 틀렸다는 것도 있고 타임아웃도 발생했다.&lt;br&gt; &lt;br&gt;알고보니 두 가지를 간과한 것&lt;br&gt;1. ENTER가 되지 않고 LEAVE가 먼저 찍힌 사용자가 존재 한다..&lt;br&gt;2. LEAVE가 먼저 출력된 사용자의 아이디가 uid999라고 하고 , &lt;br&gt;다음사용자의 아이디가 uid99 , 닉네임이 MUZI 이면 uid999가 muzi9로 replace됨 &lt;br&gt; &lt;br&gt;key랑 value 값 잘 넣어뒀으면서&lt;br&gt; ,, key값으로 찾읍시다~&lt;br&gt; &lt;br&gt;&lt;b&gt;  || 풀이 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public String[] solution(String[] record) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HashMap&amp;lt;String, String&amp;gt; reㅃsultMap = new HashMap&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;String&amp;gt; resultArr = new ArrayList&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] arrRecord ;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0; i&amp;lt;record.length; i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrRecord = record[i].split(&quot; &quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	if(arrRecord.length &amp;gt; 2){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		resultMap.put(arrRecord[1], arrRecord[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0; i&amp;lt;record.length; i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	if(record[i].split(&quot; &quot;)[0].toUpperCase().equals(&quot;ENTER&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultArr.add(resultMap.get(record[i].split(&quot; &quot;)[1]) +&quot;님이 들어왔습니다.&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else if (record[i].split(&quot; &quot;)[0].toUpperCase().equals(&quot;LEAVE&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultArr.add(resultMap.get(record[i].split(&quot; &quot;)[1]) +&quot;님이 나갔습니다.&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] answer = resultArr.toArray(new String[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return answer;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; &lt;/p&gt;</description>
      <category>Algorithm</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/48</guid>
      <comments>https://w94dev.tistory.com/48#entry48comment</comments>
      <pubDate>Sat, 12 Mar 2022 09:15:51 +0900</pubDate>
    </item>
    <item>
      <title>C# :: 비밀번호 같은 문자 3번 체크 , 연속된 키보드 문자열 체크</title>
      <link>https://w94dev.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EaXDy/btrvPfZ4Htu/IgTHwXXT84ie23BLQYfm4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EaXDy/btrvPfZ4Htu/IgTHwXXT84ie23BLQYfm4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EaXDy/btrvPfZ4Htu/IgTHwXXT84ie23BLQYfm4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEaXDy%2FbtrvPfZ4Htu%2FIgTHwXXT84ie23BLQYfm4K%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;501&quot; height=&quot;501&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt;비밀번호에 숫자, 영어 , 특수문자가 들어가야 하는 것들은&lt;br&gt;정규식으로 구현이 가능했지만 &lt;br&gt;같은 문자가 3번 들어가는 것을 체크한다던가 &lt;br&gt;연속된 키보드 문자열 체크하기엔 한계가 있어서 따로 코드로 만들었다.&lt;br&gt; &lt;br&gt;&lt;b&gt;첫 번째 / 같은 문자가 3번 들어가는 것 체크  &lt;/b&gt;&lt;br&gt;여기서는 aaabb처럼 같은 문자가 연속으로 들어가는 것 뿐만 아니라&lt;br&gt;ababanav 처럼 a같은 문자가 3번 들어가는 것을 찾고 싶었다&lt;br&gt; &lt;br&gt; &lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot;&gt;&lt;code&gt; protected bool checkPassword(string strPass)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool retVal = false;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char[] tempArr = strPass.ToCharArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Array.Sort(tempArr);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int passCnt = 0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; tempArr.Length - 1; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (tempArr[i].Equals(tempArr[i + 1]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passCnt++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passCnt = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (passCnt &amp;gt; 1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retVal = true;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return retVal;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 strPass에서 내가 체크하고 싶은 문자열을&lt;br&gt;파라미터로 전달 후 char 배열로 만들어 정렬을 했다.&lt;br&gt; &lt;br&gt;그 다음 i번째 문자와 i+1번째 문자가 같으면 passCnt의 값을 +1 해주었다&lt;br&gt; &lt;br&gt;만약 passCnt가 2가 넘는다면 2개 이상으로 중복되는것 = 같은 문자가 3개이상이다!&lt;br&gt;false 리턴! &lt;br&gt; &lt;br&gt;&lt;b&gt;두 번째 / 연속된 키보드 문자열 체크  &lt;/b&gt;&lt;br&gt; &lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot;&gt;&lt;code&gt;protected bool CheckKeyPass(string strPass)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool retVal = false;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder sbChk = new StringBuilder();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] keyArray = new string[] {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;QWERTYUIOP{}|&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;|}{POIUYTREWQ&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;ASDFGHJKL:\&quot;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;\&quot;:LKJHGFDSA&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;ZXCVBNM&amp;lt;&amp;gt;?&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;?&amp;gt;&amp;lt;MNBVCXZ&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;qwertyuiop[]&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;][poiuytrewq&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;asdfghjkl;'&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;';lkjhgfdsa&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;zxcvbnm,./&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;/.,mnbvcxz&quot;,
	};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; strPass.Length - 2; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sbChk.Append(strPass[i].ToString() + strPass[i + 1].ToString() + strPass[i + 2].ToString());

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var j = 0; j &amp;lt; keyArray.Length; j++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!keyArray[j].IndexOf(sbChk.ToString()).Equals(-1))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret = true;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sbChk.Clear();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return retVal;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt;일단 키보드의 문자열이 들어있는 배열을 만들어준다.&lt;br&gt;파라미터로 넘어온 문자들 중 세 글자를 가져와서 keyArray에 있는&lt;br&gt;키보드 문자열과 IndexOf로 비교해준다. &lt;br&gt;StringBuilder를 쓴 이유는 알고리즘 풀 때마다&lt;br&gt;String 계속 선언해주면 효율성이 떨어지는게 기억나서 StringBuilder를 써봤다 &lt;br&gt; &lt;br&gt;이 방식이면 C# 말고도 Java에도 적용 가능 할 듯!&lt;br&gt;다들 괜히 저처럼 정규식 붙잡다 머리 터지지맙시다  &lt;br&gt; &lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;
 &lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot;&gt;
&lt;/figure&gt;</description>
      <category>C#</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/46</guid>
      <comments>https://w94dev.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 10 Mar 2022 15:28:11 +0900</pubDate>
    </item>
    <item>
      <title>javascript :: POST 방식으로 새 창 띄우기</title>
      <link>https://w94dev.tistory.com/45</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rj7ek/btrvJ90J3Gk/W0Qu6K2KIoPF9JPiJUFSv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rj7ek/btrvJ90J3Gk/W0Qu6K2KIoPF9JPiJUFSv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rj7ek/btrvJ90J3Gk/W0Qu6K2KIoPF9JPiJUFSv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRj7ek%2FbtrvJ90J3Gk%2FW0Qu6K2KIoPF9JPiJUFSv1%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;501&quot; height=&quot;501&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;기존에 GET방식으로 구현했던 페이지가 있었는데&lt;br /&gt;URL이 노출되면 사용자가 값을 임의로 넣어서 다른 데이터들이 노출 될 것 같아&lt;br /&gt;POST로 변경해달라는 요청이 있었다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;❔ window.open.. 그리고 POST..? 어떻게 구현하지? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  form 태그를 쓰면 됩니다!&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;form name =&quot;openForm&quot; &amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type=&quot;hidden&quot; id=&quot;param1&quot; name=&quot;param1&quot; value=&quot;&quot; /&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type=&quot;hidden&quot; id=&quot;param2&quot; name=&quot;param2&quot; value=&quot;&quot; /&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type=&quot;hidden&quot; id=&quot;param3&quot; name=&quot;param3&quot; value=&quot;&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;theJs.js&quot;&amp;gt;
	function open_Window_post(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	var url = &quot;https://w94dev.tistory.com&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var option = 'resizable=yes';
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.open(url, &quot;openForm&quot;, option);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var myForm = document.openForm;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myForm.action = url;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myForm.method = &quot;post&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myForm.target = &quot;openForm&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myForm.submit();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게 하면 form 태그안에 들어있는 값들을 &lt;br /&gt;post로 해당 url에 넘겨주게 된다.&lt;br /&gt;&lt;br /&gt;❔ 이렇게 변경했더니 URL이 두 번 호출 되는 오류 발생 &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  window.open(&quot;&quot;, &quot;openForm&quot;, option); 로 변경&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;url이 들어가던 부분에 빈값을 넣으면 url이 두 번 호출되는 일 없이&lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>curioser</author>
      <guid isPermaLink="true">https://w94dev.tistory.com/45</guid>
      <comments>https://w94dev.tistory.com/45#entry45comment</comments>
      <pubDate>Tue, 8 Mar 2022 22:54:53 +0900</pubDate>
    </item>
  </channel>
</rss>