<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Mit</title>
    <link>https://mistics.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 9 Jun 2026 18:17:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NicSub</managingEditor>
    <image>
      <title>Mit</title>
      <url>https://tistory1.daumcdn.net/tistory/2994334/attach/3d304ed55e674d9fac0d67902548848f</url>
      <link>https://mistics.tistory.com</link>
    </image>
    <item>
      <title>sys:Environment.NewLine</title>
      <link>https://mistics.tistory.com/161</link>
      <description>&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Span&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;{x:Static sys:Environment.NewLine}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;LineHeight&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Span&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;{x:Static sys:Environment.NewLine}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;LineHeight&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/161</guid>
      <comments>https://mistics.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 31 Mar 2026 11:55:38 +0900</pubDate>
    </item>
    <item>
      <title>C#에서 추상클래스</title>
      <link>https://mistics.tistory.com/160</link>
      <description>&lt;div style=&quot;color: #e6e8f0; text-align: start;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEQAA&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;div data-processed=&quot;true&quot; data-subtree=&quot;aimfl,mfl&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;C#에서 추상클래스(&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;abstract class)는&amp;nbsp;&lt;b&gt;'미완성 설계도'&lt;/b&gt;로, 공통된 틀을 제공하지만 자식 클래스(파생 클래스)가 반드시 채워야 할 부분이 있을 때 사용하며,&amp;nbsp;abstract는&amp;nbsp;&lt;b&gt;구현부가 없는 메서드&lt;/b&gt;를,&amp;nbsp;virtual은&amp;nbsp;&lt;b&gt;구현부가 있는 메서드를 파생 클래스에서 재정의(Override)할 수 있도록 허용&lt;/b&gt;할 때 쓰는 키워드예요.&amp;nbsp;abstract는&amp;nbsp;&lt;b&gt;'반드시 구현해야 함'&lt;/b&gt;을 강제하고,&amp;nbsp;virtual은&amp;nbsp;&lt;b&gt;'선택적 재정의'&lt;/b&gt;를 허용하는 차이가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;hr data-processed=&quot;true&quot; data-serialized-params=&quot;[]&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추상클래스(abstract class)는 왜 사용할까?&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #e6e8f0; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAA&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;공통된 기반 제공&lt;/b&gt;: 여러 클래스가 공유하는 기본적인 속성과 메서드(구현된 메서드도 포함)를 정의하여 코드 중복을 줄여줘요. (예: '동물'이라는 추상 클래스에&amp;nbsp;이름&amp;nbsp;속성과&amp;nbsp;나이&amp;nbsp;필드,&amp;nbsp;먹기()&amp;nbsp;메서드를 구현)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAQ&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;강력한 계약&lt;/b&gt;:&amp;nbsp;abstract&amp;nbsp;메서드를 포함시켜, 이 추상클래스를 상속받는 모든 클래스가 특정 기능을&amp;nbsp;&lt;b&gt;반드시 구현하도록 강제&lt;/b&gt;해요. (예: '동물'에&amp;nbsp;소리내기()라는&amp;nbsp;abstract&amp;nbsp;메서드를 만들어, '개'는 멍멍, '고양이'는 야옹 하고 반드시 구현하게 함).&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAg&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;객체 생성 불가&lt;/b&gt;: 추상클래스 자체로는 인스턴스(객체)를 만들 수 없고, 반드시 상속을 통해 구체화해야 해요.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;abstract와&amp;nbsp;virtual의 차이&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #e6e8f0; text-align: start;&quot; data-processed=&quot;true&quot; data-ved=&quot;2ahUKEwjP9_Cm_Z2SAxV_p1YBHasHM8MQ-q4QegQIBhAA&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구분&amp;nbsp;abstract&amp;nbsp;(추상)virtual&amp;nbsp;(가상)&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-processed=&quot;true&quot; data-animation-nesting=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-processed=&quot;true&quot;&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;메서드 구현&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구현부가&amp;nbsp;&lt;b&gt;없음&lt;/b&gt;&amp;nbsp;(빈껍데기).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구현부가&amp;nbsp;&lt;b&gt;있음&lt;/b&gt;&amp;nbsp;(기본 로직 포함).&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;재정의(Override)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파생 클래스에서&amp;nbsp;&lt;b&gt;반드시 구현해야 함&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파생 클래스에서&amp;nbsp;&lt;b&gt;선택적으로 재정의&lt;/b&gt;할 수 있음.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;사용 대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추상 클래스에서만 사용 가능 (클래스 자체도&amp;nbsp;abstract여야 함).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일반 클래스나 추상 클래스 모두 사용 가능.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하위 클래스에 특정 기능 구현을&amp;nbsp;&lt;b&gt;강제&lt;/b&gt;하여 공통된 동작을 보장.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하위 클래스에서 기본 동작을&amp;nbsp;&lt;b&gt;변경&lt;/b&gt;할 수 있도록 유연성 제공.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;쉽게 비유하자면?&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #e6e8f0; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAgQAA&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;추상클래스&lt;/b&gt;: '건축 도면' (기본 구조는 있지만, 방의 종류나 내부 마감은 정해지지 않음).&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAgQAQ&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;abstract&amp;nbsp;메서드&lt;/b&gt;: '필수 설비' (도면에 반드시 넣어야 하는 수도, 전기 배관 위치).&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAgQAg&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;virtual&amp;nbsp;메서드&lt;/b&gt;: '선택 인테리어' (기본 벽지 제공이지만, 원하는 색으로 칠할 수 있음).&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAgQAw&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;override된 메서드&lt;/b&gt;: '도면을 따라 직접 만든 벽지 색' (기본을 바꾸는 행위).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;언제 뭘 쓸까?&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #e6e8f0; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAA&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;abstract&amp;nbsp;(추상)&lt;/b&gt;:&amp;nbsp;&lt;b&gt;'~는 ~을 할 수 있다'&lt;/b&gt;가 아니라,&amp;nbsp;&lt;b&gt;'~는 반드시 ~를 해야 한다'&lt;/b&gt;는 강력한 '규칙'을 만들고 싶을 때.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAoQAQ&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;virtual&amp;nbsp;(가상)&lt;/b&gt;:&amp;nbsp;&lt;b&gt;'~는 기본적으로 ~를 하지만, 필요하면 바꿀 수 있다'&lt;/b&gt;는 유연한 '옵션'을 제공하고 싶을 때.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ETC</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/160</guid>
      <comments>https://mistics.tistory.com/160#entry160comment</comments>
      <pubDate>Thu, 22 Jan 2026 10:24:54 +0900</pubDate>
    </item>
    <item>
      <title>리플렉션을 사용한 Model 데이터 출력</title>
      <link>https://mistics.tistory.com/159</link>
      <description>&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;// &quot;프로퍼티명=값&quot; 형태로 &quot;/&quot;로 구분 ==&amp;gt; 간단한 방법 (리플렉션 사용)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;_dataValue&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Ubody&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;GetType&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;GetProperties&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Select&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;$&quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;GetValue&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Ubody&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ToString&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; );&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/159</guid>
      <comments>https://mistics.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 20 Oct 2025 16:30:21 +0900</pubDate>
    </item>
    <item>
      <title>asp.net api 생성에 web.config파일이 생성되지 않아 403 에러가 발생</title>
      <link>https://mistics.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;asp.net api 생성에 web.config파일이 생성되지 않아 403 에러가 발생했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csproj 파일은 아래처럼&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Project&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Sdk&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Microsoft.NET.Sdk.Web&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;PropertyGroup&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;TargetFramework&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;net8.0&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;TargetFramework&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;AspNetCoreHostingModel&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;InProcess&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;AspNetCoreHostingModel&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Nullable&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;enable&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Nullable&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ImplicitUsings&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;enable&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ImplicitUsings&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;IsWebConfigRequired&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;IsWebConfigRequired&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;lt;!-- &amp;lt;OutputType&amp;gt;WinExe&amp;lt;/OutputType&amp;gt; --&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;PropertyGroup&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ItemGroup&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;PackageReference&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Include&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Microsoft.AspNetCore.Authentication.JwtBearer&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Version&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;6.0.9&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;PackageReference&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Include&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Microsoft.Data.SqlClient&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;Version&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;5.2.1&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;ItemGroup&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Project&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;publish는 아래처럼해서 해결되었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dotnet&amp;nbsp;publish&amp;nbsp;-c&amp;nbsp;Release&amp;nbsp;-r&amp;nbsp;win-x64&amp;nbsp;--self-contained&amp;nbsp;false&lt;/p&gt;</description>
      <category>ETC</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/158</guid>
      <comments>https://mistics.tistory.com/158#entry158comment</comments>
      <pubDate>Fri, 1 Aug 2025 15:09:08 +0900</pubDate>
    </item>
    <item>
      <title>디자인 타임에만 사용되는 ViewModel 바인딩</title>
      <link>https://mistics.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;d:DataContext&lt;/span&gt;&lt;span&gt;는 WPF에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;디자인 타임에만 사용되는 ViewModel 바인딩&lt;/b&gt;&lt;span&gt;입니다. 주로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Visual Studio의 XAML 디자이너 미리보기에서 실제 데이터 바인딩 결과를 확인&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;Window&amp;nbsp;x:Class=&quot;YourApp.MainWindow&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:local=&quot;clr-namespace:YourApp.ViewModels&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:d=&quot;&lt;a href=&quot;http://schemas.microsoft.com/expression/blend/2008&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://schemas.microsoft.com/expression/blend/2008&lt;/a&gt;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:mc=&quot;&lt;a href=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/a&gt;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mc:Ignorable=&quot;d&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d:DataContext=&quot;{d:DesignInstance&amp;nbsp;Type=local:MainViewModel,&amp;nbsp;IsDesignTimeCreatable=True}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TextBlock&amp;nbsp;Text=&quot;{Binding&amp;nbsp;Title}&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  왜 디자인 타임 미리보기가 중요할까?&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;UI 레이아웃 조정이 쉬워집니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;rarr; 빈 화면이 아니라 실제 데이터로 레이아웃을 잡을 수 있어서 더 효율적입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디자인 도중 바인딩 경로 오류를 빨리 찾을 수 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;rarr; 예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Text=&quot;{Binding WrongProperty}&quot;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 오타&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Blend를 사용할 때 필수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;rarr; Blend for Visual Studio에서 MVVM 기반 앱 디자인을 할 때 필수적으로 활용됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⚠️ 주의사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;런타임에 전혀 영향을 주지 않습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;(즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;d:DataContext&lt;/span&gt;로 바인딩한 ViewModel은 실제 실행 시 적용되지 않음)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ViewModel에 파라미터 없는 생성자가 있어야 합니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;IsDesignTimeCreatable=True&lt;/span&gt;일 때 자동 인스턴스 생성이 가능해야 하므로.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>WPF</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/157</guid>
      <comments>https://mistics.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 31 Jul 2025 10:18:10 +0900</pubDate>
    </item>
    <item>
      <title>.NET Core ASP.NET API에서 외부 IP를 차단하고, 그 차단 목록이 DB에 저장되어 있는 경우, 다음과 같은 방식으로 구현할 수 있습니다.</title>
      <link>https://mistics.tistory.com/156</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 구현 전략 요약&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;미들웨어에서 클라이언트 IP 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB에서 차단된 IP 목록 조회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청이 차단된 IP에서 온 경우 403 Forbidden 반환&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 1. 미들웨어 방식 (가장 추천)&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ASP.NET Core의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;커스텀 미들웨어(Middleware)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 사용하면 모든 요청 전에 IP를 검사할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;IP 차단 미들웨어&amp;gt;&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;IpBlockingMiddleware&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;RequestDelegate&amp;nbsp;_next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;ILogger&amp;lt;IpBlockingMiddleware&amp;gt;&amp;nbsp;_logger;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;IpBlockingMiddleware(RequestDelegate&amp;nbsp;next,&amp;nbsp;ILogger&amp;lt;IpBlockingMiddleware&amp;gt;&amp;nbsp;logger)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_next&amp;nbsp;=&amp;nbsp;next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_logger&amp;nbsp;=&amp;nbsp;logger;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;async&amp;nbsp;Task&amp;nbsp;InvokeAsync(HttpContext&amp;nbsp;context,&amp;nbsp;IBlockedIpService&amp;nbsp;blockedIpService)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;remoteIp&amp;nbsp;=&amp;nbsp;context.Connection.RemoteIpAddress?.ToString();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(string.IsNullOrEmpty(remoteIp))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;await&amp;nbsp;_next(context);&lt;br /&gt;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(await&amp;nbsp;blockedIpService.IsBlockedAsync(remoteIp))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_logger.LogWarning($&quot;Blocked&amp;nbsp;request&amp;nbsp;from&amp;nbsp;IP:&amp;nbsp;{remoteIp}&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.StatusCode&amp;nbsp;=&amp;nbsp;StatusCodes.Status403Forbidden;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;await&amp;nbsp;context.Response.WriteAsync(&quot;Forbidden:&amp;nbsp;Your&amp;nbsp;IP&amp;nbsp;is&amp;nbsp;blocked.&quot;);&lt;br /&gt;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;await&amp;nbsp;_next(context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;서비스 인터페이스&amp;gt;&lt;br /&gt;public&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;IBlockedIpService&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Task&amp;lt;bool&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;IsBlockedAsync&lt;/span&gt;(string ipAddress);&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;lt;구현예시: EF Core&amp;gt;&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;BlockedIpService&amp;nbsp;:&amp;nbsp;IBlockedIpService&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;AppDbContext&amp;nbsp;_dbContext;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;BlockedIpService(AppDbContext&amp;nbsp;dbContext)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dbContext&amp;nbsp;=&amp;nbsp;dbContext;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;async&amp;nbsp;Task&amp;lt;bool&amp;gt;&amp;nbsp;IsBlockedAsync(string&amp;nbsp;ipAddress)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;await&amp;nbsp;_dbContext.BlockedIps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AnyAsync(b&amp;nbsp;=&amp;gt;&amp;nbsp;b.IpAddress&amp;nbsp;==&amp;nbsp;ipAddress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;lt;미들웨어 등록&amp;gt;&lt;/span&gt;&lt;br /&gt;app.UseMiddleware&amp;lt;IpBlockingMiddleware&amp;gt;();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;lt;서비스 등록&amp;gt;&lt;br /&gt;builder.Services.AddScoped&amp;lt;IBlockedIpService,&amp;nbsp;BlockedIpService&amp;gt;();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 2. 성능 최적화 (옵션)&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DB 조회가 느릴 수 있으니,&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;차단 IP를 캐싱&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하거나&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;메모리에 로드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;해 두는 것도 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;public&amp;nbsp;class&amp;nbsp;BlockedIpService&amp;nbsp;:&amp;nbsp;IBlockedIpService&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;IMemoryCache&amp;nbsp;_cache;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;AppDbContext&amp;nbsp;_dbContext;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;readonly&amp;nbsp;string&amp;nbsp;CacheKey&amp;nbsp;=&amp;nbsp;&quot;BlockedIpList&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;BlockedIpService(AppDbContext&amp;nbsp;dbContext,&amp;nbsp;IMemoryCache&amp;nbsp;cache)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dbContext&amp;nbsp;=&amp;nbsp;dbContext;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cache&amp;nbsp;=&amp;nbsp;cache;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;async&amp;nbsp;Task&amp;lt;bool&amp;gt;&amp;nbsp;IsBlockedAsync(string&amp;nbsp;ipAddress)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;blockedIps&amp;nbsp;=&amp;nbsp;await&amp;nbsp;_cache.GetOrCreateAsync(CacheKey,&amp;nbsp;async&amp;nbsp;entry&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.AbsoluteExpirationRelativeToNow&amp;nbsp;=&amp;nbsp;TimeSpan.FromMinutes(10);&lt;br /&gt;&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&amp;nbsp;await&amp;nbsp;_dbContext.BlockedIps&lt;br /&gt;&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;.Select(b&amp;nbsp;=&amp;gt;&amp;nbsp;b.IpAddress)&lt;br /&gt;&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;.ToListAsync();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;blockedIps.Contains(ipAddress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 3. 클라이언트 IP 가져오기 주의점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제 IP는 프록시를 통해 올 수 있음&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;var&amp;nbsp;ip&amp;nbsp;=&amp;nbsp;context.Connection.RemoteIpAddress?.ToString();&lt;br /&gt;하지만 프록시 서버나 로드밸런서가 있는 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;X-Forwarded-For&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;헤더를 사용해야 정확함.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;var&amp;nbsp;ip&amp;nbsp;=&amp;nbsp;context.Request.Headers[&quot;X-Forwarded-For&quot;].FirstOrDefault()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;??&amp;nbsp;context.Connection.RemoteIpAddress?.ToString();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #0e0e0e; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;⚠️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;주의&lt;/b&gt;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;X-Forwarded-For&lt;/span&gt;는 조작될 수 있으므로 보안 고려 필요&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 요약 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;목적&lt;/b&gt;&lt;b&gt;구현 방식&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;모든 요청에서 IP 차단&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;✅ 커스텀 미들웨어&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;차단 IP는 DB에서 조회&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;IBlockedIpService&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;활용&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;성능 최적화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;MemoryCache 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;실제 클라이언트 IP 확인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;X-Forwarded-For&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;고려 필요&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>ETC</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/156</guid>
      <comments>https://mistics.tistory.com/156#entry156comment</comments>
      <pubDate>Wed, 30 Jul 2025 14:17:30 +0900</pubDate>
    </item>
    <item>
      <title>MS-SQL ExcuteScalar() 로 Select Return 값 받기</title>
      <link>https://mistics.tistory.com/154</link>
      <description>&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;/* // 저장 프로시저 사용할때 &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; // 반환 값 파라미터&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; var returnParam = new SqlParameter();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; returnParam.Direction = ParameterDirection.ReturnValue;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; returnParam.SqlDbType = SqlDbType.Int;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; returnParam.ParameterName = &quot;@RETURN_VALUE&quot;; // 꼭 명시!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; cmd.Parameters.Add(returnParam);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; cmd.ExecuteNonQuery();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; // 반환값 읽기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; int _RTN = (int)cmd.Parameters[&quot;@RETURN_VALUE&quot;].Value;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; */&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;// 저장 프로시저가 아니면&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;// SELECT 1, SELECT 3 값은 ExecuteScalar() 메서드 실행.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/154</guid>
      <comments>https://mistics.tistory.com/154#entry154comment</comments>
      <pubDate>Mon, 9 Jun 2025 11:20:57 +0900</pubDate>
    </item>
    <item>
      <title>.Net Maui 색상 변경 Rectangle 과 BoxView</title>
      <link>https://mistics.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Rectangle&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;의 색상을 변경할 때는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Fill&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성을 사용해야 합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;BackgroundColor&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;BoxView&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;와 같은 다른 요소에서 사용되며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Rectangle&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Fill&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성을 통해 색상을 설정합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Maui</category>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/153</guid>
      <comments>https://mistics.tistory.com/153#entry153comment</comments>
      <pubDate>Thu, 12 Sep 2024 19:17:57 +0900</pubDate>
    </item>
    <item>
      <title>VS2022 Android device wifi debugging</title>
      <link>https://mistics.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기기에서 &amp;gt; 개발자옵션 &amp;gt; USB디버깅, 무선디버깅을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS2022 도구 &amp;gt; Android &amp;gt; Android adb 명령 프롬프트&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;: adb devices&lt;br /&gt;(연결된 deives list)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: adb tcpip 5555&lt;br /&gt;(만약 error: more than one devcie/emulator 라고 에러가 나온다면 이것은 실기기와 에뮬레이터가 대상이어서 그렇다.&lt;br /&gt;Android 에뮬레이터를 꺼주고 다시 adb tcpip 5555 진행해서 오류가 없음을 확인한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: adb connect 192.168.100.102:5555&lt;br /&gt;(connected to 192.168.100.102:5555를 확인한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS2022에서 실기기를 선택하고 debugging 하면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고)&lt;br /&gt;기기를 삭제하려면&lt;br /&gt;: adb kill-server 하면 연결된 모든 디바이스가 닫힌다.&lt;br /&gt;(다시 기기를 연결하거나 처음부터 다시 연결하려면 컴퓨터에 저장된 adbkey를 삭제해야 한다. 경로는 c:\users\user\.android 폴더에 있는 adbkey를 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 기기에서 개발자옵션 &amp;gt; USB디버깅, 무선디버깅을 해제하고, USB 디버깅 권한 승인 취소를 눌러 저장된 권한을 삭제해 준다.&lt;/p&gt;</description>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/152</guid>
      <comments>https://mistics.tistory.com/152#entry152comment</comments>
      <pubDate>Mon, 29 Jul 2024 13:57:06 +0900</pubDate>
    </item>
    <item>
      <title>.net8 Maui Android API34 Usb Serial RegisterReceiver</title>
      <link>https://mistics.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;GXSerial(Context&amp;nbsp;contect) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_contect&amp;nbsp;=&amp;nbsp;contect; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_Receiver&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GXUsbReciever(this); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntentFilter filter = new IntentFilter(&quot; Gurux.Serial &quot;); //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter.AddAction(UsbManager.ActionUsbAccessoryDetached); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter.AddAction(UsbManager.ActionUsbDeviceAttached); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter.AddAction(UsbManager.ActionUsbDeviceDetached); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Android.OS.Build.VERSION.SdkInt&amp;nbsp;&amp;gt;=&amp;nbsp;Android.OS.BuildVersionCodes.Tiramisu) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_contect.RegisterReceiver(_Receiver, filter, ReceiverFlags.NotExported );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_contect.RegisterReceiver(_Receiver,&amp;nbsp;filter); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConfigurableSettings&amp;nbsp;=&amp;nbsp;AvailableMediaSettings.All; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_syncBase&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GXSynchronousMediaBase(1024); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/p&gt;</description>
      <author>NicSub</author>
      <guid isPermaLink="true">https://mistics.tistory.com/151</guid>
      <comments>https://mistics.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 26 Jul 2024 13:12:06 +0900</pubDate>
    </item>
  </channel>
</rss>