<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>led</title>
    <link>https://ddong-tae.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 21 May 2026 00:46:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>똥태</managingEditor>
    <image>
      <title>led</title>
      <url>https://tistory1.daumcdn.net/tistory/5010482/attach/bf0ef2453a164178a492c2f3557d0696</url>
      <link>https://ddong-tae.tistory.com</link>
    </image>
    <item>
      <title>오라큭큭큭</title>
      <link>https://ddong-tae.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스란?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VpOrQ/btrZ0J4S56N/bF9f7b6j7VKloyH91tOfM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VpOrQ/btrZ0J4S56N/bF9f7b6j7VKloyH91tOfM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VpOrQ/btrZ0J4S56N/bF9f7b6j7VKloyH91tOfM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVpOrQ%2FbtrZ0J4S56N%2FbF9f7b6j7VKloyH91tOfM1%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;568&quot; height=&quot;346&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 값을 빠르게 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 테이블과 맵핑되어 있다. 맵핑된 곳으로 가서 나머지 데이터를 꺼내오는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 기준으로 정렬되어 저장된다 -&amp;gt; 특정 데이터를 조회 시 시작점을 지정해서 검색할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 테이블은 데이터가 물리적으로 흩어져 저장되어있다. -&amp;gt; 인덱스 없이 특정 데이터를 조회하려면 테이블을 full scan 하여 값을 찾아온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 컬럼을 인덱스로 지정하는게 좋을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;where절에 자주 등장하는 컬럼 - 조건에 대한 데이터를 찾을 때 효율적이다라고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order by 절에 자주 등장하는 컬럼 - 인덱스는 소팅되어 저장되기 때문에 따로 또 정렬할 필요가 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 절에 자주 등장하는 컬럼 - 인덱스는 단일컬럼뿐 아니라 여러 컬럼을 조합해서 결합 인덱스로도 구성이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고) 카디널리티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그룹내 요소의 갯수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;컬럼의 카디널리티가 높을 수록 해당 컬럼의 중복되는 값이 적다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 좋으면 인덱스를 많이 만들어 두면 좋겠네&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마구잡이로 생성하면 안돼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select는 빨라질지 몰라도 insert, update, delete 할때는 성능이 저하 될 수 있다. -&amp;gt; 인덱스는 정렬되어 저장하기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스가 있다고 항상 인덱스를 타는건 아니야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼을 가공한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;WHERE SUBSTR(ORDER_NO, 1, 4) = '2023'&amp;nbsp; &amp;gt; WHERE ORDER_NO LIKE '2023%'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼의 묵시적 형변환 (같은 타입으로 비교해야 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;WHERE REG_DATE = '20230201' &amp;gt; WHERE REG_DATE = TO_DATE('20230201', 'YYYYMMDD')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 컬럼 부정형 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;WHERE MEMBER_TYPE != '10'&amp;nbsp; &amp;nbsp;&amp;gt; WHERE MEMBER_TYPE IN ('20', '30')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE 연산자 사용시 '%' 가 앞에 위치한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OR조건사용 &amp;gt; UNION ALL 대체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 스캔 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 풀스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 레인지 스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 스킵 스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 패스트 풀 스캔 등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고하면 좋겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 탄다고 무조건 좋은 것은 아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 손익분기점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 전체 데이터의 10-15%의 데이터가 출력되는 경우 인덱스를 타는게 유리하고 그 외에는 테이블 풀스캔이 더 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 힌트를 남발하지 말자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저가 최적의 실행계획을 타도록 설계되어있기 때문에 인덱스를 타는게 유리하면 알아서 타게 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 테이블에 너무 많은 인덱스가 있어서 옵티마이저가 헷갈리지 않게 이 인덱스를 타라고 알려줄 순 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 실행계획 읽기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALTER SESSION SET STATISTICS_LEVEL = 'ALL';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 안쪽에서 부터 바깥쪽으로, 위에서 아래로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E-ROWS 예상 데이터 건수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A-ROWS 실제 데이터 건수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BUFFERS 각 오퍼레이션이 메모리에서 읽은 BLOCK의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FULL SCAN &amp;gt; INDEX REANGE SCAN&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인문에 대한 실행 계획&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이빙(밖)/드라이븐(안) 이중 포문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NESTED LOOP JOIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩 for문&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량의 테이블 조인에는 적절하지 않아.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;outer table - inner table (이너 테이블의 조인컬럼이 인덱스에 설정되어 있지 않으면 비효율이 발생(돌때마다 풀스캔 해야되서), 이너테이블의 인덱스 구성 전략이 매우 중요한 역할을 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SORT MERGE JOIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NESTED LOOP JOIN와 비슷하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양쪽 테이블을 조인 컬럼을 기준으로 먼저 소팅을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이너테이블에 인덱스가 없는 경우 사용하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PGA영역에서 소팅이 수행된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PGA 영역이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 서버에 접속하는 모든 유저에게 각각 할당되는 오라클 메모리 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 오라클에 접속 &amp;gt; 사용자 프로세스가 생성 &amp;gt; 사용자 프로세스는 사용자가 작성한 SQL문을 서버 프로세스에게 넘기고 결과를 기다린다. 서버 프로세스는 오라클과 상호작용하며 결과를 만들어낸다. 만들어진 결과를 사용자 프로세스에게 넘겨주고 사용자는 SQL 결과 값을 얻게된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PGA공간은 서버프로세스가 사용하는 메모리공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PGA에는 소트영역, 해시영역, 유저 세션정보를 저장하는 영역 등이 있는데 PGA의 소트영역에서 소팅이 수행되면 성능이 빠르지만 이를 넘어가면 디스크에서 작업이 수행되기 때문에 성능이 느려진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HASH 조인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량의 테이블 조인에 적절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이빙 테이블의 조인컬럼값을 기준으로 해시 펑션이 적용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 저장되는 놀리적인구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BLOCK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXTENT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEGMENT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TABLESPACE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BLOCK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 저장되는 가장 작은 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT를 할 때 I/O를 해야하는 가장 기본적인 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 하나 꺼낼때 컬럼 1개를 SELECT 하든 여러개를 하든 IO하는 블럭의 수는 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXTENT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BLOCK의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스가 할당하는 가장 작은 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;SEGMENT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXTENT의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OBJECT라고 생각하면된다. 테이블이나 인덱스 처럼 저장구조를 갖는 오브젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hwm 하이워터마크 - 책갈피, 세그먼트에서 사용한 공간을 표시해두는 것 &amp;gt; 풀스캔할 때 스캔하는 공간의 마지노선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TABLESPACE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트를 포괄하고있는 큰 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT문의 실행 순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5&amp;nbsp; SELECT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&amp;nbsp; &amp;nbsp; &amp;nbsp;FROM&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2&amp;nbsp; WHERE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3&amp;nbsp; GROUP BY&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4&amp;nbsp; HAVING&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6&amp;nbsp; ORDER BY&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FROM 절에 지정한 테이블이 실제 존재하는지 그리고 SELECT권한이 있는지 확인을 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE절에 내려와서 어떤 조건으로 데이터를 가져올지 데이터를 골라내고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY에서 골라낸 데이터를 어떤식으로 그룹바이할지 실행한 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HAVING절에서 내가 그룹핑 한 것들 중에 버릴건 없는지 실행하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고나서 SELECT절에가서 어떤 컬럼들이 필요한지 확인을 하게되고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 내가 뽑아온 컬럼들을 기준으로 어떻게 정렬할지를 실행하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; SELECT에서 하나의 컬럼을 가지고오던 *로 해서 모든 컬럼을 가지고오던 IO되는 블럭의 수는 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ORDER BY가 마지막에 수행되기때문에 SELECT절에서 alias를 준것을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스칼라 서브쿼리&amp;nbsp; - 실행계획 읽는 순서에 예외가 있다. 하나의 값만 리턴한다. 캐싱기술이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;select 절에서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인라인뷰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;from절에서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩서브쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;where절에서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;erd 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 몇가지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;union all/&amp;nbsp; 페이징 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;간단한 조인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;rank 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;서브쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거래정산테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;데이터 추출, ias, kps 조인해서&amp;nbsp;&lt;/p&gt;</description>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/35</guid>
      <comments>https://ddong-tae.tistory.com/35#entry35comment</comments>
      <pubDate>Sun, 19 Feb 2023 22:03:51 +0900</pubDate>
    </item>
    <item>
      <title>스프링 시큐리티 참고 링크</title>
      <link>https://ddong-tae.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://dev-coco.tistory.com/m/174&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dev-coco.tistory.com/m/174&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666063280754&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Security의 구조(Architecture) 및 처리 과정 알아보기&quot; data-og-description=&quot;시작하기 앞서 스프링 시큐리티에서 어플리케이션 보안을 구성하는 두 가지 영역에 대해 간단히 알아보자. 인증(Authentication)과 인가(Authorization) 대부분의 시스템에서는 회원을 관리하고 있고, &quot; data-og-host=&quot;dev-coco.tistory.com&quot; data-og-source-url=&quot;https://dev-coco.tistory.com/m/174&quot; data-og-url=&quot;https://dev-coco.tistory.com/174&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/czGuN3/hyP7Ia5qMh/IXDO1ufhQxtCOmkkNkWtZ0/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615,https://scrap.kakaocdn.net/dn/dcukNS/hyQfbvliRI/vjmLKHzgmAom6GlBb0S040/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615,https://scrap.kakaocdn.net/dn/1tNje/hyP7HpI3AO/YmhipD6X0k8F8XHJDTikhk/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615&quot;&gt;&lt;a href=&quot;https://dev-coco.tistory.com/m/174&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-coco.tistory.com/m/174&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/czGuN3/hyP7Ia5qMh/IXDO1ufhQxtCOmkkNkWtZ0/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615,https://scrap.kakaocdn.net/dn/dcukNS/hyQfbvliRI/vjmLKHzgmAom6GlBb0S040/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615,https://scrap.kakaocdn.net/dn/1tNje/hyP7HpI3AO/YmhipD6X0k8F8XHJDTikhk/img.png?width=820&amp;amp;height=615&amp;amp;face=0_0_820_615');&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;Spring Security의 구조(Architecture) 및 처리 과정 알아보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;시작하기 앞서 스프링 시큐리티에서 어플리케이션 보안을 구성하는 두 가지 영역에 대해 간단히 알아보자. 인증(Authentication)과 인가(Authorization) 대부분의 시스템에서는 회원을 관리하고 있고,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-coco.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666063288036&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;[Spring Security] 스프링시큐리티 설정값들의 역할과 설정방법(2)&quot; data-og-description=&quot;스프링시큐리티의 여러가지 설정값들의 역할과 설정방법을 상세히 알아봅니다. Spring Security 커스텀 필터를 이용한 인증 구현 - 스프링시큐리티 설정(2) 본 포스팅은 스프링시큐리티의 전반적인 &quot; data-og-host=&quot;kimchanjung.github.io&quot; data-og-source-url=&quot;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&quot; data-og-url=&quot;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjZvr0/hyQe7Ne3U8/zJb8vwHNiaNP3mfxgKw8g1/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/b5cF9r/hyP7CBV9Yf/pllTaBzeMdc2rDVEOSb160/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683&quot;&gt;&lt;a href=&quot;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjZvr0/hyQe7Ne3U8/zJb8vwHNiaNP3mfxgKw8g1/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683,https://scrap.kakaocdn.net/dn/b5cF9r/hyP7CBV9Yf/pllTaBzeMdc2rDVEOSb160/img.jpg?width=1024&amp;amp;height=683&amp;amp;face=0_0_1024_683');&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;[Spring Security] 스프링시큐리티 설정값들의 역할과 설정방법(2)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링시큐리티의 여러가지 설정값들의 역할과 설정방법을 상세히 알아봅니다. Spring Security 커스텀 필터를 이용한 인증 구현 - 스프링시큐리티 설정(2) 본 포스팅은 스프링시큐리티의 전반적인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kimchanjung.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링 시큐리티</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/34</guid>
      <comments>https://ddong-tae.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 18 Oct 2022 12:21:40 +0900</pubDate>
    </item>
    <item>
      <title>머스태치 오류</title>
      <link>https://ddong-tae.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;com.samskivert.mustache.MustacheException$Context:&amp;nbsp;No&amp;nbsp;method&amp;nbsp;or&amp;nbsp;field&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'post'&amp;nbsp;on&amp;nbsp;line&amp;nbsp;10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 줄에 친절히 post 메소드 또는 필드를 찾을 수 없다고 알려줬는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service, controller 단만 찾아보고 있었다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 컨트롤러에서는 posts 로 보내주고있는데 머스태치에서는 post로 가져오고 있었음.. ㅠㅠ post -&amp;gt; posts로 바꿔주니 정상동작...ㅠㅠ 그래..새벽이라 그랬을거야 잠이덜깨서 ㅋㅋ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;담부턴 오류메세지 잘 확인하자!&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;form-group&quot;&amp;gt;
    &amp;lt;label for=&quot;title&quot;&amp;gt;글 번호&amp;lt;/label&amp;gt;
    &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;id&quot; value=&quot;{{post.id}}&quot; readonly&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659994219396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;com.samskivert.mustache.MustacheException$Context: No method or field with name 'post' on line 10
	at com.samskivert.mustache.Template.checkForMissing(Template.java:326) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.getValue(Template.java:234) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.getCompoundValue(Template.java:247) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.getValue(Template.java:231) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.getValueOrDefault(Template.java:279) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Mustache$VariableSegment.execute(Mustache.java:802) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.executeSegs(Template.java:157) ~[jmustache-1.14.jar:na]
	at com.samskivert.mustache.Template.execute(Template.java:134) ~[jmustache-1.14.jar:na]
	at org.springframework.boot.web.servlet.view.MustacheView.renderMergedTemplateModel(MustacheView.java:80) ~[spring-boot-2.1.9.RELEASE.jar:2.1.9.RELEASE]
	at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:317) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1372) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_261]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_261]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.26.jar:9.0.26]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_261]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/31</guid>
      <comments>https://ddong-tae.tistory.com/31#entry31comment</comments>
      <pubDate>Tue, 9 Aug 2022 06:33:09 +0900</pubDate>
    </item>
    <item>
      <title>inteliJ 테스트 코드 작성 중 에러</title>
      <link>https://ddong-tae.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. No tests found for given includes: [com....~~]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; test할때 intelliJ IDEA 를 사용하겠다고 설정을 변경해주면 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;1141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drheqn/btrIxSM7Vsz/JHkkSKGwIBkT8cy7sp5db1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drheqn/btrIxSM7Vsz/JHkkSKGwIBkT8cy7sp5db1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drheqn/btrIxSM7Vsz/JHkkSKGwIBkT8cy7sp5db1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrheqn%2FbtrIxSM7Vsz%2FJHkkSKGwIBkT8cy7sp5db1%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;1797&quot; height=&quot;1141&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;1141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.롬복(lombok) 테스트 중 에러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;롬복이 제대로 작동 안하는거같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 설치한 inteliJ에는 롬복이 기본 플러그인으로 설치되어있었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;annotationProcessor(~~)를 dependencies에 추가해주고 다시 테스트 실행하니 잘되었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;롬복을 사용하려면 아래 두개 내용이 dependencies에 추가되어야 함.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;implementation('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPlPA/btrIFHjhQ1l/jcrwuvEqqIIkaDV4JZ9qkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPlPA/btrIFHjhQ1l/jcrwuvEqqIIkaDV4JZ9qkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPlPA/btrIFHjhQ1l/jcrwuvEqqIIkaDV4JZ9qkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPlPA%2FbtrIFHjhQ1l%2FjcrwuvEqqIIkaDV4JZ9qkk%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;1259&quot; height=&quot;1027&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/30</guid>
      <comments>https://ddong-tae.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 2 Aug 2022 06:40:49 +0900</pubDate>
    </item>
    <item>
      <title>스프링부트 gradle 설정</title>
      <link>https://ddong-tae.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle 을 다음과 같이 설정하니 exception 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인: gralde 7 버전에서는 compile -&amp;gt; implementation 으로 사용해야함&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;buildscript {
    ext {
        springBootVersion = &quot;2.1.9.RELEASE&quot;
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath(&quot;org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}&quot;)
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'com.book'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

test {
    useJUnitPlatform()
}&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;gradle 버전 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7xaz6/btrIEZp8EL2/tBhWhHhvSqw6B9rru3th30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7xaz6/btrIEZp8EL2/tBhWhHhvSqw6B9rru3th30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7xaz6/btrIEZp8EL2/tBhWhHhvSqw6B9rru3th30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7xaz6%2FbtrIEZp8EL2%2FtBhWhHhvSqw6B9rru3th30%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;1123&quot; height=&quot;491&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 변경하니&amp;nbsp; BUILD SUCCESS ㅠㅠ&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;buildscript {
    ext {
        springBootVersion = &quot;2.1.9.RELEASE&quot;
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath(&quot;org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}&quot;)
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'com.book'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

test {
    useJUnitPlatform()
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>스프링부트</category>
      <category>Gradle</category>
      <category>springboot</category>
      <category>인텔리제이</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/29</guid>
      <comments>https://ddong-tae.tistory.com/29#entry29comment</comments>
      <pubDate>Sun, 31 Jul 2022 19:05:10 +0900</pubDate>
    </item>
    <item>
      <title>빌드하고 실행하기</title>
      <link>https://ddong-tae.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 빌드할 프로젝트로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. (윈도우) gradlew.bat build&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;빌드 success -&amp;gt; build\libs 에 jar파일이 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. java -jar hello-spring-0.0.1-SNAPSHOT.jar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 실행 확인&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/28</guid>
      <comments>https://ddong-tae.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 29 Mar 2022 10:17:41 +0900</pubDate>
    </item>
    <item>
      <title>[스프링부트] 프로젝트 생성</title>
      <link>https://ddong-tae.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Spring Initializr로 프로젝트를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://start.spring.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 필요한 Dependencies를 추가해주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eipKGf/btrwgDGTgnv/KvvE9Lj2Kb6ORry09yvbl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eipKGf/btrwgDGTgnv/KvvE9Lj2Kb6ORry09yvbl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eipKGf/btrwgDGTgnv/KvvE9Lj2Kb6ORry09yvbl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeipKGf%2FbtrwgDGTgnv%2FKvvE9Lj2Kb6ORry09yvbl1%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;745&quot; height=&quot;599&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 생성된 프로젝트를 인텔리제이에 import 해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. main메소드가 실행이 잘 되는지 확인해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1L4sd/btrwb4dKawd/cDt6Tsb7TDdNRhVy827CMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1L4sd/btrwb4dKawd/cDt6Tsb7TDdNRhVy827CMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1L4sd/btrwb4dKawd/cDt6Tsb7TDdNRhVy827CMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1L4sd%2Fbtrwb4dKawd%2FcDt6Tsb7TDdNRhVy827CMK%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;916&quot; height=&quot;399&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EyIUK/btrwapvU1vD/GGzscUD2QvbWGixp221zu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EyIUK/btrwapvU1vD/GGzscUD2QvbWGixp221zu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EyIUK/btrwapvU1vD/GGzscUD2QvbWGixp221zu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEyIUK%2FbtrwapvU1vD%2FGGzscUD2QvbWGixp221zu1%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;1590&quot; height=&quot;444&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣이 실행이 잘되는지 localhost:8080으로 접속해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsnULi/btruE883vg2/2RAzNvKV4wC33zdVOkkKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsnULi/btruE883vg2/2RAzNvKV4wC33zdVOkkKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsnULi/btruE883vg2/2RAzNvKV4wC33zdVOkkKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsnULi%2FbtruE883vg2%2F2RAzNvKV4wC33zdVOkkKY0%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;1235&quot; height=&quot;485&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣이 잘 실행된것을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. lombok을 사용하기위해 필요한 설정을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Settings &amp;gt; Annotation Professors에서 Enable annotation processing을 체크해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PCsZp/btrwezSHAPw/ZMhoKlmrMKqnOrunB5N2D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PCsZp/btrwezSHAPw/ZMhoKlmrMKqnOrunB5N2D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PCsZp/btrwezSHAPw/ZMhoKlmrMKqnOrunB5N2D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPCsZp%2FbtrwezSHAPw%2FZMhoKlmrMKqnOrunB5N2D1%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;1207&quot; height=&quot;895&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 lombok이 잘 실행되는지 확인해준다. 확인은 임의의 class를 생성하고 getter setter가 잘 동작하는지 확인해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mVHzK/btrwezZwzB5/m9oGj4USzXz3ScQiHEmKCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mVHzK/btrwezZwzB5/m9oGj4USzXz3ScQiHEmKCk/img.png&quot; data-alt=&quot;lombok 동작을 확인하기위한 임의의 class&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mVHzK/btrwezZwzB5/m9oGj4USzXz3ScQiHEmKCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmVHzK%2FbtrwezZwzB5%2Fm9oGj4USzXz3ScQiHEmKCk%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;594&quot; height=&quot;412&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;lombok 동작을 확인하기위한 임의의 class&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W4KOD/btrv7P2VowL/6EnrYPkotndqfOw2NMIK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W4KOD/btrv7P2VowL/6EnrYPkotndqfOw2NMIK00/img.png&quot; data-alt=&quot;main메소드에서 실행했을 때 오류없이 실행되면 끝&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W4KOD/btrv7P2VowL/6EnrYPkotndqfOw2NMIK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW4KOD%2Fbtrv7P2VowL%2F6EnrYPkotndqfOw2NMIK00%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;737&quot; height=&quot;564&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main메소드에서 실행했을 때 오류없이 실행되면 끝&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 설정 끝&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/27</guid>
      <comments>https://ddong-tae.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 18 Mar 2022 01:48:36 +0900</pubDate>
    </item>
    <item>
      <title>클라이언트 요청 처리 순서</title>
      <link>https://ddong-tae.tistory.com/25</link>
      <description>&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;826&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q0AeR/btrrUPSZ339/lmuLm5LGJsyHisIJhi7YK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q0AeR/btrrUPSZ339/lmuLm5LGJsyHisIJhi7YK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q0AeR/btrrUPSZ339/lmuLm5LGJsyHisIJhi7YK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq0AeR%2FbtrrUPSZ339%2FlmuLm5LGJsyHisIJhi7YK1%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;640&quot; height=&quot;563&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client 요청이 들어오면 등록된 Filter를 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터를 거친 후 디스패처서블릿이 요청을 받게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스패처서블릿은 URL과 요청정보를 가지고 핸들러 매핑으로부터 핸들러(컨트롤러)를 얻어낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 등록되어있는 핸들러 인터셉터의 preHandle 메소드를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 실행 이후 컨트롤러가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러를 통해 모델과 뷰 정보를 디스패처 서블릿에게 전달하는데 이 중간에서 핸들러 인터셉터의 postHandle 메소드가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 실행 이후 디스패처서블릿은 건네받은 뷰 정보를 가지고 뷰 리졸버로부터 뷰를 얻어낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰로 결과를 만들어 응답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <category>request 처리과정</category>
      <category>디스패처서블릿</category>
      <category>스프링</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/25</guid>
      <comments>https://ddong-tae.tistory.com/25#entry25comment</comments>
      <pubDate>Fri, 28 Jan 2022 07:30:39 +0900</pubDate>
    </item>
    <item>
      <title>핸들러 인터셉터(Interceptor)</title>
      <link>https://ddong-tae.tistory.com/24</link>
      <description>&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;826&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIskPT/btrrUouhvkR/r6wT4y9BS9bUX7KCIntjCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIskPT/btrrUouhvkR/r6wT4y9BS9bUX7KCIntjCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIskPT/btrrUouhvkR/r6wT4y9BS9bUX7KCIntjCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIskPT%2FbtrrUouhvkR%2Fr6wT4y9BS9bUX7KCIntjCK%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;439&quot; height=&quot;387&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핸들러 매핑의 역할&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL과 요청 정보로부터 컨트롤러 빈을 찾아준다.&lt;/li&gt;
&lt;li&gt;DispatcherServlet으로부터 매핑 작업을 요청받으면 그 결과로 &lt;b&gt;핸들러 실행 체인(HandlerExecutionChain)&lt;/b&gt;을 돌려준다. 이 핸들러 실행 체인은 하나 이상의 핸들러 인터셉터를 거쳐서 컨트롤러가 실행될 수 있도록 구성되어 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터셉터(Interceptor)란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;DispatcherServlet에서 Handler(컨트롤러)를 호출하기 전과 후에 request와 response를 참조하거나 가공할 수 있는 일종의 필터다.&lt;/li&gt;
&lt;li&gt;서블릿 필터와 쓰임새가 유사하기 때문에 둘 중 어떤것을 사용할지 신중히 선택해야한다.&lt;/li&gt;
&lt;li&gt;컨트롤러에 공통적으로 적용할 부가기능이라면 핸들러 인터셉터를 사용하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서블릿 필터와 차이점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HttpServletRequest, HttpServletResponse뿐 아니라, 실행될 컨트롤러 빈 오브젝트, 컨트롤러가 돌려주는 ModelAndView, 발생 예외(Exception) 등을 제공받을 수 있다.&lt;/li&gt;
&lt;li&gt;필터 자체는 스프링의 빈이 아닌 반면 핸들러 인터셉터 자체가 스프링의 빈이다. 따라서 DI를 통해 다른 빈을 활용할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;인터셉터 작성법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현한다.&lt;/li&gt;
&lt;li&gt;org.springframework.web.servlet.handler.HandlerInterceptorAdapter 클래스를 상속받는다.&lt;/li&gt;
&lt;li&gt;Java Config를 사용한다면, WebMvcConfigurerAdapter가 가지고 있는 addInterceptors 메소드를 오버라이딩하고 등록하는 과정을 거친다.&lt;/li&gt;
&lt;li&gt;xml 설정을 사용한다면, &amp;lt;mvc:interceptors&amp;gt; 요소에 인터셉터를 등록한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HandlerInterceptor&amp;nbsp; 인터페이스의 메소드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨트롤러가 호출되기 전에 실행된다. (이때 handler 파라미터는 핸들러 매핑이 찾아준 컨트롤러 빈 오브젝트다.)&lt;/li&gt;
&lt;li&gt;컨트롤러 실행 이전에 처리해야 할 작업이나 요청정보를 가공하거나 추가하는 경우 또는 요청에 대한 로그를 남기기 위해 사용한다.&lt;/li&gt;
&lt;li&gt;return 값이 true면 핸들러 실행 체인의 다음 단계로 진행되지만, false라면 작업을 중단하고 리턴한다. 따라서 false인 경우엔 컨트롤러와 남은 인터셉터들은 실행되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;postHandle(HttpServletRequest request,&lt;span&gt;&amp;nbsp;&lt;/span&gt;HttpServletResponse response, Object handler, ModelAndView modelAndView)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨트롤러를 실행하고 난 후에 호출된다.&lt;/li&gt;
&lt;li&gt;컨트롤러 실행 이후이므로 컨트롤러가 돌려준 ModelAndView 타입의 정보가 제공되어 컨트롤러 작업 결과를 참조하거나 조작할 수 있다.&lt;/li&gt;
&lt;li&gt;preHandle() 메소드에서 false를 리턴했을 경우에는 postHandle()도 실행되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 뷰에서 최종 결과를 생성하는 일을 포함한 모든 작업이 다 완료된 후에 실행된다.&lt;/li&gt;
&lt;li&gt;요청 처리 중 사용한 리소스를 반환해주기에 적당한 메소드다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 인터셉터는 하나 이상을 등록할 수 있다. preHandle()은 인터셉터가 등록된 순서대로 실행되는 반면 postHandle()과 afterCompletion()은 preHandle()이 실행된 순서와 반대로 실행된다.&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <category>스프링</category>
      <category>인터셉터</category>
      <category>핸들러 인터셉터</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/24</guid>
      <comments>https://ddong-tae.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 28 Jan 2022 07:02:54 +0900</pubDate>
    </item>
    <item>
      <title>Properties 값 져올때 오류</title>
      <link>https://ddong-tae.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DB driver, url, username, password 를 properties 파일에 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Value 어노테이션을 이용하여 값을 불러오게 하여쓴데 자꾸&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cannot load JDBC driver class '${..이름..}'&amp;nbsp; 에러가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔에 찍어보니 driverClassName를 포함한 properties에 등록한 값을 못가져오고 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 properties를 불러오는 코드를 config파일에 넣어주지 않아서 생기는 에러였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@PropertySource에 properties 경로를 추가해주니 properties 값들을 잘 가져왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1642143174926&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
@PropertySource(&quot;classpath:application.properties&quot;)
@EnableTransactionManagement
public class DBConfig implements TransactionManagementConfigurer{

	@Value(&quot;${spring.datasource.driver-class-name}&quot;)
	private String driverClassName;
	
	@Value(&quot;${spring.datasource.url}&quot;)
	private String url;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring Framework</category>
      <category>@PropertySource</category>
      <category>application.properties</category>
      <category>properties</category>
      <author>똥태</author>
      <guid isPermaLink="true">https://ddong-tae.tistory.com/22</guid>
      <comments>https://ddong-tae.tistory.com/22#entry22comment</comments>
      <pubDate>Fri, 14 Jan 2022 15:54:07 +0900</pubDate>
    </item>
  </channel>
</rss>