<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>U__q</title>
    <link>https://uque1013.tistory.com/</link>
    <description>유쾌한 코딩 생활</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 04:07:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>U__q</managingEditor>
    <image>
      <title>U__q</title>
      <url>https://tistory1.daumcdn.net/tistory/5301563/attach/f7dfea43ade04394ba920e52437c75d5</url>
      <link>https://uque1013.tistory.com</link>
    </image>
    <item>
      <title>[프로그래머스 | SQL] 평균 일일 대여 요금 구하기</title>
      <link>https://uque1013.tistory.com/66</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;CAR_RENTAL_COMPANY_CAR&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;테이블입니다.&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;CAR_RENTAL_COMPANY_CAR&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;테이블은 아래와 같은 구조로 되어있으며,&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;CAR_ID&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;CAR_TYPE&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;DAILY_FEE&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Column Name&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Type&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;CAR_ID&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;INTEGER&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;FALSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;CAR_TYPE&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;VARCHAR(255)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;FALSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;DAILY_FEE&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;INTEGER&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;FALSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;OPTIONS&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;VARCHAR(255)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;FALSE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt; CAR_RENTAL_COMPANY_CAR&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #dddddd;&quot;&gt;AVERAGE_FEE&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 지정해주세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;CAR_RENTAL_COMPANY_CAR&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;테이블이 다음과 같다면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.5814%;&quot;&gt;&lt;b&gt;CAR_ID&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.6046%;&quot;&gt;&lt;b&gt;CAR_TYPE&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.8373%;&quot;&gt;&lt;b&gt;DAILY_FEE&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.9767%;&quot;&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 10.5814%; height: 21px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 13.6046%; height: 21px;&quot;&gt;세단&lt;/td&gt;
&lt;td style=&quot;width: 18.8373%; height: 21px;&quot;&gt;16000&lt;/td&gt;
&lt;td style=&quot;width: 56.9767%; height: 21px;&quot;&gt;가죽시트, 열선시트, 후방카메라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 10.5814%; height: 21px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 13.6046%; height: 21px;&quot;&gt;SUV&lt;/td&gt;
&lt;td style=&quot;width: 18.8373%; height: 21px;&quot;&gt;14000&lt;/td&gt;
&lt;td style=&quot;width: 56.9767%; height: 21px;&quot;&gt;스마트키, 네비게이션, 열선시트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 10.5814%; height: 21px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 13.6046%; height: 21px;&quot;&gt;SUV&lt;/td&gt;
&lt;td style=&quot;width: 18.8373%; height: 21px;&quot;&gt;22000&lt;/td&gt;
&lt;td style=&quot;width: 56.9767%; height: 21px;&quot;&gt;주차감지센서, 후방카메라, 가죽시트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 16.5098%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&lt;b&gt; AVERAGE_FEE &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #263747; text-align: left;&quot;&gt;18000&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773563150715&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 값을 구하기 위해서 AVG(DAILY_FEE) 를 사용합니다. 평균 일일 대여 요금에서 소수 첫 번째 자리 반올림을 하기 위해서 ROUND(AVG(DAILLY_FEE), 0) 로 SELECT 하여서 평균 요금 소수 첫 번째 자리 반올림 한 결과를 보여주도록 합니다.&amp;nbsp;&lt;br /&gt;여기서 SELECT 하는 조건은 CAR_TYPE = 'SUV' 인 컬럼만 조회하기 위해서, WHERE 절에 CAR_TYPE = 'SUV'로 작성해줍니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스/SQL</category>
      <category>AVG</category>
      <category>Round</category>
      <category>select</category>
      <category>sql</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/66</guid>
      <comments>https://uque1013.tistory.com/66#entry66comment</comments>
      <pubDate>Sun, 15 Mar 2026 17:47:46 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] SQL NOT IN vs NOT EXISTS 차이 정리</title>
      <link>https://uque1013.tistory.com/65</link>
      <description>&lt;h2 data-end=&quot;456&quot; data-start=&quot;445&quot; data-section-id=&quot;17a9tms&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  NOT IN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;507&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NOT IN&lt;/b&gt;은 지정된 값 목록에 포함되지 않은 데이터를 조회할 때 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;554&quot; data-start=&quot;509&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;b&gt;부서 테이블에 존재하지 않는 직원&lt;/b&gt;을 조회한다고 가정해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773425253167&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP
WHERE DEPTNO NOT IN (
    SELECT DEPTNO
    FROM DEPT
);&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;EMP 테이블의 DEPTNO가 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DEPT 테이블의 DEPTNO 목록에 &lt;/span&gt;&lt;b&gt;존재하지 않는 경우&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;를 조회합니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;713&quot; data-start=&quot;711&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773425314568&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EMP.DEPTNO &amp;ne; DEPT.DEPTNO&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;765&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;인 데이터를 찾는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;765&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;787&quot; data-start=&quot;772&quot; data-section-id=&quot;15mg31f&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  NOT EXISTS&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;842&quot; data-start=&quot;789&quot; data-ke-size=&quot;size16&quot;&gt;NOT EXISTS는 &lt;b&gt;서브쿼리 결과가 존재하지 않을 때 TRUE가 되는 조건문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;879&quot; data-start=&quot;844&quot; data-ke-size=&quot;size16&quot;&gt;같은 예제를 NOT EXISTS로 작성하면 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773425342814&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP A
WHERE NOT EXISTS (
    SELECT 1
    FROM DEPT B
    WHERE A.DEPTNO = B.DEPTNO
);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;EMP 테이블의 DEPTNO와 같은 값이 DEPT 테이블에 &lt;b&gt;존재하지 않는 경우&lt;/b&gt; 결과에 포함됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1091&quot; data-start=&quot;1063&quot; data-section-id=&quot;120a7zc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  NOT IN vs NOT EXISTS 차이&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1144&quot; data-start=&quot;1093&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NOT IN&lt;/b&gt;과 &lt;b&gt;NOT EXISTS&lt;/b&gt;의 가장 큰 차이는 &lt;b&gt;NULL 처리 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1187&quot; data-start=&quot;1146&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 DEPT 테이블에 다음과 같은 데이터가 있다고 가정해보겠습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;DEPTNO&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1231&quot; data-start=&quot;1189&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1231&quot; data-start=&quot;1209&quot;&gt;
&lt;tr data-end=&quot;1215&quot; data-start=&quot;1209&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1215&quot; data-start=&quot;1209&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1222&quot; data-start=&quot;1216&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1222&quot; data-start=&quot;1216&quot;&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1231&quot; data-start=&quot;1223&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1231&quot; data-start=&quot;1223&quot;&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1249&quot; data-start=&quot;1233&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 다음 쿼리를 실행하면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773425414324&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP
WHERE DEPTNO NOT IN (
    SELECT DEPTNO
    FROM DEPT
);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1363&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;조회 결과가 나오지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1365&quot; data-ke-size=&quot;size16&quot;&gt;SQL에서&amp;nbsp;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; background-color: #dddddd;&quot;&gt;값 != NULL&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1365&quot; data-ke-size=&quot;size16&quot;&gt;비교 결과는 TRUE도 FALSE도 아닌 &lt;b&gt;UNKNOWN&lt;/b&gt;이 되기 때문입니다.&lt;/p&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1365&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 NOT EXISTS는 NULL의 영향을 받지 않습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773425494823&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP A
WHERE NOT EXISTS (
SELECT 1
FROM DEPT B
WHERE A.DEPTNO = B.DEPTNO
);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1618&quot; data-start=&quot;1593&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 정상적으로 결과가 조회됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1618&quot; data-start=&quot;1593&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1635&quot; data-start=&quot;1625&quot; data-section-id=&quot;csjdwe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  성능 차이&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1688&quot; data-start=&quot;1637&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 &lt;b&gt;NOT EXISTS&lt;/b&gt;가 &lt;b&gt;NOT IN&lt;/b&gt;보다 &lt;b&gt;&lt;u&gt;더 안정적인 성능&lt;/u&gt;&lt;/b&gt;을 보입니다.&lt;/p&gt;
&lt;p data-end=&quot;1705&quot; data-start=&quot;1690&quot; data-ke-size=&quot;size16&quot;&gt;그 이유는 다음과 같습니다.&lt;/p&gt;
&lt;p data-end=&quot;1717&quot; data-start=&quot;1707&quot; data-section-id=&quot;h6kbtg&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NOT IN: &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;서브쿼리 결과 전체와 비교&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1757&quot; data-start=&quot;1743&quot; data-section-id=&quot;1oar7cj&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NOT EXISTS: &lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;조건을 만족하는 데이터가 발견되면 즉시 탐색 종료&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1844&quot; data-start=&quot;1796&quot; data-ke-size=&quot;size16&quot;&gt;따라서,&amp;nbsp; &lt;b&gt;데이터가 많을수록 NOT EXISTS가 더 효율적인 경우가 많습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1858&quot; data-start=&quot;1851&quot; data-section-id=&quot;9k0s0f&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1858&quot; data-start=&quot;1851&quot; data-section-id=&quot;9k0s0f&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  정리&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-end=&quot;2006&quot; data-start=&quot;1860&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;NOT IN&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;NOT EXISTS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1933&quot; data-start=&quot;1903&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1911&quot; data-start=&quot;1903&quot;&gt;비교 방식&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1921&quot; data-start=&quot;1911&quot; data-col-size=&quot;sm&quot;&gt;값 목록 비교&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1933&quot; data-start=&quot;1921&quot; data-col-size=&quot;sm&quot;&gt;존재 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1955&quot; data-start=&quot;1934&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1944&quot; data-start=&quot;1934&quot;&gt;NULL 영향&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1949&quot; data-start=&quot;1944&quot; data-col-size=&quot;sm&quot;&gt;있음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1955&quot; data-start=&quot;1949&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1982&quot; data-start=&quot;1956&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1961&quot; data-start=&quot;1956&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1971&quot; data-start=&quot;1961&quot;&gt;느릴 수 있음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1982&quot; data-start=&quot;1971&quot; data-col-size=&quot;sm&quot;&gt;비교적 안정적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2006&quot; data-start=&quot;1983&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1991&quot; data-start=&quot;1983&quot;&gt;실무 사용&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1997&quot; data-start=&quot;1991&quot; data-col-size=&quot;sm&quot;&gt;제한적&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2006&quot; data-start=&quot;1997&quot; data-col-size=&quot;sm&quot;&gt;많이 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>SQL</category>
      <category>DB</category>
      <category>NOT EXISTS</category>
      <category>NOT IN</category>
      <category>Query</category>
      <category>sql</category>
      <category>Table</category>
      <category>데이터베이스</category>
      <category>서브쿼리</category>
      <category>쿼리</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/65</guid>
      <comments>https://uque1013.tistory.com/65#entry65comment</comments>
      <pubDate>Sat, 14 Mar 2026 03:14:50 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] SQL JOIN 완전 정리 (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)</title>
      <link>https://uque1013.tistory.com/64</link>
      <description>&lt;h2 data-end=&quot;201&quot; data-start=&quot;129&quot; data-section-id=&quot;1h3f0ip&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  SQL JOIN 완전 정리 (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;256&quot; data-start=&quot;203&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 사용하다 보면 여러 테이블의 데이터를 함께 조회해야 하는 경우가 많습니다.&lt;/p&gt;
&lt;p data-end=&quot;256&quot; data-start=&quot;203&quot; data-ke-size=&quot;size16&quot;&gt;이때 사용하는 것이 바로 JOIN입니다.&lt;/p&gt;
&lt;p data-end=&quot;337&quot; data-start=&quot;286&quot; data-ke-size=&quot;size16&quot;&gt;JOIN은 두 개 이상의 테이블을 연결하여 하나의 결과로 조회하는 SQL 문법입니다.&lt;/p&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;339&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 SQL에서 자주 사용하는 &lt;b&gt;JOIN 종류&lt;/b&gt;와 &lt;b&gt;사용 방법&lt;/b&gt;을 정리해 보겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;387&quot; data-start=&quot;339&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;411&quot; data-start=&quot;394&quot; data-section-id=&quot;1c3y2hk&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  JOIN이 필요한 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 테이블이 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;463&quot; data-start=&quot;447&quot; data-section-id=&quot;15j9ab3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EMP (사원 테이블)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 85px;&quot; border=&quot;1&quot; data-end=&quot;579&quot; data-start=&quot;465&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;EMPNO&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;ENAME&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;DEPTNO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot; data-end=&quot;536&quot; data-start=&quot;515&quot;&gt;
&lt;td style=&quot;height: 17px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;522&quot; data-start=&quot;515&quot;&gt;7369&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;530&quot; data-start=&quot;522&quot; data-col-size=&quot;sm&quot;&gt;SMITH&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;536&quot; data-start=&quot;530&quot; data-col-size=&quot;sm&quot;&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot; data-end=&quot;558&quot; data-start=&quot;537&quot;&gt;
&lt;td style=&quot;height: 17px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;544&quot; data-start=&quot;537&quot;&gt;7499&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;552&quot; data-start=&quot;544&quot; data-col-size=&quot;sm&quot;&gt;ALLEN&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;558&quot; data-start=&quot;552&quot; data-col-size=&quot;sm&quot;&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot; data-end=&quot;579&quot; data-start=&quot;559&quot;&gt;
&lt;td style=&quot;height: 17px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;566&quot; data-start=&quot;559&quot;&gt;7521&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;573&quot; data-start=&quot;566&quot; data-col-size=&quot;sm&quot;&gt;WARD&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot; data-end=&quot;579&quot; data-start=&quot;573&quot; data-col-size=&quot;sm&quot;&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;b&gt;&lt;/b&gt;&lt;/div&gt;
&lt;p data-end=&quot;598&quot; data-start=&quot;581&quot; data-section-id=&quot;11rzwgi&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DEPT (부서 테이블)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;687&quot; data-start=&quot;600&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DEPTNO&lt;/td&gt;
&lt;td&gt;DNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;654&quot; data-start=&quot;635&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;640&quot; data-start=&quot;635&quot;&gt;10&lt;/td&gt;
&lt;td data-end=&quot;654&quot; data-start=&quot;640&quot; data-col-size=&quot;sm&quot;&gt;ACCOUNTING&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;672&quot; data-start=&quot;655&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;660&quot; data-start=&quot;655&quot;&gt;20&lt;/td&gt;
&lt;td data-end=&quot;672&quot; data-start=&quot;660&quot; data-col-size=&quot;sm&quot;&gt;RESEARCH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;687&quot; data-start=&quot;673&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;678&quot; data-start=&quot;673&quot;&gt;30&lt;/td&gt;
&lt;td data-end=&quot;687&quot; data-start=&quot;678&quot; data-col-size=&quot;sm&quot;&gt;SALES&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;751&quot; data-start=&quot;689&quot; data-ke-size=&quot;size16&quot;&gt;사원의 이름과 &lt;b&gt;부서 이름을 함께 조회하려면&lt;/b&gt;&lt;br /&gt;EMP 테이블과 DEPT 테이블을 &lt;b&gt;연결해야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;801&quot; data-start=&quot;753&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;b&gt;여러 테이블을 연결하여 데이터를 조회할 때 사용하는 것이 JOIN입니다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;801&quot; data-start=&quot;753&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;823&quot; data-start=&quot;808&quot; data-section-id=&quot;u3v9re&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  INNER JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;879&quot; data-start=&quot;825&quot; data-ke-size=&quot;size16&quot;&gt;INNER JOIN은 &lt;b&gt;두 테이블에서 조건이 일치하는 데이터만 조회하는 JOIN 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773072143719&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.ENAME, D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px;&quot;&gt;특징&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1036&quot; data-start=&quot;984&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1009&quot; data-start=&quot;984&quot; data-section-id=&quot;ae7yjk&quot;&gt;두 테이블에서 &lt;b&gt;공통된 데이터만 조회&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1036&quot; data-start=&quot;1010&quot; data-section-id=&quot;d94oe9&quot;&gt;가장 기본적으로 많이 사용하는 JOIN 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1057&quot; data-start=&quot;1043&quot; data-section-id=&quot;1yeh2en&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1057&quot; data-start=&quot;1043&quot; data-section-id=&quot;1yeh2en&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  LEFT JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1125&quot; data-start=&quot;1059&quot; data-ke-size=&quot;size16&quot;&gt;LEFT JOIN은 &lt;b&gt;왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 일치하는 데이터를 조회하는 JOIN 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1159&quot; data-start=&quot;1127&quot; data-ke-size=&quot;size16&quot;&gt;일치하는 데이터가 없는 경우 &lt;b&gt;NULL&lt;/b&gt;이 표시됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773072205956&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.ENAME, D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1261&quot; data-start=&quot;1255&quot; data-section-id=&quot;1hrlj9m&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1306&quot; data-start=&quot;1263&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1277&quot; data-start=&quot;1263&quot; data-section-id=&quot;16fcrqh&quot;&gt;왼쪽 테이블 기준 조회&lt;/li&gt;
&lt;li data-end=&quot;1306&quot; data-start=&quot;1278&quot; data-section-id=&quot;1xc7rzo&quot;&gt;오른쪽 테이블에 데이터가 없으면 &lt;b&gt;NULL&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1328&quot; data-start=&quot;1313&quot; data-section-id=&quot;1xaf5h0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  RIGHT JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1397&quot; data-start=&quot;1330&quot; data-ke-size=&quot;size16&quot;&gt;RIGHT JOIN은 &lt;b&gt;오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 일치하는 데이터를 조회하는 JOIN 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773072239760&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.ENAME, D.DNAME
FROM EMP E
RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1500&quot; data-start=&quot;1494&quot; data-section-id=&quot;1hrlj9m&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1545&quot; data-start=&quot;1502&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1517&quot; data-start=&quot;1502&quot; data-section-id=&quot;vyc3bd&quot;&gt;오른쪽 테이블 기준 조회&lt;/li&gt;
&lt;li data-end=&quot;1545&quot; data-start=&quot;1518&quot; data-section-id=&quot;1n2czys&quot;&gt;왼쪽 테이블에 데이터가 없으면 &lt;b&gt;NULL&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1572&quot; data-start=&quot;1552&quot; data-section-id=&quot;r2xa9q&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  FULL OUTER JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1626&quot; data-start=&quot;1574&quot; data-ke-size=&quot;size16&quot;&gt;FULL OUTER JOIN은 &lt;b&gt;두 테이블의 모든 데이터를 조회하는 JOIN 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1661&quot; data-start=&quot;1628&quot; data-ke-size=&quot;size16&quot;&gt;조건이 일치하지 않는 데이터는 &lt;b&gt;NULL&lt;/b&gt;로 표시됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773072257000&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.ENAME, D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1769&quot; data-start=&quot;1763&quot; data-section-id=&quot;1hrlj9m&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1818&quot; data-start=&quot;1771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1798&quot; data-start=&quot;1771&quot; data-section-id=&quot;6k18c4&quot;&gt;LEFT JOIN + RIGHT JOIN 결과&lt;/li&gt;
&lt;li data-end=&quot;1818&quot; data-start=&quot;1799&quot; data-section-id=&quot;1rauu8g&quot;&gt;양쪽 테이블의 모든 데이터 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1840&quot; data-start=&quot;1825&quot; data-section-id=&quot;154rofe&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  CROSS JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1891&quot; data-start=&quot;1842&quot; data-ke-size=&quot;size16&quot;&gt;CROSS JOIN은 &lt;b&gt;두 테이블의 모든 경우의 수를 조합하는 JOIN 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1898&quot; data-start=&quot;1893&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1938&quot; data-start=&quot;1900&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1918&quot; data-start=&quot;1900&quot; data-section-id=&quot;1bz8vgd&quot;&gt;EMP 테이블 : 3개 데이터&lt;/li&gt;
&lt;li data-end=&quot;1938&quot; data-start=&quot;1919&quot; data-section-id=&quot;1al7zhc&quot;&gt;DEPT 테이블 : 3개 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1968&quot; data-start=&quot;1940&quot; data-ke-size=&quot;size16&quot;&gt;이라면 결과는 &lt;b&gt;3 &amp;times; 3 = 9개&lt;/b&gt;가 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773072275098&quot; class=&quot;sql&quot; style=&quot;letter-spacing: 0px;&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP
CROSS JOIN DEPT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2042&quot; data-start=&quot;2028&quot; data-section-id=&quot;tl6i7c&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  SELF JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2088&quot; data-start=&quot;2044&quot; data-ke-size=&quot;size16&quot;&gt;SELF JOIN은 &lt;b&gt;하나의 테이블을 자기 자신과 JOIN하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;2121&quot; data-start=&quot;2090&quot; data-ke-size=&quot;size16&quot;&gt;주로 &lt;b&gt;직원과 관리자 관계&lt;/b&gt;를 조회할 때 사용됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773072303144&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT A.ENAME AS 직원,
B.ENAME AS 관리자
FROM EMP A
JOIN EMP B
ON A.MGR = B.EMPNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2261&quot; data-start=&quot;2232&quot; data-section-id=&quot;vzdr00&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  ANSI JOIN vs Oracle JOIN&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2291&quot; data-start=&quot;2263&quot; data-ke-size=&quot;size16&quot;&gt;JOIN에는 &lt;b&gt;두 가지 문법 방식&lt;/b&gt;이 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2315&quot; data-start=&quot;2293&quot; data-section-id=&quot;1yis4ma&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ANSI JOIN (표준 SQL)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773072384932&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2397&quot; data-start=&quot;2382&quot; data-section-id=&quot;1n1vxu&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Oracle JOIN&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773072390435&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2470&quot; data-start=&quot;2463&quot; data-section-id=&quot;1xnsnd6&quot; data-ke-size=&quot;size23&quot;&gt;차이점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2528&quot; data-start=&quot;2472&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2495&quot; data-start=&quot;2472&quot; data-section-id=&quot;1uosnor&quot;&gt;ANSI JOIN &amp;rarr; SQL 표준 방식&lt;/li&gt;
&lt;li data-end=&quot;2528&quot; data-start=&quot;2496&quot; data-section-id=&quot;bz2sax&quot;&gt;Oracle JOIN &amp;rarr; Oracle에서 사용되는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2558&quot; data-start=&quot;2530&quot; data-ke-size=&quot;size16&quot;&gt;현재는 &lt;b&gt;ANSI JOIN 사용이 권장됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2558&quot; data-start=&quot;2530&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2577&quot; data-start=&quot;2565&quot; data-section-id=&quot;hgrggd&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  JOIN 정리&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;JOIN 종류설명&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2775&quot; data-start=&quot;2579&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2775&quot; data-start=&quot;2606&quot;&gt;
&lt;tr data-end=&quot;2632&quot; data-start=&quot;2606&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2619&quot; data-start=&quot;2606&quot;&gt;INNER JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2632&quot; data-start=&quot;2619&quot;&gt;공통 데이터 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2658&quot; data-start=&quot;2633&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2645&quot; data-start=&quot;2633&quot;&gt;LEFT JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2658&quot; data-start=&quot;2645&quot;&gt;왼쪽 테이블 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2686&quot; data-start=&quot;2659&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2672&quot; data-start=&quot;2659&quot;&gt;RIGHT JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2686&quot; data-start=&quot;2672&quot;&gt;오른쪽 테이블 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2721&quot; data-start=&quot;2687&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2705&quot; data-start=&quot;2687&quot;&gt;FULL OUTER JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2721&quot; data-start=&quot;2705&quot;&gt;양쪽 테이블 모두 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2747&quot; data-start=&quot;2722&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2735&quot; data-start=&quot;2722&quot;&gt;CROSS JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2747&quot; data-start=&quot;2735&quot;&gt;모든 조합 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2775&quot; data-start=&quot;2748&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2760&quot; data-start=&quot;2748&quot;&gt;SELF JOIN&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2775&quot; data-start=&quot;2760&quot;&gt;자기 자신과 JOIN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2790&quot; data-start=&quot;2782&quot; data-section-id=&quot;v0gime&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2837&quot; data-start=&quot;2792&quot; data-ke-size=&quot;size16&quot;&gt;JOIN은 데이터베이스에서 가장 많이 사용되는 SQL 문법 중 하나입니다.&lt;/p&gt;
&lt;p data-end=&quot;2869&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size16&quot;&gt;특히 실무에서는 다음 JOIN이 가장 많이 사용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2903&quot; data-start=&quot;2871&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2887&quot; data-start=&quot;2871&quot; data-section-id=&quot;1txof2s&quot;&gt;&lt;b&gt;INNER JOIN&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2903&quot; data-start=&quot;2888&quot; data-section-id=&quot;18yaaq9&quot;&gt;&lt;b&gt;LEFT JOIN&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2955&quot; data-start=&quot;2905&quot; data-ke-size=&quot;size16&quot;&gt;JOIN을 정확하게 이해하면 여러 테이블의 데이터를 효율적으로 조회할 수 있습니다 !&lt;/p&gt;</description>
      <category>SQL/Join</category>
      <category>cross join</category>
      <category>full outer join</category>
      <category>INNER JOIN</category>
      <category>join</category>
      <category>LEFT JOIN</category>
      <category>RIGHT JOIN</category>
      <category>self join</category>
      <category>sql</category>
      <category>Table</category>
      <category>쿼리</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/64</guid>
      <comments>https://uque1013.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 10 Mar 2026 01:08:56 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 클라이언트 실제 IP 가져오기 (X-Forwarded-For)</title>
      <link>https://uque1013.tistory.com/63</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;b&gt;[Spring] 클라이언트 실제 IP 가져오기 (X-Forwarded-For)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;178&quot; data-start=&quot;130&quot; data-ke-size=&quot;size16&quot;&gt;웹 서비스를 개발하다 보면 &lt;b&gt;사용자의 실제 IP를 저장해야 하는 경우&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;185&quot; data-start=&quot;180&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;222&quot; data-start=&quot;187&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;198&quot; data-start=&quot;187&quot; data-section-id=&quot;1qrmwf0&quot;&gt;로그인 기록 저장&lt;/li&gt;
&lt;li data-end=&quot;210&quot; data-start=&quot;199&quot; data-section-id=&quot;xsfzj0&quot;&gt;사용자 활동 로그&lt;/li&gt;
&lt;li data-end=&quot;222&quot; data-start=&quot;211&quot; data-section-id=&quot;i3n0uk&quot;&gt;관리자 감사 로그&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;355&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot에서는 HttpServletRequest를 통해 IP를 조회할 수 있지만&lt;br /&gt;단순히 request.getRemoteAddr()만 사용하면 &lt;b&gt;실제 사용자 IP가 아닌 서버 IP가 조회되는 경우&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;357&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;Spring Boot에서 실제 클라이언트 IP를 가져오는 방법&lt;/b&gt;을 정리해보겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;357&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;437&quot; data-start=&quot;421&quot; data-section-id=&quot;16axf60&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 기본 IP 조회 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;502&quot; data-start=&quot;439&quot; data-ke-size=&quot;size16&quot;&gt;가장 기본적인 방법은 HttpServletRequest의 getRemoteAddr()을 사용하는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773022000435&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String getClientIp(HttpServletRequest request) {
	return request.getRemoteAddr();
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 이 방법에는 문제가 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;653&quot; data-start=&quot;633&quot; data-ke-size=&quot;size16&quot;&gt;서버 구조가 다음과 같은 경우입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022015847&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Client &amp;rarr; Load Balancer &amp;rarr; Server&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;752&quot; data-start=&quot;696&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 getRemoteAddr()은 &lt;b&gt;Load Balancer의 IP&lt;/b&gt;를 반환하게 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;실제 사용자 IP가 아닐 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;815&quot; data-start=&quot;789&quot; data-section-id=&quot;wsv5tq&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. X-Forwarded-For 헤더 확인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;892&quot; data-start=&quot;817&quot; data-ke-size=&quot;size16&quot;&gt;프록시 서버나 로드밸런서를 사용하는 환경에서는&lt;br /&gt;실제 클라이언트 IP를 &lt;b&gt;X-Forwarded-For 헤더에 담아서 전달&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;896&quot; data-start=&quot;894&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1773021975879&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X-Forwarded-For: 203.0.113.195&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;따라서 다음과 같이 헤더를 확인하는 방식으로 구현할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1773021932561&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public String getClientIp(HttpServletRequest request) {
    String ip = request.getHeader(&quot;X-Forwarded-For&quot;);

    // 1. X-Forwarded-For 헤더 처리
    if (ip != null &amp;amp;&amp;amp; ip.length() != 0 &amp;amp;&amp;amp; !&quot;unknown&quot;.equalsIgnoreCase(ip)) {
        // 여러 IP가 있을 경우 첫 번째 IP를 선택하고 공백 제거(.trim())
        if (ip.contains(&quot;,&quot;)) {
            return ip.split(&quot;,&quot;)[0].trim();
        }
        return ip;
    }

    // 2. 다른 프록시 헤더 확인 (순차적)
    if (ip == null || ip.length() == 0 || &quot;unknown&quot;.equalsIgnoreCase(ip)) {
        ip = request.getHeader(&quot;Proxy-Client-IP&quot;);
    }

    if (ip == null || ip.length() == 0 || &quot;unknown&quot;.equalsIgnoreCase(ip)) {
        ip = request.getHeader(&quot;WL-Proxy-Client-IP&quot;);
    }

    // 3. 모든 헤더에 없으면 최종적으로 RemoteAddr 확인
    if (ip == null || ip.length() == 0 || &quot;unknown&quot;.equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }

    return ip;
}&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1534&quot; data-start=&quot;1515&quot; data-section-id=&quot;8rxnu3&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 여러 IP가 전달되는 경우&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1578&quot; data-start=&quot;1536&quot; data-ke-size=&quot;size16&quot;&gt;X-Forwarded-For에는 여러 개의 IP가 들어올 수도 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1582&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022027437&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X-Forwarded-For: clientIP, proxy1, proxy2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1668&quot; data-start=&quot;1635&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 &lt;b&gt;첫 번째 IP가 실제 클라이언트 IP&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;1688&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 처리할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773022040654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String getClientIp(HttpServletRequest request) {

    String ip = request.getHeader(&quot;X-Forwarded-For&quot;);

    if (ip != null &amp;amp;&amp;amp; ip.contains(&quot;,&quot;)) {
    	ip = ip.split(&quot;,&quot;)[0];
    }

    if (ip == null || ip.length() == 0 || &quot;unknown&quot;.equalsIgnoreCase(ip)) {
    	ip = request.getRemoteAddr();
    }

    return ip;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;2048&quot; data-start=&quot;2038&quot; data-section-id=&quot;1xxsnh&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 사용 예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2091&quot; data-start=&quot;2050&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자 수정 로그를 저장할 때 IP를 함께 기록할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1773022065105&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String clientIp = getClientIp(request);

user.setModIp(clientIp);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2190&quot; data-start=&quot;2172&quot; data-ke-size=&quot;size16&quot;&gt;DB에는 다음과 같이 저장됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022073025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mod_ip = 203.0.113.195&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;2242&quot; data-start=&quot;2229&quot; data-section-id=&quot;62rinc&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 실행 결과 예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2276&quot; data-start=&quot;2244&quot; data-ke-size=&quot;size16&quot;&gt;실제로 로그를 출력해보면 다음과 같이 확인할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022124245&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[User Update Log]

user_id : admin
mod_ip : 203.0.113.195&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2376&quot; data-start=&quot;2346&quot; data-ke-size=&quot;size16&quot;&gt;또는 콘솔 로그에서 다음과 같이 확인할 수도 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022135635&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(&quot;Client IP : &quot; + clientIp);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2443&quot; data-start=&quot;2438&quot; data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773022145870&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Client IP : 203.0.113.195&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;2489&quot; data-start=&quot;2485&quot; data-section-id=&quot;yim43j&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2533&quot; data-start=&quot;2491&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot에서 클라이언트 IP를 조회하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2632&quot; data-start=&quot;2535&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2568&quot; data-start=&quot;2535&quot; data-section-id=&quot;1lzzk1s&quot;&gt;request.getRemoteAddr() 사용&lt;/li&gt;
&lt;li data-end=&quot;2604&quot; data-start=&quot;2569&quot; data-section-id=&quot;g98lxx&quot;&gt;프록시 환경에서는 X-Forwarded-For 확인&lt;/li&gt;
&lt;li data-end=&quot;2632&quot; data-start=&quot;2605&quot; data-section-id=&quot;frv3f0&quot;&gt;여러 IP가 있을 경우 첫 번째 값 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2719&quot; data-start=&quot;2634&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스 환경에서는 &lt;b&gt;프록시나 로드밸런서를 사용하는 경우가 많기 때문에&lt;br /&gt;X-Forwarded-For 헤더를 함께 확인하는 방식이 필요합니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Java/Spring</category>
      <category>ip</category>
      <category>ip 가져오기</category>
      <category>Java</category>
      <category>spring</category>
      <category>Spring ip</category>
      <category>springboot</category>
      <category>x-forwarded-for</category>
      <category>클라이언트 ip 가져오기</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/63</guid>
      <comments>https://uque1013.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 9 Mar 2026 11:10:44 +0900</pubDate>
    </item>
    <item>
      <title>[Git] Git 설치하기 (Mac OS)</title>
      <link>https://uque1013.tistory.com/62</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;114&quot; data-end=&quot;145&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  Mac OS Git 설치 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #222222; text-align: start;&quot;&gt;Mac OS에 Git 설치 방법에 대해서 정리해보겠습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #222222; text-align: start;&quot;&gt; &lt;/span&gt; Git 공식 사이트 접속&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://git-scm.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://git-scm.com/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770393984895&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Git&quot; data-og-description=&quot;&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/&quot; data-og-url=&quot;https://git-scm.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fOI0M/dJMb83kouvZ/mt5ug5z8sKLUOyPCbSlBF0/img.png?width=778&amp;amp;height=502&amp;amp;face=0_0_778_502&quot;&gt;&lt;a href=&quot;https://git-scm.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fOI0M/dJMb83kouvZ/mt5ug5z8sKLUOyPCbSlBF0/img.png?width=778&amp;amp;height=502&amp;amp;face=0_0_778_502');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Git&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 하단에 표기한 &lt;b&gt;[Install for Mac]&lt;/b&gt; 부분 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBDxf/dJMcagEp50N/x5DDPAdwuETNe4L2nwDbw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBDxf/dJMcagEp50N/x5DDPAdwuETNe4L2nwDbw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBDxf/dJMcagEp50N/x5DDPAdwuETNe4L2nwDbw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBDxf%2FdJMcagEp50N%2Fx5DDPAdwuETNe4L2nwDbw1%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;439&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;homebrew가 설치 되지 않은 경우,&lt;b&gt; [homebrew] &lt;/b&gt;클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTsT3k/dJMcac9MyIL/300bxK309zopNShkPpJNVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTsT3k/dJMcac9MyIL/300bxK309zopNShkPpJNVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTsT3k/dJMcac9MyIL/300bxK309zopNShkPpJNVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTsT3k%2FdJMcac9MyIL%2F300bxK309zopNShkPpJNVK%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;532&quot; height=&quot;308&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;homebrew는 Mac 전용 패키지 관리자로, 설치 및 업데이트가 간단하며 시스템 파일을 건들이지 않고 별도의 경로로 설치되어서 안전합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하단에 표기한 homebrew 명령어 복사&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zUXIg/dJMcahJ6dga/DnW0kbUWCJs8Q1h7f857Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zUXIg/dJMcahJ6dga/DnW0kbUWCJs8Q1h7f857Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zUXIg/dJMcahJ6dga/DnW0kbUWCJs8Q1h7f857Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzUXIg%2FdJMcahJ6dga%2FDnW0kbUWCJs8Q1h7f857Ak%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;703&quot; height=&quot;341&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1770460146403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;터미널 접속 후, 해당 명령어 입력&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6wzr7/dJMcadOnWYX/fSK3k6pw0Hjh1bRmlJKKi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6wzr7/dJMcadOnWYX/fSK3k6pw0Hjh1bRmlJKKi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6wzr7/dJMcadOnWYX/fSK3k6pw0Hjh1bRmlJKKi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6wzr7%2FdJMcadOnWYX%2FfSK3k6pw0Hjh1bRmlJKKi1%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;672&quot; height=&quot;116&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size16&quot;&gt;맥북 password 입력&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size16&quot;&gt;설치 완료 시, 해당 명령어를 입력하여서 정상적으로 설치&lt;span style=&quot;color: #333333;&quot;&gt;가 완료되었는지 확인해줍니&lt;/span&gt;다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbePvM/dJMcaac7PqE/cpeTfUUrszjAZuPKbvvKFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbePvM/dJMcaac7PqE/cpeTfUUrszjAZuPKbvvKFK/img.png&quot; data-alt=&quot;정상적으로 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbePvM/dJMcaac7PqE/cpeTfUUrszjAZuPKbvvKFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbePvM%2FdJMcaac7PqE%2FcpeTfUUrszjAZuPKbvvKFK%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;234&quot; height=&quot;34&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적으로 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1770466034969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew --version&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  Mac OS Git 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #222222; text-align: start;&quot;&gt;이미 homebrew가 설치되어 있는 경우, 아래의 명령어 복사 후, 터미널에 입력&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCl2d/dJMcacWk61n/TgMQyEKMi3pCkt9jIvUnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCl2d/dJMcacWk61n/TgMQyEKMi3pCkt9jIvUnlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCl2d/dJMcacWk61n/TgMQyEKMi3pCkt9jIvUnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCl2d%2FdJMcacWk61n%2FTgMQyEKMi3pCkt9jIvUnlK%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;440&quot; height=&quot;284&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;766&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;pre id=&quot;code_1771168218236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYu1B/dJMcahi5Ki5/kaNkFnMvNKxZ2Cn3QKsNr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYu1B/dJMcahi5Ki5/kaNkFnMvNKxZ2Cn3QKsNr1/img.png&quot; data-alt=&quot;Git 설치 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYu1B/dJMcahi5Ki5/kaNkFnMvNKxZ2Cn3QKsNr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYu1B%2FdJMcahi5Ki5%2FkaNkFnMvNKxZ2Cn3QKsNr1%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;457&quot; height=&quot;291&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Git 설치 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Git 설치 완료 시, 해당 명령어를 입력하여서 정상적으로 설치가 완료되었는지 확인해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOgOSl/dJMcahXFwRt/DYZ5niVZa5jqwwokUP8KEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOgOSl/dJMcahXFwRt/DYZ5niVZa5jqwwokUP8KEK/img.png&quot; data-alt=&quot;정상적으로 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOgOSl/dJMcahXFwRt/DYZ5niVZa5jqwwokUP8KEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOgOSl%2FdJMcahXFwRt%2FDYZ5niVZa5jqwwokUP8KEK%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;441&quot; height=&quot;25&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적으로 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1771169315676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>Git</category>
      <category>git설치</category>
      <category>Mac</category>
      <category>Mac OS</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/62</guid>
      <comments>https://uque1013.tistory.com/62#entry62comment</comments>
      <pubDate>Mon, 16 Feb 2026 00:30:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 카카오 지도 / Kakao Map Api 사용하기</title>
      <link>https://uque1013.tistory.com/61</link>
      <description>&lt;h2 data-end=&quot;145&quot; data-start=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  카카오 지도 API 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;281&quot; data-start=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;웹 서비스나 블로그에서 지도를 표시해야 할 때, 사용할 수 있는 &lt;b&gt;카카오 지도 API&lt;/b&gt;를 처음 사용하는 분들도 이해할 수 있도록 기본 사용 방법을 정리해보겠습니다.&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;281&quot; data-start=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  카카오 맵 API KEY 발급 하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 아래의 사이트에 접속해서 카카오 맵 api key를 발급 받아줘야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://apis.map.kakao.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apis.map.kakao.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;하단에 표기한 &lt;b&gt;[API KEY 발급]&lt;/b&gt; 부분 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;907&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ptCRt/dJMcagc9A8j/FokmEUFu3736kmKwEkBoKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ptCRt/dJMcagc9A8j/FokmEUFu3736kmKwEkBoKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ptCRt/dJMcagc9A8j/FokmEUFu3736kmKwEkBoKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FptCRt%2FdJMcagc9A8j%2FFokmEUFu3736kmKwEkBoKk%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;699&quot; height=&quot;907&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;907&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;로그인 후, [앱 생성] 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2czCH/dJMcabv8WGN/kcV84APC4chcegHjmAmXgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2czCH/dJMcabv8WGN/kcV84APC4chcegHjmAmXgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2czCH/dJMcabv8WGN/kcV84APC4chcegHjmAmXgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2czCH%2FdJMcabv8WGN%2FkcV84APC4chcegHjmAmXgK%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;401&quot; height=&quot;204&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개인적인 공부 목적의 경우, &lt;b&gt;앱 이름: 프로젝트명&lt;/b&gt; / &lt;b&gt;회사명: 본인 이름 &lt;/b&gt;또는 &lt;b&gt;닉네임&lt;/b&gt;을 사용하시는 걸 추천드립니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tczgL/dJMcaaDZ0Kv/6Z2169XUS34IJEh13mvEhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tczgL/dJMcaaDZ0Kv/6Z2169XUS34IJEh13mvEhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tczgL/dJMcaaDZ0Kv/6Z2169XUS34IJEh13mvEhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtczgL%2FdJMcaaDZ0Kv%2F6Z2169XUS34IJEh13mvEhK%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;627&quot; height=&quot;719&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;앱 생성 완료 후, 앱을 클릭하여서 설정 페이지에 들어가줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;앱 &amp;gt; 플랫폼 키 &amp;gt; 사용할 키 수정 선택 (저는 JavaScript 키를 선택하였습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SDK 도메인을 localhost로 설정하여서 저장 후, api Key 를 받아줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLPd5l/dJMcaacV5IT/yJJaK8P4K2IScloGK3CBnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLPd5l/dJMcaacV5IT/yJJaK8P4K2IScloGK3CBnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLPd5l/dJMcaacV5IT/yJJaK8P4K2IScloGK3CBnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLPd5l%2FdJMcaacV5IT%2FyJJaK8P4K2IScloGK3CBnk%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;1697&quot; height=&quot;746&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;746&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;  카카오 맵 API KEY 적용 하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이제 코드에 카카오 맵을 적용해줍니다 &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은 api key&amp;amp;libraries=services&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지도 띄우는 부분과 마커 부분도 따로 생성하여서 재부팅하면 아래처럼 정상적으로 화면에 지도가 출력됩니다 !&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;989&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPnD9Q/dJMcahpBrek/KlSa9SqBVnHRAEgfQTuk91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPnD9Q/dJMcahpBrek/KlSa9SqBVnHRAEgfQTuk91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPnD9Q/dJMcahpBrek/KlSa9SqBVnHRAEgfQTuk91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPnD9Q%2FdJMcahpBrek%2FKlSa9SqBVnHRAEgfQTuk91%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;1197&quot; height=&quot;989&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;989&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>API</category>
      <category>API</category>
      <category>Java</category>
      <category>javascript</category>
      <category>js</category>
      <category>kakaomap</category>
      <category>spring</category>
      <category>카카오지도</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/61</guid>
      <comments>https://uque1013.tistory.com/61#entry61comment</comments>
      <pubDate>Sun, 11 Jan 2026 04:29:14 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 | Java] n의 배수 고르기</title>
      <link>https://uque1013.tistory.com/60</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;정수&amp;nbsp;&lt;/span&gt;n&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;과 정수 배열&amp;nbsp;&lt;/span&gt;numlist&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;가 매개변수로 주어질 때,&amp;nbsp;&lt;/span&gt;numlist&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;에서&amp;nbsp;&lt;/span&gt;n&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.&lt;/span&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한사항&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;le; n &amp;le; 10,000&lt;/li&gt;
&lt;li&gt;1 &amp;le;&lt;span&gt;&amp;nbsp;&lt;/span&gt;numlist의 크기 &amp;le; 100&lt;/li&gt;
&lt;li&gt;1 &amp;le;&lt;span&gt;&amp;nbsp;&lt;/span&gt;numlist의 원소 &amp;le; 100,000&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 17px;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 36.8604%; height: 17px;&quot;&gt;numlist&lt;/td&gt;
&lt;td style=&quot;width: 46.9768%; height: 17px;&quot;&gt;result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 36.8604%; height: 17px;&quot;&gt;[4,&amp;nbsp;5,&amp;nbsp;6,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;9,&amp;nbsp;10,&amp;nbsp;11,&amp;nbsp;12]&lt;/td&gt;
&lt;td style=&quot;width: 46.9768%; height: 17px;&quot;&gt;[6, 9, 12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.0465%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 36.8604%; height: 17px;&quot;&gt;[1,&amp;nbsp;9,&amp;nbsp;3,&amp;nbsp;10,&amp;nbsp;13,&amp;nbsp;5]&lt;/td&gt;
&lt;td style=&quot;width: 46.9768%; height: 17px;&quot;&gt;[10, 5]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.0465%;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;width: 36.8604%;&quot;&gt;[2,&amp;nbsp;100,&amp;nbsp;120,&amp;nbsp;600,&amp;nbsp;12,&amp;nbsp;12]&lt;/td&gt;
&lt;td style=&quot;width: 46.9768%;&quot;&gt;[120,&amp;nbsp;600,&amp;nbsp;12,&amp;nbsp;12]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예 설명&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #1&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;numlist에서 3의 배수만을 남긴 [6, 9, 12]를 return합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #2&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #263747; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;numlist에서 5의 배수만을 남긴 [10, 5]를 return합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #3&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;numlist에서12의 배수만을 남긴 [120, 600, 12, 12]를 return합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소스코드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1707162726412&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
    public int[] solution(int n, int[] numlist) {
        int num = 0; // n의 배수 구한 길이
        int idx = 0; // answer의 인덱스
        
        for(int i = 0; i &amp;lt; numlist.length; i++) {
            if(numlist[i] % n == 0)
            num++;
        }
        
        int[] answer = new int[num];
        for(int i = 0; i &amp;lt; numlist.length; i++) {
            if(numlist[i] % n == 0) {
                answer[idx] = numlist[i];
                idx++;
            }
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;num에는 n의 배수만큼의 길이를 구하여 넣어준 뒤, answer의 길이를 num으로 잡아준다. 두 번째 for문에서 한 번 더 배수를 구해준 뒤, answer[idx]에 numlist[i]를 넣어주면 n의 배수 값만 idx에 들어간다. 여기서, idx++를 해주지 않는다면 answer의 index가 증가하지 않아서 값이 한 개만 들어간다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스/Level 0</category>
      <category>Java</category>
      <category>Level 0</category>
      <category>배수</category>
      <category>자바</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/60</guid>
      <comments>https://uque1013.tistory.com/60#entry60comment</comments>
      <pubDate>Sat, 27 Apr 2024 14:12:11 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 | Java] 나머지가 1이 되는 수 찾기</title>
      <link>https://uque1013.tistory.com/59</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;자연수&amp;nbsp;&lt;/span&gt;n&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;이 매개변수로 주어집니다.&amp;nbsp;&lt;/span&gt;n&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;을&amp;nbsp;&lt;/span&gt;x&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수&amp;nbsp;&lt;/span&gt;x&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한사항&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3 &amp;le; n &amp;le; &lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;1,000,000&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.814%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 3.77358%;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 7.82766%;&quot;&gt;result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 3.77358%;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 7.82766%;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 3.77358%;&quot;&gt;15&lt;/td&gt;
&lt;td style=&quot;width: 7.82766%;&quot;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예 설명&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #1&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #2&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #263747; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소스코드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1707162726412&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i = n; i &amp;gt; 0; i--) {
            if(n % i == 1) 
                answer = i; 
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;i를 n값으로 받아서 0보다 작을때까지 i--를 해주어서 n을 i로 나누었을 때 나머지가 1로 나오는 가장 작은 수를 answer에 넣어준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스/Level 1</category>
      <category>Java</category>
      <category>Level 1</category>
      <category>나머지</category>
      <category>자바</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/59</guid>
      <comments>https://uque1013.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 23 Apr 2024 21:34:11 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 | Java] 핸드폰 번호 가리기</title>
      <link>https://uque1013.tistory.com/58</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한 조건&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;phone_number 길이는 4이상, 20이하의 문자열입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 39.1816%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 34.093%; height: 17px;&quot;&gt;phone_number&lt;/td&gt;
&lt;td style=&quot;width: 32.3629%; height: 17px;&quot;&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 34.093%; height: 17px;&quot;&gt;&quot;01033334444&quot;&lt;/td&gt;
&lt;td style=&quot;width: 32.3629%; height: 17px;&quot;&gt;&quot;*******4444&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 34.093%; height: 17px;&quot;&gt;&quot;027778888&quot;&lt;/td&gt;
&lt;td style=&quot;width: 32.3629%; height: 17px;&quot;&gt;&quot;*****8888&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소스코드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1713775588067&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
    public String solution(String phone_number) {
        String answer = &quot;&quot;;
        String last_num = &quot;&quot;; 
        
        for(int i = 0; i &amp;lt; phone_number.length()-4; i++) {
            answer += &quot;*&quot;;
        }
        last_num += phone_number.substring(phone_number.length()-4, phone_number.length());
        answer += last_num;
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반복문을 phone_number.length() - 4까지 반복하도록 해주어 마지막 번호 4 자릿수를 제외한 길이는 전부 '*'로 바꿔준다. substring 함수를 활용해서 마지막 번호 4 자릿수 전까지 문자열을 끊은 뒤 answer에 last_num을 넣어주면 마지막 번호 4 자릿수만 숫자로 나온다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스/Level 1</category>
      <category>Java</category>
      <category>Level 1</category>
      <category>기초</category>
      <category>자바</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <category>핸드폰 번호 가리기</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/58</guid>
      <comments>https://uque1013.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 22 Apr 2024 18:16:05 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 | Java] 아이스 아메리카노</title>
      <link>https://uque1013.tistory.com/57</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한사항&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;0 &amp;le; money &amp;le; 1,000,000&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 32.9024%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1205%; height: 17px;&quot;&gt;money&lt;/td&gt;
&lt;td style=&quot;width: 26.2541%; height: 17px;&quot;&gt;result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1205%; height: 17px;&quot;&gt;5,500&lt;/td&gt;
&lt;td style=&quot;width: 26.2541%; height: 17px;&quot;&gt;[1, 0]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1205%; height: 17px;&quot;&gt;15,000&lt;/td&gt;
&lt;td style=&quot;width: 26.2541%; height: 17px;&quot;&gt;[2, 4000]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 예 설명&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #1&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5,500원은&amp;nbsp;아이스&amp;nbsp;아메리카노&amp;nbsp;한&amp;nbsp;잔을&amp;nbsp;살&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;잔돈은&amp;nbsp;0원입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입출력 예 #2&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;15,000원은&amp;nbsp;아이스&amp;nbsp;아메리카노&amp;nbsp;두&amp;nbsp;잔을&amp;nbsp;살&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;잔돈은&amp;nbsp;4,000원입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소스코드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1713774630092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] solution(int money) {
        int[] answer = new int[2];
        int coffee = 5500;
        
        answer[0] = money / coffee;
        answer[1] = money % coffee;

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;머쓱이가 가지고 있는 돈 money를 coffee 값으로 나누어서 index 0번에 몇 잔을 살 수 있는지 넣고, money를 coffee 값으로 나머지를 구해서 잔돈이 얼마나 남는지를 index 1번에 넣어준다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스/Level 0</category>
      <category>Java</category>
      <category>Level 0</category>
      <category>기초</category>
      <category>아이스 아메리카노</category>
      <category>자바</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>U__q</author>
      <guid isPermaLink="true">https://uque1013.tistory.com/57</guid>
      <comments>https://uque1013.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 22 Apr 2024 17:38:31 +0900</pubDate>
    </item>
  </channel>
</rss>