<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>내가 한 노력들</title>
    <link>https://bill1224.tistory.com/</link>
    <description>WEB 개발과 관련된 지식을 기록하고자</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 22:42:09 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JONGI-N CHOI</managingEditor>
    <image>
      <title>내가 한 노력들</title>
      <url>https://tistory1.daumcdn.net/tistory/3978816/attach/f9e930dd7d0340d9800c643dedbf9255</url>
      <link>https://bill1224.tistory.com</link>
    </image>
    <item>
      <title>[ MySQL ] 외래키 설정으로 인한, 데이터 삭제 변경이 안되는 경우 해결 방법 3가지</title>
      <link>https://bill1224.tistory.com/444</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 InnoDB엔진을 사용하는 경우, 외래키를 사용할 수 있습니다.&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;또한, 부모와 자식 테이블의 관계를 생각안하고 데이터를 삭제 및 변경 하는 경우에도 작업이 실패하는 경우게 생기게됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720513660012&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 에러는, 외래키 관계를 생각안하고 데이터를 삭제 및 변경을 시도하는 경우에 발생하는 에러입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 외래키 설정으로 인해서 데이터를 변경 및 삭제가 실패하는 경우를 해결하는 방법에 대해서 설명해보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;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;h3 data-ke-size=&quot;size23&quot;&gt;실습을 위한 테이블 생성 및 데이터 추가&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1720514798840&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE table1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    column1 VARCHAR(10),
    column2 VARCHAR(10)
);

CREATE TABLE table2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    table_id INT,
    column1 VARCHAR(10),
    FOREIGN KEY (table_id) REFERENCES table1(id)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table1과 table2를 추가하여, table2의 table_id 컬럼에 외래키를 설정하여 table1 과의 관계를 설정했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 테이블 : table1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 테이블 : table2&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720514911289&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO table1(column1, column2) VALUES ('A', 'B'), ('C', 'D'), ('E', 'F');
INSERT INTO table2(table_id, column1) VALUES (1, 'A'), (1, 'B'), (3, 'C');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자식 테이블의 데이터를 먼저 삭제&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모와 자식 테이블의 관계를 생각하여, 순서대로 자식의 테이블의 데이터를 먼저 삭제하고 부모 테이블의 데이터를 삭제를 하게 되면, 에러가 발생하지 않고 데이터를 삭제하는 것이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720514990564&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM table1 WHERE id = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 테이블에서 부모 테이블의 id컬럼값이 1인 레코드를 참조하고 있는 데이터를 먼저 삭제하기 전에, 부모 테이블의 레코드를 삭제하게 되면 ,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF8ZNH/btsItPugd6x/ErSl8E2YKoKjdqnkgG8Kz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF8ZNH/btsItPugd6x/ErSl8E2YKoKjdqnkgG8Kz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF8ZNH/btsItPugd6x/ErSl8E2YKoKjdqnkgG8Kz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF8ZNH%2FbtsItPugd6x%2FErSl8E2YKoKjdqnkgG8Kz1%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;78&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 에러가 발생하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720515173900&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM table2 WHERE table_id = 1;
DELETE FROM table1 WHERE id = 1;&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;CASCADE &amp;nbsp;/ SET NULL 사용&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 테이블의 레코드가 삭제시, 자식 테이블에서 연관이 되어있는 레코드를 같이 삭제하거나 해당 컬럼을 NULL로 변경해주는 설정을 추가하는 것이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720515422861&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOREIGN KEY (table_id) REFERENCES table1(id) ON [DELETE / UPDATE] [CASCADE / SET NULL]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 외래키 설정시에 같이 옵션으로 추가할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ON [DELETE/UPDATE] &amp;nbsp;: 삭제시 / 변경시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CASCADE : 동일한 작업 실시 (부모 테이블 레코드를 삭제하면 연관있는 자식 테이블 레코드도 삭제)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SET NULL : 부모 테이블의 레코드를 변경시 연관있는 자식 테이블의 레코드 해당 컬럼을 NULL로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720515719825&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE table2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    table_id INT,
    column1 VARCHAR(10),
    FOREIGN KEY (table_id) REFERENCES table1(id) ON DELETE CASCADE
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 테이블을 다시 생성하고, 외래키의 옵션에 ON DELETE CASCADE 설정을 추가합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720515694959&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM table1 WHERE id = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 상태에서 부모 테이블의 레코드를 삭제하게 되면, 에러가 발생하지 않고 실행할 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720515901638&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM table2;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 테이블을 확인해 보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3HPwR/btsItKzTyYh/KNKUxRsmzKPquPC4KXrwB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3HPwR/btsItKzTyYh/KNKUxRsmzKPquPC4KXrwB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3HPwR/btsItKzTyYh/KNKUxRsmzKPquPC4KXrwB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3HPwR%2FbtsItKzTyYh%2FKNKUxRsmzKPquPC4KXrwB0%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;294&quot; height=&quot;98&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table_id컬럼이 1의 값을 가지는 레코드도 부모 테이블과 함께 같이 삭제된 것을 확인 할 수 있습니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;시스템변수 foreign_key_checks 사용&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템변수 foreign_key_checks의 값을 OFF로 변경하게 되면, 외래키로 인한 테이블의 관계 체크 작업을 무시할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720513406685&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SET foreign_key_checks=OFF;
SET SESSION foreign_key_checks=OFF;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 두 명령은 동일한 작업을 합니다. (SESSION을 생략하면 자동으로 SESSION으로 실행됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720516147974&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE table2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    table_id INT,
    column1 VARCHAR(10),
    FOREIGN KEY (table_id) REFERENCES table1(id)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 테이블은 CASCADE등의 옵션을 추가하지 않은 외래키만 추가하여 생성했습니다.&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;pre id=&quot;code_1720516069260&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE FROM table1 WHERE id = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;foreign_key_checks값을 OFF로 변경 하기 전에는, 자식 테이블에서 부모 테이블의 레코드를 참조하고 있었기 때문에 에러가 발생했지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OFF로 변경한 뒤로는 에러없이 삭제되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️주의!&lt;br /&gt;foreign_key_checks의 값을 OFF로 변경하고, 위와같이 관계 상관없이 데이터를 변경할 수 있다고해서 두 테이블의 관계가 깨진 상태로 데이터를 유지해도 된다는 것은 아닙니다. 관계가 유지될 수 있도록 관련있는 자식 테이블 레코드도 삭제가 필요합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;또한, foreign_key_checks값이 OFF상태인 경우에는, CASCADE의 옵션도 무시하므로 주의가 필요합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 외래키 사용에 있어서 두 테이블의 관계를 맺어 개발시에 좋은 가이드 역할을 하기도 하지만, 데이터 작업시 연관 테이블간에 체크 과정으로 인한 작업 실패를 해결할 수 있는 방법에 대해서 알아봤습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/DB</category>
      <category>Cascade</category>
      <category>FOREIGN_KEY_CHECKS</category>
      <category>MySQL</category>
      <category>set null</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/444</guid>
      <comments>https://bill1224.tistory.com/444#entry444comment</comments>
      <pubDate>Tue, 9 Jul 2024 18:15:55 +0900</pubDate>
    </item>
    <item>
      <title>[ MySQL ]데이터베이스 문자열 함수 ( concat, substring, upper, lower)</title>
      <link>https://bill1224.tistory.com/443</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에서도 함수가 존재합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 알고있는 count, max, min, sum, avg같은 집계함수도 있지만, 그 외에도 굉장히 많은 함수들이 존재합니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;문자열&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;concat&lt;/li&gt;
&lt;li&gt;substring&lt;/li&gt;
&lt;li&gt;upper / lower&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열관련 함수는 위의 세가지 종류에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;concat&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 연결하고 싶은 경우에 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720083715733&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT concat(&quot;My Name is &quot;, &quot;JONGIN&quot;);&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;위와같이 &quot;My Name is &quot;라는 문자열과 &quot;JONGIN&quot;이라는 문자열을 합치기 위해 실행해보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kj4ah/btsImNrdfYH/bqSHoqKIlaKwCy8CTnW7vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kj4ah/btsImNrdfYH/bqSHoqKIlaKwCy8CTnW7vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kj4ah/btsImNrdfYH/bqSHoqKIlaKwCy8CTnW7vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKj4ah%2FbtsImNrdfYH%2FbqSHoqKIlaKwCy8CTnW7vk%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;392&quot; height=&quot;100&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;100&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;blockquote data-ke-style=&quot;style2&quot;&gt;결과 컬럼을 보면, 사용한 함수가 그대로 출력되기 때문에 가독성이 굉장히 떨어진다.&lt;br /&gt;그래서 보통 함수를 사용하는 경우에는 별칭과 함께 사용하는 것이 좋다.&amp;nbsp;&lt;br /&gt;예 : concat(&quot;My Name is &quot;, &quot;JONGIN&quot;) AS myName&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;concat함수의 매개변수로는 두개밖에 전달 못하는 것이아니라 여러개를 전달하는 것도 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720083939466&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT concat(&quot;My Name is &quot;, name, &quot;, email is &quot;, email) FROM users;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 여기서 주의할점은 concat으로 출력할 수 있는 문자열의 최대 길이에 제한이 있다는 것 입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720083973733&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW VARIABLES LIKE 'group_concat_max_len';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해서, 최대길이를 확인하는 것이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본값은 1024로 되어있습니다.&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;만약, 1024보다 더 길게 출력이 필요한 경우에는, 해당 변수값을 변경하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720084057816&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW VARIABLES LIKE 'group_concat_max_len';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;substring&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분 문자열을 추출하고 싶은 경우에 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720084120037&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT substring(&quot;JONGIN&quot;, 3, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substring함수는 3개의 매개변수를 전달 받을 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TjISm/btsImFtsIf8/4zmkdKPE7CfCX22COpCfC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TjISm/btsImFtsIf8/4zmkdKPE7CfCX22COpCfC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TjISm/btsImFtsIf8/4zmkdKPE7CfCX22COpCfC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTjISm%2FbtsImFtsIf8%2F4zmkdKPE7CfCX22COpCfC1%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;318&quot; height=&quot;104&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 NGI가 출력되는 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;인덱스를 3으로 지정했는데 GIN이아닌 NGI가 출력된 것에 대해서, 여기서 이상함을 느끼는 분들도 계실 수 있습니다.&amp;nbsp;&lt;br /&gt;프로그래밍 언어에서 인덱스의 시작은 0으로 시작하는게 보통이지만, 이 substring함수의 인덱스는 시작이 1부터 시작합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 음수를 지정하는 것도 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720084421402&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT substring(&quot;JONGIN&quot;, -3, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수를 붙히게 되면, 앞에서부터 인덱스가 시작되는게아니라 뒤에서부터 시작되게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dujy61/btsIoXZIQXR/jfOJHEJk8b9ytQd8gz5Xt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dujy61/btsIoXZIQXR/jfOJHEJk8b9ytQd8gz5Xt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dujy61/btsIoXZIQXR/jfOJHEJk8b9ytQd8gz5Xt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdujy61%2FbtsIoXZIQXR%2FjfOJHEJk8b9ytQd8gz5Xt0%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;689&quot; height=&quot;281&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 이미지를 참고하시면, -3을 인덱스로 전달했을 때, G가 시작 인덱스로 선택되는 것을 알 수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;upper / lower&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 모두 대문자 / 소문자로 변환할 때 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720084812752&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT upper(&quot;jongin&quot;); -- JONGIN
SELECT lower(&quot;JONGIN&quot;); -- jongin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용되는 문자열 함수에대해서 알아봤는데, MySQL에는 문자열에 관련된 함수가 굉장히 많이 존재합니다.&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;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&quot;&gt;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720085173073&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;MySQL :: MySQL 8.4 Reference Manual :: 14.8 String Functions and Operators&quot; data-og-description=&quot;14.8&amp;nbsp;String Functions and Operators Table&amp;nbsp;14.12&amp;nbsp;String Functions and Operators Name Description ASCII() Return numeric value of left-most character BIN() Return a string containing binary representation of a number BIT_LENGTH() Return length of argument&quot; data-og-host=&quot;dev.mysql.com&quot; data-og-source-url=&quot;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&quot; data-og-url=&quot;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.mysql.com/doc/refman/8.4/en/string-functions.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;MySQL :: MySQL 8.4 Reference Manual :: 14.8 String Functions and Operators&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;14.8&amp;nbsp;String Functions and Operators Table&amp;nbsp;14.12&amp;nbsp;String Functions and Operators Name Description ASCII() Return numeric value of left-most character BIN() Return a string containing binary representation of a number BIT_LENGTH() Return length of argument&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.mysql.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;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/DB</category>
      <category>concat</category>
      <category>Lower</category>
      <category>MySQL</category>
      <category>substring</category>
      <category>Upper</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/443</guid>
      <comments>https://bill1224.tistory.com/443#entry443comment</comments>
      <pubDate>Thu, 4 Jul 2024 18:23:31 +0900</pubDate>
    </item>
    <item>
      <title>[DB] 집계함수와 그룹핑(GROUP BY, HAVING)</title>
      <link>https://bill1224.tistory.com/442</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;집계함수&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT절에 사용되며, 여러 행으로부터 하나의 결가값을 반환하는 함수이다.&lt;br /&gt;종류에는 COUNT, SUM, MIN, MAX, AVG가 존재합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;COUNT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드의 수를 반환해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1719889822216&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT count(*) FROM customers;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;count(*)를 사용하게 되면, 모든 레코드 수를 반환하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3UC9/btsIkujAf4l/1kvjKnhRSqzQjUksJHrvVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3UC9/btsIkujAf4l/1kvjKnhRSqzQjUksJHrvVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3UC9/btsIkujAf4l/1kvjKnhRSqzQjUksJHrvVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3UC9%2FbtsIkujAf4l%2F1kvjKnhRSqzQjUksJHrvVk%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;262&quot; height=&quot;92&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;customers 테이블에는 총 120개의 레코드가 존재한다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️주의&lt;br /&gt;count 함수는 값이 NULL인 값은 집계하지 않습니다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1719889898383&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT count(first_name) FROM customers;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;first_name 컬럼에 대해서 카운트 함수를 사용하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3NIMv/btsIizGwfBW/nlwoPqF4bYwKCgcv1HzDSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3NIMv/btsIizGwfBW/nlwoPqF4bYwKCgcv1HzDSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3NIMv/btsIizGwfBW/nlwoPqF4bYwKCgcv1HzDSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3NIMv%2FbtsIizGwfBW%2FnlwoPqF4bYwKCgcv1HzDSk%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;254&quot; height=&quot;94&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;count(*)의 결과에서는 모든 레코드의 수가 반환되었지만, count(first_name)을 사용하게되면 NULL인 값을 제외하고 카운팅합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719890001271&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT count(*) FROM customers WHERE first_name IS NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서, NULL인 값만 카운팅해보면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjI8l1/btsIihzlUoV/TnYqxAHaA04DMJAK6IKSo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjI8l1/btsIihzlUoV/TnYqxAHaA04DMJAK6IKSo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjI8l1/btsIihzlUoV/TnYqxAHaA04DMJAK6IKSo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjI8l1%2FbtsIihzlUoV%2FTnYqxAHaA04DMJAK6IKSo0%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;256&quot; height=&quot;94&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6(120 - 114)가 반환되는 것을 확인할 수 있습니다.&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;SUM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자형 데이터 컬럼의 값의 합을 반환합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 64px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 10px; text-align: center;&quot;&gt;id&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 10px; text-align: center;&quot;&gt;name&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 10px; text-align: center;&quot;&gt;no_seats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;B&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 rooms 테이블이 존재할 때, no_seats 컬럼들의 합을 구하고 싶으면&lt;/p&gt;
&lt;pre id=&quot;code_1719890387506&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT sum(no_seats) FROM rooms;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;sum함수에 합을 구하고자하는 컬럼명을 전달합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCmmGB/btsIkuw5H0V/aCa965kuLuULSIPGj3TF30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCmmGB/btsIkuw5H0V/aCa965kuLuULSIPGj3TF30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCmmGB/btsIkuw5H0V/aCa965kuLuULSIPGj3TF30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCmmGB%2FbtsIkuw5H0V%2FaCa965kuLuULSIPGj3TF30%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;180&quot; height=&quot;86&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과, 144 (72 + 36 + 36)이 출력됩니다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsT2b/btsIkGqEN09/cpowaVTfaigNKdQais1Aqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsT2b/btsIkGqEN09/cpowaVTfaigNKdQais1Aqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsT2b/btsIkGqEN09/cpowaVTfaigNKdQais1Aqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsT2b%2FbtsIkGqEN09%2FcpowaVTfaigNKdQais1Aqk%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;204&quot; height=&quot;88&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 문자열 타입인 name 컬럼을 대상으로하면 0이 반환됩니다.&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;MIN &amp;amp; MAX&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼의 최소값과 최대값을 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719890629737&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT MIN(no_seats) FROM rooms;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 동일한 rooms 테이블을 대상으로 no_seats 컬럼의 최소값을 구해보면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAWqMU/btsIixhC7j8/WucAKb0brhC5GKboeLqoK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAWqMU/btsIixhC7j8/WucAKb0brhC5GKboeLqoK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAWqMU/btsIixhC7j8/WucAKb0brhC5GKboeLqoK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAWqMU%2FbtsIixhC7j8%2FWucAKb0brhC5GKboeLqoK1%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;186&quot; height=&quot;96&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1719890681870&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT max(no_seats) FROM rooms;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대값을 구해보면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ2ydr/btsIjhZFT9J/rDWrPxEvkPoyacOtlxRd3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ2ydr/btsIjhZFT9J/rDWrPxEvkPoyacOtlxRd3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ2ydr/btsIjhZFT9J/rDWrPxEvkPoyacOtlxRd3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ2ydr%2FbtsIjhZFT9J%2FrDWrPxEvkPoyacOtlxRd3k%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;186&quot; height=&quot;96&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;96&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;MIN과 MAX는 문자열에서도 사용이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719890731455&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT min(name) FROM rooms;&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_1719890778243&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name FROM rooms ORDER BY name LIMIT 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 SQL과 동일한 결과값이 출력됩니다.&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;MAX인 경우는,&lt;/p&gt;
&lt;pre id=&quot;code_1719890873001&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name FROM rooms ORDER BY name DESC LIMIT 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 SQL과 동일한 결과값이 출력됩니다.&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;AVG&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼의 평균값을 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719890975534&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT avg(no_seats) FROM rooms;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;no_seats의 평균을 구해보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/phyVn/btsIkuqkVDf/tS2KKjkp8kncX746l81zUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/phyVn/btsIkuqkVDf/tS2KKjkp8kncX746l81zUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/phyVn/btsIkuqkVDf/tS2KKjkp8kncX746l81zUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FphyVn%2FbtsIkuqkVDf%2FtS2KKjkp8kncX746l81zUk%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;180&quot; height=&quot;92&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;48 ((72 + 36 + 36) / 3)이 출력되는 것을 확인할 수 있습니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;그룹핑&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집계함수를 사용하다보면, 한가지 문제점을 겪을 수 있는데 SUM 함수를 사용하면서 다른 컬럼을 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;이러한 문제를 해결하기 위해서 여러행을 묶어서 출력하는 그룹핑 기능을 사용해야합니다.&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;GROUP BY&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY절을 사용해서, 그룹핑 기능을 사용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TwJHi/btsIj9AJzqE/QRd7yj0418fNGPDsYZ6Aqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TwJHi/btsIj9AJzqE/QRd7yj0418fNGPDsYZ6Aqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TwJHi/btsIj9AJzqE/QRd7yj0418fNGPDsYZ6Aqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTwJHi%2FbtsIj9AJzqE%2FQRd7yj0418fNGPDsYZ6Aqk%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;284&quot; height=&quot;276&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 rooms 테이블을 가지고 있다고 가정하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719907919688&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, count(*) AS total FROM rooms;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name을 그룹핑해서 카운팅 하고 싶어서 위와같이 SQL을 작성하게 되면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AdXsz/btsIk9NrGU0/c6YwlC996iS3EnzuvRiEM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AdXsz/btsIk9NrGU0/c6YwlC996iS3EnzuvRiEM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AdXsz/btsIk9NrGU0/c6YwlC996iS3EnzuvRiEM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAdXsz%2FbtsIk9NrGU0%2Fc6YwlC996iS3EnzuvRiEM0%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;556&quot; height=&quot;11&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 GROUP BY없이 집계되지 않은 컬럼을 사용했다는 내용의 에러가 발생하게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719908020185&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, count(*) AS total FROM rooms
GROUP BY name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY 절을 사용해서 name 컬럼을 그룹핑해주면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH7stC/btsIlU9RxL5/0njC8ZyAH3pmak9qeV7IB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH7stC/btsIlU9RxL5/0njC8ZyAH3pmak9qeV7IB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH7stC/btsIlU9RxL5/0njC8ZyAH3pmak9qeV7IB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH7stC%2FbtsIlU9RxL5%2F0njC8ZyAH3pmak9qeV7IB1%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;180&quot; height=&quot;182&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;182&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;blockquote data-ke-style=&quot;style2&quot;&gt;집계함수를 사용할 때, 별칭(AS)을 사용해서 원하는 컬럼명으로 변경하는 것이 가능합니다. &amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HAVING&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HAVING절은 WHERE절 처럼 레코드를 필터링하고 싶은 경우에 사용을 하는데, GROUP BY를 통해 그룹핑해서 얻은 데이터를 필터링할 때 사용합니다. 따라서, GROUP BY를 사용한 경우에만 쓸 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719908265763&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, sum(no_seats) AS total FROM rooms
GROUP BY name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name 별 no_seats 컬럼의 합을 확인해보면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wnmDN/btsIkHcDoCM/fDTniBbqiDKRObEnZv5oGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wnmDN/btsIkHcDoCM/fDTniBbqiDKRObEnZv5oGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wnmDN/btsIkHcDoCM/fDTniBbqiDKRObEnZv5oGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwnmDN%2FbtsIkHcDoCM%2FfDTniBbqiDKRObEnZv5oGK%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;180&quot; height=&quot;194&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 결과를 얻을 수 있는데, 여기서 total 값이 40 이상인 결과만 얻고 싶으면,&lt;/p&gt;
&lt;pre id=&quot;code_1719908331679&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, sum(no_seats) AS total FROM rooms
GROUP BY name
HAVING total &amp;gt;= 40;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY 다음에 HAVING 을 추가해주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxHFC/btsIj7iMRZB/dscvs1oTPZgEkRWN9sk4Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxHFC/btsIj7iMRZB/dscvs1oTPZgEkRWN9sk4Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxHFC/btsIj7iMRZB/dscvs1oTPZgEkRWN9sk4Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwxHFC%2FbtsIj7iMRZB%2Fdscvs1oTPZgEkRWN9sk4Y1%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;182&quot; height=&quot;150&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;total이 35였던 B의 레코드가 제외된 것을 확인할 수 있습니다.&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;pre id=&quot;code_1719908415762&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, sum(no_seats) AS total FROM rooms
GROUP BY name
HAVING total &amp;gt;= 40
AND name = 'C';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HAVING절도 WHERE절과 마찬가지로 AND나 OR등을 사용하는 것이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;⚠️주의할 점&lt;br /&gt;HAVING으로 필터링하는 것은 어디까지나 그룹핑해서 나온 결과 레코드를 대상으로 하는 필터링입니다.&amp;nbsp;&lt;br /&gt;따라서, HAVING을 통해서 SELECT에 포함되어있지 않은 다른 컬럼을 조건으로 사용하는 것은 불가능합니다.&lt;br /&gt;다른 컬럼을 조건으로 사용하고 싶은 경우에는 기존의 WHERE절을 통해서 처리합니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/DB</category>
      <category>AVG</category>
      <category>Count</category>
      <category>GROUP BY</category>
      <category>having</category>
      <category>MAX</category>
      <category>MIN</category>
      <category>MySQL</category>
      <category>SUM</category>
      <category>집계함수</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/442</guid>
      <comments>https://bill1224.tistory.com/442#entry442comment</comments>
      <pubDate>Tue, 2 Jul 2024 17:24:14 +0900</pubDate>
    </item>
    <item>
      <title>[DB] 데이터 베이스 정규화 (제 1 정규화, 제 2정규화, 제 3정규화)</title>
      <link>https://bill1224.tistory.com/441</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 베이스 정규화란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정으로, 데이터의 중복을 제거하는 것이 목적이다.&lt;br /&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;정규화의 단계에는 1NF, 2NF, 3NF, BCNF(보이스-코드 정규화), 4NF, 5NF가 존재하지만, 여기서는 3NF까지만 다루고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 3NF까지만 만족하더라도, 실무에서는 정규화 되었다고 말하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제 1 정규화(1NF)&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제1 정규화를 만족하기 위해서는 다음 3가지의 조건을 만족해야한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블은 기본키를 가지는 것&lt;/li&gt;
&lt;li&gt;반복되는 행이 존재하지 않는 것&lt;/li&gt;
&lt;li&gt;컬럼에는 오직 단일 값만이 존재하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daqlRl/btsIiqW1P5y/qiE6PecxmDuncILhpM6Tp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daqlRl/btsIiqW1P5y/qiE6PecxmDuncILhpM6Tp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daqlRl/btsIiqW1P5y/qiE6PecxmDuncILhpM6Tp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaqlRl%2FbtsIiqW1P5y%2FqiE6PecxmDuncILhpM6Tp1%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;480&quot; height=&quot;196&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 데이터를 보면 빨강색행이 완전히 중복하고 있기 때문에, &lt;code&gt;반복되는 행이 존재하지 않는 것&lt;/code&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uU5br/btsIkZDlu0W/KvvnzHBvUcA9ogW6Rp0y2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uU5br/btsIkZDlu0W/KvvnzHBvUcA9ogW6Rp0y2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uU5br/btsIkZDlu0W/KvvnzHBvUcA9ogW6Rp0y2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuU5br%2FbtsIkZDlu0W%2FKvvnzHBvUcA9ogW6Rp0y2K%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;465&quot; height=&quot;450&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 중복되는 행을 제거하고, 하나의 컬럼이 단일의 값을 가지도록 변경하면 1NF을 만족하게 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제 2 정규화(1NF)&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본키가 복합키로 구성된 경우가 대상이 되고, 아래의 두가지의 조건을 만족해야합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제1 정규화를 만족하는 것&lt;/li&gt;
&lt;li&gt;모든 열은 기본키 전체에 의존하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beQxiJ/btsIhUEfXeR/VKoPJqdJBSufNxIvgDGfP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beQxiJ/btsIhUEfXeR/VKoPJqdJBSufNxIvgDGfP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beQxiJ/btsIhUEfXeR/VKoPJqdJBSufNxIvgDGfP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeQxiJ%2FbtsIhUEfXeR%2FVKoPJqdJBSufNxIvgDGfP1%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;496&quot; height=&quot;316&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 데이터에서는, 이름과 과목 컬럼을 묶어서 기본키로 생성을 했고, 중복되는 행이 없으며 컬럼마다 단일 값을 가지고 있기 때문에 1NF을 만족하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 점수 컬럼은 이름과 과목 컬럼에 모두 의존하고 있지만, 지역 컬럼은 과목 컬럼에는 의존하지 않고 이름 컬럼에만 의존하는 형태를 하고 있기 때문에 &lt;code&gt;모든 열은 기본 키 전체에 의존하는 것&lt;/code&gt; 에 위배되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLp6Wb/btsIkqOOWlF/DePkNGx8Np9lVDfKrWCkyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLp6Wb/btsIkqOOWlF/DePkNGx8Np9lVDfKrWCkyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLp6Wb/btsIkqOOWlF/DePkNGx8Np9lVDfKrWCkyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLp6Wb%2FbtsIkqOOWlF%2FDePkNGx8Np9lVDfKrWCkyk%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;490&quot; height=&quot;167&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzxd0Q/btsIiPPQt2A/Kn3cqQLo83N93xIePbIQwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzxd0Q/btsIiPPQt2A/Kn3cqQLo83N93xIePbIQwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzxd0Q/btsIiPPQt2A/Kn3cqQLo83N93xIePbIQwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdzxd0Q%2FbtsIiPPQt2A%2FKn3cqQLo83N93xIePbIQwK%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;320&quot; height=&quot;162&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 두개의 테이블로 나누게 되면, 점수도 기본키(이름, 과목) 모두에 의존하게되고 지역도 기본키(이름)에 의존하게 되므로 2NF를 만족하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제 3 정규화&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제 2 정규화를 만족하는 것&lt;/li&gt;
&lt;li&gt;기본키가 아닌 컬럼들은 기본키에 의존해야하는데 다른 일반 컬럼에도 의존하는 컬럼이 존재해서는 안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본키에도 의존하지만, 기본키가 아닌 일반 컬럼에도 의존하는 것을 이전적 &lt;code&gt;함수 종속 관계&lt;/code&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHPv4M/btsIibTnGqc/V1VCsLu4YHewgEK5OsIpDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHPv4M/btsIibTnGqc/V1VCsLu4YHewgEK5OsIpDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHPv4M/btsIibTnGqc/V1VCsLu4YHewgEK5OsIpDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHPv4M%2FbtsIibTnGqc%2FV1VCsLu4YHewgEK5OsIpDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;118&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 테이블에는 기본키가 존재하고, 중복된 행이 없으며 단일 값을 가진 컬럼이므로 1NF를 만족하고, 담임과 담당과목 컬럼 모두 기본키 (학년, 반) 모두에 종속 되어 있으므로 2NF를 만족합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 담당과목은 기본키에도 의존하지만 기본키가 아닌 담임 컬럼에도 의존하고 있기 때문에 3NF 정규화를 위배하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg3LFJ/btsIj6QPbi2/AX7HgPNL4tIyJDhGHBAWKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg3LFJ/btsIj6QPbi2/AX7HgPNL4tIyJDhGHBAWKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg3LFJ/btsIj6QPbi2/AX7HgPNL4tIyJDhGHBAWKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg3LFJ%2FbtsIj6QPbi2%2FAX7HgPNL4tIyJDhGHBAWKK%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;449&quot; height=&quot;154&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPMkT/btsIigUxnlR/jiyPGPpQuomsYloywrKyK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPMkT/btsIigUxnlR/jiyPGPpQuomsYloywrKyK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPMkT/btsIigUxnlR/jiyPGPpQuomsYloywrKyK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPMkT%2FbtsIigUxnlR%2FjiyPGPpQuomsYloywrKyK0%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;294&quot; height=&quot;148&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 두 테이블로 분리하게 되면, 각 컬럼은 일반 컬럼에 의존하는 것이아니라 기본 컬럼에만 의존하기 때문에 3NF을 만족하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;blockquote data-ke-style=&quot;style2&quot;&gt;반정규화란?&lt;br /&gt;데이터베이스 성능 향상을 위해서, 데이터의 중복을 허용하고 조인을 줄여 성능을 향상하는 방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 반정규화에 대해서도 공부해서, 정리해보겠습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/DB</category>
      <category>1NF</category>
      <category>2NF</category>
      <category>3NF</category>
      <category>데이터베이스</category>
      <category>정규화</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/441</guid>
      <comments>https://bill1224.tistory.com/441#entry441comment</comments>
      <pubDate>Mon, 1 Jul 2024 22:22:07 +0900</pubDate>
    </item>
    <item>
      <title>컬럼 수정하기 (제약조건, 컬럼명, 데이터 타입)</title>
      <link>https://bill1224.tistory.com/440</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 새로운 컬럼을 추가 및 삭제하는 것부터,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 컬럼의 제약조건/컬럼명/데이터 타입을 수정하는 SQL을 정리해봤습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컬럼 추가 &amp;amp; 삭제&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
ADD COLUMN &amp;lt;column_name&amp;gt; &amp;lt;data_type&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 sql은 기본적 데이터 타입만 추가한 컬럼이지만, 그 외에도 제약조건이나 컬럼의 위치를 변경하는것도 가능하다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ALTER TABLE users
ADD COLUMN email VARCHAR(50) UNIQUE AFTER name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이, users 테이블에 email 컬럼을 추가하는데 데이터타입은 &lt;code&gt;VARCHAR(50)&lt;/code&gt;이고, &lt;code&gt;UNIQUE&lt;/code&gt; 제약조건을 가지며 name 컬럼 뒤에 위치시킨다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;삭제&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
DROP COLUMN &amp;lt;column_name&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제약조건 수정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본키 추가&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
ADD PRIMARY KEY (&amp;lt;column_name&amp;gt;);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본키 삭제&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
DROP PRIMARY KEY;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외래키 추가&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name1&amp;gt;
ADD CONSTRAINT &amp;lt;constraint_name&amp;gt;
FOREIGN KEY (&amp;lt;column_name1&amp;gt;) REFERENCES &amp;lt;table_name2&amp;gt;(&amp;lt;column_name2&amp;gt;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;&amp;lt;table_name1&amp;gt;&lt;/code&gt;과 &lt;code&gt;&amp;lt;column_name1&amp;gt;&lt;/code&gt;은 자식 테이블 이름과 컬럼명이고,&lt;br /&gt;&lt;code&gt;&amp;lt;table_name2&amp;gt;&lt;/code&gt;과 &lt;code&gt;&amp;lt;column_name2&amp;gt;&lt;/code&gt;은 부모 테이블 이름과 컬럼명입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외래키 삭제&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
DROP CONSTRAINT &amp;lt;constraint_name&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컬럼명&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법1&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
CHANGE &amp;lt;old_column_name&amp;gt; &amp;lt;new_column_name&amp;gt; &amp;lt;data_type&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;&amp;lt;data type&amp;gt;&lt;/code&gt;을 적어줘야한다. 컬럼명만 변경하고 싶은 경우에는 기존의 데이터 타입을 그대로 적으면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법2&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
RENAME COLUMN &amp;lt;old_column_name&amp;gt; TO &amp;lt;new_column_name&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법1과 다르게 데이터 타입을 적지 않고 컬럼명만 적으면 되기 때문에 방법2를 선호&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 타입&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법1&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
CHANGE &amp;lt;column_name&amp;gt; &amp;lt;column_name&amp;gt; &amp;lt;data_type&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼명을 수정할 때 사용했었던 CHANGE 를 통해서 데이터 타입을 바꾸는 것이 가능하다.&lt;br /&gt;컬럼명을 수정하는게 아니라, 데이터 타입만을 변경하는 것이기 때문에 대상의 컬럼명을 2번을 적어줘야할 필요성이 있다.&lt;br /&gt;이 과정에서 오타가 날 가능성이 높기 때문에 사용하지 않는편이 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법2&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER TABLE &amp;lt;table_name&amp;gt;
MODIFY COLUMN &amp;lt;column_name&amp;gt; &amp;lt;data_type&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHANGE 구문을 사용하면, 컬럼명과 데이터타입을 변경할 수 있기 때문에 한가지의 명령어만 알고 있으면 두개다 처리할 수 있는 장점은 있지만 한가지의 SQL이 너무 많은 역할을 하고 있기 때문에 복잡성과 불명확성이 높아질 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>IT 공부/DB</category>
      <category>MySQL</category>
      <category>데이터 타입</category>
      <category>제약조건</category>
      <category>컬럼명</category>
      <category>컬럼수정</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/440</guid>
      <comments>https://bill1224.tistory.com/440#entry440comment</comments>
      <pubDate>Mon, 24 Jun 2024 23:43:25 +0900</pubDate>
    </item>
    <item>
      <title>git - working directory, staging area, git repo 영역에 대해서</title>
      <link>https://bill1224.tistory.com/439</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 소규모 프로젝트부터 대규모 프로젝트까지 모든 것을 빠르고 효율적으로 처리하도록 설계된 무료 오픈 소스 분산 버전 제어 시스템&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;분산 버전제어시스템이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산형 버전제어시스템(DVCS, Distributed Version Control System)이란, 중앙에서 관리하고 있는 전체 프로젝트의 히스토리와 변경 내용을 복제하여, 로컬 환경에 저장소를 만들어 관리하는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서 왜 써야하는데?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자라면 당연히 알고있어야되고, 써야하는 것으로 잘 알려져있는 git은 도대체 왜 필요한 것 일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이직하기 전의 회사가, 버전관리시스템없는 환경이었기 때문에 얼마나 git(버전관리시스템)이 편리하고 중요한지에 대해 깨달을 수 있었습니다.&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;파일은 서버 파일 시스템으로부터 FTP를 이용해 다운로드하거나, 업로드하는 형식이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;어느날, 시스템에 문제가 있어서 해당 파일을 확인해보니 수정날짜가 변경되어있어 누군가 수정은 했지만, 누가? 무엇을? 수정했는지 추적하는 것이 불가능 했습니다. &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;(그리고, 아무도 자기가 수정했다고 말하는 사람이 없음...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, 옛날에 백업한 파일을 가지고 있던 사람이, 해당 파일을 그대로 옛날 버전으로 덮어씌우는 식으로 해결한 적이 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download-1.jpg&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXbalA/btsz5pdk21R/RjVJUDxYaaCZ7uy5Kh1gWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXbalA/btsz5pdk21R/RjVJUDxYaaCZ7uy5Kh1gWk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXbalA/btsz5pdk21R/RjVJUDxYaaCZ7uy5Kh1gWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXbalA%2Fbtsz5pdk21R%2FRjVJUDxYaaCZ7uy5Kh1gWk%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;259&quot; height=&quot;195&quot; data-filename=&quot;download-1.jpg&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 제외하더라도, 서버 내에는 여러 백업 파일(index.html_20231111, index_test.html, 등등...)이 그대로 남아있어, 프로젝트 관리도 점점 힘들어지고, 서버 용량에도 영향을 끼치기 때문에 버전관리시스템의 도입이 필요했던 환경이었습니다.&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;하지만, git(버전관리시스템)을 이용하게 되면, 위와같은 문제를 해결 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git은 변경사항을 저장하고, 언제든 해당 변경사항 지점으로 되돌아갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진과 앨범같은 느낌으로 이해하면 좋을 것 입니다.&lt;br /&gt;우리는 지금의 순간, 추억을 남기기 위해, 사진을 찍어 대상의 모습이 사진으로써 저장을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;polaroid-1969903_640.webp&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKgln/btsz5mnpALV/ObQz8NY1GbRkQXtvnj0pM1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKgln/btsz5mnpALV/ObQz8NY1GbRkQXtvnj0pM1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKgln/btsz5mnpALV/ObQz8NY1GbRkQXtvnj0pM1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKgln%2Fbtsz5mnpALV%2FObQz8NY1GbRkQXtvnj0pM1%2Fimg.webp&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;308&quot; height=&quot;218&quot; data-filename=&quot;polaroid-1969903_640.webp&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;452&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;br /&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;git도 마찬가지입니다.&lt;br /&gt;변경사항이 있는 파일(사진)들을 모아서, 커밋(앨범) 을 통해서 설명을 적고 repo에 저장합니다.&lt;br /&gt;그리고, 언제나 원하는 커밋으로 이동해, 그 때 당시의 파일의 변경사항을 확인할 수 있습니다.&lt;br /&gt;(물론, git은 그외에도 다양한 기능을 제공합니다 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZs51Q/btsz6wJOzNb/FOeItlrEaXSwlKJjPit8p0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZs51Q/btsz6wJOzNb/FOeItlrEaXSwlKJjPit8p0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZs51Q/btsz6wJOzNb/FOeItlrEaXSwlKJjPit8p0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZs51Q%2Fbtsz6wJOzNb%2FFOeItlrEaXSwlKJjPit8p0%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;225&quot; height=&quot;225&quot; data-filename=&quot;download.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&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;br /&gt;git을 왜 사용해야하는지에 알았기 때문에, 이젠 깃을 잘 활용하기 위해서, 기초개념에 대해서 알아보도록 합시다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;repository(=repo)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 프로젝트나, 서비스등의 단위를 repo 단위로 관리하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅 서비스를 개발하고 싶으면, chatting-project라는 이름의 repo를 생성하고, 그 안에서 파일들을 변경하고 추적합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 repo는 서로에게 아무런 영향을 주지않는 독립적인 영역입니다.&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;git 추적하고 싶은 프로젝트가 있는 경우, 맨처음으로 해줘야하는 것이 git repository를 생성하여, 프로젝트를 git이 추적할 수 있도록 하는 것 입니다.&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;repository를 생성하는 방법은, &lt;code&gt;git init&lt;/code&gt; 명령어를 통해 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(또는, &lt;code&gt;git clone&lt;/code&gt; 명령어를 통해 github으로 부터 이미 존재하는 repository를 복제하는 것도 가능하다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3개의 영역 (working directory, staging area, repository)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git은 3가지의 영역으로 나뉘어져 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.23.01.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/49TUB/btsz13a6JYs/HlzWvkIstlME09a8MRNKfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/49TUB/btsz13a6JYs/HlzWvkIstlME09a8MRNKfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/49TUB/btsz13a6JYs/HlzWvkIstlME09a8MRNKfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F49TUB%2Fbtsz13a6JYs%2FHlzWvkIstlME09a8MRNKfk%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;557&quot; height=&quot;366&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.23.01.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;working directory&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;staging area&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;repository에 저장에 하기전, 저장할 파일들을 저장하는 공간&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;repository&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 사항의 파일들을 영구적으로 git내에 저장하는 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경사항을 git 에 저장하는 순서도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.25.37.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq1L7h/btsz5jxsy3c/684thnQEFkC9Wcp8ZuVIk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq1L7h/btsz5jxsy3c/684thnQEFkC9Wcp8ZuVIk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq1L7h/btsz5jxsy3c/684thnQEFkC9Wcp8ZuVIk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq1L7h%2Fbtsz5jxsy3c%2F684thnQEFkC9Wcp8ZuVIk0%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;540&quot; height=&quot;346&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.25.37.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;384&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;맨 처음, 로컬 환경에서 a.txt과 b.txt파일을 추가했다고 생각을 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 working direct리에 첫 번째 사진과 같이 파일 두 개가 추가되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.26.50.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/74O6u/btsz53nyRo0/rUwFhYo1dE2h4zCwzSsKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/74O6u/btsz53nyRo0/rUwFhYo1dE2h4zCwzSsKRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/74O6u/btsz53nyRo0/rUwFhYo1dE2h4zCwzSsKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F74O6u%2Fbtsz53nyRo0%2FrUwFhYo1dE2h4zCwzSsKRK%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;600&quot; height=&quot;380&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.26.50.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;380&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;code&gt;git add &amp;lt;파일명&amp;gt;&lt;/code&gt;을 입력하게 되면, 해당 파일을 staging area로 이동할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.27.19.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGsex0/btsz6lBvwlw/GUZ99baIWGxSvnmr1eBHT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGsex0/btsz6lBvwlw/GUZ99baIWGxSvnmr1eBHT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGsex0/btsz6lBvwlw/GUZ99baIWGxSvnmr1eBHT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGsex0%2Fbtsz6lBvwlw%2FGUZ99baIWGxSvnmr1eBHT1%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;600&quot; height=&quot;371&quot; data-filename=&quot;edited_스크린샷 2023-02-05 14.27.19.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;371&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;code&gt;git commit&lt;/code&gt; 명령어를 통해서, staging area에 있는 파일을 git의 repository에 저장하게 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 git은 이렇게 3가지의 영역으로 나뉘어져있을까요???&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는, 만약에 a.txt파일과 b.txt파일을 두 개를 생성했는데, 한 가지의 파일만을 commit하고 싶은 경우가 존재할 것 입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commit은 작업의 최소 단위로 묶어서 하는 것이 좋다고 알려져있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, 오전중에 여러가지의 기능을 개발한 경우, 변경사항을 한 번에 다 commit하는 것이 아닌, 각 기능에 관련된 변경사항의 파일만을 커밋으로써 저장하는 것을 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않고, 두 가지의 기능을 하나의 커밋으로 묶어서 저장하게 되면, 나중에 채팅을 작성하는 기능 전의 파일로 되돌아가고 싶은데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채팅을 작성하는 기능뿐만아니라 채팅 내용을 가져오는 가능까지도 삭제된 상태로 되돌아가게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 파일을 a.txt와 b.txt 두 개를 추가했지만 파일을 각각 나누어 커밋하고 싶은 경우에는 우선 &lt;code&gt;git add a.txt&lt;/code&gt;로 working directory에 있는 파일을 staging area에 이동시키고, &lt;code&gt;git commit&lt;/code&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;code&gt;git commit&lt;/code&gt; 명령어는 staging area에 있는 파일을들을 묶어서 커밋으로 저장하는 것이기 때문에, 커밋 단위로 묶고 싶은 파일만 staging area에 옮겨서 처리하기 위해서 위와 같이 3개의 영역으로 나뉘어진 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/git</category>
      <category>Git</category>
      <category>git repository</category>
      <category>GitHub</category>
      <category>staging area</category>
      <category>working directory</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/439</guid>
      <comments>https://bill1224.tistory.com/439#entry439comment</comments>
      <pubDate>Fri, 10 Nov 2023 11:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[ 쿠키 ] 생명주기 / 세션쿠키 / 영속쿠키 / 도메인 / 보안</title>
      <link>https://bill1224.tistory.com/437</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쿠키&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Set-Cookie&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서버에서 클라이언트 쿠키 전달(응답)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) set-cookie: sessionId=asdasd124; expires=날짜; path=/; domain=.google.com;Secure&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로그인 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 클라이언트 From을 통해 로그인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676733863908&quot; class=&quot;http&quot; data-ke-language=&quot;r&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST /login HTTP/1.1
Host: ...

user=jongin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버, DB에서 유저 확인후 응답&lt;/p&gt;
&lt;pre id=&quot;code_1676733863909&quot; class=&quot;http&quot; data-ke-language=&quot;r&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Set-Cookie: user=jongin

jongin님 안녕하세요~!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set-Cookie에 user의 정보를 함께 보냄&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. 웹브라우저 쿠키 저장&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. 또 다른 요청&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1676733863909&quot; class=&quot;http&quot; data-ke-language=&quot;r&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /welcome HTTP/1.1
Cookie: user=jongin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키가 웹 브라우저에 저장된 이후에는 요청을 보낼 때 마다, cookie 값을 넣어서 요청을 보냄&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;&lt;b&gt;Cookie&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP요청시 서버로 전달&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;활용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 로그인 세션 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 광고 정보 트래킹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키 정보는 항상 서버에 전송됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 웹브라우저에 쿠키가 존재하면 서버에 요청할 때마다, 쿠키도 같이 보냄 -&amp;gt; 추가 트래픽 발생&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 최소한의 정보만을 사용 (세션 id, 인증 토큰)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지(localStorage, sessionStorage)참고&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;Cookie에는 보안에 민감한 정보를 저장하면 안됨&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;쿠키 - 생명주기&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set-Cookie: expires = 날짜 (GMT)&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;set-Cookie: max-age=3600 (초)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 3600초가 지나면 쿠키 삭제 ( 0이나 음수이면 쿠키 삭제)&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;&lt;b&gt;세션 쿠키&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만료 날짜를 생략하면, 브라우저 종료시 까지만 유지&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;영속 쿠키&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;쿠키 - 도메인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain=google.com&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;&lt;b&gt;domain을 명시한 경우&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명시한 domain은 물론이고, 서브 도메인에서도 쿠키 접근 가능&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;&lt;b&gt;domain을 명시안한 경우&lt;/b&gt;&lt;/h4&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;쿠키 - 경로&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;path=/home&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;일반적으로 &quot;path=/&quot;로 지정 ( 해당 도메인에서는 모든 곳에서 쿠키를 사용하게 하고 싶으니까)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;쿠키 - 보안&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Secure&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Secure 생략시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키 http, https를 구분하지 않고 전송&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Secure 명시시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https인 경우에만 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HttpOnly&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XSS 공격방지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자바스크립트에서 접근 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HTTP전송에서만 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SameSite&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XSRF공격 방지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/Network</category>
      <category>도메인</category>
      <category>보안</category>
      <category>생명주기</category>
      <category>세션쿠키</category>
      <category>영속쿠키</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/437</guid>
      <comments>https://bill1224.tistory.com/437#entry437comment</comments>
      <pubDate>Sun, 19 Feb 2023 00:28:51 +0900</pubDate>
    </item>
    <item>
      <title>[ Docker ] systemctl사용시 Failed to get D-Bus connection 에러 해결</title>
      <link>https://bill1224.tistory.com/435</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 기반 컨테이너 환경에서 systemctl명령어를 사용하게 되면, &quot;Failed to get D-Bus connection&quot;에러가 나오는 경우가 있습니다.&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;&lt;b&gt;컨테이너 생성시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1673406710981&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --privileged --name container image /sbin/init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 생성시에&amp;nbsp; --privileged 옵션을 추가하고, /sbin/init 명령어로 컨테이너를 실행시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673406771106&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it container /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 컨테이너에 bash쉘로 프로세스를 가동시켜서 접속하게 되면, 문제없이 systemctl 명령어를 사용할 수 있게 됩니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Mac 환경에서서는 추가적으로 설정&lt;/b&gt;&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설정파일 수정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1675406497914&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ~/Library/Group\ Containers/group.com.docker/settings.json
{
  ...
  &quot;deprecatedCgroupv1&quot;: true
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경로의 파일에서 &quot;deprecatedCgroupv1&quot;값이 false 인 경우에 true로 변경해줍니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 공부/Docker</category>
      <category>D-Bus</category>
      <category>docker</category>
      <category>MAC</category>
      <category>systemctl</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/435</guid>
      <comments>https://bill1224.tistory.com/435#entry435comment</comments>
      <pubDate>Wed, 11 Jan 2023 12:13:51 +0900</pubDate>
    </item>
    <item>
      <title>[ Docker ] centos7와 php8환경에서 imageMagick7 을 설치</title>
      <link>https://bill1224.tistory.com/434</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ImageMagick 설치전 필수 패키지 설치&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;yum install php-pear php-devel gcc&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ImageMagick 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 빌드 도구 설치&lt;/p&gt;
&lt;pre id=&quot;code_1671525537208&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum groupinstall &quot;Development Tools&quot;
# yum install kernel-devel kernel-headers&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;먼저 ImageMagick의 소스 파일을 다운로드하기 전에 ImageMagick에는 컴파일러 및 기타 필요한 개발 도구와 같은 개발 환경이 필요하므로 아래 명령을 사용하여 빌드 필수 도구를 설치해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;(2) 소스파일 다운로드&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525549368&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum install -y wget
# wget https: // www.imagemagick.org / 다운로드 / ImageMagick.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) 압축해제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525578111&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum install -y tar
# tar xzvf ImageMagick.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(4) ImageMagick 디렉토리로 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525670830&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# cd ImageMagick-7.1.0-55&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;(5) ImageMagick 및 구성의 컴파일을 수행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525700699&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ./configure&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671525737125&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# make
# make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;&lt;span&gt;(6) &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;동적 링커 런타임 바인딩을 구성&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525774790&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ldconfig /usr/local/lib&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존재하는&amp;nbsp;파일을&amp;nbsp;조사하고,&amp;nbsp;필요한&amp;nbsp;라이브러리를&amp;nbsp;로드하고&amp;nbsp;심볼릭&amp;nbsp;링크를&amp;nbsp;만드는&amp;nbsp;역할&amp;nbsp;&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;(7) 버전확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671525797706&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# magick --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 17.57.18.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVdnY/btrUbr9SuKu/lEJMPoHuMkl958lgG6kdzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVdnY/btrUbr9SuKu/lEJMPoHuMkl958lgG6kdzk/img.png&quot; data-alt=&quot; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVdnY/btrUbr9SuKu/lEJMPoHuMkl958lgG6kdzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVdnY%2FbtrUbr9SuKu%2FlEJMPoHuMkl958lgG6kdzk%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;541&quot; height=&quot;102&quot; data-filename=&quot;스크린샷 2022-12-20 17.57.18.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;102&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;또는 간단한 imageMagick의 로고 이미지를 다운로드할 수 있는 명령어를 실행&lt;/p&gt;
&lt;pre id=&quot;code_1671588905110&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# magick logo: logo.gif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-21 11.14.17.png&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xNS0x/btrT9F9V6dJ/blEhbc8PUzJJPB63VcCkCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xNS0x/btrT9F9V6dJ/blEhbc8PUzJJPB63VcCkCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xNS0x/btrT9F9V6dJ/blEhbc8PUzJJPB63VcCkCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxNS0x%2FbtrT9F9V6dJ%2FblEhbc8PUzJJPB63VcCkCk%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;282&quot; height=&quot;56&quot; data-filename=&quot;스크린샷 2022-12-21 11.14.17.png&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;56&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;</description>
      <category>IT 공부/Docker</category>
      <category>centOS7</category>
      <category>docker</category>
      <category>imagemagick</category>
      <category>magick</category>
      <category>php</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/434</guid>
      <comments>https://bill1224.tistory.com/434#entry434comment</comments>
      <pubDate>Tue, 20 Dec 2022 17:58:20 +0900</pubDate>
    </item>
    <item>
      <title>[ Dcoker ] Centos7환경에서 php8 버전 설치</title>
      <link>https://bill1224.tistory.com/433</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;컨테이너 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;컨테이너 생성 &amp;amp; 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1671523547652&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d --privileged --name centos7-php8 centos:centos7 /sbin/init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 17.28.12.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Whdhu/btrT9PcJQ1j/KYeeKCSGAVN2V85SKodfe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Whdhu/btrT9PcJQ1j/KYeeKCSGAVN2V85SKodfe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Whdhu/btrT9PcJQ1j/KYeeKCSGAVN2V85SKodfe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWhdhu%2FbtrT9PcJQ1j%2FKYeeKCSGAVN2V85SKodfe0%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;662&quot; height=&quot;47&quot; data-filename=&quot;스크린샷 2022-12-20 17.28.12.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d는 백그라운드로 실행&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--privileged 와 /sbin/init 명령어는 나중에 systemctl 명령어를 사용할 때를 대비해서 설정 ( docker에서는 systemctl을 옵션없이 사용하면, 에러가 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;centos:centos7 는 centos이름의 이미지를 사용하는데, 버전은 7버전을 사용 (이미지는 docker pull centos:centos7로 다운로드 하는 것이 가능하지만, 설치된 이미지가 없이 컨테이너를 생성하는 경우에 자동적으로 docker에서 이미지를 설치함)&lt;b&gt;&lt;/b&gt;&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;컨테이너에 프로세스 실행 (접속)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1671523562782&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it centos7-php8 /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-i : 상호 입출력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-t : tty를 활성화해서 배시(bash) 셸을 사용하도록 활성화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-it 상호 커뮤니케이션 형식으로 명령어를 입력하고 출력하는 형태로 실행 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;/bin/bash : bash 쉘을 사용&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;PHP 설치&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;background-color: #ffffff;&quot;&gt;(1) 먼저 Remi를 사용하는 데 필요한 EPEL 을 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523826740&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;EPEL (Extra Packages for Enterprise Linux)는&lt;span style=&quot;background-color: #fefefe; color: #000c34;&quot;&gt; 기존의 패키지에서는 제공하지 않는, 패키지의 최신 버전을 제공하는 community 기반의 저장소이다.&amp;nbsp;&lt;/span&gt;&lt;/span&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;span style=&quot;background-color: #ffffff;&quot;&gt;(2) Remi 리포지토리 구성 패키지 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523894698&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REMI는 LAMP 기반으로 기존 패키지에서 제공하지 않는 최신 버전의 패키지를 제공&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;span style=&quot;background-color: #ffffff;&quot;&gt;(3) yum-config-manager 명령 사용에 필요한 yum-utils 패키지 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523920843&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum install -y yum-utils&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(4) &lt;span style=&quot;background-color: #ffffff;&quot;&gt;yum-config-manager 명령 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523951274&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum-config-manager --disable 'remi-php*'
# yum-config-manager --enable remi-php80&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다른 Remi 패키지의 php 버전을 비활성화 하고, PHP8.0 패키지 만 활성화하여 사용하도록&amp;nbsp;&lt;/span&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;(5) 사용 가능한 리포지토리 확인.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523963793&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum repolist&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 17.24.21.png&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blPJRT/btrT9GNRFwl/JlvWkNgkEJLTn0Tnfk6iqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blPJRT/btrT9GNRFwl/JlvWkNgkEJLTn0Tnfk6iqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blPJRT/btrT9GNRFwl/JlvWkNgkEJLTn0Tnfk6iqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblPJRT%2FbtrT9GNRFwl%2FJlvWkNgkEJLTn0Tnfk6iqk%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;571&quot; height=&quot;79&quot; data-filename=&quot;스크린샷 2022-12-20 17.24.21.png&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;remi-php80&quot;이 표시되면 성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(6) 설치 패키지의 최신화를 실시&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671523986562&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum update -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(7) PHP를 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671524002528&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yum install -y php&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;(8) 버전확인&lt;/p&gt;
&lt;pre id=&quot;code_1671524019525&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-20 17.25.10.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p8Szf/btrT6eEyLiZ/Z5kJ6EWY9V0uzthPpXzzRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p8Szf/btrT6eEyLiZ/Z5kJ6EWY9V0uzthPpXzzRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p8Szf/btrT6eEyLiZ/Z5kJ6EWY9V0uzthPpXzzRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp8Szf%2FbtrT6eEyLiZ%2FZ5kJ6EWY9V0uzthPpXzzRK%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;498&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2022-12-20 17.25.10.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP 8버전이 제대로 출력이되면 끝입니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP8.0버전 설치 참고자료&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 공부/Docker</category>
      <category>centOS7</category>
      <category>docker</category>
      <category>php8</category>
      <author>JONGI-N CHOI</author>
      <guid isPermaLink="true">https://bill1224.tistory.com/433</guid>
      <comments>https://bill1224.tistory.com/433#entry433comment</comments>
      <pubDate>Tue, 20 Dec 2022 17:33:57 +0900</pubDate>
    </item>
  </channel>
</rss>