<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>wnsl2002ok 님의 블로그</title>
    <link>https://wnsl2002ok.tistory.com/</link>
    <description>wnsl2002ok 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 17:26:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>wnsl2002ok</managingEditor>
    <image>
      <title>wnsl2002ok 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8516057/attach/1cf92be350c54a8e861fe49129349f41</url>
      <link>https://wnsl2002ok.tistory.com</link>
    </image>
    <item>
      <title>질문을 잘 해도 틀릴 수 있다: 포트원 인증 이슈로 본 LLM의 한계</title>
      <link>https://wnsl2002ok.tistory.com/8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;1. 글을 쓰게 된 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새&amp;nbsp;기술을&amp;nbsp;익힐&amp;nbsp;때&amp;nbsp;LLM은&amp;nbsp;굉장히&amp;nbsp;편하다.&amp;nbsp; &lt;br /&gt;그래서&amp;nbsp;사실&amp;nbsp;프로젝트를&amp;nbsp;하던&amp;nbsp;중&amp;nbsp;시간에&amp;nbsp;쫓기면&amp;nbsp;내&amp;nbsp;스스로&amp;nbsp;학습을&amp;nbsp;하지&amp;nbsp;않고,&amp;nbsp; &lt;br /&gt;학습은&amp;nbsp;나중으로&amp;nbsp;미룬&amp;nbsp;채&amp;nbsp;일단&amp;nbsp;LLM으로&amp;nbsp;개발을&amp;nbsp;먼저&amp;nbsp;할&amp;nbsp;때가&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;문서&amp;nbsp;요약도&amp;nbsp;빠르고&amp;nbsp;개발도&amp;nbsp;빠르다.&amp;nbsp;쓰지&amp;nbsp;않을&amp;nbsp;이유가&amp;nbsp;없다. &lt;br /&gt;이번&amp;nbsp;문제는&amp;nbsp;내가&amp;nbsp;프론트엔드에서&amp;nbsp;인증&amp;nbsp;부분을&amp;nbsp;맡게&amp;nbsp;되면서&amp;nbsp;생기게&amp;nbsp;된&amp;nbsp;문제다. &lt;br /&gt;우리는&amp;nbsp;핀테크&amp;nbsp;프로젝트를&amp;nbsp;개발&amp;nbsp;중이었고,&amp;nbsp;금융권인&amp;nbsp;만큼 &lt;br /&gt;인증&amp;nbsp;부분이&amp;nbsp;중요하다고&amp;nbsp;판단했다. &lt;br /&gt;&lt;br /&gt;포트원&amp;nbsp;인증을&amp;nbsp;개발하며&amp;nbsp;LLM을&amp;nbsp;이용한&amp;nbsp;코딩을&amp;nbsp;시작했다. &lt;br /&gt;웹으로&amp;nbsp;하는&amp;nbsp;것은&amp;nbsp;빠르고&amp;nbsp;상당히&amp;nbsp;타당해&amp;nbsp;보였으며, &lt;br /&gt;무엇보다도&amp;nbsp;React&amp;nbsp;기반으로&amp;nbsp;인증&amp;nbsp;창을&amp;nbsp;여는&amp;nbsp;것은&amp;nbsp;빌드&amp;nbsp;방식을&amp;nbsp;바꿔야&amp;nbsp;하는데&amp;nbsp;이것이&amp;nbsp;여간&amp;nbsp;오래&amp;nbsp;걸리는&amp;nbsp;방식이라서,&amp;nbsp;간단하고&amp;nbsp;빠르게&amp;nbsp;구현하기&amp;nbsp;위해&amp;nbsp;인증을&amp;nbsp;웹에서&amp;nbsp;하는&amp;nbsp;식으로&amp;nbsp;구현했다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;실제로는&amp;nbsp;그렇지&amp;nbsp;않았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.&amp;nbsp;문제가&amp;nbsp;없는&amp;nbsp;줄&amp;nbsp;알았다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;내가&amp;nbsp;아이폰&amp;nbsp;사용자이다&amp;nbsp;보니 &lt;br /&gt;갤럭시는&amp;nbsp;내&amp;nbsp;것으로&amp;nbsp;사용하는&amp;nbsp;게&amp;nbsp;아니라&amp;nbsp;공기계&amp;nbsp;테스트&amp;nbsp;폰을&amp;nbsp;따로&amp;nbsp;사용했다. &lt;br /&gt;&lt;br /&gt;문제는&amp;nbsp;이때&amp;nbsp;공기계로&amp;nbsp;인증을&amp;nbsp;할&amp;nbsp;때는&amp;nbsp;앱을&amp;nbsp;계속&amp;nbsp;띄워놓고&amp;nbsp;인증을&amp;nbsp;하다&amp;nbsp;보니,&amp;nbsp;이때는&amp;nbsp;문제를&amp;nbsp;알아채지&amp;nbsp;못했다. &lt;br /&gt;&lt;br /&gt;실제&amp;nbsp;문제는&amp;nbsp;안드로이드에서&amp;nbsp;발생했다. &lt;br /&gt;웹에서&amp;nbsp;인증을&amp;nbsp;시작한&amp;nbsp;뒤&amp;nbsp;외부&amp;nbsp;앱으로&amp;nbsp;이동하고,&amp;nbsp;다시&amp;nbsp;복귀하면&amp;nbsp;인증&amp;nbsp;진행에&amp;nbsp;필요한&amp;nbsp;중간&amp;nbsp;페이지가&amp;nbsp;유지되지&amp;nbsp;않았다. &lt;br /&gt;그&amp;nbsp;결과&amp;nbsp;계정&amp;nbsp;생성과&amp;nbsp;계좌&amp;nbsp;생성이&amp;nbsp;실패했다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;때문에&amp;nbsp;계정&amp;nbsp;생성이나&amp;nbsp;계좌&amp;nbsp;생성이&amp;nbsp;불가능한&amp;nbsp;문제가&amp;nbsp;생겼다... &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;내가&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;질문을&amp;nbsp;했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.&amp;nbsp;내가&amp;nbsp;질문을&amp;nbsp;잘못한&amp;nbsp;줄&amp;nbsp;알았다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;내 스스로도 처음 질문은 추상적이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;사진1.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGkBy/dJMcadPdGzM/ovkPjt4ArViKG6IYNA9Jlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGkBy/dJMcadPdGzM/ovkPjt4ArViKG6IYNA9Jlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGkBy/dJMcadPdGzM/ovkPjt4ArViKG6IYNA9Jlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGkBy%2FdJMcadPdGzM%2FovkPjt4ArViKG6IYNA9Jlk%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;766&quot; height=&quot;257&quot; data-filename=&quot;사진1.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;LLM이&amp;nbsp;이를&amp;nbsp;다르게&amp;nbsp;해석할&amp;nbsp;여지가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;생각했다. &lt;br /&gt;그래서&amp;nbsp;상황과&amp;nbsp;증상을&amp;nbsp;더&amp;nbsp;자세히&amp;nbsp;설명해&amp;nbsp;다시&amp;nbsp;질문했다. &lt;br /&gt;하지만 두 번째 질문을 했는데 잘 되지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;사진2.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM43Pb/dJMcaiJMkTD/J20dfetHdvr6Dy2TTa8qSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM43Pb/dJMcaiJMkTD/J20dfetHdvr6Dy2TTa8qSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM43Pb/dJMcaiJMkTD/J20dfetHdvr6Dy2TTa8qSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM43Pb%2FdJMcaiJMkTD%2FJ20dfetHdvr6Dy2TTa8qSK%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;769&quot; height=&quot;491&quot; data-filename=&quot;사진2.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;그런데도&amp;nbsp;LLM은&amp;nbsp;기존의&amp;nbsp;대답에서&amp;nbsp;빙빙&amp;nbsp;돌았다. &lt;br /&gt;&lt;br /&gt;문제를&amp;nbsp;분석하기보다는&amp;nbsp;자신이&amp;nbsp;익숙한&amp;nbsp;해결&amp;nbsp;방식으로&amp;nbsp;밀어붙인&amp;nbsp;것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 여기서 깨달은 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;경험으로&amp;nbsp;알게&amp;nbsp;된&amp;nbsp;것은&amp;nbsp;단순하다. &lt;br /&gt;내가&amp;nbsp;기술을&amp;nbsp;알지&amp;nbsp;못하면&amp;nbsp;오답을&amp;nbsp;거를&amp;nbsp;수&amp;nbsp;없다. &lt;br /&gt;LLM은&amp;nbsp;&quot;그럴듯한&amp;nbsp;정답&quot;은&amp;nbsp;잘&amp;nbsp;만들지만,&amp;nbsp;내가&amp;nbsp;그&amp;nbsp;기술에&amp;nbsp;대해서&amp;nbsp;잘&amp;nbsp;알지&amp;nbsp;못하면&amp;nbsp;그&amp;nbsp;답이&amp;nbsp;진짜인지&amp;nbsp;아닌지&amp;nbsp;검증이&amp;nbsp;불가능하다. &lt;br /&gt;&lt;br /&gt;이번&amp;nbsp;사례에서는&amp;nbsp;나름&amp;nbsp;잘&amp;nbsp;준비를&amp;nbsp;했다고&amp;nbsp;생각했지만 &lt;br /&gt;결국&amp;nbsp;잘못된&amp;nbsp;길로&amp;nbsp;간&amp;nbsp;사례다. &lt;br /&gt;React&amp;nbsp;웹에서도&amp;nbsp;가능하다고&amp;nbsp;했으며&amp;nbsp;해결책도&amp;nbsp;명확히&amp;nbsp;제시했다. &lt;br /&gt;문제는&amp;nbsp;그&amp;nbsp;답변이&amp;nbsp;내가&amp;nbsp;실제로&amp;nbsp;겪고&amp;nbsp;있는&amp;nbsp;현상과&amp;nbsp;맞물리는지&amp;nbsp;따지지&amp;nbsp;않았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;5.&amp;nbsp;그렇다면&amp;nbsp;새&amp;nbsp;기술에서는&amp;nbsp;어떻게&amp;nbsp;쓸까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;이후에&amp;nbsp;나는&amp;nbsp;순서를&amp;nbsp;바꾸었다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;공식&amp;nbsp;문서를&amp;nbsp;통해&amp;nbsp;기술의&amp;nbsp;제약&amp;nbsp;조건을&amp;nbsp;확인&amp;nbsp;한다. &lt;br /&gt;2.&amp;nbsp;기술의&amp;nbsp;한계점이나&amp;nbsp;현재&amp;nbsp;프로젝트에서&amp;nbsp;어떻게&amp;nbsp;기술을&amp;nbsp;사용할지&amp;nbsp;파악한다 &lt;br /&gt;3.&amp;nbsp;그다음으로는&amp;nbsp;내가&amp;nbsp;파악한&amp;nbsp;기술이&amp;nbsp;맞는지&amp;nbsp;요약해서&amp;nbsp;검증한다. &lt;br /&gt;4.&amp;nbsp;상황&amp;nbsp;정리&amp;nbsp;및&amp;nbsp;해석,&amp;nbsp;혹은&amp;nbsp;내가&amp;nbsp;빠뜨린&amp;nbsp;것을&amp;nbsp;체크한다 &lt;br /&gt;5.&amp;nbsp;답을&amp;nbsp;가져와서&amp;nbsp;소규모로&amp;nbsp;내가&amp;nbsp;생각한&amp;nbsp;게&amp;nbsp;맞는지&amp;nbsp;테스트를&amp;nbsp;반복하며&amp;nbsp;개발을&amp;nbsp;이행한다. &lt;br /&gt;&lt;br /&gt;학습&amp;nbsp;-&amp;nbsp;질문&amp;nbsp;-&amp;nbsp;확인&amp;nbsp;-&amp;nbsp;검증 &lt;br /&gt;순서로&amp;nbsp;이어지게&amp;nbsp;했다. &lt;br /&gt;&lt;br /&gt;어느&amp;nbsp;정도&amp;nbsp;시간을&amp;nbsp;쓰더라도 &lt;br /&gt;기술에&amp;nbsp;대해서&amp;nbsp;이해를&amp;nbsp;하고&amp;nbsp;그다음&amp;nbsp;단계를&amp;nbsp;진행하는&amp;nbsp;것이&amp;nbsp;결국에는&amp;nbsp;시간을&amp;nbsp;적게&amp;nbsp;쓰는&amp;nbsp;것이라는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;6.&amp;nbsp;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;LLM은&amp;nbsp;강력하다. &lt;br /&gt;모르는&amp;nbsp;기술을&amp;nbsp;쓸&amp;nbsp;때&amp;nbsp;LLM을&amp;nbsp;정답&amp;nbsp;생성기처럼&amp;nbsp;그냥&amp;nbsp;사용해버리면&amp;nbsp;그럴듯하지만 &lt;br /&gt;결국&amp;nbsp;좋지&amp;nbsp;못한&amp;nbsp;결과물이&amp;nbsp;나온다고&amp;nbsp;생각한다. &lt;br /&gt;&lt;br /&gt;질문을&amp;nbsp;잘하는&amp;nbsp;것도&amp;nbsp;중요하다. &lt;br /&gt;하지만&amp;nbsp;자세한&amp;nbsp;질문을&amp;nbsp;하더라도&amp;nbsp;분명&amp;nbsp;틀릴&amp;nbsp;가능성은&amp;nbsp;존재한다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;복잡하고&amp;nbsp;전문적인&amp;nbsp;과정으로&amp;nbsp;들어갈수록&amp;nbsp;문제이며,&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;문제는&amp;nbsp;틀렸을&amp;nbsp;때의&amp;nbsp;리스크이다. &lt;br /&gt;잠깐은&amp;nbsp;빠르지만 &lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;느려진다 &lt;br /&gt;&lt;br /&gt;모르는&amp;nbsp;기술일때는&amp;nbsp;LLM을&amp;nbsp;바로&amp;nbsp;사용하는&amp;nbsp;것&amp;nbsp;보다는&amp;nbsp;최소한의&amp;nbsp;기술을&amp;nbsp;이해한&amp;nbsp;뒤에 &lt;br /&gt;LLM에게&amp;nbsp;질문을&amp;nbsp;하는&amp;nbsp;것이&amp;nbsp;결국&amp;nbsp;시간을&amp;nbsp;아끼는&amp;nbsp;길이다. &lt;br /&gt;&lt;br /&gt;LLM은&amp;nbsp;정답&amp;nbsp;생성기가&amp;nbsp;아니다. &lt;br /&gt;검증&amp;nbsp;보조&amp;nbsp;도구이다.&lt;/p&gt;</description>
      <category>웹</category>
      <category>LLM #검증</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/8</guid>
      <comments>https://wnsl2002ok.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 21 Apr 2026 20:31:57 +0900</pubDate>
    </item>
    <item>
      <title>API 응답(Response)에 관하여</title>
      <link>https://wnsl2002ok.tistory.com/7</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. API response를 처음 보았을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹을 처음 시작하며 프론트 그리고 백엔드로 요청을 서로 주고받을 때는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 json 형태로 필요한 것만 보내면 되겠지라고 생각하던 시절이 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 json을 보낼 때 단순히 당장 필요한 API 데이터만 보내는 것이 아니라&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;2. API 응답(Response)란?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s8SgC/dJMcadn0M1G/GPtYby6yuaJqDwaCKTPYOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s8SgC/dJMcadn0M1G/GPtYby6yuaJqDwaCKTPYOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s8SgC/dJMcadn0M1G/GPtYby6yuaJqDwaCKTPYOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs8SgC%2FdJMcadn0M1G%2FGPtYby6yuaJqDwaCKTPYOk%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;1024&quot; height=&quot;507&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 응답은 클라이언트의 요청에 대해 서버가 작업 결과를 담아 돌려주는 데이터 꾸러미입니다&lt;/p&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. HTTP 상태 코드 : 이 요청이 성공했는지 실패했는지 알려주는 부분&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;h3 data-ke-size=&quot;size23&quot;&gt;3. API 응답의 본질&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;하지만 이 생각이 이번에 모바일 관련 프로젝트를 하면서 생각이 바뀌게 되었습니다.&lt;/p&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;로그인 페이지 주소가 /auth/login 에서 /signin으로 바뀌었다고 가정하면&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;UI/UX는 사용자의 피드백에 따라서 빈번하게 바뀌지만&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;처음에는 웹만 생각했지만 모바일까지 같이 생각했을 때는 선택이 아니라 필수임을 알 수 있었습니다&lt;/p&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;갤럭시 : intent 이용해 새로운 화면 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워치 : 메시지 띄우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등 기기별로 화면을 전환하고 처리하는 방식이 다르기 때문에 error 코드를 보내서 기기에 따라서 각각 대응이 가능하도록 해야 한다.&lt;/p&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에 따른 서버 클라이언트 역할을 정리해보았습니다.&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;서버의 역할 (상태 전달):&lt;/b&gt; 현재 상황이 어떤지(200: 성공, 401: 인증 실패, 404: 없음 등) 명확한 &quot;상태&quot;만 전달&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;클라이언트의 역할 (행동 결정):&lt;/b&gt; 401이면 로그인 화면으로, 404면 에러 페이지로 사용자를 안내&lt;/li&gt;
&lt;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;4. 우리 프로젝트의 응답 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;우리 프로젝트에서는 모든 응답을 status, message, data 3개 필드로 표준화하여 클라이언트와의 통신 효율을 높였습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;성공 케이스 (예: 소비 리포트 조회)&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;성공 시에는 명확한 안내 문구와 함께 필요한 데이터를 담아 보냅니다. AiTransactionController.java에서 처리되는 응답 예시는 다음과 같습니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjd1cOSk9yTAxUAAAAAHQAAAAAQvgE&quot; data-hveid=&quot;0&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;status&quot;: &quot;SUCCESS&quot;,
  &quot;message&quot;: &quot;소비 리포트 조회가 완료되었습니다.&quot;,
  &quot;data&quot;: {
    &quot;yearMonth&quot;: &quot;2026-03&quot;,
    &quot;totalSpent&quot;: 1943800,
    &quot;spendingPersona&quot;: &quot;쇼핑족&quot;,
    &quot;aiOverallFeedback&quot;: &quot;이번 달은 계획 대비 지출이 많은 편입니다.&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;실패 케이스 (전역 예외 처리)&lt;/p&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;인증 실패나 잘못된 요청 시, GlobalExceptionHandler.java를 통해 일관된 에러 포맷을 제공합니다. 클라이언트는 이 FAIL 신호와 message를 보고 사용자에게 적절한 안내를 띄웁니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjd1cOSk9yTAxUAAAAAHQAAAAAQvwE&quot; data-hveid=&quot;0&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;status&quot;: &quot;FAIL&quot;,
  &quot;message&quot;: &quot;인증이 필요합니다.&quot;,
  &quot;data&quot;: null
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 실패를 대비한 &quot;Fallback&quot; 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 원래 기술의 의도는 아니지만 시연 시 안될 경우를 방지하여 fallback 설계를 이용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 오류가 뜨더라도 fallback 로직을 이용해 저장된 값을 보여주는 형식입니다.&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;6. 마치며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 응답에는 단순히 데이터를 보내기만 하면 되고 error는 애초에 안 나면 되지라는 편리한 생각을 했었는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;error는 단순히 코드를 잘 짠다고 생기는 것이 아니라&lt;/p&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;</description>
      <category>웹</category>
      <category>API</category>
      <category>API Response</category>
      <category>API 응답</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/7</guid>
      <comments>https://wnsl2002ok.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 8 Apr 2026 02:55:30 +0900</pubDate>
    </item>
    <item>
      <title>SDK는 어떤 것 일까?</title>
      <link>https://wnsl2002ok.tistory.com/6</link>
      <description>&lt;p&gt;SDK는 Software Development Kit의 줄임말로, 특정 플랫폼이나 서비스를 개발자가 더 쉽게 사용할 수 있도록 제공되는 개발 도구 모음이다.&lt;/p&gt;
&lt;p&gt;이 정도로만 알고 자주 보기만 한 단어였다.&lt;br&gt;프로젝트를 할 때 쓰면 좀 더 빠르게 개발할 수 있다는 말만 들어보고&lt;br&gt;그 이상은 잘 몰랐다.&lt;/p&gt;
&lt;p&gt;그렇다고 아예 낯선 개념인가?&lt;br&gt;분명히 어디선가 많이 들어본 개념이고, 대략적인 느낌은 알고 있었다.&lt;br&gt;개발자를 위한 키트 정도로 이해하고 있었다.&lt;/p&gt;
&lt;p&gt;처음에는 그냥 가져다 쓰는 코드 뭉치 정도로 생각 했었다.&lt;br&gt;하지만 찾아보려고 하니 뭔가 지나치게 간단하게 이야기 하거나&lt;br&gt;제가 이해하기에는 조금 어려운 부분이 있어 제 스스로 간단히 정리하며&lt;br&gt;저와 같은 입장이신 분들이 편하게 읽었으면 좋겠습니다.&lt;/p&gt;
&lt;h3&gt;SDK를 사용하는 이유&lt;/h3&gt;
&lt;p&gt;SDK를 쓰는 이유는 단순히 코드를 덜 쓰기 위해서만은 아닙니다.&lt;br&gt;로그인, 결제, 지도, 인증 같은 기능은 직접 구현하려고 하면 사실 많은 시간과 노력이 들어갑니다.&lt;br&gt;하지만 SDK는 이런 복잡한 과정을 조금 더 쉽게 시작할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;h3&gt;SDK와 API의 차이점&lt;/h3&gt;
&lt;p&gt;대부분의 SDK에서는 애플리케이션이나 프로젝트를 커맨드라인으로 연결 하기 위해서&lt;br&gt;대부분의 SDK에 는 API가 포함 되어 있습니다.&lt;/p&gt;
&lt;p&gt;SDK는 앱으로 개발 하는 전체 환경을 제공하며&lt;br&gt;API는 그 SDK 안에 포함되거나 단독으로&lt;br&gt;사용되는 &amp;#39;소프트웨어 간 통신 창구 입니다&amp;#39;&lt;br&gt;API는 특정 기능의 호출에 집중합니다.&lt;/p&gt;
&lt;h3&gt;SDK와 API 차이점 요약&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;SDK (Software Development Kit)&lt;/th&gt;
&lt;th&gt;API (Application Programming Interface)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;정의&lt;/td&gt;
&lt;td&gt;소프트웨어 개발을 위한 도구 모음(박스)&lt;/td&gt;
&lt;td&gt;소프트웨어 간 통신을 위한 규칙(창구)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구성 요소&lt;/td&gt;
&lt;td&gt;API, 라이브러리, 문서, 예제 코드, 디버거 등&lt;/td&gt;
&lt;td&gt;함수, 프로토콜, 엔드포인트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;특정 플랫폼용 앱 전체 생성&lt;/td&gt;
&lt;td&gt;다른 서비스의 기능/데이터 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포함 관계&lt;/td&gt;
&lt;td&gt;SDK 내부에 하나 이상의 API 포함&lt;/td&gt;
&lt;td&gt;SDK의 구성 요소 중 하나&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;요리 재료와 도구가 다 든 요리 키트&lt;/td&gt;
&lt;td&gt;식당에서 음식을 주문하는 메뉴판&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;왜 회사들은 SDK를 제공할까?&lt;/h3&gt;
&lt;p&gt;회사들이 SDK를 제공하는 이유도 분명합니다.&lt;br&gt;개발자가 자사 서비스를 더 쉽게 연동할 수 있게 만들고,&lt;br&gt;복잡한 인증이나 요청 흐름을 어느 정도 표준화하며,&lt;br&gt;반복해서 발생하는 실수를 줄이기 위해서입니다.&lt;/p&gt;
&lt;p&gt;결국 SDK는 개발자를 돕는 도구이면서도,&lt;br&gt;자사 서비스를 더 쉽게 확산시키기 위한 방식이기도 합니다.&lt;/p&gt;
&lt;h3&gt;SDK 규칙 및 고려 사항&lt;/h3&gt;
&lt;p&gt;SDK를 사용할 때는 문서와 샘플 코드를 함께 보는 것이 중요합니다.&lt;br&gt;가이드 그리고 코드 샘플을 활용하여 구현 속도를 올리고 오류를 줄입니다.&lt;/p&gt;
&lt;p&gt;정책을 준수하며 Google Play 등 앱 스토어 개발자 정책을 위반하지 않는 SDK를 사용해야 합니다.&lt;/p&gt;
&lt;p&gt;버전 관리&lt;br&gt;정기적으로 SDK 버전을 확인 하고 최신 취약점 패치 혹은 기능 향상이 포함된 버전 사용&lt;/p&gt;
&lt;p&gt;호환성&lt;br&gt;적용시 앱이 구형이나 최신 기기에서도 사용가능한지 확인&lt;/p&gt;
&lt;p&gt;종속성 관리&lt;br&gt;기존 라이브러리와 충돌하는지 확인&lt;/p&gt;
&lt;p&gt;성능 영향&lt;br&gt;기존의 기기에 메모리, 배터리 영향 테스트&lt;/p&gt;
&lt;h3&gt;글을 마무리 하며&lt;/h3&gt;
&lt;p&gt;이런 점들을 보면 SDK는 단순히 기능 몇 개를 묶어 둔 코드라기보다,&lt;br&gt;외부 기능을 내 서비스에 조금 더 쉽게 붙이도록 만든 개발 패키지에 가깝습니다.&lt;/p&gt;
&lt;p&gt;분명 편리한 도구이지만, 그만큼 설정, 버전, 호환성, 종속성 같은 제약도 함께 따라옵니다.&lt;br&gt;그래서 SDK를 쓴다는 것은 단순히 기능 하나를 가져오는 일이 아니라,&lt;br&gt;편리함과 함께 일정한 방식과 제약을 받아들이는 선택이라고 생각합니다.&lt;/p&gt;</description>
      <category>웹</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/6</guid>
      <comments>https://wnsl2002ok.tistory.com/6#entry6comment</comments>
      <pubDate>Wed, 18 Mar 2026 21:14:02 +0900</pubDate>
    </item>
    <item>
      <title>멀티스레딩과 멀티프로세싱의 차이</title>
      <link>https://wnsl2002ok.tistory.com/5</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;부제 : 이것들은 왜 나오게 되었는가&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0.글을 시작하며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티프로세싱과 멀티 쓰레딩을 처음 알았을 때는 굉장히 가슴이 설레었습니다.&lt;br /&gt;하나로 처리하던 것을 두개로 처리를 하면 단순히 생각하면 2배로 빨라지니까요&lt;br /&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;br /&gt;어떤 상황에 써야 효율적으로 사용할 수 있는지를 학습하며 글로 정리해 보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CPU와 운영체제의 발전&lt;/li&gt;
&lt;li&gt;멀티프로세스와 멀티스레드는 왜 나왔는가&lt;/li&gt;
&lt;li&gt;멀티프로세스와 멀티스레드의 구조적 차이&lt;/li&gt;
&lt;li&gt;어떤것이 더 좋은가?&lt;/li&gt;
&lt;li&gt;실제 코드로 실험 해보기&lt;/li&gt;
&lt;li&gt;멀티프로세스의 장단점&lt;/li&gt;
&lt;li&gt;멀티스레드의 장단점&lt;/li&gt;
&lt;li&gt;그렇다면 뭐가 좋은 걸까?&lt;/li&gt;
&lt;li&gt;마무리&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.CPU와 운영체제의 발전&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-1 한번에 하나씩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 컴퓨터는 한 번에 하나의 프로그램을 실행하며 순차 실행하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 어떻게 하면 하나의 프로그램을 빠르게 처리할지를 생각했을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CPU의 클럭을 높여서 성능을 높이는 게 주요 발전 방향이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-2 발전에 따라서 프로그램은 여러가지의 일을 하게 되었습니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 음악 프로그램을 재생하며 사용자 입력받기&lt;br /&gt;- 브라우저가 화면을 보여주며 네트워크 응답 기다리기&lt;br /&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시분할 처리 방식으로 CPU의 시간을 잘게 나누어서 여러 작업이 동시에 실행 되도록 하였고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 CPU는 빠르게 A, B, C 작업을 번갈아가며 처리하지만&lt;br /&gt;사용자는 동시에 처리되는 것처럼 느낍니다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-3 단일 코어의 속도 향상의 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 CPU 성능을 올리는 것에는 한계가 존재합니다.&lt;br /&gt;- 발열&lt;br /&gt;- 전력 소모&lt;br /&gt;- 메모리 병목&lt;br /&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;등의 이유로 CPU의 발전 방향은 한 코어를 빠르게 만들 자에서 여러 코어를 두고 병렬로 처리하는 방향으로 발전하게 됩니다.&lt;br /&gt;이 지점부터 멀티 프로세스와 멀티스레드가 점점 의미가 있어집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 멀티프로세스와 멀티스레드는 왜 나왔는가&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1 멀티 프로세스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 실행 중인 프로그램의 인스턴스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제는 각 프로세스에 독립된 메모리 공간 제공&lt;br /&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;장점&lt;br /&gt;- 서로 간 메모리 간섭 어렵다&lt;br /&gt;- 하나가 문제 생겨도 다른 하나에 영향이 적다&lt;br /&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;br /&gt;- 메모리를 더 사용&lt;br /&gt;- 서로 데이터를 주고받으려면 IPC 필요&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;2-2 멀티스레드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 프로그램에서 여러 흐름을 동시에 처리하고 싶은데, 매번 프로세스를 만드는 건 부담일 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 : 같은 프로세스 내에서 동작하는 실행 흐름&lt;/p&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;
&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;br /&gt;- 같은 데이터 공유 쉬움&lt;br /&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;- race condition&lt;br /&gt;- deadlock&lt;br /&gt;- 동기화 비용&lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 멀티프로세스와 멀티스레드의 구조적 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 표로 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티프로세스 vs 멀티스레드 비교&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;멀티프로세스&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;멀티스레드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;메모리 공간&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;각자 독립&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;같은 프로세스 안에서 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;생성 비용&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;큼&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;상대적으로 작음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;문맥 전환 비용&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;큼&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;상대적으로 작음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;데이터 공유&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;IPC 필요&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;메모리 공유 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;안정성&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;장애 영향 범위&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;비교적 분리됨&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;한 스레드 문제로 전체 프로세스 영향 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;디버깅&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;상대적으로 단순&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;대표 사용 예&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;브라우저 탭 분리, 워커 프로세스, 독립 서비스&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;웹 요청 처리, 백그라운드 작업, UI + 작업 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 어떤것이 더 좋은가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 모두 좋다 나쁘다 할 수 없습니다.&lt;br /&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;CPU Bound 작업 CPU 계산이 대부분인 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대량 수학 연산&lt;br /&gt;- 이미지 처리&lt;br /&gt;- 암호화/복호화&lt;br /&gt;- 해시 계산&lt;br /&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;CPU를 실제로 얼마나 병렬로 활용한 지가 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O Bound 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CPU 계산보단 기다리는 게 많은 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 읽기/쓰기&lt;br /&gt;- 네트워크 요청&lt;br /&gt;- DB 응답 대기&lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;5. 실제 코드로 실험 해보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 이야기드린 것처럼 멀티스레딩 그리고 멀티프로세싱의 가장 큰 차이는 메모리 공간의 공유 여부입니다.&lt;br /&gt;이해를 돕기 위해 자바 코드로 두 가지 방식의 차이를 구현해 보았습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-1. 멀티스레딩 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드들은 같은 메모리를 공유할 수 있다는 것을 보여주는 예시입니다. 하나의 공유 객체를 두 개의 스레드가 동시에 접근하여&lt;br /&gt;값을 변경합니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;class SharedVault {  
    // 두 스레드가 공유할 공통 변수 (금고)  
    private int money = 0;  

    // 의도적으로 synchronized(동기화 자물쇠)를 걸지 않음  
    public void addMoney() {  
        money++;   
    }  

    public int getMoney() {  
        return money;  
    }  
}  

public class MultiThreadExperiment {  
    public static void main(String\[\] args) throws InterruptedException {  
        SharedVault vault = new SharedVault();  

        // 스레드 A: 금고에 1원씩 10,000번 넣기  
        Thread threadA = new Thread(() -&amp;gt; {  
            for (int i = 0; i &amp;lt; 10000; i++) vault.addMoney();  
        });  

        // 스레드 B: 금고에 1원씩 10,000번 넣기 (스레드 A와 동일한 금고 공유)  
        Thread threadB = new Thread(() -&amp;gt; {  
            for (int i = 0; i &amp;lt; 10000; i++) vault.addMoney();  
        });  

        threadA.start();  
        threadB.start();  

        threadA.join();  
        threadB.join();  

        // 예상 결과는 20,000원이지만, 실제로는 13,421원 등 매번 부족한 금액이 출력됨  
        System.out.println(&quot;최종 금고 잔액: &quot; + vault.getMoney() + &quot;원&quot;);  
    }  
}  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시 코드의 결과입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;멀티 스레드는 하나의 프로세스 내에서 메모리를 공유하기 때문에 이는 데이터를 주고받기 매우 쉽다는 장점이 존재하지만&lt;br /&gt;동시에 여러 스레드가 하나의 데이터에 접근할 때 데이터가 오염되는 경쟁 상태를 유발할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 20000이 나오지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스레드가 +1을 하려고 할 때 최신의 값을 가지고 더한 것이 아니라 아직 갱신되지 않은 옛날의 값을 이용했기 때문&lt;br /&gt;결론 : 스레드는 데이터를 공유하기 때문에 통신 비용이 거의 들지 않아 빠릅니다.&lt;br /&gt;하지만 synchronized 같은 동기화 장치를 마련하지 않으면 치명적인 버그를 낳습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-2. 멀티프로세싱 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스별로 나뉘기 때문에 안전하다는 장점이 존재하지만&lt;br /&gt;프로세스 간 통신(IPC)이라는 번거로운 단점 또한 존재&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.io.IOException;  

public class MultiProcessExperiment {  
    public static void main(String\[\] args) {  
        System.out.println(&quot;부모 프로세스: 자식 프로세스를 생성합니다.&quot;);  

        try {  
            // 완전히 독립된 새로운 프로세스(OS 명령어)를 실행  
            // 맥/리눅스: &quot;echo&quot;, &quot;Hello Process!&quot; | 윈도우: &quot;cmd.exe&quot;, &quot;/c&quot;, &quot;echo Hello Process!&quot;  
            ProcessBuilder pb = new ProcessBuilder(&quot;echo&quot;, &quot;Hello Process!&quot;);  
            Process childProcess = pb.start(); // 자식 프로세스 탄생  

            // ★ 핵심: 메모리를 공유하지 않으므로, 자식의 데이터를 변수로 읽을 수 없음!  
            // 파이프(Stream)를 연결해서 자식 프로세스가 출력한 데이터를 직접 빨아들여야 함 (IPC)  
            BufferedReader reader = new BufferedReader(  
                new InputStreamReader(childProcess.getInputStream())  
            );  

            String result;  
            while ((result = reader.readLine()) != null) {  
                System.out.println(&quot;자식 프로세스로부터 받은 메시지: &quot; + result);  
            }  

            // 만약 자식 프로세스 내부에서 치명적 에러가 발생해 강제 종료되더라도,  
            // 부모 프로세스(현재 코드)는 전혀 영향을 받지 않고 끝까지 실행됨 (격리성)  
            int exitCode = childProcess.waitFor();  
            System.out.println(&quot;부모 프로세스: 자식 프로세스가 안전하게 종료되었습니다. (코드: &quot; + exitCode + &quot;)&quot;);  

        } catch (IOException | InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시 코드의 결과입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bufferedReader를 쓴 이유 프로세스 끼리는 메모리를 들여다볼 수 없어서&lt;br /&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 멀티프로세스의 장단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 멀티 프로세스 장단점을 정리하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;br /&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;br /&gt;서비스를 분리하거나, 워커를 분리하거나, 장애 전파를 막는 데 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU Bound 작업에서 강력할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&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;br /&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;br /&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;br /&gt;서로 데이터를 주고받으려면 파이프, 소켓, 공유 메모리 같은 IPC가 필요합니다.&lt;/p&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;공유 자원을 여러 스레드가 동시에 건드리면 충돌이 발생할 수 있습니다.&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;br /&gt;멀티 스레드 버그는 실행 순서에 따라 나타났다 안 나타났다 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 문제로 전체 프로세스가 영향을 받을 수 있습니다&lt;br /&gt;같은 메모리를 공유한다는 장점은 동시에 위험이기도 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 멀티스레드의 장단점&lt;/h3&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 공유가 쉽습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;같은 메모리 공간을 사용하므로 협업이 자연스럽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O Bound 작업에서 효율적입니다&lt;br /&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;br /&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;br /&gt;멀티스레드 버그는 실행 순서에 따라 나타났다 안 나타났다 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 문제로 전체 프로세스가 영향을 받을 수 있습니다&lt;br /&gt;같은 메모리를 공유한다는 장점은 동시에 위험이기도 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 그렇다면 뭐가 좋은 걸까?&lt;/h3&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;CPU 연산이 많고 병렬 처리가 필요할 때&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;- 독립 실행형 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이미지/영상 처리 파이프라인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브라우저 탭/렌더러 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티 스레드가 잘 맞는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 같은 데이터를 자주 공유해야 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I/O 작업을 많이 동시에 처리할 때&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;- 네트워크 클라이언트&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;h3 data-ke-size=&quot;size23&quot;&gt;9. 마무리&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;&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;br /&gt;문제의 비용과 구조를 보고 어떤 기술을 써야 할지 판단하는 게 더 중요하다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 개념&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1. 시분할&lt;br /&gt;운영 체제가 CPU 시간을 매우 짧게 나누어 여러 작업을 번갈아 처리하는 방식으로&lt;br /&gt;실제로는 순차 처리에 가깝지만 사용자 입장에서는 동시 처리처럼 느껴지게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IPC&lt;br /&gt;서로 다른 프로세스가 데이터를 주고받기 위한 통신 방식, 파이프, 소켓, 메시지 큐, 공유 메모리 등&lt;/p&gt;</description>
      <category>웹</category>
      <category>멀티스레트</category>
      <category>멀티프로세스</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/5</guid>
      <comments>https://wnsl2002ok.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 12 Mar 2026 00:46:30 +0900</pubDate>
    </item>
    <item>
      <title>c++ 과 java의 메모리 다루는 차이</title>
      <link>https://wnsl2002ok.tistory.com/4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 글을 시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ , JAVA 모두 객체 지향 언어인데 하나만 쓸까?&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;그리고 두 언어는 단점 혹은 장점을 그대로 두거나 살리거나 어떻게 변했는지에 대해서 글을 적어보려고 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 두 언어는 어떻게 빌드 되는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.C++의 메모리 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. C++의 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. C++ 속도의 함정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. C++의 해결책 그리고 vs Java의 해결책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 도메인의 차이&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 두 언어는 어떻게 빌드 되는가&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. c++의 빌드 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 단계에서 특정 운영체제(OS)와 하드웨어 아키텍처가 바로 알아들을 수 있는 기계어로 직접&lt;br /&gt;번역되어서 AOT(Ahead-of-Time) 컴파일을 통해 컴파일 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AOT 란 프로그램을 실행하기 이전, 즉 개발자가 배포할 때 이미 기계어로 번역된 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 : 실행하면 번역 과정 없이 바로 실행, 빠른 속도 적은 메모리 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;단점 : 빌드 한 운영체제나 CPU 구조가 다르면 실행 불가&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2.java의 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계어 대신 바이트코드(Bytecode)라는 중간 언어로 번역 os에 설치된 JVM이 실시간으로 읽어 기계어로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 : JVM이 있으면 어느 환경에서든 똑같이 돌아감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 : 실행 시 JVM을 거치기 때문에 약간의 성능 오버헤드 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점에 대한 해결 책 JIT 컴파일러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM은 프로그램을 실행하면서 자주 반복해서 실행되는 코드 구간(Hotspot)을 추적합니다. 그리고 이 자주 쓰이는 바이트코드를 아예 &lt;b&gt;기계어로 직접 컴파일하여 캐싱(Caching)&lt;/b&gt;해 둡니다. 다음번에 같은 코드를 실행할 때는 번역 과정을 생략하고 캐싱 된 기계어를 바로 실행하기 때문에, 실행 속도가 비약적으로 향상됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.C++의 메모리 영역&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로그램의 5대 메모리 영역&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Code(Text): 컴파일된 기계어 코드가 저장되는 읽기 전용 구역&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;읽기 전용 구역, 동작 변조를 방지하기 위해 운영체제(OS)가 쓰기를 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;void cal(int *a, int *b) { p-&amp;gt;hp -= 10; }&lt;/code&gt; 함수의 작동 지시 내용 자체가 Code 영역에 속함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 시작부터 끝까지 메모리에 남아있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int max_players = 100; // main 밖의 전역변수라 가정&lt;/li&gt;
&lt;li&gt;static int server_port = 8080; // 초기화된 정적 변수 -&amp;gt; Data 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.Stack 영역 : 지역 변수, 매개 변수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수의 호출과 함께 할당, 함수가 완료되면 함께 소멸&lt;/li&gt;
&lt;li&gt;컴파일 시 이미 크기가 정해짐&lt;/li&gt;
&lt;li&gt;메모리 주소가 높은 곳에서 낮은 곳으로&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.heap 영역 : 사용자에 의해 동적 할당&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 : 사용자가 다 쓰면 delete 혹은 free로 반환&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;런타임에 메모리를 찾아서 할당해야 해서 Stack에 비해 속도가 느리다&lt;br /&gt;&lt;code&gt;Player* newPlayer = new Player();&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. BSS(Block Started by Symbol) 영역 초기화되지 않은 전역 변수와 정적 변수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그래머가 아직 값을 넣지 않은 변수들을 0으로 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_9xyf9q9xyf9q9xyf.png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JmMK2/dJMcaivzzNp/rzdWfUD4IKR8CaYUY6VT01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JmMK2/dJMcaivzzNp/rzdWfUD4IKR8CaYUY6VT01/img.png&quot; data-alt=&quot;C++ 메모리 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JmMK2/dJMcaivzzNp/rzdWfUD4IKR8CaYUY6VT01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJmMK2%2FdJMcaivzzNp%2FrzdWfUD4IKR8CaYUY6VT01%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;2816&quot; height=&quot;1536&quot; data-filename=&quot;Gemini_Generated_Image_9xyf9q9xyf9q9xyf.png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C++ 메모리 구조&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;data와 BSS를 나눈 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int inventory[10000];처럼 엄청나게 큰 전역 배열을 초기화하지 않고 선언했다고 가정&lt;br /&gt;이만 개의 0을 실행 파일(.exe)에 일일이 다 써놓으면 파일 용량이 뻥튀기&lt;br /&gt;따라서 &quot;실행할 때 OS가 메모리 잡아주고 0으로 채워라&quot;라고 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실행 파일의 크기를 줄이기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 자바 그리고 c++의 메모리 정리에는 어떤 차이가 있을지 간단하게 비교해 보겠습니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;특징&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;C++ (메모리 구조)&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;Java (JVM 구조)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;지역 변수 (int a)&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Stack&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;객체 (Player p)&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Stack (기본) / Heap (&lt;code&gt;new&lt;/code&gt; 시)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;무조건 Heap&lt;/b&gt; (Stack은 주소만)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;전역/정적 변수&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Data (초기화) / BSS (미초기화)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Method Area (Static 영역)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;메모리 해제&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;수동&lt;/b&gt; (&lt;code&gt;delete&lt;/code&gt; 필수)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;자동&lt;/b&gt; (Garbage Collector)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;포인터&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;실제 메모리 주소 제어 가능&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;주소 제어 불가능 (참조만 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거의 비슷하지만 new 키워드가 없는 상태라면 함수가 끝나면 사라지게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. C++의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-1. 포인터 - 다른 변수의 주솟값을 담기 위해 메모리 공간을 따로 차지하는 독립적인 변수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립된 메모리 : 포인터 변수 자신도 메모리 상에 자기만의 8바이트 공간을 가진다&lt;/li&gt;
&lt;li&gt;실행 중에 가리키는 대상 변경 가능&lt;/li&gt;
&lt;li&gt;NULL 허용&lt;/li&gt;
&lt;li&gt;위험성 쓰레기 주소 &lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_4_1&quot; id=&quot;footnote_link_4_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 4, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(4, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt; 나 이미 해제된 주소를 가리키고 있을 때 접근하면 프로그램 비정상 종료 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int a = 10;
int b = 20;

int* ptr = &amp;amp;a; // ptr은 a의 주소를 담음
ptr = &amp;amp;b;      // 언제든 b의 주소로 타겟 변경 가능
ptr = nullptr; // 아무것도 가리키지 않음 (이 상태에서 *ptr을 호출하면 프로그램 크래시!)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-2. 참조자 (Reference, &amp;amp;) 이미 존재하는 메모리 공간에 새로운 이름&lt;br /&gt;- 독립된 공간 없음&lt;br /&gt;- 선언 즉시 초기화&lt;br /&gt;- 변경 불가능&lt;br /&gt;- NULL 불가&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int a = 10;
int b = 20;

int&amp;amp; ref = a; // ref는 a의 또 다른 이름. (선언 시 반드시 초기화)
// int&amp;amp; ref2; // 에러! 누구를 참조할지 안 정했음.

ref = b;      // 이것의 의미는? 
              // &quot;ref가 b를 참조해라&quot;가 아니라, &quot;ref(즉, a)의 값에 b의 값(20)을 덮어써라&quot;입니다.
              // 결과: a가 20으로 바뀜.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 표로 한번더 비교 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;특징&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;포인터 (*)&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;참조자 (&amp;amp;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;타겟 변경&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;가능&lt;/b&gt; (다른 대상을 가리킬 수 있음)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;불가능&lt;/b&gt; (한 번 정해지면 끝까지 고정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;NULL 여부&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;가능&lt;/b&gt; (&lt;code&gt;nullptr&lt;/code&gt; 할당 가능)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;불가능&lt;/b&gt; (무조건 유효한 대상이 필요함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;표기법&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;*&lt;/code&gt;, &lt;code&gt;-&amp;gt;&lt;/code&gt; 등 복잡한 기호 필요&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;일반 변수와 똑같이 사용 (매우 깔끔함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;b&gt;주 사용처&lt;/b&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;동적 할당, 배열 관리, NULL 처리가 필요할 때&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;함수 매개변수 전달, 객체 복사 방지 (권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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 그리고 C++의 가장 큰 차이는 메모리에 대한 제어이고&lt;br /&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;br /&gt;int, double 같은 간단한 수준의 데이터 라면 큰 의미가 없을 수 있겠지만&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;특히나 컴퓨터에서 주솟값의 크기는 32비트는 4바이트&lt;br /&gt;64비트는 8바이트로 고정되어 있으며&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;br /&gt;하지만 이중 포인터를 사용해서 주소만 갈아 치우면 8바이트만 움직이면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxgwmd/dJMcafFEOl1/8NLL2Ne8iK5aZvLeodnPD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxgwmd/dJMcafFEOl1/8NLL2Ne8iK5aZvLeodnPD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxgwmd/dJMcafFEOl1/8NLL2Ne8iK5aZvLeodnPD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxgwmd%2FdJMcafFEOl1%2F8NLL2Ne8iK5aZvLeodnPD0%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;2816&quot; height=&quot;1536&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&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;br /&gt;이는 곧 속도의 빠름으로 이어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. C++ 속도 의 함정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-1. 업 캐스팅(Upcasting) : 부모의 껍데기를 쓰는 이유&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Base \*obj = new Derived();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;자식 객체를 만들면서 부모젝체 담는 이유 -&amp;gt; 관리의 편의성&lt;br /&gt;&lt;br /&gt;Unit*이라는 부모 포인터 배열 하나에 다 쓸어 담고 unit-&amp;gt;attack() 한 줄로 명령을 내리기 위함&lt;br /&gt;&lt;br /&gt;4-2 vtable과 vptr의 마법&lt;br /&gt;&lt;br /&gt;그렇다면 컴파일러 입장에서는 부모의 attack()을 실행할지 혹은&lt;br /&gt;자식의 attack()을 실행해야 할지 헷갈리는 상태&lt;br /&gt;&lt;br /&gt;C++ 컴파일러는 두 개를 실행&lt;br /&gt;&lt;br /&gt;vtable (가상 함수 테이블): 클래스마다 '이 클래스가 호출해야 할 진짜 함수들의 메모리 주소'를 적어둔 비밀 지도(배열)를 만듭니다.&lt;br /&gt;&lt;br /&gt;vptr (가상 함수 포인터): 생성된 객체 내부에 몰래 포인터 변수(vptr)를 하나 쓱 집어넣습니다. 이 포인터는 자기 클래스의 vtable을 가리킵니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0RJhr/dJMcaiClTBH/wxTzSs6Z82zpc8JOOPX931/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0RJhr/dJMcaiClTBH/wxTzSs6Z82zpc8JOOPX931/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0RJhr/dJMcaiClTBH/wxTzSs6Z82zpc8JOOPX931/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0RJhr%2FdJMcaiClTBH%2FwxTzSs6Z82zpc8JOOPX931%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;2816&quot; height=&quot;1536&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4-3 소멸자 누락 시 생기는 문제&lt;br /&gt;&lt;br /&gt;객체를 다 썼으니 delete obj;를 호출해서 메모리를 해제&lt;br /&gt;만약 Base 클래스의 소멸자(~Base())에 virtual을 안 붙였다면?&lt;br /&gt;부모의 소멸 자만 실행하고 객체를 파괴 -&amp;gt; 자식의 소멸자가 실행되지 않아서 메모리 누락 발생&lt;br /&gt;&lt;br /&gt;해결책&lt;br /&gt;부모 클래스를 설계할 때 소멸자 앞에 virtual&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Base {
public:
    virtual ~Base() {} // 황금률: 상속될 클래스의 소멸자는 무조건 virtual!
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4-4 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;br /&gt;std::unique\_ptr 입니다. 이 외에도 몇가지가 더 있으나 너무 길어져서 간단히 하나만 소개 하겠습니다. &lt;br /&gt;하나의 메모리 주소는 오직 하나의 unique\_ptr만 가질 수 있습니다. 복사(Copy)가 엄격하게 금지됩니다. &lt;br /&gt;다른 곳에 넘겨주고 싶다면, 내 권리를 포기하고 '이동(std::move)'시켜야만 합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#include #include // 스마트 포인터를 쓰기 위한 헤더

class Player {
public:
Player() { std::cout &amp;lt;&amp;lt; &quot;플레이어 생성\n&quot;; }
~Player() { std::cout &amp;lt;&amp;lt; &quot;플레이어 소멸 (자동!)\n&quot;; }
void attack() { std::cout &amp;lt;&amp;lt; &quot;공격!\n&quot;; }
};

void play_game() {
// new 대신 std::make_unique를 사용합니다.
std::unique_ptr p1 = std::make_unique();
p1-&amp;gt;attack();

// std::unique_ptr&amp;lt;Player&amp;gt; p2 = p1; // 에러! 복사 불가능! (컴파일 단계에서 막아줌)

std::unique_ptr&amp;lt;Player&amp;gt; p3 = std::move(p1); // 성공! p1의 소유권을 p3로 넘김. (이제 p1은 텅 빔)

} // &amp;lt;--- 함수가 끝나는 이 순간! p3가 소멸되면서 내부적으로 알아서 delete를 호출함.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;요약하자면 delete를 통해서 메모리를 반환하는 방식이&lt;br /&gt;함수가 끝나면 자동으로 반환되는 방식으로 되어있어서&lt;br /&gt;더 이상 실수로 delete를 빼먹어서 메모리 누수가 발생할 일이 없습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. C++의 해결책 그리고 vs Java의 해결책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;JAVA 개발자는 비즈니스 로직만 &lt;br /&gt;가비지 컬렉터(Garbage Collector, GC)를 사용하여 &lt;br /&gt;Heap 메모리가 꽉 차면, 백그라운드에 숨어있던 GC가 나타나 참조되지 않는 쓰레기 객체들을 싹 쓸어 담습니다. 개발자는 new만 delete는 안 해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;단점 : 청소를 하는 동안 프로그램이 아주 잠깐 멈추는 Stop-The-World 현상이 발생 &lt;br /&gt;C++의 선택 스마트 포인터를 이용한 (RAII 패턴 제시 &lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_4_2&quot; id=&quot;footnote_link_4_2&quot; onmouseover=&quot;tistoryFootnote.show(this, 4, 2)&quot; onmouseout=&quot;tistoryFootnote.hide(4, 2)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;2&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;게임 렌더링처럼 1프레임의 드롭도 용납할 수 없는 분야에 사용 &lt;br /&gt;GC의 멈춤 현상은 용납 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;unique\_ptr / shared\_ptr: 이들은 포인터를 객체로 감싼 형태입니다. 함수나 블록의 스코프({ })가 끝나는 **단 0.0001초의 오차도 없이, 객체의 소멸자가 호출되며 메모리를 스스로 해제(자폭)**합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;C++은 런타임 오버헤드(GC) 없이도 안전한 메모리 관리를 이뤄냈습니다. (물론 shared\_ptr의 순환 참조 문제&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_4_3&quot; id=&quot;footnote_link_4_3&quot; onmouseover=&quot;tistoryFootnote.show(this, 4, 3)&quot; onmouseout=&quot;tistoryFootnote.hide(4, 3)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;3&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;는 weak\_ptr을 통해 개발자가 직접 고리를 끊어주어야 하는 책임이 따릅니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;즉 스마트 포인터도 이전보다 문제는 적지만 여전히 순환 참조 등의 문제를 통해서 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 도메인의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++, JAVA는 결국 어떤 문제를 해결할 것인가에 따라서 정답이 달라질 뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++의 무대: 미세한 메모리 지연이나 GC의 개입이 치명적인 대규모 3D 게임 클라이언트, 자체 물리 엔진 개발(Netmarble, Pearl Abyss 등에서 요구하는 역량), 자율주행, 임베디드 시스템에서는 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;Java의 무대: 안정적인 유지 보수와 높은 생산성이 요구되는 &lt;b&gt;대규모 엔터프라이즈 백엔드 서버(Spring Boot 기반의 플랫폼 등)&lt;/b&gt;에서는 Java의 JVM과 가비지 컬렉터가 압도적인 안정성을 제공합니다.&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;
&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;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_4_1&quot;&gt; 쓰레기 주소&lt;br /&gt;메모리가 이미 해제(delete)되었음에도 불구하고 포인터가 여전히 그 주소를 가리키고 있는 상태(Dangling), 혹은 포인터를 선언만 하고 초기화하지 않아 임의의 메모리 공간을 가리키는 상태(Wild)를 말합니다. 이 주소에 접근해 값을 읽거나 쓰려 하면 치명적인 런타임 에러가 발생합니다.  &lt;a href=&quot;#footnote_link_4_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_4_2&quot;&gt; RAII 패턴 자원의 획득은 초기화다&quot;라는 뜻으로, 객체가 생성될 때(생성자) 자원을 할당받고, 객체가 스코프를 벗어나 소멸할 때(소멸자) 자원을 자동으로 반환하도록 설계하는 C++의 핵심 프로그래밍 기법입니다. 스마트 포인터가 이 패턴을 완벽하게 따릅니다.  &lt;a href=&quot;#footnote_link_4_2&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_4_3&quot;&gt; 순환 참조 문제 두 개 이상의 shared\_ptr 객체가 서로를 포인터로 가리키고 있는 상태입니다. 서로가 서로를 참조하고 있기 때문에 참조 카운트(Reference Count)가 절대 0이 되지 않아, 스코프를 벗어나도 영원히 메모리에서 해제되지 않는 메모리 누수(Memory Leak)가 발생합니다. 이를 해결하기 위해 참조 카운트를 올리지 않고 관찰만 하는 weak\_ptr을 사용합니다.  &lt;a href=&quot;#footnote_link_4_3&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>웹</category>
      <category>C++</category>
      <category>Java</category>
      <category>메모리</category>
      <category>포인터가 필요한 이유</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/4</guid>
      <comments>https://wnsl2002ok.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 24 Feb 2026 11:42:53 +0900</pubDate>
    </item>
    <item>
      <title>무조건 쓰던 MVC 왜 쓸까?</title>
      <link>https://wnsl2002ok.tistory.com/3</link>
      <description>&lt;h3&gt;&lt;strong&gt;목차&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1. 내가 MVC를 쓰게된 이유&lt;br/&gt;&lt;br&gt;2. MVC가 처음으로 좋다고 느꼈을 때&lt;br/&gt;&lt;br&gt;3. mvc는 왜 필요할까&lt;br/&gt;&lt;br&gt;4. 향후 발전 방향&lt;br/&gt;&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;1. 내가 MVC를 쓰게 된 이유&lt;/strong&gt;&lt;br/&gt;&lt;/h4&gt;
&lt;p&gt;처음에 웹 백엔드를 배울 때 처음 배운 것은 mcv 패턴이었습니다.&lt;br&gt;  &lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLW1FZ/dJMb99L6n6n/hORZbacp473o8F5Qew6K21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLW1FZ/dJMb99L6n6n/hORZbacp473o8F5Qew6K21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLW1FZ/dJMb99L6n6n/hORZbacp473o8F5Qew6K21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLW1FZ%2FdJMb99L6n6n%2FhORZbacp473o8F5Qew6K21%2Fimg.png&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br&gt;(출처 gemini)&lt;br&gt;이때 제가 느낀 생각은&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;그냥 Controller에서 다 처리하면 안 되나?&amp;quot;&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;간단한 조회 기능 하나 만드는데 파일 3~4개를 왔다 갔다 하려니 너무 번거롭고 비효율적으로 느껴졌다.&amp;quot;&lt;br&gt;이었습니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;하지만 일단 시키신 대로 하였으며 이후에 팀원들과 같이 프로젝트를 하면서 mvc 패턴의 편리함을 알게 됩니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;2. MVC가 처음으로 좋다고 느꼈을 때&lt;/strong&gt;&lt;br/&gt;&lt;/h4&gt;
&lt;p&gt;처음에 mvc 패턴을 배울 때 제가 들은 장점으로는  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;변경될 때 이것저것 수정할 필요가 없고  &lt;/li&gt;
&lt;li&gt;각각에게 역할을 분담하게 하여할 수 있다  &lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
이었는데요 처음에는 그렇게 와닿지 않았습니다.
&lt;br/&gt;


&lt;p&gt;하지만 막상 프로젝트를 들어가 보니 기획을 처음에 완벽하게 하지 못하고&lt;br&gt;기능 수정 및 추가를 하다 보니 db를 수정하거나, 기능을 추가하는 등 이런저런 변경사항이 생겼습니다&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;이전에 mvc 패턴을 배우기 전에 혼자서 할 때는 db를 수정하거나 특정 구간을 수정하면&lt;br&gt;어디서 문제가 생길지 몰라서 테스트를 많이 하는 경향이 존재했지만&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;mvc 패턴을 사용하다 보니 모든 곳을 수정할 필요 없이&lt;br&gt;특정 구간만 수정하면 된다는 것을 알게 된 후에는 코드의 수정이나 기능 추가가 빨라짐을 알게 되었습니다.&lt;br&gt;&lt;br/&gt;&lt;br&gt;MyBatis 쿼리 문에서 따로 파라미터 수정이 필요한 케이스가 아니라면 MyBatis의 수정만 이루어지면 되기 때문에&lt;br&gt;빠르게 수정이 가능했습니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;파일을 나눈 이유가 형식적으로 나눈 것이 아니라 서로에게 영향을 주지 않기 위한 격리 임을 깨닫는 순간이었습니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;3. mvc는 왜 필요할까&lt;/strong&gt;&lt;br/&gt;&lt;/h4&gt;
&lt;p&gt;그래서 mvc와 관련돼 소프트웨어 아키텍처는 무엇이고 왜 좋은지에 대해서 추가적으로 학습해 보았습니다.&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;아티택쳐는 크기에 따라 조금씩 나뉩니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;시스템 아키택쳐(client-server, layered, MSA)&lt;br&gt;시스템을 어떻게 설계할지&lt;br&gt;서버와 클라이언트 연결 및 DB는 어떻게 둘지&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;애플리케이션 아키택쳐(MVC, MVVM)&lt;br&gt;애플리케이션 설계&lt;br&gt;프로그램 안에서 화면 및 데이터를 어떻게 주고받을지&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;구현 및 디자인 패턴 GOF(singleton, strategy)&lt;br&gt;코드를 실제적으로 어떻게 구현할지에 대한 방식&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;이 중에서는 저희는 애플리케이션 아키택쳐인 MVC를 사용했습니다.&lt;br&gt;특히 가장 흥미로웠던 것은 과거의 MVC와 현재의 MVC가 조금은 다르다는 점입니다.&lt;br&gt;이 중에서 애플리케이션 아키택쳐에 대해서 학습을 해보도록 하겠습니다&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;우선 종류로는 과거의 mvc, 현재의 mvc, mvvm, mvp&lt;br&gt;이부분에 대해서는 자세히 설명하면 현재 글이 너무 길어져서 이후에 따로 글로 정리 해보려고 합니다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;패턴&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;핵심 로직 담당&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;화면 갱신 방법&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;View-Model 관계&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;과거 MVC&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Controller&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;서버에서 HTML 전체 새로고침&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;강한 결합 (직접 연결)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;JSP 시절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;현재 MVC&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Controller&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;클라이언트가 알아서 (JSON)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;약한 결합 (연결 끊김)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Spring Boot 표준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;MVP&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Presenter&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Presenter가 명령 (수동)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;분리됨 (Interface)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;안드로이드 초기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;MVVM&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;ViewModel&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;데이터 바인딩 (자동)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;분리됨 (관찰)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;모던 프론트엔드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;br/&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;이를 통해서 왜 mvc를 사용하고 동시에 왜 mvc가 좋았는지를 이해할 수 있었습니다.&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;4. 향후 발전 방향&lt;/strong&gt;&lt;br/&gt;&lt;/h4&gt;
&lt;p&gt;처음에는 생소하고 이해가 안 되었지만 이 아키텍처를 왜 학습 시켰는지 이제야 몸소 이해할 수 있었습니다.&lt;br&gt;앞으로 프로젝트에서도 mvc뿐만 아니라 다른 아키텍처도 적용 가능한지&lt;br&gt;혹은 더 적절하다면 이유가 무엇인지를 좀 더 능동적으로 선정하고 학습하며 성장하고 싶습니다.&lt;/p&gt;</description>
      <category>웹</category>
      <category>mvc</category>
      <category>소프트웨어</category>
      <category>아키택처</category>
      <category>웹</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/3</guid>
      <comments>https://wnsl2002ok.tistory.com/3#entry3comment</comments>
      <pubDate>Wed, 18 Feb 2026 17:32:50 +0900</pubDate>
    </item>
    <item>
      <title>기술 부채 나쁘기만 할까요?</title>
      <link>https://wnsl2002ok.tistory.com/2</link>
      <description>&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;br /&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;h2 data-ke-size=&quot;size26&quot;&gt;개발자는 왜 새로운 기술을 사랑할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자들은 왜 항상 새로운 기술에 목말라하고 왜 항상 새로운 기술을 써보고 싶어 할까요?&lt;br /&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;개발이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;소프트웨어 개발의 목표는 효율적이고 반복 가능하며 안전한 방식으로 사용자 요구와 비즈니스 목표를 충족하는 제품&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의 내에서 제가 한 생각은 개발에서 가장 중요한 것은 도덕적인 범주 내에서 안전하게 작동한다.&lt;br /&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;h2 data-ke-size=&quot;size26&quot;&gt;실제로 있었던 사례 하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일례로 싸피에서 약 6주간 간단한 프로젝트를 진행해 본 적이 있었습니다.&lt;br /&gt;같은 팀원 분께서 코드를 계속 고치시는데 상당히 오랜 시간이 소요되어서 여쭤본 적이 있었습니다.&lt;br /&gt;그도 그럴 것이 test 코드도 문제가 없고 빌드도 문제가 없어서 아무 문제가 없는데 왜 그러신지 여쭤보았습니다.&lt;br /&gt;deprecated된 함수여서 바꾸어야 한다고 이야기를 하셨었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1746&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rx7ow/dJMcaiIX1BW/OTTVuoN0WPhE9E8IzQoE6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rx7ow/dJMcaiIX1BW/OTTVuoN0WPhE9E8IzQoE6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rx7ow/dJMcaiIX1BW/OTTVuoN0WPhE9E8IzQoE6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRx7ow%2FdJMcaiIX1BW%2FOTTVuoN0WPhE9E8IzQoE6K%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;1746&quot; height=&quot;38&quot; data-origin-width=&quot;1746&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 저희 프로젝트에 떴었던 이미지 입니다&lt;br /&gt;deprecated란 기대하는데로 작동은 할 수 있으나 곧 사라질 예정인 코드를 의미 하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꾸시는 이유에 대해서 조금더 대화를 해보았습니다.&lt;br /&gt;기술 부채를 이유로 꼽으시며 코드를 고쳐야한다고 이야기 하셨습니다.&lt;br /&gt;그것이 이글을 쓰게 하는데 시작점이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술 부채란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 이야기 하기전에 기술 부채에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발에서 장기적인 고품질 솔루션 대신, 당장의 빠른 납기나 쉬운 구현을 위해 단기적이고 제한적인 임시 방편을 선택함으로써 향후 추가적인 재작업 비용과 위험을 부담하게 되는 현상을 의미 합니다. 1992년 와드 커닝햄이 처음 사용한 비유로, 당장의 빠른 개발이라는 '대출'을 통해 나중에 '이자'를 포함한 더 많은 수정 작업을 해야 하는 상황을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&quot;한컴 테크 발췌&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 기술 부채란 재작업 비용과 위험을 부담하게 되기 때문에 사실 장기적으로 보면 좋은 개발 방법은 아닙니다.&lt;br /&gt;하지만 이러한 기술 부채가 꼭 나쁘기만 한것 일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠시 deprecated된 함수 이야기를 계속 하겠습니다.&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;br /&gt;이것을 고치기 위해서는 두가지가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 그 코드를 고치기 위해서 학습을 해야 하는 학습 비용&lt;br /&gt;두 번째는 그 코드를 고치기 위해서 개선하는 데 시간을 써야 하는 개선 비용&lt;br /&gt;개선에는 그 코드를 고치는 것뿐만 아니라 그 코드를 고쳐서 발생하는 side effect까지 고려해야 합니다.&lt;/p&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;br /&gt;저의 의견 속에는 학습 비용 및 개선 비용 이 기술들을 사용하기 위해서 팀 혹은 개인이 사용해야 하는 시간을 이야기한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 가장 처음에 이야기드린 것처럼 프로그램에서 가장 중요한 것은 안전하게 반복 작업을 하는 것&lt;br /&gt;이는 당장 써야 할 코드에 기술 부채에 비해서 팀은 학습 비용 그리고 개선 비용까지 지불한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6주 내의 프로젝트 내에서 기술 부채를 가지고 개발을 할지?&lt;br /&gt;혹은 학습 비용이나 개선비용까지 지불을 할지는 프로젝트의 목적에 따라 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 6주 내 동안 진행하는 프로젝트의 목적은 무엇일까요?&lt;br /&gt;프로젝트 시작 전 많은 개발자들은 처음에 생각합니다. 깔끔한 코드, 최신 기술, 깔끔한 git commit&lt;br /&gt;하지만 6주 동안 프로젝트를 진행하면서 가장 목표로 삼아야 하는 것은 프로젝트의 완성도입니다.&lt;/p&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 무조건 옛날 기술만 써야 할까요?&lt;br /&gt;그런 것은 아닙니다.&lt;br /&gt;적정 기술이라는 개념이 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적정 기술이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고사양&amp;middot;고비용 대신, 사용자의 환경(저사양 기기, 느린 인터넷, IT 문해력 등)과 문화적 배경에 맞춰 지속 가능하고 저렴하게 실제적인 문제를 해결하는 기술을 의미합니다.&lt;/p&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 예로든 프로젝트에서 저희는 올바르게 적정 기술의 수준을 설정하지 못했고&lt;br /&gt;큰 줄기로 보았을 때 두 가지의 기능이 목표였지만 그중 하나만 개발할 수 있었습니다.&lt;br /&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스적인 관점에서 보았을 때 시장은 항상 변화하고 우리를 기다려주지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;적절한 타이밍의 배포가 주요하며 이는 기술 부채를 감수하고도 서비스를 배포하고 고객의 피드백을 받는 것이&lt;br /&gt;출시가 늦어진 서비스 보다 훨씬 값진 데이터를 제공하기 때문입니다.&lt;br /&gt;결국 개발이란 한정된 자원 속에서 최적의 가치를 만들 내는 과정이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽한 코드 보다 한정된 자원 속에서 최적의 가치를 만들어 내는 것이 더 좋은 개발자라고 생각합니다.&lt;/p&gt;</description>
      <category>소프트웨어 공학</category>
      <category>개선 비용</category>
      <category>기술 부채</category>
      <category>기회비용</category>
      <category>적정 기술</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/2</guid>
      <comments>https://wnsl2002ok.tistory.com/2#entry2comment</comments>
      <pubDate>Tue, 10 Feb 2026 15:40:24 +0900</pubDate>
    </item>
    <item>
      <title>웹 개발 공부 시작</title>
      <link>https://wnsl2002ok.tistory.com/1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-bc6f3c13-cae4-454e-9960-3a80f52e5281&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-bc6f3c13-cae4-454e-9960-3a80f52e5281&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-bc6f3c13-cae4-454e-9960-3a80f52e5281&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-bc6f3c13-cae4-454e-9960-3a80f52e5281&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d1fccc42-ee84-40c2-8665-48541e513e05&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 개발 공부를 시작 하기로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4082484c-fcc9-4527-abb8-9f69b34de3ba&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;블로그를 쓰게 된 계기는 멘토님의 추천도 있었고 정리를 해두면 좋을것 같은 생각이 들어서 블로그를 작성 하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5334276e-67bd-4499-a305-24dec96dc70a&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a6a13905-f671-4820-9124-f7ab0bc42dd9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 첫날에 간단하게 정리 해둔 부분을 기록 해두려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8a2f0688-d71f-4244-8232-bdaa2afc98e5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기록은 아마 주에 한번? 혹은 공부하고 마지막 날에 기록을 해두려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-67c64bd8-0742-4164-98fb-e96289d2cca3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d7d7f0ee-8dd8-4385-9a8f-62587df9d0a4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 멘토님과 함께 공부를 한 날이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-61d3deeb-356f-4366-a17f-34e9a0006598&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선적으로는 도메인을 구매 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6e9c8502-a28e-440b-b84e-f09f472e56b3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인을 구매 하기에 앞서 도메인에 대하여 설명을 하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ac183b6-423a-4061-869b-01237368bf32&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-f751712a-1e01-40ea-ab9c-8fa6c484d13f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 사이트에서의 도메인 이란?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f385fa83-dc35-4a64-b19a-0cf5ff2b9ffe&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-78db59e6-4133-4c77-8d69-d784b42c9de4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹사이트 도메인 (Website Domain)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e669f6c2-b800-425c-9884-80e4fe7d1068&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹사이트 도메인은 인터넷에서 특정 웹사이트에 접근할 수 있는 주소(URL)의 핵심 부분이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-df706234-1a85-4d40-82ec-9bdcb5e6dd02&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, www.google.com에서 google.com이 도메인입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-48f84080-fc15-4776-9f95-9fed0bfdf12a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹 도메인의 구성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서브도메인(Subdomain)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: www.google.com에서 www 부분 (필수는 아님)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도메인 이름(Domain Name)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: google (사이트의 고유한 이름)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;최상위 도메인(TLD, Top-Level Domain)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: .com, .net, .org 등&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;국가 코드 도메인(ccTLD, Country Code TLD)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: .kr(한국), .jp(일본) 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-e3e03a6a-20c4-4aea-adb1-9cf04c1c5c18&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-abe828e9-218c-48ff-b57b-7ee238dee718&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인과 관련된 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e605cf23-7bf9-4dd6-bca1-4de16d6ad60f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-fef95b5b-c208-48f1-9343-7c1ce65a96f3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도메인 관련 개념&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;DNS (Domain Name System)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 사람이 이해하기 쉬운 도메인(google.com)을 IP 주소(예: 142.250.74.206)로 변환해주는 시스템&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도메인 등록&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: namecheap.com, godaddy.com 같은 서비스에서 구매 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도메인과 호스팅의 차이&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 도메인은 주소, 호스팅은 사이트가 저장된 서버 공간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-1ceaa38e-cf6e-41f3-8b4f-6a8db36396fe&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-8e3ec3c1-72cc-498d-a31e-27c66d3b522c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인을 구입하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c07febd8-61fe-489e-8a34-6925db3d77d4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d4c04488-4dbf-4267-9b04-7f90ef38f787&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인등록 업체를 선정하고 -&amp;gt; 원하는 도메인 주소를 선택 합니다. -&amp;gt; 돈을 지불 하고 도메인 구매합니다.(일반적으로는 1년 단위로 구매 합니다) -&amp;gt; 이후 에는 도메인을 서버 혹은 웹 호스팅에 연결 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-50fcc663-d201-45eb-bbf6-5ce5caa3df7f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-650d7e51-5b92-4384-b136-3469a627909d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저의 경우는 cafe24에서 도메인을 구매 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-bc6f3c13-cae4-454e-9960-3a80f52e5281&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FaxwS/dJMcabpucBp/aJxaVbORPL64E6McSAfkyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FaxwS/dJMcabpucBp/aJxaVbORPL64E6McSAfkyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FaxwS/dJMcabpucBp/aJxaVbORPL64E6McSAfkyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFaxwS%2FdJMcabpucBp%2FaJxaVbORPL64E6McSAfkyK%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;693&quot; height=&quot;578&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-f1751cc6-d46b-4442-a77c-7a4a0cb40998&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-f1751cc6-d46b-4442-a77c-7a4a0cb40998&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-f1751cc6-d46b-4442-a77c-7a4a0cb40998&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-604e850b-ff43-40dd-80ce-c73cb66ebcf0&quot;&gt;
&lt;p id=&quot;SE-d07043bc-afb5-4f17-b945-178bf6d77efd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;구입 후 웹 호스팅 서비스를 구매하 연결 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ab6105c0-92f3-444d-b000-1202b59adb70&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-2644f9b9-3bb2-4b27-b3bb-d52144891bd9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 호스팅이란?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8bb78a77-8378-4ace-9778-6ae149f346c9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹사이트를 인터넷에 공개할 수 있도록 서버 공간을 제공하는 서비스&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-21353c56-c505-416c-9be1-4e587bb947af&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 내가 만든 웹사이트의 파일(HTML, CSS, 이미지, DB 등)을 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서버에 올려서&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 사람들이 인터넷에서 접속할 수 있게 해주는 것 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3011b405-2552-4e66-bd9f-ee033bb0dc28&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a0d2044f-9ae5-47a9-8945-2f5d63e806ae&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 호스팅 후 그누보드를 추가하여 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-54dcc777-4664-4854-895b-b2e3d29faa7c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그누보드란?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6d9108b5-7da2-4472-99ab-b676e1e89fef&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그누보드는 PHP와 MySQL을 기반으로 하는 오픈소스 게시판 및 CMS(Content Management System)입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dc69507a-fda2-41b2-9434-0bd6e38e6716&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쉽게 말해, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹사이트(특히 커뮤니티, 회사 홈페이지 등)를 만들 때 유용한 무료 프로그램&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bc7f4d65-1ff1-490a-b86a-161bce503a9b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그누 보드는 웹 사이트를 처음부터 만드는것이 아니라 어느정도 기능들을 만들어두고 빠른 개발이 가능토록 하는 프로그램입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6cdafb19-1c0b-493f-b7b5-1229650475c1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ade52484-d81e-4076-9cb7-154ca5793e2f&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-ade52484-d81e-4076-9cb7-154ca5793e2f&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-ade52484-d81e-4076-9cb7-154ca5793e2f&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-ade52484-d81e-4076-9cb7-154ca5793e2f&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-ade52484-d81e-4076-9cb7-154ca5793e2f&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MRft6/dJMcabbWsQN/ctWmAKFgb7xzhsYXFjKKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MRft6/dJMcabbWsQN/ctWmAKFgb7xzhsYXFjKKPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MRft6/dJMcabbWsQN/ctWmAKFgb7xzhsYXFjKKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMRft6%2FdJMcabbWsQN%2FctWmAKFgb7xzhsYXFjKKPk%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;693&quot; height=&quot;562&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-dcddb82a-51c0-4c1e-8658-6857f409724d&quot;&gt;
&lt;p id=&quot;SE-bc982442-9519-4362-b0ca-5ff95ff32499&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그누보드를 추가한 후 의 현재 저의 사이트 상태 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f55bc27a-b719-4588-a61a-ccc37c98bd4b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내용은 없지만 사이트 처럼 생긴것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f2dde5ff-cab0-4b68-ac01-0236cef7a883&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-28417b23-18c2-478d-ae79-8b8ff16f6911&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음은 FTP 및 클라이언트 및 서버 프로그램인 파일 질라를 다운로드 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e7c68270-fa39-4d3d-8da5-ed1f74031f37&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파일질라란?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-97c99995-83ac-43b7-a2c9-553e4dfb6568&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;FTP(File Transfer Protocol) 클라이언트 및 서버 프로그램&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹 서버와 파일을 주고받는 데 사용되는 프로그램&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-9a89e55c-b0e6-4032-bb90-269def36c7e2&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-dcddb82a-51c0-4c1e-8658-6857f409724d&quot;&gt;
&lt;p id=&quot;SE-85b7375d-3258-4fae-930c-9e4646b89793&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0605e1bd-eef9-4dc2-8e85-66af36f4c70b&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-0605e1bd-eef9-4dc2-8e85-66af36f4c70b&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-0605e1bd-eef9-4dc2-8e85-66af36f4c70b&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-0605e1bd-eef9-4dc2-8e85-66af36f4c70b&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-0605e1bd-eef9-4dc2-8e85-66af36f4c70b&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKfmJD/dJMcah4jllP/RqVbtcxVSd97Ck8pPYc0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKfmJD/dJMcah4jllP/RqVbtcxVSd97Ck8pPYc0kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKfmJD/dJMcah4jllP/RqVbtcxVSd97Ck8pPYc0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKfmJD%2FdJMcah4jllP%2FRqVbtcxVSd97Ck8pPYc0kK%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;693&quot; height=&quot;469&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;대표&lt;/span&gt;&lt;span&gt;사진 삭제&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 활용 설정&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6ea1bf20-2f93-4641-8797-8608579e2970&quot;&gt;
&lt;p id=&quot;SE-20ef3f4f-7615-4e77-9eee-3586dd0f1218&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사진 설명을 입력하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b334bb71-cb0f-41a7-a728-82b356b2ecf2&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-b334bb71-cb0f-41a7-a728-82b356b2ecf2&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-b334bb71-cb0f-41a7-a728-82b356b2ecf2&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-56cfc76b-1714-432d-9e7e-99751ae49abb&quot;&gt;
&lt;p id=&quot;SE-fb368de5-9e72-4960-8735-646fc1dedf3a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파일 질라 다운로드가 완료되었다면&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-422e6e29-5857-487a-a96a-7901cc1f727a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완료된 파일질라를 열고 -&amp;gt; 파일 -&amp;gt; 사이트 관리자 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d7fdc4ab-bd9a-4236-88a7-ef1e7035c1ec&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사이트 관리자를 클릭하면 아까 만드신 도메인과 파일질라를 연결하기 위해서 정보를 입력하는 창이 띄워집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f6d9f1bd-bb4c-45e0-bd0f-1ea35b18360f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-4b7c33a4-3c56-4007-9b9c-23a554cfd45a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토콜은 ssh&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d26cf939-94c4-4b22-b361-1b76a4ba34c9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호스트는 구매하신 도메인 이름을&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5785a5d4-2b7c-408d-b4a0-60e037083ce1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 및 비밀번호는 도메인 구매시 사용하신 아이디 그리고 비밀번호가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bc877aae-9080-4729-bb79-16873d985fb3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그것을 잘사용해주시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a3ec3de2-6d21-49af-8540-745c1bafed4a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비밀번호 같은 경우는 주의 해야하는 것이 잊어 버리면 상당히 고통을 수반 하기 때문에 잊어버리는 않는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-14e594d7-e00a-4c4e-ae84-331f49eec537&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-b2f23e6c-00da-45a2-99f8-4860e7d0249f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 연결을 눌러 주시면...&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-eb74573e-fa34-48dd-a828-a77c0f70fb1c&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-eb74573e-fa34-48dd-a828-a77c0f70fb1c&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-eb74573e-fa34-48dd-a828-a77c0f70fb1c&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-eb74573e-fa34-48dd-a828-a77c0f70fb1c&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-eb74573e-fa34-48dd-a828-a77c0f70fb1c&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btALPM/dJMcahb9iZo/f5OFMKjRCYdZafwNknelt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btALPM/dJMcahb9iZo/f5OFMKjRCYdZafwNknelt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btALPM/dJMcahb9iZo/f5OFMKjRCYdZafwNknelt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtALPM%2FdJMcahb9iZo%2Ff5OFMKjRCYdZafwNknelt0%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;693&quot; height=&quot;342&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-ff802444-ec9c-4c2d-82ce-98ffb37c3836&quot;&gt;
&lt;p id=&quot;SE-359341c5-e0de-45f9-b63e-0cfaffa15078&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 형태로 바뀝니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-eea34e32-bf08-4ab1-9276-3085e322c627&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 왼쪽이 로컬 즉 내 컴퓨터에 있는 파일이고 오른쪽의 파일들은 현재 웹 사이트에 있는 파일들입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7f0b1bb9-d182-4e01-8219-46b2bbb44655&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-caf34d2b-3528-4809-90ae-699e23d926da&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 html 파일을 만들어서 건너편으로 넣어주면&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-dd19b3d5-304a-4e5e-b6f1-6f64c2891fef&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-ff802444-ec9c-4c2d-82ce-98ffb37c3836&quot;&gt;
&lt;p id=&quot;SE-caf34d2b-3528-4809-90ae-699e23d926da&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-82bc42aa-4597-4a8f-8a32-a77db2fbcaa1&quot; data-a11y-title=&quot;사진&quot; data-compid=&quot;SE-82bc42aa-4597-4a8f-8a32-a77db2fbcaa1&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-82bc42aa-4597-4a8f-8a32-a77db2fbcaa1&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-82bc42aa-4597-4a8f-8a32-a77db2fbcaa1&quot;&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;&quot; data-unitid=&quot;SE-82bc42aa-4597-4a8f-8a32-a77db2fbcaa1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPAQj/dJMcaaqzGMP/C7Fkya6HfsfDPV9t2NXfFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPAQj/dJMcaaqzGMP/C7Fkya6HfsfDPV9t2NXfFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPAQj/dJMcaaqzGMP/C7Fkya6HfsfDPV9t2NXfFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPAQj%2FdJMcaaqzGMP%2FC7Fkya6HfsfDPV9t2NXfFK%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;411&quot; height=&quot;190&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;대표&lt;/span&gt;&lt;span&gt;사진 삭제&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 활용 설정&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-85725e93-a5be-4f30-a071-08ee2f70889c&quot;&gt;
&lt;p id=&quot;SE-d59941ac-e1ac-4ba7-8008-91064909d331&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사진 설명을 입력하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bc43fecd-e2cc-469d-a7ae-b5d641ba02c7&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-bc43fecd-e2cc-469d-a7ae-b5d641ba02c7&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-bc43fecd-e2cc-469d-a7ae-b5d641ba02c7&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-a668610b-a758-4760-942b-931dd2d88bed&quot;&gt;
&lt;p id=&quot;SE-4c52d986-093d-4726-a324-aa9fcdc243ff&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 식으로도 제가 만든 웹 사이트 또한 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9892b35e-f096-4c94-a55f-046240234b72&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;물론 html 하나만 있어서 현재 글자외엔 다른 것은 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a6c2271a-e018-4d72-80b6-55d10ce1ea86&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-2df91ad3-8856-45c8-97c8-47e412026539&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 필요한 기본적인 것들을 갖추었다고 생각 합니다만..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5748b700-0cfc-4ada-bae3-6d22141eff2f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아직 부족한 부분들이 많습니다. 그중에서도 DB즉 서버에 데이터를 저장하고 불러오는 과정인 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c46397f9-2930-47a1-ab8c-e25add5facd3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SQL이 필요합니다. 이를 위해 sql 프로그램 중 HeidiSQL을 다운로드 해주겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0ebda6dd-1f76-4378-b64e-c99d2a4889cf&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-ca333dfe-eadb-43e7-86a9-04dbf0d20ae8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; HeidiSQL이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d8671502-7c41-4195-be46-884ad716b56c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;HeidiSQL&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;MySQL, MariaDB, PostgreSQL, Microsoft SQL Server&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 같은 관계형 데이터베이스 관리 시스템(RDBMS)을 관리할 수 있는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;그래픽 사용자 인터페이스(GUI) 클라이언트&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입니다. 이를 통해 데이터베이스를 쉽게 조회하고, 수정하며, 다양한 데이터베이스 작업을 수행할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7340a0f-4037-4d69-b4c8-c2c8640211b6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HeidiSQL은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Windows&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서 주로 사용되며, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Linux&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;macOS&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서도 Wine을 통해 사용할 수 있습니다. 이 프로그램은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SQL 쿼리를 작성하고 실행&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하거나, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;데이터베이스 구조를 관리&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하는 데 유용하게 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b08af20d-9465-4d81-9450-43a9f2284ad8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-2de4eeb3-9821-4543-8ae1-1489e709193e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로 중간에 ssh 설정을 했는데 마지막에 생각하니 빼 놓아서 ssh에 대한 설명만 적고 오늘은 마치겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c46c2d01-b70c-4519-9a37-e92b3531c33a&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-1cc6d2f7-22c8-478f-887f-b3f472726092&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SSH의 주요 특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;암호화된 통신&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SSH는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;모든 데이터를 암호화&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하여 전송하므로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;인터넷을 통한 원격 접속 시 보안이 매우 강력&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;패스워드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;파일 전송 내용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 등이 모두 암호화되어, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;중간에서 도청하거나 해킹&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 어려워집니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;원격 접속&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SSH는 주로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;리눅스 서버&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;유닉스 시스템&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에 접속할 때 사용되며, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;윈도우 서버&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에도 사용할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 이름과 비밀번호 혹은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SSH 키&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 사용하여 원격 서버에 접속할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;명령어 실행&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원격 서버에 접속한 후, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서버에서 직접 명령어를 실행&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할 수 있습니다. 예를 들어, 파일 관리, 프로그램 실행, 서버 설정 등을 할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령어를 통해 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서버의 상태를 점검&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하거나 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스를 제어&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;파일 전송&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;**SCP (Secure Copy Protocol)**나 **SFTP (SSH File Transfer Protocol)**를 사용하여 SSH를 통해 원격 서버에 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;파일을 안전하게 전송&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-ed7e7f8e-d654-46d6-a431-1a7e1802b25e&quot; data-a11y-title=&quot;구분선&quot; data-compid=&quot;SE-ed7e7f8e-d654-46d6-a431-1a7e1802b25e&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-ed7e7f8e-d654-46d6-a431-1a7e1802b25e&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d9aff404-824c-4488-85c7-ba256ddfbac5&quot; data-a11y-title=&quot;본문&quot; data-compid=&quot;SE-d9aff404-824c-4488-85c7-ba256ddfbac5&quot;&gt;
&lt;div&gt;
&lt;div data-direction=&quot;top&quot; data-compid=&quot;SE-d9aff404-824c-4488-85c7-ba256ddfbac5&quot; data-unitid=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-2b2ba276-bafb-4ade-967b-68774faf9f58&quot;&gt;
&lt;p id=&quot;SE-4680e463-3832-44d1-b631-894262702d14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-4680e463-3832-44d1-b631-894262702d14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;✅ SSH의 기본 동작 방식&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9d60fc86-6787-4730-a75b-27d804288afc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1️⃣&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;클라이언트가 SSH 서버에 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트가 서버의 IP 주소와 포트를 통해 연결을 시도합니다. 기본적으로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;22번 포트&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-0b4910e8-ab36-4e4d-ba73-50990610a9f9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서버의 공개키(Public Key)와 클라이언트의 비밀키(Private Key)로 인증&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공개키와 비밀키로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서버와 클라이언트 간의 신뢰성 있는 암호화된 연결&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 설정합니다. (보안상 중요한 부분)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비밀번호 인증&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 방식도 사용 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-f097c01f-c6ab-44a2-98a8-2792b2caf4f4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3️⃣&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;암호화된 채널을 통해 데이터 전송&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이후에는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;암호화된 채널을 통해 모든 명령어와 데이터를 안전하게 주고받습니다&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-a001185e-d767-4981-bf2c-3b8fe0ee5b25&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-66565bfa-cc83-4b25-8d55-2329d2cc963b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이상으로 공부했었던 웹 개발 부분을 마치겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-486fa9d1-eb32-4abd-a7e7-57b7db253121&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음에 공부할 부분은 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ee543fed-0434-449d-ae79-2ad5d48ff23b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;html,css 부분을 공부하고 php로 넘어가보려 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-08c6f8ae-dd56-4973-8d98-7c2b97e35f79&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot; data-href=&quot;https://www.w3schools.com/&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/&quot;&gt;https://www.w3schools.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9059d807-aa2e-46fb-a8f1-a3a49cb7ebbd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;html그리고 css의 경우는 위 사이트에서 할 예정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7e11bc8d-4253-4243-b6dd-6085a034f907&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저 사이트에 적절한 예제가 있다고 멘토님께 소개 받아서 저 사이트에 있는 문제를 모두 풀어보고 다음으로 넘어갈 예정입니다. 이상입니다. 감사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d1704af7-c98b-4389-a750-283459fcacab&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-03b29afa-7c5e-4094-9daf-34e0c88ca8bc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;혹여나 이상하거나 틀린 부분 지적해주시면 바로 고치겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4409d871-2d29-4399-b2ef-44ddc7621215&quot; 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;</description>
      <category>웹</category>
      <category>#웹 개발 #웹 호스팅 #HeidiSQL</category>
      <author>wnsl2002ok</author>
      <guid isPermaLink="true">https://wnsl2002ok.tistory.com/1</guid>
      <comments>https://wnsl2002ok.tistory.com/1#entry1comment</comments>
      <pubDate>Tue, 27 Jan 2026 22:18:10 +0900</pubDate>
    </item>
  </channel>
</rss>