<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mina_dev.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 02 Sep 2022 02:52:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mina_dev.log</title>
            <url>https://velog.velcdn.com/images/mina_dev/profile/a4fbb2a3-86b0-4bae-847e-8b268774d648/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mina_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mina_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[WPF] DataGrid 동적 컨트롤 추가 시 오작동 문제]]></title>
            <link>https://velog.io/@mina_dev/WPF-DataGrid-%EB%8F%99%EC%A0%81-%EC%BB%A8%ED%8A%B8%EB%A1%A4-%EC%B6%94%EA%B0%80-%EC%8B%9C-%EC%98%A4%EC%9E%91%EB%8F%99-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@mina_dev/WPF-DataGrid-%EB%8F%99%EC%A0%81-%EC%BB%A8%ED%8A%B8%EB%A1%A4-%EC%B6%94%EA%B0%80-%EC%8B%9C-%EC%98%A4%EC%9E%91%EB%8F%99-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Fri, 02 Sep 2022 02:52:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>WPF로 DataGrid 컴포넌트 이용 시 발생한 문제 해결 과정을 정리하였습니다.</p>
</blockquote>
<h2 id="🟤-datagrid를-이용하여-treeview-구현하기">🟤 DataGrid를 이용하여 TreeView 구현하기</h2>
<p>TreeView를 이용하여 동적으로 TreeViewItem을 생성하고 구현하였습니다. 하지만 조금 더 깔끔한 화면 구성을 위해 DataGrid로 변경하기로 결정하였습니다.</p>
<h3 id="🔍-datagrid로-treeview-구현한-오픈소스-검색">🔍 DataGrid로 TreeView 구현한 오픈소스 검색</h3>
<ul>
<li>많은 유료버전의 컨트롤을 제외하고 TreeView 구조를 유지하면서도 Name 컬럼을 제가 원하는 컴포넌트를 구성하여 동적으로 구성할 수 있는 소스코드를 찾았습니다.<blockquote>
<p>참조한 소스코드 : <a href="https://www.codeproject.com/Articles/1213466/WPF-TreeGrid-using-a-DataGrid">WPF TreeGrid using a DataGrid</a> 
<img src="https://velog.velcdn.com/images/mina_dev/post/bfbcb222-a7ab-4e1f-bcd8-7eacb4b78d53/image.png" alt="WPF TreeGrid using a DataGrid Image"></p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="🤨-스크롤할-때-발생하는-이-문제-오픈소스-버그인가">🤨 스크롤할 때 발생하는 이 문제! 오픈소스 버그인가?</h2>
<h4 id="1-컨트롤-값을-변경해도-binding한-변수의-set-함수-호출이-되지-않음">1. 컨트롤 값을 변경해도 binding한 변수의 set 함수 호출이 되지 않음</h4>
<ul>
<li>디버깅 메시지를 출력하게 하거나 디버깅 포인트를 지정한 후 실행하였을 때 아무 이벤트가 발생하지 않았습니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/709bfa66-3439-4998-8090-3d32cc2febd3/image.png" alt=""><h4 id="2-스크롤이-생기는-경우-스크롤을-위아래로-움직일-때-체크박스-랜덤으로-선택-및-해제되는-현상">2. 스크롤이 생기는 경우 스크롤을 위아래로 움직일 때 체크박스 랜덤으로 선택 및 해제되는 현상</h4>
</li>
<li>Template을 여러 종류로 구현하여 데이터 형태에 따라 표출해야해서 체크박스를 포함한 다양한 컨트롤을 사용할 때 문제가 발생 시 아주 곤란했습니다. </li>
<li>텍스트박스의 값을 변경해도 스크롤 발생 시 기존 값으로 다시 표출되는 현상이 발생했습니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/6b0d7b22-e5d8-4309-ae13-5250b14e3e70/image.png" alt=""><h4 id="3-스크롤을-계속-움직일-경우-프로그램-뻗는-현상-혹은-화면-사라짐-현상-발생">3. 스크롤을 계속 움직일 경우 프로그램 뻗는 현상 혹은 화면 사라짐 현상 발생</h4>
</li>
<li>1번과 2번 문제는 binding 포기하더라도 해결할 수 있는 방법이 있었지만 3번 스크롤 문제는 심각하게 다가와서 다시 고민에 빠졌습니다.</li>
</ul>
<hr>
<h2 id="🤦♀️-datagrid-스크롤-문제-해결방법-찾기">🤦‍♀️ DataGrid 스크롤 문제 해결방법 찾기</h2>
<p>동적 템플릿 구성에 대한 간단한 테스트 후 기존 소스코드에 다 적용한 상태였기 때문에 마지막 단계에서 방향을 돌려야 한다는 것은 아주 큰 리스크였습니다.</p>
<blockquote>
</blockquote>
<p>구글링 중 <strong><em>DataGrid 스크롤 문제</em></strong>를 언급하신 <a href="https://bravochoi.tistory.com/130">TISTORY</a> 블로그를 드디어 찾아내게 됩니다. 
무려 2010년에 쓰여진 실버라이트 글이었는데 저에게 큰 도움이 되었습니다.👍</p>
<pre><code>&lt;!-- MainWindow.xaml 파일 --&gt;
&lt;ScrollViewer VerticalScrollBarVisibility=&quot;Auto&quot;&gt;
   &lt;DataGrid  AutoGenerateColumns=&quot;False&quot; Name=&quot;grid&quot; CanUserAddRows=&quot;False&quot;
              VerticalScrollBarVisibility=&quot;Hidden&quot;&gt;
   ...
   &lt;/DataGrid&gt;
&lt;/ScrollViewer&gt;</code></pre><ul>
<li>여기서 중요한 부분은 DataGrid에서 자동으로 생성되는 Scroll을 사용하지 않고 ScrollViewer를 감싸서 DataGrid를 사용해야 한다는 부분이었습니다. <strong><em>ScrollViewer</em></strong>의 <strong><em>VerticalScrollBarVisibility=&quot;Auto&quot;</em></strong>, <strong><em>DataGrid</em></strong>의 <strong><em>VerticalScrollBarVisibility=&quot;Hidden&quot;</em></strong> 속성이 핵심입니다.</li>
</ul>
<h3 id="◽-datagrid-속성-값-적용-후-테스트">◽ DataGrid 속성 값 적용 후 테스트</h3>
<ul>
<li><p>아래 위로 스크롤을 움직였을 때 체크박스 해제가 되지 않습니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/319be431-007d-47c3-b9ae-320663eccbf9/image.png" alt=""></p>
</li>
<li><p>체크박스를 선택 시 연결된 Binding 변수의 set 함수가 호출됩니다. 
<img src="https://velog.velcdn.com/images/mina_dev/post/59acec58-d52e-49cd-9cc3-7364352e28e8/image.png" alt="">
하지만 완벽하게 처리되지 않고 여전히 이벤트가 호출되지 않는 현상이 발생했습니다.😢</p>
</li>
</ul>
<hr>
<h3 id="◽-datagrid-속성-값-적용-후-보안점">◽ DataGrid 속성 값 적용 후 보안점</h3>
<h4 id="1-마우스-스크롤-시-scrollviewer-추가-후-생긴-스크롤-위에서만-마우스-휠로-동작함-✔해결">1. 마우스 스크롤 시 ScrollViewer 추가 후 생긴 스크롤 위에서만 마우스 휠로 동작함 (✔해결)</h4>
<p>기존에는 DataGrid에서 생긴 스크롤을 사용하여 마우스 휠을 어느 영역에서 하든 위아래 이동이 가능했다면 ScrollViewer를 사용하면 DataGrid 영역 내에서 스크롤 이동이 마우스 휠로 동작하지 않게 됩니다.</p>
<ul>
<li>DataGrid에 전달된 마우스 휠 이벤트가 ScrollViewer로 전달될 수 있도록 <strong>PreviewMouseWhee</strong>l 이벤트를 추가한 후 코드 구현을 합니다. 이렇게 하면 DataGrid 영역 내에서 마우스 휠로 스크롤이 움직이게 됩니다.<pre><code>&lt;!-- MainWindow.xaml 파일 --&gt;
&lt;ScrollViewer VerticalScrollBarVisibility=&quot;Auto&quot; Name=&quot;scrollViewer&quot;&gt;
 &lt;DataGrid  AutoGenerateColumns=&quot;False&quot; Name=&quot;grid&quot; CanUserAddRows=&quot;False&quot;
            VerticalScrollBarVisibility=&quot;Hidden&quot;
            PreviewMouseWheel=&quot;DataGrid_PreviewMouseWheel&quot;&gt;
 ...
 &lt;/DataGrid&gt;
&lt;/ScrollViewer&gt;</code></pre><pre><code>// MainWindow.xaml.cs
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e){ 
  scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta / 3);
}</code></pre><h4 id="2-datagrid의-동적-컨트롤-binding-이벤트-발생하지-않음-✔해결">2. DataGrid의 동적 컨트롤 Binding 이벤트 발생하지 않음 (✔해결)</h4>
간소화한 소스코드로 테스트 해 본 컨트롤은 TextBox와 CheckBox입니다. 해결방법은 Binding할 때 <strong>UpdateSourceTrigger</strong>를 추가해 주면 됩니다.</li>
<li>CheckBox의 경우 UpdateSourceTrigger 이벤트로 값이 변경될 때마다 감지될 수 있게 PropertyChanged로 설정하였습니다.</li>
<li>TextBox의 경우 한글자 입력할 때마다 이벤트가 발생하므로 포커스가 다른 곳으로 이동할 때까지 입력을 받은 후 이벤트를 받고자 LostFocus로 설정하였습니다.<pre><code>&lt;DataGrid.Columns&gt;
 &lt;DataGridTemplateColumn Header=&quot;Name&quot;&gt;
       &lt;DataGridTemplateColumn.CellTemplate&gt;         
       &lt;DataTemplate&gt;
          ...
          &lt;TextBox Text=&quot;{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}&quot;/&gt;
          &lt;CheckBox IsChecked=&quot;{Binding IsNameChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}&quot;/&gt;
          ...
      &lt;/DataTemplate&gt;
  &lt;/DataGridTemplateColumn.CellTemplate&gt;
&lt;/DataGrid.Columns&gt;</code></pre></li>
</ul>
<h4 id="3-datagrid의-header가-스크롤을-내리는-경우-고정되지-않음-미해결">3. DataGrid의 Header가 스크롤을 내리는 경우 고정되지 않음 (미해결)</h4>
<p>DataGrid를 ScrollViewer로 감싸줬으니 어쩔 수 없는 부분으로 보이긴 하지만 구현하는 입장에서는 아쉬운 부분입니다.</p>
<ul>
<li>스크롤 내리기 전 Header가 보이는 모습
<img src="https://velog.velcdn.com/images/mina_dev/post/71b6ce7c-e620-48c5-929b-fd8b376548e8/image.png" alt="스크롤 내리기 전"></li>
<li>스크롤 내린 후 Header가 보이지 않는 모습
<img src="https://velog.velcdn.com/images/mina_dev/post/44e51b42-65c9-4af3-9d3f-2a51dba89d7c/image.png" alt="스크롤 내린 후"></li>
</ul>
<hr>
<p>[참조사이트]</p>
<ul>
<li><a href="https://www.codeproject.com/Articles/1213466/WPF-TreeGrid-using-a-DataGrid">WPF TreeGrid using a DataGrid</a></li>
<li><a href="https://bravochoi.tistory.com/130">TISTORY</a></li>
<li><a href="https://social.msdn.microsoft.com/Forums/vstudio/en-US/3334b015-95e7-49c5-aabb-b7c5e3c552a6/mouse-scroll-not-working-in-a-scroll-viewer-with-a-wpf-datagrid-and-additional-ui-elements?forum=wpf">Mouse scroll not working in a scroll viewer with a wpf datagrid and additional UI elements</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OSS Nokalva ASN.1 Studio 사용을 위한 설정 팁]]></title>
            <link>https://velog.io/@mina_dev/OSS-ASN.1-Studio-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%A4%EC%A0%95-%ED%8C%81</link>
            <guid>https://velog.io/@mina_dev/OSS-ASN.1-Studio-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%A4%EC%A0%95-%ED%8C%81</guid>
            <pubDate>Tue, 21 Jun 2022 03:59:30 GMT</pubDate>
            <description><![CDATA[<h2 id="⚙-asn1-compiler">⚙ ASN.1 compiler</h2>
<h3 id="📌-pdus">📌 PDUs</h3>
<ul>
<li>run time 실행을 위해 <strong>Support autmatic encoding and decoding of optn types at run time</strong>을 선택합니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/a7951191-5d9f-4f5b-b730-d0f131e062ea/image.png" alt=""></li>
</ul>
<hr>
<h3 id="📌-encoding-rules">📌 Encoding rules</h3>
<ul>
<li>원하는 인코딩 방식을 선택합니다. (인코딩 방식은 라이브러리 구입 시 활성화됩니다.)
<img src="https://velog.velcdn.com/images/mina_dev/post/c76e5a2e-17f2-4441-a52b-a7e8d30bc6c6/image.png" alt=""></li>
</ul>
<hr>
<h3 id="📌-generated-files">📌 Generated files</h3>
<h4 id="◽-header-files">◽ Header files</h4>
<ul>
<li>Prefix를 붙여서 생성된 파일 내부의 구조체 및 선언 부분에 적용합니다.</li>
<li>C/C++ 지원 헤더 파일을 생성합니다.</li>
<li>주석 스타일을 C/C++ 스타일로 적용합니다.</li>
<li>C/C++에서 쓰는 키워드와 겹치는 이름이 있는 경우 오류가 나지 않도록 <strong>Reserved words</strong>로 추가해 줍니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/b8cb152b-02e2-4e78-940f-b02df2dbf7a4/image.png" alt=""></li>
</ul>
<hr>
<h3 id="📌-encoderdecoder">📌 Encoder/decoder</h3>
<ul>
<li><strong>Automatically encode/decode open types</strong>를 선택합니다.</li>
<li><strong>Treat undefined component relations as valid for extensible info object sets</strong>를 선택합니다.
<img src="https://velog.velcdn.com/images/mina_dev/post/f9f2b203-6d3f-4b8b-ae36-cbd21b4fe2bf/image.png" alt=""></li>
</ul>
<hr>
<p>※ OSS 라이브러리로 사용하는 언어는 C 언어이며, 더 좋은 기능이 있을 수도 있으나 제가 자주 쓰는 기능으로 정리된 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[﻿[Java] Eclipse에서 Maven Project로 구현하기]]></title>
            <link>https://velog.io/@mina_dev/Java-Eclipse%EC%97%90%EC%84%9C-Maven-Project%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@mina_dev/Java-Eclipse%EC%97%90%EC%84%9C-Maven-Project%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 14 Apr 2022 12:46:37 GMT</pubDate>
            <description><![CDATA[<h2 id="🙋-maven-project-구현하게-된-계기">🙋‍ Maven Project 구현하게 된 계기</h2>
<hr>
<p>업무적으로 <strong>Azure Eventhub</strong>를 연동할 일이 생겼습니다. 공식 사이트에서 API 제공하는 언어를 살펴보니 대표적으로 <strong>Python</strong>, <strong>Java</strong>, <strong>C</strong>(넣기만 가능)가 있습니다. </p>
<h3 id="c-언어-사용하지-못한-이유">C 언어 사용하지 못한 이유</h3>
<ol>
<li><p>원래 익숙한 언어는 <strong>C</strong> 언어였지만 넣기만 가능했고, 그나마도 테스트를 했더니 길이가 긴 텍스트(대용량 텍스트)의 경우 제대로 넣지 못하는 문제를 발견했습니다.</p>
</li>
<li><p>랜덤으로 생성되는 연결문자열에 &#39;<strong>/(슬래시)</strong>&#39;가 있는 경우 내부적으로 문자열 끝으로 인식하는 것인지 접속할 수 없는 현상이 있었습니다. 그래서 &#39;<strong>/(슬래시)</strong>&#39;가 없을 때까지 연결문자열을 재생성하여 사용하였습니다.</p>
</li>
</ol>
<h3 id="java를-개발언어로-선택">Java를 개발언어로 선택</h3>
<p>프로그램 특성 상 네트워크 통신도 필요했고 멀티쓰레드 환경에서 안정적인 성능이 나올 언어로 <strong>Java</strong>를 선택하였습니다. 너무 오랜만이라 사용하는 클래스도 많이 달라져서 낯설었지만 적응할 시간도 없이 개발을 시작하였습니다. 리눅스 환경에서 <strong>Java</strong> 구현은 처음이었지만 <strong>Eclipse</strong>는 친근해서 그나마 다행이었습니다. </p>
<blockquote>
<p>아파치 메이븐(Apache Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다. - 위키백과 -</p>
</blockquote>
<p>이전에 개발한 내용이지만 정리를 위해 <strong>Windows</strong>에서 다시 실행해보았습니다.</p>
<h2 id="⚙-사전-준비사항">⚙ 사전 준비사항</h2>
<hr>
<p><strong>1. JDK(JRE) 설치
2. Maven 설치</strong></p>
<h2 id="⌨-maven-project-구현">⌨ Maven Project 구현</h2>
<hr>
<h3 id="1-maven-project-생성하기">1. Maven Project 생성하기</h3>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/28b09077-9cd7-467b-96da-a1f09f2b0884/image.png" alt="New Maven Project - Select project name"></p>
<ul>
<li><strong>New</strong> -&gt; <strong>Maven Project</strong> 실행 후 <strong>Create a simple project</strong> 앞에 체크박스를 선택한 후 <strong>Next</strong>를 눌러줍니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/dcdf6eb7-e3f4-4a3f-90c0-88aac03b5a31/image.png" alt="New Maven Project - Configure project"></p>
<ul>
<li><p><strong>group id</strong>는 프로젝트를 구현하는 팀의 아이디로 저는 간단히 <strong>rnd.dev</strong>라고 입력하였습니다.</p>
</li>
<li><p><strong>artifact id</strong>는 프로젝트 식별 아이디로 프로젝트 이름이라고 생각하시면 됩니다. 이 이름은 프로젝트 최상위 폴더 이름으로 사용됩니다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/04fe1cbf-13c8-4be8-9ac0-640c4f0cd1c7/image.png" alt="New Maven Project - Project Explorer"></p>
<ul>
<li><strong>Finish</strong>를 누른 후 <strong>Project Explorer</strong>를 확인하면 그림과 같은 구조를 확인할 수 있습니다.</li>
</ul>
<h4 id="📄-pomxml-중요파일">📄 pom.xml 중요파일</h4>
<p><strong>POM(Project Object Model)</strong> 파일 내부에 앞으로 Maven Project에서 사용할 라이브러리를 코드로 추가하면 자동으로 프로젝트에 라이브러리 파일을 로드해서 연결해 줍니다. 추가 삭제 또한 모두 이 파일을 수정해서 업데이트만 하면 되므로 관리하기 편합니다.</p>
<h3 id="2-pomxml-라이브러리-추가하기">2. pom.xml 라이브러리 추가하기</h3>
<pre><code>&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;rnd.dev&lt;/groupId&gt;
  &lt;artifactId&gt;eventhub&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
&lt;/project&gt;</code></pre><ul>
<li>기본 <strong>pom.xml</strong> 파일은 처음 프로젝트 생성 시 입력한 값들로 채워져 있습니다. 마지막 줄 <strong>&lt;/project&gt;</strong> 닫는 태그 앞에 <strong>&lt;dependencies&gt; ... &lt;/dependencies&gt;</strong>를 추가하여 라이브러리를 로드합니다.</li>
</ul>
<p><a href="https://mvnrepository.com/">Maven Repository</a>에 가서 <strong>azure-messaging-eventhubs</strong>를 검색했습니다. 원하는 라이브러리가 있다면 모두 검색 가능합니다.</p>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/34e2abd8-3d43-41db-9362-b7c6cf200888/image.png" alt="Maven Repository"></p>
<ul>
<li>이렇게 <strong>Mavan</strong> 코드가 있으므로 복사해서 붙여넣기만 해주면 됩니다.</li>
</ul>
<pre><code>&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;rnd.dev&lt;/groupId&gt;
  &lt;artifactId&gt;eventhub&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.azure&lt;/groupId&gt;
      &lt;artifactId&gt;azure-messaging-eventhubs&lt;/artifactId&gt;
      &lt;version&gt;5.11.2&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</code></pre><p><img src="https://velog.velcdn.com/images/mina_dev/post/fc72fcba-f065-41dc-bcdf-57f0296161f3/image.png" alt="pom.xml - dependency"></p>
<ul>
<li>코드를 입력한 후 저장하면 제일 하단 오른쪽에 상태표시가 나타납니다. <strong>Building</strong>부터 <strong>Downloading</strong>까지 진행됩니다. 그리고 <strong>Project Explorer</strong>에는 <strong>Maven Denpendencies</strong>라는 폴더가 새로 추가되었습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/72b039b6-4f21-4797-b4bc-098308d0245c/image.png" alt="Maven Dependencies"></p>
<ul>
<li>접혀있던 <strong>Maven Dependencies</strong>를 열면 따로 추가하지 않은 관련 파일까지 모두 추가된 것을 확인할 수 있습니다.</li>
</ul>
<p>그럼 간략히 <strong>Main</strong> 함수를 정의하여 프로젝트가 실행되는 지 확인해보겠습니다.</p>
<h3 id="3-eclipse-환경설정하기">3. Eclipse 환경설정하기</h3>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/82a88511-6c24-40b4-887e-33453f4fc805/image.png" alt="Eclipse - UTF8"></p>
<ul>
<li><strong>project</strong> 우클릭 <strong>properties</strong>를 실행하여 인코딩 설정을 <strong>MS949</strong>에서 <strong>UTF-8</strong>로 변경하였습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/3b4d7bc0-73ee-45b2-87d0-c772d036b5f7/image.png" alt="Java Build Path"></p>
<ul>
<li><strong>properties</strong>안에 <strong>Java Build Path</strong>를 선택합니다. 기본으로 잡힌 <strong>Java</strong> 버전이 낮아서 <strong>Libraries</strong> 탭에 <strong>JRE System Library</strong>를 클릭 후 <strong>Edit</strong> 버튼을 눌러줍니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/4ab18f7c-d9a9-42c9-a578-d4aaddb2aafb/image.png" alt="JRE System Library"></p>
<ul>
<li><strong>Execution environment</strong>에서 기본 목록으로 표시되는 Java 버전을 선택하셔도 되고 저처럼 <strong>Alternate JRE</strong>라고 해서 <strong>installed JREs</strong>를 누른 후 내 PC에 설치된 jdk나 jre를 참조하셔도 됩니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/aa17707d-7102-43e0-846d-5a99b47b911b/image.png" alt="Preferences - Installed JREs"></p>
<ul>
<li><strong>Search</strong>를 누른 후 <strong>Java</strong> 설치 폴더를 지정했더니 기본 jre가 있어서 제가 설치한 것은 jre(1)로 잡혔습니다. 더블 클릭해서 <strong>JRE Name</strong>을 수정할 수 있습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/a0e1ecd2-78ac-45c1-9172-1a70ed126982/image.png" alt="Maven Installations"></p>
<ul>
<li>메뉴의 <strong>Window</strong> -&gt; <strong>Preferences</strong> 실행합니다. <strong>Maven</strong> - <strong>Installations</strong>에서 기본으로 선택한 <strong>EMBEDED</strong> 체크박스 해제 후 <strong>Add</strong>를 눌러 설치 디렉토리를 선택합니다. <strong>Apply and Close</strong>를 선택하여 종료합니다.</li>
</ul>
<h3 id="4-main-함수-클래스-생성하기">4. Main 함수 클래스 생성하기</h3>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/930d5240-4dba-4060-9ba8-2cddd5b1a4fa/image.png" alt="New - Class"></p>
<ul>
<li><strong>project</strong> 아래 <strong>src/main/java</strong> 우클릭 <strong>New</strong> -&gt; <strong>Class</strong>를 선택합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/f0f102bf-10ed-41a0-a9ee-e03496e3e689/image.png" alt="New Java Class"></p>
<ul>
<li>저는 <strong>Main</strong>함수를 만들기 위해서 체크박스를 선택하였고 위에 <strong>Package</strong>와 <strong>Name</strong>을 원하시는대로 적어주시면 됩니다.</li>
</ul>
<pre><code>package eventhub;

public class EventhubSender {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(&quot;Hi&quot;);
    }

}</code></pre><p><img src="https://velog.velcdn.com/images/mina_dev/post/00a0cdd7-54a2-4383-a887-923a6ad5edf0/image.png" alt="JAVA Run As"></p>
<ul>
<li>기존에 Java 컴파일하듯이 EventhubSender.java 파일 우클릭 후 <strong>Debug As</strong> -&gt; <strong>Java Application</strong> 혹은 <strong>Run As</strong> -&gt; <strong>Java Application</strong> 실행하여 실행 결과를 볼 수 있습니다.</li>
</ul>
<p>이렇게 하면 <strong>Maven</strong>으로 왜 구현했을까 의문이 들 것입니다. <strong>Maven</strong>으로 실행하기 위해 <strong>pom.xml</strong> 파일에 추가 작업이 필요합니다.</p>
<h3 id="5-pomxml-빌드환경-추가하기">5. pom.xml 빌드환경 추가하기</h3>
<pre><code>&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;rnd.dev&lt;/groupId&gt;
  &lt;artifactId&gt;eventhub&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;

  &lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;
  &lt;/properties&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.azure&lt;/groupId&gt;
      &lt;artifactId&gt;azure-messaging-eventhubs&lt;/artifactId&gt;
      &lt;version&gt;5.11.2&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
  &lt;build&gt;
    &lt;pluginManagement&gt;&lt;!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --&gt;
      &lt;plugins&gt;
        &lt;!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.1.0&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.8.0&lt;/version&gt;
          &lt;configuration&gt;
            &lt;source&gt;1.8&lt;/source&gt;
            &lt;target&gt;1.8&lt;/target&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.22.1&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.2&lt;/version&gt;
          &lt;configuration&gt;
            &lt;archive&gt;
              &lt;manifest&gt;
                &lt;addClasspath&gt;true&lt;/addClasspath&gt;
                &lt;classpathPrefix&gt;lib/&lt;/classpathPrefix&gt;
                &lt;mainClass&gt;eventhub.EventhubSender&lt;/mainClass&gt;
              &lt;/manifest&gt;
            &lt;/archive&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-install-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.5.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-deploy-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.8.2&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-site-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.7.1&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-project-info-reports-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.0.0&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
          &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
          &lt;version&gt;3.3.0&lt;/version&gt;
          &lt;configuration&gt;
              &lt;archive&gt;
              &lt;manifest&gt;
                &lt;mainClass&gt;eventhub.EventhubSender&lt;/mainClass&gt;
              &lt;/manifest&gt;
            &lt;/archive&gt;
            &lt;descriptorRefs&gt;
              &lt;descriptorRef&gt;jar-with-dependencies&lt;/descriptorRef&gt;
            &lt;/descriptorRefs&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/pluginManagement&gt;
    &lt;resources&gt;
      &lt;resource&gt;
        &lt;directory&gt;src/main/resources&lt;/directory&gt;
      &lt;/resource&gt;
    &lt;/resources&gt;
  &lt;/build&gt;
&lt;/project&gt;</code></pre><ul>
<li><p><strong>&lt;properties&gt;</strong> 태그가 추가되었습니다. 그리고 <strong>&lt;build&gt;</strong> 라는 엄청 긴 태그가 추가되었습니다. 여기에 들어가 있는 <strong>plugin</strong> 기능들을 이제 <strong>Eclipse</strong>에서 확인할 수 있습니다.</p>
</li>
<li><p><strong>1.8</strong>이라고 되어 있는 부분은 <strong>JRE Library</strong> 설정에서 제가 선택한 자바 버전입니다. (사용하는 버전에 따라 수정하셔야 합니다.)</p>
</li>
<li><p><strong>&lt;mainClass&gt;</strong> 태그는 <strong>Maven</strong>에게 <strong>Main</strong> 함수가 있는 클래스를 알려주는 부분이라 패키지명부터 입력하시면 됩니다. (eventhub.EventhubSender 부분 수정 필요합니다.)</p>
</li>
</ul>
<h3 id="6-maven-구성-설정하기">6. Maven 구성 설정하기</h3>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/070e468a-1777-47b5-bed8-a6bbbd48fbb2/image.png" alt="Maven Configuration"></p>
<ul>
<li><strong>File</strong> -&gt; <strong>Restart</strong>로 이클립스를 재시작한 후 <strong>project</strong> 우클릭 -&gt; <strong>Run As</strong> 눌렀을 때 새로운 메뉴가 추가된 것을 확인할 수 있습니다. 여기서 <strong>Run Configuration</strong>을 선택합니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/8724b481-1430-48cf-91b5-879f6757e58c/image.png" alt="Maven Configuration Details"></p>
<ul>
<li><strong>Maven Build</strong> 우클릭 -&gt; <strong>New Configuration</strong> 누른 후 <strong>Goals</strong>에 아래와 같이 추가합니다. </li>
</ul>
<pre><code>clean compile assembly:single</code></pre><ul>
<li>입력 후 <strong>Apply</strong>한 후 <strong>Run</strong>을 실행합니다. <strong>Run Configuration</strong>에서 추가하였지만 <strong>Debug Configuration</strong>으로 접근해도 동일한 <strong>Configuration</strong>을 <strong>Debug</strong>로 실행할 수 있습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/2435e016-e963-409f-b9b0-ef5fed7599dd/image.png" alt="Maven Logs"></p>
<ul>
<li><strong>Eclipse</strong> 하단에 로그가 찍히면서 <strong>Java</strong>를 실행할 때와는 다른 화면이 출력됩니다. 빌드한 결과물은 jar 파일로 생성되었습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/ece462bd-0115-463e-a373-a49c65d381f3/image.png" alt="jar File"></p>
<ul>
<li><strong>workspace</strong> 내 프로젝트 폴더 안에 <strong>target</strong> 폴더에 있는 것을 확인할 수 있습니다.</li>
</ul>
<blockquote>
<h3 id="🙅♀️-주의할-점">🙅‍♀️ 주의할 점</h3>
<p>빌드 진행 중일 때 <strong>target</strong> 폴더를 접근하지 않도록 해야 합니다.</p>
</blockquote>
<p>cmd를 열어서 바로 실행해야지 하며 해당 경로로 path 지정하여 대기하고 있거나 <strong>target</strong> 폴더를 파일 탐색기에서 열어 놓은 경우 <strong>Maven</strong> 빌드를 할 때마다 <strong>target</strong> 폴더를 재생성하는데 열린 폴더는 삭제를 할 수 없어 자꾸 <strong>ERROR</strong>가 발생합니다.</p>
<pre><code>Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean</code></pre><h3 id="7-배포된-jar-파일-실행하기">7. 배포된 jar 파일 실행하기</h3>
<pre><code>java -jar -Dfile.encoding=UTF-8 ./eventhub-0.0.1-SNAPSHOT-jar-with-dependencies.jar</code></pre><p><img src="https://velog.velcdn.com/images/mina_dev/post/db64f2ef-eb82-45eb-9333-f741c9eced91/image.png" alt="java Maven Result"></p>
<ul>
<li>java 명령으로 실행하니 Hi 결과를 cmd에서도 확인할 수 있었습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mina_dev/post/34c98bd9-3ac4-4b15-b782-aa689035bf7f/image.png" alt="Maven Update Project"></p>
<ul>
<li>라이브러리나 <strong>plugin</strong> 버전이 바뀌었을 때도 파일 교체를 따로 할 필요 없이 <strong>pom.xml</strong> 파일만 수정한 후 <strong>project</strong> 우클릭 -&gt; <strong>Maven</strong> -&gt; <strong>Update Project OK</strong>를 실행합니다.<blockquote>
<p>이 과정은 <strong>Eclipse</strong>와 <strong>pom.xml</strong> 설정 간에 동기화를 위한 것이므로 <strong>Maven</strong>을 잘 활용하기 위해서는 염두해두어야 하는 과정입니다.</p>
</blockquote>
</li>
</ul>
<p>이제 환경설정을 해놓았으니 <strong>Java</strong>로 계속 구현하고 배포까지 가능합니다. </p>
]]></description>
        </item>
    </channel>
</rss>