<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Jasmin Time</title>
    <link>https://freebaer.tistory.com/</link>
    <description>게임하다가, 일상을 즐기다가, 일하다가 차 한잔의 여유가 생길 때 이것저것 끄적이는 곳</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 17:07:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>FreeBear</managingEditor>
    <image>
      <title>Jasmin Time</title>
      <url>https://tistory1.daumcdn.net/tistory/2204819/attach/04ae49c01d864dfcbac2edbbd6d94d61</url>
      <link>https://freebaer.tistory.com</link>
    </image>
    <item>
      <title>SQL COALESCE 함수 A to Z: NULL이 아닐 때까지 대체값 찾기</title>
      <link>https://freebaer.tistory.com/530</link>
      <description>&lt;h3 data-end=&quot;1672&quot; data-start=&quot;1664&quot; data-ke-size=&quot;size23&quot;&gt;들어가며&lt;/h3&gt;
&lt;p data-end=&quot;1823&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 처리하다 보면 여러 컬럼 중 &lt;b&gt;첫 번째로 값이 존재하는(&amp;ne;NULL)&lt;/b&gt; 컬럼을 골라 쓰고 싶을 때가 있습니다. 이럴 때 쓰기 좋은 함수가 COALESCE입니다. 이번 글에서는 COALESCE의 역할, 문법, 다양한 예제를 통해 활용법을 정리합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1828&quot; data-start=&quot;1825&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1847&quot; data-start=&quot;1830&quot; data-ke-size=&quot;size23&quot;&gt;1. COALESCE란?&lt;/h3&gt;
&lt;p data-end=&quot;1910&quot; data-start=&quot;1849&quot; data-ke-size=&quot;size16&quot;&gt;COALESCE(expr1, expr2[, expr3, &amp;hellip;]) 함수는 인자들을 왼쪽부터 순서대로 검사하여,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1976&quot; data-start=&quot;1912&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1943&quot; data-start=&quot;1912&quot;&gt;&lt;b&gt;첫 번째로 NULL이 아닌 값&lt;/b&gt;을 반환&lt;/li&gt;
&lt;li data-end=&quot;1976&quot; data-start=&quot;1944&quot;&gt;모두 NULL이면 &amp;rarr; &lt;b&gt;NULL&lt;/b&gt; 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1987&quot; data-start=&quot;1978&quot; data-ke-size=&quot;size16&quot;&gt;하는 함수입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1992&quot; data-start=&quot;1989&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2006&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size23&quot;&gt;2. 기본 문법&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751509381430&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;COALESCE(값1, 값2, 값3, &amp;hellip;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2047&quot; data-start=&quot;2044&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2061&quot; data-start=&quot;2049&quot; data-ke-size=&quot;size23&quot;&gt;3. 실전 예제&lt;/h3&gt;
&lt;h4 data-end=&quot;2084&quot; data-start=&quot;2063&quot; data-ke-size=&quot;size20&quot;&gt;예제 테이블: orders&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T0Xhb/btsO17P6TZJ/iZbR6wBdq7kXPA3mijHON1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T0Xhb/btsO17P6TZJ/iZbR6wBdq7kXPA3mijHON1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T0Xhb/btsO17P6TZJ/iZbR6wBdq7kXPA3mijHON1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT0Xhb%2FbtsO17P6TZJ%2FiZbR6wBdq7kXPA3mijHON1%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;782&quot; height=&quot;227&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;3-1) 우선순위 메모 가져오기&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751509415990&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  order_id,
  COALESCE(customer_memo, admin_note, default_note) AS final_note
FROM orders;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2686&quot; data-start=&quot;2558&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2686&quot; data-start=&quot;2558&quot;&gt;&lt;b&gt;해설&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2686&quot; data-start=&quot;2571&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2605&quot; data-start=&quot;2571&quot;&gt;customer_memo가 있으면 &amp;rarr; 그 값 사용&lt;/li&gt;
&lt;li data-end=&quot;2632&quot; data-start=&quot;2608&quot;&gt;없으면 admin_note 사용&lt;/li&gt;
&lt;li data-end=&quot;2665&quot; data-start=&quot;2635&quot;&gt;그래도 없으면 default_note 사용&lt;/li&gt;
&lt;li data-end=&quot;2686&quot; data-start=&quot;2668&quot;&gt;모두 없으면 &amp;rarr; NULL&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;2703&quot; data-start=&quot;2688&quot; data-ke-size=&quot;size20&quot;&gt;3-2) 실행 결과&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZblCM/btsO0GeWPO6/0xDJG81BjyDLnzFFvLL1k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZblCM/btsO0GeWPO6/0xDJG81BjyDLnzFFvLL1k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZblCM/btsO0GeWPO6/0xDJG81BjyDLnzFFvLL1k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZblCM%2FbtsO0GeWPO6%2F0xDJG81BjyDLnzFFvLL1k0%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;558&quot; height=&quot;231&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2871&quot; data-start=&quot;2868&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2885&quot; data-start=&quot;2873&quot; data-ke-size=&quot;size23&quot;&gt;4. 고급 활용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3057&quot; data-start=&quot;2887&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2976&quot; data-start=&quot;2887&quot;&gt;&lt;b&gt;NULLIF와 조합&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2976&quot; data-start=&quot;2887&quot;&gt;COALESCE(NULLIF(col, ''), '기본값') &amp;rarr; 빈 문자열을 NULL화 후 기본값으로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751509455302&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  u.user_id,
  COALESCE(
    NULLIF(p.profile_pic, ''),  -- 빈 문자열을 NULL로 바꿈
    'default.jpg'               -- NULL일 때만 이 값을 사용
  ) AS profile_image
FROM users u
LEFT JOIN profiles p
  ON u.user_id = p.user_id;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이렇게 하면,&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;714&quot; data-start=&quot;589&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;589&quot;&gt;프로필 이미지가 실제 URL인 경우 &amp;rarr; 그대로&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;714&quot; data-start=&quot;620&quot;&gt;빈 문자열('') 또는 NULL인 경우 &amp;rarr; 'default.jpg'로 대체&lt;br /&gt;하여 원하는 &amp;ldquo;빈 문자열도 기본값으로 바꾸는&amp;rdquo; 로직을 구현할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;3214&quot; data-start=&quot;3211&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3223&quot; data-start=&quot;3216&quot; data-ke-size=&quot;size23&quot;&gt;마치며&lt;/h3&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3396&quot; data-start=&quot;3225&quot; data-ke-size=&quot;size16&quot;&gt;COALESCE는 NULL 처리에서 거의 필수적인 함수입니다. 간단하지만 논리적으로 깔끔하게 여러 대체값을 지정할 수 있어, SQL 문을 한결 읽기 쉽고 유지보수하기 좋게 만들어줍니다. 두 함수(NULLIF + COALESCE)를 잘 조합하여 실무에서 NULL 처리 로직을 단순화해보세요!&lt;/p&gt;</description>
      <category>Database</category>
      <category>Coalesce</category>
      <category>SQL</category>
      <category>함수</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/530</guid>
      <comments>https://freebaer.tistory.com/530#entry530comment</comments>
      <pubDate>Thu, 3 Jul 2025 11:24:43 +0900</pubDate>
    </item>
    <item>
      <title>SQL NULLIF 함수 완벽 가이드: 특정 값을 NULL로 대체하기</title>
      <link>https://freebaer.tistory.com/529</link>
      <description>&lt;h3 data-end=&quot;215&quot; data-start=&quot;207&quot; data-ke-size=&quot;size23&quot;&gt;들어가며&lt;/h3&gt;
&lt;p data-end=&quot;359&quot; data-start=&quot;216&quot; data-ke-size=&quot;size16&quot;&gt;SQL을 다루다 보면 &amp;ldquo;특정 값(예: 빈 문자열, 특정 코드 등)을 NULL로 간단히 바꾸고 싶다&amp;rdquo;는 경우가 자주 발생합니다. 이때 유용하게 쓰이는 함수가 바로 NULLIF입니다. 오늘은 NULLIF의 기본 개념부터 실전 예시까지 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;364&quot; data-start=&quot;361&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;381&quot; data-start=&quot;366&quot; data-ke-size=&quot;size23&quot;&gt;1. NULLIF란?&lt;/h3&gt;
&lt;p data-end=&quot;438&quot; data-start=&quot;383&quot; data-ke-size=&quot;size16&quot;&gt;NULLIF(expr1, expr2) 함수는 두 인수 expr1과 expr2를 비교하여,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;507&quot; data-start=&quot;440&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;478&quot; data-start=&quot;440&quot;&gt;expr1 = expr2 이면 &amp;rarr; &lt;b&gt;NULL&lt;/b&gt; 반환&lt;/li&gt;
&lt;li data-end=&quot;507&quot; data-start=&quot;479&quot;&gt;그렇지 않으면 &amp;rarr; &lt;b&gt;expr1&lt;/b&gt; 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;535&quot; data-start=&quot;509&quot; data-ke-size=&quot;size16&quot;&gt;하는 아주 단순하지만 강력한 기능을 제공합니다.&lt;/p&gt;
&lt;hr data-end=&quot;540&quot; data-start=&quot;537&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;554&quot; data-start=&quot;542&quot; data-ke-size=&quot;size23&quot;&gt;2. 기본 문법&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751508956679&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NULLIF(비교할_값1, 비교할_값2)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;594&quot; data-start=&quot;591&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;608&quot; data-start=&quot;596&quot; data-ke-size=&quot;size23&quot;&gt;3. 실전 예제&lt;/h3&gt;
&lt;h4 data-end=&quot;634&quot; data-start=&quot;610&quot; data-ke-size=&quot;size20&quot;&gt;예제 테이블: employees&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgWYl/btsO16jnrt5/p42CfihW3eI7m3e2dQRjjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgWYl/btsO16jnrt5/p42CfihW3eI7m3e2dQRjjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgWYl/btsO16jnrt5/p42CfihW3eI7m3e2dQRjjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgWYl%2FbtsO16jnrt5%2Fp42CfihW3eI7m3e2dQRjjk%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;704&quot; height=&quot;233&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;3-1) 빈 문자열을 NULL로&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751509044271&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
  id,
  name,
  NULLIF(bonus_code, '') AS bonus_code_nullified
FROM employees;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1025&quot; data-start=&quot;934&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1025&quot; data-start=&quot;934&quot;&gt;&lt;b&gt;해설&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1025&quot; data-start=&quot;947&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;989&quot; data-start=&quot;947&quot;&gt;bonus_code가 빈 문자열('')인 경우 &amp;rarr; NULL&lt;/li&gt;
&lt;li data-end=&quot;1025&quot; data-start=&quot;992&quot;&gt;나머지(&amp;lsquo;A1&amp;rsquo;, &amp;lsquo;C3&amp;rsquo;, 실제 NULL)는 그대로&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1042&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size20&quot;&gt;3-2) 실행 결과&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDJgI7/btsO0GeWYSn/cTmGmO55f2kokkrffgEK90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDJgI7/btsO0GeWYSn/cTmGmO55f2kokkrffgEK90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDJgI7/btsO0GeWYSn/cTmGmO55f2kokkrffgEK90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDJgI7%2FbtsO0GeWYSn%2FcTmGmO55f2kokkrffgEK90%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;736&quot; height=&quot;239&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1288&quot; data-start=&quot;1285&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1303&quot; data-start=&quot;1290&quot; data-ke-size=&quot;size23&quot;&gt;4. 활용 포인트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1457&quot; data-start=&quot;1305&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1305&quot;&gt;빈 문자열, 특정 값('UNKNOWN', 'N/A' 등)만 NULL로 바꾸고 싶을 때&lt;/li&gt;
&lt;li data-end=&quot;1403&quot; data-start=&quot;1363&quot;&gt;복잡한 CASE WHEN ... END 없이 간단히 처리 가능&lt;/li&gt;
&lt;li data-end=&quot;1457&quot; data-start=&quot;1404&quot;&gt;다른 함수(COALESCE, ISNULL, NVL)와 조합해서 더욱 강력하게 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1462&quot; data-start=&quot;1459&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1471&quot; data-start=&quot;1464&quot; data-ke-size=&quot;size23&quot;&gt;마치며&lt;/h3&gt;
&lt;p data-end=&quot;1562&quot; data-start=&quot;1473&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 NULLIF의 개념과 간단한 예시를 살펴봤습니다. 참고로 다음 글에서는 이와 매끄럽게 연계해 사용할 수 있는 COALESCE 함수를 다뤄볼 예정입니다!&lt;/p&gt;</description>
      <category>Database</category>
      <category>NULLIF</category>
      <category>SQL</category>
      <category>함수</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/529</guid>
      <comments>https://freebaer.tistory.com/529#entry529comment</comments>
      <pubDate>Thu, 3 Jul 2025 11:18:16 +0900</pubDate>
    </item>
    <item>
      <title>C# 이중 반복문(중첩 루프) 개선 방법</title>
      <link>https://freebaer.tistory.com/528</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;pre id=&quot;code_1751256791987&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;foreach (var item in lists)
{
    foreach (var relation in item.Relations)
    {
        relation.Status = Common.Enums.DataStatus.Unchanged;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 이중 foreach 문이 기능상 문제가 있는 건 아니지만, 좀 더 깔끔하고 현대적인 C# 코드로 바꾸는 방법에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;462&quot; data-start=&quot;432&quot; data-ke-size=&quot;size26&quot;&gt;1. SelectMany로 한 줄에 쭉 펼치기&lt;/h2&gt;
&lt;p data-end=&quot;538&quot; data-start=&quot;464&quot; data-ke-size=&quot;size16&quot;&gt;LINQ의 SelectMany를 이용하면 중첩된 컬렉션을 평탄화(flatten)해서 단일 foreach로 처리할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751257028787&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;foreach (var relation in lists.SelectMany(f =&amp;gt; f.Relations))
{
    relation.Status = Common.Enums.DataStatus.Unchanged;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;773&quot; data-start=&quot;681&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;730&quot; data-start=&quot;681&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: &amp;lsquo;모든 Relation&amp;rsquo;을 한 번에 처리한다는 의도가 명확해집니다.&lt;/li&gt;
&lt;li data-end=&quot;773&quot; data-start=&quot;731&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: LINQ가 익숙하지 않은 팀원에게는 다소 낯설 수 있어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;778&quot; data-start=&quot;775&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;807&quot; data-start=&quot;780&quot; data-ke-size=&quot;size26&quot;&gt;2. List&amp;lt;T&amp;gt;.ForEach 체이닝&lt;/h2&gt;
&lt;p data-end=&quot;887&quot; data-start=&quot;809&quot; data-ke-size=&quot;size16&quot;&gt;만약 Functions와 Relations가 List&amp;lt;T&amp;gt; 타입이라면, ForEach 메서드를 중첩해서 사용할 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751257085186&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lists.ForEach(f =&amp;gt;
    f.Relations.ForEach(r =&amp;gt;
        r.Status = Common.Enums.DataStatus.Unchanged
    )
);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1092&quot; data-start=&quot;1018&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1044&quot; data-start=&quot;1018&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 코드가 아주 간결해집니다.&lt;/li&gt;
&lt;li data-end=&quot;1092&quot; data-start=&quot;1045&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: List&amp;lt;T&amp;gt; 전용이고, 중첩 람다가 가독성을 해칠 수 있어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1097&quot; data-start=&quot;1094&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1133&quot; data-start=&quot;1099&quot; data-ke-size=&quot;size26&quot;&gt;3. 평탄화 후 리스트로 변환하고 ForEach 사용&lt;/h2&gt;
&lt;p data-end=&quot;1212&quot; data-start=&quot;1135&quot; data-ke-size=&quot;size16&quot;&gt;SelectMany로 평탄화한 뒤 ToList()로 즉시 컬렉션을 만들고, List&amp;lt;T&amp;gt;.ForEach를 이어붙이는 방법입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751257115147&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lists
  .SelectMany(f =&amp;gt; f.Relations)
  .ToList()
  .ForEach(r =&amp;gt; r.Status = Common.Enums.DataStatus.Unchanged);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1437&quot; data-start=&quot;1346&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1403&quot; data-start=&quot;1346&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: IEnumerable&amp;lt;T&amp;gt;에도 적용 가능하고, 코드가 플루언트하게 흘러갑니다.&lt;/li&gt;
&lt;li data-end=&quot;1437&quot; data-start=&quot;1404&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 중간에 임시 리스트가 하나 더 생성됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1442&quot; data-start=&quot;1439&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1473&quot; data-start=&quot;1444&quot; data-ke-size=&quot;size26&quot;&gt;4. 범용 ForEach 확장 메서드 만들기&lt;/h2&gt;
&lt;p data-end=&quot;1537&quot; data-start=&quot;1475&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 전반에서 IEnumerable&amp;lt;T&amp;gt;에 ForEach를 쓰고 싶다면, 확장 메서드를 정의해두세요.&lt;/p&gt;
&lt;pre id=&quot;code_1751257150930&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static class EnumerableExtensions
{
    public static void ForEach&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source, Action&amp;lt;T&amp;gt; action)
    {
        foreach (var item in source)
            action(item);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1537&quot; data-start=&quot;1475&quot; data-ke-size=&quot;size16&quot;&gt;이제 이렇게 쓸 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751257171290&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lists
  .SelectMany(f =&amp;gt; f.Relations)
  .ForEach(r =&amp;gt; r.Status = Common.Enums.DataStatus.Unchanged);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1989&quot; data-start=&quot;1892&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1954&quot; data-start=&quot;1892&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: List&amp;lt;T&amp;gt;뿐 아니라 모든 IEnumerable&amp;lt;T&amp;gt;에 일관된 스타일 적용 가능!&lt;/li&gt;
&lt;li data-end=&quot;1989&quot; data-start=&quot;1955&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 초기 설정(확장 메서드 추가)이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1994&quot; data-start=&quot;1991&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2015&quot; data-start=&quot;1996&quot; data-ke-size=&quot;size26&quot;&gt;5. 병렬 처리로 속도 높이기&lt;/h2&gt;
&lt;p data-end=&quot;2071&quot; data-start=&quot;2017&quot; data-ke-size=&quot;size16&quot;&gt;데이터 양이 매우 많아서 성능이 관건이라면 PLINQ를 활용해 병렬 처리도 고려해볼 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751257200434&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lists
  .AsParallel()
  .SelectMany(f =&amp;gt; f.Relations)
  .ForAll(r =&amp;gt; r.Status = Common.Enums.DataStatus.Unchanged);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2323&quot; data-start=&quot;2208&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2253&quot; data-start=&quot;2208&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 멀티코어 CPU를 활용해 처리 속도를 끌어올릴 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2323&quot; data-start=&quot;2254&quot;&gt;&lt;b&gt;단점&lt;/b&gt;: 동시성 이슈(스레드 세이프티)를 반드시 검토해야 하고, 소규모 데이터에는 오히려 오버헤드가 될 수 있어요.&lt;/li&gt;
&lt;li data-end=&quot;2323&quot; data-start=&quot;2254&quot;&gt;같이 보면 좋을 내용: &lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;작은&amp;nbsp;루프&amp;nbsp;본문&amp;nbsp;속도&amp;nbsp;개선&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1751257295615&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;방법: 작은 루프 본문 속도 개선 - .NET&quot; data-og-description=&quot;자세히 알아보기: 방법: 작은 루프 본체 속도 향상&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmyeo2/hyZfBTkiMq/7dfYgzxE5bgRoi8bkpFQj1/img.png?width=636&amp;amp;height=300&amp;amp;face=0_0_636_300&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmyeo2/hyZfBTkiMq/7dfYgzxE5bgRoi8bkpFQj1/img.png?width=636&amp;amp;height=300&amp;amp;face=0_0_636_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;방법: 작은 루프 본문 속도 개선 - .NET&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자세히 알아보기: 방법: 작은 루프 본체 속도 향상&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2328&quot; data-start=&quot;2325&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2358&quot; data-start=&quot;2330&quot; data-ke-size=&quot;size26&quot;&gt;마무리: 내 프로젝트에는 어떤 방법이 좋을까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2591&quot; data-start=&quot;2360&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2432&quot; data-start=&quot;2360&quot;&gt;&lt;b&gt;가독성&lt;/b&gt;과 &lt;b&gt;간결함&lt;/b&gt;을 최우선으로 한다면 &amp;rarr; &lt;b&gt;방법 1&lt;/b&gt; (SelectMany + 단일 foreach)&lt;/li&gt;
&lt;li data-end=&quot;2497&quot; data-start=&quot;2433&quot;&gt;&lt;b&gt;람다 체이닝&lt;/b&gt;이 편하고 List&amp;lt;T&amp;gt;만 사용한다면 &amp;rarr; &lt;b&gt;방법 2&lt;/b&gt; (List.ForEach)&lt;/li&gt;
&lt;li data-end=&quot;2549&quot; data-start=&quot;2498&quot;&gt;&lt;b&gt;함수형 스타일&lt;/b&gt;을 전사적으로 도입하고 싶다면 &amp;rarr; &lt;b&gt;방법 4&lt;/b&gt; (확장 메서드)&lt;/li&gt;
&lt;li data-end=&quot;2591&quot; data-start=&quot;2550&quot;&gt;&lt;b&gt;대량 데이터&lt;/b&gt; 성능이 중요하다면 &amp;rarr; &lt;b&gt;방법 5&lt;/b&gt; (병렬 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2736&quot; data-start=&quot;2593&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2736&quot; data-start=&quot;2593&quot; data-ke-size=&quot;size16&quot;&gt;늘 그렇듯, &amp;lt;정답&amp;gt;은 없지만&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2736&quot; data-start=&quot;2593&quot; data-ke-size=&quot;size16&quot;&gt;팀의 코드 스타일, 프로젝트 특성, 성능 요구사항 등을 고려해 가장 적합한 방법을 선택하면 되지 않을까 싶습니다.&lt;/p&gt;</description>
      <category>닷넷/C#</category>
      <category>C#</category>
      <category>이중루프</category>
      <category>중첩 foreach</category>
      <category>중첩 for문</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/528</guid>
      <comments>https://freebaer.tistory.com/528#entry528comment</comments>
      <pubDate>Mon, 30 Jun 2025 13:23:29 +0900</pubDate>
    </item>
    <item>
      <title>C# Dictionary와 LINQ로 구현하는 고객 유형별 상품 타입 필터링 패턴</title>
      <link>https://freebaer.tistory.com/527</link>
      <description>&lt;h2 data-end=&quot;88&quot; data-start=&quot;78&quot; data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;p data-end=&quot;173&quot; data-start=&quot;89&quot; data-ke-size=&quot;size16&quot;&gt;고객 유형(CustomerType)에 따라 시스템에서 제공해야 하는 ItemType 목록을 동적으로 필터링하는 로직을 구현한 경험을 공유합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;311&quot; data-start=&quot;174&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;264&quot; data-start=&quot;174&quot;&gt;&lt;b&gt;목표&lt;/b&gt;: VIP, Regular 등 고객 유형별로 기본 제공되는 상품 타입을 정의하고, 특정 권한(Permission) 값에 따라 필터링 규칙을 적용&lt;/li&gt;
&lt;li data-end=&quot;311&quot; data-start=&quot;265&quot;&gt;&lt;b&gt;장점&lt;/b&gt;: 타입 안전성 보장, 유지보수성 향상, 코드 가독성 및 확장성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;316&quot; data-start=&quot;313&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;330&quot; data-start=&quot;318&quot; data-ke-size=&quot;size26&quot;&gt;2. 요구사항&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;572&quot; data-start=&quot;331&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;417&quot; data-start=&quot;331&quot;&gt;&lt;b&gt;고객 유형별 기본 상품 타입&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;417&quot; data-start=&quot;359&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;378&quot; data-start=&quot;359&quot;&gt;Regular: A, B, C, D&lt;/li&gt;
&lt;li data-end=&quot;417&quot; data-start=&quot;382&quot;&gt;VIP: A, B, E, F, G, H, I, J&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;482&quot; data-start=&quot;418&quot;&gt;&lt;b&gt;Permission이 &amp;ldquo;20&amp;rdquo;인 경우&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;482&quot; data-start=&quot;451&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;482&quot; data-start=&quot;451&quot;&gt;위 허용 목록에 포함된 ItemType만 노출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;483&quot;&gt;&lt;b&gt;그 외 Permission&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;530&quot; data-start=&quot;510&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;510&quot;&gt;전체 ItemType 노출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;531&quot;&gt;향후 &lt;b&gt;고객 유형 추가&lt;/b&gt;나 &lt;b&gt;허용 항목 변경&lt;/b&gt;이 용이해야 함.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;577&quot; data-start=&quot;574&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;594&quot; data-start=&quot;579&quot; data-ke-size=&quot;size26&quot;&gt;3. 설계 아이디어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;880&quot; data-start=&quot;595&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;675&quot; data-start=&quot;595&quot;&gt;고객 유형별 허용 ItemType을 Dictionary&amp;lt;CustomerType, HashSet&amp;lt;ItemType&amp;gt;&amp;gt;로 중앙집중 관리&lt;/li&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;676&quot;&gt;데이터베이스에서 가져온 Code 객체(CodeID: string, Permission: string)를 LINQ로 간단히 필터링&lt;/li&gt;
&lt;li data-end=&quot;821&quot; data-start=&quot;758&quot;&gt;Enum.TryParse + HashSet.Contains 조합으로 엄격한 타입 검증 및 빠른 조회&lt;/li&gt;
&lt;li data-end=&quot;880&quot; data-start=&quot;822&quot;&gt;조건문(Permission != &quot;20&quot; || &amp;hellip;) 하나로 &amp;ldquo;그 외&amp;rdquo; 케이스도 자연스럽게 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;885&quot; data-start=&quot;882&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;901&quot; data-start=&quot;887&quot; data-ke-size=&quot;size26&quot;&gt;4. 주요 코드 예시&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751251918200&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// 고객 타입별 기본 상품 타입 목록을 정의합니다.
/// &amp;lt;/summary&amp;gt;
private readonly Dictionary&amp;lt;CustomerType, HashSet&amp;lt;ItemType&amp;gt;&amp;gt; _allowedItemTypes;

public MyServiceConstructor()
{
    _allowedItemTypes = new()
    {
        [CustomerType.Regular] = new HashSet&amp;lt;ItemType&amp;gt;
        {
            ItemType.A, ItemType.B, ItemType.C, ItemType.D
        },
        [CustomerType.Vip] = new HashSet&amp;lt;ItemType&amp;gt;
        {
            ItemType.A, ItemType.B, ItemType.E, ItemType.F,
            ItemType.G, ItemType.H, ItemType.I, ItemType.J
        }
    };
}

public IEnumerable&amp;lt;ItemType&amp;gt; GetItemTypeList(CustomerType customerType)
{
    // 1) DB에서 전체 코드 리스트 조회
    IEnumerable&amp;lt;Code&amp;gt; codes = _codeService.Value
        .SelectCode(SystemConstants.ModuleTypeA, SystemConstants.CodeTypeA);

    // 2) 고객 유형에 매핑된 허용 목록이 있으면 필터링 적용
    if (_allowedItemTypes.TryGetValue(customerType, out var allowedEnums))
    {
        codes = codes.Where(x =&amp;gt;
            // Permission이 &quot;20&quot;이 아니면 모두 포함
            x.Permission != &quot;20&quot;
            // Permission이 &quot;20&quot;이면, 파싱 성공 &amp;amp; 허용 목록에 포함된 항목만 포함
            || (Enum.TryParse&amp;lt;ItemType&amp;gt;(x.CodeID, ignoreCase: true, out var parsed)
                &amp;amp;&amp;amp; allowedEnums.Contains(parsed))
        );
    }

    // 3) Code &amp;rarr; ItemType 변환
    var result = codes
        .Select(code =&amp;gt; (ItemType)Enum.Parse(typeof(ItemType), code.CodeID, ignoreCase: true))
        .ToList();

    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2334&quot; data-start=&quot;2331&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2349&quot; data-start=&quot;2336&quot; data-ke-size=&quot;size26&quot;&gt;5. 코드 설명&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2749&quot; data-start=&quot;2350&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2460&quot; data-start=&quot;2350&quot;&gt;&lt;b&gt;맵 초기화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2460&quot; data-start=&quot;2368&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2428&quot; data-start=&quot;2368&quot;&gt;생성자에서 Dictionary&amp;lt;CustomerType, HashSet&amp;lt;ItemType&amp;gt;&amp;gt;를 초기화&lt;/li&gt;
&lt;li data-end=&quot;2460&quot; data-start=&quot;2432&quot;&gt;신규 고객 유형 추가 시 이곳만 수정하면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2691&quot; data-start=&quot;2461&quot;&gt;&lt;b&gt;필터 로직&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2691&quot; data-start=&quot;2479&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2518&quot; data-start=&quot;2479&quot;&gt;TryGetValue로 고객 유형에 대한 허용 목록을 가져옴&lt;/li&gt;
&lt;li data-end=&quot;2691&quot; data-start=&quot;2522&quot;&gt;LINQ Where 내부에서 한 줄로 두 가지 케이스를 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2691&quot; data-start=&quot;2567&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2603&quot; data-start=&quot;2567&quot;&gt;x.Permission != &quot;20&quot;: 모든 코드 통과&lt;/li&gt;
&lt;li data-end=&quot;2691&quot; data-start=&quot;2609&quot;&gt;x.Permission == &quot;20&quot;: Enum.TryParse로 CodeID를 ItemType으로 변환 후, 허용 목록 검사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2749&quot; data-start=&quot;2692&quot;&gt;&lt;b&gt;최종 반환&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2749&quot; data-start=&quot;2710&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2749&quot; data-start=&quot;2710&quot;&gt;필터링된 Code 리스트를 ItemType 리스트로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2754&quot; data-start=&quot;2751&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2774&quot; data-start=&quot;2756&quot; data-ke-size=&quot;size26&quot;&gt;6. 장단점 및 확장 포인트&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분장점유의/확장 포인트
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3418&quot; data-start=&quot;2776&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3418&quot; data-start=&quot;2999&quot;&gt;
&lt;tr data-end=&quot;3101&quot; data-start=&quot;2999&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3009&quot; data-start=&quot;2999&quot;&gt;유지보수성&lt;/td&gt;
&lt;td data-end=&quot;3063&quot; data-start=&quot;3009&quot; data-col-size=&quot;md&quot;&gt;중앙집중형 맵으로 허용 항목 관리 &amp;rarr; 변경 시 한 곳만 수정 가능&lt;/td&gt;
&lt;td data-end=&quot;3101&quot; data-start=&quot;3063&quot; data-col-size=&quot;sm&quot;&gt;맵이 커지면 초기화 코드가 길어질 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3209&quot; data-start=&quot;3102&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3113&quot; data-start=&quot;3102&quot;&gt;성능&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;3173&quot; data-start=&quot;3113&quot;&gt;HashSet &amp;rarr; O(1) 포함 검사, Enum.TryParse 오버헤드 최소화&lt;/td&gt;
&lt;td data-end=&quot;3209&quot; data-start=&quot;3173&quot; data-col-size=&quot;sm&quot;&gt;아주 큰 규모(수만 건 이상)라면 DB 레벨 필터링 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3317&quot; data-start=&quot;3210&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3220&quot; data-start=&quot;3210&quot;&gt;타입 안정성&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;3278&quot; data-start=&quot;3220&quot;&gt;string &amp;rarr; enum 파싱 후 검사 &amp;rarr; 잘못된 값 걸러짐&lt;/td&gt;
&lt;td data-end=&quot;3317&quot; data-start=&quot;3278&quot; data-col-size=&quot;sm&quot;&gt;Enum.Parse 실패 시 예외 방지 로직 추가 고민 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3418&quot; data-start=&quot;3318&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3329&quot; data-start=&quot;3318&quot;&gt;확장성&lt;/td&gt;
&lt;td data-end=&quot;3384&quot; data-start=&quot;3329&quot; data-col-size=&quot;md&quot;&gt;신규 CustomerType 추가/허용 목록 변경 손쉽게 대응&lt;/td&gt;
&lt;td data-end=&quot;3418&quot; data-start=&quot;3384&quot; data-col-size=&quot;sm&quot;&gt;고객별 커스텀 로직이 복잡해지면 전략 패턴 도입 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3423&quot; data-start=&quot;3420&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3435&quot; data-start=&quot;3425&quot; data-ke-size=&quot;size26&quot;&gt;7. 결론&lt;/h2&gt;
&lt;p data-end=&quot;3506&quot; data-start=&quot;3436&quot; data-ke-size=&quot;size16&quot;&gt;이 방식은 간단한 사전(Dictionary) + LINQ 조합만으로도 복잡한 비즈니스 로직을 깔끔하게 표현할 수 있었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3621&quot; data-start=&quot;3507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3551&quot; data-start=&quot;3507&quot;&gt;&lt;b&gt;소규모 프로젝트&lt;/b&gt;: 코드 한 줄, 맵 수정만으로 요구사항 반영 가능&lt;/li&gt;
&lt;li data-end=&quot;3621&quot; data-start=&quot;3552&quot;&gt;&lt;b&gt;대규모 시스템&lt;/b&gt;: 이후 DB 매핑 테이블이나 Specification 패턴 등으로 리팩토링해도 기반 아이디어는 동일&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>닷넷/C#</category>
      <category>C#</category>
      <category>dictionary</category>
      <category>LINQ</category>
      <category>패턴</category>
      <category>필터링</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/527</guid>
      <comments>https://freebaer.tistory.com/527#entry527comment</comments>
      <pubDate>Mon, 30 Jun 2025 11:56:48 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 2022를 사용할 때 발생하는 오류, 'VsPackage' 패키지가 제대로 로드되지 않았습니다.</title>
      <link>https://freebaer.tistory.com/526</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제 잘만 사용하던 비주얼 스튜디오가, 오늘도 사용하려니 이런 메시지가 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Ioru/btsJKwVyMWn/3ABttuWkkaNEkrhcHLL9UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Ioru/btsJKwVyMWn/3ABttuWkkaNEkrhcHLL9UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Ioru/btsJKwVyMWn/3ABttuWkkaNEkrhcHLL9UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Ioru%2FbtsJKwVyMWn%2F3ABttuWkkaNEkrhcHLL9UK%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;412&quot; height=&quot;263&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'VsPackage'&amp;nbsp;패키지가&amp;nbsp;제대로&amp;nbsp;로드되지&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;다른 문제가 있다면, 확장 프로그램으로 다국어 리소스 파일을 만드는데 도움이 되는 ResX Manager를 사용 중인데 이게 열리지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으면 없는대로 언어별로 리소스파일 열어서 수정하면 되지만 그것은 너무 불편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 해결하는 것이 좋겠다.&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2529&quot; data-origin-height=&quot;1049&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qXRNJ/btsJK3kPLE1/ksUWjg1f6HMhEKkX9kdWqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qXRNJ/btsJK3kPLE1/ksUWjg1f6HMhEKkX9kdWqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qXRNJ/btsJK3kPLE1/ksUWjg1f6HMhEKkX9kdWqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqXRNJ%2FbtsJK3kPLE1%2FksUWjg1f6HMhEKkX9kdWqK%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;2529&quot; height=&quot;1049&quot; data-origin-width=&quot;2529&quot; data-origin-height=&quot;1049&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메시지만 봐서는 어떻게 해결해야할지 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 메시지 부분만 긁어서 챗지피티에게 물어보자!&lt;/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; Visual Studio &lt;/span&gt;확장을 로드하는 동안 어셈블리 참조 문제가 발생했음을 나타냅니다&lt;span&gt;. &lt;/span&gt;주로 &lt;span&gt;System.Composition.AttributedModel, Version=8.0.0.0 &lt;/span&gt;어셈블리 또는 해당 종속성이 제대로 로드되지 않아 생기는 문제입니다&lt;span&gt;. &lt;/span&gt;이 오류는 어셈블리의 버전 불일치&lt;span&gt;, &lt;/span&gt;어셈블리 파일의 손상 또는 누락된 참조에서 발생할 수 있습니다&lt;span&gt;.&lt;/span&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;&lt;b&gt;&lt;span&gt;1. NuGet &lt;/span&gt;&lt;span&gt;패키지 확인 및 업데이트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;o 프로젝트에서 System.Composition.* 관련 패키지가 제대로 설치되었는지 확인하세요. 최신 버전으로 업데이트하거나 필요한 경우 적절한 버전으로 다운그레이드하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;o Visual&amp;nbsp;Studio에서&amp;nbsp;Tools&amp;nbsp;&amp;gt;&amp;nbsp;NuGet&amp;nbsp;Package&amp;nbsp;Manager&amp;nbsp;&amp;gt;&amp;nbsp;Manage&amp;nbsp;NuGet&amp;nbsp;Packages&amp;nbsp;for&amp;nbsp;Solution으로&amp;nbsp;이동하여&amp;nbsp;설치된&amp;nbsp;패키지를&amp;nbsp;확인하고&amp;nbsp;업데이트하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;2. 패키지 캐시 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;o NuGet 패키지 캐시를 삭제해보고, System.Composition.* 패키지를 다시 설치하세요. 패키지 캐시는 명령 프롬프트에서 다음 명령으로 삭제할 수 있습니다.&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727227275383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nuget locals all -clear&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;3. 어셈블리 바인딩 재지정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;o app.config 또는 web.config 파일에서 어셈블리 바인딩을 추가하여 버전 불일치를 해결할 수 있습니다.&amp;nbsp;&lt;br /&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727227389007&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;runtime&amp;gt;
    &amp;lt;assemblyBinding xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;&amp;gt;
      &amp;lt;dependentAssembly&amp;gt;
        &amp;lt;assemblyIdentity name=&quot;System.Composition.AttributedModel&quot; publicKeyToken=&quot;b03f5f7f11d50a3a&quot; culture=&quot;neutral&quot;/&amp;gt;
        &amp;lt;bindingRedirect oldVersion=&quot;0.0.0.0-8.0.0.0&quot; newVersion=&quot;8.0.0.0&quot;/&amp;gt;
      &amp;lt;/dependentAssembly&amp;gt;
    &amp;lt;/assemblyBinding&amp;gt;
  &amp;lt;/runtime&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;4. Visual Studio &lt;/span&gt;&lt;span&gt;재설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;o Visual&amp;nbsp;Studio에&amp;nbsp;설치된&amp;nbsp;확장이&amp;nbsp;문제일&amp;nbsp;수&amp;nbsp;있으므로,&amp;nbsp;해당&amp;nbsp;확장을&amp;nbsp;제거&amp;nbsp;후&amp;nbsp;다시&amp;nbsp;설치하거나&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;자체를&amp;nbsp;재설치해보세요.&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;.&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;이런 답변을 얻을 수 있었다.&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;안 되는 확장 프로그램 ResX Manager를 제거하고, 다시 설치했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 메시지가 뜨지 않고, ResX Manager도 잘 열린다.&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;'VsPackage' 패키지가 제대로 로드되지 않았습니다. 오류 메시지가 발생될 때는 로그 파일을 확인해서 원인이 되는 패키지나 확장 프로그램을 확인하고 해당 프로그램을 제거하고 다시 설치하면 해결되는 것을 알 수 있었다.&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>기타 정보/정보공유-IT</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/526</guid>
      <comments>https://freebaer.tistory.com/526#entry526comment</comments>
      <pubDate>Wed, 25 Sep 2024 10:38:56 +0900</pubDate>
    </item>
    <item>
      <title>WPF에서 DevExpress의 RichEditControl에서 작업한 데이터를 Spire.Doc을 통해서 문서 파일로 변환 할 때 일어나는 현상 및 해결 방법</title>
      <link>https://freebaer.tistory.com/525</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DevExpress에서는 MS의 워드 프로그램에서 작업하는 것처럼 본인이 WPF로 만드는 프로그램에서도 비슷한 작업을 할 수 있게 해주는 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RichEditControl을 사용하면 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 RichEditControl을 통해서 내용을 바로 문서 파일로 저장할 수 있기 때문에 RichEditControl을 통해서만 텍스트 편집 작업을 하면 Spire.Doc과 같은 문서 작업 전용 라이브러리는 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 내가 현재 유지보수 중인 프로그램은 여러 화면에서 작업한 내용을 취합해서 하나의 문서 파일로 만들어 내어야 한다. 문서 파일은 워드 뿐만 아니라 파워포인트, 엑셀, PDF 등일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 상용 라이브러리 중에서 Spire.Doc을 사용 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 발견&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 내용은 단순 문자열로 되어 있으면 문제가 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 HTML로 되어 있을 때 문제가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RichEditControl에서 반환되는 HTML 데이터 htmlContent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;paragraph.AppendHTML(htmlContent); 와 같이 Spire.Doc에서 사용을 하면 스타일 변경이 제대로 되지 않는 문제들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타일 적용이 제대로 안 되는 경우는 글머리 기호나 번호 매기기를 한 경우였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 어떻게 해결해야 할지 아이디어가 떠오르지 않아서 정말 단순하게 접근하여 일부 하드코딩하며 HTML 데이터의 스타일에서 margin의 값을 문자열 파싱했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 될 줄 알았는데, ol 태그가 두번 반복되는 경우에는 잘 안 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 떠오른 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RichEditControl을 통해서 파일로 저장한 것은 서식 스타일이 틀어지지 않음을 확인하고, 이것을 활용하면 되겠구나 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724833980917&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void ParsingHtml(string html, Section section)
{
    string path = Util.TempPath;
    string fileName = $&quot;Temp_{Util.NewKey()}.docx&quot;;
    string filePath = Path.Combine(path, fileName);

    // RichEditControl에서 작업된 데이터는 워드파일로 임시 저장한다.
    var control = new DevExpress.Xpf.RichEdit.RichEditControl();
    control.HtmlText = html;
    control.SaveDocument(filePath, DocumentFormat.OpenXml);

    // 방금 저장된 워드파일을 Spire.Doc을 통해서 가져온다.
    var doc = new Document();
    doc.LoadFromFile(filePath);

    using (MemoryStream htmlStream = new MemoryStream())
    {
        // 문서 내용을 HTML로 변환
        doc.SaveToStream(htmlStream, FileFormat.Html);
        
        htmlStream.Position = 0;

        StreamReader reader = new StreamReader(htmlStream);
        string htmlContent = reader.ReadToEnd();

        // HTML을 새 단락으로 추가
        Paragraph newParagraph = section.AddParagraph();
        newParagraph.AppendHTML(htmlContent);
    }
    
    // 임시 저장한 워드파일 삭제
    Util.RemoveFile(path, fileName);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 코딩을 하여 사용 하니 스타일이 틀어지는 것 하나 없이 잘 변환 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 더 수정할 게 있을까 고민해 보았지만 이것이 최선인 것 같다.&lt;/p&gt;</description>
      <category>닷넷</category>
      <category>C#</category>
      <category>DevExpress</category>
      <category>html to docx</category>
      <category>spire.doc</category>
      <category>WORD</category>
      <category>WPF</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/525</guid>
      <comments>https://freebaer.tistory.com/525#entry525comment</comments>
      <pubDate>Wed, 28 Aug 2024 17:38:54 +0900</pubDate>
    </item>
    <item>
      <title>ISO 26262 기능 안전</title>
      <link>https://freebaer.tistory.com/524</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262는 도로 차량의 기능 안전을 위한 국제 표준입니다. 이 표준은 자동차의 전기 및 전자 시스템의 안전성을 보장하기 위한 지침과 요구 사항을 제공합니다. 다음은 ISO 26262에 대한 상세 개요입니다:&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;&lt;b&gt;제목&lt;/b&gt;: ISO 26262 - 도로 차량 - 기능 안전&lt;/li&gt;
&lt;li&gt;&lt;b&gt;범위&lt;/b&gt;: 이 표준은 승용차에서 생산되는 전기 및 전자 시스템의 기능 안전을 다룹니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 시스템 고장 및 오작동으로 인한 위험을 허용 가능한 수준으로 줄이기 위해 적절한 프로세스와 지침을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ISO 26262의 주요 구성 요소&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;V-모델 프레임워크&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준은 시스템 개발을 위한 V-모델을 따르며, 각 단계에서 철저한 검증 및 검토를 보장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전 수명 주기&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;개념 단계&lt;/b&gt;: 위험 식별 및 평가와 안전 목표 설정을 포함합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 레벨&lt;/b&gt;: 시스템 요구 사항에서 안전 목표를 충족하는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하드웨어 및 소프트웨어 개발&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;소프트웨어 개발&lt;/b&gt;: 소프트웨어의 안전 요구 사항을 정의하고, 안전 목표를 충족하는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생산 및 운영&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;운영 및 서비스&lt;/b&gt;: 차량 운용 중 안전을 유지하기 위한 절차를 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지원 프로세스&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;문서화&lt;/b&gt;: 모든 개발 과정과 결정 사항을 문서화하여 추적 가능성을 확보합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASIL (Automotive Safety Integrity Level)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위험 평가를 통해 시스템의 위험성을 평가하고, 이에 따라 안전 무결성 수준(ASIL)을 할당합니다.&lt;/li&gt;
&lt;li&gt;ASIL은 A부터 D까지 등급이 있으며, D가 가장 높은 안전 요구 사항을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262는 자동차 산업에서 전기 및 전자 시스템의 안전성을 보장하기 위한 중요한 표준으로, 시스템 개발 초기 단계부터 전체 수명 주기 동안 안전을 고려하도록 돕습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;ASIL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASIL(Automotive Safety Integrity Level)은 ISO 26262에서 사용되는 개념으로, 자동차 전기/전자 시스템의 안전성 요구 사항을 정의하고 분류하는 데 사용됩니다. ASIL은 위험 분석을 기반으로 시스템의 고장 또는 오작동이 초래할 수 있는 잠재적인 위험 수준을 평가하여 할당됩니다. ASIL 등급은 A부터 D까지 있으며, D가 가장 높은 안전 요구 사항을 의미합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ASIL의 구성 요소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASIL은 다음 세 가지 요소를 기반으로 결정됩니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Severity (심각도)&lt;/b&gt;: 고장이 발생했을 때의 잠재적인 피해의 심각도를 평가합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S0: 무시할 수 있음&lt;/li&gt;
&lt;li&gt;S1: 경미한 부상&lt;/li&gt;
&lt;li&gt;S2: 중간 정도의 부상&lt;/li&gt;
&lt;li&gt;S3: 생명에 위협이 되는 부상 또는 사망&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exposure (노출도)&lt;/b&gt;: 고장이 발생할 가능성 또는 빈도를 평가합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;E0: 거의 발생하지 않음&lt;/li&gt;
&lt;li&gt;E1: 매우 드물게 발생&lt;/li&gt;
&lt;li&gt;E2: 드물게 발생&lt;/li&gt;
&lt;li&gt;E3: 자주 발생&lt;/li&gt;
&lt;li&gt;E4: 매우 자주 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Controllability (제어 가능성)&lt;/b&gt;: 운전자나 시스템이 고장을 제어하거나 회피할 수 있는 능력을 평가합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C0: 제어 가능함&lt;/li&gt;
&lt;li&gt;C1: 대부분 제어 가능함&lt;/li&gt;
&lt;li&gt;C2: 일부 제어 가능함&lt;/li&gt;
&lt;li&gt;C3: 거의 제어 불가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ASIL 등급&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 세 가지 요소를 조합하여 ASIL 등급을 결정합니다. ASIL 등급은 다음과 같이 정의됩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;QM (Quality Management)&lt;/b&gt;: 기능 안전과 관련이 없는 시스템 (최소한의 안전 요구 사항)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASIL A&lt;/b&gt;: 낮은 안전 요구 사항&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASIL B&lt;/b&gt;: 중간 수준의 안전 요구 사항&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASIL C&lt;/b&gt;: 높은 안전 요구 사항&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASIL D&lt;/b&gt;: 매우 높은 안전 요구 사항&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ASIL 평가 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 브레이크 시스템의 고장을 평가할 때:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;심각도 (Severity)&lt;/b&gt;: 브레이크 고장은 심각한 사고로 이어질 수 있으므로 S3 (생명에 위협이 되는 부상 또는 사망)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;노출도 (Exposure)&lt;/b&gt;: 차량이 주행 중에 브레이크 고장이 발생할 확률은 E4 (매우 자주 발생)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제어 가능성 (Controllability)&lt;/b&gt;: 고속 주행 중 브레이크 고장은 운전자가 제어하기 매우 어렵기 때문에 C3 (거의 제어 불가능함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 브레이크 시스템의 ASIL 등급은 ASIL D로 평가될 가능성이 큽니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ASIL 등급에 따른 요구 사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 ASIL 등급은 시스템의 개발, 검증, 검토 과정에서 요구되는 안전성 활동과 절차의 수준을 정의합니다. 등급이 높을수록 더욱 엄격한 요구 사항이 적용됩니다. 예를 들어, ASIL D 시스템은 다음과 같은 활동이 필요할 수 있습니다:&lt;/p&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;li&gt;다중 오류 검출 및 대처 메커니즘 설계&lt;/li&gt;
&lt;li&gt;광범위한 검증 및 검토 활동&lt;/li&gt;
&lt;li&gt;엄격한 문서화 및 추적 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262는 이러한 ASIL 등급을 통해 차량 전기/전자 시스템의 안전성을 체계적으로 관리하고, 고장 또는 오작동으로 인한 위험을 최소화하는 것을 목표로 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;ISO 26262의 최신동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262의 최신 동향은 자동차 산업의 빠르게 변화하는 기술과 요구에 따라 지속적으로 발전하고 있습니다. 주요 최신 동향은 다음과 같습니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 전기 및 자율주행 차량에 대한 초점 확대&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**전기차(EV)**와 **자율주행차(AV)**의 증가로 인해 ISO 26262는 이러한 새로운 기술의 특수한 요구 사항을 반영하도록 업데이트되고 있습니다. 특히, 자율주행 시스템의 복잡성과 고도화된 전기 시스템에 대한 안전 요구 사항이 강조되고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배터리 관리 시스템(BMS)&lt;/b&gt;: 전기차의 핵심인 배터리 관리 시스템의 안전성 평가와 관리를 위한 요구 사항이 강화되고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;센서와 알고리즘&lt;/b&gt;: 자율주행차의 센서와 인공지능 알고리즘의 신뢰성과 안전성을 보장하기 위한 새로운 지침이 추가되고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 사이버 보안과 기능 안전의 통합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ISO/SAE 21434&lt;/b&gt;와의 연계: 사이버 보안 표준인 ISO/SAE 21434와의 연계를 통해 기능 안전과 사이버 보안의 통합적인 접근이 강화되고 있습니다. 이는 차량 시스템이 사이버 공격에 대한 저항력을 갖추도록 하기 위함입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 위협 모델링&lt;/b&gt;: 기능 안전 분석에 보안 위협 모델링을 포함시켜, 시스템이 잠재적인 사이버 공격으로부터 안전하도록 설계하는 것이 중요해지고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 소프트웨어 업데이트 및 무선 통신(OTA) 기능 강화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;무선 업데이트(OTA)&lt;/b&gt;: 차량 소프트웨어의 무선 업데이트 기능이 중요해짐에 따라, ISO 26262는 OTA 업데이트의 안전성을 보장하기 위한 요구 사항을 강화하고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실시간 소프트웨어 검증&lt;/b&gt;: 소프트웨어 업데이트 후 실시간으로 시스템의 안전성을 검증하고, 문제가 발생할 경우 신속하게 복구할 수 있는 메커니즘이 중요해지고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 기능 안전과 시스템 엔지니어링의 통합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모델 기반 개발(MBD)&lt;/b&gt;: 시스템의 복잡성이 증가함에 따라 모델 기반 개발 접근법이 강조되고 있습니다. 이는 시스템 설계와 안전 분석을 통합하여 개발 효율성을 높이고, 오류를 조기에 발견할 수 있도록 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디지털 트윈&lt;/b&gt;: 물리적 시스템의 디지털 트윈을 사용하여 시스템 동작을 시뮬레이션하고, 기능 안전 요구 사항을 검증하는 방법이 발전하고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 국제적 협력과 표준의 조화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;글로벌 표준화&lt;/b&gt;: ISO 26262는 다른 국제 표준과의 조화를 통해 글로벌 자동차 제조사들이 다양한 지역의 법규를 준수할 수 있도록 돕고 있습니다. 이는 글로벌 시장에서의 호환성과 규정 준수를 촉진합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속적인 업데이트&lt;/b&gt;: 최신 기술 발전과 산업 요구 사항을 반영하기 위해 표준은 주기적으로 업데이트되고 있습니다. 새로운 판이 발행되면서 최신 기술과 방법론이 포함되고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 기능 안전 문화의 확산&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;기업 문화&lt;/b&gt;: 기능 안전을 기업 문화의 일환으로 내재화하여, 제품 개발 전 과정에서 안전성을 최우선으로 고려하는 접근법이 확산되고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 최신 동향은 ISO 26262가 계속해서 변화하는 자동차 산업의 요구를 반영하고, 안전성을 유지하며, 새로운 기술을 통합할 수 있도록 발전하고 있음을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;분석 기법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262은 자동차 산업을 위한 기능적 안전성 표준으로, 여러 가지 분석 기법을 요구합니다. 주요 분석 기법들은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;위험 분석과 평가 (Hazard Analysis and Risk Assessment, HARA)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템에서 발생할 수 있는 위험 요소를 식별하고 그 위험을 평가하는 과정입니다. ISO 26262에서는 이 과정을 통해 가능한 모든 위험을 분류하고, 이들 위험에 대한 필요한 안전 기능을 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능적 안전성 요구 사항 (Functional Safety Requirements)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HARA를 통해 도출된 위험 요소들에 대한 안전 기능을 명시하고, 이를 시스템 설계와 개발 과정에 반영합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결함 트리 분석 (Fault Tree Analysis, FTA)&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;실증적 안전성 (Empirical Safety)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 시스템이나 컴포넌트를 실험하거나, 테스트하거나, 분석하여 안전성을 평가하는 기법을 포함합니다. 예를 들어, 기능적 안전성 시험 (Functional Safety Testing)과 같은 방법이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변별력 분석 (Determination of Safety Integrity Level, SIL Determination)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SIL 결정은 시스템이나 컴포넌트에 요구되는 안전성 수준을 평가하고 정의하는 과정입니다. SIL은 장애나 결함에 대한 예방, 탐지, 제어 기능의 중요성을 반영합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;심리적 실험 (Psychological Testing)&lt;/b&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;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 분석 기법들은 ISO 26262에서 시스템의 기능적 안전성을 평가하고 개발하는 데 중요한 역할을 합니다. 각 기법은 특정 단계에서 필요한 정보를 제공하며, 전체적으로 시스템의 안전성을 보장하기 위해 조합하여 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ISO 26262 표준을 위한 지원 서비스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컨설팅 및 교육&lt;/b&gt;: ISO 26262 표준을 이해하고 적용하는 데 필요한 전문 지식을 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안전 분석 도구&lt;/b&gt;: HARA, FMEA, STPA 등 안전 분석을 지원하는 소프트웨어 도구.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시뮬레이션 및 테스트&lt;/b&gt;: 시스템의 안전성을 검증하기 위한 HIL 및 시뮬레이션 솔루션.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인증 서비스&lt;/b&gt;: 시스템이 ISO 26262 요구 사항을 충족하는지 확인하고 인증을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262 표준을 준수하려는 기업들은 이러한 지원 서비스를 활용하여 시스템의 기능 안전성을 보장하고, 개발 과정에서의 위험을 최소화할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;몇 가지 ISO 26262 도입 사례&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 현대자동차 (Hyundai Motor Company)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대자동차는 ISO 26262를 안전 및 신뢰성 평가의 중요한 기준으로 채택하고 있습니다. ISO 26262의 접근법을 통해 차량의 전기/전자 시스템에 대한 안전성을 평가하고, 잠재적인 위험을 분석하여 안전한 제품을 개발하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 벤츠 (Mercedes-Benz)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메르세데스-벤츠는 자사의 차량 전기 및 전자 시스템에 ISO 26262를 적용하여 안전성을 최적화하고 있습니다. ISO 26262는 메르세데스-벤츠의 차량 개발 및 생산 과정에서 중요한 요소로 포함되어 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 일본의 자동차 제조업체들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본의 다양한 자동차 제조업체들도 ISO 26262를 적극적으로 도입하고 있습니다. 토요타, 닛산, 혼다 등 주요 자동차 제조업체들은 ISO 26262를 통해 차량의 안전성을 향상시키고, 국제 시장에서의 경쟁력을 유지하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 자동차 부품 제조업체들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262는 자동차 부품 제조업체들 사이에서도 널리 적용되고 있습니다. 예를 들어, 자동차의 브레이크 시스템, 제동 시스템, 주행 보조 시스템 등에 사용되는 부품들은 ISO 26262를 준수하여 안전성을 보장하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 전자 제조업체들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 26262는 전자 제조업체들에게도 중요한 기준으로 작용하고 있습니다. 예를 들어, 차량 내부의 전자 제어 장치(ECU) 제조업체들은 ISO 26262를 준수하여 제품의 안전성을 검증하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 ISO 26262 도입 사례들은 자동차 산업 전반에서 기능 안전성을 강화하고, 고객들에게 안전하고 신뢰할 수 있는 제품을 제공하기 위한 중요한 노력의 일환으로 볼 수 있습니다.&lt;/p&gt;</description>
      <category>기타 정보/업무관련</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/524</guid>
      <comments>https://freebaer.tistory.com/524#entry524comment</comments>
      <pubDate>Mon, 15 Jul 2024 14:11:22 +0900</pubDate>
    </item>
    <item>
      <title>ISO 21434 표준 자동차 사이버 보안</title>
      <link>https://freebaer.tistory.com/523</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 21434는 자동차 사이버 보안의 요구사항과 지침을 제공하는 국제 표준입니다. 이 표준은 자동차 산업에서 사이버 보안 리스크를 관리하고, 보안 사고를 방지하며, 자동차의 전자 시스템을 보호하기 위한 체계적인 접근 방식을 정의합니다. ISO 21434는 자동차의 전자제어장치(ECU), 소프트웨어, 네트워크 통신 등을 포함한 전체 라이프사이클 동안의 사이버 보안을 다룹니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 내용&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;범위와 목적&lt;/b&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;li&gt;보안 요구사항을 식별하고, 리스크를 분석하며, 적절한 보안 대책을 마련.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용어와 정의&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;사이버 보안 관리&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;위험 평가와 분석&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;제품 개발 보안&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;운영 및 유지보수 보안&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;보안 사건 대응&lt;/b&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;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ISO 21434의 중요성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&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;b&gt;안전과 보안&lt;/b&gt;: 자동차의 보안 취약점은 안전 문제로 직결될 수 있어, 사이버 보안은 자동차 안전의 필수 요소로 자리잡았습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;규제 준수&lt;/b&gt;: 많은 국가와 지역에서 자동차 사이버 보안에 대한 규제를 강화하고 있으며, ISO 21434는 이러한 규제를 충족시키는 데 도움을 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 21434는 자동차 제조사, 부품 공급업체, 소프트웨어 개발자 등 자동차 생태계 전반에 걸쳐 사이버 보안을 강화하기 위한 표준으로, 자동차 산업의 신뢰성과 안전성을 높이는 데 기여합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 21434 표준을 준수하기 위해 다양한 서비스가 제공됩니다. 이러한 서비스는 주로 자동차 제조사, 부품 공급업체, 소프트웨어 개발자 등을 대상으로 하며, 사이버 보안 리스크를 효과적으로 관리하고 대응할 수 있도록 돕습니다. 주요 서비스는 다음과 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;컨설팅 서비스&lt;/b&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;b&gt;사이버 보안 전략 수립&lt;/b&gt;: 기업의 사이버 보안 전략을 수립하고, ISO 21434 요구사항을 충족시키기 위한 맞춤형 계획을 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위협 분석 및 리스크 평가&lt;/b&gt;: 자동차 시스템의 위협을 식별하고 리스크를 평가하여, 필요한 보안 대책을 제안합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;교육 및 훈련&lt;/b&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;b&gt;ISO 21434 교육 프로그램&lt;/b&gt;: 표준에 대한 이해를 높이기 위해 전문가들이 제공하는 교육 과정입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사이버 보안 인식 교육&lt;/b&gt;: 직원들이 사이버 보안의 중요성과 기본 원칙을 이해할 수 있도록 교육합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;보안 아키텍처 및 설계 서비스&lt;/b&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;b&gt;보안 설계 검토&lt;/b&gt;: 자동차 시스템의 보안 설계를 검토하고, 취약점을 식별하여 개선 방안을 제시합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 요구사항 정의&lt;/b&gt;: 시스템 개발 초기 단계에서 보안 요구사항을 정의하고, 이를 설계에 반영합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;보안 테스트 및 평가&lt;/b&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;b&gt;침투 테스트 (Penetration Testing)&lt;/b&gt;: 자동차 시스템의 취약점을 발견하기 위해 모의 해킹 테스트를 수행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 검증&lt;/b&gt;: 시스템이 보안 요구사항을 충족하는지 확인하기 위해 다양한 보안 검증 테스트를 실시합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;위협 탐지 및 대응 서비스&lt;/b&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;b&gt;실시간 위협 모니터링&lt;/b&gt;: 자동차 시스템의 보안 상태를 실시간으로 모니터링하고, 이상 징후를 탐지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사이버 사건 대응&lt;/b&gt;: 보안 사고 발생 시 신속하게 대응할 수 있도록 사건 대응 계획을 수립하고 실행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;보안 업데이트 및 유지보수&lt;/b&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;b&gt;보안 패치 관리&lt;/b&gt;: 발견된 보안 취약점을 해결하기 위해 보안 패치를 관리하고, 배포합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정기 보안 점검&lt;/b&gt;: 주기적으로 시스템의 보안 상태를 점검하고, 최신 보안 트렌드에 맞게 업데이트합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;컴플라이언스 지원&lt;/b&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;b&gt;규제 준수 평가&lt;/b&gt;: ISO 21434 및 관련 규제 요구사항에 대한 준수 여부를 평가합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;감사 준비&lt;/b&gt;: 외부 감사나 인증을 준비하기 위해 필요한 문서화 작업과 내부 감사 서비스를 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. &lt;b&gt;제품 수명주기 관리&lt;/b&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;b&gt;보안 수명주기 관리&lt;/b&gt;: 제품의 전체 수명주기 동안 보안 요구사항을 관리하고, 각 단계에서 필요한 보안 활동을 수행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 사후 관리&lt;/b&gt;: 제품 출시 후 발생하는 보안 문제를 지속적으로 모니터링하고, 대응합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 서비스를 통해 자동차 제조사와 관련 업체들은 ISO 21434의 요구사항을 효과적으로 준수하고, 자동차 시스템의 사이버 보안을 강화할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;TARA&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TARA(Threat Analysis and Risk Assessment)는 사이버 보안 분야에서 중요한 개념으로, 특히 ISO 21434 표준에 따라 자동차 산업에서 널리 사용됩니다. TARA는 시스템의 보안 리스크를 체계적으로 식별하고 평가하는 방법론을 제공하여, 보안 위협에 대한 대응 전략을 수립하는 데 도움을 줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TARA의 주요 요소&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;자산 식별 (Asset Identification)&lt;/b&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;li&gt;자산의 중요성을 평가하여 보호 우선순위를 결정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위협 식별 (Threat Identification)&lt;/b&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;li&gt;위협 목록을 작성하고, 각 위협의 특성과 발생 가능성을 분석합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;취약점 식별 (Vulnerability Identification)&lt;/b&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;li&gt;취약점이 위협과 어떻게 연결되는지 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위험 평가 (Risk Assessment)&lt;/b&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;li&gt;리스크 평가 모델을 사용하여 각 위협의 영향을 정량화하고 우선순위를 정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대응 전략 수립 (Mitigation Strategy)&lt;/b&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;li&gt;보안 대책을 설계하고, 구현 계획을 수립합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TARA의 절차&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;준비 단계&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트의 범위와 목적을 정의하고, TARA 수행을 위한 팀을 구성합니다.&lt;/li&gt;
&lt;li&gt;필요 시 외부 전문가의 도움을 받을 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자산 및 시스템 이해&lt;/b&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;li&gt;자산의 중요성과 가치를 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위협 모델링&lt;/b&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;li&gt;위협 시나리오를 작성하고, 각 시나리오의 위협 요인을 분석합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;취약점 분석&lt;/b&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;li&gt;취약점의 심각도와 영향을 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리스크 평가&lt;/b&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;li&gt;리스크 매트릭스나 기타 평가 도구를 사용하여 시각적으로 표현합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대응 및 완화&lt;/b&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;li&gt;대책의 효과를 평가하고, 필요한 경우 보완 조치를 계획합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보고 및 문서화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TARA 결과를 문서화하고, 주요 이해관계자에게 보고합니다.&lt;/li&gt;
&lt;li&gt;지속적인 모니터링과 주기적인 재평가를 위한 계획을 수립합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TARA의 중요성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;체계적 접근&lt;/b&gt;: TARA는 체계적인 방법론을 제공하여, 보안 리스크를 종합적으로 관리할 수 있게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사전 예방&lt;/b&gt;: 잠재적인 보안 위협을 미리 식별하고 대응함으로써, 보안 사고를 예방할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 절감&lt;/b&gt;: 사전 대응을 통해 보안 사고로 인한 비용을 줄이고, 효율적인 보안 투자 계획을 수립할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴플라이언스&lt;/b&gt;: ISO 21434 등의 표준과 규제 요구사항을 충족하는 데 도움을 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TARA는 ISO 21434를 준수하는 데 필수적인 도구로, 자동차 산업에서 사이버 보안을 강화하는 데 중요한 역할을 합니다.&lt;/p&gt;</description>
      <category>기타 정보/업무관련</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/523</guid>
      <comments>https://freebaer.tistory.com/523#entry523comment</comments>
      <pubDate>Mon, 15 Jul 2024 11:16:33 +0900</pubDate>
    </item>
    <item>
      <title>NullReferenceException, Null 참조 오류 등 Null 예외 처리에 대한 고찰과 지침서</title>
      <link>https://freebaer.tistory.com/522</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;NullReferenceException 에러가 발생 할 때마다 아, 다음에는 좀 더 꼼꼼하게 확인해야지 해도 시간이 지나면 같은 문제를 겪고는 한다.&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmgBfk/btsIwT5w5vQ/Oztum8nUxZckIwY0Y8Pp00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmgBfk/btsIwT5w5vQ/Oztum8nUxZckIwY0Y8Pp00/img.png&quot; data-alt=&quot;Visual Studio2022에서의 NullReferenceException 오류 메시지 팝업 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmgBfk/btsIwT5w5vQ/Oztum8nUxZckIwY0Y8Pp00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmgBfk%2FbtsIwT5w5vQ%2FOztum8nUxZckIwY0Y8Pp00%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;646&quot; height=&quot;365&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Visual Studio2022에서의 NullReferenceException 오류 메시지 팝업 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 문득 이런 고찰을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 프로그램은 Null인 것을 참조하면 그냥 넘어가지 않고, 기어이 오류 메시지를 뱉어내는 걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;왜 Null 참조 오류를 무시 하지 못 하게 하는 걸까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;○ 그 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Null 객체에 접근하려고 하면 메모리 접근 오류가 발생하여 프로그램이 비정상적으로 종료되거나 프로그램의 성격에 따라서 데이터 손실, 보안 문제 등을 일으킬 수 있다. 이러한 문제는 심각한 버그를 야기한다. 이를 방지하고 예방하기 위해 개발자에게 문제를 인지시키는 방법이자, 오류 메시지를 출력하고 그 이후의 동작을 중단시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 이 오류가 메시지 조차 뜨지 않고 무시가 된 채로 프로그램이 정상적으로 실행이 된다면 Null 참조가 일어나는 곳에서 데이터 누수가 일어난다거나 생각치 못 한 문제들이 연쇄적으로 발생하면서 프로그램을 사용하는 사용자들뿐만 아니라 해당 프로그램을 통해 이익을 얻는 사람들에게 불행이 닥쳐올 것이고, 이는 비용 손실 또한 일어날 수 밖에 없다.&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;Null 참조는 무결성을 해치는 심각한 버그이므로, 이 버그가 나타났을 때 프로그램에서 오류를 뱉어내어 개발자가 이를 절대 무시할 수 없게 만들어진 시스템은 개발자 입장에서는 정말 감사한 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 버그를 단순히 try catch로 오류를 무시로 일관하는, 조치를 취하는 누를 범하지 말자.&lt;/p&gt;
&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;pre id=&quot;code_1720757374474&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

class Program
{
    static void Main()
    {
        MyClass obj = null;

        // Null 참조 오류를 무시하고 프로그램 계속 실행
        try
        {
            obj.Method();
        }
        catch
        {
            // 오류를 무시하고 넘어감
        }

        Console.WriteLine(&quot;Program continues execution.&quot;);
    }
}

class MyClass
{
    public void Method()
    {
        Console.WriteLine(&quot;Method called&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 프로그램은 Null 참조 오류를 무시하고 계속 실행되지만, 실제로는 예기치 않은 동작이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720757448897&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

class Program
{
    static void Main()
    {
        MyClass obj = null;

        // Null 참조 오류를 처리하고 프로그램 중단
        try
        {
            obj.Method();
        }
        catch (NullReferenceException ex)
        {
            Console.WriteLine($&quot;NullReferenceException caught: {ex.Message}&quot;);
            // 필요한 경우 프로그램 중단
            Environment.Exit(1);
        }

        Console.WriteLine(&quot;This line will not be executed if an exception occurs.&quot;);
    }
}

class MyClass
{
    public void Method()
    {
        Console.WriteLine(&quot;Method called&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 프로그램은 Null 참조 오류를 감지하고 적절한 메시지를 출력하며 필요 시 프로그램을 중단하여 이후의 예기치 않은 동작을 방지한다.&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;p data-ke-size=&quot;size16&quot;&gt;Null 참조 오류를 무시하지 않고 오류 메시지를 출력하는 것은 프로그램의 안정성과 안전성을 보장하기 위한 중요한 방법이다. 이를 통해 개발자는 문제를 신속하게 파악하고 해결할 수 있으며, 프로그램의 예측 가능한 동작을 유지할 수 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;○ Null 참조 오류 해결 방법&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;● Null 참조 오류를 해결하기 위한 선행 학습, 발생 조건 알기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 객체가 null일 때 인스턴스 멤버에 접근&lt;/p&gt;
&lt;pre id=&quot;code_1720758442377&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyClass obj = null;
obj.Method(); // NullReferenceException 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 컬렉션이 null일 때 접근&lt;/p&gt;
&lt;pre id=&quot;code_1720758341401&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;int&amp;gt; list = null;
int count = list.Count; // NullReferenceException 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 배열 요소가 null일 때 접근&lt;/p&gt;
&lt;pre id=&quot;code_1720758360729&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyClass[] array = new MyClass[10];
MyClass item = array[0];
item.Method(); // NullReferenceException 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 메서드 반환 값이 null일 때 접근&lt;/p&gt;
&lt;pre id=&quot;code_1720758377321&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyClass obj = GetMyClass();
obj.Method(); // GetMyClass가 null을 반환하면 NullReferenceException 발생&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. null 확인: 모든 객체 접근 전에 null인지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1720758520177&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (obj != null)
{
    obj.Method();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Null-conditional 연산자 &quot;?.&quot;: 객체가 null인 경우 null을 반환하고, 그렇지 않으면 멤버에 접근&lt;/p&gt;
&lt;pre id=&quot;code_1720758606049&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;obj?.Method();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Null-coalescing 연산자 &quot;??&quot;: 객체가 null일 경우 기본 값을 제공&lt;/p&gt;
&lt;pre id=&quot;code_1720758656849&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyClass obj = GetMyClass() ?? new MyClass();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Null-coalescing 할당 연산자 &quot;??=&quot;: 객체가 null인 경우 기본 값을 할당&lt;/p&gt;
&lt;pre id=&quot;code_1720758704617&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;obj ??= new MyClass();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. nullable 타입과 null 병합 연산자 사용: nullable 타입을 사용할 때 기본 값을 설정&lt;/p&gt;
&lt;pre id=&quot;code_1720758731753&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int? number = null;
int value = number ?? 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Optional Chaining 사용: &quot;?.&quot; 연산자를 사용하여 객체가 null인지 확인한 후 null이 아니면 멤버에 접근하는 기능&lt;/p&gt;
&lt;pre id=&quot;code_1720758753449&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Person
{
    public string Name { get; set; }
    public Person? Parent { get; set; }
}

var child = new Person { Name = &quot;Child&quot; };
var parent = child.Parent?.Name ?? &quot;Unknown&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. try-catch 블록 사용: 예외가 발생할 수 있는 코드 블록을 감싸서 처리&lt;/p&gt;
&lt;pre id=&quot;code_1720758776160&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try
{
    obj.Method();
}
catch (NullReferenceException ex)
{
    // 예외 처리 코드
    Console.WriteLine(&quot;NullReferenceException caught&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 null 참조 문제를 방지하기 위해 확인하거나 테스트할 수 있는 몇 가지 사항과 방법이 더 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;○ 추가적인 확인 및 테스트 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Nullable Reference Types 사용: C# 8.0부터는 Nullable Reference Types를 사용하여 컴파일 타임에 null 참조 문제를 방지할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1720759590281&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#nullable enable
public class MyClass
{
    public string? NullableProperty { get; set; }
    public string NonNullableProperty { get; set; }

    public MyClass(string nonNullableProperty)
    {
        NonNullableProperty = nonNullableProperty;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Data Annotations 및 Code Contracts 사용: Data Annotations와 Code Contracts를 사용하여 메서드와 속성의 유효성을 검사할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1720759633337&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [Required]
    public string NonNullableProperty { get; set; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Unit Tests 작성: Unit Test를 작성하여 null 참조 예외가 발생하지 않도록 테스트할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1720759655849&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class MyClassTests
{
    [TestMethod]
    public void TestMethod_NullCheck()
    {
        MyClass obj = null;

        Assert.ThrowsException&amp;lt;NullReferenceException&amp;gt;(() =&amp;gt; obj.Method());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Defensive Programming: 가능한 모든 경로에서 null이 발생하지 않도록 방어적인 코딩을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1720759676057&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void Process(MyClass obj)
{
    if (obj == null)
    {
        throw new ArgumentNullException(nameof(obj));
    }

    obj.Method();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Guard Clauses 사용: 메서드 시작 부분에서 인수의 유효성을 검증하는 Guard Clauses를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1720759690113&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void Process(MyClass obj)
{
    _ = obj ?? throw new ArgumentNullException(nameof(obj));
    obj.Method();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>닷넷/C#</category>
      <category>C#</category>
      <category>NullReferenceException</category>
      <category>널 예외 처리</category>
      <category>널 처리</category>
      <category>참조 오류</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/522</guid>
      <comments>https://freebaer.tistory.com/522#entry522comment</comments>
      <pubDate>Fri, 12 Jul 2024 11:26:11 +0900</pubDate>
    </item>
    <item>
      <title>2024년 1회 정보처리기사 실기에 합격하여 쓰는 일기겸 리뷰</title>
      <link>https://freebaer.tistory.com/521</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;일기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월 27일에 정보처리기사 1회 실기시험을 보고 수제비카페에 올라온 자료를 통해 가채점 했을 때에는 60점이 되지 않아서 2회 준비나 해야지 마음먹고 있었다. 합격/불합격 결과날인 6월18일에는 내 주변에 합격한 사람들은 카톡으로 합격 메시지를 받았는데 난 받지를 않아서 아, 역시 불합격이구나 하고 그냥 확인차 큐넷에 들어가서 시험결과를 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbrUho/btsH9197mXs/SrxZ66VFmudKEnkB5ucGKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbrUho/btsH9197mXs/SrxZ66VFmudKEnkB5ucGKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbrUho/btsH9197mXs/SrxZ66VFmudKEnkB5ucGKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbrUho%2FbtsH9197mXs%2FSrxZ66VFmudKEnkB5ucGKk%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;730&quot; height=&quot;276&quot; data-origin-width=&quot;730&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;시험결과에 써있는 것은 분명 합격이었던 것이었다. 이 글자가 너무나 낯설었다.&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPCIv/btsH85Mswqb/2xsSrJuHgfKwr09kmvWiq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPCIv/btsH85Mswqb/2xsSrJuHgfKwr09kmvWiq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPCIv/btsH85Mswqb/2xsSrJuHgfKwr09kmvWiq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPCIv%2FbtsH85Mswqb%2F2xsSrJuHgfKwr09kmvWiq1%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;724&quot; height=&quot;155&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 68점이나!&lt;/p&gt;
&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내 개발자 연차가 8년차인데, 궁극적으로 정보처리기사를 이제서야 딴 이유는 지금 다니는 곳이 기업부설연구소이고, 전담연구요원이 되면 월급에서 비과세 20만원이 추가가 되는 혜택이 있는데 전담연구요원이 되는 자격을 위해 필요해서였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;중소기업 기준으로 자격이 되는 게 더 있긴 한데, MCP와 네트워크관리사2급, 운전면허증이 전부인 내가 전담연구요원이 되는 확실한 방법은 학사 또는 기사 자격이다. 학사는 아직 방통대 3학년이라 멀었고, 당장 가까운 시일에 얻을 수 있는게 기사자격증 중에서도 그나마 만만한 정보처리기사였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필기는 기출문제에서 반 이상 나오기 때문에 책을 따로 살 필요는 없었다. 인터넷에서 쉽게 구할 수 있는 핵심내용위주의 자료들만 보고, 기출문제 5년 이내 전부를 보았을 때 참 쉽다는 생각을 했다.&lt;br /&gt;&lt;br /&gt;실기는 기출문제보다는 중요도가 높은 파트 위주로 공부하라는 조언들을 보며 &lt;span style=&quot;color: #781b33;&quot;&gt;C언어, 자바, 파이썬, SQL 위주로 공부&lt;/span&gt;했다. 그러다 작년 합격자 리뷰 중에 지난 기출문제 중에 나온 게 있다라는 글을 보고 필기 때와 같이 &lt;span style=&quot;color: #781b33;&quot;&gt;5년 이내의 기출문제&lt;/span&gt;들을 꼼꼼히 풀면서 오답노트까지 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;결과적으로 2024년 1회 정보처리기사 실기에서는 지난 기출문제에서 완전 동일한 문제 하나(SQL)와 인덱스 바꿔서 풀어야 하는 문제(파이썬) 이렇게 두 문제가 나와서 매우 도움이 되었다고 할 수 있다.&amp;nbsp;&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 style=&quot;color: #333333;&quot;&gt;강의는 수제비 책을 산 김에 수제비에서 강의까지 끊어서 3분의 2이상 들었다. 지금 생각해보면 수제비 강의 보다는 흥달쌤 강의가 더 좋았을 것 같다. 분명 코딩 문제를 푸는 방법들, 노하우에 대한 강의들은 도움이 된 건 사실이나 개념 부분에서는 귀에 쏙쏙 익혀지지가 않아서 기출문제 위주로만 보게 되었기 때문이다.&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 style=&quot;color: #781b33;&quot;&gt;흥달쌤 강의&lt;span style=&quot;color: #333333;&quot;&gt;는&lt;/span&gt;&lt;/span&gt; 유튜브를 통해서 무료로 올라온 강의만 보았는데 그것만으로도 충분히 많은 도움을 받았다. 라이브 강의까지 해주셨는데&amp;nbsp; 거기서 나온 내용들(서브넷 마스크 계산법 등등)만 공부해도 3문제 이상 맞출 수 있었다. 파이썬에서 인덱스 세는 법도 흥달쌤이 말해준 것이 그냥 자동으로 떠올라서 따라하며 계산했다. 강의가 아무리 내용이 좋아도 강의자가 하는 말이, 그 내용이 귀에 쏙쏙 들어오는게 중요한 것 같다.&lt;/p&gt;
&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;그다음 수제비 책과 강의들 모두 내돈내산이었기에 &lt;span style=&quot;color: #781b33;&quot;&gt;수제비 카페&lt;/span&gt;를 자주 들어갔는데 거기서 올라온 모의고사 문제와 데일리 문제, 그리고 책에 있던 기출문제들을 푼 것도 도움이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY6c5l/btsH9KgwMJg/C8Nw44UD4IClMXUc7WtDw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY6c5l/btsH9KgwMJg/C8Nw44UD4IClMXUc7WtDw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY6c5l/btsH9KgwMJg/C8Nw44UD4IClMXUc7WtDw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY6c5l%2FbtsH9KgwMJg%2FC8Nw44UD4IClMXUc7WtDw1%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;844&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무리 외워도 외워지지 않는 개념들, 단어 같은 거랑 꼭 외워야 하는 영단어 위주의 것들을 VOCA 앱을 설치해서 일일이 책을 보며 적었는데, 그걸 스마트폰에서 시간 확인할 때마다 보고, 그냥 쉴 때마다 보고, 스마트폰으로 게임이나 소설보기 전에 보고 또 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것도 참 많은 도움이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 디자인패턴은 확실하게 외웠고, 응집도와 결합도도 외웠다. 실제 코딩할 때 이부분을 신경쓰며 하게 되기도 했다.&lt;/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;&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;size18&quot;&gt;&lt;u&gt;한줄평&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실적으로 도움이 되는 자격증이라는 것을 차치하더라도, 정보처리기사 시험이 여전히 실무와 동떨어지는 문제들이 있다곤 하나, 내 경험상 나에게는 시험 준비를 하면서 부족했던 기본기를 조금이나 채울 수 있었고, 개발일을 하며 같은 실수를 반복하는 일에 대해 테스트를 어떻게 해야할지 막막했던 게 사실인데 정보처리기사 시험과목에 테스트에 대한 게 있어서 세세하게 공부한 덕분에 실무에도 도움이 된 것은 사실이므로 개발자로 살아가기 위해 공부를 어떻게 해야할지 모르는 사람들에게는 학습을 위해서, 대학을 졸업하는 이들에게는 그동안의 학습 한 것들에 대한 테스트 겸 보면 좋을 자격증이지 않나 싶다.&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 정보/자격증</category>
      <category>1회</category>
      <category>2024년</category>
      <category>리뷰</category>
      <category>실기</category>
      <category>정보처리기사</category>
      <category>합격</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/521</guid>
      <comments>https://freebaer.tistory.com/521#entry521comment</comments>
      <pubDate>Mon, 24 Jun 2024 16:11:10 +0900</pubDate>
    </item>
    <item>
      <title>WPF DevExpress LayoutPanel의 header에 custom button 놓기</title>
      <link>https://freebaer.tistory.com/520</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DevExpress LayoutPanel의 header에 custom button 놓기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://supportcenter.devexpress.com/ticket/details/t919567/add-new-buttons-to-layoutpanel-header-that-has-look-and-feel-of-pin-and-close-buttons&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://supportcenter.devexpress.com/ticket/details/t919567/add-new-buttons-to-layoutpanel-header-that-has-look-and-feel-of-pin-and-close-buttons&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.LayoutPanel&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.LayoutPanel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.LayoutPanel._members&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.LayoutPanel._members&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.BaseLayoutItem.ControlBoxContent?utm_source=SupportCenter&amp;amp;utm_medium=website&amp;amp;utm_campaign=docs-feedback&amp;amp;utm_content=T665596&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/DevExpress.Xpf.Docking.BaseLayoutItem.ControlBoxContent?utm_source=SupportCenter&amp;amp;utm_medium=website&amp;amp;utm_campaign=docs-feedback&amp;amp;utm_content=T665596&lt;/a&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;/p&gt;
&lt;pre id=&quot;code_1713768767326&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dxdo:LayoutPanel.ControlBoxContentTemplate&amp;gt;
    &amp;lt;DataTemplate&amp;gt;
        &amp;lt;dxve:DockPaneControlBoxButton ToolTip=&quot;이미지 새창 열기&quot;
                                        Command=&quot;{DXBinding '@FindAncestor($UserControl).DataContext.ShowImageWindowCommand'}&quot;&amp;gt;
            &amp;lt;Image Source=&quot;{dx:DXImage 'Images/Actions/ImportImage_16x16.png'}&quot; /&amp;gt;                                       
        &amp;lt;/dxve:DockPaneControlBoxButton&amp;gt;
    &amp;lt;/DataTemplate
&amp;lt;/dxdo:LayoutPanel.ControlBoxContentTemplate&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blGZkn/btsGQWPmomf/emT7ZcIwb0IKQCsmpHci0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blGZkn/btsGQWPmomf/emT7ZcIwb0IKQCsmpHci0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blGZkn/btsGQWPmomf/emT7ZcIwb0IKQCsmpHci0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblGZkn%2FbtsGQWPmomf%2FemT7ZcIwb0IKQCsmpHci0K%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;386&quot; height=&quot;180&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>닷넷/WPF</category>
      <category>C#</category>
      <category>Custom Button</category>
      <category>DevExpress</category>
      <category>LayoutPanel</category>
      <category>WPF</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/520</guid>
      <comments>https://freebaer.tistory.com/520#entry520comment</comments>
      <pubDate>Mon, 22 Apr 2024 15:58:00 +0900</pubDate>
    </item>
    <item>
      <title>C# WPF, WinForm DevExpress GridControl 붙여넣기 기능</title>
      <link>https://freebaer.tistory.com/519</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;devexpress GridControl에 복사한 것 붙여넣기 Clipboard 관련&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. WinForm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Grid.GridView.ClipboardRowPasting&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Grid.GridView.ClipboardRowPasting&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. WPF&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 클립보드 데이터를 그리드컨트롤 칼럼과 로우에 맞춰서 데이터 들어가는 형식으로 전달 받아 사용 할 수 있음, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;붙여넣기 아예 취소 가능&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Xpf.Grid.TableView.ClipboardRowPasting&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/DevExpress.Xpf.Grid.TableView.ClipboardRowPasting&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) 붙여넣기 완료 후 데이터별 처리할 때 &lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Xpf.Grid.TableView.ClipboardRowCellValuePasting&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/DevExpress.Xpf.Grid.TableView.ClipboardRowCellValuePasting&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/119756/controls-and-libraries/data-grid/data-editing-and-validation/clipboard-management/paste-operations&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.devexpress.com/WPF/119756/controls-and-libraries/data-grid/data-editing-and-validation/clipboard-management/paste-operations&lt;/a&gt;&lt;/p&gt;</description>
      <category>닷넷/WPF</category>
      <category>C#</category>
      <category>DevExpress</category>
      <category>WinForm</category>
      <category>WPF</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/519</guid>
      <comments>https://freebaer.tistory.com/519#entry519comment</comments>
      <pubDate>Mon, 22 Apr 2024 15:49:26 +0900</pubDate>
    </item>
    <item>
      <title>WPF Binding Path에 관하여 (바인딩 경로)</title>
      <link>https://freebaer.tistory.com/518</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jasmintime.com/465&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.04.07 - [닷넷/WPF] - C# WPF에서 Binding(바인딩)이란?&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712577547312&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C# WPF에서 Binding(바인딩)이란?&quot; data-og-description=&quot;WPF에서는 MVVM 패턴을 지키는 게 중요합니다. 개인적으로 생각하기에는 이 MVVM 패턴대로 만들지 않을 것이라면 개발 속도로 봤을 때나 유지보수 적으로 봤을 때나 그냥 윈폼(WinForms)으로 만드는게&quot; data-og-host=&quot;jasmintime.com&quot; data-og-source-url=&quot;https://jasmintime.com/465&quot; data-og-url=&quot;https://jasmintime.com/465&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yainr/hyVJ1Xc3dX/lGghkkAGWJWl1Tv7Sy8C1k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b6a5RH/hyVMQ7zQgd/9JLnKM4VxqaKxZo9xm9Fc1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jasmintime.com/465&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jasmintime.com/465&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yainr/hyVJ1Xc3dX/lGghkkAGWJWl1Tv7Sy8C1k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b6a5RH/hyVMQ7zQgd/9JLnKM4VxqaKxZo9xm9Fc1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C# WPF에서 Binding(바인딩)이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WPF에서는 MVVM 패턴을 지키는 게 중요합니다. 개인적으로 생각하기에는 이 MVVM 패턴대로 만들지 않을 것이라면 개발 속도로 봤을 때나 유지보수 적으로 봤을 때나 그냥 윈폼(WinForms)으로 만드는게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jasmintime.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전글을 통해서 WPF에서 데이터 바인딩은 UI 요소와 데이터 소스 간의 연결을 쉽게 설정할 수 있는 기능임을 알 수 있습니다. 이 바인딩을 잘 쓰기 위해서는 바인딩 구문을 아는 것이 중요합니다.&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;경로 지정을 어떻게 하느냐에 따라서 자기 자신의 뷰모델이 아닌 부모 요소 혹은 그 외 기타와 연결지을 수 있고, 코드 비하인드 없이 xaml에서 충분히 이벤트 처리를 할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;바인딩 경로 유형&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 속성 바인딩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 이전글에서도 설명한 유형으로 가장 일반적으로 사용되는 유형입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Path는 생략 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712578553107&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;TextBlock Text=&quot;{Binding PropertyName}&quot; /&amp;gt;
&amp;lt;!-- 혹은 --&amp;gt;
&amp;lt;TextBlock Text=&quot;{Binding Path=PropertyName}&quot; /&amp;gt;&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;2. 속성 경로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복합 객체 내의 속성에 바인딩할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Path는 생략 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712579085161&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MyViewModel : ViewModelBase
{
    private Person _person;
    public Person Person
    {
    	get =&amp;gt; _person;
        set =&amp;gt; SetProperty(ref _person, value);
    }
}


public class Person
{
	public string Name {get; set;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1712579126052&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;TextBlock Text=&quot;{Binding Person.Name}&quot; /&amp;gt;
&amp;lt;!-- 혹은 --&amp;gt;
&amp;lt;TextBlock Text=&quot;{Binding Path=Person.Name}&quot; /&amp;gt;&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;3. 인덱서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이나 딕셔너리와 같은 인덱스를 사용하여 바인딩 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712580447917&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ListBox ItemsSource=&quot;{Binding Persons}&quot;&amp;gt;
    &amp;lt;ListBox.ItemTemplate&amp;gt;
        &amp;lt;DataTemplate&amp;gt;
            &amp;lt;TextBlock Text=&quot;{Binding Path=[0]}&quot; /&amp;gt;
        &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;/ListBox.ItemTemplate&amp;gt;
&amp;lt;/ListBox&amp;gt;&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;4. RelativeSource&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대적인 소스를 참조하여 바인딩할 때 사용됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1712580977130&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;TextBlock Text=&quot;{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.Persons[0].Name}&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://learn.microsoft.com/ko-kr/dotnet/desktop/wpf/data/binding-declarations-overview?view=netdesktop-8.0&quot;&gt;바인딩 선언 개요&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://learn.microsoft.com/ko-kr/dotnet/desktop/wpf/advanced/propertypath-xaml-syntax?view=netframeworkdesktop-4.8&amp;amp;viewFallbackFrom=netdesktop-8.0&quot;&gt;PropertyPath&amp;nbsp;XAML&amp;nbsp;구문&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바인딩 경로에 대한 자세한 내용은 위 링크에서 확인할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;바인딩 경로 오류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WPF에서는 바인딩 경로가 잘못 되었을 때 런타임이 실패하지는 않습니다. 따라서 모르고 넘어갈 수도 있는 일을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio 2022에서 WPF를 개발한다면, 바인딩 경로가 잘못 되었을 때 쉽게 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtRh5S/btsGAQ4evod/GkUa6K3OAVrCAtjfAn5Mu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtRh5S/btsGAQ4evod/GkUa6K3OAVrCAtjfAn5Mu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtRh5S/btsGAQ4evod/GkUa6K3OAVrCAtjfAn5Mu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtRh5S%2FbtsGAQ4evod%2FGkUa6K3OAVrCAtjfAn5Mu1%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;596&quot; height=&quot;100&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지와 같이 프로젝트를 빌드하여 실행 하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;바인딩 오류가 있을 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;빨간색 버튼으로 바뀌고,&lt;span&gt; &lt;/span&gt;&lt;/span&gt;바인딩 오류 수를 알려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 클릭하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9j5Ow/btsGAxKE60i/xETRNDkNqI2FIzppnBDIdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9j5Ow/btsGAxKE60i/xETRNDkNqI2FIzppnBDIdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9j5Ow/btsGAxKE60i/xETRNDkNqI2FIzppnBDIdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9j5Ow%2FbtsGAxKE60i%2FxETRNDkNqI2FIzppnBDIdk%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;1122&quot; height=&quot;230&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디에서 오류가 있는지 알 수 있습니다.&lt;/p&gt;</description>
      <category>닷넷/WPF</category>
      <category>Binding</category>
      <category>C#</category>
      <category>Path</category>
      <category>WPF</category>
      <category>경로</category>
      <category>바인딩</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/518</guid>
      <comments>https://freebaer.tistory.com/518#entry518comment</comments>
      <pubDate>Mon, 8 Apr 2024 22:02:22 +0900</pubDate>
    </item>
    <item>
      <title>사이트에서 접속 대기 화면 넘기는 방법 (티켓팅, 원서 접수 할 때 등등)</title>
      <link>https://freebaer.tistory.com/517</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 웹브라우저는 엣지(Microsoft Edge)를 사용합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvL5N0/btsGe84Kt6B/n8E1AeGAaNASvOFlzM2LRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvL5N0/btsGe84Kt6B/n8E1AeGAaNASvOFlzM2LRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvL5N0/btsGe84Kt6B/n8E1AeGAaNASvOFlzM2LRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvL5N0%2FbtsGe84Kt6B%2Fn8E1AeGAaNASvOFlzM2LRK%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;198&quot; height=&quot;60&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 키보드에서 F12를 눌러 DevTools를 엽니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5GMJo/btsGewE3mDm/cd3M6mCJqeCe5aWebkuor1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5GMJo/btsGewE3mDm/cd3M6mCJqeCe5aWebkuor1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5GMJo/btsGewE3mDm/cd3M6mCJqeCe5aWebkuor1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5GMJo%2FbtsGewE3mDm%2Fcd3M6mCJqeCe5aWebkuor1%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;322&quot; height=&quot;405&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. DevTools에서 콘솔을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bndhE8/btsGeQC7Kem/gbO8qDl6tAYPjDkLXXKGpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bndhE8/btsGeQC7Kem/gbO8qDl6tAYPjDkLXXKGpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bndhE8/btsGeQC7Kem/gbO8qDl6tAYPjDkLXXKGpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbndhE8%2FbtsGeQC7Kem%2FgbO8qDl6tAYPjDkLXXKGpK%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;563&quot; height=&quot;106&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. 사이트에서 접속 대기가 뜰 때 콘솔에 복사+붙여넣기는 안 될 수 있으므로 직접 타이핑하여&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;NetFunnel.gControl.next.success({},{data:{}})&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;을 그대로 입력하고 엔터합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b97w31/btsGedMv72r/4vosIkTcWfwMzstGdVsdP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b97w31/btsGedMv72r/4vosIkTcWfwMzstGdVsdP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b97w31/btsGedMv72r/4vosIkTcWfwMzstGdVsdP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb97w31%2FbtsGedMv72r%2F4vosIkTcWfwMzstGdVsdP1%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;558&quot; height=&quot;111&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5. 접속 대기가 사라지고 다음페이지가 뜹니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;6. 접속 대기를 뚫고 페이지에 접근에 성공해도&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;사이트의 서버가 트래픽을 감당을 못 하는 경우에는 타임아웃 페이지가 나올 수 있습니다. 이때는 페이지가 정상적으로 나올 때까지 페이지 새로고침(F5)을 합니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;7. 4~6번은 사이트의 접속 대기 페이지마다 반복 될 수 있습니다.&lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/517</guid>
      <comments>https://freebaer.tistory.com/517#entry517comment</comments>
      <pubDate>Mon, 1 Apr 2024 14:21:33 +0900</pubDate>
    </item>
    <item>
      <title>Sourcetree(소스트리)에서 깃랩의 리포지토리를 Clone 하는 방법</title>
      <link>https://freebaer.tistory.com/516</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소스트리에서는 깃랩의 HTTPS URL을 그대로 복사해서 사용하면 '유효한 소스 경로/URL이 아닙니다' 라고 나오는 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 소스트리에 깃랩의 계정 정보가 없는 경우 혹은 정보가 다른 경우에 해당 URL에 접근할 수 없어서입니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;먼저&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 계정 정보가 있는지 확인하고, 다음의 파일들을 삭제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. C:\Users\{컴퓨터 혹은 계정명}\AppData\Local\Atlassian\SourceTree 폴더에서&lt;br /&gt;&amp;nbsp;&lt;br /&gt;2.&amp;nbsp;passwd&amp;nbsp;파일&amp;nbsp;삭제&lt;br /&gt;&amp;nbsp;&lt;br /&gt;3. userhosts 파일 삭제&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그다음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Clone하려는 깃랩에 있는 리포지토리에서 Code &amp;gt; HTTPS URL을 복사합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eGfqf2/btsGeRhBUBt/pB5ioe12BHarvgIJkuCdiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eGfqf2/btsGeRhBUBt/pB5ioe12BHarvgIJkuCdiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eGfqf2/btsGeRhBUBt/pB5ioe12BHarvgIJkuCdiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeGfqf2%2FbtsGeRhBUBt%2FpB5ioe12BHarvgIJkuCdiK%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;354&quot; height=&quot;189&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 복사한 URL에서 계정명을 추가해서 소스트리에 URL을 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시)&lt;br /&gt;복사한 URL:&amp;nbsp;&amp;nbsp;https://gitlab.com/MySite/repository.git&lt;br /&gt;소스트리에 입력할 URL: https://&lt;span style=&quot;color: #ef5369;&quot;&gt;gitlabusername@&lt;/span&gt;gitlab.com/MySite/repository.git&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnZEyq/btsGhXt7BKy/fpLkiIAhbXoA1iGbXsL6z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnZEyq/btsGhXt7BKy/fpLkiIAhbXoA1iGbXsL6z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnZEyq/btsGhXt7BKy/fpLkiIAhbXoA1iGbXsL6z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnZEyq%2FbtsGhXt7BKy%2FfpLkiIAhbXoA1iGbXsL6z0%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;631&quot; height=&quot;327&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 계정 비밀번호를 입력하라고 나오는데 로그인을 하면 클론 버튼이 활성화되면서 클론을 할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TlsE9/btsGeRorSV5/mp7dwqHP5210NpDf9E5Igk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TlsE9/btsGeRorSV5/mp7dwqHP5210NpDf9E5Igk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TlsE9/btsGeRorSV5/mp7dwqHP5210NpDf9E5Igk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTlsE9%2FbtsGeRorSV5%2Fmp7dwqHP5210NpDf9E5Igk%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;177&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이때, 비밀번호를 잘못 입력하여 로그인이 실패된 경우에는 1번부터 다시 하시면 됩니다.&lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <category>CLONE</category>
      <category>gitlab</category>
      <category>SourceTree</category>
      <category>깃랩</category>
      <category>소스트리</category>
      <category>클론</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/516</guid>
      <comments>https://freebaer.tistory.com/516#entry516comment</comments>
      <pubDate>Mon, 1 Apr 2024 14:05:03 +0900</pubDate>
    </item>
    <item>
      <title>WPF DevExpress 뷰가 로드될 때 특정 컨트롤(TextBox, TextEdit 등등)에 Focus 주는 방법</title>
      <link>https://freebaer.tistory.com/515</link>
      <description>&lt;pre id=&quot;code_1711945677097&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;UserControl ...
    xmlns:dxmvvm=&quot;http://schemas.devexpress.com/winfx/2008/xaml/mvvm&quot;&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;TextBox&amp;gt;
            &amp;lt;dxmvvm:Interaction.Behaviors&amp;gt;
                &amp;lt;dxmvvm:FocusBehavior/&amp;gt;
            &amp;lt;/dxmvvm:Interaction.Behaviors&amp;gt;
        &amp;lt;/TextBox&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/UserControl&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2b2b2b; text-align: start;&quot; data-uid=&quot;DevExpress.Mvvm.UI.FocusBehavior&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 하면 코드 비하인드 없이 포커스를 설정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 외의 자세한 내용은 Devexpress의 문서를 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2b2b2b; text-align: start;&quot; data-uid=&quot;DevExpress.Mvvm.UI.FocusBehavior&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.devexpress.com/WPF/DevExpress.Mvvm.UI.FocusBehavior?utm_source=SupportCenter&amp;amp;utm_medium=website&amp;amp;utm_campaign=docs-feedback&amp;amp;utm_content=T716630&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;FocusBehavior Class&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>닷넷/WPF</category>
      <category>DevExpress</category>
      <category>WPF</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/515</guid>
      <comments>https://freebaer.tistory.com/515#entry515comment</comments>
      <pubDate>Mon, 1 Apr 2024 13:32:09 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 2022 C# 빌드 오류, System.BadImageFormatException: 'Corrupt .resources file. Unable to read resources from this file because of invalid header information. Try regenerating the .resources file.'</title>
      <link>https://freebaer.tistory.com/514</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPFAor/btsGeOZpyfM/2K36seWwZX5YvSsokOOsk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPFAor/btsGeOZpyfM/2K36seWwZX5YvSsokOOsk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPFAor/btsGeOZpyfM/2K36seWwZX5YvSsokOOsk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPFAor%2FbtsGeOZpyfM%2F2K36seWwZX5YvSsokOOsk1%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;662&quot; height=&quot;207&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;System.BadImageFormatException:&amp;nbsp;'Corrupt&amp;nbsp;.resources&amp;nbsp;file.&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;read&amp;nbsp;resources&amp;nbsp;from&amp;nbsp;this&amp;nbsp;file&amp;nbsp;because&amp;nbsp;of&amp;nbsp;invalid&amp;nbsp;header&amp;nbsp;information.&amp;nbsp;Try&amp;nbsp;regenerating&amp;nbsp;the&amp;nbsp;.resources&amp;nbsp;file.'&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3wqnf/btsGeAUDPdT/R2vfKs5B7pbAZDdb262NB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3wqnf/btsGeAUDPdT/R2vfKs5B7pbAZDdb262NB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3wqnf/btsGeAUDPdT/R2vfKs5B7pbAZDdb262NB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3wqnf%2FbtsGeAUDPdT%2FR2vfKs5B7pbAZDdb262NB1%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;307&quot; height=&quot;113&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 프로젝트 우클릭 후 [다시 빌드] 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGeYdA/btsGe7R6B18/lyTACVedtnxoUP86DxsrBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGeYdA/btsGe7R6B18/lyTACVedtnxoUP86DxsrBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGeYdA/btsGe7R6B18/lyTACVedtnxoUP86DxsrBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGeYdA%2FbtsGe7R6B18%2FlyTACVedtnxoUP86DxsrBk%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;342&quot; height=&quot;148&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <category>빌드 오류 해결 방법</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/514</guid>
      <comments>https://freebaer.tistory.com/514#entry514comment</comments>
      <pubDate>Mon, 1 Apr 2024 13:22:59 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio 2022에서 대상 프레임워크 지원 불가로 프로젝트를 못 여는 문제 해결 방법 (.net framework 4.0, 4.5, 4.6, 4.7) Target framework not supported, Download targeting pack</title>
      <link>https://freebaer.tistory.com/513</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Visual Studio 2022를 실행중이라면 프로그램을 종료합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;버전별 각 프레임워크 주소&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.0&amp;nbsp;문제해결 &lt;br /&gt;The&amp;nbsp;C#&amp;nbsp;project&amp;nbsp;~&amp;nbsp;targets&amp;nbsp;.NET&amp;nbsp;Framework&amp;nbsp;4.0,&amp;nbsp;which&amp;nbsp;is&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net40&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net40&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.5&amp;nbsp;문제해결 &lt;br /&gt;The&amp;nbsp;C#&amp;nbsp;project&amp;nbsp;~&amp;nbsp;targets&amp;nbsp;.NET&amp;nbsp;Framework&amp;nbsp;4.5,&amp;nbsp;which&amp;nbsp;is&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net45&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net45&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.5.1&amp;nbsp;문제해결 &lt;br /&gt;The&amp;nbsp;C#&amp;nbsp;project&amp;nbsp;~&amp;nbsp;targets&amp;nbsp;.NET&amp;nbsp;Framework&amp;nbsp;4.5.1,&amp;nbsp;which&amp;nbsp;is&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net451&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net451&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.5.2&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.5.2, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net452&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net452&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.6&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.6, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net46&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net46&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.6.1&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.6.1, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net461&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net461&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.6.2&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.6.2, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net462&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net462&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.7&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.7, which is no longer supported. &lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net47&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net47&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.7.1&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.7.1, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net471&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net471&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio&amp;nbsp;2022에서&amp;nbsp;.Net&amp;nbsp;Framework&amp;nbsp;4.7.2&amp;nbsp;문제해결 &lt;br /&gt;The C# project ~ targets .NET Framework 4.7.2, which is no longer supported. &lt;br /&gt;&lt;a href=&quot;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net472&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuget.org/packages/microsoft.netframework.referenceassemblies.net472&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;1. 필요한 버전으로 위 사이트에서 패키지 파일을 다운로드 받습니다.&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blpCtS/btsF5DwfwRq/iHyrpLttPEPxIiLx9lyfs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blpCtS/btsF5DwfwRq/iHyrpLttPEPxIiLx9lyfs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blpCtS/btsF5DwfwRq/iHyrpLttPEPxIiLx9lyfs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblpCtS%2FbtsF5DwfwRq%2FiHyrpLttPEPxIiLx9lyfs0%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;1175&quot; height=&quot;463&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다운로드 경로에 패키지 파일이 다운로드 되고, unpkg 확장자를 못 여는 경우에는 파일의 확장자를 unpkg에서 zip으로 수정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSXECI/btsF5tHkP8W/9PCpm6vfmp1p12BnImacGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSXECI/btsF5tHkP8W/9PCpm6vfmp1p12BnImacGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSXECI/btsF5tHkP8W/9PCpm6vfmp1p12BnImacGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSXECI%2FbtsF5tHkP8W%2F9PCpm6vfmp1p12BnImacGK%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;885&quot; height=&quot;199&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yVTo5/btsF58vTYKv/FO7kOUE9DMaEXsymhKLnjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yVTo5/btsF58vTYKv/FO7kOUE9DMaEXsymhKLnjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yVTo5/btsF58vTYKv/FO7kOUE9DMaEXsymhKLnjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyVTo5%2FbtsF58vTYKv%2FFO7kOUE9DMaEXsymhKLnjK%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;381&quot; height=&quot;33&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 경고 메시지가 뜨지만 문제는 없으니 예를 클릭하여 변경합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PIDF0/btsF2S2fkye/rjsNIK2dKfHvjxECsFHtLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PIDF0/btsF2S2fkye/rjsNIK2dKfHvjxECsFHtLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PIDF0/btsF2S2fkye/rjsNIK2dKfHvjxECsFHtLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPIDF0%2FbtsF2S2fkye%2FrjsNIK2dKfHvjxECsFHtLK%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;401&quot; height=&quot;148&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다운로드 받은 파일은 압축 파일이기 때문에 압축을 해제합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odpH6/btsF5rCJFdo/BoKw8KfxLXy9sjl2Ec40fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odpH6/btsF5rCJFdo/BoKw8KfxLXy9sjl2Ec40fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odpH6/btsF5rCJFdo/BoKw8KfxLXy9sjl2Ec40fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodpH6%2FbtsF5rCJFdo%2FBoKw8KfxLXy9sjl2Ec40fk%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;614&quot; height=&quot;454&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 압축 해제한 폴더에서 &lt;b&gt;\build\.NETFramework\v4.0 (버전별) 폴더를 복사한 다음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;\Downloads\microsoft.netframework.referenceassemblies.net40.1.0.3\build\.NETFramework\v4.0 ~ v4.7.2&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2Z1rE/btsF6dRozGP/x4Ndk4ySKGkJKGdTJTah50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2Z1rE/btsF6dRozGP/x4Ndk4ySKGkJKGdTJTah50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2Z1rE/btsF6dRozGP/x4Ndk4ySKGkJKGdTJTah50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2Z1rE%2FbtsF6dRozGP%2Fx4Ndk4ySKGkJKGdTJTah50%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;673&quot; height=&quot;208&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C:\Program&amp;nbsp;Files&amp;nbsp;(x86)\Reference&amp;nbsp;Assemblies\Microsoft\Framework\.NETFramework&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 폴더 안에 붙여넣기 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXo15/btsF3oGDtt9/MLV2wiNpF34cHb9ZSSfam0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXo15/btsF3oGDtt9/MLV2wiNpF34cHb9ZSSfam0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXo15/btsF3oGDtt9/MLV2wiNpF34cHb9ZSSfam0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXo15%2FbtsF3oGDtt9%2FMLV2wiNpF34cHb9ZSSfam0%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;618&quot; height=&quot;432&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 아래 이미지처럼 비어 있던 폴더가 복사한 폴더 그대로 채워지면 완료 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5jemv/btsF58o9OZR/Qvr60XW9Zv2WPplBCSF8d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5jemv/btsF58o9OZR/Qvr60XW9Zv2WPplBCSF8d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5jemv/btsF58o9OZR/Qvr60XW9Zv2WPplBCSF8d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5jemv%2FbtsF58o9OZR%2FQvr60XW9Zv2WPplBCSF8d1%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;544&quot; height=&quot;236&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ShbV7/btsF2MOCXxK/LRlplkBd0XWajOdAyLLRD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ShbV7/btsF2MOCXxK/LRlplkBd0XWajOdAyLLRD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ShbV7/btsF2MOCXxK/LRlplkBd0XWajOdAyLLRD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FShbV7%2FbtsF2MOCXxK%2FLRlplkBd0XWajOdAyLLRD1%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;707&quot; height=&quot;488&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Visual Studio 2022를 실행하여 열려던 프로젝트를 열면 잘 될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;참고: &lt;/span&gt;https://devscb.tistory.com/136&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;[SCB개발자이야기:티스토리]&lt;/span&gt;&lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <category>.NET Framework</category>
      <category>download targeting pack</category>
      <category>Target</category>
      <category>Visual Studio 2022</category>
      <category>대상 프레임워크</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/513</guid>
      <comments>https://freebaer.tistory.com/513#entry513comment</comments>
      <pubDate>Mon, 25 Mar 2024 18:27:52 +0900</pubDate>
    </item>
    <item>
      <title>정보처리기사 필기 후기와 실기 준비 전략</title>
      <link>https://freebaer.tistory.com/511</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2024년 1회 정보처리기사 필기 시험을 보고 쓰는 후기.&lt;br /&gt;&lt;br /&gt;시험장에는 시험시간 30분 전에 감독관이 입장하라고 얘기하면 그때 본인 시험실에 입장할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;수험표는&lt;/span&gt;&lt;/b&gt; 시험장 주소와 시험실 번호때문에 필요할 수는 있다. 시험이 끝난 후 실기에 대한 안내도 있기 때문에 수험표는 한번씩은 꼭 확인한다. 그러나 굳이 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;종이로&lt;/b&gt; &lt;b&gt;출력할 필요성은 없다.&lt;/b&gt;&lt;/span&gt; 시험장에서 수험표를 확인하지는 않기 때문이기도 하고, 큐넷 앱으로 확인 할 수도 있기 때문이다.&lt;br /&gt;&lt;br /&gt;시험이 CBT로 바뀌면서 컴퓨터로만 보기 때문에 본인 이름으로 좌석을 확인, 동명이인이 있다면 좌석 컴퓨터 모니터에 수험표 정보와 사진까지 띄워져 있으니 그거 확인하고 본인 좌석에 앉으면 된다.&lt;br /&gt;&lt;br /&gt;그래서 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;시험 준비물은 신분증과&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;검은 볼펜&lt;/span&gt;&lt;/b&gt; 하나만 챙기면 된다. 공학용 계산기는 이것을 쓸 정도의 문제는 나오지 않아서 딱히. &lt;br /&gt;종이는 감독관이 나눠 주는 거를 써야 하며, 이름이랑 좌석번호 작성하고 쓸 수 있다. 이 종이는 나갈 때 제출해야 한다.&lt;br /&gt;&lt;br /&gt;시험시작 20분 전이 되면 책상에는 신분증과 그리고 볼펜만 두고 나머지는 다 가방 안에 넣어 두어야 한다. 전자기기는 무조건 전원을 끈 상태이다.&lt;br /&gt;가방이 없다면 맨 앞에 바구니가 있는데, 감독관이 거기에 놓으라고 한다.&lt;br /&gt;&lt;br /&gt;그리고 안내 방송과 함께 감독관이 한명 씩 확인 한다.&lt;br /&gt;안내 방송에 따라서 안내사항과 유의사항을 정독하고, 연습 문제를 풀어서 CBT시험 체험을 하고, 시스템 상에서의 본인 확인 후 잠시 대기한다.&lt;br /&gt;시험시간 정각이 되면 시험이 시작 된다.&lt;br /&gt;&lt;br /&gt;내가 푼 시험 문제의 반 정도는&amp;nbsp;지난 기출 문제들에서 나왔던 것(개념)들이었고 이 중에서 30%는 완전 동일한 문제였다.&amp;nbsp;2020년부터 2022년도 꺼까지 총 8회의 기출 문제를 풀면서 거기 나온 것 위주로 공부한 것이 많은 도움이 됐다. 나머지 반은 핵심 요약 노트 덕을 보았다.&lt;br /&gt;&lt;br /&gt;어떤 하나를 홍보할 생각은&amp;nbsp;&amp;nbsp;없지만 돈이 아깝지 않았기에, 시험 일주일 전부터는 &lt;b&gt;기출문제 푼 거에서 틀린 것 위주&lt;/b&gt;랑 시험실에 들어가기 전 까지는 &lt;b&gt;꿈꾸는 라이언의 정보처리기사 필기 요약노트&lt;/b&gt;만 보았는데 지난 기출 문제가 아닌 문제들 중에서는 80% 정도가 핵심 요약 노트에 있던 주제와 개념들이었다. 이 요약 노트를 중점으로 내용을 깊이 있게 더 정리해서 공부했다면 90점이상도 맞았을 것 같다.&lt;br /&gt;&lt;br /&gt;시나공 핵심요약 노트는 분량이 많아서 읽다 말았기에 딱히 도움이 되지는 못 했다.&lt;br /&gt;&lt;br /&gt;즉, 기출문제와 개념과 키워드 중심의 자기만의 핵심노트를 만들어서 공부하거나 남이 잘 만든 핵심노트로 공부하는게 시간절약도 되고, 시험도 잘 볼 수 있다.&lt;br /&gt;&lt;br /&gt;문제를 다 풀고, 제출을 하면 확인 창이 두번이나 뜬다.&lt;br /&gt;실수로 누르는 사람 방지와 다시 한번 문제를 확인해보라는 경고와 배려가 느껴졌다.&lt;br /&gt;&lt;br /&gt;그리고 바로 가채점 결과가 나온다.&lt;br /&gt;&lt;br /&gt;나는 평균 79점으로 합격이 나왔다.&lt;br /&gt;불합격 하면 어떡하지 이랬는데, 이전 기출문제들을 풀면서 95점 나온 건 공부를 거의 안했더니 80점이 나오고, 40~60점 나온 과목 위주로 공부했더니 얘네도 70~80점 나오더라.&lt;br /&gt;&lt;br /&gt;공부한만큼 시험을 본 것 같다.&lt;br /&gt;&lt;br /&gt;시험 보기 전에는 불합격하면 어떡하지 걱정했는데 막상 잘 보아서 다행이다.&lt;br /&gt;&lt;br /&gt;합격발표일은 3월 13일 오전 9시이지만 서류 제출해야하는 건 이미 제출해서 심사완료도 받았기 때문에&lt;br /&gt;&lt;br /&gt;이제 실기를 준비해야겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===============&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;실기는 4월 말부터니까 준비 시간이 충분하기에 책을 사서 꼼꼼하게 준비하려고 한다.&lt;br /&gt;&lt;a href=&quot;https://tired-o.github.io/posts/certificate-jcg2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://tired-o.github.io/posts/certificate-jcg2/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;(IT 자격증) 정보처리기사 실기시험 준비 후기와 팁&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;3줄 요약 어떤 시험? 유서깊은 IT 근본 국가공인 자격증 공부법? 중요도 체크, 선택과 집중 이것만은 꼭! SQL, 프로그래밍, 네트워크&quot; data-og-host=&quot;tired-o.github.io&quot; data-og-source-url=&quot;https://tired-o.github.io/posts/certificate-jcg2/&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://tired-o.github.io/posts/certificate-jcg2/&quot;&gt;&lt;a href=&quot;https://tired-o.github.io/posts/certificate-jcg2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tired-o.github.io/posts/certificate-jcg2/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('\'\'');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;(IT 자격증) 정보처리기사 실기시험 준비 후기와 팁&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3줄 요약 어떤 시험? 유서깊은 IT 근본 국가공인 자격증 공부법? 중요도 체크, 선택과 집중 이것만은 꼭! SQL, 프로그래밍, 네트워크&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tired-o.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 후기와 팁을 참고해서 수제비로 구매했다.&lt;br /&gt;과연 어떨지.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===============&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아, 책을 잘못 샀다...&lt;br /&gt;2024년 새로 나온 거를 사야 하는데 쿠팡에서 로켓배송 되는지만 확인하고 구매했더니 2023년 꺼다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvBlZd/btsFz8pqsLJ/GoJKUTQz8rQUNJ56TnSkl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvBlZd/btsFz8pqsLJ/GoJKUTQz8rQUNJ56TnSkl0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvBlZd/btsFz8pqsLJ/GoJKUTQz8rQUNJ56TnSkl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvBlZd%2FbtsFz8pqsLJ%2FGoJKUTQz8rQUNJ56TnSkl0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;667&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;프로그래밍 언어와 SQL 파트가 제일 중요한데, 대충 훑어봤을 때 2023년 버전도 괜찮은 것 같다.&lt;br /&gt;&lt;br /&gt;2023년에 나왔던 기출문제를 중점으로 하는 내용은 빠졌겠지만 그래도 개념은 비슷 할 테니까.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;개념 공부는 책으로 하고, 기출문제에서 나온 코딩 문제들 유형이나 풀이는 유튜브 강의 찾으면 다 나오니까 그거로 보충을 해야겠다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;===============&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;한 달 반!&lt;br /&gt;실기도 한 번에 합격하기를!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타 정보/자격증</category>
      <category>가채점</category>
      <category>정보처리기사</category>
      <category>정처기</category>
      <category>필기</category>
      <category>합격</category>
      <category>후기</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/511</guid>
      <comments>https://freebaer.tistory.com/511#entry511comment</comments>
      <pubDate>Sun, 3 Mar 2024 10:23:21 +0900</pubDate>
    </item>
    <item>
      <title>.NET (닷넷) 8.0 다운로드</title>
      <link>https://freebaer.tistory.com/510</link>
      <description>&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;닷넷8이 없다면, 닷넷8 설치는 아래 링크를 통해 설치하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&quot;&gt;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709279335076&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXCwzV/hyVuhKV482/kp0GWBKzqieRmyX9Byb050/img.png?width=238&amp;amp;height=238&amp;amp;face=0_0_238_238,https://scrap.kakaocdn.net/dn/Bh1hq/hyVumlbzC0/RUzp4qIEmKZIabddlefKM1/img.png?width=459&amp;amp;height=238&amp;amp;face=0_0_459_238&quot; data-og-url=&quot;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&quot; data-og-source-url=&quot;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&quot; data-og-host=&quot;dotnet.microsoft.com&quot; data-og-description=&quot;Linux, macOS 및 Windows용 .NET 8.0 다운로드. .NET은 다양한 유형의 애플리케이션을 빌드하기 위한 무료 크로스 플랫폼 오픈 소스 개발자 플랫폼입니다.&quot; data-og-title=&quot;.NET 8.0 다운로드(Linux, macOS 및 Windows)&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&quot; data-source-url=&quot;https://dotnet.microsoft.com/ko-kr/download/dotnet/8.0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXCwzV/hyVuhKV482/kp0GWBKzqieRmyX9Byb050/img.png?width=238&amp;amp;height=238&amp;amp;face=0_0_238_238,https://scrap.kakaocdn.net/dn/Bh1hq/hyVumlbzC0/RUzp4qIEmKZIabddlefKM1/img.png?width=459&amp;amp;height=238&amp;amp;face=0_0_459_238');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;.NET 8.0 다운로드(Linux, macOS 및 Windows)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Linux, macOS 및 Windows용 .NET 8.0 다운로드. .NET은 다양한 유형의 애플리케이션을 빌드하기 위한 무료 크로스 플랫폼 오픈 소스 개발자 플랫폼입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;dotnet.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IYUNs/btsFsaOTDms/Imus9Rhg7fsTsoLXC653m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IYUNs/btsFsaOTDms/Imus9Rhg7fsTsoLXC653m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IYUNs/btsFsaOTDms/Imus9Rhg7fsTsoLXC653m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIYUNs%2FbtsFsaOTDms%2FImus9Rhg7fsTsoLXC653m1%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;682&quot; height=&quot;75&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mE9E4/btsFkWkCnTw/pj1oLq5lVKh5eLJnRW3XSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mE9E4/btsFkWkCnTw/pj1oLq5lVKh5eLJnRW3XSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mE9E4/btsFkWkCnTw/pj1oLq5lVKh5eLJnRW3XSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmE9E4%2FbtsFkWkCnTw%2Fpj1oLq5lVKh5eLJnRW3XSK%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;468&quot; height=&quot;342&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/096M9/btsFmgwgQVF/BUjQwKjkKMYsYH6aYKRokk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/096M9/btsFmgwgQVF/BUjQwKjkKMYsYH6aYKRokk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/096M9/btsFmgwgQVF/BUjQwKjkKMYsYH6aYKRokk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F096M9%2FbtsFmgwgQVF%2FBUjQwKjkKMYsYH6aYKRokk%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;646&quot; height=&quot;481&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설치되면 완료&lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <category>.net</category>
      <category>.NET Core 8.0</category>
      <category>.NET Windows Desktop Runtime 8.0</category>
      <category>8.0</category>
      <category>SDK</category>
      <category>다운로드</category>
      <category>닷넷</category>
      <category>런타임</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/510</guid>
      <comments>https://freebaer.tistory.com/510#entry510comment</comments>
      <pubDate>Fri, 1 Mar 2024 16:51:13 +0900</pubDate>
    </item>
  </channel>
</rss>