<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>대빵's Blog</title>
    <link>https://bigzero37.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 6 Aug 2026 11:10:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bigzero</managingEditor>
    <image>
      <title>대빵's Blog</title>
      <url>https://tistory1.daumcdn.net/tistory/1691022/attach/5f574b203e924243954342dd0a9f5f11</url>
      <link>https://bigzero37.tistory.com</link>
    </image>
    <item>
      <title>맥에서 갤럭시 USB 테더링 사용법(패러럴즈 활용)</title>
      <link>https://bigzero37.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;컴터는 맥(M1 MacPro Tahoe)을 쓰고, 폰은 갤럭시를 사용하기 때문에 외부에서 USB 유선 테더링이 동작하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wifi HotSpot 를 사용해도 되지만, 속도제한도 있고 보안정책상 HotSpot 이 안되는 경우도 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷에 맥에서 HoRNDIS 를 활용한 방법도 해봤지만, 잘되다가도 맥OS 가 업데이트 되면 막히는 경우가 다반사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주식 HTS 사용 때문에 Parallels 를 구입했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 든 생각 &quot;Windows 는 안드로이드 테더링이 가능하니 패러럴즈에 USB 테더링을 연결하면 되지 않을까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 해봤는데 성공함 (대박! ^^;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 외부에서 속도제한없이 갤럭시 USB 테더링을 쓸 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단, USB 테어링이 되더라도, 맥에서는 여전히 안된다. 패러럴즈 윈도우에서만 가능, &lt;b&gt;필요한 프로그램을 패러럴즈에 미리 설치&lt;/b&gt;해 두자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;성공한 방법&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;C to C 케이블이 데이터통신 가능한 것 사용 &amp;rarr; 충전만 되는 것도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;갤럭시 개발자옵션에서 USB 테더링 활성화 &amp;rarr; 다른 윈도우PC 에서 USB 테더링이 되는지 사전확인 해야 삽질을 줄일 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;패러럴즈 Samsung Android USB 드라이버 최신이 설치&lt;/b&gt;되어 있어야 함 &amp;rarr; USB 연결하여 윈도우 업데이트에서 미리 업데이트 할것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;패러럴즈 USB 연결설정 &amp;rarr; 기본 패러럴즈로 셋팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 중요&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 패러럴즈 윈도우의 네트워크 설정에서 이더넷이 추가된게 나와야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 패러럴즈 장치(상단메뉴) &amp;rarr; 네트워크 &amp;rarr; 네트워크브리지 &amp;rarr; 기본설정 (WIfi 아님)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; USB 테더링으로 네트워크 사용이 가능해짐.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단, &lt;b&gt;테더링을 해제하면 맥 인터넷이 다시 연결되어도, 패러럴즈 네트워크 안됨&lt;/b&gt;&amp;nbsp;&amp;rarr; 권장값인 Mac 공유네트워크로 변경&lt;/span&gt;&lt;/p&gt;</description>
      <category>신변잡기</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/86</guid>
      <comments>https://bigzero37.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 3 Jun 2026 22:25:13 +0900</pubDate>
    </item>
    <item>
      <title>쉐어풀 유투브 계정공유 사용 후기(2025년)</title>
      <link>https://bigzero37.tistory.com/85</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;2025년 1월 선불 6만원정도 내고 12개월 계정공유를 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1월 : 잘된다. 돈 아낀듯 해서 기분이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2월 : 잘돌아 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3월 : 문제없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월 중순 : 문제는 여기서 부터이다. 4월 중순 갑자기 프리미엄이 끊어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* AS 센터 전화 &amp;rarr; 수십번 했지만 계속 통화중, 심지어 오후 5시 넘으면 아얘 신호자체가 가질 않고, 토/일요일/공휴일 마찬가지 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;먹통&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 카카오 오픈채팅 &amp;rarr; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;채팅방 폐쇄&lt;/b&gt;&lt;/span&gt;함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 이메일 &amp;rarr; 메일전송은 되는데, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;답이 없다&lt;/span&gt;&lt;/b&gt;. 한 10통 보낸듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월 20일 경 : 그냥 포기하고, 원래 구글계정에 제 돈 주고 프리미엄 신청함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월 28일 경 : 갑자기 복구 되었다고 메일옴. 화가 머리 끝까지 차오른다....XXXXXXXX , 장난하냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채무자가 돈을 안 갚으면 사기죄로 형사처벌 되기 때문에, 돈을 몇달에 한번 조금씩 갚으면서 계속 악의적으로 미루는 사람 있다던데 이게 완전 그 꼴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 한달에 2만원 내고 사용한 꼴이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;결론&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 인생에서 매우 중요한 사실을 많이 깨달은 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;담보 없는 선불거래&lt;/b&gt;&lt;/span&gt;는 절대 하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 선불 지불 해야 되는 헬스장 등은 반드시 카드할부 12개월로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;수수료 좀 내고 안전&lt;/b&gt;&lt;/span&gt;하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인생에 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;공짜는 없다&lt;/b&gt;&lt;/span&gt;.&lt;/p&gt;</description>
      <category>신변잡기</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/85</guid>
      <comments>https://bigzero37.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 17 Jun 2025 21:30:10 +0900</pubDate>
    </item>
    <item>
      <title>SpringBoot 3.3.2 에서 정적컨텐츠 활성화 하기</title>
      <link>https://bigzero37.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java : JDK17&lt;/li&gt;
&lt;li&gt;SpringBoot : 3.3.2&lt;/li&gt;
&lt;li&gt;IDE : Intellij&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제상황&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;resources/static 경로에 있는 css, image 파일들이 thymeleaf 에서 적용되지 않음&lt;/li&gt;
&lt;li&gt;css 소스파일 경로 : resources/static/css/xxx.css&lt;/li&gt;
&lt;li&gt;image 소스파일 경로 : resources/static/images/xxx.jpg&lt;/li&gt;
&lt;li&gt;크롬에서 404 발생하고 ERR_ABORT 로 에러로그가 보여짐(Not-Found 가 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인분석&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;org.springframework.boot.autoconfigure.web.WebProperties 가 해당기능에 관여하는 소스코드임을 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Code&lt;/b&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;@ConfigurationProperties(&quot;spring.web&quot;) 
public class WebProperties { 
  private Locale locale; 
  private LocaleResolver localeResolver;
  private final Resources resources;     
  .. 중략    
  public static class Resources { 
  private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{&quot;classpath:/META-INF/resources/&quot;, &quot;classpath:/resources/&quot;, &quot;classpath:/static/&quot;, &quot;classpath:/public/&quot;};     
  ... 중략    
  } 
  ...중략
}    &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제해결&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ConfiguraitonProperties 가 spring.web 으로 시작하는 것을 확인&lt;/li&gt;
&lt;li&gt;인터넷 상에서는 spring.mvc.static-path-pattern 에 classpath:/static/ 을 넣으라 되어 있지만 내 경우는 넣어도 작동되지 않았음&lt;/li&gt;
&lt;li&gt;아래처럼 변경하여 적용함 -&amp;gt; 정상작동 확인&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web: resources: static-locations: classpath:/static/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 WebProperties 코드에 보면 &quot;classpath:/static/&quot; 이 default 로 들어 있기 때문에 어디선가 자동으로 적용하는 방법이 있을 것으로 생각함&lt;/li&gt;
&lt;li&gt;@AutoConfiguration 을 활성화 하면 application.yml 에 별도로 static 경로를 지정하지 않아도 default static 경로가 적용되는 것을 확인함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@AutoConfiguration 을 적용하거나, application.yml 에 별도로 spring.web.resources.static-locations 를 지정해야 정적컨텐츠에 접근이 가능했음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Annotation 이나 appcliation.yml 에 메타정보 인식 방식으로 하지 않고 아래처럼 JavaConfig 로 구현해도 됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Code&lt;/b&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;package com.demo.uam.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
      registry.addResourceHandler(&quot;/**&quot;).addResourceLocations(&quot;classpath:/static/&quot;);
      super.addResourceHandlers(registry);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/84</guid>
      <comments>https://bigzero37.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 28 Aug 2024 10:26:20 +0900</pubDate>
    </item>
    <item>
      <title>Evernote 에서 Obsidian 으로 이사하기(결론은 UpNote 승)</title>
      <link>https://bigzero37.tistory.com/83</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 이전하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에버노트를 사용한지 거의 10년이 넘었다.&lt;br /&gt;처음 노트는 OneNote 였고 Evernote 로 이전할 때 많은 내용들을 잃었기에 조심스러울 수 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Obsidian 의 장점은 순수 MD 파일을 지원한다는 것이고 이것이 장점이자 단점이다.(나중에 설명)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Evernote 에서 Obsidian 으로 한번에 이전할 수는 없고 아래처럼 MD 파일로 전환과정을 거쳐야 한다.&lt;br /&gt;전체적인 흐름은 Evernote -&amp;gt; *.enex -&amp;gt; Joplin -&amp;gt; *.md -&amp;gt; Obsidian 이렇게 진행된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Evernote export : enex 라는 Evernote 고유 export 파일로 데이터를 추출한다.&lt;/li&gt;
&lt;li&gt;추출된 enex 파일을 Joplin 으로 import 한다. Joplin 은 enex import 를 지원한다.&lt;/li&gt;
&lt;li&gt;Jopline 에 import 가 완료되었으면 Jopline 에서 다시 md 파일로 export 한다.&lt;/li&gt;
&lt;li&gt;Jopline 에서 md 파일을 export 하면 각각의 이미지 및 첨부파일들은 _resources 라는 폴더에 통합으로 생성된다.&lt;/li&gt;
&lt;li&gt;Obsidian 을 실행하여 md 파일들이 모여 있는 최상단 루트 폴더를 오픈해 주면 일단 데이터 이전이 완료된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;첨부파일들의 지저분함&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 노트 작성시 이미지 캡쳐해서 붙여넣은 이미지들이 아래처럼 파일명을 지 멋대로 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UMSq8/btrKpTQSefg/3PHSuYR3H6MNlePEGx8uQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UMSq8/btrKpTQSefg/3PHSuYR3H6MNlePEGx8uQ0/img.png&quot; data-alt=&quot;Obsidian 에 자동으로 생성된 이미지 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UMSq8/btrKpTQSefg/3PHSuYR3H6MNlePEGx8uQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUMSq8%2FbtrKpTQSefg%2F3PHSuYR3H6MNlePEGx8uQ0%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;392&quot; height=&quot;1172&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Obsidian 에 자동으로 생성된 이미지 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공유서버 저장은 알아서 해야된다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유료로 Obsidian Sync 또는 Publish 를 사용하지 않는 이상 로컬의 md 파일을 다른 곳에서 공유하려면 별도의 방법을 사용해야 한다.&lt;/li&gt;
&lt;li&gt;현재는 apple 의 iCloud 가 그나마 가장 쓸만하고 google drive 를 사용해 봤는데 동기화 속도가 너무 느렸다.&lt;/li&gt;
&lt;li&gt;Git 을 사용할 줄 알면 Git 으로도 공유서버 저장 환경을 만들수 있지만 Git command 를 매번 사용해줘야 돠는 불편이 있었다.&lt;/li&gt;
&lt;li&gt;Git plugin 도 있는듯 한데 사용해 보지는 않았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;블로그 publish 는 다시 고민해야 된다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 사용중인 블로그에서 md 파일을 지원하더라도 첨부파일은 완전 다른 문제이다.&lt;/li&gt;
&lt;li&gt;글은 복사 &amp;amp; 붙여넣기 하더라도 첨부파일은 하나 하나 수동으로 옮겨줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Obsidian 에서 다른 곳으로 이전은 어떻게 하나?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Obsidian 자체가 md 파일 이지만 이전하고자 하는 블로그가 md 파일 및 첨부파일들을 지원하지 않으면 이 역시 노가다 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2022.08 결론&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텐츠 파일이 내 로컬PC 에 존재하므로 지적재산을 스스로 관리할 수 있다.&lt;/li&gt;
&lt;li&gt;로컬PC 에서 md 파일로 글 위주로 작성시 매우 훌륭하다. 즉, 매우 심플하다.&lt;/li&gt;
&lt;li&gt;여러장비에서 노트를 공유하면서 사용하려면 apple 장비로 플랫폼을 통일하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;무료로 웹에 publishing 하려면 차라리 처음부터 웹 블로그 환경을 사용하는 것이 더 낫자.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2023.12 현재 결론&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Obsidian 에 정착하려 했지만 동기화 비용이 너무 사악하여 포기함. 특히, 윈도우 환경에서는 답이 거의 없음&lt;/li&gt;
&lt;li&gt; 마크다운 파일들을 모두 들고 UpNote 어플 사용하기 시작하여 여기에 정착
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(거의 현존하는 노트앱들 중에서 개인노트앱으로서는 최강인듯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>신변잡기</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/83</guid>
      <comments>https://bigzero37.tistory.com/83#entry83comment</comments>
      <pubDate>Sat, 9 Dec 2023 18:04:31 +0900</pubDate>
    </item>
    <item>
      <title>Event-Driven Architecture(EDA) 란?</title>
      <link>https://bigzero37.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &lt;a href=&quot;https://www.amazon.com/Learning-Domain-Driven-Design-Vlad-Khononov-ebook-dp-B09J2CMJZY/dp/B09J2CMJZY/ref=mt_other?_encoding=UTF8&amp;amp;me=&amp;amp;qid=1654514620&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Learning Domain-Driven Design&lt;/a&gt; 도서의 chapter 15. Event-Drive Architecture 내용 요약정리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA 란, 간단하게 말하면 시스템 컴포넌트들간 통신할 때 비동기적인 이벤트 메세지를 사용하는 아키텍처 스타일이다.&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;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;메세지의 두가지 타입&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지에는 아래와 같은 두가지 타입이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 이벤트(Event) : 이미 발생된 변경을 나타내는 메세지 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 커맨드(Command) : 수행되어야 하는 행위(operation)을 나타내는 메세지 이다.&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;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;이벤트의 세가지 타입&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트는 아래와 같은 세가지 타입이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Event notification&lt;/b&gt;(이벤트알림) : 특정 이벤트 알림으로서 상세정보는 포함되어 있지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Event-carried state transfer&lt;/b&gt;(ECST, 상태변경이벤트) : 특정 상태 변경에 대한 이벤트 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Domain event&lt;/b&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;이벤트 타입별 예제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Event notification 예제 : 단순한 알림이고 상세정보를 알기 위해서는 details 를 확인해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654512238282&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  'type': 'marriage-recorded',
  'person-id': '01b9a761',
  'payload': {
        'person-id': '126a7b61',
        'details': '/01b9a761/marriage-data'
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ECST 예제 : 상태변경 값만 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654512330079&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  'type': 'personal-details-changed',
  'person-id': '01b9a761',
  'payload': {
        'new-last-name': 'Williams'
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 이벤트 예제 : married 라는 VO 정보를 모두 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654512386996&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  'type': 'married',
  'person-id': '01b9a761',
  'payload': {
        'person-id': '126a7b61',
        'assumed-partner-last-name': true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;EDA 아키텍처 설계시 주의사항&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KEwvi/btrD18zRHzk/l00eu658Tbo341gu867GLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KEwvi/btrD18zRHzk/l00eu658Tbo341gu867GLK/img.png&quot; data-alt=&quot;개선전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KEwvi/btrD18zRHzk/l00eu658Tbo341gu867GLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKEwvi%2FbtrD18zRHzk%2Fl00eu658Tbo341gu867GLK%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;545&quot; height=&quot;444&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;946&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;* &lt;b&gt;Temporal Coupling&lt;/b&gt; : Reporting 은 AdOptimization 이 Domain event 를 처리할 때까지 10초간 기다린 후 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Logical Coupling&lt;/b&gt; : Marketing 과 AdOptimization 은 동일한 Domain event 를 수신한다. Marketing 에서만 Business Logic 이 변경되는 경우, CRM 과 AdOptimization 의 이벤트 수신/발신은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Big_ball_of_mud&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Big ball of mud &lt;/a&gt;가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFqrSl/btrD7Gvasmz/jmO9InqOp35s64E21tZsW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFqrSl/btrD7Gvasmz/jmO9InqOp35s64E21tZsW1/img.png&quot; data-alt=&quot;개선후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFqrSl/btrD7Gvasmz/jmO9InqOp35s64E21tZsW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFqrSl%2FbtrD7Gvasmz%2FjmO9InqOp35s64E21tZsW1%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;545&quot; height=&quot;404&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;866&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;* Temporal Coupling Refactoring : Reporting 은 AdOptimization 과 통신만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Logical Coupling Refactoring : Marketing 과 AdOptimization 은 ECST 로 이벤트를 수신한다. 각각 종속성 없이 필요한 정보에 대해서 별도 처리를 수행할 수 있다.&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;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA 에서 적절치 않은 이벤트타입을 사용하면 big ball of mud 가 된다.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/82</guid>
      <comments>https://bigzero37.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 6 Jun 2022 20:24:34 +0900</pubDate>
    </item>
    <item>
      <title>MSA(Micro Service Architecture) 서비스 사이즈에 대한 고찰</title>
      <link>https://bigzero37.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 public cloud 가 흥하고 EKS 같은 container orchestration 서비스가 PaaS 환경으로 서비스 되면서 너도나도 MSA 를 부르짓는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 같은 cloud platform 업자들은 마케팅 측면에서 매출을 올릴수 있는 좋은 기회를 잡은듯 하고 전산기획업무 담당자들은 이참에 MSA 라는 것을 사용하여 시스템을 개발 또는 개선 하려고 예산을 올리는 좋은 기회를 잡은듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 실제로 해당 업무를 직접 수행해야 하는 개발자 또는 설계자들은 도대체 MSA 가 뭔지 아무도 명확하게 설명해 주지 않으면서 무작정 하라고 하니 거부감이 들수 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 접근해 보자. MSA 는 풀어서 얘기하면 &quot;마이크로 서비스를 위한 아키텍처&quot; 이다. 여기서 중요한 키워드 두개는 &lt;span style=&quot;color: #1a5490;&quot;&gt;마이크로서비스&lt;/span&gt;와 &lt;span style=&quot;color: #1a5490;&quot;&gt;아키텍처&lt;/span&gt; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 마이크로서비스란, 말 그대로 작게 쪼개진 서비스를 얘기한다. 가끔 MSA 를 한다고 하면서 자신들이 생각하는 마이크로서비스는 그렇게 작지 않은 중간정도 규모라는 정신 나간 사이비들이 있는데, 그건 말 그대로 미디엄서비스 이지 마이크로서비스가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스는 말 그대로 가능한 작게 쪼갠 서비스이다. 그럼 왜 쪼개는가? 그 해답은 두번째 키워드인 아키텍처에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아키텍처란, 쉽게 얘기하면 품질속성 - 성능, 보안, 가변성, 확장성, 유지보수성, 사용성 등 을 의미한다.&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;구글의 검색 기능은 단순히 검색 기능만 제공한다. 순수한 Function Point 측면에서 보면 정말 간단한 기능이고 별로 설명할 것도 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아키텍처의 측면에서 구글검색은 엄청난 성능, 보안, 확장성, 연결성, 가변성 등을 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &quot;서비스는 마이크로 한데 아키텍처가 일반적이지 않은 넘사벽이다.&quot; 여기서 MSA 의 범위가 구분된다.&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;하지만 해당 쇼핑몰은 1년에 한번 블랙프라이데이 같은 행사를 하고 이때 트래픽은 평소의 100배를 가볍게 넘긴다고 하면 이 행사 시점의 아키텍처는 평소와는 완전히 다른 아키텍처를 가져야만 한다. 특히, 상품검색은 특히 많은 부하를 받을 것이고 높은 성능을 요구받을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 해당 시점에 상품검색만 MSA 로 분리해서 별도로 운영할 수 있게 하는 방법을 고려해 볼수 있다. (보통 이러한 디자인 패턴을 CQRS 패턴이라 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, MSA 는 아키텍처 성질이 다른 서비스를 분리하는 기법이고, 이러한 서비스를 분리할 때 가능한 작게 분리(크게 분리하면 그냥 두개의 별도 시스템이 만들어진다) 하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 응용하자면 MSA + Non-MSA 시스템을 동시에 아키텍처링 할수도 있게 된다. 즉, MSA를 한다고 모든 서비스들을 다 작게 쪼개서 아키텍처를 분리해야 되는 것도 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 MSA 에 너무 스트레스 받지 말자. 이벤트나 행사시점에 전체 시스템 용량을 다 늘려서 서버를 늘리고 대역폭을 늘리고 하지 말고 필요한 기능들 몇개만 쪼개서 확장성과 가변성 높은 시스템을 만들 수 있다면 MSA 를 적용했다고 말할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 MSA 범위산정에 대한 이론적인 지식이 필요하다면 DDD(Domain Driven Design) 도서를 참고하여 Contenxt Boundary 에 대한 고민을 해보는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/81</guid>
      <comments>https://bigzero37.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 29 May 2022 13:55:01 +0900</pubDate>
    </item>
    <item>
      <title>gradle manually install (gradle 수동설치)</title>
      <link>https://bigzero37.tistory.com/80</link>
      <description></description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/80</guid>
      <comments>https://bigzero37.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 17 Apr 2022 14:18:17 +0900</pubDate>
    </item>
    <item>
      <title>gradle dependencies 확인하기</title>
      <link>https://bigzero37.tistory.com/79</link>
      <description>&lt;div data-pm-slice=&quot;1 1 []&quot; data-en-clipboard=&quot;true&quot;&gt;gradle 사용시 라이브러리 종속성 문제로 특정 jar 를 제외 시켜야 하는 경우&lt;/div&gt;
&lt;div&gt;gradle dependenies task 를 이용하면 아래처럼 종속성을 tree 형태로 뽑아낼 수 있다.&lt;/div&gt;
&lt;div&gt;파일로 추출하여 특정 jar 를 찾아서 제외 시켜주면 된다.&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1650172435362&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ./gradlew dependencies 
Starting a Gradle Daemon, 1 busy and 1 incompatible Daemons could not be reused, use --status for details 
&amp;gt; Configure project : 
Operation Env =&amp;gt; local 
&amp;gt; Task :dependencies 
------------------------------------------------------------ 
Root project 'coss-app' 
------------------------------------------------------------ 
annotationProcessor - Annotation processors and their dependencies for source set 'main'. 
\--- org.projectlombok:lombok -&amp;gt; 1.18.22 
apiElements - API elements for main. (n) 
No dependencies 
archives - Configuration for archive artifacts. (n) 
No dependencies 
bootArchives - Configuration for Spring Boot archive artifacts. (n) 
No dependencies 
compileClasspath - Compile classpath for source set 'main'. 
+--- org.projectlombok:lombok -&amp;gt; 1.18.22 
+--- com.github.ulisesbocchio:jasypt-spring-boot-starter:2.1.2 
|    \--- com.github.ulisesbocchio:jasypt-spring-boot:2.1.2 
|         \--- org.jasypt:jasypt:1.9.3 
+--- org.bouncycastle:bcprov-jdk15on:1.61 
+--- javax.activation:activation:1.1 
+--- org.apache.commons:commons-compress:1.14 
+--- org.apache.poi:poi:3.10-FINAL 
|    \--- commons-codec:commons-codec:1.5 -&amp;gt; 1.15 
+--- org.apache.poi:poi-ooxml:3.10-FINAL 
|    +--- org.apache.poi:poi:3.10-FINAL (*) 
|    +--- org.apache.poi:poi-ooxml-schemas:3.10-FINAL 
|    |    \--- org.apache.xmlbeans:xmlbeans:2.3.0 
|    |         \--- stax:stax-api:1.0.1 
|    \--- dom4j:dom4j:1.6.1 
|         \--- xml-apis:xml-apis:1.0.b2 
+--- org.apache.poi:poi-ooxml-schemas:3.10-FINAL (*) 
+--- org.apache.poi:poi-scratchpad:3.10-FINAL 
|    \--- org.apache.poi:poi:3.10-FINAL (*) 
+--- org.springframework.boot:spring-boot-starter-undertow -&amp;gt; 2.6.1 
|    +--- io.undertow:undertow-core:2.2.12.Final 
|    |    +--- org.jboss.logging:jboss-logging:3.4.1.Final -&amp;gt; 3.4.2.Final 
|    |    +--- org.jboss.xnio:xnio-api:3.8.4.Final 
|    |    |    +--- org.wildfly.common:wildfly-common:1.5.2.Final 
|    |    |    \--- org.wildfly.client:wildfly-client-config:1.0.1.Final 
|    |    |         +--- org.jboss.logging:jboss-logging:3.3.1.Final -&amp;gt; 3.4.2.Final 
|    |    |         \--- org.wildfly.common:wildfly-common:1.2.0.Final -&amp;gt; 1.5.2.Final 
|    |    \--- org.jboss.threads:jboss-threads:3.1.0.Final 
|    |         \--- org.jboss.logging:jboss-logging:3.4.1.Final -&amp;gt; 3.4.2.Final 
|    +--- io.undertow:undertow-servlet:2.2.12.Final 
|    |    \--- io.undertow:undertow-core:2.2.12.Final (*) 
|    +--- io.undertow:undertow-websockets-jsr:2.2.12.Final 
|    |    +--- io.undertow:undertow-core:2.2.12.Final (*) 
|    |    \--- io.undertow:undertow-servlet:2.2.12.Final (*) 
|    +--- jakarta.servlet:jakarta.servlet-api:4.0.4 
|    +--- jakarta.websocket:jakarta.websocket-api:1.1.2 
|    \--- org.apache.tomcat.embed:tomcat-embed-el:9.0.55&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/79</guid>
      <comments>https://bigzero37.tistory.com/79#entry79comment</comments>
      <pubDate>Sun, 17 Apr 2022 14:14:17 +0900</pubDate>
    </item>
    <item>
      <title>gradle executable jar 만들기</title>
      <link>https://bigzero37.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;springboot 는 워낙 편의장치가 많아서 별 고민안했는데 간만에 Main 하나 만들려니 gradle 대충알다가 엄청난 삽질을...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 gradle version 은 7.3.1 이다. 이것도 버전별로 워낙 변경사항이 많아서 버전별로 다른 내용이 많으니 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 build.gradle 내용임&lt;/p&gt;
&lt;pre id=&quot;code_1638868489287&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'application'
    id 'java-library'
    id 'org.jetbrains.kotlin.jvm' version '1.5.10'
}

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.redisson/redisson
    implementation group: 'org.redisson', name: 'redisson', version: '3.2.0'
}

def version = '0.1'
def mainClassName= 'MainKt'

// gradle default jar 를 커스터마이징 한다.
// manifest default 생성값을 제외하고 별도로 만들어준다.
jar {
    manifest {
        attributes(
            'Title': 'RedisDistributedLock',
            'Version': version,
            'Main-Class': mainClassName,
        )
    }
    from(configurations.runtimeClasspath.collect {
        it.isDirectory() ? it : zipTree(it)
    }) {
        exclude 'META-INF', 'META-INF/**'
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 가장 중요한 부분은 jar 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 jar 실행파일을 만들려면 두가지를 해결해야 한다. 1. 참조되는 라이브러리들을 넣어줘야 한다. 2. manifest 를 만들어 넣어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gradle command(./gradlew clean build)로 jar를 만들면 하단에 jar 부분이 기본적으로 없어도 된다. 그래도 jar는 만들어지고 manifest도 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 executable jar 를 만들려면 gradle의 기본 jar를 위에 내용처럼 override 해서 정의하면서 from 절에 참조되는 라이브러리를 넣도록 해야 되는데 이때 자동으로 만들어진 manifest와 jar를 override 하면서 만들어진 manifest 두개가 동시에 만들어지면서 gradle 에서 멀티(?) manifest 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 from 에서는 manifest를 exclude로 제거하고 manifest를 내가 임의로 넣어주는 것을 추가하여 위의 코드처럼 build.gradle 을 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 위의 gradle 은 Redis 분산락을 테스트하는 코드이다. 전체코드는 여기서 &lt;a title=&quot;github링크&quot; href=&quot;https://github.com/largezero/RedisLockTest&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고&lt;/a&gt; (코틀린이다.)&lt;/p&gt;</description>
      <category>개발관련</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/78</guid>
      <comments>https://bigzero37.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 7 Dec 2021 18:23:18 +0900</pubDate>
    </item>
    <item>
      <title>anne pro 2 물결모양(wavy, ~) 키 변경하기(매크로사용)</title>
      <link>https://bigzero37.tistory.com/77</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, '돋움', sans-serif;&quot;&gt;1. 매크로 라이브러리에 매크로를 한개 추가 한다. (나는 이름을 wavy 로 했음)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2t9tP/btrmxLnIYNm/TM4ESDZljLM8mjsVtO3MmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2t9tP/btrmxLnIYNm/TM4ESDZljLM8mjsVtO3MmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2t9tP/btrmxLnIYNm/TM4ESDZljLM8mjsVtO3MmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2t9tP%2FbtrmxLnIYNm%2FTM4ESDZljLM8mjsVtO3MmK%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;400&quot; height=&quot;274&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, '돋움', sans-serif;&quot;&gt;2. 내가 최종적으로 누를 키를 지정한다.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(주의할 것은 내가 입력하고자 하는 내용이 아닌 내가 최종적으로 누를 키를 먼저 해야 된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 &quot;FN1+\&quot; 키를 물결(wavy)로 매핑했다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MnvSH/btrmtVLnuVj/BOMsYrtY577HrJXUfxzv2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MnvSH/btrmtVLnuVj/BOMsYrtY577HrJXUfxzv2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MnvSH/btrmtVLnuVj/BOMsYrtY577HrJXUfxzv2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnvSH%2FbtrmtVLnuVj%2FBOMsYrtY577HrJXUfxzv2K%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;671&quot; height=&quot;276&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의 : 처음에 &quot;SHIFT+ECS&quot; 키를 물결로 매핑하려고 아래처럼 했는데 &quot;SHIFT&quot; 하나만 눌러도 물결이 나오고 &quot;ESC&quot; 하나만 눌러도 물결이 나왔다. 즉, 두개의 키 모두 각각 매크로가 작동되었다. 매크로는 한 키에 한개만 지정되는 듯 하다 약간 응용하면 새로운 방식으로 사용 가능할지도....&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFtGVr/btrmDWogxZE/uZlgaekjkrsrdqkKr57zS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFtGVr/btrmDWogxZE/uZlgaekjkrsrdqkKr57zS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFtGVr/btrmDWogxZE/uZlgaekjkrsrdqkKr57zS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFtGVr%2FbtrmDWogxZE%2FuZlgaekjkrsrdqkKr57zS0%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;660&quot; height=&quot;264&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, '돋움', sans-serif;&quot;&gt;&lt;b&gt;3. &quot;FN1+&lt;b&gt;\&lt;/b&gt;&quot; 키를 눌렀을 때 물결(wavy)을 표시 하기 위해 하단에 Preview edit 를 눌러 물결을 입력한다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anne pro 2 에서는 기본값으로 &quot;FN1+SHIFT+ECS&quot; 키가 물결이므로 이것을 record 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(키를 누르는 순서도 지켜야 한다. SHIFT 를 먼저 누르면 안된다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKrASs/btrmxF9bvcq/ylxPyfDyPph3Pkn0Uou1S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKrASs/btrmxF9bvcq/ylxPyfDyPph3Pkn0Uou1S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKrASs/btrmxF9bvcq/ylxPyfDyPph3Pkn0Uou1S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKrASs%2FbtrmxF9bvcq%2FylxPyfDyPph3Pkn0Uou1S0%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;859&quot; height=&quot;254&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, '돋움', sans-serif;&quot;&gt;4. 다 되면 아래와 같은 셋팅이 되고 최종적으로 Download 를 눌러서 키보드에 저장한다.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TARx2/btrmCBY4dbD/vjyuTYY9IkJs11YqHOT7ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TARx2/btrmCBY4dbD/vjyuTYY9IkJs11YqHOT7ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TARx2/btrmCBY4dbD/vjyuTYY9IkJs11YqHOT7ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTARx2%2FbtrmCBY4dbD%2FvjyuTYY9IkJs11YqHOT7ek%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;1045&quot; height=&quot;721&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Download 누르면 아래처럼 내 Device 에 매크로가 저장되었다고 나온다.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TLJg/btrmwQ4tApB/xvPDZQ9eCMibhAGWLDEPuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TLJg/btrmwQ4tApB/xvPDZQ9eCMibhAGWLDEPuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TLJg/btrmwQ4tApB/xvPDZQ9eCMibhAGWLDEPuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TLJg%2FbtrmwQ4tApB%2FxvPDZQ9eCMibhAGWLDEPuk%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;428&quot; height=&quot;263&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, '돋움', sans-serif;&quot;&gt;&lt;b&gt;6. 이제 &quot;FN1+\&quot; 키를 누르면 물결(wavy, ~) 모양이 입력된다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>신변잡기</category>
      <author>bigzero</author>
      <guid isPermaLink="true">https://bigzero37.tistory.com/77</guid>
      <comments>https://bigzero37.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 30 Nov 2021 15:19:13 +0900</pubDate>
    </item>
  </channel>
</rss>