<?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>Sun, 5 Jul 2026 23:39:53 +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>육아휴직 후 복직, 나는 다시 일을 잘할 수 있을까?</title>
      <link>https://freebaer.tistory.com/534</link>
      <description>&lt;p data-end=&quot;141&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;육아휴직 중 문득 이런 생각이 들었다.&lt;/p&gt;
&lt;p data-end=&quot;174&quot; data-start=&quot;143&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;복직해서 내가 예전처럼 일을 잘할 수 있을까?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;284&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;개발자로 일하다가 육아휴직에 들어오면, 단순히 회사에 잠시 쉬다 오는 느낌이 아니다.&lt;br /&gt;매일 코드를 보고, 이슈를 확인하고, 회의하고, 배포하던 리듬에서 벗어나 완전히 다른 생활을 하게 된다.&lt;/p&gt;
&lt;p data-end=&quot;322&quot; data-start=&quot;286&quot; data-ke-size=&quot;size16&quot;&gt;아이를 돌보는 시간은 분명 소중하지만, 한편으로는 불안도 생긴다.&lt;/p&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;기술이 바뀌었으면 어쩌지?&lt;br /&gt;프로젝트 구조가 많이 달라졌으면 어쩌지?&lt;br /&gt;내가 예전만큼 집중하지 못하면 어쩌지?&lt;br /&gt;육아와 일을 병행하면서 회사에 민폐가 되지는 않을까?&lt;/p&gt;
&lt;p data-end=&quot;480&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 복직을 앞두고 내가 느낀 불안과, 그 불안을 줄이기 위해 어떤 준비를 하면 좋을지 정리한 글이다.&lt;/p&gt;
&lt;p data-end=&quot;480&quot; data-start=&quot;421&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;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1IATI/dJMcadoynGU/Rw9Zv3SiP37NmTIHuVKyR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1IATI/dJMcadoynGU/Rw9Zv3SiP37NmTIHuVKyR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1IATI/dJMcadoynGU/Rw9Zv3SiP37NmTIHuVKyR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1IATI%2FdJMcadoynGU%2FRw9Zv3SiP37NmTIHuVKyR0%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;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;485&quot; data-start=&quot;482&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;513&quot; data-start=&quot;487&quot; data-section-id=&quot;4pkvsf&quot;&gt;복직 후 바로 예전처럼 일하지 못해도 괜찮다&lt;/h1&gt;
&lt;p data-end=&quot;549&quot; data-start=&quot;515&quot; data-ke-size=&quot;size16&quot;&gt;육아휴직 후 복직을 생각하면 가장 먼저 드는 걱정은 이것이다.&lt;/p&gt;
&lt;p data-end=&quot;572&quot; data-start=&quot;551&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;내가 일을 잘할 수 있을까?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;574&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 말하면, 할 수 있다고 생각한다.&lt;br /&gt;다만 복직 첫날부터 예전과 같은 속도와 집중력을 기대하는 것은 현실적이지 않다.&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;646&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 단순히 코드를 치는 사람만은 아니다.&lt;br /&gt;프로젝트 구조, 도메인 지식, 업무 히스토리, 팀의 개발 방식, 배포 흐름, 사람들 사이의 암묵적인 규칙까지 함께 이해해야 일을 할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;849&quot; data-start=&quot;755&quot; data-ke-size=&quot;size16&quot;&gt;육아휴직으로 잠시 그 흐름에서 떨어져 있었다면, 복직 직후 느려지는 것은 당연하다.&lt;br /&gt;그건 실력이 사라진 것이 아니라, &lt;b&gt;업무 컨텍스트를 다시 복구하는 과정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;884&quot; data-start=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;그래서 복직 초기에는 스스로를 이렇게 평가해야 할 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1004&quot; data-start=&quot;886&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;906&quot; data-start=&quot;886&quot; data-section-id=&quot;1ol1r2&quot;&gt;예전 속도로 바로 일하고 있는가?&lt;/li&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;907&quot; data-section-id=&quot;ngd8g2&quot;&gt;하루하루 프로젝트 감각을 회복하고 있는가?&lt;/li&gt;
&lt;li data-end=&quot;957&quot; data-start=&quot;933&quot; data-section-id=&quot;1mdvd2i&quot;&gt;모르는 부분을 정리하고 질문하고 있는가?&lt;/li&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;958&quot; data-section-id=&quot;16hbjyu&quot;&gt;작은 업무를 끝까지 완료하고 있는가?&lt;/li&gt;
&lt;li data-end=&quot;1004&quot; data-start=&quot;981&quot; data-section-id=&quot;kvye73&quot;&gt;실수를 줄이는 방식으로 일하고 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1039&quot; data-start=&quot;1006&quot; data-ke-size=&quot;size16&quot;&gt;복직 직후의 기준은 속도가 아니라 &lt;b&gt;회복력&lt;/b&gt;이어야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;1044&quot; data-start=&quot;1041&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1072&quot; data-start=&quot;1046&quot; data-section-id=&quot;1wuy7&quot;&gt;육아휴직 후 복직이 더 어렵게 느껴지는 이유&lt;/h1&gt;
&lt;p data-end=&quot;1112&quot; data-start=&quot;1074&quot; data-ke-size=&quot;size16&quot;&gt;복직이 불안한 이유는 단순히 기술 감각이 떨어졌을까 봐서만은 아니다.&lt;/p&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1114&quot; data-ke-size=&quot;size16&quot;&gt;육아 후 복직은 생활 전체가 바뀌는 일이다.&lt;br /&gt;예전에는 야근을 하거나, 퇴근 후 공부를 하거나, 주말에 부족한 부분을 메울 수 있었다. 하지만 육아를 하면서는 그런 방식이 쉽지 않다.&lt;/p&gt;
&lt;p data-end=&quot;1274&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size16&quot;&gt;아이의 등하원, 병원, 갑작스러운 열, 수면 부족, 집안일, 체력 저하가 모두 업무에 영향을 준다.&lt;/p&gt;
&lt;p data-end=&quot;1347&quot; data-start=&quot;1276&quot; data-ke-size=&quot;size16&quot;&gt;그래서 복직 후에는 예전처럼 &amp;ldquo;시간을 많이 써서 해결하는 방식&amp;rdquo;이 통하지 않을 수 있다.&lt;br /&gt;이제는 더 체계적으로 일해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1374&quot; data-start=&quot;1349&quot; data-ke-size=&quot;size16&quot;&gt;많이 일하는 것보다 중요한 것은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1480&quot; data-start=&quot;1376&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1391&quot; data-start=&quot;1376&quot; data-section-id=&quot;re7ck9&quot;&gt;우선순위를 명확히 정하기&lt;/li&gt;
&lt;li data-end=&quot;1408&quot; data-start=&quot;1392&quot; data-section-id=&quot;lyvzkk&quot;&gt;작은 단위로 업무를 쪼개기&lt;/li&gt;
&lt;li data-end=&quot;1425&quot; data-start=&quot;1409&quot; data-section-id=&quot;100cha0&quot;&gt;진행 상황을 자주 공유하기&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1426&quot; data-section-id=&quot;1x7ibo5&quot;&gt;모르는 것은 오래 붙잡지 않고 질문하기&lt;/li&gt;
&lt;li data-end=&quot;1466&quot; data-start=&quot;1450&quot; data-section-id=&quot;otkndd&quot;&gt;육아 변수를 미리 대비하기&lt;/li&gt;
&lt;li data-end=&quot;1480&quot; data-start=&quot;1467&quot; data-section-id=&quot;jb7eja&quot;&gt;무리해서 버티지 않기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1540&quot; data-start=&quot;1482&quot; data-ke-size=&quot;size16&quot;&gt;육아 후 복직은 능력이 부족해서 어려운 것이 아니라, 관리해야 할 변수가 많아졌기 때문에 어려운 것이다.&lt;/p&gt;
&lt;hr data-end=&quot;1545&quot; data-start=&quot;1542&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1572&quot; data-start=&quot;1547&quot; data-section-id=&quot;1020ep4&quot;&gt;복직 전 준비 1: 기술 감각 다시 깨우기&lt;/h1&gt;
&lt;p data-end=&quot;1613&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size16&quot;&gt;복직 전 가장 먼저 하고 싶은 준비는 개발 감각을 다시 깨우는 것이다.&lt;/p&gt;
&lt;p data-end=&quot;1718&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size16&quot;&gt;다만 너무 많은 것을 한 번에 공부하려고 하면 오히려 불안만 커질 수 있다.&lt;br /&gt;목표는 최신 기술을 완벽하게 따라잡는 것이 아니라, &lt;b&gt;내 손이 다시 코드를 기억하게 만드는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1759&quot; data-start=&quot;1720&quot; data-ke-size=&quot;size16&quot;&gt;C# WPF 개발자라면 다음 항목들을 가볍게 복습해두면 좋을 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1957&quot; data-start=&quot;1761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1771&quot; data-start=&quot;1761&quot; data-section-id=&quot;yfj0ul&quot;&gt;C# 기본 문법&lt;/li&gt;
&lt;li data-end=&quot;1789&quot; data-start=&quot;1772&quot; data-section-id=&quot;wx1wgb&quot;&gt;async / await&lt;/li&gt;
&lt;li data-end=&quot;1798&quot; data-start=&quot;1790&quot; data-section-id=&quot;186wm85&quot;&gt;Task&lt;/li&gt;
&lt;li data-end=&quot;1805&quot; data-start=&quot;1799&quot; data-section-id=&quot;1j3vc1e&quot;&gt;LINQ&lt;/li&gt;
&lt;li data-end=&quot;1813&quot; data-start=&quot;1806&quot; data-section-id=&quot;ca92vg&quot;&gt;예외 처리&lt;/li&gt;
&lt;li data-end=&quot;1822&quot; data-start=&quot;1814&quot; data-section-id=&quot;6x79qc&quot;&gt;파일 입출력&lt;/li&gt;
&lt;li data-end=&quot;1849&quot; data-start=&quot;1823&quot; data-section-id=&quot;ewi7lz&quot;&gt;INotifyPropertyChanged&lt;/li&gt;
&lt;li data-end=&quot;1862&quot; data-start=&quot;1850&quot; data-section-id=&quot;18cq5ja&quot;&gt;ICommand&lt;/li&gt;
&lt;li data-end=&quot;1887&quot; data-start=&quot;1863&quot; data-section-id=&quot;1h9onkb&quot;&gt;ObservableCollection&lt;/li&gt;
&lt;li data-end=&quot;1897&quot; data-start=&quot;1888&quot; data-section-id=&quot;1yqjvcp&quot;&gt;데이터 바인딩&lt;/li&gt;
&lt;li data-end=&quot;1907&quot; data-start=&quot;1898&quot; data-section-id=&quot;ouhur8&quot;&gt;MVVM 구조&lt;/li&gt;
&lt;li data-end=&quot;1920&quot; data-start=&quot;1908&quot; data-section-id=&quot;jrttkt&quot;&gt;이벤트 구독과 해제&lt;/li&gt;
&lt;li data-end=&quot;1930&quot; data-start=&quot;1921&quot; data-section-id=&quot;kpffyf&quot;&gt;null 처리&lt;/li&gt;
&lt;li data-end=&quot;1957&quot; data-start=&quot;1931&quot; data-section-id=&quot;nq0ee1&quot;&gt;nullable reference types&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2024&quot; data-start=&quot;1959&quot; data-ke-size=&quot;size16&quot;&gt;특히 WPF는 View, ViewModel, Command, Service의 흐름을 다시 손에 익히는 것이 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;2074&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size16&quot;&gt;복직 전 거창한 프로젝트를 만들 필요는 없다.&lt;br /&gt;작은 미니 프로젝트 하나면 충분하다.&lt;/p&gt;
&lt;p data-end=&quot;2092&quot; data-start=&quot;2076&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 이런 정도면 좋다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2152&quot; data-start=&quot;2094&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2152&quot; data-start=&quot;2096&quot; data-ke-size=&quot;size16&quot;&gt;간단한 할 일 관리 앱&lt;br /&gt;파일 선택 후 목록을 표시하는 앱&lt;br /&gt;설정값을 저장하고 불러오는 앱&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2193&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size16&quot;&gt;이 작은 프로젝트 안에 다음 요소를 넣어보면 감각 회복에 도움이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2296&quot; data-start=&quot;2195&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2204&quot; data-start=&quot;2195&quot; data-section-id=&quot;ouhur8&quot;&gt;MVVM 구조&lt;/li&gt;
&lt;li data-end=&quot;2217&quot; data-start=&quot;2205&quot; data-section-id=&quot;3nn7b&quot;&gt;버튼 Command&lt;/li&gt;
&lt;li data-end=&quot;2231&quot; data-start=&quot;2218&quot; data-section-id=&quot;1mg2o4l&quot;&gt;TextBox 바인딩&lt;/li&gt;
&lt;li data-end=&quot;2257&quot; data-start=&quot;2232&quot; data-section-id=&quot;2kyram&quot;&gt;ObservableCollection 사용&lt;/li&gt;
&lt;li data-end=&quot;2270&quot; data-start=&quot;2258&quot; data-section-id=&quot;44gmn6&quot;&gt;파일 저장/불러오기&lt;/li&gt;
&lt;li data-end=&quot;2278&quot; data-start=&quot;2271&quot; data-section-id=&quot;ca92vg&quot;&gt;예외 처리&lt;/li&gt;
&lt;li data-end=&quot;2287&quot; data-start=&quot;2279&quot; data-section-id=&quot;1rru0po&quot;&gt;간단한 로그&lt;/li&gt;
&lt;li data-end=&quot;2296&quot; data-start=&quot;2288&quot; data-section-id=&quot;cbxp3l&quot;&gt;비동기 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2365&quot; data-start=&quot;2298&quot; data-ke-size=&quot;size16&quot;&gt;중요한 건 완성도 높은 앱을 만드는 것이 아니다.&lt;br /&gt;&lt;b&gt;코드를 다시 읽고, 쓰고, 실행해보는 경험&lt;/b&gt;을 하는 것이다.&lt;/p&gt;
&lt;hr data-end=&quot;2370&quot; data-start=&quot;2367&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2400&quot; data-start=&quot;2372&quot; data-section-id=&quot;1sn50su&quot;&gt;복직 전 준비 2: 회사 프로젝트 상황 파악하기&lt;/h1&gt;
&lt;p data-end=&quot;2428&quot; data-start=&quot;2402&quot; data-ke-size=&quot;size16&quot;&gt;기술 감각만큼 중요한 것이 회사 업무 감각이다.&lt;/p&gt;
&lt;p data-end=&quot;2471&quot; data-start=&quot;2430&quot; data-ke-size=&quot;size16&quot;&gt;복직 전 가능하다면 현재 프로젝트 상황을 조금이라도 파악해두는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;2491&quot; data-start=&quot;2473&quot; data-ke-size=&quot;size16&quot;&gt;확인하면 좋은 것은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2667&quot; data-start=&quot;2493&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2520&quot; data-start=&quot;2493&quot; data-section-id=&quot;ipc63s&quot;&gt;내가 맡았던 프로젝트가 지금도 유지되고 있는지&lt;/li&gt;
&lt;li data-end=&quot;2535&quot; data-start=&quot;2521&quot; data-section-id=&quot;6beev9&quot;&gt;주요 기능이 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2558&quot; data-start=&quot;2536&quot; data-section-id=&quot;1ppp3tx&quot;&gt;사용 중인 .NET 버전이 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2575&quot; data-start=&quot;2559&quot; data-section-id=&quot;nc15m4&quot;&gt;WPF 구조가 변경되었는지&lt;/li&gt;
&lt;li data-end=&quot;2590&quot; data-start=&quot;2576&quot; data-section-id=&quot;10vgsuo&quot;&gt;배포 방식이 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2610&quot; data-start=&quot;2591&quot; data-section-id=&quot;80f1wb&quot;&gt;Git 브랜치 전략이 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2611&quot; data-section-id=&quot;1vstkl0&quot;&gt;이슈 관리 도구가 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2640&quot; data-start=&quot;2629&quot; data-section-id=&quot;1m6x7s8&quot;&gt;팀원이 바뀌었는지&lt;/li&gt;
&lt;li data-end=&quot;2667&quot; data-start=&quot;2641&quot; data-section-id=&quot;hur6l1&quot;&gt;복직 후 맡을 가능성이 높은 업무가 무엇인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2703&quot; data-start=&quot;2669&quot; data-ke-size=&quot;size16&quot;&gt;복직 1~2주 전쯤 팀장이나 동료에게 가볍게 물어볼 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;복직 전에 업무 적응을 위해 현재 프로젝트 상황을 간단히 파악하고 싶습니다.
제가 복직 후 우선 확인하면 좋을 문서나 최근 변경된 주요 내용이 있을까요?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2858&quot; data-start=&quot;2804&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 물어보는 것은 부담스럽지 않으면서도, 복직을 진지하게 준비하고 있다는 인상을 줄 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2863&quot; data-start=&quot;2860&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2897&quot; data-start=&quot;2865&quot; data-section-id=&quot;vluomj&quot;&gt;복직 전 준비 3: 첫 달 목표를 낮고 현실적으로 잡기&lt;/h1&gt;
&lt;p data-end=&quot;2954&quot; data-start=&quot;2899&quot; data-ke-size=&quot;size16&quot;&gt;복직 첫 달은 성과를 크게 내는 달이라기보다, 다시 시스템에 연결되는 달이라고 생각하는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;2977&quot; data-start=&quot;2956&quot; data-ke-size=&quot;size16&quot;&gt;첫 주의 가장 중요한 목표는 이것이다.&lt;/p&gt;
&lt;p data-end=&quot;3019&quot; data-start=&quot;2979&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;내 로컬 환경에서 프로젝트가 정상적으로 빌드되고 실행되는 것.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3041&quot; data-start=&quot;3021&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 확인해야 할 것들이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3130&quot; data-start=&quot;3043&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3053&quot; data-start=&quot;3043&quot; data-section-id=&quot;gwei92&quot;&gt;개발 PC 세팅&lt;/li&gt;
&lt;li data-end=&quot;3061&quot; data-start=&quot;3054&quot; data-section-id=&quot;1vp3wh5&quot;&gt;계정 권한&lt;/li&gt;
&lt;li data-end=&quot;3070&quot; data-start=&quot;3062&quot; data-section-id=&quot;1xdhla7&quot;&gt;Git 접근&lt;/li&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3071&quot; data-section-id=&quot;10fcl9h&quot;&gt;프로젝트 빌드&lt;/li&gt;
&lt;li data-end=&quot;3088&quot; data-start=&quot;3081&quot; data-section-id=&quot;97j4ut&quot;&gt;로컬 실행&lt;/li&gt;
&lt;li data-end=&quot;3100&quot; data-start=&quot;3089&quot; data-section-id=&quot;1un1cs4&quot;&gt;DB/API 접근&lt;/li&gt;
&lt;li data-end=&quot;3108&quot; data-start=&quot;3101&quot; data-section-id=&quot;3u4zqo&quot;&gt;배포 문서&lt;/li&gt;
&lt;li data-end=&quot;3116&quot; data-start=&quot;3109&quot; data-section-id=&quot;18hgpfr&quot;&gt;최근 커밋&lt;/li&gt;
&lt;li data-end=&quot;3130&quot; data-start=&quot;3117&quot; data-section-id=&quot;esu2mc&quot;&gt;진행 중인 이슈 목록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3173&quot; data-start=&quot;3132&quot; data-ke-size=&quot;size16&quot;&gt;처음부터 큰 기능을 맡으려고 하기보다, 작은 업무부터 시작하는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;3199&quot; data-start=&quot;3175&quot; data-ke-size=&quot;size16&quot;&gt;복직 직후 맡기 좋은 업무는 이런 것들이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3285&quot; data-start=&quot;3201&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3212&quot; data-start=&quot;3201&quot; data-section-id=&quot;akgbc9&quot;&gt;간단한 버그 수정&lt;/li&gt;
&lt;li data-end=&quot;3224&quot; data-start=&quot;3213&quot; data-section-id=&quot;n8k1bc&quot;&gt;UI 텍스트 수정&lt;/li&gt;
&lt;li data-end=&quot;3236&quot; data-start=&quot;3225&quot; data-section-id=&quot;cr25ih&quot;&gt;유효성 검사 추가&lt;/li&gt;
&lt;li data-end=&quot;3244&quot; data-start=&quot;3237&quot; data-section-id=&quot;4r62pk&quot;&gt;로그 추가&lt;/li&gt;
&lt;li data-end=&quot;3255&quot; data-start=&quot;3245&quot; data-section-id=&quot;zvuoz8&quot;&gt;작은 화면 수정&lt;/li&gt;
&lt;li data-end=&quot;3270&quot; data-start=&quot;3256&quot; data-section-id=&quot;hg2w5o&quot;&gt;기존 기능의 작은 개선&lt;/li&gt;
&lt;li data-end=&quot;3285&quot; data-start=&quot;3271&quot; data-section-id=&quot;bjbfgo&quot;&gt;재현 가능한 오류 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3329&quot; data-start=&quot;3287&quot; data-ke-size=&quot;size16&quot;&gt;작은 업무를 안정적으로 끝내면서 다시 신뢰와 감각을 쌓아가는 것이 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;3334&quot; data-start=&quot;3331&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3361&quot; data-start=&quot;3336&quot; data-section-id=&quot;129pmkp&quot;&gt;복직 전 준비 4: 육아 변수에 대한 대비&lt;/h1&gt;
&lt;p data-end=&quot;3391&quot; data-start=&quot;3363&quot; data-ke-size=&quot;size16&quot;&gt;복직 후 가장 큰 변수는 기술보다 육아일 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3483&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;아이가 갑자기 아플 수도 있고, 어린이집에서나 아이를 대신 봐주고 계신 어머니 혹은 이모님에게서 긴급 연락이 올 수도 있다.&lt;br /&gt;밤잠을 설쳐 다음 날 집중이 어려울 수도 있다.&lt;/p&gt;
&lt;p data-end=&quot;3535&quot; data-start=&quot;3485&quot; data-ke-size=&quot;size16&quot;&gt;그래서 복직 전에는 육아와 관련된 긴급 대응 계획을 최대한 구체적으로 정해두는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;3557&quot; data-start=&quot;3537&quot; data-ke-size=&quot;size16&quot;&gt;미리 정해야 할 것들은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3698&quot; data-start=&quot;3559&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3582&quot; data-start=&quot;3559&quot; data-section-id=&quot;p6kpnk&quot;&gt;아이가 아플 때 1차 대응자는 누구인지&lt;/li&gt;
&lt;li data-end=&quot;3597&quot; data-start=&quot;3583&quot; data-section-id=&quot;754sst&quot;&gt;병원은 누가 데려가는지&lt;/li&gt;
&lt;li data-end=&quot;3614&quot; data-start=&quot;3598&quot; data-section-id=&quot;4bckzw&quot;&gt;등원과 하원은 누가 맡는지&lt;/li&gt;
&lt;li data-end=&quot;3636&quot; data-start=&quot;3615&quot; data-section-id=&quot;fk8sqz&quot;&gt;야근이 필요한 날은 어떻게 조율할지&lt;/li&gt;
&lt;li data-end=&quot;3662&quot; data-start=&quot;3637&quot; data-section-id=&quot;n71krk&quot;&gt;긴급 상황에서 도움을 요청할 사람이 있는지&lt;/li&gt;
&lt;li data-end=&quot;3698&quot; data-start=&quot;3663&quot; data-section-id=&quot;1gwksj1&quot;&gt;가족, 배우자, 도우미, 어린이집과 역할 분담이 되어 있는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3748&quot; data-start=&quot;3700&quot; data-ke-size=&quot;size16&quot;&gt;막연히 &amp;ldquo;그때 가서 어떻게든 하자&amp;rdquo;라고 생각하면 대부분의 부담이 나에게 몰릴 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3775&quot; data-start=&quot;3750&quot; data-ke-size=&quot;size16&quot;&gt;가능하면 이렇게 구체적으로 정하는 것이 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;아이가 열이 나면 오전 병원은 배우자가 담당한다.
하원은 기본적으로 배우자가 맡고, 불가피한 날은 미리 공유한다.
중요한 배포일에는 사전에 가족에게 도움을 요청한다.
야근 가능일은 주 1회 이하로 제한한다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3943&quot; data-start=&quot;3906&quot; data-ke-size=&quot;size16&quot;&gt;육아와 일을 병행하려면 개인의 정신력보다 &lt;b&gt;시스템&lt;/b&gt;이 필요하다.&lt;/p&gt;
&lt;hr data-end=&quot;3948&quot; data-start=&quot;3945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3976&quot; data-start=&quot;3950&quot; data-section-id=&quot;1p3myiz&quot;&gt;복직 전 준비 5: 체력과 생활 리듬 맞추기&lt;/h1&gt;
&lt;p data-end=&quot;4017&quot; data-start=&quot;3978&quot; data-ke-size=&quot;size16&quot;&gt;복직은 마음의 문제이기도 하지만, 실제로는 체력의 문제인 경우가 많다.&lt;/p&gt;
&lt;p data-end=&quot;4099&quot; data-start=&quot;4019&quot; data-ke-size=&quot;size16&quot;&gt;수면이 부족하면 집중력이 떨어진다.&lt;br /&gt;아침 준비가 꼬이면 출근 전부터 지친다.&lt;br /&gt;퇴근 후 집안일과 육아가 이어지면 공부할 힘이 남지 않는다.&lt;/p&gt;
&lt;p data-end=&quot;4149&quot; data-start=&quot;4101&quot; data-ke-size=&quot;size16&quot;&gt;그래서 복직 1~2주 전부터는 실제 복직 후 생활에 맞춰 리듬을 조정해보는 것이 좋다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4259&quot; data-start=&quot;4151&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4162&quot; data-start=&quot;4151&quot; data-section-id=&quot;skrsd7&quot;&gt;기상 시간 맞추기&lt;/li&gt;
&lt;li data-end=&quot;4181&quot; data-start=&quot;4163&quot; data-section-id=&quot;40dklx&quot;&gt;아이 등원 준비 시간 체크하기&lt;/li&gt;
&lt;li data-end=&quot;4197&quot; data-start=&quot;4182&quot; data-section-id=&quot;1bmvyv8&quot;&gt;출근 준비 시간 체크하기&lt;/li&gt;
&lt;li data-end=&quot;4224&quot; data-start=&quot;4198&quot; data-section-id=&quot;dm22n2&quot;&gt;출근 또는 재택 시작 시간에 맞춰 리허설하기&lt;/li&gt;
&lt;li data-end=&quot;4237&quot; data-start=&quot;4225&quot; data-section-id=&quot;1w9p38&quot;&gt;저녁 루틴 정리하기&lt;/li&gt;
&lt;li data-end=&quot;4259&quot; data-start=&quot;4238&quot; data-section-id=&quot;nhedo5&quot;&gt;다음 날 준비물을 전날 밤에 챙기기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4298&quot; data-start=&quot;4261&quot; data-ke-size=&quot;size16&quot;&gt;복직 초기에 퇴근 후 공부를 무리하게 계획하지 않는 것도 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;4323&quot; data-start=&quot;4300&quot; data-ke-size=&quot;size16&quot;&gt;현실적인 계획은 이 정도가 좋을 것 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;평일: 하루 20~30분 정도 코드 감각 유지
주말: 1~2시간 정도 정리 또는 미니 프로젝트
복직 첫 달: 무리한 추가 공부 금지&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4475&quot; data-start=&quot;4412&quot; data-ke-size=&quot;size16&quot;&gt;처음부터 모든 것을 잘하려고 하면 금방 지칠 수 있다.&lt;br /&gt;복직 초기에는 지속 가능한 리듬을 만드는 것이 먼저다.&lt;/p&gt;
&lt;hr data-end=&quot;4480&quot; data-start=&quot;4477&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4505&quot; data-start=&quot;4482&quot; data-section-id=&quot;sje1y&quot;&gt;복직 후 첫 주에 물어보면 좋은 질문들&lt;/h1&gt;
&lt;p data-end=&quot;4559&quot; data-start=&quot;4507&quot; data-ke-size=&quot;size16&quot;&gt;복직 후에는 머릿속이 복잡할 수 있다.&lt;br /&gt;그래서 미리 질문 리스트를 만들어두면 도움이 된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 현재 가장 우선순위가 높은 프로젝트는 무엇인가요?
2. 제가 먼저 확인해야 할 문서나 이슈가 있을까요?
3. 최근 주요 구조 변경이 있었나요?
4. 빌드나 배포 방식이 바뀐 부분이 있나요?
5. 제가 처음 맡으면 좋을 작은 업무가 있을까요?
6. 코드 리뷰 방식에 변경이 있나요?
7. 최근 자주 발생한 장애나 버그가 있었나요?
8. 제가 휴직 전 담당했던 기능 중 변경된 부분이 있나요?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4854&quot; data-start=&quot;4795&quot; data-ke-size=&quot;size16&quot;&gt;이런 질문은 내가 모른다는 것을 드러내는 것이 아니라, 업무를 체계적으로 다시 파악하려는 태도를 보여준다.&lt;/p&gt;
&lt;p data-end=&quot;4899&quot; data-start=&quot;4856&quot; data-ke-size=&quot;size16&quot;&gt;모르는 것을 숨기는 것보다, 정확히 확인하고 정리하는 사람이 더 신뢰를 준다.&lt;/p&gt;
&lt;hr data-end=&quot;4904&quot; data-start=&quot;4901&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4921&quot; data-start=&quot;4906&quot; data-section-id=&quot;zs8vb6&quot;&gt;복직 후 일 잘하는 방법&lt;/h1&gt;
&lt;p data-end=&quot;4981&quot; data-start=&quot;4923&quot; data-ke-size=&quot;size16&quot;&gt;복직 후에는 &amp;ldquo;많이 하는 사람&amp;rdquo;이 되려고 하기보다, &amp;ldquo;예측 가능하게 일하는 사람&amp;rdquo;이 되는 것이 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;5063&quot; data-start=&quot;4983&quot; data-ke-size=&quot;size16&quot;&gt;육아와 일을 병행하면 예상치 못한 변수가 생길 수 있다.&lt;br /&gt;그럴수록 업무 진행 상황을 잘 공유하고, 작은 단위로 일을 끝내는 방식이 필요하다.&lt;/p&gt;
&lt;p data-end=&quot;5093&quot; data-start=&quot;5065&quot; data-ke-size=&quot;size16&quot;&gt;복직 후 도움이 될 만한 업무 습관은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5252&quot; data-start=&quot;5095&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5115&quot; data-start=&quot;5095&quot; data-section-id=&quot;n7rqbr&quot;&gt;오늘 할 일은 3개 정도만 정하기&lt;/li&gt;
&lt;li data-end=&quot;5139&quot; data-start=&quot;5116&quot; data-section-id=&quot;z3qvbj&quot;&gt;모르는 것은 오래 붙잡지 말고 질문하기&lt;/li&gt;
&lt;li data-end=&quot;5162&quot; data-start=&quot;5140&quot; data-section-id=&quot;1nkb2y9&quot;&gt;질문 전 내가 확인한 내용을 정리하기&lt;/li&gt;
&lt;li data-end=&quot;5179&quot; data-start=&quot;5163&quot; data-section-id=&quot;udzjen&quot;&gt;진행 상황을 짧게 공유하기&lt;/li&gt;
&lt;li data-end=&quot;5197&quot; data-start=&quot;5180&quot; data-section-id=&quot;87ho98&quot;&gt;마감이 어려우면 빨리 말하기&lt;/li&gt;
&lt;li data-end=&quot;5213&quot; data-start=&quot;5198&quot; data-section-id=&quot;182wrrv&quot;&gt;작은 단위로 PR 올리기&lt;/li&gt;
&lt;li data-end=&quot;5230&quot; data-start=&quot;5214&quot; data-section-id=&quot;vz2ak0&quot;&gt;테스트 결과를 함께 남기기&lt;/li&gt;
&lt;li data-end=&quot;5252&quot; data-start=&quot;5231&quot; data-section-id=&quot;xlkcjl&quot;&gt;퇴근 전 다음 날 할 일을 적어두기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5306&quot; data-start=&quot;5254&quot; data-ke-size=&quot;size16&quot;&gt;질문할 때도 단순히 &amp;ldquo;이거 모르겠어요&amp;rdquo;라고 하기보다, 내가 확인한 내용을 함께 전달하면 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;A 기능에서 오류가 발생해 확인 중입니다.

현재까지 확인한 내용은 다음과 같습니다.

1. B 조건에서만 재현됩니다.
2. 로그상 C 메서드에서 예외가 발생합니다.
3. 최근 D 커밋 이후 발생한 것으로 보입니다.

제가 보기에는 E 방향으로 수정하면 될 것 같은데,
혹시 이 부분과 관련해서 제가 놓친 배경이 있을까요?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5539&quot; data-start=&quot;5502&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 질문하면 업무를 체계적으로 보고 있다는 인상을 줄 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;5544&quot; data-start=&quot;5541&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5561&quot; data-start=&quot;5546&quot; data-section-id=&quot;1aihnai&quot;&gt;복직 전 4주 준비 플랜&lt;/h1&gt;
&lt;p data-end=&quot;5617&quot; data-start=&quot;5563&quot; data-ke-size=&quot;size16&quot;&gt;복직 준비를 막연하게 생각하면 불안해진다.&lt;br /&gt;그래서 4주 정도로 나누어 준비하면 좋을 것 같다.&lt;/p&gt;
&lt;h2 data-end=&quot;5640&quot; data-start=&quot;5619&quot; data-section-id=&quot;6b859a&quot; data-ke-size=&quot;size26&quot;&gt;복직 4주 전: 개발 감각 깨우기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5741&quot; data-start=&quot;5642&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5655&quot; data-start=&quot;5642&quot; data-section-id=&quot;vmv71&quot;&gt;C# 기본 문법 복습&lt;/li&gt;
&lt;li data-end=&quot;5678&quot; data-start=&quot;5656&quot; data-section-id=&quot;kqwgm9&quot;&gt;WPF MVVM 기본 구조 다시 보기&lt;/li&gt;
&lt;li data-end=&quot;5702&quot; data-start=&quot;5679&quot; data-section-id=&quot;lga0ek&quot;&gt;RelayCommand 직접 작성해보기&lt;/li&gt;
&lt;li data-end=&quot;5723&quot; data-start=&quot;5703&quot; data-section-id=&quot;kxcrwy&quot;&gt;간단한 ViewModel 작성하기&lt;/li&gt;
&lt;li data-end=&quot;5741&quot; data-start=&quot;5724&quot; data-section-id=&quot;snkbaj&quot;&gt;하루 30분 정도 코드 읽기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;5766&quot; data-start=&quot;5743&quot; data-section-id=&quot;1szaldg&quot; data-ke-size=&quot;size26&quot;&gt;복직 3주 전: 작은 프로젝트 만들기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5878&quot; data-start=&quot;5768&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5786&quot; data-start=&quot;5768&quot; data-section-id=&quot;1ksz700&quot;&gt;간단한 WPF 앱 하나 만들기&lt;/li&gt;
&lt;li data-end=&quot;5819&quot; data-start=&quot;5787&quot; data-section-id=&quot;1h45i7g&quot;&gt;TextBox, Button, ListBox 바인딩하기&lt;/li&gt;
&lt;li data-end=&quot;5847&quot; data-start=&quot;5820&quot; data-section-id=&quot;15z062u&quot;&gt;ObservableCollection 사용하기&lt;/li&gt;
&lt;li data-end=&quot;5865&quot; data-start=&quot;5848&quot; data-section-id=&quot;w42uym&quot;&gt;파일 저장/불러오기 추가하기&lt;/li&gt;
&lt;li data-end=&quot;5878&quot; data-start=&quot;5866&quot; data-section-id=&quot;zydi4w&quot;&gt;예외 처리 추가하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;5902&quot; data-start=&quot;5880&quot; data-section-id=&quot;117hy4d&quot; data-ke-size=&quot;size26&quot;&gt;복직 2주 전: 업무 상황 확인하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6010&quot; data-start=&quot;5904&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5927&quot; data-start=&quot;5904&quot; data-section-id=&quot;pdo9hx&quot;&gt;회사 프로젝트 변경 사항 확인 요청하기&lt;/li&gt;
&lt;li data-end=&quot;5943&quot; data-start=&quot;5928&quot; data-section-id=&quot;1vhpl08&quot;&gt;사용 기술 버전 확인하기&lt;/li&gt;
&lt;li data-end=&quot;5970&quot; data-start=&quot;5944&quot; data-section-id=&quot;fqivym&quot;&gt;Git, 이슈 관리 방식 변경 여부 확인하기&lt;/li&gt;
&lt;li data-end=&quot;5991&quot; data-start=&quot;5971&quot; data-section-id=&quot;1csyu4&quot;&gt;복직 후 맡을 업무 대략 확인하기&lt;/li&gt;
&lt;li data-end=&quot;6010&quot; data-start=&quot;5992&quot; data-section-id=&quot;11wa2kg&quot;&gt;육아 긴급 대응 플랜 정리하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;6032&quot; data-start=&quot;6012&quot; data-section-id=&quot;87qzxy&quot; data-ke-size=&quot;size26&quot;&gt;복직 1주 전: 컨디션 조절하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6108&quot; data-start=&quot;6034&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6049&quot; data-start=&quot;6034&quot; data-section-id=&quot;p21ei7&quot;&gt;수면과 기상 루틴 맞추기&lt;/li&gt;
&lt;li data-end=&quot;6064&quot; data-start=&quot;6050&quot; data-section-id=&quot;icwwv1&quot;&gt;등원과 출근 리허설하기&lt;/li&gt;
&lt;li data-end=&quot;6074&quot; data-start=&quot;6065&quot; data-section-id=&quot;1d421is&quot;&gt;공부량 줄이기&lt;/li&gt;
&lt;li data-end=&quot;6088&quot; data-start=&quot;6075&quot; data-section-id=&quot;o2zx3g&quot;&gt;불안한 점 목록화하기&lt;/li&gt;
&lt;li data-end=&quot;6108&quot; data-start=&quot;6089&quot; data-section-id=&quot;1nf825v&quot;&gt;복직 첫 주 질문 리스트 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;6113&quot; data-start=&quot;6110&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6136&quot; data-start=&quot;6115&quot; data-section-id=&quot;t2sp92&quot;&gt;복직을 앞둔 나에게 해주고 싶은 말&lt;/h1&gt;
&lt;p data-end=&quot;6156&quot; data-start=&quot;6138&quot; data-ke-size=&quot;size16&quot;&gt;복직을 생각하면 여전히 불안하다.&lt;/p&gt;
&lt;p data-end=&quot;6225&quot; data-start=&quot;6158&quot; data-ke-size=&quot;size16&quot;&gt;하지만 불안하다는 것은 그만큼 일을 잘하고 싶다는 뜻이기도 하다.&lt;br /&gt;대충 하고 싶었다면 이렇게 고민하지 않았을 것이다.&lt;/p&gt;
&lt;p data-end=&quot;6334&quot; data-start=&quot;6227&quot; data-ke-size=&quot;size16&quot;&gt;육아휴직은 일을 쉰 시간이기도 하지만, 동시에 완전히 다른 종류의 책임을 감당한 시간이기도 하다.&lt;br /&gt;그 시간 동안 내가 부족해진 것이 아니라, 다른 방식으로 많은 것을 해내고 있었던 것이다.&lt;/p&gt;
&lt;p data-end=&quot;6402&quot; data-start=&quot;6336&quot; data-ke-size=&quot;size16&quot;&gt;복직 후 처음부터 예전의 나를 증명하려고 하지 말자.&lt;br /&gt;대신 매주 조금씩 업무 감각을 회복하는 나를 만들어가면 된다.&lt;/p&gt;
&lt;p data-end=&quot;6478&quot; data-start=&quot;6404&quot; data-ke-size=&quot;size16&quot;&gt;처음부터 완벽하지 않아도 된다.&lt;br /&gt;작은 업무를 끝까지 해내고, 모르는 것을 정리해서 질문하고, 실수를 줄이는 방식으로 일하면 된다.&lt;/p&gt;
&lt;p data-end=&quot;6528&quot; data-start=&quot;6480&quot; data-ke-size=&quot;size16&quot;&gt;복직은 다시 시작하는 일이 아니라,&lt;br /&gt;잠시 멈춰 있던 흐름에 다시 연결되는 과정이다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;6628&quot; data-start=&quot;6530&quot; data-ke-size=&quot;size16&quot;&gt;나는 다시 할 수 있다.&lt;br /&gt;다만 예전처럼 모든 것을 혼자 버티는 방식이 아니라, 더 체계적으로 일하고, 육아 변수도 시스템으로 관리하고, 작은 성공을 쌓아가며 복귀하면 된다.&lt;/p&gt;</description>
      <category>일상</category>
      <category>개발자복직</category>
      <category>경력단절고민</category>
      <category>복직불안</category>
      <category>복직준비</category>
      <category>엄마개발자</category>
      <category>워킹맘</category>
      <category>육아휴직</category>
      <category>육아휴직복직</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/534</guid>
      <comments>https://freebaer.tistory.com/534#entry534comment</comments>
      <pubDate>Wed, 27 May 2026 15:04:34 +0900</pubDate>
    </item>
    <item>
      <title>스니핑(Sniffing)과 스푸핑(Spoofing), 왜 자꾸 헷갈릴까</title>
      <link>https://freebaer.tistory.com/533</link>
      <description>&lt;p data-end=&quot;80&quot; data-start=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터나 네트워크 관련이나 정보보안 공부를 하다 보면 꼭 등장하는 두 단어가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;128&quot; data-start=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;스니핑(Sniffing)&lt;/b&gt; 과 &lt;b&gt;스푸핑(Spoofing)&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-end=&quot;217&quot; data-start=&quot;130&quot; data-ke-size=&quot;size16&quot;&gt;이름도 비슷하고 둘 다 해킹에서 함께 다루다 보니 처음 공부할 때 정말 많이 헷갈립니다.&lt;br /&gt;저도 처음에는 자꾸 &amp;ldquo;둘 다 뭔가 가로채는 거 아니었나?&amp;rdquo; &quot;스니핑이 스푸핑이었나? 아닌가?&quot; 싶었습니다.&lt;/p&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;219&quot; data-ke-size=&quot;size16&quot;&gt;하지만 핵심 차이만 이해하면 생각보다 쉽게 구분할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;290&quot; data-start=&quot;256&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;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Bz5Y/dJMcaiwHePY/3W5tiZelzplY3FRKkIgmJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Bz5Y/dJMcaiwHePY/3W5tiZelzplY3FRKkIgmJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Bz5Y/dJMcaiwHePY/3W5tiZelzplY3FRKkIgmJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Bz5Y%2FdJMcaiwHePY%2F3W5tiZelzplY3FRKkIgmJ0%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;1672&quot; height=&quot;941&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;295&quot; data-start=&quot;292&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;315&quot; data-start=&quot;297&quot; data-section-id=&quot;1nbbkh1&quot;&gt;스니핑(Sniffing)이란?&lt;/h1&gt;
&lt;p data-end=&quot;328&quot; data-start=&quot;317&quot; data-ke-size=&quot;size16&quot;&gt;스니핑은 쉽게 말해&lt;/p&gt;
&lt;blockquote data-end=&quot;351&quot; data-start=&quot;330&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;351&quot; data-start=&quot;332&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 데이터를 몰래 엿보는 행위&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;357&quot; data-start=&quot;353&quot; data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;404&quot; data-start=&quot;359&quot; data-ke-size=&quot;size16&quot;&gt;네트워크를 통해 오가는 패킷(Packet)을 가로채서 내용을 확인하는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;412&quot; data-start=&quot;406&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;456&quot; data-start=&quot;414&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;428&quot; data-start=&quot;414&quot; data-section-id=&quot;13ruis1&quot;&gt;로그인 ID/PW 탈취&lt;/li&gt;
&lt;li data-end=&quot;444&quot; data-start=&quot;429&quot; data-section-id=&quot;r5dcca&quot;&gt;공용 와이파이 패킷 감청&lt;/li&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;445&quot; data-section-id=&quot;1910vkw&quot;&gt;이메일 내용 도청&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;476&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;같은 공격이 스니핑에 해당합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;486&quot; data-start=&quot;478&quot; data-section-id=&quot;o47ueo&quot; data-ke-size=&quot;size26&quot;&gt;핵심 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;550&quot; data-start=&quot;488&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;488&quot; data-section-id=&quot;gkus7o&quot;&gt;데이터를 &lt;b&gt;몰래 본다&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;518&quot; data-start=&quot;505&quot; data-section-id=&quot;13hvbkm&quot;&gt;상대를 속이지 않는다&lt;/li&gt;
&lt;li data-end=&quot;550&quot; data-start=&quot;519&quot; data-section-id=&quot;d4m992&quot;&gt;주로 &lt;b&gt;수동적 공격(Passive Attack)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;578&quot; data-start=&quot;552&quot; data-ke-size=&quot;size16&quot;&gt;즉, 조용히 숨어서 정보를 훔쳐보는 느낌입니다.&lt;/p&gt;
&lt;hr data-end=&quot;583&quot; data-start=&quot;580&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;599&quot; data-start=&quot;585&quot; data-section-id=&quot;zz76jw&quot;&gt;왜 이름이 스니핑일까?&lt;/h1&gt;
&lt;p data-end=&quot;614&quot; data-start=&quot;601&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;Sniff&amp;rdquo;는 영어로&lt;/p&gt;
&lt;blockquote data-end=&quot;624&quot; data-start=&quot;616&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;624&quot; data-start=&quot;618&quot; data-ke-size=&quot;size16&quot;&gt;냄새를 맡다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;634&quot; data-start=&quot;626&quot; data-ke-size=&quot;size16&quot;&gt;라는 뜻입니다.&lt;/p&gt;
&lt;p data-end=&quot;683&quot; data-start=&quot;636&quot; data-ke-size=&quot;size16&quot;&gt;강아지가 냄새 맡듯이 네트워크를 킁킁 탐색한다는 이미지로 이해하면 기억하기 쉽습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;694&quot; data-start=&quot;685&quot; data-section-id=&quot;1gpt5l9&quot; data-ke-size=&quot;size26&quot;&gt;암기 포인트&lt;/h2&gt;
&lt;blockquote data-end=&quot;718&quot; data-start=&quot;696&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;718&quot; data-start=&quot;698&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;스니핑 = 몰래 냄새 맡듯 엿보기&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;723&quot; data-start=&quot;720&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;743&quot; data-start=&quot;725&quot; data-section-id=&quot;d3japw&quot;&gt;스푸핑(Spoofing)이란?&lt;/h1&gt;
&lt;p data-end=&quot;750&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;스푸핑은&lt;/p&gt;
&lt;blockquote data-end=&quot;772&quot; data-start=&quot;752&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;772&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;자신을 다른 대상으로 속이는 행위&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;778&quot; data-start=&quot;774&quot; data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;809&quot; data-start=&quot;780&quot; data-ke-size=&quot;size16&quot;&gt;즉, 신분을 위조해서 상대를 믿게 만드는 공격입니다.&lt;/p&gt;
&lt;p data-end=&quot;829&quot; data-start=&quot;811&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 예시는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;899&quot; data-start=&quot;831&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;844&quot; data-start=&quot;831&quot; data-section-id=&quot;1jknmb8&quot;&gt;IP Spoofing&lt;/li&gt;
&lt;li data-end=&quot;859&quot; data-start=&quot;845&quot; data-section-id=&quot;1kz61ou&quot;&gt;ARP Spoofing&lt;/li&gt;
&lt;li data-end=&quot;874&quot; data-start=&quot;860&quot; data-section-id=&quot;1hv728k&quot;&gt;DNS Spoofing&lt;/li&gt;
&lt;li data-end=&quot;886&quot; data-start=&quot;875&quot; data-section-id=&quot;cas4fk&quot;&gt;이메일 주소 위조&lt;/li&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;887&quot; data-section-id=&quot;1cn8taw&quot;&gt;가짜 사이트(피싱)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;912&quot; data-start=&quot;901&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 공격자가&lt;/p&gt;
&lt;p data-end=&quot;925&quot; data-start=&quot;914&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;나는 정상 서버야&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;954&quot; data-start=&quot;927&quot; data-ke-size=&quot;size16&quot;&gt;라고 속여서 사용자의 정보를 탈취하는 방식입니다.&lt;/p&gt;
&lt;hr data-end=&quot;959&quot; data-start=&quot;956&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;973&quot; data-start=&quot;961&quot; data-section-id=&quot;cwrtfq&quot;&gt;스푸핑의 핵심 특징&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1039&quot; data-start=&quot;975&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;988&quot; data-start=&quot;975&quot; data-section-id=&quot;w5qsmc&quot;&gt;상대를 &lt;b&gt;속인다&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1003&quot; data-start=&quot;989&quot; data-section-id=&quot;1ac0ik1&quot;&gt;신분을 &lt;b&gt;위장한다&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1039&quot; data-start=&quot;1004&quot; data-section-id=&quot;iulky1&quot;&gt;직접 개입하는 &lt;b&gt;능동적 공격(Active Attack)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1079&quot; data-start=&quot;1041&quot; data-ke-size=&quot;size16&quot;&gt;즉, 단순히 보는 것이 아니라 적극적으로 개입해서 속이는 공격입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1084&quot; data-start=&quot;1081&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1104&quot; data-start=&quot;1086&quot; data-section-id=&quot;15928q2&quot;&gt;둘의 차이를 한 번에 이해하기&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 65.2321%;&quot; border=&quot;1&quot; data-end=&quot;1255&quot; data-start=&quot;1106&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody data-end=&quot;1255&quot; data-start=&quot;1139&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4974%;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot;&gt;스니핑&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot;&gt;스푸핑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1159&quot; data-start=&quot;1139&quot;&gt;
&lt;td style=&quot;width: 22.4974%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1144&quot; data-start=&quot;1139&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1152&quot; data-start=&quot;1144&quot;&gt;몰래 보기&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1159&quot; data-start=&quot;1152&quot;&gt;속이기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1182&quot; data-start=&quot;1160&quot;&gt;
&lt;td style=&quot;width: 22.4974%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1165&quot; data-start=&quot;1160&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1173&quot; data-start=&quot;1165&quot;&gt;정보 탈취&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1182&quot; data-start=&quot;1173&quot;&gt;신뢰 위장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1204&quot; data-start=&quot;1183&quot;&gt;
&lt;td style=&quot;width: 22.4974%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1191&quot; data-start=&quot;1183&quot;&gt;공격 형태&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1197&quot; data-start=&quot;1191&quot;&gt;수동적&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1204&quot; data-start=&quot;1197&quot;&gt;능동적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1228&quot; data-start=&quot;1205&quot;&gt;
&lt;td style=&quot;width: 22.4974%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1214&quot; data-start=&quot;1205&quot;&gt;핵심 이미지&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1219&quot; data-start=&quot;1214&quot;&gt;도청&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1228&quot; data-start=&quot;1219&quot;&gt;사기/위장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1255&quot; data-start=&quot;1229&quot;&gt;
&lt;td style=&quot;width: 22.4974%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1238&quot; data-start=&quot;1229&quot;&gt;기억 키워드&lt;/td&gt;
&lt;td style=&quot;width: 21.9671%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1246&quot; data-start=&quot;1238&quot;&gt;냄새 맡기&lt;/td&gt;
&lt;td style=&quot;width: 16.9914%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1255&quot; data-start=&quot;1246&quot;&gt;신분 위조&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1260&quot; data-start=&quot;1257&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1278&quot; data-start=&quot;1262&quot; data-section-id=&quot;6xgqn5&quot;&gt;같이 사용되는 경우도 많다&lt;/h1&gt;
&lt;p data-end=&quot;1308&quot; data-start=&quot;1280&quot; data-ke-size=&quot;size16&quot;&gt;실제 공격에서는 두 기술이 함께 사용되기도 합니다.&lt;/p&gt;
&lt;p data-end=&quot;1316&quot; data-start=&quot;1310&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1353&quot; data-start=&quot;1318&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1335&quot; data-start=&quot;1318&quot; data-section-id=&quot;pvw4vb&quot;&gt;스푸핑으로 사용자를 속이고&lt;/li&gt;
&lt;li data-end=&quot;1353&quot; data-start=&quot;1336&quot; data-section-id=&quot;t3xiuc&quot;&gt;스니핑으로 데이터를 가로챔&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1371&quot; data-start=&quot;1355&quot; data-ke-size=&quot;size16&quot;&gt;이런 흐름이 자주 등장합니다.&lt;/p&gt;
&lt;p data-end=&quot;1436&quot; data-start=&quot;1373&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 ARP 스푸핑으로 중간자(MITM) 위치를 만든 뒤, 패킷을 스니핑해서 계정 정보를 훔치는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;1440&quot; data-start=&quot;1438&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;1456&quot; data-start=&quot;1442&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1456&quot; data-start=&quot;1444&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;속이고 &amp;rarr; 훔쳐본다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1478&quot; data-start=&quot;1458&quot; data-ke-size=&quot;size16&quot;&gt;라고 이해하면 훨씬 기억에 남습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1483&quot; data-start=&quot;1480&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1499&quot; data-start=&quot;1485&quot; data-section-id=&quot;5n06fm&quot;&gt;가장 쉽게 외우는 방법&lt;/h1&gt;
&lt;p data-end=&quot;1527&quot; data-start=&quot;1501&quot; data-ke-size=&quot;size16&quot;&gt;저는 아래처럼 외우는 게 가장 직관적이었습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1535&quot; data-start=&quot;1529&quot; data-section-id=&quot;1hhwi7s&quot; data-ke-size=&quot;size26&quot;&gt;스니핑&lt;/h2&gt;
&lt;blockquote data-end=&quot;1547&quot; data-start=&quot;1537&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1547&quot; data-start=&quot;1539&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;조용히 본다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1555&quot; data-start=&quot;1549&quot; data-section-id=&quot;1hi1dfs&quot; data-ke-size=&quot;size26&quot;&gt;스푸핑&lt;/h2&gt;
&lt;blockquote data-end=&quot;1568&quot; data-start=&quot;1557&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1568&quot; data-start=&quot;1559&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;대놓고 속인다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1608&quot; data-start=&quot;1570&quot; data-ke-size=&quot;size16&quot;&gt;이 두 문장만 기억해도 시험이나 면접에서 헷갈릴 일이 거의 없습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1613&quot; data-start=&quot;1610&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1620&quot; data-start=&quot;1615&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;1673&quot; data-start=&quot;1622&quot; data-ke-size=&quot;size16&quot;&gt;보안 용어는 처음에는 이름이 비슷해서 헷갈리지만, 핵심 행동만 구분하면 생각보다 단순합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1700&quot; data-start=&quot;1675&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1688&quot; data-start=&quot;1675&quot; data-section-id=&quot;bqgbrf&quot;&gt;스니핑 &amp;rarr; 몰래 보기&lt;/li&gt;
&lt;li data-end=&quot;1700&quot; data-start=&quot;1689&quot; data-section-id=&quot;1o2by7y&quot;&gt;스푸핑 &amp;rarr; 속이기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1737&quot; data-start=&quot;1702&quot; data-ke-size=&quot;size16&quot;&gt;이렇게만 기억해도 대부분의 상황에서 정확히 구분할 수 있습니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1770&quot; data-start=&quot;1739&quot; data-ke-size=&quot;size16&quot;&gt;혹시 여러분만의 암기법이 있다면 댓글로 공유해주세요  &lt;/p&gt;</description>
      <category>기타 정보/정보공유-IT</category>
      <category>IT용어정리</category>
      <category>네트워크보안</category>
      <category>보안</category>
      <category>보안공부</category>
      <category>사이버보안</category>
      <category>스니핑</category>
      <category>스푸핑</category>
      <category>정보보안</category>
      <category>해킹</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/533</guid>
      <comments>https://freebaer.tistory.com/533#entry533comment</comments>
      <pubDate>Wed, 27 May 2026 14:44:07 +0900</pubDate>
    </item>
    <item>
      <title>종합소득과세표준확정신고 및 납부계산서 조회 및 출력 방법</title>
      <link>https://freebaer.tistory.com/532</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://hometax.go.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;국세청 홈택스&lt;/a&gt; 에 접속하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. 홈택스 신고안내 임시페이지일 때는 홈택스 바로가기 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsxH9w/dJMcahR32cw/EfPSE6CVNR22PnVkFPwQc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsxH9w/dJMcahR32cw/EfPSE6CVNR22PnVkFPwQc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsxH9w/dJMcahR32cw/EfPSE6CVNR22PnVkFPwQc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsxH9w%2FdJMcahR32cw%2FEfPSE6CVNR22PnVkFPwQc0%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;1176&quot; height=&quot;538&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;538&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;2. 홈택스 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1. 로그인 위치1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJb9kz/dJMcaiDs4fW/dVdk6KAHzWuEUOgKUcmUm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJb9kz/dJMcaiDs4fW/dVdk6KAHzWuEUOgKUcmUm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJb9kz/dJMcaiDs4fW/dVdk6KAHzWuEUOgKUcmUm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJb9kz%2FdJMcaiDs4fW%2FdVdk6KAHzWuEUOgKUcmUm0%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;1235&quot; height=&quot;320&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2. 로그인 위치2&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;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Ox5f/dJMcad3a5B5/PBqoKWLHdi2rCYJMTFBCJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Ox5f/dJMcad3a5B5/PBqoKWLHdi2rCYJMTFBCJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Ox5f/dJMcad3a5B5/PBqoKWLHdi2rCYJMTFBCJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Ox5f%2FdJMcad3a5B5%2FPBqoKWLHdi2rCYJMTFBCJk%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;396&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;396&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;1425&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nwIr8/dJMcagMsObC/J7K7LMhEWMofQruU3Ca7W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nwIr8/dJMcagMsObC/J7K7LMhEWMofQruU3Ca7W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nwIr8/dJMcagMsObC/J7K7LMhEWMofQruU3Ca7W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnwIr8%2FdJMcagMsObC%2FJ7K7LMhEWMofQruU3Ca7W0%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;1425&quot; height=&quot;632&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;632&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;1482&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSB7Ah/dJMcac4iKCx/ImpKy7rjjRp83ykPEa0mLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSB7Ah/dJMcac4iKCx/ImpKy7rjjRp83ykPEa0mLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSB7Ah/dJMcac4iKCx/ImpKy7rjjRp83ykPEa0mLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSB7Ah%2FdJMcac4iKCx%2FImpKy7rjjRp83ykPEa0mLK%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;1482&quot; height=&quot;488&quot; data-origin-width=&quot;1482&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;① 세목에서 종합소득세를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 사업자 또는 주민등록번호 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 신고일자는 최대 2년 단위로 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 조회하기&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;⑥ 접수번호(신고서보기)에 있는 번호를 클릭하면 &lt;b&gt;종합소득과세표준확정신고 및 납부계산서&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종합소득과세표준확정신고 및 납부계산서 자체가 소득을 정확하게 확인하기 위해서 주로 은행에서 요구 하는 서류이므로 대부분은 &lt;b&gt;개인정보 공개를 선택&lt;/b&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-origin-width=&quot;902&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpBDo/dJMcafzZLp4/3PycKuKykoT9bjLLTetAv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpBDo/dJMcafzZLp4/3PycKuKykoT9bjLLTetAv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpBDo/dJMcafzZLp4/3PycKuKykoT9bjLLTetAv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpBDo%2FdJMcafzZLp4%2F3PycKuKykoT9bjLLTetAv0%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;902&quot; height=&quot;255&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;255&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;1239&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxLqk/dJMcajh3kYy/MXBO97QF1mM5KqVktQfizK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxLqk/dJMcajh3kYy/MXBO97QF1mM5KqVktQfizK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxLqk/dJMcajh3kYy/MXBO97QF1mM5KqVktQfizK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxLqk%2FdJMcajh3kYy%2FMXBO97QF1mM5KqVktQfizK%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;1239&quot; height=&quot;847&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 출력 버튼을 클릭하면 조회한 &lt;b&gt;종합소득과세표준확정신고 및 납부계산서&lt;/b&gt;를 출력할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 신고서 목록에 여러개가 있을 수 있는데 첫번째에 위치한 &lt;b&gt;종합소득세&amp;middot;(지방소득세) 과세표준확정 신고 및 납부계산서&lt;/b&gt;는 필수로 선택하고 그 아래에 있는 것은 필요한 것만 선택하여 출력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분은 전체가 필요하므로 &lt;b&gt;일괄출력 버튼&lt;/b&gt; &lt;b&gt;클릭&lt;/b&gt; 후 &lt;b&gt;출력 버튼&lt;/b&gt;을 &lt;b&gt;클릭&lt;/b&gt;하여 &lt;b&gt;출력&lt;/b&gt;하면 된다.&lt;/p&gt;</description>
      <category>기타 정보/정보공유</category>
      <author>FreeBear</author>
      <guid isPermaLink="true">https://freebaer.tistory.com/532</guid>
      <comments>https://freebaer.tistory.com/532#entry532comment</comments>
      <pubDate>Wed, 27 May 2026 13:59:26 +0900</pubDate>
    </item>
    <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>
  </channel>
</rss>