<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>기록</title>
    <link>https://iruk.tistory.com/</link>
    <description>순간의 소중함을 중심으로, 내 삶의 흔적을 기록해갑니다</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 18:28:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Re::cord</managingEditor>
    <image>
      <title>기록</title>
      <url>https://tistory1.daumcdn.net/tistory/5781776/attach/567ef495122a45c884d67a903c498b69</url>
      <link>https://iruk.tistory.com</link>
    </image>
    <item>
      <title>선택의 집합체</title>
      <link>https://iruk.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;평소에 잡생각을 많이 하는 편이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잡생각의 주제별 빈도는 7~10일에 한 번인 것 같다.&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;이틀 후엔 '지구상 최초의 개발자'에 대해 생각하고,&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;이틀 후에 다시 '강아지가 착한 이유'로 돌아온다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;'사랑이란 무엇인가' 에 대한 가치관이 확립됐다.&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;'~인가?'에 대한 생각이&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;특히나 사랑이나, 인간의 행동 심리? 같은 게&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;어릴 때 책 좀 많이 읽을걸&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;친구로 생각이 넘어간 뒤로는, '친구'라는 범위를 정의하느라 바쁘다.&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;10대 ~ 대학생 까지는 같은 집단 내 동갑만이 친구라고 생각했다 보니&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;하지만 지금은 삶을 살아가면서 만나는 모든 주변인들이 나에게 친구라,&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;게임에서 만나는 사람들, 산책 중에 가볍게 인사하는 사람들을 떠올린다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;여자친구의 주변에서 일어나는 모든 일을 사랑한다.&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;똥고집인 나의 가치관이 너로 스며드는 순간들을 사랑한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;5살이든, 중학생이든, 대학생이든, 중년이든 인간의 모습이 어떠하든&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;10대 때는 그 목적을 자각하지 못해서, 그저 설렘만 가득했다.&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;사랑할 때는, 너무 깊이 빠져버려서&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;내 마음의 질문이 뭔지도 모른 채 해답만 찾곤 했었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;그때와 다른 건, 목적이 없는 사랑을 하고 있다는 건데&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;지금의 목적은, 그리고 나에게 '사랑'이란 '그 사람 대신 살아가는 것'이다.&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;'그 사람이라면 뭐든 해줄 수 있다' 식의 행위적 희생이 아니라 정신적 희생을 의미한다.&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;서로의 시간을 깎으며 살아간다.&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;
&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;방패로 막고, 방패로 때리며 시간을 함께한다.&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;'나는 너에게 멋진 사람이 될 거야'로 시작했던 마음이&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;'멋지지 않은 나는 숨겨야 돼'가 되어갔다.&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;그 간극의 말단을 양손으로 붙잡고 있던 너만 힘들게 했었던 것 같다.&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;이 모든 감정은 '철없던 때였다'로 함축되곤 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;너를 위한 선택을 하겠다는 것이고&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;내가 나를 사랑하기에, 지금의 나를 있게 해 준 너를 사랑한다.&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;지금의 너를 스스로 볼품없다 해도, 나는 네가 빛나는 순간으로 가득하다.&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;볼품없는, 볼품 없어질 너의 모습을 사랑한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;어우 이거지&lt;/p&gt;</description>
      <category>기타/생각</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/105</guid>
      <comments>https://iruk.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 19 Nov 2024 00:09:40 +0900</pubDate>
    </item>
    <item>
      <title>Spring? ? ? ? ? ? ? ?</title>
      <link>https://iruk.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;.NET C# 개발 업무로 입사해서, 요즘은 Spring을 제일 많이 다루고 있다.&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;Spring 기본기가 부족한 상태로 실무를 먼저 접하다 보니,&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;amp; Spring 및 부족한 CS지식 공부와 병행해야 해서 일정 관리가 너무 힘들다..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA를 1도 모르는 내가 스프링이라는 자동차를 운전하자니&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;필요한 어노테이션을 바로바로 떠올리는 선배분들이 그저 신기하다..&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;JAVA 기초를 인프런, 구글링 등으로 접하고 있지만, 실무와 크게 가깝지가 않은게 흠이다.&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;JAVA 라는 언어를 사용한다는건 같지만,&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;그냥 실무하면서, 그때 그때 필요한걸 빨리 찾아서, 빨리 이해하고 빨리 활용하는게 베스트라고 느낀다.&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;amp; 약간의 자괴감 &amp;amp; 새 지식에 대한 설렘 등이 생겨서&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본문은 하소연 &amp;amp; 약 1달동안 60%만 이해됐던 개념들을 리스트로 쭉 뽑고&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;&lt;b&gt;1.Setter, Builder 차이&lt;/b&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; &amp;nbsp;- case별 장단점(A의 경우, B의 경우 대조)&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;2.RestController, NotBlank, PutMapping ... 등 어노테이션 동작 원리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 어노테이션 별 어떤 역할을 하는지는 이해 O&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; &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;3.Gradle 사용 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 빌드 자동화 역할인건 이해 O&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; &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;4.Spring Boot 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 구글링&amp;amp;강의에 정보가 있긴 한데, 특정 프레임워크의 특징, 장단점은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;5.Http 메소드(CS지식)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- PUT, POST 차이(그놈의 멱등성이 이해가 안감)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- PUT이든 POST든 비즈니스 로직은 Service단에서 실행되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;왜 PUT은 리소스가 그대로 덮여씌여진다하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;왜 POST는 리소스가 일부만 수정된다 하는지? -&amp;gt; 비즈니스 로직을 수정하면 되는거 아닌가..?&lt;/p&gt;</description>
      <category>개발/Spring</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/104</guid>
      <comments>https://iruk.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 18 Nov 2024 23:29:23 +0900</pubDate>
    </item>
    <item>
      <title>Kubernetes</title>
      <link>https://iruk.tistory.com/103</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.Kubernetes란?&lt;/h2&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; &amp;nbsp;- 빌드된 도커 이미지들을, 실질적으로 다루는 도구&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.Kubernetes 장점?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Pod, Service, Deployment 등 k8s의 객체별 다양한 기능 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 무중단 배포, POD간, POD내 컨테이너간 통신 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 많이 안써봐서, 느낀게 별로 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker랑 같이 스터디 하면서 이 글에 채워야겠다&lt;/p&gt;</description>
      <category>개발/Docker &amp;amp; k8s</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/103</guid>
      <comments>https://iruk.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 26 Aug 2024 20:36:11 +0900</pubDate>
    </item>
    <item>
      <title>Docker</title>
      <link>https://iruk.tistory.com/102</link>
      <description>&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;최근들어 Docker 와 Kubernetes에 대해 공부중인데&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내가 이해한 수준을 기록한 뒤&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;amp; 쿠버네티스가 확 와닿지 않는다 ㅠ&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.Docker란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 런타임, 라이브러리 등 실행환경이 다른 소스들을, 컨테이너화 하게 도와주는 가상화 플랫폼&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;컨테이너 : 런타임, 라이브러리, OS 등이 정의된 환경&lt;/li&gt;
&lt;li&gt;가상화 : OS 환경을 임의로 세팅하는 행위 (물리적 리소스를 분할)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.Docker Image란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 런타임, 라이브러리 등 소프트웨어가 실행되는데 필요한 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dockerfile로 정의&lt;/li&gt;
&lt;li&gt;Dockerfile은, 세팅할 소프트웨어와 같은 디렉토리에 생성 ex) C:\Users\USER\source\repos\my-software\Dockerfile&lt;/li&gt;
&lt;li&gt;Dockerfile내에 OS, 실행할 소프트웨어, 실행 조건 등 다양한 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.Docker 사용 시 장점?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 자원 낭비 최소화, Kubernetes같은 컨테이너 오케스트레이션 도구와의 강한 연동성&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; &amp;nbsp;- Docker없이 linux ubuntu OS, window OS 가 동시에 요구되는 경우, 불필요한 물리적 자원이 요구됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 자원문제와 더불어, 서로 다른 OS에 있는 프로그램간의 호환 문제 발생&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VFuN9/btsJfqaLn9H/jJNq9qqxuPnt9T4auenSs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VFuN9/btsJfqaLn9H/jJNq9qqxuPnt9T4auenSs1/img.png&quot; data-alt=&quot;출처 : https://seosh817.tistory.com/345&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VFuN9/btsJfqaLn9H/jJNq9qqxuPnt9T4auenSs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVFuN9%2FbtsJfqaLn9H%2FjJNq9qqxuPnt9T4auenSs1%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;1367&quot; height=&quot;536&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://seosh817.tistory.com/345&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;가상화 환경에서는, App마다 OS가 별개로 필요하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 환경에서는 Host OS가 하나있고, 컨테이너에 필요한 커널을 공유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Docker &amp;amp; k8s</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/102</guid>
      <comments>https://iruk.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 26 Aug 2024 20:30:43 +0900</pubDate>
    </item>
    <item>
      <title>C# 선그래프</title>
      <link>https://iruk.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C# 윈폼을 활용해서 동적차트를 만들어보았다.&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;그래프의 데이터는 List로 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 저장 기능까지 구상하고 시작했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7NPgp/btsGjK95Rcr/oxa4Hkhb5K6yAkikjSbh6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7NPgp/btsGjK95Rcr/oxa4Hkhb5K6yAkikjSbh6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7NPgp/btsGjK95Rcr/oxa4Hkhb5K6yAkikjSbh6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7NPgp%2FbtsGjK95Rcr%2Foxa4Hkhb5K6yAkikjSbh6k%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;832&quot; height=&quot;457&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;457&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 data-ke-size=&quot;size16&quot;&gt;x축은 총 10개의 데이터가 나타나고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1초마다 값이 업데이트된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JBCpA/btsGjE95wjQ/rSCnwubEypg87DiY8PZO30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBCpA/btsGjE95wjQ/rSCnwubEypg87DiY8PZO30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBCpA/btsGjE95wjQ/rSCnwubEypg87DiY8PZO30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBCpA%2FbtsGjE95wjQ%2FrSCnwubEypg87DiY8PZO30%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;1081&quot; height=&quot;451&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈폼이 실행되면, 로딩이 완료된 뒤 Start 이벤트를 발생시킨다.&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;Start이벤트는 차트 관련 설정들을 세팅하고&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;893&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdYPdT/btsGj5e0u9H/JBbF38p3zTCISROPp8PUYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdYPdT/btsGj5e0u9H/JBbF38p3zTCISROPp8PUYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdYPdT/btsGj5e0u9H/JBbF38p3zTCISROPp8PUYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdYPdT%2FbtsGj5e0u9H%2FJBbF38p3zTCISROPp8PUYk%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;893&quot; height=&quot;437&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;437&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 data-ke-size=&quot;size16&quot;&gt;프로그램을 실행하면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유동적으로 값을 변경하기 위해, 코드상으로 정의해뒀다. ( 나중에 수정할 부분을 찾기 편하도록 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJFA2i/btsGh3W5uOM/lGHOJWQ0WBEO4CMgBkQqu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJFA2i/btsGh3W5uOM/lGHOJWQ0WBEO4CMgBkQqu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJFA2i/btsGh3W5uOM/lGHOJWQ0WBEO4CMgBkQqu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJFA2i%2FbtsGh3W5uOM%2FlGHOJWQ0WBEO4CMgBkQqu1%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;531&quot; height=&quot;920&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;920&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRCEa/btsGkCXM3Sk/A7nnsQXZo63k28KNdjewnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRCEa/btsGkCXM3Sk/A7nnsQXZo63k28KNdjewnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRCEa/btsGkCXM3Sk/A7nnsQXZo63k28KNdjewnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRCEa%2FbtsGkCXM3Sk%2FA7nnsQXZo63k28KNdjewnK%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;775&quot; height=&quot;438&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GenerateData() 함수는, 랜덤 데이터를 생성하는 함수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 데이터가 없어서 임의로 데이터를 생성하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 데이터들을 List에 저장 후&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;그래프 업데이트 로직에서 List의 데이터를 꺼내 화면에 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 다른 화면에 차트기능을 넣을때는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 장비의 데이터를 읽어서 List에 넣고, 그 List로 차트에 표현할 예정이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1zlab/btsGjkKABmX/LBxSKBhdg07l5NryUcX6J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1zlab/btsGjkKABmX/LBxSKBhdg07l5NryUcX6J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1zlab/btsGjkKABmX/LBxSKBhdg07l5NryUcX6J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1zlab%2FbtsGjkKABmX%2FLBxSKBhdg07l5NryUcX6J0%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;936&quot; height=&quot;312&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;312&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZBPav/btsGkVQwbJR/QwxarJkTZutoYWigBIBA20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZBPav/btsGkVQwbJR/QwxarJkTZutoYWigBIBA20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZBPav/btsGkVQwbJR/QwxarJkTZutoYWigBIBA20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZBPav%2FbtsGkVQwbJR%2FQwxarJkTZutoYWigBIBA20%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;774&quot; height=&quot;441&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;441&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;DrawGraph()를 실행하는데,&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;윈폼 UI를 외부 스레드에서 변경 시 충돌이 발생해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BeginInvoke()를 활용해서 비동기적으로 처리했다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LlAod/btsGkpEoffh/Zm9R1o5WIxvV2THsEMy0uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LlAod/btsGkpEoffh/Zm9R1o5WIxvV2THsEMy0uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LlAod/btsGkpEoffh/Zm9R1o5WIxvV2THsEMy0uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLlAod%2FbtsGkpEoffh%2FZm9R1o5WIxvV2THsEMy0uk%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;1012&quot; height=&quot;781&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;781&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;List(graphData_blue)의 데이터를 차트(Series)에 세팅한다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhOz9/btsGksVlmCB/vQgJxZDlaw6ySIQKJaUvwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhOz9/btsGksVlmCB/vQgJxZDlaw6ySIQKJaUvwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhOz9/btsGksVlmCB/vQgJxZDlaw6ySIQKJaUvwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhOz9%2FbtsGksVlmCB%2FvQgJxZDlaw6ySIQKJaUvwK%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;1029&quot; height=&quot;671&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세팅 완료 후, 각각 그래프를 chart1 객체에 추가한다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9Yga/btsGipr8Evq/IZ7V8tkyLDAMCwqVaKsWQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9Yga/btsGipr8Evq/IZ7V8tkyLDAMCwqVaKsWQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9Yga/btsGipr8Evq/IZ7V8tkyLDAMCwqVaKsWQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9Yga%2FbtsGipr8Evq%2FIZ7V8tkyLDAMCwqVaKsWQ1%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;723&quot; height=&quot;831&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;831&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKBwVE/btsGhT1waNc/rGBkYUbEonpTMiJnsokHkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKBwVE/btsGhT1waNc/rGBkYUbEonpTMiJnsokHkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKBwVE/btsGhT1waNc/rGBkYUbEonpTMiJnsokHkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKBwVE%2FbtsGhT1waNc%2FrGBkYUbEonpTMiJnsokHkK%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;1328&quot; height=&quot;626&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W4zv1/btsGkpdkf29/Qx9bBl9zKLGkhZtKztZTok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W4zv1/btsGkpdkf29/Qx9bBl9zKLGkhZtKztZTok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W4zv1/btsGkpdkf29/Qx9bBl9zKLGkhZtKztZTok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW4zv1%2FbtsGkpdkf29%2FQx9bBl9zKLGkhZtKztZTok%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;610&quot; height=&quot;306&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;306&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;사실 기능구현 보다는, UI 크기 조절 시&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;Panel의 역할을 정확히 이해하지 못했기 때문이다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직까지도 너무 어렵고 바로바로 떠오르지 않는다.&lt;/p&gt;</description>
      <category>개발/C#</category>
      <category>c#</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/101</guid>
      <comments>https://iruk.tistory.com/101#entry101comment</comments>
      <pubDate>Tue, 2 Apr 2024 22:31:17 +0900</pubDate>
    </item>
    <item>
      <title>Modbus TCP 제어 ( 패킷 과수신 대비 )</title>
      <link>https://iruk.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Modbus TCP 통신을 사용해서&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;하나의 프로그램에 프로세스가 총 3개 동작하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.MQTT 패킷을 수신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.제어부 프로세스까지 전달(Socket)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.실 제어 및 상태값 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외상황을 생각하지 못한 안좋은 코드같았다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수정 전&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf9pU4/btsFydfh9Wo/invTwKeY9w83CnvKPVejek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf9pU4/btsFydfh9Wo/invTwKeY9w83CnvKPVejek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf9pU4/btsFydfh9Wo/invTwKeY9w83CnvKPVejek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf9pU4%2FbtsFydfh9Wo%2FinvTwKeY9w83CnvKPVejek%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;1017&quot; height=&quot;618&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 시퀀스 다이어그램을 제작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process A 에서, MQTT 브로커로부터&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;수신받은 메시지를, Process A &amp;amp; B 를 관리하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main Process에게 전달.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main Process 는 실 제어부 동작을 하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process B 로 패킷을 전달한다.&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;Process B 는 Modbus TCP 통신을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 장비를 Write &amp;amp; Read 한다.&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;Process B는 제어한 뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 전달받은 제어 패킷의 데이터 ( on/off ) 값과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어한 뒤 상태값 ( on/off ) 를 비교하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공여부를 판단한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제점&lt;/h2&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어 패킷을 '1회' 수신받았을 때는 매우 정상적으로 동작하는 코드다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;그러다 보니 문제점을 떠올릴 수 있었던 것 같다.&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;MQTT Broker가 노출되었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1초동안 제어 패킷이 10000회 수신된다면 어떻게할래? 하고 스스로 물었을 때&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;10000회는 오바일수도 있지만, 당장 1초에 5개? 만 들어와도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process B가 제어중일 때, Process A 가 제어메시지를 또 수신받아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 Write 중인 Process B에게 또 Write명령을 내리면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신 오류가 발생할 가능성이 높다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 단계별 해결법&lt;/h2&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;size18&quot;&gt;&lt;u&gt;&lt;b&gt;1.메시지 과수신&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;i&gt;&lt;b&gt;i)&amp;nbsp; 메시지 차단 ( 일정횟수 이상 수신 시 )&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일정횟수 이상을 차단하는건 간단하고 좋지만,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;i&gt;&lt;b&gt;&amp;nbsp;ii) 메시지 수신 보안 강화 ( 3 way hand-shake 처럼, 제어 메시지에 대한 응답값 송/수신 후 실 제어 )&amp;nbsp;&lt;/b&gt;&lt;/i&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 data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;&lt;b&gt;2.비순차적인 제어 로직&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;i&gt;&lt;b&gt;&amp;nbsp;i)&amp;nbsp; flag 활용 ( flag = false 일때만 제어 시도 )&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단해서 바로 떠오른 방법인데, flag 세우는건 좋지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어 도중에 또다른 제어 명령이 들어왔을 때, 나중에 들어온 명령을 관리하는게 불가피했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flag 세우는것 만으로는 제어 로직을 순차적으로 관리하기 힘들어보였다.&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;i&gt;&amp;nbsp;&lt;b&gt;ii) 자료구조 활용 ( Queue를 활용한 패킷 관리 )&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 제일 좋아보였다. 메시지 수신 시, Queue에 패킷을 Enqueue하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 프로세스 or 스레드에서 Queue 를 Dequeue 및 실 제어를 하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깔끔하고, 안전하게 제어를 할 수 있을거라 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안그래도 Queue가 선입선출 방식이니, 제어 명령도 순차적으로 진행할 수 있을 것 같았다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수정 후&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbaNjv/btsFCztTdnr/fzlElvH3EqcNg0bU2bevKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbaNjv/btsFCztTdnr/fzlElvH3EqcNg0bU2bevKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbaNjv/btsFCztTdnr/fzlElvH3EqcNg0bU2bevKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbaNjv%2FbtsFCztTdnr%2FfzlElvH3EqcNg0bU2bevKK%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;1043&quot; height=&quot;756&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;756&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;(1) 에서, 초당 10회만 수신하도록 처리했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcwisL/btsFBeqvMf7/tvkZH69FJaxayipFCKWQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcwisL/btsFBeqvMf7/tvkZH69FJaxayipFCKWQkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcwisL/btsFBeqvMf7/tvkZH69FJaxayipFCKWQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcwisL%2FbtsFBeqvMf7%2FtvkZH69FJaxayipFCKWQkk%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;828&quot; height=&quot;298&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MQTT 수신 이벤트 발생 시, count를 증가시켰고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrlRcvCount는, 타이머에 의해 1초마다 초기화된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boFDIp/btsFAwdYhzU/IaKibvGOut6rnFkWCBgy20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boFDIp/btsFAwdYhzU/IaKibvGOut6rnFkWCBgy20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boFDIp/btsFAwdYhzU/IaKibvGOut6rnFkWCBgy20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboFDIp%2FbtsFAwdYhzU%2FIaKibvGOut6rnFkWCBgy20%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;840&quot; height=&quot;352&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;352&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초동안 10회이상 수신되면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10회 이상값부터는 제어 명령이 아니라 판단하고 무시한다.&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;10회 미만일때만 OnRecived 이벤트를 Invoke() 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b27Z4N/btsFB8DqGxE/uxdMdkrBbrIGYdINMj3j10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b27Z4N/btsFB8DqGxE/uxdMdkrBbrIGYdINMj3j10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b27Z4N/btsFB8DqGxE/uxdMdkrBbrIGYdINMj3j10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb27Z4N%2FbtsFB8DqGxE%2FuxdMdkrBbrIGYdINMj3j10%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;1043&quot; height=&quot;756&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;756&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XuQaD/btsFA9JB6IF/Wk4m8gxCKjMPabKVAOBvi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XuQaD/btsFA9JB6IF/Wk4m8gxCKjMPabKVAOBvi1/img.png&quot; data-alt=&quot;(2) 스레드 소스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XuQaD/btsFA9JB6IF/Wk4m8gxCKjMPabKVAOBvi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXuQaD%2FbtsFA9JB6IF%2FWk4m8gxCKjMPabKVAOBvi1%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;756&quot; height=&quot;759&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(2) 스레드 소스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process B에 (2)스레드를 추가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 스레드는, Queue 크기를 3초마다 확인하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue 크기가 0 이상일 때 ( 제어 명령이 있을 때 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dequeue 후 제어 패킷에 맞게 실 제어부를 동작시킨다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HQqn2/btsFBahjeQ6/tG2LHJRMLoQYCnPkKkPcak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HQqn2/btsFBahjeQ6/tG2LHJRMLoQYCnPkKkPcak/img.png&quot; data-alt=&quot;(3) 제어 메시지 수신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HQqn2/btsFBahjeQ6/tG2LHJRMLoQYCnPkKkPcak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHQqn2%2FbtsFBahjeQ6%2FtG2LHJRMLoQYCnPkKkPcak%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;584&quot; height=&quot;186&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(3) 제어 메시지 수신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 전에는, (3) 처럼 Queue저장 과정이 없이,&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;실 제어 하지않고, Queue에 패킷을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lock 처리를 해서, 실 제어부 동작과 충돌나지 않게 분리시켰다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 제어 log 파일을 따로 관리해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 log 파일과 별개로 영구보관했다.&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;기록용? 보험? 느낌으로 영구저장 하려한다.&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;수정하고 나서 더 안전하고 효율적으로 제어가 가능해졌다.&lt;/p&gt;</description>
      <category>개발/C#</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/100</guid>
      <comments>https://iruk.tistory.com/100#entry100comment</comments>
      <pubDate>Wed, 6 Mar 2024 21:38:05 +0900</pubDate>
    </item>
    <item>
      <title>자료형 크기</title>
      <link>https://iruk.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대학생 시절&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;연구실에서 개발할때는&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: #000000;&quot;&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 style=&quot;color: #000000;&quot;&gt;직접 이슈가 생긴적이 없었고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기능 개발만 우선시 했던 습관 때문이다&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: #000000;&quot;&gt;오늘 자료형 때문에 발생한 이슈를 정리해야겠다&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시퀀스 다이어그램&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dks3xU/btsE9TOAbyi/zpRNZE6H7sKlk1f6Kc9RGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dks3xU/btsE9TOAbyi/zpRNZE6H7sKlk1f6Kc9RGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dks3xU/btsE9TOAbyi/zpRNZE6H7sKlk1f6Kc9RGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdks3xU%2FbtsE9TOAbyi%2FzpRNZE6H7sKlk1f6Kc9RGK%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;1074&quot; height=&quot;522&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Process A, Main Process, Process B 는 하나의 exe 내 프로세스다.&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: #000000;&quot;&gt;Process Z 도 하나의 exe 내 프로세스다.&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: #000000;&quot;&gt;실행 프로그램 별로 색으로 구분했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Azure Cloud는 상위 서버다.&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: #000000;&quot;&gt;노란색 프로세스 3개를 가진 프로그램과,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코랄색 프로세슬를 가진 프로그램은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 PC 환경에서 동작하고있다. ( local )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bynxCV/btsE7qznAHn/jX53XqzV11YkOiDkvPT8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bynxCV/btsE7qznAHn/jX53XqzV11YkOiDkvPT8rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bynxCV/btsE7qznAHn/jX53XqzV11YkOiDkvPT8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbynxCV%2FbtsE7qznAHn%2FjX53XqzV11YkOiDkvPT8rk%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;1074&quot; height=&quot;522&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;522&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: #000000;&quot;&gt;따라서 1번 MQTT 는 local&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2번 MQTT는 Azure 서버를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이슈&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM9Ckd%2FbtsE9MV7YSh%2F4meav4UQLQTRLRapkuNnQK%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;1065&quot; height=&quot;517&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A구간에서 local 로 받아온 MQTT 데이터 크기가 94326 이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;B구간에서 Socket으로 넘겨주는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수신받은 Main Process에서 데이터가 잘리는 현상이 발생했다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceeHet%2FbtsE8zCT6Xp%2FS7yW38LtxLv6ugcErIGv90%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;846&quot; height=&quot;526&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;526&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: #000000;&quot;&gt;B구간에서 수신받는 로직이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빨갛게 표시한 2줄에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버퍼에 대한 크기가 선언되는데&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wcWFE/btsFcjkT27W/5DdgjSK98WQevFywzr6ZDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wcWFE/btsFcjkT27W/5DdgjSK98WQevFywzr6ZDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wcWFE/btsFcjkT27W/5DdgjSK98WQevFywzr6ZDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwcWFE%2FbtsFcjkT27W%2F5DdgjSK98WQevFywzr6ZDK%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;775&quot; height=&quot;204&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS2rp0/btsE9MV8aks/y40NKWCy8dfWI9i0QybFm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS2rp0/btsE9MV8aks/y40NKWCy8dfWI9i0QybFm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS2rp0/btsE9MV8aks/y40NKWCy8dfWI9i0QybFm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS2rp0%2FbtsE9MV8aks%2Fy40NKWCy8dfWI9i0QybFm0%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;753&quot; height=&quot;202&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;202&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: #000000;&quot;&gt;버퍼의 크기는 int 형으로 선언되어있다.&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: #000000;&quot;&gt;난 여기서, 무작정 16비트 int 형이겠거니 하고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwGv2c%2FbtsFaa3xTXk%2FtNIzoRE1cbvKgzR4k7Y27K%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;433&quot; height=&quot;151&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;151&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: #000000;&quot;&gt;ReceiveBufferSize 에 65535를 설정했다.&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: #000000;&quot;&gt;MQTT 로 수신받은 &lt;span style=&quot;text-align: start;&quot;&gt;94326 크기의 데이터가,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;65535 로 1회&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;28791 로 1회&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: #000000; text-align: start;&quot;&gt;데이터가 잘려서 2회 나눠서 수신됐다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수정 1&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqXwl/btsFbZGYXin/pw1VxAO7o0oCptSPWZNfGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqXwl/btsFbZGYXin/pw1VxAO7o0oCptSPWZNfGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqXwl/btsFbZGYXin/pw1VxAO7o0oCptSPWZNfGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqXwl%2FbtsFbZGYXin%2Fpw1VxAO7o0oCptSPWZNfGK%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;652&quot; height=&quot;275&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;275&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: #000000;&quot;&gt;MQTT 데이터를 수신받은 뒤,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수신받은 데이터 readString을 검사해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터가 다 들어왔음을 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일단 현재 프로세스가 관리하는 데이터들은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전부 Json 방식의 데이터다.&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: #000000;&quot;&gt;MQTT 로 넘어오는 데이터만 유일하게 JArray 방식이라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[ ] 대괄호로 데이터를 구분할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.데이터 수신 후, &quot; [ &quot; 가 있고, &quot; ] &quot; 가 없음 ( 데이터가 잘림 ) 을 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.데이터를 oldString에 저장, 카운터 증가 및 continue ( while 문 다시 반복 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.새로운 데이터 수신, 잘린 데이터이므로 &quot; [ &quot; 가 없음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.카운터가 1 이상이고, &quot; ] &quot; 가 있을 시, ( 잘린 데이터의 마지막 부분 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5.oldString와 현재 데이터 합침, 카운터 초기화&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: #000000;&quot;&gt;즉, 데이터가 잘려서 여러번 수신됐을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잘린 데이터를 합치는 로직을 추가한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 곰곰히 생각해보니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 생각이 잘못됨을 알게됐다&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM9Ckd/btsE9MV7YSh/4meav4UQLQTRLRapkuNnQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM9Ckd%2FbtsE9MV7YSh%2F4meav4UQLQTRLRapkuNnQK%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;1065&quot; height=&quot;517&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;517&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: #000000;&quot;&gt;A 구간에서, local MQTT로 수신받은 데이터는 94326 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수신받은 Process B 에서 log로 데이터의 size를 확인한 값이다.&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: #000000;&quot;&gt;B 구간에서, 데이터가 깨져서 수신된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러니, 깨진 데이터를 합쳐서 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이걸 잘 생각해보면 모순이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A 구간에서 크기 65535 이상 데이터를 잘 받아놓고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;B 구간에서 크기 65535 이상이면 잘리는걸까?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiDyAb/btsE9M9FJmr/2KmUmNANe5n6SCdIN3xgz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiDyAb/btsE9M9FJmr/2KmUmNANe5n6SCdIN3xgz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiDyAb/btsE9M9FJmr/2KmUmNANe5n6SCdIN3xgz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiDyAb%2FbtsE9M9FJmr%2F2KmUmNANe5n6SCdIN3xgz1%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;772&quot; height=&quot;184&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;184&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: #000000;&quot;&gt;A 구간에서, MQTT 메시지 수신 이벤트 함수다.&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: #000000;&quot;&gt;메시지를 수신받으면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UTF8 인코딩 후&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트를 발생시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 사용중인 MQTT 라이브러리의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 버퍼 사이즈는 256*1024다.&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: #000000;&quot;&gt;따라서, 크기가 65535 가 넘는 값이 들어와도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정상적으로 A 구간에서 데이터를 넘겨준 것이다.&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: #000000;&quot;&gt;B 구간도, 단순하게 버퍼 사이즈를 늘려주면 되는거였다 ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수정 2&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceeHet/btsE8zCT6Xp/S7yW38LtxLv6ugcErIGv90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceeHet%2FbtsE8zCT6Xp%2FS7yW38LtxLv6ugcErIGv90%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;846&quot; height=&quot;526&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ReceiveBufferSize와, SendBufferSize를 다시 꼼꼼히 확인해봤다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwGv2c/btsFaa3xTXk/tNIzoRE1cbvKgzR4k7Y27K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwGv2c%2FbtsFaa3xTXk%2FtNIzoRE1cbvKgzR4k7Y27K%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;433&quot; height=&quot;151&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;151&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: #000000;&quot;&gt;내가 지정한 크기값, int 형으로 65535를 설정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;int 형을 들여다보니&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bElCAi/btsFbYafK9I/gkTPGMbgTpebhKBgdMZNQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bElCAi/btsFbYafK9I/gkTPGMbgTpebhKBgdMZNQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bElCAi/btsFbYafK9I/gkTPGMbgTpebhKBgdMZNQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbElCAi%2FbtsFbYafK9I%2FgkTPGMbgTpebhKBgdMZNQK%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;779&quot; height=&quot;159&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;159&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: #000000;&quot;&gt;32비트형 int였다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4,294,967,295 까지 표현 가능...........................&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEaBwF/btsFclbXKbL/uJnbkOE2KSJukx2uD2pYlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEaBwF/btsFclbXKbL/uJnbkOE2KSJukx2uD2pYlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEaBwF/btsFclbXKbL/uJnbkOE2KSJukx2uD2pYlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEaBwF%2FbtsFclbXKbL%2FuJnbkOE2KSJukx2uD2pYlK%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;445&quot; height=&quot;94&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;94&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: #000000;&quot;&gt;256*1024로 살짝 늘려주고&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: #000000;&quot;&gt;모든 오류가 해결됐다. ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;패킷 나눠서 수신받는 경험을 할 수 있어서 좋았지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생각보다 단순하고 허무한 해결책이 있는걸 깨달았을때는&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: #000000;&quot;&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 style=&quot;color: #000000;&quot;&gt;처음 이슈 났을 때, Exception로그만 봤을때는 정확한 원인을 알 수 없어서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 크기가 원인인줄 몰랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한두시간을 헤맸었는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 시간이 아깝다는 생각이 들었었다.&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: #000000;&quot;&gt;근데 또 시간이 지나니까 오히려 좋은 경험인 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자료형을 더 꼼꼼히 신경쓰게되고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 정말 잘 모르는구나를 더 와닿게 느낄 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 기본적인 개념에 관한 글을 쓰는게 부끄러워 숨기고싶긴한데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;드러내야 발전이 있을거라 생각해서 흑&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: #000000;&quot;&gt;자료형 더 꼼꼼히 신경쓰고 관심 가져야겠다&lt;/span&gt;&lt;/p&gt;</description>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/99</guid>
      <comments>https://iruk.tistory.com/99#entry99comment</comments>
      <pubDate>Wed, 21 Feb 2024 22:36:48 +0900</pubDate>
    </item>
    <item>
      <title>Encoding</title>
      <link>https://iruk.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하면서, UTF나 유니코드 등의 용어를 자주 접하지만&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;Encoding관련 에러가 발생해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이참에 궁금해서 알아보았다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;시간이 흘러 다양한 국가의 언어를 지원하게 되면서&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;h3 data-ke-size=&quot;size23&quot;&gt;UTF-7, UTF-8, UTF-16, UTF-32&lt;/h3&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;에러 원인&lt;/h2&gt;
&lt;pre id=&quot;code_1707915417003&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void MQTTOnReceived(byte[] recv)
{
    string recvData = Encoding.Default.GetString(recv).Replace(&quot;\u0000&quot;, System.String.Empty);
}&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;MQTT 데이터 수신 이벤트다.&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;Encoding.Default로 데이터를 받아올때,&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;1139&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mrREm/btsERjTQov6/eUxqRuZ8FTekMqRWdEcP20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mrREm/btsERjTQov6/eUxqRuZ8FTekMqRWdEcP20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mrREm/btsERjTQov6/eUxqRuZ8FTekMqRWdEcP20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmrREm%2FbtsERjTQov6%2FeUxqRuZ8FTekMqRWdEcP20%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;1139&quot; height=&quot;110&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;110&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;FactoryName 값에 한글이 저장돼서&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;왜 Encoding.Default는 오류가 발생하는지 이해가 안돼서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoding.Default가 뭔지 알아봤다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Encoding.Default 방식&lt;/h2&gt;
&lt;pre id=&quot;code_1707915948403&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static Encoding Default
{
    [SecuritySafeCritical]
    get
    {
        if (defaultEncoding == null)
        {
            defaultEncoding = CreateDefaultEncoding();
        }

        return defaultEncoding;
    }
}

[SecurityCritical]
private static Encoding CreateDefaultEncoding()
{
    int aCP = Win32Native.GetACP();
    return aCP switch
    {
        1252 =&amp;gt; new SBCSCodePageEncoding(aCP),
        65001 =&amp;gt; s_defaultUtf8EncodingNoBom,
        _ =&amp;gt; GetEncoding(aCP),
    };
}

[SecuritySafeCritical]
[__DynamicallyInvokable]
public static Encoding GetEncoding(int codepage)
{
    Encoding encoding = EncodingProvider.GetEncodingFromProvider(codepage);
    if (encoding != null)
    {
        return encoding;
    }

    if (codepage &amp;lt; 0 || codepage &amp;gt; 65535)
    {
        throw new ArgumentOutOfRangeException(&quot;codepage&quot;, Environment.GetResourceString(&quot;ArgumentOutOfRange_Range&quot;, 0, 65535));
    }

    if (encodings != null)
    {
        encoding = (Encoding)encodings[codepage];
    }

    if (encoding == null)
    {
        lock (InternalSyncObject)
        {
            if (encodings == null)
            {
                encodings = new Hashtable();
            }

            if ((encoding = (Encoding)encodings[codepage]) != null)
            {
                return encoding;
            }

            switch (codepage)
            {
                case 0:
                    encoding = Default;
                    break;
                case 1200:
                    encoding = Unicode;
                    break;
                case 1201:
                    encoding = BigEndianUnicode;
                    break;
                case 1252:
                    encoding = new SBCSCodePageEncoding(codepage);
                    break;
                case 65001:
                    encoding = UTF8;
                    break;
                case 1:
                case 2:
                case 3:
                case 42:
                    throw new ArgumentException(Environment.GetResourceString(&quot;Argument_CodepageNotSupported&quot;, codepage), &quot;codepage&quot;);
                case 20127:
                    encoding = ASCII;
                    break;
                case 28591:
                    encoding = Latin1;
                    break;
                default:
                    encoding = GetEncodingCodePage(codepage);
                    if (encoding == null)
                    {
                        encoding = GetEncodingRare(codepage);
                    }

                    break;
            }

            encodings.Add(codepage, encoding);
            return encoding;
        }
    }

    return encoding;
}&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;/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;찾아보니 윈도우는 ANSI? 라는 인코딩 방식을 기본으로 사용하고,&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UTF-8로 수정&lt;/h2&gt;
&lt;pre id=&quot;code_1707916228021&quot; class=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;private void MQTTOnReceived(byte[] recv)
{
    string recvData = Encoding.UTF8.GetString(recv).Replace(&quot;\u0000&quot;, System.String.Empty);
}&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;한글을 지원하는 UTF-8방식으로 수정 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FactoryName 한글 관련 오류가 사라졌다.&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;그 외에도, EUC-KR, CP949 등 한글지원 인코딩 방식이 있다고 한다.&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;</description>
      <category>개발/C#</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/98</guid>
      <comments>https://iruk.tistory.com/98#entry98comment</comments>
      <pubDate>Wed, 14 Feb 2024 22:14:29 +0900</pubDate>
    </item>
    <item>
      <title>C# - class &amp;amp; structure</title>
      <link>https://iruk.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사내에서 지금까지 개발한 데이터 수집 엔진( 프로그램 )이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 3가지 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면 A-&amp;gt;B-&amp;gt;C 순으로 업그레이드 됐는데,&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;여전히 A, B 엔진이 적용된 곳이 있어서&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;그 중에서 B 엔진을 C 엔진에 맞게 업그레이드? 병합? 하는 작업을 진행했다.&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;병합 작업을 진행하면서, 나의 부족한 C# 개발 지식으로 다양한 오류를 접하게 됐다.&lt;br /&gt;참조한 reference가 null 오류&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 비효율적인 class 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baG84L/btsEE3RCCXJ/sgp8Y0odzTbzPTIi1NZzqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baG84L/btsEE3RCCXJ/sgp8Y0odzTbzPTIi1NZzqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baG84L/btsEE3RCCXJ/sgp8Y0odzTbzPTIi1NZzqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaG84L%2FbtsEE3RCCXJ%2Fsgp8Y0odzTbzPTIi1NZzqk%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;251&quot; height=&quot;666&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;666&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;최소한의 class 단위로 구분해서 작성하라는&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;무조건 class만 사용해서 개발해왔다.&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;변수 선언이나 구조를 잡을때도 무조건 class만 사용해왔다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B엔진에서 외부 데이터를 MQTT로 수신&lt;/li&gt;
&lt;li&gt;외부 데이터를 병합할 C 엔진 구조에 맞게 파싱&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔진을 병합하는 기준을 위처럼 크게 2가지로 나눌 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 데이터를 MQTT로 수신 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값만 저장해서 Parsing 및 저장하는 로직을 개발중이었다.&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;즉, 외부 데이터를 MQTT로 수신할때마다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 갖고있는 class 객체를 매번 생성해주면서&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;/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;br /&gt;틀에박혀서 class 사용을 벗어나지 못했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결책 1&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-객체를 1개만 생성, 외부 데이터 수신마다 값만 update&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;객체를 매번 new 하지 않고, 객체를 최초 1회 생성 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 필요한 class들이 생성될때마다&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnmcv8/btsEHomM8Xi/qOUPDE5iuEU0dlPzUxkMs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnmcv8/btsEHomM8Xi/qOUPDE5iuEU0dlPzUxkMs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnmcv8/btsEHomM8Xi/qOUPDE5iuEU0dlPzUxkMs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnmcv8%2FbtsEHomM8Xi%2FqOUPDE5iuEU0dlPzUxkMs0%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;820&quot; height=&quot;345&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;345&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;인스턴스가 필요한 DevicePacketClass가 매번 new 되기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 1개만 갖고있는다고 해도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 여러개의 DevicePacketClass 들이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 인스턴스 1개를 공유하는 셈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 class라서 힙 메모리에 저장되니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reference가 참조되어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본값을 그대로 갖고있는게 또 문제긴 하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실패&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결책 2&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-struct 사용&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;몇시간 고민한 끝에,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;몇시간 틀에박힌 생각을 거듭한 끝에서야&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;class를 벗어날 수 있었다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 내가 처한 오류의 근본적인 원인을 찾지 못했기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제가 뭘까? 라는 생각을 버리고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내가 필요한 경우가 뭘까? 로 생각을 바꿔봤다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내가 필요한건,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1.외부 데이터 MQTT 수신&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2.수신한 데이터 값 저장 및 Parsing&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;난 &quot;값&quot;만 필요한 것이기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;굳이 class로 선언해서,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 class 안에 list를 만들고&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 list를 참조할 수 있게,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;class 인스턴스를 new 하고, 등의 과정이 필요없는것이다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 structure로 파싱할 데이터 구조만 static으로 잡고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 structure에 값만 저장하고, 참조하면 되지 않을까? 로 결론이 났다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결책2 적용, 성공&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ynhVR/btsEFgJ2wKg/AAp18iILJzhKfkrCIXhbb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ynhVR/btsEFgJ2wKg/AAp18iILJzhKfkrCIXhbb0/img.png&quot; data-alt=&quot;structure 데이터를 List에 저장, static 선언&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ynhVR/btsEFgJ2wKg/AAp18iILJzhKfkrCIXhbb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FynhVR%2FbtsEFgJ2wKg%2FAAp18iILJzhKfkrCIXhbb0%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;1049&quot; height=&quot;839&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;839&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;structure 데이터를 List에 저장, static 선언&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9BxM/btsEEGP2tqa/TZ0CRkbjF7hKXRX0ekKQbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9BxM/btsEEGP2tqa/TZ0CRkbjF7hKXRX0ekKQbK/img.png&quot; data-alt=&quot;선언한 List를 가져오는 메소드 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9BxM/btsEEGP2tqa/TZ0CRkbjF7hKXRX0ekKQbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9BxM%2FbtsEEGP2tqa%2FTZ0CRkbjF7hKXRX0ekKQbK%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;476&quot; height=&quot;183&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선언한 List를 가져오는 메소드 호출&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;다른 class에서 참조할 List를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static으로 선언,&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;List안의 값들이 가진 structure를 선언해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 class의 인스턴스를 만들 필요없게끔 수정했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;한 줄 한 줄 마다&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatGPT를 사용하면서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 제공해주는 코드를 한 줄 한 줄&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;br /&gt;'그냥' '지금껏 그랬으니까' 식의 개발습관이 들어서는 절대 안되겠다고 다짐했다.&lt;/p&gt;</description>
      <category>개발/C#</category>
      <category>c#</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/97</guid>
      <comments>https://iruk.tistory.com/97#entry97comment</comments>
      <pubDate>Sat, 10 Feb 2024 14:20:05 +0900</pubDate>
    </item>
    <item>
      <title>소프트웨어 설계 수정</title>
      <link>https://iruk.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iruk.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.01.01 - [개발/C#] - 모니터링 자동화 - API Parsing&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704713981587&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;모니터링 자동화 - API Parsing&quot; data-og-description=&quot;2023.12.24 - [개발/C#] - 모니터링 자동화 - 비동기 변경 모니터링 자동화 - 비동기 변경 2023.12.21 - [개발 기록/C#] - 모니터링 자동화 - Excel Write 모니터링 자동화 - Excel Write 2023.12.18 - [개발 기록/C#] - 모&quot; data-og-host=&quot;iruk.tistory.com&quot; data-og-source-url=&quot;https://iruk.tistory.com/95&quot; data-og-url=&quot;https://iruk.tistory.com/95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dcP9c4/hyU2eg7Znh/6X56WVP9bbJExazvKcTUb0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EFPq5/hyU2r1RuIA/giijfsPUDjkI4BWIGU4oC0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://iruk.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iruk.tistory.com/95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dcP9c4/hyU2eg7Znh/6X56WVP9bbJExazvKcTUb0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EFPq5/hyU2r1RuIA/giijfsPUDjkI4BWIGU4oC0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&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;모니터링 자동화 - API Parsing&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023.12.24 - [개발/C#] - 모니터링 자동화 - 비동기 변경 모니터링 자동화 - 비동기 변경 2023.12.21 - [개발 기록/C#] - 모니터링 자동화 - Excel Write 모니터링 자동화 - Excel Write 2023.12.18 - [개발 기록/C#] - 모&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iruk.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지는 자동화 개발을 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 C# 윈폼 프로그램에서 진행했다&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;고도화를 진행하다보니 많이 수정이 필요해졌다&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구조 변경&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlRZU9/btsDdI1sJE7/gY2C5Z3WhD9kKf7Dp0mfHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlRZU9/btsDdI1sJE7/gY2C5Z3WhD9kKf7Dp0mfHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlRZU9/btsDdI1sJE7/gY2C5Z3WhD9kKf7Dp0mfHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlRZU9%2FbtsDdI1sJE7%2FgY2C5Z3WhD9kKf7Dp0mfHk%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;676&quot; height=&quot;338&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;556&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;API 호출, DB 저장, 조회 등을 수행했는데&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 호출 &amp;amp; DB 저장을 하나의 프로그램에서 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 조회 &amp;amp; 파일 Write를 다른 프로그램에서 진행한다.&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;주기적으로 API 호출 및 DB에 값을 Insert한다.&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;/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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2024-01-08 205048.png&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx5spk/btsC6oDxYnI/8dOMK2bRC7nXrfUz96Ke21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx5spk/btsC6oDxYnI/8dOMK2bRC7nXrfUz96Ke21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx5spk/btsC6oDxYnI/8dOMK2bRC7nXrfUz96Ke21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx5spk%2FbtsC6oDxYnI%2F8dOMK2bRC7nXrfUz96Ke21%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;1147&quot; height=&quot;700&quot; data-filename=&quot;화면 캡처 2024-01-08 205048.png&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 DB ERD 를 깔짝 만들고 있는데&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;버그도 많이 잡아준다고 느껴서&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;</description>
      <category>개발/C#</category>
      <author>Re::cord</author>
      <guid isPermaLink="true">https://iruk.tistory.com/96</guid>
      <comments>https://iruk.tistory.com/96#entry96comment</comments>
      <pubDate>Mon, 8 Jan 2024 20:50:52 +0900</pubDate>
    </item>
  </channel>
</rss>