<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Paul log</title>
    <link>https://kimpaul.tistory.com/</link>
    <description> </description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 10:33:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>밍튜</managingEditor>
    <image>
      <title>Paul log</title>
      <url>https://tistory1.daumcdn.net/tistory/5287070/attach/29b36e6da8ce435b9887d04cc87c759c</url>
      <link>https://kimpaul.tistory.com</link>
    </image>
    <item>
      <title>MSA-Order-API 프로젝트 설정</title>
      <link>https://kimpaul.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MSA 강좌 중 예제 Order API 소스코드 실행 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 로컬 컴퓨터에서 docker-compose로 mysql 설치 (명령어 실행전에 docker desktop 실행)&lt;/p&gt;
&lt;pre id=&quot;code_1739236794801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up --build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/teN1A/btsMdLI2Neo/t9PjXdcYfnFNuCXX9ziGDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/teN1A/btsMdLI2Neo/t9PjXdcYfnFNuCXX9ziGDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/teN1A/btsMdLI2Neo/t9PjXdcYfnFNuCXX9ziGDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FteN1A%2FbtsMdLI2Neo%2Ft9PjXdcYfnFNuCXX9ziGDK%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;809&quot; height=&quot;260&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 명령어 입력시 docker-compose 설정대로 pulling한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZQNUF/btsMean8vpF/CMlT9Wen8zKTKdYsQaGUFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZQNUF/btsMean8vpF/CMlT9Wen8zKTKdYsQaGUFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZQNUF/btsMean8vpF/CMlT9Wen8zKTKdYsQaGUFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZQNUF%2FbtsMean8vpF%2FCMlT9Wen8zKTKdYsQaGUFk%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;996&quot; height=&quot;184&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RUN ./gradlew bootJar --no-daemon Error가 발생해서 그대로 터미널에 입력.&lt;/p&gt;
&lt;pre id=&quot;code_1739236998016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./gradlew bootJar --no-daemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dorPuQ/btsMdnBKYjl/FIG2jTFCrBWZSruvkjziKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dorPuQ/btsMdnBKYjl/FIG2jTFCrBWZSruvkjziKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dorPuQ/btsMdnBKYjl/FIG2jTFCrBWZSruvkjziKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdorPuQ%2FbtsMdnBKYjl%2FFIG2jTFCrBWZSruvkjziKK%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;332&quot; height=&quot;193&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 성공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Docker 터미널에 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvhKvC/btsMcTAUwJ6/ZhX6buk3WFcWpMrklXKyP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvhKvC/btsMcTAUwJ6/ZhX6buk3WFcWpMrklXKyP1/img.png&quot; data-alt=&quot;\&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvhKvC/btsMcTAUwJ6/ZhX6buk3WFcWpMrklXKyP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvhKvC%2FbtsMcTAUwJ6%2FZhX6buk3WFcWpMrklXKyP1%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;349&quot; height=&quot;288&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;\&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;docker-compose에 입력된대로 터미널에 입력&lt;/p&gt;
&lt;pre id=&quot;code_1739237145461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name order-api-order-db-1 -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=userdb -p 3307:3306 -d mysql:8.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cye8nN/btsMch95oHf/YJLmZqVkuf8MGfkm4XeXlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cye8nN/btsMch95oHf/YJLmZqVkuf8MGfkm4XeXlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cye8nN/btsMch95oHf/YJLmZqVkuf8MGfkm4XeXlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcye8nN%2FbtsMch95oHf%2FYJLmZqVkuf8MGfkm4XeXlK%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;1100&quot; height=&quot;293&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker containers에 실행되는 db 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2qzcW/btsMewj3bnQ/jgfbljqHyiYLG5rJUcrNg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2qzcW/btsMewj3bnQ/jgfbljqHyiYLG5rJUcrNg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2qzcW/btsMewj3bnQ/jgfbljqHyiYLG5rJUcrNg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2qzcW%2FbtsMewj3bnQ%2FjgfbljqHyiYLG5rJUcrNg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;188&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;springboot 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/belIyw/btsMeVKGjv6/tYhmHTL1TeRRAIdKLAyEX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/belIyw/btsMeVKGjv6/tYhmHTL1TeRRAIdKLAyEX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/belIyw/btsMeVKGjv6/tYhmHTL1TeRRAIdKLAyEX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbelIyw%2FbtsMeVKGjv6%2FtYhmHTL1TeRRAIdKLAyEX1%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;619&quot; height=&quot;448&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Table 생성 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 터미널에서 order 테이블에 데이터 입력&lt;/p&gt;
&lt;pre id=&quot;code_1739237312346&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it order-api-order-db-1 /bin/bash

# container
bash-5.1# mysql -u root -p
mysql&amp;gt; insert into orders (user_id, product_id, quantity) values (1, 1, 5);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojPVg/btsMerXsOqu/ru6PIziS9zj6ucsZBYurzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojPVg/btsMerXsOqu/ru6PIziS9zj6ucsZBYurzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojPVg/btsMerXsOqu/ru6PIziS9zj6ucsZBYurzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FojPVg%2FbtsMerXsOqu%2Fru6PIziS9zj6ucsZBYurzK%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;492&quot; height=&quot;75&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 입력 확인&lt;/p&gt;</description>
      <category>항해99</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/58</guid>
      <comments>https://kimpaul.tistory.com/58#entry58comment</comments>
      <pubDate>Tue, 11 Feb 2025 10:29:46 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Hash 알고리즘과 Hash충돌</title>
      <link>https://kimpaul.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 배열에서 값을 찾는 코드를 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1718933083933&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer[] arr = new Integer[4];
arr[0] = 1;
arr[1] = 2;
arr[2] = 5;
arr[3] = 8;

int searchValue = 8;
for (Integer inputValue : arr) {
	if(inputValue == searchValue) {
    	System.out.println(inputValue);
        }
   	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 arr 배열에서 searchValue = 8을 찾으려면 foreach 문에서 처럼 배열을 모두 뒤져야 찾을수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 성능은 O(n) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 장점이라고 할수있는 Index로 데이터를 검색했을때 매우 빠르게 검색할수있다. 즉 Index로 검색시 O(1)의 성능으로 찾을수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 데이터를 검색할때도 Index를 활용해서 데이터를 한번에 찾을수있다면????&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 데이터의 값과 배열의 Index를 맞추어서 저장하면 데이터를 O(1)로 빠르게 가져올수있지않을까??해서 데이터의 값자체를 배열의 Index로 사용해보자&lt;/p&gt;
&lt;pre id=&quot;code_1718933733646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer[] arr = new Integer[10];
arr[1] = 1;
arr[2] = 2;
arr[5] = 5;
arr[8] = 8;

int searchValue = 8;
Integer result = arr[searchValue];
System.out.println(&quot;result = &quot; + result);

//[null, 1 , 2, null, null, 5 , null, null, 8, null]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byDLNb/btsH6kbt1iR/ls7J864tMKRxrydxmbYnjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byDLNb/btsH6kbt1iR/ls7J864tMKRxrydxmbYnjk/img.png&quot; data-alt=&quot;배열인덱스 = 데이터값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byDLNb/btsH6kbt1iR/ls7J864tMKRxrydxmbYnjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyDLNb%2FbtsH6kbt1iR%2Fls7J864tMKRxrydxmbYnjk%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;663&quot; height=&quot;216&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배열인덱스 = 데이터값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;index 1 = data 1&lt;/li&gt;
&lt;li&gt;index 2 = data 2&lt;/li&gt;
&lt;li&gt;index 5 = data 5&lt;/li&gt;
&lt;li&gt;index 8 = data 8&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 데이터 1을 찾고싶다면 arr[1] , 데이터 8을 검색하고싶다면?? arr[8]을 입력하면되니까 O(1)의 성능으로 매우빠르게 찾을수있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그치만... 배열길이가 10인데 배열에 데이터가 들어있는걸 보면 [null, 1 , 2, null, null, 5 , null, null, 8, null] 이네..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 데이터 1, 2 ,5 , 8, 14, 99 를 넣으려면 최소 new Integer[100] 만큼의 배열이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 인덱스=데이터값으로 만든 배열의 문제는 입력값의 범위만큼 큰 배열을 사용해야해서 배열에 낭비되는 공간이 많이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;해시알고리즘 비슷한걸&lt;/b&gt; 을 도입해본다면....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 배열의 크기를 100 에서 CAPACITY크기인 10으로 줄여보고, hashIndex를 구하는 함수를 value % CAPACITY(10)으로 정의해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHCTd2/btsH6eCmrAi/25fkSICutJIIv5quzS1X50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHCTd2/btsH6eCmrAi/25fkSICutJIIv5quzS1X50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHCTd2/btsH6eCmrAi/25fkSICutJIIv5quzS1X50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHCTd2%2FbtsH6eCmrAi%2F25fkSICutJIIv5quzS1X50%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;525&quot; height=&quot;356&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;searchValue = 14를 위 배열에서 찾는다고 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;searchValue를 해시인덱스화 시키면 '4' 가 나오고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr[해시인덱스=4] = 14로 O(1)의 속도로 빠르게 찾을수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해시(Hash)&lt;/b&gt; 알고리즘은 데이터를 찾는 검색 성능을 평균 O(1)로 데이터를 빠르게 찾을수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hashcode를 만드는 실제 계산방법은 다음과같은데&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;hashCode= s[0] &amp;times; 31(n&amp;minus;1) + s[1] &amp;times; 31(n&amp;minus;2) + &amp;hellip; + s[n&amp;minus;1]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s[i] 는 문자열의 i번째 문자&lt;/li&gt;
&lt;li&gt;n은 문자열의 길이&lt;/li&gt;
&lt;li&gt;31은 해시코드를 계산할때 사용하는 상수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 계산하는건 어차피 컴퓨터가 해주는거니까 자세히 알필요는 딱히 없을거같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한건 해시알고리즘으로 1) 데이터를 해시인덱스화 시킨다 2) 배열의 인덱스=해시인덱스 공간에 데이터를 넣는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 데이터를 찾을때 데이터를 해시인덱스화 시킨 값으로 배열[해시인덱스] 로 조회하면 O(1)로 빠르게 조회할수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만 알면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 해시알고리즘에는 한계가 있다. 바로 '&lt;b&gt;다른값을 입력했을 때 같은 해시코드가 나올수 있음&lt;/b&gt;' 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 말해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해시알고리즘 비슷한걸&lt;/b&gt; 로 해시인덱스값을 구하는 방법이 10으로 나눈 나머지라고 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;99 % 10 = 9 (해시값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;9 % 9 = 9 (해시값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 99와 9가 모두 해시값이 9로 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 저장할 위치가 충돌할수 있다는 한계가있는데 이를 &lt;b&gt;Hash충돌 &lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crf1Wd/btsH7WUy27z/TX9BNgF4LL86KNmnhd9dak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crf1Wd/btsH7WUy27z/TX9BNgF4LL86KNmnhd9dak/img.png&quot; data-alt=&quot;해시 충돌 ㅠㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crf1Wd/btsH7WUy27z/TX9BNgF4LL86KNmnhd9dak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrf1Wd%2FbtsH7WUy27z%2FTX9BNgF4LL86KNmnhd9dak%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;468&quot; height=&quot;297&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해시 충돌 ㅠㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 해시충돌 문제를 해결하는 방법은 CAPACITY를 100으로 늘리면 해결되기는 하는데....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 메모리 낭비가 심하다는 맨 처음 한계를 해결할수가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해시 충돌 해결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 충돌은 낮은 확률로 일어날수있다고 가정하고 인정하는것이 바로 해결방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 충돌이 난 경우 내부의 데이터를 하나씩 비교해보면 원하는 결과를 찾을수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 최악의 경우 [9, 19 , 29 , 99 ]를 해시인덱스화 시키면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LXBrX/btsH5YGwOAr/0gBkHch3nstF6gUCfRr4j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LXBrX/btsH5YGwOAr/0gBkHch3nstF6gUCfRr4j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LXBrX/btsH5YGwOAr/0gBkHch3nstF6gUCfRr4j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLXBrX%2FbtsH5YGwOAr%2F0gBkHch3nstF6gUCfRr4j0%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;460&quot; height=&quot;256&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 처럼 9 , 9 , 9 , 9로 같은 해시인덱스가 나오고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr[9=해시인덱스]에 공간에 9, 19, 29, 99가 다들어간다...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 데이터를 찾을때 arr[9]에 있는 값을 다 뒤져봐야되는 O(n)이 되버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그치만 hashcode를 만드는 실제 방법을 쓰면 거의 충돌이 일어나지 않게 계산이되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충돌이 되더라도 배열을 쬐끔만 돌면 되기때문에 속도가 거의 O(1)이라고 할수있게되서 다들 Hash를 쓴다고한다...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/55</guid>
      <comments>https://kimpaul.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 21 Jun 2024 11:27:45 +0900</pubDate>
    </item>
    <item>
      <title>[javascript] Javascript에서 자주나오는 'this'란 뭘까</title>
      <link>https://kimpaul.tistory.com/54</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Javascript&amp;nbsp;'this'&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this의 값은 함수를 호출하는 방법에 의해 결정된다. &lt;br /&gt;클로저는&amp;nbsp;선언되는&amp;nbsp;위치에&amp;nbsp;의해&amp;nbsp;달라진다. &lt;br /&gt;&lt;br /&gt;this는&amp;nbsp;누가&amp;nbsp;호출했느냐가&amp;nbsp;this가&amp;nbsp;된다. &lt;br /&gt;&lt;b&gt;즉&amp;nbsp;&quot;호출한객체가&amp;nbsp;this이다.&quot;&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예제를&amp;nbsp;보면 &lt;/p&gt;
&lt;pre id=&quot;code_1714103128840&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = {
	name : 'code',
	who : function(){
		console.log(this);
  	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;a.who();&amp;nbsp;를&amp;nbsp;호출하면 &lt;br /&gt;&lt;br /&gt;who&amp;nbsp;function안의&amp;nbsp;console.log(this)가&amp;nbsp;실행되고 &lt;br /&gt;여기서의&amp;nbsp;this는&amp;nbsp;a가&amp;nbsp;who()를&amp;nbsp;호출한것이&amp;nbsp;되므로 &lt;br /&gt;const&amp;nbsp;a&amp;nbsp;객체&amp;nbsp;본인이된다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그럼&amp;nbsp;코드를&amp;nbsp;변형시켜서 &lt;br /&gt;&lt;br /&gt;let&amp;nbsp;b&amp;nbsp;=&amp;nbsp;a.who;&amp;nbsp;즉&amp;nbsp;a객체의&amp;nbsp;who함수를&amp;nbsp;변수&amp;nbsp;b에&amp;nbsp;할당하고 &lt;br /&gt;&lt;br /&gt;b를&amp;nbsp;실행해보자 &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;br /&gt;b(); &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;그럼&amp;nbsp;b()는&amp;nbsp;a.who이고&amp;nbsp;a.who()&amp;nbsp;가&amp;nbsp;실행되면&amp;nbsp;console.log(this)가&amp;nbsp;실행되는거고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;여기서의 this는 b()를 호출한 'window' 가 된다&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;bind를&amp;nbsp;사용해서&amp;nbsp;this를&amp;nbsp;예외적으로&amp;nbsp;고정시켜보자&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;let bindedC = b.bind(a);&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이렇게되면&amp;nbsp;b의&amp;nbsp;this는&amp;nbsp;무조건&amp;nbsp;&lt;b&gt;a&lt;/b&gt;가된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;bindedC()를&amp;nbsp;호출하면&amp;nbsp;??&amp;nbsp;b()가실행되고&amp;nbsp;b()내부의&amp;nbsp;a.who가&amp;nbsp;실행되고&amp;nbsp;최종적으로&amp;nbsp;a.who의&amp;nbsp;console.log(this)가&amp;nbsp;실행되는데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;여기서의&amp;nbsp;this는&amp;nbsp;b.bind(a)를&amp;nbsp;했으므로&amp;nbsp;무조건&amp;nbsp;a가된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;즉&amp;nbsp;console.log의&amp;nbsp;결과로&amp;nbsp;a객체가&amp;nbsp;나온다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;전역컨텍스트에서&amp;nbsp;this는&amp;nbsp;window&amp;nbsp;객체이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;'use&amp;nbsp;strict'는&amp;nbsp;엄격모드이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;객체&amp;nbsp;메서드에서&amp;nbsp;this는&amp;nbsp;함수를&amp;nbsp;호출한&amp;nbsp;객체인&amp;nbsp;Object본인이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;this가&amp;nbsp;객체&amp;nbsp;밖에서&amp;nbsp;정의되었던&amp;nbsp;안에서&amp;nbsp;정의되었던&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;this가&amp;nbsp;호출된&amp;nbsp;그&amp;nbsp;시점의&amp;nbsp;객체가&amp;nbsp;this가&amp;nbsp;된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;.바로&amp;nbsp;왼쪽의&amp;nbsp;객체가&amp;nbsp;this&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;예를들어&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714103351954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fucntion main() {
	console.log(this);
}

const object = {
	name : '나',
	smallObject : {
		name : '너',
		main
	},
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이렇게&amp;nbsp;선언되어있을때&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;object.smallObject.main()을&amp;nbsp;호출하면??&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;main()내부&amp;nbsp;console.log(this)가&amp;nbsp;실행되고&amp;nbsp;.main()&amp;nbsp;왼쪽의&amp;nbsp;smallObject가 &lt;b&gt;this&lt;/b&gt;가된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이벤트&amp;nbsp;처리기&amp;nbsp;에서의&amp;nbsp;this는&amp;nbsp;&lt;b&gt;event.target&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/54</guid>
      <comments>https://kimpaul.tistory.com/54#entry54comment</comments>
      <pubDate>Fri, 26 Apr 2024 12:49:56 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 다형성에 대해 알아보자(feat.다형적 참조, 메서드 오버라이딩)</title>
      <link>https://kimpaul.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍의 대표적 특징들은 다들 알고있을것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상화, 캡슐화, 상속, 다형성...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에 가장 중요하고 이해하기 어렵다는 다형성에대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성은 Polymorphism이라는 이름 그대로 '다양한 형태', '여러 형태'를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될수 있는 능력을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 타입이 결정되어있는 하나의 객체가 다른 타입으로 사용 될수 있다는 뜻이다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 무슨말인지 정확히 모르겠으니 자세히 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성을 이해하기 위해선 2가지 핵심 이론을 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 다형성 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 메서드 오버라이딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다형성 참조&lt;/b&gt;란 간단히 말해서 &quot;부모는 자식을 담을수 있지만 자식은 부모를 담을수 없다&quot; 라고 할수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 그림을 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFo9o7/btsE7tQrGsJ/gfCsaOEBTxGUP5pmusBgQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFo9o7/btsE7tQrGsJ/gfCsaOEBTxGUP5pmusBgQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFo9o7/btsE7tQrGsJ/gfCsaOEBTxGUP5pmusBgQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFo9o7%2FbtsE7tQrGsJ%2FgfCsaOEBTxGUP5pmusBgQ1%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;695&quot; height=&quot;203&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parent를 상속하는 Child 클래스가 있다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Child 타입의 인스턴스를 생성하면 오른쪽 그림처럼 메모리에 Child와 상속받는 Parent가 모두 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 Child child1 = new Child();로 선언했을때 그림이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjUC1C/btsE91Mvj1a/PPstFw37iq9f1pFAAG23Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjUC1C/btsE91Mvj1a/PPstFw37iq9f1pFAAG23Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjUC1C/btsE91Mvj1a/PPstFw37iq9f1pFAAG23Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjUC1C%2FbtsE91Mvj1a%2FPPstFw37iq9f1pFAAG23Ak%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;696&quot; height=&quot;199&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 그림은 Parent 타입의 클래스를 인스턴스화 했을때 메모리 그림이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8nr14/btsFaFWMOXg/dkDLrXB908GVkhE4Ox09s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8nr14/btsFaFWMOXg/dkDLrXB908GVkhE4Ox09s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8nr14/btsFaFWMOXg/dkDLrXB908GVkhE4Ox09s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8nr14%2FbtsFaFWMOXg%2FdkDLrXB908GVkhE4Ox09s0%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;695&quot; height=&quot;195&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성을 이용해 new Child() 인스턴스를 Parent타입의 poly 변수가 참조하고 있는 그림이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 다형성을 설명해보면&lt;/p&gt;
&lt;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;Parent poly는 부모타입이고 new Child()를 통해 생성된 결과는 Child 타입이므로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Parent poly = new Child()는 가능하다&lt;/li&gt;
&lt;li&gt;Child child1 = new parent() 는 불가능! 컴파일 오류 발생함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다형적 참조에는 한계가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOtaj/btsFbi1ksiD/J12EgZrxV8xAyF9yap7QJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOtaj/btsFbi1ksiD/J12EgZrxV8xAyF9yap7QJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOtaj/btsFbi1ksiD/J12EgZrxV8xAyF9yap7QJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOtaj%2FbtsFbi1ksiD%2FJ12EgZrxV8xAyF9yap7QJ0%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;680&quot; height=&quot;243&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에서는 Child인스턴스를 Parent 타입의 poly변수가 참조하고있다.(다형적 참조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poly는 Parent타입 변수이므로 자식타입의 Child의 childMethod는 호출이 불가능 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼이때 '다운 캐스팅'을 해버린다면?&lt;/p&gt;
&lt;pre id=&quot;code_1708566848374&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Child child = (Child) poly
child.childMethod()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 자식타입의 childMethod를 호출하는게 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업캐스팅(upcasting): 부모 타입으로 변경&lt;/li&gt;
&lt;li&gt;다운캐스팅(downcasting): 자식 타입으로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 순서&lt;/p&gt;
&lt;pre id=&quot;code_1708566754300&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Child child = (Child) poly //다운캐스팅을 통해 부모타입을 자식 타입으로 변환한 다음에 대입 시도 
Child child = (Child) x001 //참조값을 읽은 다음 자식 타입으로 지정 
Child child = x001 //최종 결과&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 캐스팅을 한다고 해서 Parent poly 의 타입이 변하는 것은 아니고 해당 참조값을 꺼내고 꺼낸 참조값이 Child 타입이 된다. 따라서 poly 의 타입은 Parent 로 기존과 같이 유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메서드 오버라이딩&lt;/b&gt;이란 다 아는것처럼 상속받은 메서드를 재정의해서 기존 기능을 덮어 새로운 기능으로 한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드를 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708567295990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OverridingMain {
 	public static void main(String[] args) {
 
 	//자식 변수가 자식 인스턴스 참조
 	Child child = new Child();
 	System.out.println(&quot;Child -&amp;gt; Child&quot;);
 	System.out.println(&quot;value = &quot; + child.value);
 	child.method();
 	
   	 //부모 변수가 부모 인스턴스 참조
 	Parent parent = new Parent();
 	System.out.println(&quot;Parent -&amp;gt; Parent&quot;);
 	System.out.println(&quot;value = &quot; + parent.value);
 	parent.method();
 
 	//부모 변수가 자식 인스턴스 참조(다형적 참조)
 	Parent poly = new Child();
 	System.out.println(&quot;Parent -&amp;gt; Child&quot;);
 	System.out.println(&quot;value = &quot; + poly.value); //변수는 오버라이딩X
 	poly.method(); //메서드 오버라이딩!
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림을 통해서 코드를 분석해보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4H3gU/btsE9ED4ThE/yaVTiBhGOjSO5AjBe9KaJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4H3gU/btsE9ED4ThE/yaVTiBhGOjSO5AjBe9KaJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4H3gU/btsE9ED4ThE/yaVTiBhGOjSO5AjBe9KaJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4H3gU%2FbtsE9ED4ThE%2FyaVTiBhGOjSO5AjBe9KaJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;342&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Parent -&amp;gt; Parent&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj1Rgs/btsE9ExiRos/HRichHHiLWJQZ8vhdUnKj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj1Rgs/btsE9ExiRos/HRichHHiLWJQZ8vhdUnKj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj1Rgs/btsE9ExiRos/HRichHHiLWJQZ8vhdUnKj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj1Rgs%2FbtsE9ExiRos%2FHRichHHiLWJQZ8vhdUnKj1%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;688&quot; height=&quot;294&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTj5J/btsFb6TE51e/JAFBkjkby8xh83UCgHHK6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTj5J/btsFb6TE51e/JAFBkjkby8xh83UCgHHK6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTj5J/btsFb6TE51e/JAFBkjkby8xh83UCgHHK6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTj5J%2FbtsFb6TE51e%2FJAFBkjkby8xh83UCgHHK6K%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;698&quot; height=&quot;265&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 중요하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poly 변수는 Parent 타입이다. 따라서 poly.value, poly.method() 를 호출하면 인스턴스의 Parent 타입에서 기능을 찾아서 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'오버라이딩 된 메서드는 항상 우선권을 가진다' &amp;lt;- 이 부분이 핵심!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Parent.method() 가 아니라 Child.method() 가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/52</guid>
      <comments>https://kimpaul.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 22 Feb 2024 11:06:21 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] 영속성 컨텍스트가 뭐야? Entity Manager는 뭐</title>
      <link>https://kimpaul.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;영속성&amp;nbsp;컨텍스트&amp;gt; &lt;br /&gt;&lt;br /&gt;JPA에서&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;2가지 &lt;br /&gt;1.&amp;nbsp;객체와&amp;nbsp;관계형&amp;nbsp;데이터베이스&amp;nbsp;매핑하기(Object&amp;nbsp;Relational&amp;nbsp;Mapping) &lt;br /&gt;2.&amp;nbsp;영속성&amp;nbsp;컨텍스트 &lt;br /&gt;&lt;br /&gt;EntityManagerFactory&amp;nbsp;-&amp;gt;&amp;nbsp;고객요청시&amp;nbsp;EM&amp;nbsp;생성&amp;nbsp;-&amp;gt;&amp;nbsp;EM은&amp;nbsp;내부적으로&amp;nbsp;DB&amp;nbsp;connection을&amp;nbsp;사용해서&amp;nbsp;DB&amp;nbsp;자원에&amp;nbsp;접근하고&amp;nbsp;사용\ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그럼&amp;nbsp;영속성&amp;nbsp;컨텍스트라는게&amp;nbsp;대체&amp;nbsp;뭔가? &lt;br /&gt;한마디로&amp;nbsp;정의하면&amp;nbsp;&quot;엔티티를&amp;nbsp;영구&amp;nbsp;저장하는&amp;nbsp;환경&quot;이라는&amp;nbsp;뜻 &lt;br /&gt;&lt;br /&gt;-&amp;gt;&amp;nbsp;EntityManager.persist(entity); &lt;br /&gt;&lt;br /&gt;여기서&amp;nbsp;persist()&amp;nbsp;는&amp;nbsp;entity를&amp;nbsp;db에&amp;nbsp;저장하는게&amp;nbsp;아니다. &lt;br /&gt;영속성&amp;nbsp;컨텍스트를&amp;nbsp;통해서&amp;nbsp;엔티티를&amp;nbsp;영속화&amp;nbsp;한다는뜻이다.&amp;nbsp;쉽게말해&amp;nbsp;엔티티를&amp;nbsp;영속성&amp;nbsp;컨텍스트라는곳에&amp;nbsp;저장하는것이다. &lt;br /&gt;&lt;br /&gt;영속성&amp;nbsp;컨텍스트가&amp;nbsp;그래서&amp;nbsp;뭔데... &lt;br /&gt;사실&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;생긴다. &lt;br /&gt;&lt;br /&gt;&amp;lt;엔티티의&amp;nbsp;생명주기&amp;gt; &lt;br /&gt;1.&amp;nbsp;비영속(new) &lt;br /&gt;2.&amp;nbsp;영속(managed)&amp;nbsp;.persist() &lt;br /&gt;3.&amp;nbsp;준영속(detached) &lt;br /&gt;4.&amp;nbsp;삭제(removed) &lt;br /&gt;&lt;br /&gt;비영속상태는&amp;nbsp;말그대로&amp;nbsp;객체를&amp;nbsp;new&amp;nbsp;해서&amp;nbsp;생성한상태이고&amp;nbsp;entitymanager에는&amp;nbsp;영속되지&amp;nbsp;않은&amp;nbsp;상태이다.&amp;nbsp;jpa와는&amp;nbsp;전혀&amp;nbsp;관계없는&amp;nbsp;상태. &lt;br /&gt;Member&amp;nbsp;member&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Member(); &lt;br /&gt;member.setId(&quot;member1&quot;); &lt;br /&gt;member.setUsername(&quot;회원1&quot;); &lt;br /&gt;&lt;br /&gt;//1차&amp;nbsp;캐시에&amp;nbsp;저장 &lt;br /&gt;em.persist(member); &lt;br /&gt;&lt;br /&gt;//1차&amp;nbsp;캐시에서&amp;nbsp;조회 &lt;br /&gt;Member&amp;nbsp;findMember&amp;nbsp;=&amp;nbsp;em.find(Member.class,&amp;nbsp;&quot;member1&quot;); &lt;br /&gt;&lt;br /&gt;영속상태는&amp;nbsp;EM안에&amp;nbsp;있는&amp;nbsp;영속성&amp;nbsp;컨텍스트에&amp;nbsp;new한&amp;nbsp;객체가&amp;nbsp;들어가면서&amp;nbsp;영속된&amp;nbsp;상태를&amp;nbsp;말한다. &lt;br /&gt;&lt;br /&gt;detached는&amp;nbsp;말그대로&amp;nbsp;엔티티를&amp;nbsp;영속성&amp;nbsp;컨텍스트에서&amp;nbsp;분리시키는것을&amp;nbsp;말하고&amp;nbsp;객체를&amp;nbsp;삭제하는게&amp;nbsp;remove이다. &lt;br /&gt;&lt;br /&gt;그럼&amp;nbsp;영속성&amp;nbsp;컨텍스트의&amp;nbsp;이점은?? &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;1차&amp;nbsp;캐시 &lt;br /&gt;:&amp;nbsp;영속성&amp;nbsp;컨텍스트는&amp;nbsp;내부에&amp;nbsp;1차캐시를&amp;nbsp;들고있음.&amp;nbsp;그래서&amp;nbsp;객체를&amp;nbsp;생성하고&amp;nbsp;영속하면&amp;nbsp;1차캐시&amp;nbsp;내부에&amp;nbsp;@Id&amp;nbsp;/&amp;nbsp;Entity로&amp;nbsp;맵핑되어&amp;nbsp;들어감. &lt;br /&gt;그럼&amp;nbsp;id로&amp;nbsp;조회시&amp;nbsp;바로&amp;nbsp;DB를&amp;nbsp;조회하는게&amp;nbsp;아니라&amp;nbsp;1차캐시를&amp;nbsp;뒤져서&amp;nbsp;id에&amp;nbsp;맞는&amp;nbsp;Entity를&amp;nbsp;찾아&amp;nbsp;바로&amp;nbsp;조회한다. &lt;br /&gt;만약&amp;nbsp;1차캐시에&amp;nbsp;없는&amp;nbsp;id를&amp;nbsp;조회하면&amp;nbsp;먼저&amp;nbsp;1차캐시를&amp;nbsp;조회후&amp;nbsp;DB를&amp;nbsp;조회한다.&amp;nbsp;그다음&amp;nbsp;1차캐시에&amp;nbsp;저장후&amp;nbsp;반환한다. &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;동일성(identity)보장 &lt;br /&gt;:조회한&amp;nbsp;entity&amp;nbsp;객체를&amp;nbsp;==비교시&amp;nbsp;주소가&amp;nbsp;같음 &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;트랜잭션을&amp;nbsp;지원하는&amp;nbsp;쓰기&amp;nbsp;지원 &lt;br /&gt;:&amp;nbsp;transaction.begin();&amp;nbsp; &lt;br /&gt;em.persist(memberA); &lt;br /&gt;em.persirst(memberB); &lt;br /&gt;했을때&amp;nbsp;영속성&amp;nbsp;컨텍스트의&amp;nbsp;1차캐시에&amp;nbsp;memberA,&amp;nbsp;memberB를&amp;nbsp;쌓아놓고&amp;nbsp;이떄&amp;nbsp;Insert쿼리를&amp;nbsp;만들어&amp;nbsp;쓰기지연&amp;nbsp;SQL저장소에&amp;nbsp;쌓는다. &lt;br /&gt;transaction.commit();&amp;nbsp;할때&amp;nbsp;DB에&amp;nbsp;SQL을&amp;nbsp;보낸다. &lt;br /&gt;&lt;br /&gt;왜이런&amp;nbsp;기능을&amp;nbsp;지원하는거지? &lt;br /&gt;&lt;br /&gt;여기서&amp;nbsp;버퍼링을&amp;nbsp;쓸수있다.&amp;nbsp;.persist()할때마다&amp;nbsp;쿼리를&amp;nbsp;날리게되면&amp;nbsp;최적화할수있는&amp;nbsp;여지가&amp;nbsp;없다. &lt;br /&gt;member1과&amp;nbsp;member2를&amp;nbsp;모아서&amp;nbsp;한꺼번에&amp;nbsp;보내는&amp;nbsp;버퍼링! &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;변경감지(Dirty&amp;nbsp;Checking) &lt;br /&gt;:&amp;nbsp;member의&amp;nbsp;속성이&amp;nbsp;member.setName(&quot;zzz&quot;)로&amp;nbsp;변경되었다.&amp;nbsp;그러고&amp;nbsp;em.persist(member)를&amp;nbsp;다시&amp;nbsp;넣지않아도 &lt;br /&gt;JPA는&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;쿼리를&amp;nbsp;날려주는거지? &lt;br /&gt;&lt;br /&gt;비밀은&amp;nbsp;영속&amp;nbsp;컨텍스트에&amp;nbsp;있다. &lt;br /&gt;JPA는&amp;nbsp;커밋하는&amp;nbsp;시점에&amp;nbsp;내부에서&amp;nbsp;Flush가&amp;nbsp;호출됨. &lt;br /&gt;커밋할때&amp;nbsp;엔티티와&amp;nbsp;스냅샷을&amp;nbsp;비교한다.&amp;nbsp;스냅샷이&amp;nbsp;뭐야? &lt;br /&gt;1차&amp;nbsp;캐시에는&amp;nbsp;사실&amp;nbsp;@ID(PK)와&amp;nbsp;Entity,&amp;nbsp;그리고&amp;nbsp;스냅샷이&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;영속성&amp;nbsp;컨텍스트에&amp;nbsp;들어온&amp;nbsp;최초의&amp;nbsp;시점을&amp;nbsp;스냅샷을&amp;nbsp;찍어&amp;nbsp;저장해둔다.&amp;nbsp;커밋시점에&amp;nbsp;영속컨텍스트가&amp;nbsp;Entity와&amp;nbsp;스냅샷을&amp;nbsp;비교해서&amp;nbsp;달라진게&amp;nbsp;있다면 &lt;br /&gt;UPDATE SQL을 생성해서 쓰기지연SQL저장소에 만들어 넣는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbv3c0/btsDiQ0Jgio/fkzkEvOmulOsNaPaYw5C3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbv3c0/btsDiQ0Jgio/fkzkEvOmulOsNaPaYw5C3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbv3c0/btsDiQ0Jgio/fkzkEvOmulOsNaPaYw5C3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbv3c0%2FbtsDiQ0Jgio%2FfkzkEvOmulOsNaPaYw5C3K%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;550&quot; height=&quot;424&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 논리적 개념의 영속성 컨텍스트를 그림으로 만든것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차캐시에 그림과같이 @Id , Entity, 스냅샷이 있어서 엔티티와 스냅샷의 비교가 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.&amp;nbsp;엔티티&amp;nbsp;삭제 &lt;br /&gt;:&amp;nbsp;Member&amp;nbsp;memberA&amp;nbsp;=&amp;nbsp;em.find(Member.class,&amp;nbsp;&quot;memberA&quot;); &lt;br /&gt;&lt;br /&gt;em.remove(memberA)하면&amp;nbsp;커밋시점에&amp;nbsp;Delete&amp;nbsp;쿼리가&amp;nbsp;나가게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;플러시(Flush) &lt;br /&gt;:&amp;nbsp;영속성&amp;nbsp;컨텍스트의&amp;nbsp;변경내용을&amp;nbsp;DB에&amp;nbsp;반영하는것을&amp;nbsp;말한다. &lt;br /&gt;플러시&amp;nbsp;발생시&amp;nbsp;변경감지(dirty&amp;nbsp;checking)이&amp;nbsp;일어남.&amp;nbsp;1차캐시에&amp;nbsp;엔티티와&amp;nbsp;스냅샷&amp;nbsp;비교후&amp;nbsp;수정된게&amp;nbsp;있으면 &lt;br /&gt;수정된&amp;nbsp;엔티티를&amp;nbsp;쓰기지연&amp;nbsp;SQL&amp;nbsp;저장소에&amp;nbsp;등록한다.&amp;nbsp;그리고&amp;nbsp;쓰기지연&amp;nbsp;SQL저장소의&amp;nbsp;쿼리를&amp;nbsp;DB에&amp;nbsp;전송한다(등록,&amp;nbsp;수정,&amp;nbsp;삭제&amp;nbsp;쿼리) &lt;br /&gt;&lt;br /&gt;그럼&amp;nbsp;영속성&amp;nbsp;컨텍스트를&amp;nbsp;플러시하는&amp;nbsp;방법은&amp;nbsp;뭐야? &lt;br /&gt;&lt;br /&gt;em.flush()&amp;nbsp;로&amp;nbsp;직접&amp;nbsp;호출하거나&amp;nbsp;트랜잭션&amp;nbsp;커밋&amp;nbsp;또는&amp;nbsp;JPQL&amp;nbsp;쿼리를&amp;nbsp;실행하여&amp;nbsp;플러시를&amp;nbsp;자동&amp;nbsp;호출할수있다. &lt;br /&gt;&lt;br /&gt;그럼&amp;nbsp;플러시를&amp;nbsp;하게되면&amp;nbsp;EM안에&amp;nbsp;1차캐시가&amp;nbsp;다&amp;nbsp;지워지는건가? &lt;br /&gt;그건 아니다. 플러시는 쓰기지연 SQL저장소에 쌓인 쿼리들이 DB에 반영이 되는 과정이다.&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;준영속&amp;nbsp;상태 &lt;br /&gt;:&amp;nbsp;말그대로&amp;nbsp;영속성&amp;nbsp;컨텍스트에서&amp;nbsp;있던&amp;nbsp;entity가&amp;nbsp;분리되는것이다.&amp;nbsp;이렇게되면&amp;nbsp;영속성&amp;nbsp;컨텍스트가&amp;nbsp;제공하는&amp;nbsp;dirty&amp;nbsp;checking&amp;nbsp;같은&amp;nbsp;기능을&amp;nbsp;사용&amp;nbsp;못한다. &lt;br /&gt;준영속&amp;nbsp;상태로&amp;nbsp;만다는&amp;nbsp;방법은&amp;nbsp;em.close()&amp;nbsp;영속성컨텍스를&amp;nbsp;종료/&amp;nbsp;em.detach(member)&amp;nbsp;특정(member)&amp;nbsp;엔티티만&amp;nbsp;초기화&amp;nbsp;/&amp;nbsp;em.clear()&amp;nbsp;통째로&amp;nbsp;날리는&amp;nbsp; &lt;br /&gt;방법이있다. &lt;/p&gt;</description>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/51</guid>
      <comments>https://kimpaul.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 11 Jan 2024 16:05:14 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 엔티티 설계시 주의사항</title>
      <link>https://kimpaul.tistory.com/50</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;엔티티에는 가급적 Setter를 사용하지 말자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Setter가 모두 열려있다면, 변경 포인트가 너무 많아서 유지보수가 힘들다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모든 연관관계는 지연로딩으로 설정! (외워야함! 중요!)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;즉시로딩(EAGER)은 예측이 어렵고 어떤 SQL이 실행될지 추적하기가 어렵다. 특히 JPQL을 실행할때 N+1문제가 자주 발생한다.&lt;/li&gt;
&lt;li&gt;실무에서는 모든 연관관계를 지연로딩(LAZY)로 설정해야 한다.&lt;/li&gt;
&lt;li&gt;연관된 엔티티를 함께 DB에서 조회해야 하면 'fetch join'또는 엔티티 그래프 기능을 사용한다.&lt;/li&gt;
&lt;li&gt;@XToOne(OneToOne, ManyToOne)관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컬렉션은 필드에서 초기화하자&lt;/h3&gt;
&lt;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;pre id=&quot;code_1704178993837&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private List&amp;lt;OrderItem&amp;gt; orderItems = new ArrayList&amp;lt;&amp;gt;(); //ex&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null 문제에서 안전하다.&lt;/li&gt;
&lt;li&gt;하이버네이트는 엔티티를 영속화 할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 getOrders() 처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는것이 가장 안전하고, 코드도 간결하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : 인프런 | 김영한 실전! 스프링부트와 JPA활용편&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/50</guid>
      <comments>https://kimpaul.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 2 Jan 2024 16:43:24 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 김영한선생님이 알려주신 인텔리제이 유용한 단축키 모음 + 접근제어자 종류</title>
      <link>https://kimpaul.tistory.com/48</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;회사에서는 윈도우를 사용하고 있으므로&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 기준으로 작성하겠다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;단어 한칸 블록잡기 : ctrl + w -&amp;gt; 커서가 있는곳에 단어를 블록해준다. 단어 한방에 지우거나 바꿀때 유용&lt;br /&gt;같은단어 전체 블록 : shift + F6&lt;br /&gt;파라미터 정보보기 : ctrl + p&lt;br /&gt;타입 + 변수 자동생성 : ctrl + alt + v&lt;br /&gt;커서가 어디든 ; 붙여서 한줄 내려가기 : ctrl + shift + enter&lt;br /&gt;Generator : alt + insert&lt;br /&gt;Override : ctrl + o&lt;br /&gt;직전에 썼던 클래스 목록보기 : ctrl + e&lt;br /&gt;인라인 베리어블 : ctrl+alt+n&lt;br /&gt;메서드로 뽑아내기(extract method) : ctrl+alt+m -&amp;gt;김영한님이 제일 좋아하는 단축키라고 함&lt;br /&gt;메서드에서 테스트코드 만들기 : ctrl + shift + t&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;접근제어자 정리도 잘해주셔서 캡쳐해서 정리해보았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBIVr/btsBJbdsZ9r/dUw7IYMKV15LxochkKgxM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBIVr/btsBJbdsZ9r/dUw7IYMKV15LxochkKgxM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBIVr/btsBJbdsZ9r/dUw7IYMKV15LxochkKgxM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBIVr%2FbtsBJbdsZ9r%2FdUw7IYMKV15LxochkKgxM0%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;665&quot; height=&quot;157&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;public : + 같은 프로젝트 전체 다 됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;protected : # 같은 패키지에서 가능&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;+ 상속 관계의 호출 가능&lt;/b&gt;&lt;br /&gt;default : ~ (package-private) 같은 패키지에서만 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;private : - 같은 클래스 안에서만 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출처 : 인프런 &amp;lt;김영한의 실전 자바&amp;gt;&lt;/p&gt;</description>
      <category>CS IT지식</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/48</guid>
      <comments>https://kimpaul.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 12 Dec 2023 14:35:43 +0900</pubDate>
    </item>
    <item>
      <title>[java] static 메서드 사용법(주의점)</title>
      <link>https://kimpaul.tistory.com/47</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;static&lt;/span&gt; 메서드는 &lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;static&lt;/span&gt; 만 사용할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 내부의 기능을 사용할 때, 정적 메서드는 static 이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;반대로 모든 곳에서 static 을 호출할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static 을 호출할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무슨 말이냐하면 static 메서드는 static끼리만 사용가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static메서드에서 새로 만들어진 instance의 변수나 instance의 메서드의 사용은 불가능하다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 static을 붙인 순간 method 메모리의 static영역에 계속 떠있으므로 '접근제어자가 열려있다면!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디에서나 누구나 '클래스를 통해서' static 영역의 메서드나 필드에 접근이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUM0q/btsBQwg1Ctw/5sEy3MrksUBP4XkMLrKZPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUM0q/btsBQwg1Ctw/5sEy3MrksUBP4XkMLrKZPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUM0q/btsBQwg1Ctw/5sEy3MrksUBP4XkMLrKZPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUM0q%2FbtsBQwg1Ctw%2F5sEy3MrksUBP4XkMLrKZPk%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;1104&quot; height=&quot;440&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 DecoData의 내부를 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 필드 = staticValue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 메서드 = staticCall()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;staticCall()은 같은 static인 staticValue를 참조할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 힙영역의 instanceValue는 참조할수있는 참조값이 없으므로 참조가 불가능하다.(물론 외부에서 참조값이 파라미터로 들어온다면 가능은 하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙영역에서 DecoData의 인스턴스는 (클래스). 쩜!!!&amp;nbsp; .으로 static의 메서드와 필드를 불러올수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/47</guid>
      <comments>https://kimpaul.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 11 Dec 2023 23:52:37 +0900</pubDate>
    </item>
    <item>
      <title>[java] java는 항상 변수의 값을 복사해서 대입한다</title>
      <link>https://kimpaul.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9I5L/btsBucx06Vu/b2xl2kPQ9b3pnR8f6kqNKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9I5L/btsBucx06Vu/b2xl2kPQ9b3pnR8f6kqNKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9I5L/btsBucx06Vu/b2xl2kPQ9b3pnR8f6kqNKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9I5L%2FbtsBucx06Vu%2Fb2xl2kPQ9b3pnR8f6kqNKK%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;733&quot; height=&quot;73&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 값을 복사해서 넣는다는 말이 무슨말일까???&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 int num1 = 5라고 먼저 선언했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 int num2&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2pUdg/btsBucShSlM/SYOrIzXY6K4UBkyO0a2lW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2pUdg/btsBucShSlM/SYOrIzXY6K4UBkyO0a2lW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2pUdg/btsBucShSlM/SYOrIzXY6K4UBkyO0a2lW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2pUdg%2FbtsBucShSlM%2FSYOrIzXY6K4UBkyO0a2lW0%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;363&quot; height=&quot;65&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 num1의 값을 복사해서 num2에 넣었기때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;num1과 num2의 값은 아무 상관관계가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 num1은 5, num2는 10을 넣어준 마지막 코드때문에 num2 = 10이 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드를 보면 더 이해하기 쉬워진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qe31w/btsByaeBSWy/IxSrK6IiKPXVWbwkUOX0k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qe31w/btsByaeBSWy/IxSrK6IiKPXVWbwkUOX0k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qe31w/btsByaeBSWy/IxSrK6IiKPXVWbwkUOX0k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQe31w%2FbtsByaeBSWy%2FIxSrK6IiKPXVWbwkUOX0k0%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;638&quot; height=&quot;315&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. changeNumber 호출 전 , num1:&amp;nbsp; 5 이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. changeNumber 변경 전, num2는 changeNumber(num1)에서 받은 5값이 인수로 받아서 5가된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. changeNumber 변경 후, num2는 위에 코드 num2 = num2 * 2에서 파라미터 num2가 5로 받아서 왔기때문에 num2 =5*2가 되고 따라서 num2 = 10이 들어가서 10이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. changeNumber 호출 후, num1은 값만 복사해서 갔기때문에 num2와는 아무상관이없어서 원래의 num1값인 5가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4번에서 바로 java의 대원칙인&amp;nbsp; 'java는 항상 변수의 값을 복사해서 대입한다'가 성립된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩조각</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/46</guid>
      <comments>https://kimpaul.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 7 Dec 2023 11:03:35 +0900</pubDate>
    </item>
    <item>
      <title>[NAS] Synology Nas에서 http를 https 주소로 바꿔보자</title>
      <link>https://kimpaul.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 에 Container로 app server까지 띄우는데 성공!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 계속 uri를 http://ip:port로 접속해야해야했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https를 넣는 방법이 없을까 하고 찾아보는 와중에 다른 블로그를 참고하여 https로 바꾸는데 성공!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;a href=&quot;https://siane.tistory.com/328&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 : https://siane.tistory.com/328&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 nas의 DNS -&amp;gt; 제어판 -&amp;gt; 외부 액세스 -&amp;gt; 고급 탭에서 다음과 같이 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bttUhd/btsBq2vbNrF/kv7nzgVDY9IU7kTfW5nGKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bttUhd/btsBq2vbNrF/kv7nzgVDY9IU7kTfW5nGKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bttUhd/btsBq2vbNrF/kv7nzgVDY9IU7kTfW5nGKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbttUhd%2FbtsBq2vbNrF%2Fkv7nzgVDY9IU7kTfW5nGKK%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;566&quot; height=&quot;327&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 http가 쓰는 포트인 80과 https 포트인 443을 열어서 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 제어판 -&amp;gt; 로그인 포털 -&amp;gt; 고급탭에서 '역방향 프록시'로 들어간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOXIOD/btsBuglSVMn/ylXU78hOs6NkNuXgO3pq9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOXIOD/btsBuglSVMn/ylXU78hOs6NkNuXgO3pq9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOXIOD/btsBuglSVMn/ylXU78hOs6NkNuXgO3pq9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOXIOD%2FbtsBuglSVMn%2FylXU78hOs6NkNuXgO3pq9k%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;681&quot; height=&quot;338&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'생성' 버튼을 눌러 http주소를 https로 설정해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xOAmg/btsBtFMZSPG/OfFu3pknqXRtYOpjLkZ8k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xOAmg/btsBtFMZSPG/OfFu3pknqXRtYOpjLkZ8k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xOAmg/btsBtFMZSPG/OfFu3pknqXRtYOpjLkZ8k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxOAmg%2FbtsBtFMZSPG%2FOfFu3pknqXRtYOpjLkZ8k1%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;612&quot; height=&quot;406&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름에는 역방향 프록시 주소 이름을 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스의 프로토콜은 HTTPS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트이름은 알아서 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트는 아까 HTTPS에서 설정했던 '443' 포트 (사용자설정에 따라 다를수있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HSTS 활성화 버튼을 체크해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상의 프로토콜은 http주소를 가진 서버 정보를 입력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜은&amp;nbsp; HTTP, 호스트이름은 localhost, 포트는 해당 서버의 포트번호를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wz7dM/btsBxeU1LS4/tsR3j0O1DCqlDwKA33RVrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wz7dM/btsBxeU1LS4/tsR3j0O1DCqlDwKA33RVrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wz7dM/btsBxeU1LS4/tsR3j0O1DCqlDwKA33RVrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWz7dM%2FbtsBxeU1LS4%2FtsR3j0O1DCqlDwKA33RVrk%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;543&quot; height=&quot;505&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정해주면 소스 - 호스트이름에서 만든 https가 딸린 주소로 접속이 가능하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS IT지식</category>
      <author>밍튜</author>
      <guid isPermaLink="true">https://kimpaul.tistory.com/45</guid>
      <comments>https://kimpaul.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 6 Dec 2023 13:34:51 +0900</pubDate>
    </item>
  </channel>
</rss>