<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>용순</title>
    <link>https://kys4871.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 22:34:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>김용순</managingEditor>
    <item>
      <title>2023-11-26 공부</title>
      <link>https://kys4871.tistory.com/109</link>
      <description>&lt;h2&gt;오늘의 공부&lt;/h2&gt;
&lt;h3&gt;리액트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;리액트 개발 시에 많이 실수하는 항목 리마인드&lt;ul&gt;
&lt;li&gt;예) onClick에 매개변수가 필요한 함수는 바로 연결할 수 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이지UI의 다양한 활용 방법 (&lt;a href=&quot;https://daisyui.com/components/&quot;&gt;https://daisyui.com/components/&lt;/a&gt;)&lt;ul&gt;
&lt;li&gt;데이지UI 활용 시에는 테일윈드도 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;백준 문제풀이(자바스크립트)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단계별로 풀이&lt;ul&gt;
&lt;li&gt;문자열 5622, 11718 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;정리 및 개선점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;리액트 진도를 좀 더 빠르게 나가야겠다. 혼자서 하다보니 좀 느린감이 있는거 같다. &lt;/li&gt;
&lt;li&gt;알고리즘 문제 푸는데 쉬운 문제지만 너무 멀리 돌아가서 풀은거 같다. 범용성보다 문제 조건 맞추는 것만 생각하는게 좋은건지 모르겠다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 일기</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/109</guid>
      <comments>https://kys4871.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 26 Nov 2023 20:23:35 +0900</pubDate>
    </item>
    <item>
      <title>2023-11-18 공부</title>
      <link>https://kys4871.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘의 공부&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리액트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그동안 배웠던 내용들 복습 및 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백준 문제풀이(자바스크립트)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단계별로 풀이
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 27866 , 2743, 9086, 11654, 11720, 10809 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리 및 개선점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번에는 그동안 배웠던 것들을 복습 및 테스트를 하였는데 아는 것도 제대로 활용을 못했던거 같다.&lt;/li&gt;
&lt;li&gt;앞으로 복습도 꾸준히 해서 잊지않도록 해야겠다.&lt;/li&gt;
&lt;li&gt;공부를 최근에 제대로 못해서 알고리즘 문제만 풀었던거 같은데 시간 짬짬히 내서라도 공부시간을 가져야할거 같다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 일기</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/108</guid>
      <comments>https://kys4871.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 19 Nov 2023 23:39:49 +0900</pubDate>
    </item>
    <item>
      <title>CPU 명령어 사이클과 인터럽트</title>
      <link>https://kys4871.tistory.com/107</link>
      <description>&lt;h2&gt;오늘의 공부&lt;/h2&gt;
&lt;h3&gt;개념정리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CPU의 명령 처리 흐름을 명령어 사이클이라고 함&lt;ul&gt;
&lt;li&gt;명령어 사이클은 하나의 명령어가 처리되는 주기로, 인출, 실행, 간접, 인터럽트 사이클로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU는 정해진 흐름에 따라 명령어를 처리하지만 이 흐름이 끊어지는 상황을 인터럽트라고 함.&lt;ul&gt;
&lt;li&gt;인터럽트는 CPU의 정상적은 작업을 방해하는 신호&lt;/li&gt;
&lt;li&gt;종류는 동기인터럽트 (예외 Exception)와 비동기 인터럽트(하드웨어 언터럽트)로 이루어짐&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램&lt;/li&gt;
&lt;li&gt;하드웨어 인터럽트 발생 시 CPU는 수행하던 작업을 백업한 뒤 인터럽트 서비스 루틴 실행 후 끝나면 백업해 둔 자료를 복구하여 수행 재개&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;백준 문제풀이(자바스크립트)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단계별로 풀이 하루 2문제&lt;ul&gt;
&lt;li&gt;1차원 배열     5597, 3052 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;정리 및 개선점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;명령어 사이클과 인터럽트의 종류와 실행 순서에 대해 공부했다.&lt;/li&gt;
&lt;li&gt;집에서 공부하려니 집중이 잘 안된 듯 싶다. 다음엔 밖에 나가서 공부를 해야겠다..&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 일기/컴퓨터 기본</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/107</guid>
      <comments>https://kys4871.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 9 Nov 2023 00:41:08 +0900</pubDate>
    </item>
    <item>
      <title>2023-11-05 공부</title>
      <link>https://kys4871.tistory.com/106</link>
      <description>&lt;h2&gt;오늘의 공부&lt;/h2&gt;
&lt;h3&gt;리액트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;구조분해할당 응용&lt;/li&gt;
&lt;li&gt;테일윈드 사용법&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;백준 문제풀이(자바스크립트)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;vscord 백준 문제풀이용 환경 세팅&lt;/li&gt;
&lt;li&gt;단계별로 풀이 하루 2문제&lt;ul&gt;
&lt;li&gt;1차원 배열 10810 , 10813 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;정리 및 개선점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;개발자들의 귀차니즘을 해결하기 위해 만들어진 테일윈드 익혀놓으면 시간이 많이 단축 될 거같다.&lt;/li&gt;
&lt;li&gt;구조분해할당이란 개념을 자바스크립트 공부하면서 처음 알게 됐는데 이해한다면 개발에 큰 도움이 될 거 같다.&lt;/li&gt;
&lt;li&gt;이해해야할게 너무 많은거 같다. 천천히 사용해보면서 몸에 익혀보자.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 일기</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/106</guid>
      <comments>https://kys4871.tistory.com/106#entry106comment</comments>
      <pubDate>Sun, 5 Nov 2023 19:06:04 +0900</pubDate>
    </item>
    <item>
      <title>2023-11-04 공부내용 정리</title>
      <link>https://kys4871.tistory.com/104</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘의 공부&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리액트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useState() 사용법&lt;/li&gt;
&lt;li&gt;컴포넌트 사용법&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백준 문제풀이(자바스크립트)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단계별로 풀이 하루 2문제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차원 배열 10818, 2562 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리 및 개선점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useState()는 자주사용하게 될 문법인거 같으니 몸에 익히자.&lt;/li&gt;
&lt;li&gt;기존 자바와 문법이 헷갈려 자주 사용해봐야 익숙해질거 같다.&lt;/li&gt;
&lt;li&gt;컴포넌트 개념을 알고 있음에도 쉽게 떠올리지 못했다. 다시 기초부터 리마인드 해야 할 거 같다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 일기</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/104</guid>
      <comments>https://kys4871.tistory.com/104#entry104comment</comments>
      <pubDate>Sat, 4 Nov 2023 19:03:19 +0900</pubDate>
    </item>
    <item>
      <title>JDBC란?</title>
      <link>https://kys4871.tistory.com/103</link>
      <description>&lt;p&gt;&lt;b&gt;JDBC&lt;/b&gt;&lt;span&gt;(Java Database Connectivity)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;자바&lt;span&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터베이스&lt;span&gt;에 접속할 수 있도록 하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자바 API&lt;span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzL03M/btqEPU19Dai/G366sfVC9n0euaQCxHJsSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzL03M/btqEPU19Dai/G366sfVC9n0euaQCxHJsSK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzL03M/btqEPU19Dai/G366sfVC9n0euaQCxHJsSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzL03M%2FbtqEPU19Dai%2FG366sfVC9n0euaQCxHJsSK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JDBC Driver&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DBMS&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;통신을&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;담당하는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DMBS&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;별로&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알맞은&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;JDBC&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;드라이버&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필요하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(jar)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MY SQL, 오라클 MSSQL&amp;nbsp; 등이 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>자바/자바 공부</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/103</guid>
      <comments>https://kys4871.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 15 Jun 2020 13:38:49 +0900</pubDate>
    </item>
    <item>
      <title>리액트와 SPA</title>
      <link>https://kys4871.tistory.com/102</link>
      <description>&lt;h2&gt;리액트&lt;/h2&gt;
&lt;p&gt;리액트는자바스크립트 라이브러리의 하나로서 사용자 인터페이스를 만들기 위해 사용된다.&lt;/p&gt;
&lt;p&gt;페이스북과 개별 개발자 및 기업들 공동체에 의해 유지보수된다.&lt;/p&gt;
&lt;p&gt;리액트는싱글 페이지나 모바일 애플리케이션의 개발 시 토대로 사용될 수 있다.&lt;/p&gt;
&lt;p&gt;복잡한 리액트 애플리케이션들은상태 관리,라우팅,API와의 통신을 위한 추가 라이브러리의 사용이 일반적으로 요구된다.&lt;/p&gt;
&lt;h2&gt;기본 사용법&lt;/h2&gt;
&lt;p&gt;다음은 JSX와 자바스크립트와 함께 HTML에 사용한 기초적인 예제이다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt;&lt;span&gt;&quot;myReactApp&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt;&lt;span&gt;&quot;text/babel&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; class&lt;/span&gt; &lt;span&gt;Greeter&lt;/span&gt; &lt;span&gt;extends&lt;/span&gt; &lt;span&gt;React&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Component&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; render&lt;/span&gt;&lt;span&gt;()&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;/h1&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; ReactDOM&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;render&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Greeter&lt;/span&gt; &lt;span&gt;greeting&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt;&lt;span&gt;&quot;Hello World!&quot;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'myReactApp'&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Greeter클래스는greeting속성을 수용하는 리액트 컴포넌트이다. ReactDOM.render메서드는Greeter컴포넌트의 인스턴스를 생성하고greeting속성을'Hello World'로 설정하며 렌더링된 컴포넌트를 차일드 요소로서myReactAppid의 DOM 요소로 추가한다. 웹 브라우저에 표시될 때 결과는 다음과 같다&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt;&lt;span&gt;&quot;myReactApp&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Hello World!&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;SPA&lt;/h2&gt;
&lt;p&gt;싱글 페이지 애플리케이션(single-page application, SPA, 스파)은 서버로부터 완전한 새로운 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성함으로써 사용자와 소통하는 웹 애플리케이션이나 웹사이트를 말한다.&lt;br /&gt;이러한 접근은 연속되는 페이지들 간의 사용자 경험의 간섭을 막아주고 애플리케이션이 더 데스크톱 애플리케이션처럼 동작하도록 만들어준다.&lt;br /&gt;SPA에서 HTML, 자바스크립트, CSS 등 필요한 모든 코드는 하나의 페이지로 불러오거나, 적절한 자원들을 동적으로 불러들여서 필요하면 문서에 추가하는데, 보통 사용자의 동작에 응답하게 되는 방식이다.&lt;br /&gt;문서는 프로세스 중 어떠한 지점에서도 다시 불러들이지 않으며 다른 문서로 제어권을 넘기지 않으나,&lt;br /&gt;위치 해시나 HTML5 히스토리 API를 사용하여 애플리케이션 안에서 개개의 논리 문서의 인식 및 탐색을 제공할 수 있다.&lt;br /&gt;싱글 페이지 애플리케이션과의 소통은 뒷편에 있는 웹 서버와의 동적인 통신을 수반하기도 한다.&lt;/p&gt;</description>
      <category>자바/자바 공부</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/102</guid>
      <comments>https://kys4871.tistory.com/102#entry102comment</comments>
      <pubDate>Tue, 2 Jun 2020 11:13:41 +0900</pubDate>
    </item>
    <item>
      <title>피그마 배민 앱모작 협업작업</title>
      <link>https://kys4871.tistory.com/101</link>
      <description>&lt;iframe style=&quot;border: 1px solid rgba(0, 0, 0, 0.1);&quot; width=&quot;800&quot; height=&quot;450&quot; src=&quot;https://www.figma.com/embed?embed_host=share&amp;url=https%3A%2F%2Fwww.figma.com%2Ffile%2FdMFId0I6kNARNP1b4SrEVd%2FUntitled%3Fnode-id%3D0%253A1&amp;chrome=DOCUMENTATION&quot; allowfullscreen&gt;&lt;/iframe&gt;</description>
      <category>자바/자바 공부</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/101</guid>
      <comments>https://kys4871.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 29 May 2020 12:02:26 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] codeup  3711 : 1의 개수는? 3</title>
      <link>https://kys4871.tistory.com/100</link>
      <description>&lt;p&gt;희용이는 구글에 입사하기 위해 면접시험을 보러 갔다.&lt;/p&gt;
&lt;p&gt;희용이는 구글 입사 시험 기출문제로 &quot;1 ~ 1,000,000까지 1의 개수&quot;를 묻는 문제가 나왔다는 사실을 vega선생님으로 부터 들어서 이 문제에 대한 대답을 준비하고 갔다.&lt;/p&gt;
&lt;p&gt;면접실에 들어가자 면접관은 다음과 같이 질문을 하였다.&lt;/p&gt;
&lt;p&gt;&quot;1 ~ 1,000,000까지의 1의 개수 대신, a부터 b까지의 정수 중 k라는 숫자가 몇 번 나왔는지 알아내는 프로그램을 작성해보세요.&quot;&lt;/p&gt;
&lt;p&gt;희용이는 순간 당황했지만 이 사이트에서 유사한 문제를 본 적이 있기 때문에 응용해서 무사히 풀수 있었다.&lt;/p&gt;
&lt;p&gt;이 프로그램을 작성하시오.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;시작 값(a), 마지막 값(b), 한자리 정수(k)가 입력된다. ( 0 &amp;lt;= a &amp;lt;= b &amp;lt;= 100,000,000 ), ( 0 &amp;lt;= k &amp;lt;= 9 )&lt;/p&gt;
&lt;p&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;a부터 b사이에 k라는 숫자가 몇 번 들어 있는지 출력하시오.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;입력 예시&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;11 15 1&lt;/p&gt;
&lt;p&gt;&lt;b&gt;출력 예시&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;&lt;b&gt;도움말&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;입출력 예시에서 11, 12, 13, 14, 15 이렇게 1은 6번 들어간다.&lt;/p&gt;
&lt;p&gt;0 ~ 1억을 탐색하기위해서는 for문을 2중으로 중첩하면 1초안에 해결이 불가능합니다. (시간초과)&lt;/p&gt;
&lt;p&gt;그럼 어떻게 해결할까요? 구글에서도 분명 이 능력을 요구했을 겁니다.&lt;/p&gt;

&lt;iframe height=&quot;400px&quot; width=&quot;100%&quot; src=&quot;https://repl.it/@sungun5435/ConstantPrudentLevels?lite=true&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot; sandbox=&quot;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&quot;&gt;&lt;/iframe&gt;</description>
      <category>자바/자바 코딩</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/100</guid>
      <comments>https://kys4871.tistory.com/100#entry100comment</comments>
      <pubDate>Wed, 27 May 2020 12:31:42 +0900</pubDate>
    </item>
    <item>
      <title>게시판</title>
      <link>https://kys4871.tistory.com/99</link>
      <description>&lt;pre id=&quot;code_1590366979471&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		DB db = new DB();
		MemberDao memberDao = new MemberDao(db);
		MemberService memberService = new MemberService(memberDao);
		MemberController memberController = new MemberController(sc, memberService);
		memberController.showHelp();
		while (true) {
			System.out.print(&quot;명령) &quot;);
			String command = sc.nextLine();
			if (command.equals(&quot;0&quot;)) {
				break;
			} else if (command.equals(&quot;1&quot;)) {
				memberController.doCommandJoin();
			} else if (command.equals(&quot;2&quot;)) {
				memberController.doCommandLogin();
			} else if (command.equals(&quot;3&quot;)) {
				memberController.doCommandLogout();
			} else if (command.equals(&quot;4&quot;)) {
				memberController.doCommandList();
			} else if (command.equals(&quot;5&quot;)) {
				memberController.doCommandRemove();
			} else if (command.equals(&quot;6&quot;)) {
				memberController.doCommandPasswdModify();
			}
		}

	}
}

class MemberController {
	Scanner sc;
	private MemberService memberService;
	Member loginedMember;
	
	//비어있는 서비스에 진짜 서비스 연결
	//스캐너도 이어받음.
	public MemberController(Scanner sc, MemberService memberService) {
		this.sc = sc;
		this.memberService = memberService;
	}
	
	//비밀번호 수정
	void doCommandPasswdModify() {
		System.out.print(&quot;비밀번호를 수정할 회원 번호를 입력해주세요. : &quot;);
		String memberId = sc.nextLine();
		//멤버아이디의 회원이 있다면 
		if (memberService.existMember(memberId)) {
			//비밀번호 수정
			String loginPw;
			String loginPwConfirm;

			while (true) {
				boolean loginPwValid = true;

				while (true) {
					System.out.printf(&quot;로그인 비밀번호 : &quot;);
					loginPw = sc.nextLine().trim();

					if (loginPw.length() == 0) {
						System.out.printf(&quot;로그인 비번을 입력해주세요.\n&quot;);
						continue;
					}
					if (loginPw.length() &amp;lt; 2) {
						System.out.printf(&quot;로그인 비번을 2자 이상 입력해주세요.\n&quot;);
						continue;
					}

					break;
				}

				while (true) {
					System.out.printf(&quot;로그인 비밀번호 확인 : &quot;);
					loginPwConfirm = sc.nextLine().trim();
					if (loginPwConfirm.length() == 0) {
						System.out.printf(&quot;로그인 비번확인을 입력해주세요.\n&quot;);
						continue;
					}

					if (loginPw.equals(loginPwConfirm) == false) {
						System.out.printf(&quot;로그인 비번과 비번확인이 일치하지 않습니다.\n&quot;);
						loginPwValid = false;
						break;
					}

					break;
				}

				if (loginPwValid) {
					break;
				}
			}
			//받은 정보를 서비스에게 넘겨주기
			memberService.modify(loginPw, memberId);
			System.out.println(&quot;비밀번호가 수정되었습니다.&quot;);
		} else {
			//해당되는 회원번호가 없다면
			System.out.println(&quot;해당 회원은 존재하지않습니다.&quot;);
		}
	}

	void showHelp() {
		System.out.println(&quot;1) 회원가입&quot;);
		System.out.println(&quot;2) 로그인&quot;);
		System.out.println(&quot;3) 로그아웃&quot;);
		System.out.println(&quot;4) 회원 리스트&quot;);
		System.out.println(&quot;5) 회원 삭제&quot;);
		System.out.println(&quot;6) 회원 비밀번호 수정&quot;);
		System.out.println(&quot;0) 종료&quot;);
	}
	//회원 삭제
	void doCommandRemove() {
		System.out.print(&quot;삭제할 회원 번호를 입력해주세요 : &quot;);
		String memberId = sc.nextLine();
		//회원번호에 해당되는 회원이 있다면
		if (memberService.existMember(memberId)) {
			//삭제
			memberService.Remove(memberId);
			System.out.println(&quot;회원이 삭제되었습니다.&quot;);
		} else {
			//없다면
			System.out.println(&quot;해당 회원은 존재하지않습니다.&quot;);
		}
	}

	void doCommandList() {
		//회원 리스트
		//어레이 리스트 생성
		List&amp;lt;Member&amp;gt; members = new ArrayList&amp;lt;&amp;gt;();
		//members = 서비스로부터 받아온 리스트
		members = memberService.list();
		//비어있다면
		if (members == null) {
			System.out.println(&quot;회원이 없습니다.&quot;);
		} else {
			//비어있지 않다면 출력
			for (Member member : members) {
				System.out.println(member);
			}
		}
	}
	//로그아웃
	void doCommandLogout() {
		//loginedMember가 어느 member에 연결되어 있다면
		if (loginedMember != null) {
			loginedMember = null;
			System.out.println(&quot;로그아웃되었습니다.&quot;);
			//아니라면
		} else {
			System.out.println(&quot;이미 로그아웃 상태입니다.&quot;);
		}
	}

	//로그인
	void doCommandLogin() {
		//loginedMember에 연결되어있는 멤버가 없다면
		if (loginedMember == null) {
			System.out.print(&quot;아이디 : &quot;);
			String loginId = sc.nextLine();
			System.out.print(&quot;비번 : &quot;);
			String loginPw = sc.nextLine();
			//아디 비번이 일치하지 않을 경우
			if (memberService.login(loginId, loginPw) == null) {
				System.out.println(&quot;일치하는 회원이 없거나 로그인 정보가 틀립니다.&quot;);
			} else {
				//일치할 경우 loginedMember에 정보가 일치하는 회원을 연결시켜준다.
				loginedMember = memberService.login(loginId, loginPw);
				System.out.println(loginedMember.loginId + &quot;님 어서오세요.&quot;);
			}
		} else {
			System.out.println(&quot;이미 로그인 중 입니다.&quot;);
		}
	}
	//회원가입
	void doCommandJoin() {
		System.out.printf(&quot;== 회원가입 시작 ==\n&quot;);

		String name;
		String loginId;
		String loginPw;
		String loginPwConfirm;

		while (true) {
			System.out.printf(&quot;이름 : &quot;);
			name = sc.nextLine().trim();
			if (name.length() == 0) {
				System.out.printf(&quot;이름을 입력해주세요.\n&quot;);
				continue;
			}
			if (name.length() &amp;lt; 2) {
				System.out.printf(&quot;이름을 2자 이상 입력해주세요.\n&quot;);
				continue;
			}
			break;
		}
		while (true) {
			System.out.printf(&quot;로그인 아이디 : &quot;);
			loginId = sc.nextLine().trim();
			if (loginId.length() == 0) {
				System.out.printf(&quot;로그인 아이디를 입력해주세요.\n&quot;);
				continue;
			}
			if (loginId.length() &amp;lt; 2) {
				System.out.printf(&quot;로그인 아이디를 2자 이상 입력해주세요.\n&quot;);
				continue;
			}
			if (memberService.isUsedLoginId(loginId)) {
				System.out.printf(&quot;입력하신 아이디(%s)는 이미 사용중 입니다.\n&quot;, loginId);
				continue;
			}
			break;
		}

		while (true) {
			boolean loginPwValid = true;

			while (true) {
				System.out.printf(&quot;로그인 비밀번호 : &quot;);
				loginPw = sc.nextLine().trim();

				if (loginPw.length() == 0) {
					System.out.printf(&quot;로그인 비번을 입력해주세요.\n&quot;);
					continue;
				}
				if (loginPw.length() &amp;lt; 2) {
					System.out.printf(&quot;로그인 비번을 2자 이상 입력해주세요.\n&quot;);
					continue;
				}

				break;
			}

			while (true) {
				System.out.printf(&quot;로그인 비밀번호 확인 : &quot;);
				loginPwConfirm = sc.nextLine().trim();
				if (loginPwConfirm.length() == 0) {
					System.out.printf(&quot;로그인 비번확인을 입력해주세요.\n&quot;);
					continue;
				}

				if (loginPw.equals(loginPwConfirm) == false) {
					System.out.printf(&quot;로그인 비번과 비번확인이 일치하지 않습니다.\n&quot;);
					loginPwValid = false;
					break;
				}

				break;
			}

			if (loginPwValid) {
				break;
			}
		}
		int rs = memberService.Join(name, loginId, loginPw);

		if (rs == 1) {
			System.out.println(&quot;성공하였습니다.&quot;);
		} else if (rs == -1) {
			System.out.println(&quot;입력하신 로그인 아이디는 이미 사용중입니다.&quot;);
		}

		System.out.printf(&quot;== 회원가입 끝 ==\n&quot;);
	}

}

class MemberService {
	private MemberDao memberDao;

	public MemberService(MemberDao memberDao) {
		this.memberDao = memberDao;
	}
	//해당 회원번호의 존재 유무판별
	boolean existMember(String memberId) {
		if (memberDao.existMember(memberId)) {
			return true;
		} else {
			return false;
		}

	}
	
	void modify(String loginPw, String memberId) {
		memberDao.modify(loginPw, memberId);
	}
	
	void Remove(String memberId) {
		memberDao.remove(memberId);
	}
	
	List&amp;lt;Member&amp;gt; list() {
		return memberDao.list();
	}

	Member login(String loginId, String loginPw) {
		if (memberDao.login(loginId, loginPw) == null) {
			return null;
		} else {
			return memberDao.login(loginId, loginPw);
		}
	}

	boolean isUsedLoginId(String loginId) {
		Member member = memberDao.getMemberByLoginId(loginId);
		if (member == null) {
			return false;
		}
		return true;
	}

	int Join(String name, String loginId, String loginPw) {
		if (isUsedLoginId(loginId)) {
			return -1;
		}
		memberDao.Add(name, loginId, loginPw);
		return 1;
	}

}

class MemberDao {
	DB db;

	public MemberDao(DB db) {
		this.db = db;
	}

	boolean existMember(String memberId) {
		if (db.existMember(memberId) != null) {
			return true;
		} else {
			return false;
		}
	}
	
	void modify(String loginPw, String memberId) {
		Member member;
		//경로지정
		String filePath = &quot;member/&quot; + memberId + &quot;.txt&quot;;
		//member에 기존 회원번호의 정보를 담은 후
		member = db.readMemberFromJsonFile(filePath);
		//그 자리에 새로운 member를 다시 만들어 수정함.
		Member modifyMember = new Member(member.id, member.regDate, member.name, member.loginId, loginPw);
		//다시 배열에 담음.
		db.addMember(modifyMember);
	}

	void remove(String memberId) {
		//존재 유무 판별 후 삭제
		db.existMember(memberId).delete();
	}

	List&amp;lt;Member&amp;gt; list() {
		return db.list();
	}

	Member login(String loginId, String loginPw) {
		return db.LoginIdAndLoginPassWd(loginId, loginPw);
	}

	public Member getMemberByLoginId(String loginId) {
		return db.getMemberByLoginId(loginId);
	}

	void Add(String name, String loginId, String loginPw) {
		//id는 마지막멤버번호의 +1
		int id = getLastMemberId() + 1;
		String regDate = Util.getNowDateStr();
		Member member = new Member(id, regDate, name, loginId, loginPw);
		db.addMember(member);
		setLastMemberId(id);
	}

	void setLastMemberId(int id) {
		db.setLastMemberId(id);
	}

	int getLastMemberId() {
		return db.getLastMemberId();
	}
}

class DB {
	int getLastMemberId() {
		int lastId;
		isMemberFolder();
		String filePath = &quot;member/lastId.txt&quot;;

		if (isFileExists(filePath)) {
			lastId = Integer.parseInt(getFileContents(filePath));
		} else {
			lastId = 0;
			writeFileContents(filePath, lastId + &quot;&quot;);
		}
		return lastId;
	}

	File existMember(String memberId) {
		String filePath = &quot;member/&quot; + memberId + &quot;.txt&quot;;
		File file = new File(filePath);
		if (file.exists()) {
			return file;
		} else {
			return null;
		}
	}

	List&amp;lt;Member&amp;gt; list() {
		return getMembers();
	}

	Member LoginIdAndLoginPassWd(String loginId, String loginPw) {
		List&amp;lt;Member&amp;gt; members = getMembers();
		for (Member member : members) {
			if (member.loginId.equals(loginId) &amp;amp;&amp;amp; member.loginPw.equals(loginPw)) {
				return member;
			}
		}
		return null;
	}

	Member getMemberByLoginId(String loginId) {
		List&amp;lt;Member&amp;gt; members = getMembers();

		for (Member member : members) {
			if (member.loginId.equals(loginId)) {
				return member;
			}
		}
		return null;
	}

	List&amp;lt;Member&amp;gt; getMembers() {
		List&amp;lt;Member&amp;gt; members = new ArrayList&amp;lt;&amp;gt;();
		int lastId = getLastMemberId();

		for (int i = 1; i &amp;lt;= lastId; i++) {
			String filePath = &quot;member/&quot; + i + &quot;.txt&quot;;
			Member member = readMemberFromJsonFile(filePath);
			if (member != null) {
				members.add(member);
			}
		}
		return members;
	}

	Member readMemberFromJsonFile(String filePath) {
		ObjectMapper om = new ObjectMapper();
		Member member = null;
		try {
			member = om.readValue(new File(filePath), Member.class);
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
		} catch (IOException e) {
			e.printStackTrace();
		}
		return member;
	}

	void setLastMemberId(int newLastMemberId) {
		String filePath = &quot;member/lastId.txt&quot;;

		writeFileContents(filePath, newLastMemberId + &quot;&quot;);
	}

	void addMember(Member member) {
		String filePath = &quot;member/&quot; + member.id + &quot;.txt&quot;;
		writeMemberJsonFile(filePath, member);
	}

	void writeMemberJsonFile(String filePath, Member member) {
		ObjectMapper om = new ObjectMapper();
		try {
			om.writeValue(new File(filePath), member);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	void isMemberFolder() {
		String path = &quot;member/&quot;;
		File Folder = new File(path);
		if (!Folder.exists()) {
			try {
				Folder.mkdir(); // 폴더 생성합니다.
			} catch (Exception e) {
				e.getStackTrace();
			}
		}
	}

	String getFileContents(String filePath) {
		String rs = null;
		try {
			// 바이트 단위로 파일읽기
			FileInputStream fileStream = null; // 파일 스트림

			fileStream = new FileInputStream(filePath);// 파일 스트림 생성
			// 버퍼 선언
			byte[] readBuffer = new byte[fileStream.available()];
			while (fileStream.read(readBuffer) != -1) {
			}

			rs = new String(readBuffer);
			fileStream.close(); // 스트림 닫기
		} catch (Exception e) {
			e.getStackTrace();
		}

		return rs;
	}

	boolean isFileExists(String filePath) {
		File f = new File(filePath);
		if (f.isFile()) {
			return true;
		}
		return false;
	}

	void writeFileContents(String filePath, String contents) {
		BufferedOutputStream bs = null;
		try {
			bs = new BufferedOutputStream(new FileOutputStream(filePath));
			bs.write(contents.getBytes());
		} catch (Exception e) {
			e.getStackTrace();
		} finally {
			try {
				bs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

class Member {
	public int id;
	public String regDate;
	public String name;
	public String loginId;
	public String loginPw;

	Member() {

	}

	public Member(int id, String regDate, String name, String loginId, String loginPw) {
		this.id = id;
		this.regDate = regDate;
		this.name = name;
		this.loginId = loginId;
		this.loginPw = loginPw;
	}

	@Override
	public String toString() {
		return &quot;Member [id=&quot; + id + &quot;, regDate=&quot; + regDate + &quot;, name=&quot; + name + &quot;, loginId=&quot; + loginId + &quot;, loginPw=&quot;
				+ loginPw + &quot;]&quot;;
	}

}

class Util {
	static String getNowDateStr() {
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat Date = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;);
		String dateStr = Date.format(cal.getTime());
		return dateStr;
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바/자바 코딩</category>
      <author>김용순</author>
      <guid isPermaLink="true">https://kys4871.tistory.com/99</guid>
      <comments>https://kys4871.tistory.com/99#entry99comment</comments>
      <pubDate>Mon, 25 May 2020 09:36:36 +0900</pubDate>
    </item>
  </channel>
</rss>