<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자의 개인공간</title>
    <link>https://wkddnjs416.tistory.com/</link>
    <description>하루 하루 공부하며 알아가는 사실들을 적어 놓는 개인의 공간입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 07:08:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>융벅</managingEditor>
    <image>
      <title>개발자의 개인공간</title>
      <url>https://tistory1.daumcdn.net/tistory/5561238/attach/dc5ecc3dbb1848d2a62ce4290a282928</url>
      <link>https://wkddnjs416.tistory.com</link>
    </image>
    <item>
      <title>SQL Sleect /From /Where /OrderBy /Limit</title>
      <link>https://wkddnjs416.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Join에 대해 공부하면서 전반적인 SQL에 대해 한번 더 공부하면 좋을것 같았다. &lt;br /&gt;좋은 강의도 찾았으니 SQL에 대해 공부해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SQL.PNG&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7u2c9/btrXoCnzNqI/aSeEaejCE6ah2jNKyNJkI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7u2c9/btrXoCnzNqI/aSeEaejCE6ah2jNKyNJkI0/img.png&quot; data-alt=&quot;기본적인 SQL문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7u2c9/btrXoCnzNqI/aSeEaejCE6ah2jNKyNJkI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7u2c9%2FbtrXoCnzNqI%2FaSeEaejCE6ah2jNKyNJkI0%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;326&quot; height=&quot;249&quot; data-filename=&quot;SQL.PNG&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본적인 SQL문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;&lt;b&gt;1. SELECT DISTINCT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;출력하고자 하는 값을 SELECT 함수 뒤에 기입한다. &lt;br /&gt;DISTINCT의 역할은 컬럼에 중복값이 있으면 제거하고 출력하는 역할을 한다. &lt;br /&gt;Null 값이 포항된 경우에도 distinct를 이용하면 줄일 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;&lt;b&gt;2. FROM&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;사용하고자 하는 테이블을 지시한다.&amp;nbsp;&lt;br /&gt;SELECT와 FROM을 활용하여 간단한 쿼리문을 작성해보자.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;알면 좋을 TIP&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674891509772&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//----팁----
SELECT 2 * 3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; select문에서도 다음과 같은 일반적인 사칙연산이 적용된다. 날짜는 +,-만 된다고 하니 참고하자!&lt;br /&gt;오라클이나 mysql같은 경우 테이블 없이 SELECT문만 호출할 경우 에러가 난다고 한다. &lt;br /&gt;이럴 때에는 가상 테이블인 dual 테이블을 호출하여 활용할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;SELECT ~ FROM 활용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;트랙.PNG&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MLSXk/btrXnkHZNki/KxrHRVpHYpze9xZbgTN3m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MLSXk/btrXnkHZNki/KxrHRVpHYpze9xZbgTN3m1/img.png&quot; data-alt=&quot;track 테이블&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MLSXk/btrXnkHZNki/KxrHRVpHYpze9xZbgTN3m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMLSXk%2FbtrXnkHZNki%2FKxrHRVpHYpze9xZbgTN3m1%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;192&quot; height=&quot;233&quot; data-filename=&quot;트랙.PNG&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;track 테이블&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테이블에서 &lt;b&gt;trackid / name / composer / unitprice&lt;/b&gt; 를 출력해보자.&lt;br /&gt;아래와 같은 쿼리문이 완성될 것이다. &lt;br /&gt;만약 tracks 테이블의 모든 필드를 출력하고 싶다면, 아래와 같이 *을 활용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674892108631&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, name, composer, unitprice
FROM tracks;

// 전부 다 출력하고 싶을 경우
SELECT *
FORM tracks;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;&lt;b&gt;3. ORDER BY&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;order by는 정렬 기준이다. column ASC는 오름차순을 의미하고, &lt;span&gt;column&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DESC는 내림차순을 의미한다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;name / milliseconds / albumid&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 출력하되, albumid에 대해 오름차순으로 정렬된 데이터를 출력해보자.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674906146542&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, millisecond, albumid
FROM tracks
ORDER BY albumid ASC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그럼 위와 같은 쿼리문을 작성할 수 있다. &lt;br /&gt;&lt;br /&gt;그렇다면, order by의 정렬 기준이 두개가 된다면 어떻게 될까? &lt;br /&gt;똑같이 &lt;b&gt;name / milliseconds / albumid&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 출력하되, &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;이번에는 &lt;b&gt;albumid에 대해 오름차순, milliseconds에 대해 내림차순&lt;/b&gt;으로 정렬시켜 출력해보자.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674906441346&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, millisecond, albumid
FROM tracks
ORDER BY albumid ASC, milliseconds DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;결과는 아래 그림과 같다. albumid에 대해 오름차순으로 먼저 정렬을 한 후, &lt;br /&gt;그 정렬 속에서 milliseconds에 대해 내림차순 정렬를 수행하게 된다. &lt;br /&gt;쿼리문에 milliseconds에 대한 내림차순을 먼저 기입하면 milliseconds에 대한 내림차순이 먼저 이루어진다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;정렬결과.PNG&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgD2BD/btrXnI2ZVhA/pLfkLiKGWTv0K0Hl6YjcC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgD2BD/btrXnI2ZVhA/pLfkLiKGWTv0K0Hl6YjcC0/img.png&quot; data-alt=&quot;두 가지 정렬에 대한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgD2BD/btrXnI2ZVhA/pLfkLiKGWTv0K0Hl6YjcC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgD2BD%2FbtrXnI2ZVhA%2FpLfkLiKGWTv0K0Hl6YjcC0%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;432&quot; height=&quot;356&quot; data-filename=&quot;정렬결과.PNG&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 가지 정렬에 대한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;NULL은 어떻게 정렬돼?&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;1. SQL에서 null은 가장 작은 값이다. &lt;br /&gt;2. 또한 null은 자신과 비교할 수 없다. &lt;br /&gt;-&amp;gt; 이 말은 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;&quot;null과 null이 같니?&quot; &lt;/b&gt;&lt;/span&gt;라는 질문에 항상&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt; 아니오&lt;/b&gt;&lt;/span&gt;가 나온다는 의미이다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;4. WHERE&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;대표적인 조건절이다. &lt;br /&gt;where 절에 어떤 조건을 넣어 데이터를 가져올 수 있는지가 SQL에서 가장 중요한 부분을 차지한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;where 조건.PNG&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKyhYd/btrXn6iSquB/AYQVurRysKZh5cT9kKgfrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKyhYd/btrXn6iSquB/AYQVurRysKZh5cT9kKgfrk/img.png&quot; data-alt=&quot;where절의 기본 형식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKyhYd/btrXn6iSquB/AYQVurRysKZh5cT9kKgfrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKyhYd%2FbtrXn6iSquB%2FAYQVurRysKZh5cT9kKgfrk%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;397&quot; height=&quot;41&quot; data-filename=&quot;where 조건.PNG&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;where절의 기본 형식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 형식은 위 그림과 같이 left expression과 right expression을 비교 연산자를 통해 비교하는 것이다. &lt;br /&gt;아래 그림을 통해 where절의 예시를 확인하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;where 예시.PNG&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nfnww/btrXykflklE/jDD7UCZawSoQSMTsKgPcv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfnww/btrXykflklE/jDD7UCZawSoQSMTsKgPcv0/img.png&quot; data-alt=&quot;where 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfnww/btrXykflklE/jDD7UCZawSoQSMTsKgPcv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnfnww%2FbtrXykflklE%2FjDD7UCZawSoQSMTsKgPcv0%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;313&quot; height=&quot;213&quot; data-filename=&quot;where 예시.PNG&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;where 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE column_1 = 100; -&amp;gt; &lt;span&gt;column_1&lt;span&gt; 의 값이 100인 레코드를 출력한다.&amp;nbsp;&lt;br /&gt;&lt;span&gt;WHERE column_2 in (1,2,3); -&amp;gt; &lt;span&gt; &lt;span&gt;column_2의 값이 1,2,3 중 하나이면 출력한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE column_3 LIKE 'An%'; -&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;column_3의 값이 An으로 시작하는 레코드를 출력한다.&lt;br /&gt;&lt;span&gt;WHERE column_4 BETWEEN 10 AND 20; -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;column_4의 값이 10 &lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt;&lt;b&gt;이상&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;20&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt; &lt;b&gt;이하&lt;/b&gt;&lt;/span&gt;인 레코드를 출력한다.&amp;nbsp;&lt;br /&gt;&lt;i&gt;* -&amp;gt; BETWEEN은 날짜 질의도 가능하다!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;이 밖에도 다양한 조건을 부여하기 위한 연산자가 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;where비교연산.PNG&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZbvU/btrXnLlLqZm/Ykdqcg14TmKBE80WRYpZXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZbvU/btrXnLlLqZm/Ykdqcg14TmKBE80WRYpZXk/img.png&quot; data-alt=&quot;where 비교연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZbvU/btrXnLlLqZm/Ykdqcg14TmKBE80WRYpZXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZbvU%2FbtrXnLlLqZm%2FYkdqcg14TmKBE80WRYpZXk%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;430&quot; height=&quot;320&quot; data-filename=&quot;where비교연산.PNG&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;where 비교연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;where논리연산.PNG&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCxugI/btrXyiIBOOb/iBIZnpQx4dNMvFs11SPDQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCxugI/btrXyiIBOOb/iBIZnpQx4dNMvFs11SPDQk/img.png&quot; data-alt=&quot;where 논리연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCxugI/btrXyiIBOOb/iBIZnpQx4dNMvFs11SPDQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCxugI%2FbtrXyiIBOOb%2FiBIZnpQx4dNMvFs11SPDQk%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;711&quot; height=&quot;408&quot; data-filename=&quot;where논리연산.PNG&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;where 논리연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 가지 연산자를 활용하는 SQL문을 예시로 작성해보자.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;Equal&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674997692409&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, milliseconds, bytes, albumid
FROM tracks
WHERE albumid = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tracks 테이블에서 name, milliseconds, bytes, albumid를 select하는 과정에서 &lt;br /&gt;albumid가 1인 값을 찾아오는 쿼리문이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;Equal, And&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674997907276&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, milliseconds, bytes, albumid
FROM tracks
WHERE albumid = 1 AND milliseconds &amp;gt; 250000;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;where절에 논리연산자를 부여해보자. &lt;br /&gt;위와 같이 albumid가 1이면서 milliseconds가 250000을 초과하는 값을 select하는 쿼리문이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;Like&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;like는 문자열 중에 특정 부분이 일치하면 출력하는 매서드이다. &lt;br /&gt;단, like는 전체 테이블을 조회하기 때문에 데이터 양이 늘어나게 되면 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;조회하는 비용이 늘어나게 되며&lt;/b&gt;&lt;/span&gt;, &lt;br /&gt;이는 효율적인 스캔과 멀어지게 된다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;like 질의문은 주로 '%' 와 '_'를 활용한 질의를 많이 활용한다.&lt;br /&gt;&lt;b&gt;%&lt;/b&gt; 는 0또는 1개 이상의 이어지는 경우,&amp;nbsp; &lt;b&gt;_&amp;nbsp;&lt;/b&gt; 는 글자 하나만 존재하는 경우에서 레코드를 찾고 싶을 때 활용한다.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674998321268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, albumid, composer
FROM tracks
WHERE composer LIKE '%smith%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿼리를 실행하면 composer 중 smith가 붙은 레코드만 출력할 수 있다. &lt;br /&gt;%가 붙은 위치에 따라 출력할 수 있는 레코드가 달라질 수 있으니 주의!&lt;br /&gt;&lt;br /&gt;* 실제 레코드에 특수문자가 있는 경우 -&amp;gt;특수문자 자체를 찾고 싶은 경우&lt;/p&gt;
&lt;pre id=&quot;code_1675576517326&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, albumid, composer
FROM tracks
WHERE composer LIKE '%10&amp;amp;%' ESCAPE '&amp;amp;';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿼리는 '10&amp;amp;' 가 포함된 레코드를 찾는 쿼리이다.&amp;nbsp;&lt;br /&gt;&amp;amp;문자가 포함된 레코드를 검색하고 싶을때는 ESCAPE를 통해 해당 특수문자를 제외할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;In&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;in 연산자는 괄호 안의 특정한 값에 대한 레코드를 출력하는 연산자이며, &lt;br /&gt;in 연산자를 활용하면 쿼리의 logical 연산자 활용을 줄일 수 있다. 예를 들어 2,3,4,5에 대한 값을 출력하고 싶을 때, in 연산자를 활용하면 (2,3,4,5)로 간단히 작성할 수 있지만, 활용하지 않을 경우에는 OR 2 OR 3 OR 4 OR 5와 같은 불편하고 가독성이 떨어지는 쿼리문이 된다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674998708339&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, albumid, mediatypeid
FROM tracks
WHERE mediatypeid IN (2,3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿼리문은 mediatypeid가 2 or 3인 값을 출력하는 쿼리이다.&amp;nbsp;&lt;br /&gt;그렇다면, 해당 값을 제외한 나머지 레코드를 출력하고 싶을 때는 어떻게 활용해야 할까?&lt;br /&gt;이래 예시 쿼리와 같이 in 앞에 not을 붙여주면 된다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674998819212&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, albumid, mediatypeid
FROM tracks
WHERE mediatypeid NOT IN (2,3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In 안에 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;서브 쿼리&lt;/span&gt;&lt;/b&gt;를 넣을 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675063572552&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, trackid, albumid
FROM tracks
WHERE albumid IN (
	SELECT albumid
    	FROM albums
    	WHERE artistid = 13
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;artistid가 13인 값에 대한 albumid를 출력하고 싶다고 가정하자. 하지만 tracks 테이블에는 artistid가 존재하지 않는다.&amp;nbsp;&lt;br /&gt;이런 상황에 IN 질의 안에 다시 쿼리문을 작성하여 조건에 맞는 값을 호출할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Between&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;between 질의를 사용하게 되면 부등호를 줄일 수 있어 코드 길이를 줄일 수 있고, 코드 가독성이 좋아진다.&amp;nbsp;&lt;br /&gt;in 질의는 불연속적인 레코드 범위를 한번에 출력하고 싶을 때 활용한다면, &lt;br /&gt;between 질의는 연속적인 범위에 대한 값을 출력할 때 활용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675059930979&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT invoiceid, billingaddress, date(invoicedate) invoicedate, total
FROM invoices
WHERE invoicedate BETWEEN '2009-01-03' AND '2013-12-01';
ORDER BY invoicedate;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜에 대해 between값을 적용시켜 출력해보자.&lt;br /&gt;select의 invoicedate를 date로 묶은 이유는 invoicedate 레코드 출력값을 &lt;br /&gt;'YYYY-MM-DD' 형식으로 출력하고 싶기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;5. LIMIT&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;limit는 비용을 줄이기 위해 데이터를 출력하는 데 제한을 두는 SQL질의문이다. 기본 질의형식은 다음과 같다.&amp;nbsp;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;*너무 많은 데이터를 가져올 경우 어떤 문제가 발생할까?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;1. 필요 이상의 값이 나오면 어차피 사람이 직접 슬라이싱 해야 하는데 많이 귀찮음..실수할 가능성도 존재!&lt;/i&gt;&lt;br /&gt;&lt;i&gt;2. 필요업는 데이터를 계속 가져오게 되면 효율에 대한 이슈가 발생!&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;limit 질의.PNG&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deQAKo/btrXrT3U8YN/llKh553Vd3efcnkKmuQGa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deQAKo/btrXrT3U8YN/llKh553Vd3efcnkKmuQGa0/img.png&quot; data-alt=&quot;limit 질의법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deQAKo/btrXrT3U8YN/llKh553Vd3efcnkKmuQGa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeQAKo%2FbtrXrT3U8YN%2FllKh553Vd3efcnkKmuQGa0%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;271&quot; height=&quot;150&quot; data-filename=&quot;limit 질의.PNG&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;limit 질의법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;limit 뒤의 row_count 만큼 결과를 줄여서 보여줄 수 있다. &lt;span&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;row_count&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt; 는 양수&lt;/b&gt;&lt;/span&gt;가 되어야한다.&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;간단한 쿼리문을 통해 실습해보자.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674999309667&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, name
FROM tracks
LIMIT 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trackid와 name에 대해 tracks 테이블에서 10개의 레코드를 출력하는 쿼리문이다.&amp;nbsp;&lt;br /&gt;limit의 다양한 기능에 대해 더 알아보자.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;☝&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Offset&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;limit를 활용하면 레코드값이 1부터 카운트되지만. offset을 활용할 경우 해당 숫자부터 카운트하여 출력할 수 있다. &lt;br /&gt;단, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;offset은 0부터 시작&lt;/b&gt;&lt;/span&gt;이니, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;시작할 행 -1 값&lt;/b&gt;&lt;/span&gt;으로 기술해야 한다. &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&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: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;offset1.PNG&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v2rSR/btrXqr7B6sf/1BTP7MluoJcKIZBTKtRXqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v2rSR/btrXqr7B6sf/1BTP7MluoJcKIZBTKtRXqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v2rSR/btrXqr7B6sf/1BTP7MluoJcKIZBTKtRXqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2rSR%2FbtrXqr7B6sf%2F1BTP7MluoJcKIZBTKtRXqK%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;417&quot; height=&quot;222&quot; data-filename=&quot;offset1.PNG&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;offset2.PNG&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVrcfy/btrXnjpsWHW/v4kgeSdKmiIjfE82mkXbAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVrcfy/btrXnjpsWHW/v4kgeSdKmiIjfE82mkXbAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVrcfy/btrXnjpsWHW/v4kgeSdKmiIjfE82mkXbAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVrcfy%2FbtrXnjpsWHW%2Fv4kgeSdKmiIjfE82mkXbAK%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;346&quot; height=&quot;224&quot; data-filename=&quot;offset2.PNG&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;offset의 기본 질의형식이다. 둘 중 손에 익는 걸 사용하면 된다.&amp;nbsp;&lt;br /&gt;간단한 쿼리문을 통해 연습해보자.&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674999944972&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, name
FROM tracks
LIMIT 10 OFFSET 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 쿼리는 어떤 레코드를 출력하게 될까?&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;offset값이 10이니, 11번째 레코드부터 출력하게 된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;☝&lt;span style=&quot;color: #006dd7;&quot;&gt;Limit, Order by&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;limit와 order by를 같이 활용해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1675000567381&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, name, bytes
FROM tracks
ORDER BY bytes DESC
LIMIT 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿼리문의 경우 레코드를 bytes에 대한 내림차순으로 정렬하며 10개만 출력하는 결과를 갖게 된다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;☝&lt;span style=&quot;color: #006dd7;&quot;&gt;Limit을 활용한 가장 큰 값과 가장 작은 값 찾기&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;최대값과 최소값을 찾는 과정에서도 limit를 활용할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675000984941&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//가장 큰 값 찾기
SELECT trackid, name, bytes
FROM tracks
ORDER BY bytes DESC
LIMIT 1 OFFSET 1;

//가장 작은 값 찾기
SELECT trackid, name, bytes
FROM tracks
ORDER BY bytes ASC
LIMIT 1 OFFSET 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;offset을 잘 활용하면 n번째 값만 출력할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675001104181&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//세번째 큰 값 찾기
SELECT trackid, name, bytes
FROM tracks
ORDER BY bytes DESC
LIMIT 1 OFFSET 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;offset은 0부터 시작이니, offset 2 조건을 통해 &lt;span&gt;3번째 값만 얻을 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;자료: &lt;a href=&quot;https://www.youtube.com/watch?v=6DbQYXyPRuc&quot;&gt;https://www.youtube.com/watch?v=6DbQYXyPRuc&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에 SQL 질의에 대한 기본적인 것을 전부 정리하고 싶었지만, 생각보다 양이 많아졌다 . &lt;br /&gt;너무 길어지면 나중에 보기 힘드니, Where 이후에 대한 질의는 다음 포스팅에 정리하는 게 좋겠다.&lt;/p&gt;</description>
      <category>Study</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/106</guid>
      <comments>https://wkddnjs416.tistory.com/106#entry106comment</comments>
      <pubDate>Sat, 28 Jan 2023 16:31:10 +0900</pubDate>
    </item>
    <item>
      <title>동기와 비동기 통신</title>
      <link>https://wkddnjs416.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;br /&gt;동기 통신과 비동기 통신&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;오늘은 동기 통신과 비동기 통신의 차이에 대해 정리했다. 그림으로 표현하면 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;동기비동기.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzzDOS/btrXiPmzXgi/Rgxg2rCKnlDrQKfA1wbRI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzzDOS/btrXiPmzXgi/Rgxg2rCKnlDrQKfA1wbRI0/img.png&quot; data-alt=&quot;동기 통신과 비동기 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzzDOS/btrXiPmzXgi/Rgxg2rCKnlDrQKfA1wbRI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzzDOS%2FbtrXiPmzXgi%2FRgxg2rCKnlDrQKfA1wbRI0%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;820&quot; height=&quot;505&quot; data-filename=&quot;동기비동기.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동기 통신과 비동기 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;1. 동기(Synchronous)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;☝ 결과를 기다리는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;쉽게 말해, A -&amp;gt; B로 통신이 이루어졌을 경우 B가 데이터를 잘 받았는지 안받았는지에 대한 답을 A가 확인하고 진행하는 통신이라고 할 수 있다. 확인이 이루어지지 않는 경우 이후의 통신이 이루어지지 않는다. 이렇게 답변을 기다리는 상태를 Block 상태라고 한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;&lt;b&gt;* non bolck / sync&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;동기식 처리지만 non bolck 상태로 통신이 이루어지는 경우도 있다. 이 경우 동기식 처리라 요청에 대한 request를 받아야 하지만, request가 날아오는 동안 block상태를 유지하지 않고 다른 일을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;장점&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;통신이 이루어졌는지에 대한 콜백이 오기 때문에 정확히 처리할 수 있으며, 에러 역시 빨리 파악할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323; background-color: #f6e199;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;콜백이 오는 시간에 대한 비용이 발생한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;2. 비 동기(Asynchronous)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;☝ 결과를 기다리지 않는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;비동기식 통신의 경우, A -&amp;gt; B 간의 통신에서 B가 잘 받았는지에 대한 응답을 받지 않고 지속적으로 통신이 일어난다. 이처럼 비동기식 통신은 답변을 기다리지 않는 상태가 지속되는데, 이러한 상태를 Non Block 상태라고 한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;&lt;b&gt;* bolck / Async&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;비동기식 처리지만&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bolck 상태로 통신이 이루어지는 경우 역시 존재한다. 비동기식 처리 방법인데 굳이 block 상태로 있어야 하나 싶지만, 로직에 대한 개발자의 의도는 정말 다양하게에 이와 같이 구성하는 경우가 있다고 한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;장점&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;콜백을 기다리지 않고 다음 작업을 진행하기 때문에, 효율적이고 경제적이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323; background-color: #f6e199;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;콜백을 받지 않으니 통신에 대한 결과 확인이 잘 이루어지지 않는다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;3.   어떤게 좋을까?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;두가지 통신 방법은 어떤게 더 좋다는 차이가 아닌 방법론적 차이이기 때문에 서비스의 성격에 따라 선택하여 적용해야 한다. 가령 A-&amp;gt;B에게 현금 10,000원을 송금한다고 가정하자. 이 경우에는 동기식 처리가 적절하다. B라는 사람의 계좌에 10,000원이 들어왔다는 것을 확인하지 않으면 이후 발생하는 모든 거래/통신에 오류가 발생하기 때문이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;용어의 개념정리:&lt;br /&gt;https://www.youtube.com/watch?v=sN4E9_u7xQk&lt;br /&gt;테코톡:&lt;br /&gt;https://www.youtube.com/watch?v=oEIoqGd-Sns&lt;/p&gt;</description>
      <category>Study</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/105</guid>
      <comments>https://wkddnjs416.tistory.com/105#entry105comment</comments>
      <pubDate>Thu, 26 Jan 2023 21:31:56 +0900</pubDate>
    </item>
    <item>
      <title>SQL Inner Join과 Outer Join</title>
      <link>https://wkddnjs416.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #666666; color: #f6e199;&quot;&gt;&lt;b&gt;  Join이 무엇일까?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;join은 쉽게 &quot;여러개의 테이블을 연결하는 행위&quot; 라고 이해할 수 있다. &lt;br /&gt;이러한 join 중 많이 쓰이는 inner join과 outer join에 대해 정리하고자 한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;1. Inner Join&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;기준 테이블과 조인 테이블 모두 데이터가 존재해야 조회된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ijoin.PNG&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qgQAz/btrW4Gi86Uy/P2qFbWsw0T4z7ERjBTeohK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qgQAz/btrW4Gi86Uy/P2qFbWsw0T4z7ERjBTeohK/img.png&quot; data-alt=&quot;inner join 이란&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qgQAz/btrW4Gi86Uy/P2qFbWsw0T4z7ERjBTeohK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqgQAz%2FbtrW4Gi86Uy%2FP2qFbWsw0T4z7ERjBTeohK%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;373&quot; height=&quot;230&quot; data-filename=&quot;ijoin.PNG&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;inner join 이란&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 A테이블의 f와&amp;nbsp; B테이블의 f가 같은 경우 m / A.f / B.f / n을 가져온다는 뜻이다. 이처럼 inner join은 기준테이블과 조인테이블에 모두 데이터가 있어야 활용이 가능하다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이너조인.PNG&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mO1S3/btrWX5RyBtl/7bE343TQEUhyKybrnYY94k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mO1S3/btrWX5RyBtl/7bE343TQEUhyKybrnYY94k/img.png&quot; data-alt=&quot;inner join 활용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mO1S3/btrWX5RyBtl/7bE343TQEUhyKybrnYY94k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmO1S3%2FbtrWX5RyBtl%2F7bE343TQEUhyKybrnYY94k%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;369&quot; height=&quot;201&quot; data-filename=&quot;이너조인.PNG&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;inner join 활용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테이블 관계에서 &lt;b&gt;TrackId / name / title&lt;/b&gt; 을 조회한다고 가정해보자. &lt;br /&gt;아마 아래와 같은 퀴리문을 작성할 수 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674558730407&quot; class=&quot;n1ql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, name, title
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 알고자 하는 것은 tracks 테이블의 TrackId, name과 albums 테이블의 Title 이다. &lt;br /&gt;앨범 테이블의 PK가 트랙 테이블의 FK로 활용되고 있으므로 inner join의 조건에 추가시켜 조회한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;* PK -&amp;gt; 어떤 행을 특정할 수 있는 고유값&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;* FK -&amp;gt; PK를 다른 테이블에서 참조할 때&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;☝ 여러 테이블의 inner join&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이너조인 세개.PNG&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caJ9uz/btrWTK8HaJQ/EsEryM8skCt9tvr6okoEr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caJ9uz/btrWTK8HaJQ/EsEryM8skCt9tvr6okoEr1/img.png&quot; data-alt=&quot;여러 테이블의 inner join&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caJ9uz/btrWTK8HaJQ/EsEryM8skCt9tvr6okoEr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaJ9uz%2FbtrWTK8HaJQ%2FEsEryM8skCt9tvr6okoEr1%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;570&quot; height=&quot;204&quot; data-filename=&quot;이너조인 세개.PNG&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여러 테이블의 inner join&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TrackId / track.Name / Title / artists.name&lt;/b&gt; 을 조회해보자.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674559633579&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, track.name AS track, albums.title AS title, artists.name AS artist
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = tracks.artistid&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tracks 테이블에도 name이 있고, artists 테이블에도 name이 있기 때문에 AS문법을 통해 가시적으로 구분할 수 있게 한다. Inner Join이 여러개로 늘어났으면, 늘어난 만큼 조건을 명시해주면 된다.&lt;br /&gt;&lt;br /&gt;위 테이블에서 조건을 부여하여 특정한 데이터만 조회해보자. &lt;br /&gt;artistid가 10번인 경우만 출력할 수 있도록 조건을 부여한다. 그럼 아래와 같은 쿼리문이 완성될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674559884583&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT trackid, track.name AS track, albums.title AS title, artists.name AS artist
FROM tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
INNER JOIN artists ON artists.artistid = tracks.artistid
WHERE artists.artistid = 10;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join된 쿼리 역시 WHERE절을 통해 조건을 부여할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;inner join 활용 :&lt;br /&gt;&lt;span&gt;1. &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=D81QWILZTTE&quot;&gt;https://www.youtube.com/watch?v=D81QWILZTTE&lt;/a&gt;&lt;br /&gt;2. &lt;a href=&quot;https://www.youtube.com/watch?v=gsZ9pIR9vRU&quot;&gt;https://www.youtube.com/watch?v=gsZ9pIR9vRU&lt;/a&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;2. Outer Join&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;기준 테이블에만 데이터가 존재하면 조회된다. Outer Join 중 많이 쓰이는 Left Join에 대해 알아보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;레프트조인.PNG&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2GSZn/btrXim5xtiN/caKLebtKumhDPuMbvsz4lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2GSZn/btrXim5xtiN/caKLebtKumhDPuMbvsz4lk/img.png&quot; data-alt=&quot;Left Join&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2GSZn/btrXim5xtiN/caKLebtKumhDPuMbvsz4lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2GSZn%2FbtrXim5xtiN%2FcaKLebtKumhDPuMbvsz4lk%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;362&quot; height=&quot;247&quot; data-filename=&quot;레프트조인.PNG&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Left Join&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;left join의 기본 구조이다. A를 기준 테이블이라고 가정했을 때, B테이블을 조인시킨다. &lt;br /&gt;조인쿼리문은 inner join과 유사하다. A의 PK와 B의 FK 조건을 명시해준다. WHERE조건 역시 활용할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;span&gt;단, 기준 테이블에만 존재하는 데이터의 경우 위 그림과 같이 Null값이 출력된다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Left Join 활용&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lj사례.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YWpzA/btrXbrH1n9k/1laNVcwrKkLtuMFK8KNRv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YWpzA/btrXbrH1n9k/1laNVcwrKkLtuMFK8KNRv1/img.png&quot; data-alt=&quot;Left Join 활용 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YWpzA/btrXbrH1n9k/1laNVcwrKkLtuMFK8KNRv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYWpzA%2FbtrXbrH1n9k%2F1laNVcwrKkLtuMFK8KNRv1%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;371&quot; height=&quot;107&quot; data-filename=&quot;lj사례.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Left Join 활용 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위의 테이블 관계에서&amp;nbsp; atrists 테이블을 기준으로 albums 테이블을 Left Join 시켜 &lt;br /&gt;&lt;b&gt;ArtistId&lt;/b&gt;와 &lt;b&gt;AlbumId&lt;/b&gt;를 출력시켜보자.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674722656797&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT artists.artistid, albumid
FROM artists
LEFT JOIN albums ON artists.artistid = albums.artistid
ORDER BY albumid;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;LEFT JOIN ON을 통해 PK와 FK에 대한 조건을 기입하여 left join시켰으며, 출력값은 albumid를 통해 정렬될 것이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;☝ NOT NULL이 조건일 경우&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674724738555&quot; class=&quot;n1ql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT artists.artistid, albumid
FROM artists
LEFT JOIN albums ON artists.artistid = albums.artistid
WHERE albumid IS NOT NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;위와 같은 쿼리문이 있다. &lt;br /&gt;WHERE 절에 null값을 제외하는 조건을 부여하면&amp;nbsp; inner join으로 도출된 값과 같은 출력값이 나온다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;참조하는 테이블에 널값이 있는 경우를 제외한다는 의미는 기준 테이블과 참조 테이블 모두 데이터가 있어야 함을 의미하기 때문이다.&lt;br /&gt;&lt;br /&gt;outer join(left) 활용 참고 :&lt;br /&gt;&lt;span&gt;1.&lt;span&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=4imxlf_gWcw&quot;&gt;https://www.youtube.com/watch?v=4imxlf_gWcw&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/104</guid>
      <comments>https://wkddnjs416.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 23 Jan 2023 00:52:51 +0900</pubDate>
    </item>
    <item>
      <title>WAS 와 Web Server</title>
      <link>https://wkddnjs416.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;테크톡 자료가 확실히 이해하기 편하더라  역시 배운 사람들  &lt;br /&gt;앞으로 많이 찾아볼 것 같다. 그래서 오늘의 공부도 테크톡을 중심으로 이해하고 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크: &lt;a href=&quot;https://www.youtube.com/watch?v=mcnJcjbfjrs&quot;&gt;https://www.youtube.com/watch?v=mcnJcjbfjrs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;1.   Web server란?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;웹 브라우저(클라이언트)로부터 HTTP요청을 받아 HTML문서와 같은 &lt;span style=&quot;color: #006dd7; background-color: #f3c000;&quot;&gt;&lt;b&gt;정적 콘텐츠&lt;/b&gt;&lt;/span&gt;를 제공하는 프로그램&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web server.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcRbWy/btrWWslufC9/mHtcYYEXFI5P1TiFy8chKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcRbWy/btrWWslufC9/mHtcYYEXFI5P1TiFy8chKK/img.png&quot; data-alt=&quot;Web Server&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcRbWy/btrWWslufC9/mHtcYYEXFI5P1TiFy8chKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcRbWy%2FbtrWWslufC9%2FmHtcYYEXFI5P1TiFy8chKK%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;1000&quot; height=&quot;572&quot; data-filename=&quot;web server.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Web Server&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 클라이언트가 특정 패스로 특정 파일을 요청하게 되면, 웹서버에서는 그 파일을 DB에서 찾아서 클라이언트에게 응답해주는 것이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*&lt;/b&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;  정적 컨텐츠란?&lt;/b&gt;&lt;br /&gt;-&amp;gt; 사용자가 달라지더라도 바뀌지 않는 컨텐츠 (html. css, image...) 즉, 어느 사용자가 요청하더라도 항상 동일한 컨텐츠를 말한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;2.   그럼 WAS는?&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;클라이언트의 요청이 동적 컨텐츠일 경우, Web Application Server 로 전달하여 처리한다. 즉,&amp;nbsp; DB조회나 다양한 로직처리를 요구하는 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;동적 컨텐츠&lt;/span&gt;&lt;/b&gt;를 제공하기 위해 만들어진 프로그램&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;was.png&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGJxX/btrWRWnOqfr/mbBcqORTxkgH2lzUmvKimk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGJxX/btrWRWnOqfr/mbBcqORTxkgH2lzUmvKimk/img.png&quot; data-alt=&quot;WAS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGJxX/btrWRWnOqfr/mbBcqORTxkgH2lzUmvKimk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGJxX%2FbtrWRWnOqfr%2FmbBcqORTxkgH2lzUmvKimk%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;1742&quot; height=&quot;1262&quot; data-filename=&quot;was.png&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WAS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;웹서버와는 다르게 Alice라는 인자를 받게 되면 WAS를 통해 DB에서 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Alice와 관련된 데이터를 찾거나, 필요한 가공을 하여 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Alice에 대한 response로 반환한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;  동적 컨텐츠란?&lt;/b&gt;&lt;br /&gt;-&amp;gt; 정적 컨텐츠와는 달리 요청 인자값에 의해 컨텐츠의 내용이 바뀌는 것이라고 할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&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; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;정적 컨텐츠&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;동적 컨텐츠&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sc.PNG&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bntlqt/btrWUG5yT6p/UKWhUkkDB8h0J98vzNUrJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bntlqt/btrWUG5yT6p/UKWhUkkDB8h0J98vzNUrJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bntlqt/btrWUG5yT6p/UKWhUkkDB8h0J98vzNUrJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbntlqt%2FbtrWUG5yT6p%2FUKWhUkkDB8h0J98vzNUrJk%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;452&quot; height=&quot;228&quot; data-filename=&quot;sc.PNG&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc.PNG&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peNTC/btrWS3GLJ08/qLj07Xy4NplhmM88P1XAgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peNTC/btrWS3GLJ08/qLj07Xy4NplhmM88P1XAgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peNTC/btrWS3GLJ08/qLj07Xy4NplhmM88P1XAgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpeNTC%2FbtrWS3GLJ08%2FqLj07Xy4NplhmM88P1XAgk%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;340&quot; data-filename=&quot;dc.PNG&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;WAS의 기능&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;br /&gt;1. 클라이언트로부터 HTTP요청을 받을 수 있다. -&amp;gt; 대부분의 WAS는 Web Server를 내장하고 있기 때문에&lt;br /&gt;2. 따라서, 요청에 맞는 정적 컨텐츠를 제공할 수 있다.&amp;nbsp;&lt;br /&gt;3. DB조회나 로직처리를 통해 다양한 동적 컨텐츠 역시 제공할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;3.   그럼, 굳이&amp;nbsp; Web Server가 왜 필요한거야?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;☝. Web Server를 같이 사용했을 때의 장점&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;&lt;b&gt;1. 책임 분할을 통한 서버 부하 방지&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;-&amp;gt; 정적 컨텐츠는 WS, 동적 컨텐츠는 WAS가 담당할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;책임분할.PNG&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KRvjH/btrWUbYWhx9/Ku3UcMDrbxTPkQfj1HD4C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KRvjH/btrWUbYWhx9/Ku3UcMDrbxTPkQfj1HD4C0/img.png&quot; data-alt=&quot;Nginx web server config 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KRvjH/btrWUbYWhx9/Ku3UcMDrbxTPkQfj1HD4C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKRvjH%2FbtrWUbYWhx9%2FKu3UcMDrbxTPkQfj1HD4C0%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;373&quot; height=&quot;239&quot; data-filename=&quot;책임분할.PNG&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Nginx web server config 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;-&amp;gt; images와 관련된 요청이 오게 되면 web server로 이동할 수 있게&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;2. 로드밸런싱&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;-&amp;gt; 앞단에 웹서버를 두고 뒷단에 여러대의 WAS를 세팅하여 여러 WAS에 나누어 처리할 수 있도록 설정할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;로드밸런싱.PNG&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgr1US/btrWXjWpBbG/mKPcS0QfxTS43ztLunwksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgr1US/btrWXjWpBbG/mKPcS0QfxTS43ztLunwksK/img.png&quot; data-alt=&quot;WAS의 로드밸런싱&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgr1US/btrWXjWpBbG/mKPcS0QfxTS43ztLunwksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgr1US%2FbtrWXjWpBbG%2FmKPcS0QfxTS43ztLunwksK%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;909&quot; height=&quot;505&quot; data-filename=&quot;로드밸런싱.PNG&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WAS의 로드밸런싱&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;* 로드밸런싱 HealthCheck&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;서버에 주기적으로 HTTP 요청을 보내 서버의 상태를 확인 (ex, 특정 url요청에 200응답이 오는지 -&amp;gt;요청이 오지 않는다면 그 서버로 더이상 요청을 전달하지 않게 설정)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;헬스체크.PNG&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brmsqf/btrWRCJSngX/KqjAaKqcjLlQjNh9fsFDeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brmsqf/btrWRCJSngX/KqjAaKqcjLlQjNh9fsFDeK/img.png&quot; data-alt=&quot;healthCheck config&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brmsqf/btrWRCJSngX/KqjAaKqcjLlQjNh9fsFDeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrmsqf%2FbtrWRCJSngX%2FKqjAaKqcjLlQjNh9fsFDeK%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;814&quot; height=&quot;160&quot; data-filename=&quot;헬스체크.PNG&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;healthCheck config&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;interval&lt;/b&gt; -&amp;gt; 서버 상태를 확인하는 요청을 날리는 주기 (default : 5s)&lt;br /&gt;&lt;b&gt;fails&lt;/b&gt; -&amp;gt; n회 연속 실패하면 서버가 비정상임을 인지 / 위 그림의 경우 3회 연속 실패 시 비정상 (default : 1)&lt;br /&gt;&lt;b&gt;passes&lt;/b&gt; -&amp;gt; 서버가 다시 복구되어 요청이 n회 연속 성공하면 서버가 정상임을 인지 &lt;br /&gt;/ 위 그림의 경우 2회 연속 성공 시 정상 (default : 1)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;3. 보안 강화&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;WAS 같은 경우 DB접근권한을 가질 수 있기 때문에 웹에 직접적으로 노출이 되면 위험할 수 있는데, WS의 리버스 프록시를 통해 WAS 의 외부노출을 최소화할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프록시.PNG&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PbIKC/btrWRRmCwIR/hkpAkSr9VHDBiktxxWk9MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PbIKC/btrWRRmCwIR/hkpAkSr9VHDBiktxxWk9MK/img.png&quot; data-alt=&quot;WS의 리버스 프록시를 통해 WAS의 노출을 최소화시킨 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PbIKC/btrWRRmCwIR/hkpAkSr9VHDBiktxxWk9MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPbIKC%2FbtrWRRmCwIR%2FhkpAkSr9VHDBiktxxWk9MK%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;592&quot; height=&quot;308&quot; data-filename=&quot;프록시.PNG&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WS의 리버스 프록시를 통해 WAS의 노출을 최소화시킨 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참고: &lt;br /&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/103</guid>
      <comments>https://wkddnjs416.tistory.com/103#entry103comment</comments>
      <pubDate>Sun, 22 Jan 2023 22:19:21 +0900</pubDate>
    </item>
    <item>
      <title>면접</title>
      <link>https://wkddnjs416.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 정리하고 개념을 공부함과 동시에 기업 면접을 많이 가지고 있다. 면접을 볼때마다 내가 배울 점이 생기는 것 같다  연휴를 이용해 내가 약했던 개념이나 몰랐던 것, 알면 좋을 것들을 정리해야겠다.&lt;/p&gt;</description>
      <category>TIL</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/102</guid>
      <comments>https://wkddnjs416.tistory.com/102#entry102comment</comments>
      <pubDate>Sun, 22 Jan 2023 22:15:05 +0900</pubDate>
    </item>
    <item>
      <title>프로세스와 스레드</title>
      <link>https://wkddnjs416.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;프로세스와 스레드에 대해&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;정리하기 전에 많이 사용하는 키워드에 대한 정리를 하고 넘어가자.&lt;br /&gt;수강생의 입장으로 이해하고, 공부하면 좋을 것 같아 우아한 테크코스 테코톡의 자료를 참고했다&lt;br /&gt;링크:&amp;nbsp; &lt;a href=&quot;https://www.youtube.com/watch?v=1grtWKqTn50&quot;&gt;https://www.youtube.com/watch?v=1grtWKqTn50&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) &lt;b&gt;실행단위&lt;/b&gt; : CPU core에서 실행하는 하나의 단위로, 프로세스와 스레드를 포괄하는 개념. 한 코어에 한개씩 적재되는 것을 말함 -&amp;gt; 실행단위가 프로세스일 때도, 스레드일 때도 있음.&lt;br /&gt;&lt;br /&gt;2) &lt;b&gt;동시성&lt;/b&gt; : 한 순간에 여러가지 일이 아니라,&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt; 짧은 전환&lt;/span&gt;&lt;/b&gt;으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것&lt;br /&gt;&lt;i&gt;* 부연 설명이 없는 프로세스는 하나의 스레드만 가지고 있는 단일 스레드 프로세스를 의미 -&amp;gt; 프로세스와 스레드는 완전히 구별되는 개념이 아님!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;1. &lt;b&gt; &lt;/b&gt;프로세스 vs 프로그램?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674390714765&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;프로세스는 프로그램이 실행된 것이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를 들어, 우리가 가게에서 햄버거를 하나 주문했다고 가정하자. 이윽고 점원이 주문한 햄버거를 가져왔는데, 내용물을 보니 종이로 된 햄버거 레시피가 들어있는 것이다. 우리는 이것을 햄버거라고 할 수 있을까? 절대 그렇지 않다.&amp;nbsp; 여기서 레시피는 우리가 구현하고 있는 코드 파일을 의미한다. 이것은 프로그램이다. 프로그램 자체는 실행 시키기 전에는 그저 코드가 구현되어 있는 파일일 뿐이다. 이 파일을 사용하기 위해서는 코드가 실행이 되어서 사용할 수 있는 무언가가 되어야 하는데, 이것이 바로 햄버거와 같은 프로세스이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;그렇다면, 프로그램이 프로세스가 되면서 어떤 일이 일어날까?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;1) 프로세스가 필요로 하는 재료들이 메모리에 올라간다. 메모리는 4가지 영역으로 나뉘어있다.&lt;br /&gt;&lt;br /&gt;* 메모리 영역의 구분&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Code -&amp;gt; 실행 명령을 포함하는 코드들&lt;/li&gt;
&lt;li&gt;Data -&amp;gt; Static 변수 혹은 Global 변수&lt;/li&gt;
&lt;li&gt;Heap -&amp;gt; 동적 메모리 영역&lt;/li&gt;
&lt;li&gt;Stack -&amp;gt; 지역변수 /매개변수 /반환값 등등 일시적인 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 해당 프로세스에 대한 정보를 가지고 있는 PCB블럭이 프로세스 생성 시 함께 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;2. 프로세스 vs 스레드&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674390784165&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;컨텍스트 스위칭에 대한 효율성에서 스레드가 우세한 성능을 보인다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 다수의 프로세스를 동시에 실행할 경우, &lt;b&gt;&lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;시분할로 전환&lt;/span&gt;&lt;/b&gt;하여 실행시킨다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시분할.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0xhR/btrWRXmdtka/NAzNgggbqvuto1e8j7Gtz1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0xhR/btrWRXmdtka/NAzNgggbqvuto1e8j7Gtz1/img.gif&quot; data-alt=&quot;두 프로세스의 컨텍스트 스위칭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0xhR/btrWRXmdtka/NAzNgggbqvuto1e8j7Gtz1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/u0xhR/btrWRXmdtka/NAzNgggbqvuto1e8j7Gtz1/img.gif&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;498&quot; height=&quot;278&quot; data-filename=&quot;시분할.gif&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 프로세스의 컨텍스트 스위칭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 두 개의&amp;nbsp; 프로세스에 대한 컨테스트 스위칭이 일어난 것인데도 굉장히 피곤한 작업임을 알 수 있다. 이러한 비효율성을 보완하여 등장한 것이 스레드이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스레드.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjXaC/btrWWsk4Khm/e0T1ayHJho7R3GdbDugCmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjXaC/btrWWsk4Khm/e0T1ayHJho7R3GdbDugCmk/img.png&quot; data-alt=&quot;스레드의 컨텍스트 스위칭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjXaC/btrWWsk4Khm/e0T1ayHJho7R3GdbDugCmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjXaC%2FbtrWWsk4Khm%2Fe0T1ayHJho7R3GdbDugCmk%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;812&quot; height=&quot;227&quot; data-filename=&quot;스레드.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스레드의 컨텍스트 스위칭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스와 달리 스레드의 스위칭은 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;공유되는 자원&lt;/span&gt;&lt;/b&gt;이 존재한다. 프로세스의 메모리 구조 중 코드/ 데이터/ 힙 영역을 공유자원으로써 활용한다. 각 스레드는 스택 부분만을 가지고 있는 것이다. 공유자원이 있기 때문에, 컨텍스트 스위칭이 일어날 경우 캐싱 적중률이 올라간다.&amp;nbsp; &lt;i&gt;-&amp;gt; 모조리 다 빼고 다시 넣을 필요가 없다는 의미!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;3. 멀티 프로세스 vs 멀티 스레드&lt;/span&gt; &lt;br /&gt;&lt;/b&gt;두가지 개념 모두 한 어플리케이션에 대한 처리방식의 일종이다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시.&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- 여러 사용자가 로그인을 요청하는 경우 -&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 멀티 프로세스&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;멀티프로세스.jpg&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS8Ui9/btrWYNoRQki/cmUtx0pm6greoovyGhRdTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS8Ui9/btrWYNoRQki/cmUtx0pm6greoovyGhRdTK/img.jpg&quot; data-alt=&quot;멀티 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS8Ui9/btrWYNoRQki/cmUtx0pm6greoovyGhRdTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS8Ui9%2FbtrWYNoRQki%2FcmUtx0pm6greoovyGhRdTK%2Fimg.jpg&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;325&quot; height=&quot;303&quot; data-filename=&quot;멀티프로세스.jpg&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멀티 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fork를 통해 자식 프로세스를 여러개 생성하여 일을 처리한다. 이때, 자식 프로세스는 부모와 별개의 메모리영역을 확보하기 때문에&amp;nbsp; &lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;자원소모적이며 컨택스트 스위칭 비용이 크게 발생&lt;/span&gt;&lt;/b&gt;한다. 하지만 각각의 작업이 독립적이라 IPC를 사용한 통신이 이루어지지만 각각의 작업에 대한 동기화 작업을 요구하진 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 멀티 스레드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;멀티스레드.jpg&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yg8La/btrWTK0YTIY/ZaBJTGmKL1WtLoWyisxCk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yg8La/btrWTK0YTIY/ZaBJTGmKL1WtLoWyisxCk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yg8La/btrWTK0YTIY/ZaBJTGmKL1WtLoWyisxCk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYg8La%2FbtrWTK0YTIY%2FZaBJTGmKL1WtLoWyisxCk0%2Fimg.jpg&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;454&quot; height=&quot;277&quot; data-filename=&quot;멀티스레드.jpg&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 /데이터 /힙 영역을 공유하는 한 프로세스 내에서 구분된 실행단위이다. 공유된 자원으로 통신 비용을 절감할 수 있고 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;메모리가 효율적이며 컨택스트 비용 역시 경제적&lt;/span&gt;&lt;/b&gt;이다. 하지만 지속적인 공유자원 관리가 필요하다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;*멀티 스레드가 더 좋아보이는데, 멀티 프로세스는 왜 사용하는 걸까?&lt;/i&gt;&lt;br /&gt;멀티 스레드의 경우 긴밀하게 연결이 되어있기 때문에, 한 스레드에 문제가 생기면 전체의 프로세스에 영향을 미칠 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;4. &lt;b&gt;&lt;b&gt;  &lt;/b&gt;&lt;/b&gt;멀티코어는 뭘까?&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;멀티프로세스와 멀티스레드는 처리방식의 일종이기 때문에 소프트웨어적 성격에 가깝고, 멀티코어는 하드웨어에 가깝다. 멀티코어와 관련된 키워드는 &lt;span style=&quot;background-color: #f6e199; color: #006dd7;&quot;&gt;&lt;b&gt;동시성&lt;/b&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #006dd7; background-color: #f6e199;&quot;&gt;&lt;b&gt;병렬처리&lt;/b&gt;&lt;/span&gt;가 있다. 멀티코어의 경우 시분할로 이루어지는 동시성이 아닌 병렬처리방식이다. 물리적으로 여러 코어를 사용하여 다수의 실행단위를 한꺼번에 진행시킨다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;참고 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&quot;&gt;https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/101</guid>
      <comments>https://wkddnjs416.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 6 Jan 2023 17:35:58 +0900</pubDate>
    </item>
    <item>
      <title>아쉬운 마무리</title>
      <link>https://wkddnjs416.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;면접 결과가 나왔다. &lt;br /&gt;&lt;br /&gt;생각보다 일찍 나와서 설레는 마음으로 확인해보니 불합격..  준비 많이 했는데 아쉽다. 10기를 지원하기에는 시작적 여유가 없을 것 같다. ssafy준비하느라 잠시 미뤄둔 개발 공부와 프로젝트 정리를 하면서 개발자가 되기 위해 준비하자&lt;/p&gt;</description>
      <category>TIL</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/100</guid>
      <comments>https://wkddnjs416.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 27 Dec 2022 19:29:47 +0900</pubDate>
    </item>
    <item>
      <title>SSAFY 1차 합격</title>
      <link>https://wkddnjs416.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1차 적성진단에 합격했다 . 문제를 다 못풀어 걱정했는데, 운이 좋았던 것 같다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  어떻게 공부했나&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;saf.jpg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkTi18/btrULOZoj8e/bOrhbdVyOIiVN7dnxIkPv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkTi18/btrULOZoj8e/bOrhbdVyOIiVN7dnxIkPv1/img.jpg&quot; data-alt=&quot;내가 산 교보재&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkTi18/btrULOZoj8e/bOrhbdVyOIiVN7dnxIkPv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkTi18%2FbtrULOZoj8e%2FbOrhbdVyOIiVN7dnxIkPv1%2Fimg.jpg&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;458&quot; height=&quot;629&quot; data-filename=&quot;saf.jpg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내가 산 교보재&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제유형에 익숙해지는 것이 먼저라고 생각했기 떄문에 시중에서 판매하는 교재를 활용했다. 유튜브로 찾아보니, 준비 방법을 크게 3가지로 구분할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 시중의 교보재 활용&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. SSAFY 입과 전문 강의 구매 / 학원 수강&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3. 문제파악 후 인터넷에 돌아다니는 인적성 문제로 연습하기 -&amp;gt; &lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;GSAT을 좀&amp;nbsp; 풀어본 사람들에게 주로 추천하는 것 같다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2번은 너무 낭비라는 생각이 들었고, 3번으로 접근하기엔 내 인적성 문제풀이 경험이 부족하다고 생각했기 때문에 시중의 교보재를 활용하기로 했다. 집앞 서점으로 가서 바로 구매완료 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교재에는 4일 끝장이라고 써있지만, 나는 4일만에 준비하는 것이 아니니 천천히 한바퀴 돌리면서 어떤 문제가 나오는 지, 외워야 하는 개념들이 뭔지 파악하고 부족한 개념은 유튜브 영상을 통해 보충했다. 이후로 내가 생각하는 '수리/추리'에 관련된 문제 위주로 복습하며 풀이 위주의 시간을 보냈다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;CT문제풀이는 SWEA의 D1-D3문제들을 추천하더라. 하지만 비전공자 전형은 코테를 따로 보지 않고 손코딩을 한다고 하니 크게 시간들여 준비하지는 않았다. 그냥 가끔 알고리즘 문제를 풀면서 감을 잃지 않게만 준비했다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  앞으로 면접은?&lt;br /&gt;&lt;/b&gt;1차 합격의 기쁨은 잠시 미뤄두고, 면접준비를 해야겠다. 대면 스터디를 많이 추천하니까 우선 같은 지역의 지원자들을 모아 면접스터디를 만들 생각이다.&lt;/p&gt;</description>
      <category>TIL</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/99</guid>
      <comments>https://wkddnjs416.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 29 Nov 2022 16:34:22 +0900</pubDate>
    </item>
    <item>
      <title>SSAFY</title>
      <link>https://wkddnjs416.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;항해99를 끝마치자 마자 SSAFY &lt;span&gt;9기 모집&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공고를 확인했다. 개인적으로 관심이 많던 교육이라, 공고를 보자마자 지원하기로 마음먹었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 것 때문에 관심을 가졌나?&lt;br /&gt;&lt;/b&gt;1년동안 비슷한 목표의식을 가진 진단 속에서 개발 경험을 할 수 있다는 것이 가장 큰 장점이라고 생각했다. 항해에서 교육을 받았다지만, 개인적인 욕심으로 더 공부하길 원했다. 이 점에서 장기간 개발 교육을 진행하는 SSAFY는 나에게 굉장히 큰 메리트로 다가왔다. 또한 SSAFY의 공동체속에서 소속감을 느끼며 비슷한 위치의 예비 개발자들과 장기적인 교류가 가능할 것이라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;붙을 지 안붙을 지 확신할 수 없지만 당분간 개발 공부보다는 SSAFY 입과에 집중할 생각이다.&amp;nbsp; 다음&amp;nbsp; TIL은 합격 소식을 적을 수 있으면 좋겠다 &lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>TIL</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/98</guid>
      <comments>https://wkddnjs416.tistory.com/98#entry98comment</comments>
      <pubDate>Wed, 2 Nov 2022 15:59:47 +0900</pubDate>
    </item>
    <item>
      <title>백준 알고리즘 도전</title>
      <link>https://wkddnjs416.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2022.10.31 TIL&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;오늘부터 TIL의 성격을 바꿔보려고 한다. 원래 TIL을 쓸 때에는 그날의 공부를 기록하는 것 위주로 작성했는데, 오늘부터는 그냥 가변게, 공부하며 느낀 점을 쓰고 그날의 공부는 따로 카테고리를 파서 정리하려고 한다. &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;s&gt;&lt;i&gt;(카테고리로 인한 블로그 글의 객체화...이것이 java에 대한 실천이 아닐까..?)&lt;/i&gt;&lt;/s&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;어쨌던, 앞으로는 TIL이 살짝 일기장처럼 바뀔 것 같다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;프로그래머스 알고리즘도 좋지만, 백준 알고리즘도 도전해보려 한다. 이제껏 참고한 여러 블로그에 많이 백준 알고리즘을 풀었더라.&amp;nbsp; 그래서 백준 알고리즘도 풀고 알고리즘 카테고리에 기록하려 했는데, 오늘 푼것은 간단한 사칙연산 문제라 따로 기록하진 않았다. 다만 백준 처음 들어갈 때 많이 헷갈렸다. 프로그래머스처럼 솔루션 네임이 정해진 것도 아니고, 항상 클래스도 Main으로 고정하지 않으면 컴파일 에러가 발생한다. 매서드의 인자값도 따로 기입하진 않고, 아직까지는 Scanner만 활용하여 풀었다. 안 그러면 에러난다는 글이 많이 보였고, 역시 컴파일 에러가 나왔기 때문이다. 친절하게 (no main) 이라던지, 설명이 나왔던 것 같다.&lt;br /&gt;&lt;br /&gt;다만 백준은 항상 static에 void고정인지, 매서드 인자값은 계속 배재하는 것인지 궁금하긴 하다. 하나 불편한 점은, 문제를 읽고 코드 쓰러 가다가 문제 까먹어서 다시 문제로 돌아가면 코드가 날아간다는 것이다. 코드를 지키기 위해 ctrl + c/v습관이 다시 생길 것 같다. 개인적으로는 프로그래머스가 좀 더 사용하기 편했다.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL</category>
      <author>융벅</author>
      <guid isPermaLink="true">https://wkddnjs416.tistory.com/97</guid>
      <comments>https://wkddnjs416.tistory.com/97#entry97comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:21:06 +0900</pubDate>
    </item>
  </channel>
</rss>