<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코드 조각-Android, Java, Spring, JavaScript, C#, C, C++, PHP, HTML, CSS, Delphi</title>
    <link>https://developer-joe.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 21:59:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>GPLWorker</managingEditor>
    <item>
      <title>영어를 잘 하기 위해 내가 생각하는 방법과 효과를 본 방법</title>
      <link>https://developer-joe.tistory.com/244</link>
      <description>&lt;p id=&quot;SE-f610bd67-1231-40e1-9753-f009659a3d7a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;영어가 들리기 위해 한국인으로 가장 초점을 두어야 할 부분이 뭘까를 생각할 때&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;소리(연음...), 어휘(단어, 관용구, 구동사...), 문장의 구조(어순, structure) 중 문장의 구조가 한국인에게는 제일 초점을 두어야 할 영역이라고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dc0d6b3d-8f14-4829-bf78-63642ed9b790&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다른 영역들은 사실 문장의 구조가 몸에 감각으로 익혀지게 만드것에 비하면 상대적으로 덜 어려운 영역이라고 생각합니다. 시간적으로 난이도 면에서...&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8cf71974-5027-4b78-bec3-06677165b0ee&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;저는 다음과 같은 4가지 방식으로 하는데 핵심은 영어 문장의 구조에 대한 직관적 감각(intuitive sense)를 익히는 게 핵심입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-61caf5ec-9ac0-4d30-8750-e1dcf24437f9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;1. 해당 구문과 같은 예문을 몇 개를 활용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ff659679-7a47-4788-aa8a-3d1a5f10edae&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;2. 해당 예문을 보지 않고 반복적으로 말합니다. 구문/구조에 대한 감각(intuitive sense)이 익숙하게 느껴질 때까지.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-80cd7285-f268-4a78-bca0-384fe892aef4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;3. 위 2의 작업을 할 때는 다음 2가지를 머릿속으로 함께 떠올리며 말하기를 반복합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-faef6382-1e77-457f-a374-aa55c25edc7e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; ① 문장을 보지 않고, 영어의 어순대로 해당 의미를 머리에 떠올리며 감각이 느껴질 때까지 반복해서 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b04e7311-6bf4-4a73-a32e-798e02f59a66&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* This box is &lt;/span&gt;&lt;span&gt;&lt;b&gt;too&lt;/b&gt;&lt;/span&gt;&lt;span&gt; heavy / &lt;/span&gt;&lt;span&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;span&gt; carry.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-65c98483-14de-4320-bbfe-bffd25b83c08&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt; 이 박스는 너무 무겁다 / 옮기기에는 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2f28b08c-b3e0-4cb7-9cab-26873a2d8463&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt; * The truck is &lt;/span&gt;&lt;span&gt;&lt;b&gt;too&lt;/b&gt;&lt;/span&gt;&lt;span&gt; small / &lt;/span&gt;&lt;span&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;span&gt; move / the big sofa.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-92e07100-110a-4a39-b895-cadbf81c7073&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt; 그 트럭은 너무 작다 / 옮기기에는 / 그 큰 소파를&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9987b50b-3544-47b2-96f3-42bee2ea5756&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt; * That elevator / looks / &lt;/span&gt;&lt;span&gt;&lt;b&gt;too&lt;/b&gt;&lt;/span&gt;&lt;span&gt; dangerous / &lt;/span&gt;&lt;span&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;span&gt; ride in.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-52e0557c-4d04-4e45-980a-01a9ef154d4f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt; 그 엘리베이트는 / 보인다 / 너무 위험한 상태로 / 타기에는&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4e75a8d1-ab0e-470f-9f99-8cbf71d7166e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; ② &lt;/span&gt;&lt;span&gt;&lt;u&gt;필요시&lt;/u&gt;&lt;/span&gt;&lt;span&gt; 특정 단어 다음에 나오는 품사를 생각하며 말합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e5ffec0a-1ab2-42e5-b77f-d793f23c5fa6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; seems 다음에 품사가 형용사(happy)인걸 생각하며 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-914b6510-d799-4f0a-9bbb-d7c4d56bfbc1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; He &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;seems&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt; very &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;happy&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt; now with his nice new home, and his new friends.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;4. 이러한 예문들을 주기적으로 반복 복습합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-871cbb0e-c38b-4981-914b-9f6a1c3aaab7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이때 사용하는 앱은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;Staymem&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이라는 앱입니다. 이 앱이 좋은건 위의 예문들을 저장해 두면 1일 후, 7일 후, 16일 후, 35일 후, 70일 후, 140일 후, 280일 후 폰으로 푸시 알림이 와서 잊혀질 때마다 반복해서 영어 문장의 구조(어순)이 몸에 감각으로 배이게 하는데 매우 유용하기 때문에 이 앱을 사용하는데 복습을 관리하는데 매우 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-de602e4e-2038-4331-a699-4a10d80c975e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;이렇게 영어 문장의 구조/어순이 몸에 베이는 감각이 되면 말이 빨라도 거의 다 알아듣게 되는걸 경험하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-307936ed-1572-433c-9867-a25a91f329f9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;저는 아침마다 유튜브에서 듣는 게 있는데 그걸 들으면서 위와 같은 저만의 방식이 저에게 정말 많은 효과를 주는 걸 몸으로 체감하기에 노하우를 잠시 소개해 보았습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>실용영어</category>
      <category>영어 듣기</category>
      <category>영어 회화</category>
      <category>영어공부</category>
      <category>영어듣기</category>
      <category>영어성적</category>
      <category>유학</category>
      <category>토익</category>
      <category>토플</category>
      <category>해외 유학</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/244</guid>
      <comments>https://developer-joe.tistory.com/244#entry244comment</comments>
      <pubDate>Sat, 28 Mar 2026 21:23:10 +0900</pubDate>
    </item>
    <item>
      <title>MySQL의 DB에서 10분 간격으로 데이터를 추출하기</title>
      <link>https://developer-joe.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 DB에 저장된 데이터가 대략 1분 간격으로 저장된 데이터가 있다고 할때에 이 데이터에서 10분 간격의 데이터를 추출하고 싶을때 쿼리를 어떻게 작성해야 할까? &lt;br /&gt;이를&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;기법과&amp;nbsp;개념은&amp;nbsp; &lt;br /&gt;&amp;nbsp;-.&amp;nbsp;UNIX_TIMESTAMP()&amp;nbsp;함수 &lt;br /&gt;&amp;nbsp;-.&amp;nbsp;GROUP&amp;nbsp;BY &lt;br /&gt;&amp;nbsp;-.&amp;nbsp;DIV &lt;br /&gt;정도이다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;테이블명&amp;nbsp;:&amp;nbsp;tb_test&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;r_Date&amp;nbsp;:&amp;nbsp;2022-08-01&amp;nbsp;15:59:00&lt;/span&gt;과&amp;nbsp;같은&amp;nbsp;형태로&amp;nbsp;대략&amp;nbsp;1분&amp;nbsp;간격의&amp;nbsp;데이터가&amp;nbsp;저장되어&amp;nbsp;있다고&amp;nbsp;할때 &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;tb_test&amp;nbsp;GROUP&amp;nbsp;BY&amp;nbsp;UNIX_TIMESTAMP(r_Date)&amp;nbsp;DIV&amp;nbsp;600&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;r_Date&amp;nbsp;DESC&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;-.&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;UNIX_TIMESTAMP(r_Date)&lt;/span&gt;에서&amp;nbsp;출력되는&amp;nbsp;결과는&amp;nbsp;1659337140이다.&amp;nbsp;이는&amp;nbsp;1970.1.1이후&amp;nbsp;경과한&amp;nbsp;초의&amp;nbsp;값을&amp;nbsp;반환한다. &lt;br /&gt;&lt;br /&gt;MySQL&amp;nbsp;UNIX_TIMESTAMP()&amp;nbsp;returns&amp;nbsp;a&amp;nbsp;Unix&amp;nbsp;timestamp&amp;nbsp;in&amp;nbsp;seconds&amp;nbsp;since&amp;nbsp;'1970-01-01&amp;nbsp;00:00:00'&amp;nbsp;UTC&amp;nbsp;as&amp;nbsp;an&amp;nbsp;unsigned&amp;nbsp;integer&amp;nbsp;if&amp;nbsp;no&amp;nbsp;arguments&amp;nbsp;are&amp;nbsp;passed&amp;nbsp;with&amp;nbsp;UNIX_TIMESTAMP(). &lt;br /&gt;When&amp;nbsp;this&amp;nbsp;function&amp;nbsp;used&amp;nbsp;with&amp;nbsp;a&amp;nbsp;date&amp;nbsp;argument,&amp;nbsp;it&amp;nbsp;returns&amp;nbsp;the&amp;nbsp;value&amp;nbsp;of&amp;nbsp;the&amp;nbsp;argument&amp;nbsp;as&amp;nbsp;an&amp;nbsp;unsigned&amp;nbsp;integer&amp;nbsp;in&amp;nbsp;seconds&amp;nbsp;since&amp;nbsp;'1970-01-01&amp;nbsp;00:00:00'&amp;nbsp;UTC. &lt;br /&gt;The&amp;nbsp;argument&amp;nbsp;may&amp;nbsp;be&amp;nbsp;a&amp;nbsp;DATE,&amp;nbsp;DATETIME,TIMESTAMP&amp;nbsp;or&amp;nbsp;a&amp;nbsp;number&amp;nbsp;in&amp;nbsp;YYYYMMDD&amp;nbsp;or&amp;nbsp;YYMMDD. &lt;br /&gt;&lt;br /&gt;-.&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;UNIX_TIMESTAMP(r_Date)&amp;nbsp;DIV&amp;nbsp;600&lt;/span&gt; &lt;br /&gt;이것이&amp;nbsp;의미하는&amp;nbsp;것은&amp;nbsp;r_Date&amp;nbsp;칼럼에&amp;nbsp;있는&amp;nbsp;년-월-일&amp;nbsp;시:분:초의&amp;nbsp;값을&amp;nbsp;UTC&amp;nbsp;초&amp;nbsp;값으로&amp;nbsp;반환된&amp;nbsp;것을&amp;nbsp;600(10분에&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;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;GROUP&amp;nbsp;BY&amp;nbsp;UNIX_TIMESTAMP(r_Date)&amp;nbsp;DIV&amp;nbsp;600&lt;/span&gt; &lt;br /&gt;이것의 의미는 1분간격의 년-월-일 시:분:초의 값을 DIV 600으로 나눈 후 소수점을 절삭하면 10분 간격의 시간 값은 동일한 값을 갖게 된다.&amp;nbsp; DIV 자체가 소수점을 절삭한 정수형을 반환한다.&lt;br /&gt;사실은&amp;nbsp;2765561.x,&amp;nbsp;2765560.x,&amp;nbsp;2765559.x와&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;10분&amp;nbsp;간격의&amp;nbsp;값들은&amp;nbsp;동일한&amp;nbsp;값을&amp;nbsp;가지므로&amp;nbsp;GROUP&amp;nbsp;BY로&amp;nbsp;묶을수&amp;nbsp;있는&amp;nbsp;조건이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;2022-08-01&amp;nbsp;15:59:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:58:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:57:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:56:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:55:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:54:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:53:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:52:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:51:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;&lt;br /&gt;2022-08-01&amp;nbsp;15:48:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:47:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:46:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:45:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:44:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:43:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:42:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:41:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:40:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;&lt;br /&gt;2022-08-01&amp;nbsp;15:39:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:38:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:37:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:36:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:35:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:32:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:31:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;2022-08-01&amp;nbsp;15:30:00;&amp;nbsp;&amp;nbsp;2765559 &lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;GROUP&amp;nbsp;BY로&amp;nbsp;묶으면&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;10분&amp;nbsp;간격의&amp;nbsp;값을&amp;nbsp;추출할수가&amp;nbsp;있다.&amp;nbsp;만일&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;5분&amp;nbsp;간격&lt;/span&gt;으로&amp;nbsp;데이터를&amp;nbsp;추출하고자&amp;nbsp;한다면&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot; data-darkreader-inline-color=&quot;&quot;&gt;DIV&amp;nbsp;300&lt;/span&gt;으로&amp;nbsp;하면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;2022-08-01&amp;nbsp;15:51:00;&amp;nbsp;&amp;nbsp;2765561 &lt;br /&gt;2022-08-01&amp;nbsp;15:40:00;&amp;nbsp;&amp;nbsp;2765560 &lt;br /&gt;2022-08-01&amp;nbsp;15:30:00;&amp;nbsp;&amp;nbsp;2765559&lt;/p&gt;</description>
      <category>MySQL</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/243</guid>
      <comments>https://developer-joe.tistory.com/243#entry243comment</comments>
      <pubDate>Fri, 5 Aug 2022 18:35:53 +0900</pubDate>
    </item>
    <item>
      <title>STS 혹은 이클립스에서 JPA 항목이 보이지 않을때 추가하는 방법</title>
      <link>https://developer-joe.tistory.com/228</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JPA 프로젝트 생성시 Project Facets에서 JPA 항목이 보이지 않는 문제가 있다. 이는 중대한 이슈가 JPA와 관련해서 있기 때문에 이클립스 쪽에서 제거한 것으로 나와있다(&lt;span style=&quot;color: #006dd7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://stackoverflow.com/questions/42869652/spring-tools-suite-jpa-project-and-the-jpa-facet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-darkreader-inline-color=&quot;&quot;&gt;자세한 건 여기를 참조&lt;/a&gt;&lt;/span&gt;) &lt;br /&gt;&lt;br /&gt;Help 메뉴&lt;br /&gt;&amp;nbsp; &amp;rArr; Install new software... &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rArr; Work with: 항목에 http://download.eclipse.org/releases/oxygen를 입력 후 엔터 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rArr; 아래 Name 항목 여럿 중에서&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Web, XML, Java EE and OSGi Enterprise Development&quot; 항목을 펼쳐서 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; JPA 관련 모든 항목을 체크한다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(이때 간단히 찾는 방법은 위의 &quot;type filter text&quot; 항목에 JPA라고 입력) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rArr; 이렇게 설치과정을 진행 후 이클립스 재구동 &lt;br /&gt;&lt;br /&gt;이렇게&amp;nbsp;하면&amp;nbsp;정상적으로&amp;nbsp;JPA&amp;nbsp;항목이&amp;nbsp;보일&amp;nbsp;것이다.&lt;/p&gt;</description>
      <category>Spring MVC</category>
      <category>jap</category>
      <category>Project Facets</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/228</guid>
      <comments>https://developer-joe.tistory.com/228#entry228comment</comments>
      <pubDate>Wed, 12 Jan 2022 17:57:15 +0900</pubDate>
    </item>
    <item>
      <title>웹 페이지에서 프로그레스 써클 띄우기</title>
      <link>https://developer-joe.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;특정&amp;nbsp;웹&amp;nbsp;페이지&amp;nbsp;로딩시&amp;nbsp;프로그레서&amp;nbsp;바/프로그레스&amp;nbsp;써클&amp;nbsp;띄워야&amp;nbsp;할&amp;nbsp;경우가&amp;nbsp;있다면&amp;nbsp;dialog&amp;nbsp;태그와&amp;nbsp;img&amp;nbsp;태그와&amp;nbsp;로딩&amp;nbsp;이미지를&amp;nbsp;보여주는&amp;nbsp;gif&amp;nbsp;이미지를&amp;nbsp;적절히&amp;nbsp;조합하여&amp;nbsp;로딩&amp;nbsp;상태를&amp;nbsp;띄워줄수가&amp;nbsp;있다.&amp;nbsp; &lt;br /&gt;아래는&amp;nbsp;코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1606828169902&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;title&amp;gt;프로그레스 써클 띄우기&amp;lt;/title&amp;gt;
	&amp;lt;style&amp;gt;

	&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;br/&amp;gt;
	&amp;lt;button onclick=&quot;showProCircle()&quot; style=&quot;padding: 5px;&quot;&amp;gt; 프로그레스 써클 띄우기 &amp;lt;/button&amp;gt;&amp;lt;br/&amp;gt;
	&amp;lt;h3&amp;gt; 5초 후에 자동으로 닫힙니다. &amp;lt;/h3&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;!-- dialog 태그를 border-radius 속성을 이용해서 원형으로 만들고 gif 이미지도 동일하게 원형으로 만든다 --&amp;gt;
		&amp;lt;dialog id=&quot;progressCircleDialog&quot; style=&quot;width:200px; height:200px; padding:-5px; background-color:#ffffff; border: 0px solid black; border-radius: 50%;&quot;&amp;gt;
			&amp;lt;img style=&quot;width: 100%; height: 100%; display: block; margin: 0px auto; padding: 0px; border-radius: 50%;&quot; src=&quot;loading.gif&quot;&amp;gt;
		&amp;lt;/dialog&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;script&amp;gt;
		function showProCircle(){
			var dialog = document.getElementById(&quot;progressCircleDialog&quot;);
			dialog.showModal();

			setTimeout(function(){
				dialog.close();
			}, 5000);
		}
	&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;progress-circle.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfnyVb/btqOSx9GC63/FWKzi6rVcRYIskaAOfNLxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfnyVb/btqOSx9GC63/FWKzi6rVcRYIskaAOfNLxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfnyVb/btqOSx9GC63/FWKzi6rVcRYIskaAOfNLxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfnyVb%2FbtqOSx9GC63%2FFWKzi6rVcRYIskaAOfNLxk%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;388&quot; height=&quot;648&quot; data-filename=&quot;progress-circle.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>HTML</category>
      <category>dialog</category>
      <category>progress bar</category>
      <category>progress circle</category>
      <category>모달 창</category>
      <category>프로그레스 바</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/242</guid>
      <comments>https://developer-joe.tistory.com/242#entry242comment</comments>
      <pubDate>Tue, 1 Dec 2020 22:12:46 +0900</pubDate>
    </item>
    <item>
      <title>dialog 태그를 이용한 모달 창 만들기 - alert 대체용 메시지 창 만들기</title>
      <link>https://developer-joe.tistory.com/241</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;웹의&amp;nbsp;view단을&amp;nbsp;작업할때&amp;nbsp;alert()&amp;nbsp;함수를&amp;nbsp;이용해서&amp;nbsp;사용자에게&amp;nbsp;필요한&amp;nbsp;알림을&amp;nbsp;제공하게&amp;nbsp;된다.&amp;nbsp;가장&amp;nbsp;간단하고&amp;nbsp;쉬운&amp;nbsp;방법이나&amp;nbsp;alert()을&amp;nbsp;사용할때&amp;nbsp;예상치&amp;nbsp;못한&amp;nbsp;곤란을&amp;nbsp;만날수도&amp;nbsp;있다.&amp;nbsp;아무튼&amp;nbsp;alert()과&amp;nbsp;같은&amp;nbsp;역할을&amp;nbsp;하면서&amp;nbsp;alert()을&amp;nbsp;대체할수&amp;nbsp;있는&amp;nbsp;dialog&amp;nbsp;태그에&amp;nbsp;대해&amp;nbsp;정리하고자&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603898192744&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;title&amp;gt;alert을 대체할 dialog 태그&amp;lt;/title&amp;gt;
	&amp;lt;style&amp;gt;
		#myMsgDialog {
			width:40%; 
			background-color: #f4ffef; 
			border:1px solid black; 
			border-radius: 7px;
		}		

		#mButton {
			padding: 7px 30px;
			background-color: #66ccff;
			color: white;
			font-size: 15px;
			border: 0;
			outline: 0;
		}
	&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;button onclick=&quot;showMsg()&quot;&amp;gt;메시지 띄우기&amp;lt;/button&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;!-- 아래 dialog 태그 영역이 메시지 창 --&amp;gt;
		&amp;lt;dialog id=&quot;myMsgDialog&quot;&amp;gt;
			&amp;lt;h3&amp;gt;여기는 메시지 내용입니다.&amp;lt;/h3&amp;gt;
			&amp;lt;input type=&quot;button&quot; id=&quot;mButton&quot; onclick=&quot;closeMsg()&quot; value=&quot; 확 인 &quot; &amp;gt;
		&amp;lt;/dialog&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;script&amp;gt;
		function showMsg(){
			var dialog = document.getElementById(&quot;myMsgDialog&quot;);
			dialog.showModal();
		}
		
		function closeMsg(){
			var dialog = document.getElementById(&quot;myMsgDialog&quot;);
			dialog.close();
		}
	&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드가 그렇게 복잡하지는 않다. 아무튼 alert() 대체용으로 간단하면서 아주 유용한 기능이다. 아래는 실행 결과이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;563&quot; data-filename=&quot;kkk.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RyBlB/btqLZKY4ddy/8l0zmGInjREHbVnhb3AYG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RyBlB/btqLZKY4ddy/8l0zmGInjREHbVnhb3AYG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RyBlB/btqLZKY4ddy/8l0zmGInjREHbVnhb3AYG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRyBlB%2FbtqLZKY4ddy%2F8l0zmGInjREHbVnhb3AYG1%2Fimg.png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;563&quot; data-filename=&quot;kkk.png&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>HTML</category>
      <category>alert 대체</category>
      <category>dialog 태그</category>
      <category>모달 창</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/241</guid>
      <comments>https://developer-joe.tistory.com/241#entry241comment</comments>
      <pubDate>Thu, 29 Oct 2020 00:19:43 +0900</pubDate>
    </item>
    <item>
      <title>Oracle의 ROLLUP 함수의 개념</title>
      <link>https://developer-joe.tistory.com/240</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;Oracle의&amp;nbsp;ROLLUP&amp;nbsp;함수의&amp;nbsp;개념 &lt;br /&gt;&lt;br /&gt;아래와&amp;nbsp;같은&amp;nbsp;테이블이&amp;nbsp;있다고&amp;nbsp;할때&amp;nbsp;부서별&amp;nbsp;연봉(SAL)&amp;nbsp;소계와&amp;nbsp;전체&amp;nbsp;SAL&amp;nbsp;총계를&amp;nbsp;도출해&amp;nbsp;내고자&amp;nbsp;할때&amp;nbsp;사용할수&amp;nbsp;있는&amp;nbsp;함수가&amp;nbsp;ROLLUP&amp;nbsp;함수이다. &lt;br /&gt;한마디로&amp;nbsp;말하면&amp;nbsp;GROUP&amp;nbsp;BY로&amp;nbsp;묶을&amp;nbsp;칼럼의&amp;nbsp;소계를&amp;nbsp;도출하는&amp;nbsp;함수이다. &lt;br /&gt;&lt;br /&gt;DEPT&amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp;&amp;nbsp;RANK&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;SAL &lt;br /&gt;-------------------------------- &lt;br /&gt;기획부&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt; &amp;nbsp;|&amp;nbsp; &lt;/span&gt;부장 &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;3800 &lt;br /&gt;기획부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;nbsp; &amp;nbsp;| &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부장&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;4000 &lt;br /&gt;기획부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;차장&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1800 &lt;br /&gt;마케팅부 &lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp; &lt;/span&gt;부장&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;4000 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;차장&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;2000 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;과장&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1500 &lt;br /&gt;&lt;br /&gt;SELECT&amp;nbsp;DEPT,&amp;nbsp;RANK,&amp;nbsp;COUNT(RANK)&amp;nbsp;&quot;RANK_COUNT&quot;,&amp;nbsp;SUM(SAL)&amp;nbsp;FROM&amp;nbsp;TEST&amp;nbsp;GROUP&amp;nbsp;BY&amp;nbsp;ROLLUP(DEPT,&amp;nbsp;RANK); &lt;br /&gt;&lt;br /&gt;위&amp;nbsp;쿼리가&amp;nbsp;의미하는&amp;nbsp;바는&amp;nbsp;DEPT와&amp;nbsp;RANK라는&amp;nbsp;두&amp;nbsp;칼럼의&amp;nbsp;데이터가&amp;nbsp;같은&amp;nbsp;튜플들을(row)&amp;nbsp;하나로&amp;nbsp;묶어(grouping)&amp;nbsp;SAL의&amp;nbsp;합을&amp;nbsp;도출하고 &lt;br /&gt;DEPT&amp;nbsp;칼럼의&amp;nbsp;데이터가&amp;nbsp;같은&amp;nbsp;튜플들을&amp;nbsp;하나로&amp;nbsp;묶어&amp;nbsp;SAL의&amp;nbsp;소계를&amp;nbsp;도출하고&amp;nbsp;최종적으로는&amp;nbsp;전체&amp;nbsp;튜플들&amp;nbsp;모두의&amp;nbsp;합(총계)를&amp;nbsp;도출하는&amp;nbsp;기능을&amp;nbsp;하는&amp;nbsp;것이&amp;nbsp;ROLLUP()&amp;nbsp;함수이다. &lt;br /&gt;&lt;br /&gt;DEPT&amp;nbsp; &amp;nbsp; |&amp;nbsp;&amp;nbsp;RANK&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;RANK_COUNT | SAL &lt;br /&gt;------------------------------------------------------------------------------ &lt;br /&gt;기획부&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부장&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; &lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;7800&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;==&amp;gt; 기획부, 부장의 합계&lt;/span&gt; &lt;br /&gt;기획부&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;차장&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;1800 &lt;br /&gt;기획부&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;(null)&lt;span style=&quot;color: #333333;&quot;&gt; | &lt;/span&gt;3&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;9600 ==&amp;gt; 기획부 소계 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;과장&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;1500 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부장&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;4000 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;차장&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&lt;/span&gt;1&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;2000 &lt;br /&gt;마케팅부&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;(null)&lt;span style=&quot;color: #333333;&quot;&gt; | &lt;/span&gt;3&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;7500 ==&amp;gt; 마케팅부 소계 &lt;br /&gt;(null)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;|&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;(null)&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;6&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;17100 ==&amp;gt; 전체 총계&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle Database</category>
      <category>GROUP BY</category>
      <category>ROLLUP</category>
      <category>소계</category>
      <category>오라클</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/240</guid>
      <comments>https://developer-joe.tistory.com/240#entry240comment</comments>
      <pubDate>Thu, 16 Jul 2020 22:13:45 +0900</pubDate>
    </item>
    <item>
      <title>PHP에서 잘못된 URL의 유입을 막는 방법</title>
      <link>https://developer-joe.tistory.com/239</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; data-ad-client=&quot;ca-pub-9374590545769786&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; data-ad-client=&quot;ca-pub-9374590545769786&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;PHP에서&amp;nbsp;MVC&amp;nbsp;모델&amp;nbsp;형태로&amp;nbsp;웹&amp;nbsp;시스템을&amp;nbsp;개발하다보면&amp;nbsp;DB에&amp;nbsp;저장,&amp;nbsp;혹은&amp;nbsp;DB&amp;nbsp;정보를&amp;nbsp;수정하는&amp;nbsp;URL이&amp;nbsp;생성되는데&amp;nbsp;문제는&amp;nbsp;해당&amp;nbsp;URL을&amp;nbsp;막바로&amp;nbsp;웹브라우저&amp;nbsp;주소&amp;nbsp;창에&amp;nbsp;입력하게&amp;nbsp;될&amp;nbsp;경우&amp;nbsp;문제가&amp;nbsp;발생하게&amp;nbsp;된다. &lt;br /&gt;DB에&amp;nbsp;insert하는&amp;nbsp;경우의&amp;nbsp;URL을&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;/p&gt;
&lt;pre id=&quot;code_1593142421203&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://xxx.xxx.xxx/adm/reg/member 
  &amp;rArr; 회원가입 페이지(reg_member.php)
    &amp;rArr; http://xxx.xxx.xxx/adm/save/member
       &amp;rArr; DB에 회원 정보 insert(AdmModel.php -&amp;gt; insertMember())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기서 사용자가 웹 브라우저 주소창에&amp;nbsp; &lt;a href=&quot;http://xxx.xxx.xxx/adm/save/member이&quot;&gt;http://xxx.xxx.xxx/adm/save/member&lt;/a&gt; 이 URL로 막바로 접속할 경우 AdmModel.php의 insertMember() 함수가&amp;nbsp;실행되어&amp;nbsp;DB에&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;같이&amp;nbsp;간단한&amp;nbsp;몇줄의&amp;nbsp;코드로&amp;nbsp;방어할수&amp;nbsp;있다.&lt;/p&gt;
&lt;pre id=&quot;code_1593142606306&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        public function registeMember($regMbr){
            $prevPage = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH);

            if($prevPage != '/adm/reg/member'){
                echo &quot;&amp;lt;script&amp;gt;alert('허용되지 않는 잘못된 접근입니다.');&amp;lt;/script&amp;gt;&quot;;
                return;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTTP_REFERER 환경 변수는 이전 페이지의 URL 값을 담고 있는 환경변수이다. 따라서 정상적인 경우라면 /adm/save/member URL로 들어오기 전 URL은 /adm/reg/member&amp;nbsp;이어야&amp;nbsp;하는&amp;nbsp;것이다.&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;아닌경우라면&amp;nbsp;차단하면&amp;nbsp;되는&amp;nbsp;것이다. &lt;br /&gt;즉 브라우저에서 회원 정보를 등록하는 URL인 http://xxx.xxx.xxx/adm/save/member로 막바로 접속시 위의 $prevPage에는 아무 값이 없다. 따라서 그런 경우는 차단을 하면된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>PHP</category>
      <category>HTTP_REFERER</category>
      <category>PHP 보안</category>
      <category>잘못된 URL 차단</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/239</guid>
      <comments>https://developer-joe.tistory.com/239#entry239comment</comments>
      <pubDate>Fri, 26 Jun 2020 12:39:40 +0900</pubDate>
    </item>
    <item>
      <title>아파치 url rewrite 기능을 이용한 PHP에서 MVC 모델의 Controller 기능 구현하기</title>
      <link>https://developer-joe.tistory.com/238</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; data-ad-client=&quot;ca-pub-9374590545769786&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;PHP에서&amp;nbsp;MVC&amp;nbsp;모델&amp;nbsp;방식에서&amp;nbsp;Controller&amp;nbsp;기능을&amp;nbsp;구현할려면&amp;nbsp;어떻게&amp;nbsp;해야&amp;nbsp;할까?&amp;nbsp;혹은&amp;nbsp;FrontController&amp;nbsp;기능을&amp;nbsp;구현할&amp;nbsp;경우&amp;nbsp;어떻게&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;것인가?&lt;br /&gt;php의&amp;nbsp;경우는&amp;nbsp;url&amp;nbsp;경로에&amp;nbsp;맞는&amp;nbsp;해당&amp;nbsp;경로에&amp;nbsp;php&amp;nbsp;소스가&amp;nbsp;1:1로&amp;nbsp;대응되도록&amp;nbsp;되어&amp;nbsp;있다.&lt;br /&gt;즉&lt;/p&gt;
&lt;pre id=&quot;code_1591777221801&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://xxx.xxx.xxx/reserve/list.php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;일 경우 웹 Document Root 디렉토리 아래의 reserve 디렉토리 안에 list.php소스가&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;php&amp;nbsp;소스를&amp;nbsp;Controller&amp;nbsp;역할을&amp;nbsp;하게&amp;nbsp;할수가&amp;nbsp;없게된다.&amp;nbsp;달리말해서&amp;nbsp;어떤&amp;nbsp;형태의&amp;nbsp;url이&amp;nbsp;들어오더라도&amp;nbsp;무조건&amp;nbsp;특정&amp;nbsp;디렉토리의&amp;nbsp;특정&amp;nbsp;php&amp;nbsp;소스를&amp;nbsp;무조건&amp;nbsp;실행되게&amp;nbsp;할수가&amp;nbsp;없다는&amp;nbsp;것이다. &lt;br /&gt;어떤 경우의 url 형태가 요청되더라도 항상 특정 php가 실행되어야 해당 php 소스가 Controller 역할을 수행할수 있는것 아니겠는가? &lt;br /&gt;&lt;br /&gt;또&amp;nbsp;url&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;PHP의&amp;nbsp;경우&amp;nbsp;이러한&amp;nbsp;난점을&amp;nbsp;해결하고&amp;nbsp;모든&amp;nbsp;url에&amp;nbsp;대해&amp;nbsp;특정&amp;nbsp;php로&amp;nbsp;redirect&amp;nbsp;시켜&amp;nbsp;해당&amp;nbsp;php가&amp;nbsp;FrontController&amp;nbsp;역할을&amp;nbsp;하도록&amp;nbsp;하기&amp;nbsp;위해&amp;nbsp;apache의&amp;nbsp;기술을&amp;nbsp;이용하면&amp;nbsp;Controller&amp;nbsp;기능을&amp;nbsp;구현할수&amp;nbsp;있다. &lt;br /&gt;이때&amp;nbsp;사용하는&amp;nbsp;것이apache의&amp;nbsp;rewrite&amp;nbsp;모듈이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;apache의&amp;nbsp;rewrite&amp;nbsp;모듈은&amp;nbsp;apache의&amp;nbsp;모듈의&amp;nbsp;한&amp;nbsp;종류로&amp;nbsp;서버로&amp;nbsp;접속해&amp;nbsp;오는&amp;nbsp;request를&amp;nbsp;정해진&amp;nbsp;규칙을&amp;nbsp;통해&amp;nbsp;특정&amp;nbsp;경로의&amp;nbsp;파일로&amp;nbsp;redirect&amp;nbsp;시키는&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;모듈이다. &lt;br /&gt;아래의&amp;nbsp;절차를&amp;nbsp;따라&amp;nbsp;진행하면&amp;nbsp;된다(Ubuntu&amp;nbsp;16.04를&amp;nbsp;기준으로&amp;nbsp;작성된&amp;nbsp;글이다). &lt;br /&gt;&lt;br /&gt;(1)&amp;nbsp;Apache&amp;nbsp;rewrite&amp;nbsp;모듈&amp;nbsp;활성화 &lt;br /&gt;아래 명령어를 통해 apache rewrite 모듈을 활성화 한다. &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;a2enmod&amp;nbsp;rewrite &lt;br /&gt;&lt;br /&gt;(2)&amp;nbsp;Apache&amp;nbsp;설정에서&amp;nbsp;rewrite&amp;nbsp;기능을&amp;nbsp;사용가능하도록&amp;nbsp;설정&amp;nbsp;변경 &lt;br /&gt;아래의 경로에 있는 apache2.conf 파일을&amp;nbsp;열어&amp;nbsp;설정을&amp;nbsp;변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1591777517594&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# vi /etc/apache2/apache2.conf

&amp;lt;Directory /var/www/&amp;gt;
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 AllowOverride None을 AllowOverride All로 변경 &lt;br /&gt;&lt;br /&gt;(3)&amp;nbsp;.htaccess&amp;nbsp;파일에서&amp;nbsp;규칙&amp;nbsp;생성 &lt;br /&gt;웹 Document Root 디렉토리에 .htaccess 파일을 생성한다. apache2의 웹 document root가 어디인지 확인할려면 Ubuntu 16.04의 경우 /etc/apache2/sites-available/000-default.conf 파일을 열면 아래와 같은 내용이 있을 것이다.&lt;br /&gt;&lt;br /&gt;DocumentRoot&amp;nbsp;/var/www/html&lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;.htaccess&amp;nbsp;파일을&amp;nbsp;/var/www/html/&amp;nbsp;에&amp;nbsp;생성해서&amp;nbsp;아래의&amp;nbsp;내용을&amp;nbsp;입력한다. &lt;br /&gt;&lt;br /&gt;RewriteEngine&amp;nbsp;On &lt;br /&gt;RewriteBase&amp;nbsp;/ &lt;br /&gt;RewriteRule ^([^.?]+)$ /ebook3/index.php&lt;br /&gt;&lt;br /&gt;.htaccess&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;/ebook3/index.php에서 /가&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;여기서 /ebook3/index.php의 위치는 Web DocumentRoot의 경로 위치인 /var/www/html/ebook3/index.php를&amp;nbsp;의미한다.&amp;nbsp;따라서&amp;nbsp;/가&amp;nbsp;의미하는&amp;nbsp;것은&amp;nbsp;Web&amp;nbsp;DocumentRoot의&amp;nbsp;위치를&amp;nbsp;의미한다.&lt;br /&gt;&lt;br /&gt;위의 내용은 어떤 형태의 url로 접근을 하더라도 무조건 /ebook3/index.php로 redirect 시키라는 규칙이다.&lt;br /&gt;만일&amp;nbsp;&lt;br /&gt;http://xxx.xxx.xxx/reserve/list&lt;br /&gt;http://xxx.xxx.xxx/reserve/view&lt;br /&gt;http://xxx.xxx.xxx/reserve/list/json&lt;br /&gt;...&lt;br /&gt;과 같이 url이 reserve로 시작하는 모든 경우 /ebook3/index.php로 이동시키고&amp;nbsp;싶다면&amp;nbsp;RewriteRule을&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;하면&amp;nbsp;될&amp;nbsp;것이다.&lt;br /&gt;&lt;br /&gt;RewriteRule ^reserve /ebook3/index.php&lt;br /&gt;&lt;br /&gt;(4)&amp;nbsp;apache2&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;service&amp;nbsp;apache2&amp;nbsp;restart &lt;br /&gt;&lt;br /&gt;rewrite&amp;nbsp;모듈이&amp;nbsp;정상적으로&amp;nbsp;구동중인지&amp;nbsp;확인할려면&amp;nbsp;phpinfo()&amp;nbsp;를&amp;nbsp;통해&amp;nbsp;나오는&amp;nbsp;페이지에서&amp;nbsp;&quot;Loaded&amp;nbsp;Modules&quot;&amp;nbsp;항목을&amp;nbsp;보면&amp;nbsp;mod_rewrite라는&amp;nbsp;항목이&amp;nbsp;있으면&amp;nbsp;해당&amp;nbsp;모듈이&amp;nbsp;정상&amp;nbsp;동작하고&amp;nbsp;있는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;이상의 작업이 완료되면 이제 PHP에서 MVC 모델을 적용하되 FrontController 역할을 index.php로 할수 있게된다. 즉 접속해 오는 모든 url을 무조건 index.php로(혹은 index.php가 아니어도 상관없다) redirect 시키고 index.php에서&amp;nbsp;url을&amp;nbsp;분석해서&amp;nbsp;각각의&amp;nbsp;url에&amp;nbsp;맞는&amp;nbsp;기능으로&amp;nbsp;분기시키면&amp;nbsp;이제&amp;nbsp;php에서도&amp;nbsp;Java의&amp;nbsp;Controller&amp;nbsp;역할을&amp;nbsp;수행하는&amp;nbsp;것이&amp;nbsp;가능하게&amp;nbsp;된다. &lt;br /&gt;아래는 index.php가 &amp;nbsp;FrontController(혹은&amp;nbsp;Controller)&amp;nbsp;역할을&amp;nbsp;하도록&amp;nbsp;간단하게&amp;nbsp;코드의&amp;nbsp;뼈대만&amp;nbsp;작성하면&amp;nbsp;이런식이&amp;nbsp;될&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;아래는 index.php가 FrontController(혹은&amp;nbsp;Controller)&amp;nbsp;역할을&amp;nbsp;하도록&amp;nbsp;간단하게&amp;nbsp;코드의&amp;nbsp;뼈대만&amp;nbsp;작성하면&amp;nbsp;이런식이&amp;nbsp;될&amp;nbsp;것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1591778008833&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

switch($path)
{
case '/reserve/list' :
   //원하는 기능
   bareak;

case '/reserve/view' :
   //원하는 기능
   break;

case '/reserve/insert' :
   //원하는 기능
   bteak;

case '/reserve/list/json' :
   //원하는 기능
   bteak;

default :
   //에러 페이지
   break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PHP</category>
      <category>PHP Controller</category>
      <category>PHP Front Controller</category>
      <category>PHP MVC</category>
      <category>php url rewrite</category>
      <category>url rewrite</category>
      <category>아파치 mod_rewrite</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/238</guid>
      <comments>https://developer-joe.tistory.com/238#entry238comment</comments>
      <pubDate>Wed, 10 Jun 2020 17:34:41 +0900</pubDate>
    </item>
    <item>
      <title>오라클에서 Primary Key 변경하기</title>
      <link>https://developer-joe.tistory.com/236</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;오라클에서&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;상황에&amp;nbsp;대해&amp;nbsp;DB를&amp;nbsp;어떻게&amp;nbsp;변경하는지에&amp;nbsp;대해&amp;nbsp;포스팅하고자&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;상황&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;PK&amp;nbsp;변경&amp;nbsp;및&amp;nbsp;새로운&amp;nbsp;칼럼&amp;nbsp;추가하고자&amp;nbsp;하는&amp;nbsp;상황이다.&lt;br /&gt;-.&amp;nbsp;현재&amp;nbsp;3개의&amp;nbsp;PK가&amp;nbsp;잡혀있는데&amp;nbsp;이&amp;nbsp;3개의&amp;nbsp;PK를&amp;nbsp;삭제하고&amp;nbsp;새로&amp;nbsp;추가하는&amp;nbsp;칼럼을&amp;nbsp;PK로&amp;nbsp;잡고자&amp;nbsp;한다.&lt;br /&gt;-.&amp;nbsp;PK로&amp;nbsp;잡히게&amp;nbsp;될&amp;nbsp;새로&amp;nbsp;추가하는&amp;nbsp;칼럼은&amp;nbsp;auto&amp;nbsp;increment가&amp;nbsp;되는&amp;nbsp;칼럼이다.&lt;br /&gt;-.&amp;nbsp;테이블&amp;nbsp;이름은&amp;nbsp;TB_MEMBER로&amp;nbsp;가정한다.&lt;br /&gt;-.&amp;nbsp;새로운&amp;nbsp;PK로&amp;nbsp;사용하게&amp;nbsp;될&amp;nbsp;새롭게&amp;nbsp;생성하게&amp;nbsp;될&amp;nbsp;칼럼은&amp;nbsp;RSV_SEQ로&amp;nbsp;가정한다.&lt;br /&gt;&lt;br /&gt;이상의&amp;nbsp;상황에서&amp;nbsp;다음&amp;nbsp;단계를&amp;nbsp;밟아&amp;nbsp;원하는&amp;nbsp;DB를&amp;nbsp;새롭게&amp;nbsp;구성할수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;(1)&amp;nbsp;현재&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;3개의&amp;nbsp;PK를&amp;nbsp;삭제한다.&amp;nbsp;TB_MEMBER라는&amp;nbsp;테이블에서&amp;nbsp;현재&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;PK들이&amp;nbsp;삭제된다.&amp;nbsp;PK라는&amp;nbsp;속성이&amp;nbsp;제거되는것이지&amp;nbsp;해당&amp;nbsp;칼럼&amp;nbsp;자체가&amp;nbsp;삭제되는&amp;nbsp;것은&amp;nbsp;아니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;TB_MEMBER&amp;nbsp;DROP&amp;nbsp;PRIMARY&amp;nbsp;KEY;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(2)&amp;nbsp;새로운&amp;nbsp;PK로&amp;nbsp;사용할&amp;nbsp;칼럼을&amp;nbsp;추가한다.&amp;nbsp;새로&amp;nbsp;추가될&amp;nbsp;칼럼인&amp;nbsp;RSV_SEQ를&amp;nbsp;추후&amp;nbsp;PK로&amp;nbsp;사용하게&amp;nbsp;될&amp;nbsp;것이고&amp;nbsp;이&amp;nbsp;칼럼은&amp;nbsp;auto&amp;nbsp;increment되는&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;TB_MEMBER&amp;nbsp;ADD(RSV_SEQ&amp;nbsp;NUMBER);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(3)&amp;nbsp;PK로&amp;nbsp;사용하게&amp;nbsp;될&amp;nbsp;새로&amp;nbsp;추가할&amp;nbsp;칼럼의&amp;nbsp;검색&amp;nbsp;속도를&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;index를&amp;nbsp;생성한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;CREATE&amp;nbsp;UNIQUE&amp;nbsp;INDEX&amp;nbsp;TB_MEMBER_PK&amp;nbsp;ON&amp;nbsp;TB_MEMBER(RSV_SEQ);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(4)&amp;nbsp;새로&amp;nbsp;추가하게&amp;nbsp;될&amp;nbsp;PK&amp;nbsp;칼럼이&amp;nbsp;auto&amp;nbsp;increment이므로&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;sequence를&amp;nbsp;생성한다.&amp;nbsp;오라클은&amp;nbsp;MySQL과&amp;nbsp;달리&amp;nbsp;해당&amp;nbsp;칼럼에&amp;nbsp;직접&amp;nbsp;auto_increment&amp;nbsp;속성을&amp;nbsp;지정할수가&amp;nbsp;없어서&amp;nbsp;별도의&amp;nbsp;시퀀서를&amp;nbsp;만들어&amp;nbsp;사용해야&amp;nbsp;한다.&amp;nbsp;sequence의&amp;nbsp;이름은&amp;nbsp;TB_MEMBER_SEQ이고&amp;nbsp;1부터&amp;nbsp;1씩&amp;nbsp;자동&amp;nbsp;증가하는&amp;nbsp;방식의&amp;nbsp;sequence이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;CREATE&amp;nbsp;SEQUENCE&amp;nbsp;TB_MEMBER_SEQ&amp;nbsp;START&amp;nbsp;WITH&amp;nbsp;1&amp;nbsp;INCREMENT&amp;nbsp;BY&amp;nbsp;1;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(5) 이상의&amp;nbsp;과정까지에서&amp;nbsp;PK로&amp;nbsp;사용하게&amp;nbsp;될&amp;nbsp;새로운&amp;nbsp;칼럼에는&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;모두&amp;nbsp;null이&amp;nbsp;들어&amp;nbsp;있을&amp;nbsp;것이다.&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;rsv_seq&amp;nbsp;|&amp;nbsp;aaa&amp;nbsp;|&amp;nbsp;bbb&amp;nbsp;|&amp;nbsp;ccc&amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;null&amp;nbsp; &amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;null&amp;nbsp; &amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;null&amp;nbsp; &amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;...&lt;br /&gt;새로&amp;nbsp;생성한&amp;nbsp;칼럼인&amp;nbsp;RSV_SEQ에&amp;nbsp;대해&amp;nbsp;앞에서&amp;nbsp;생성한&amp;nbsp;sequence를&amp;nbsp;이용해서&amp;nbsp;auto&amp;nbsp;increment된&amp;nbsp;값을&amp;nbsp;RSV_SEQ&amp;nbsp;칼럼에&amp;nbsp;update해&amp;nbsp;줘야&amp;nbsp;한다.&amp;nbsp;아래의&amp;nbsp;쿼리에&amp;nbsp;의해&amp;nbsp;기존&amp;nbsp;테이블의&amp;nbsp;각&amp;nbsp;row의&amp;nbsp;RSV_SEQ의&amp;nbsp;값은&amp;nbsp;1부터&amp;nbsp;시작해서&amp;nbsp;1씩&amp;nbsp;증가된&amp;nbsp;값들이&amp;nbsp;비로소&amp;nbsp;저장되게&amp;nbsp;된다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;UPDATE&amp;nbsp;TB_MEMBER&amp;nbsp;SET&amp;nbsp;RSV_SEQ=TB_MEMBER_SEQ.nextval;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;rsv_seq&amp;nbsp;|&amp;nbsp;aaa&amp;nbsp;|&amp;nbsp;bbb&amp;nbsp;|&amp;nbsp;ccc&amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; &amp;nbsp;| ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; &amp;nbsp;| ...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| ...&amp;nbsp; &amp;nbsp; | ...&amp;nbsp; &amp;nbsp; &amp;nbsp;| ...&lt;/span&gt;&lt;br /&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(6)&amp;nbsp;이제&amp;nbsp;비로소&amp;nbsp;새로&amp;nbsp;생성한&amp;nbsp;칼럼을&amp;nbsp;PK로&amp;nbsp;설정할수&amp;nbsp;있다.&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;TB_MEMBER&amp;nbsp;ADD&amp;nbsp;CONSTRAINT&amp;nbsp;TB_MEMBER_PK&amp;nbsp;PRIMARY&amp;nbsp;KEY(RSV_SEQ);&amp;nbsp;&lt;/span&gt;&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;굳이&amp;nbsp;위와&amp;nbsp;같은&amp;nbsp;다소&amp;nbsp;복잡한&amp;nbsp;과정&amp;nbsp;필요없이&amp;nbsp;그냥&lt;br /&gt;&lt;br /&gt;drop&amp;nbsp;table&amp;nbsp;...&lt;br /&gt;create&amp;nbsp;table&amp;nbsp;...로&amp;nbsp;간단히&amp;nbsp;변경된&amp;nbsp;내용이&amp;nbsp;적용된&amp;nbsp;DDL로&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;/p&gt;</description>
      <category>Oracle Database</category>
      <category>Oracle</category>
      <category>PK 변경</category>
      <category>Primary Key 변경</category>
      <category>오라클</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/236</guid>
      <comments>https://developer-joe.tistory.com/236#entry236comment</comments>
      <pubDate>Tue, 12 May 2020 15:18:41 +0900</pubDate>
    </item>
    <item>
      <title>Java DAO와 MyBatis Mapper xml의 쿼리문과의 매핑 원리</title>
      <link>https://developer-joe.tistory.com/235</link>
      <description>&lt;script data-ad-client=&quot;ca-pub-9374590545769786&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;아래와&amp;nbsp;같은&amp;nbsp;Mapper&amp;nbsp;xml의&amp;nbsp;쿼리&amp;nbsp;문이&amp;nbsp;있다고&amp;nbsp;할&amp;nbsp;경우,&lt;/p&gt;
&lt;pre id=&quot;code_1584002071034&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;insert id=&quot;insertMember&quot;&amp;gt;
	insert into tbl_member (userid, userpw, username, email) values 
	(#{userid}, #{userpw}, #{username}, #{email})
&amp;lt;/insert&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VO&amp;nbsp;객체는&amp;nbsp;다음과&amp;nbsp;같고,&lt;/p&gt;
&lt;pre id=&quot;code_1584002109999&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberVO {
	private String userid;
	private String userpw;
	private String username;
	private String email;
	private Date regdate;
	private Date updatedate;

	... 이하 getter, setter는 생략 ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DAO에서&amp;nbsp;Mapper&amp;nbsp;xml에&amp;nbsp;있는&amp;nbsp;쿼리&amp;nbsp;실행을&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;한다고&amp;nbsp;할때,&lt;/p&gt;
&lt;pre id=&quot;code_1584002127285&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void insertMember(MemberVO vo) {
	sqlSession.insert(namespace + &quot;.insertMember&quot;, vo);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이럴때 sqlSession.insert(namespace + &quot;.insertMember&quot;, vo)에서 vo 객체를 Mapper로 넘기면 #{userid}, #{userpw}, #{username}, #{email} 값들과 vo가 어떻게, 어떤 원리에 의해서 매핑이 되는가?&lt;br /&gt;&lt;br /&gt;SqlSession&amp;nbsp;클래스의&amp;nbsp;insert()&amp;nbsp;메소드를&amp;nbsp;보면&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;API&amp;nbsp;설명이&amp;nbsp;되어&amp;nbsp;있다.&lt;br /&gt;int&amp;nbsp;insert(String&amp;nbsp;statement,&amp;nbsp;Object&amp;nbsp;parameter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;==&amp;gt;Execute&amp;nbsp;an&amp;nbsp;insert&amp;nbsp;statement&amp;nbsp;with&amp;nbsp;the&amp;nbsp;given&amp;nbsp;parameter&amp;nbsp;object.&amp;nbsp;Any&amp;nbsp;generated&amp;nbsp;autoincrement&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;==&amp;gt;values&amp;nbsp;or&amp;nbsp;selectKey&amp;nbsp;entries&amp;nbsp;will&amp;nbsp;modify&amp;nbsp;the&amp;nbsp;given&amp;nbsp;parameter&amp;nbsp;object&amp;nbsp;properties.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;==&amp;gt;Only&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;rows&amp;nbsp;affected&amp;nbsp;will&amp;nbsp;be&amp;nbsp;returned.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parameters:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-.&amp;nbsp;statement&amp;nbsp;:&amp;nbsp;Unique&amp;nbsp;identifier&amp;nbsp;matching&amp;nbsp;the&amp;nbsp;statement&amp;nbsp;to&amp;nbsp;execute.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-.&amp;nbsp;parameter&amp;nbsp;:&amp;nbsp;A&amp;nbsp;parameter&amp;nbsp;object&amp;nbsp;to&amp;nbsp;pass&amp;nbsp;to&amp;nbsp;the&amp;nbsp;statement.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Returns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-.&amp;nbsp;int&amp;nbsp;:&amp;nbsp;The&amp;nbsp;number&amp;nbsp;of&amp;nbsp;rows&amp;nbsp;affected&amp;nbsp;by&amp;nbsp;the&amp;nbsp;insert.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;메소드의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;매개인자인&amp;nbsp;statement는&amp;nbsp;이&amp;nbsp;statement의&amp;nbsp;문자열과&amp;nbsp;1:1로&amp;nbsp;대응되는&amp;nbsp;Mapper&amp;nbsp;xml&amp;nbsp;파일에&amp;nbsp;있는&amp;nbsp;쿼리문을&amp;nbsp;지칭하게&amp;nbsp;된다.&lt;br /&gt;이때 Mapper의 id값과 statement의 문자열이 동일한 쿼리문에 매핑된다.&lt;br /&gt;위의&amp;nbsp;예에서는&amp;nbsp;Mapper&amp;nbsp;xml&amp;nbsp;파일에서&amp;nbsp;id가&amp;nbsp;insertMember인&amp;nbsp;쿼리문을&amp;nbsp;실행하게&amp;nbsp;된다.&lt;/p&gt;
&lt;pre id=&quot;code_1584002219257&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;insert id=&quot;insertMember&quot;&amp;gt;
	insert into tbl_member (userid, userpw, username, email) values 
	(#{userid}, #{userpw}, #{username}, #{email})
&amp;lt;/insert&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 번째 매개인자인 parameter는 첫 번째 매개인자인 statement가 가리키는 Mapper 클래스의 쿼리문을 실행할 때 이 쿼리문에서 사용할 변수들에(#{userid}, #{userpw}, #{username}...) 넘겨줄 값을 담고 있다.&amp;nbsp;&lt;br /&gt;위이&amp;nbsp;예에서는&amp;nbsp;MemberVO&amp;nbsp;클래스의&amp;nbsp;객체인&amp;nbsp;vo가&amp;nbsp;되겠다.&lt;br /&gt;이때&amp;nbsp;vo가&amp;nbsp;클래스가&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;값들과&amp;nbsp;#{userid},&amp;nbsp;#{userpw},&amp;nbsp;#{username},&amp;nbsp;#{email}&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;parameter에는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;다양한&amp;nbsp;종류들이&amp;nbsp;가능한데&lt;br /&gt;&lt;br /&gt;1)&amp;nbsp;parameter가&amp;nbsp;하나이고&amp;nbsp;기본&amp;nbsp;자료형이나&amp;nbsp;문자열인&amp;nbsp;경우&amp;nbsp;값이&amp;nbsp;그대로&amp;nbsp;전달된다.&lt;/p&gt;
&lt;pre id=&quot;code_1584002259150&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public MemberVO readMember(String userid) throws Exception {
	return (MemberVO)sqlSession.selectOne(namespace+&quot;.selectMember&quot;, userid);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mapper xml에서는 userid와 동일한 mapper 변수와 1:1로 대응된다. 이 경우는 #{userid} = userid가 되는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1584002280376&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;select id=&quot;selectMember&quot; resultType=&quot;org.zerock.domain.MemberVO&quot;&amp;gt;
	select 
	*
	from tbl_member
	where userid = #{userid}
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2) parameter가 클래스의 객체인 경우 해당 클래스의 getter 메소드에 대응되서 mapper 변수가 값을 획득한다.&lt;br /&gt;위의 vo 객체의 경우인 #{userid}, #{userpw}, #{username}, #{email}는 각각 vo 객체의 getUserid(), getUserpw(), getUsername(), getEmail()을 통해서 이들 각각의 Mapper 변수들의 값을 할당받게 된다.&lt;br /&gt;만일&amp;nbsp;MemberVO&amp;nbsp;클래스의&amp;nbsp;멤버&amp;nbsp;변수에&amp;nbsp;dayCalc는&amp;nbsp;존재하지&amp;nbsp;않지만&amp;nbsp;MemberVO&amp;nbsp;클래스에&amp;nbsp;getDayCalc()이라는&amp;nbsp;getter가&amp;nbsp;만들어져&amp;nbsp;있다면&amp;nbsp;Mapper&amp;nbsp;변수에&amp;nbsp;#{dayCalc}과&amp;nbsp;같이&amp;nbsp;표현하면&amp;nbsp;정상적으로&amp;nbsp;값을&amp;nbsp;가져올&amp;nbsp;수&amp;nbsp;있게된다.&lt;br /&gt;&lt;br /&gt;3)&amp;nbsp;parameter가&amp;nbsp;클래스의&amp;nbsp;객체는&amp;nbsp;아니나&amp;nbsp;Mapper로&amp;nbsp;넘겨야&amp;nbsp;할&amp;nbsp;파라미터가&amp;nbsp;2개&amp;nbsp;이상일&amp;nbsp;경우&amp;nbsp;Map에&amp;nbsp;담아서&amp;nbsp;넘기는데&amp;nbsp;이&amp;nbsp;경우의&amp;nbsp;1:1&amp;nbsp;대응&amp;nbsp;원칙은&amp;nbsp;다음과&amp;nbsp;같다.&lt;/p&gt;
&lt;pre id=&quot;code_1584002306652&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public MemberVO readWithPW(String userid, String userpw) throws Exception {
	Map&amp;lt;String, Object&amp;gt; paramMap = new HashMap&amp;lt;String, Object&amp;gt;();
	paramMap.put(&quot;userid&quot;,  userid);
	paramMap.put(&quot;userpw&quot;, userpw);
		
	return sqlSession.selectOne(namespace+&quot;.readWithPW&quot;, paramMap);
}

&amp;lt;select id=&quot;readWithPW&quot; resultType=&quot;org.zerock.domain.MemberVO&quot;&amp;gt;
	select
		*
	from tbl_member
	where userid = #{userid} and userpw = #{userpw}
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이&amp;nbsp;경우는&amp;nbsp;Map&amp;nbsp;객체의&amp;nbsp;key값과&amp;nbsp;Mapper의&amp;nbsp;변수가&amp;nbsp;1:1로&amp;nbsp;대응되서&amp;nbsp;값이&amp;nbsp;전달된다.&lt;br /&gt;즉 Map 객체의 key 이름과 Mapper xml의 변수 이름이 동일해야 한다.&lt;br /&gt;&lt;br /&gt;이상의&amp;nbsp;원리를&amp;nbsp;따라&amp;nbsp;MyBatis&amp;nbsp;Mapper&amp;nbsp;xml의&amp;nbsp;쿼리문과의&amp;nbsp;연동은&amp;nbsp;SqlSession&amp;nbsp;클래스가&amp;nbsp;알아서&amp;nbsp;매핑&amp;nbsp;작업을&amp;nbsp;처리해&amp;nbsp;준다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Spring MVC</category>
      <category>Mpper 매핑</category>
      <category>sqlSession</category>
      <author>GPLWorker</author>
      <guid isPermaLink="true">https://developer-joe.tistory.com/235</guid>
      <comments>https://developer-joe.tistory.com/235#entry235comment</comments>
      <pubDate>Thu, 12 Mar 2020 17:39:19 +0900</pubDate>
    </item>
  </channel>
</rss>