<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Lucy의 개발 일지</title>
    <link>https://lucy1215.tistory.com/</link>
    <description>&amp;quot;나중은 결코 오지 않는다.&amp;quot;</description>
    <language>ko</language>
    <pubDate>Fri, 17 Apr 2026 00:18:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lucy1215</managingEditor>
    <image>
      <title>Lucy의 개발 일지</title>
      <url>https://tistory1.daumcdn.net/tistory/5900319/attach/4ed6713a9bb64322ae22d161d3720026</url>
      <link>https://lucy1215.tistory.com</link>
    </image>
    <item>
      <title>[Elasticsearch] Elasticsearch 란? (역인덱스, 애널라이저)</title>
      <link>https://lucy1215.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현업에서 프로젝트를 진행하다보면 &quot;검색엔진&quot;을 거의 무조건 사용하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에서 검색엔진의 종류에는 Elasticsearch, OpenSearch, Apache Solr 등등 여러가지가 있지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대표적으로는 Elasticsearch를 많이 사용한다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch란 무엇일까? 학습한 내용을 정리해보자.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ Elasticsearch 란?&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;311&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btozQa/dJMcajaAIoK/7MkpYcDlOZqvAaz2kgOxJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btozQa/dJMcajaAIoK/7MkpYcDlOZqvAaz2kgOxJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btozQa/dJMcajaAIoK/7MkpYcDlOZqvAaz2kgOxJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtozQa%2FdJMcajaAIoK%2F7MkpYcDlOZqvAaz2kgOxJk%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;311&quot; height=&quot;162&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch 는 검색, 데이터 분석에 최적화된 데이터베이스이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ Elasticsearch 주요 활용 사례&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 수집 및 분석&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ElasticSearch : 데이터 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Logstash : 데이터 수집 및 가공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kibana : 데이터 시각화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;검색 최적화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터가 많더라도 뛰어난 검색 속도&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오타나 동의어를 고려해서 유연하게 검색할 수 있는 기능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ Elasticsearch 작동 방식 / GUI 툴&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch와 소통하려면 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;REST API&lt;/span&gt;&lt;/b&gt; 라는 방식으로 통신해야 한다. (GET, POST, PUT, DELETE)&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[예시]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터 삽입&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1774922620818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X POST &quot;localhost:9200/users/_doc&quot; -H 'Content-Type: application/json' -d
'{
	&quot;query&quot; : {
    	&quot;match_all&quot; : {}
    }
}'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터 조회&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1774922710999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X GET &quot;localhost:9200/users/_search&quot; -H 'Content-Type: application/json' -d
'{
	&quot;query&quot;: {
    	&quot;match_all&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch 대표적인 GUI 툴이 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;Kibana&lt;/b&gt;&lt;/span&gt; 이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774922920039&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;           5601번 포트                9200번 포트
개발자  ------------------&amp;gt; Kibana -----------------&amp;gt; Elasticsearch&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ Elasticsearch 의 기본 용어 정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch 도 데이터베이스이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch에 데이터를 &lt;u&gt;저장/조회/수정/삭제&lt;/u&gt;할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 저장하기 위해 가장 먼저 &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;인덱스(index)&lt;/span&gt;를 만든다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;매핑(mapping)&lt;/span&gt;을 정의한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테이블의 &lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;필드(field)&lt;/span&gt;에 맞게 데이터를 저장한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 47.7907%; height: 182px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MySQL&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테이블 (table)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인덱스 (index)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컬럼 (column)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필드 (field)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레코드 (record), 로우 (row)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도큐먼트 (document)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스키마 (schema)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매핑 (mapping)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ 역인덱스 (Inverted Index) 란?&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;역인덱스(Inverted Index)&lt;/b&gt;는 &lt;u&gt;필드 값을 단어마다 쪼개서 찾기 쉽게 정리해놓은 목록&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch의 자체적인 로직으로 score(점수)를 매겨 score가 높은 순으로 도큐먼트를 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 검색어와 관련성이 높으면 높을수록 score(점수)가 높게 측정된다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Elasticsearch가 &lt;b&gt;역인덱스 (Inverted Index)&lt;/b&gt;의 기능을 가지고 있기 때문에, 단어의 순서랑 상관없이 도큐먼트를 조회해올 수 있는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;참고)&lt;/span&gt; 이런 작동 구조는 데이터 타입의 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;text 타입&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[예시]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774923761969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST /products/_create/1
{
  &quot;name&quot;: &quot;Apple 2025 맥북 에어 13 M4 10코어&quot;
}

POST /products/_create/2
{
  &quot;name&quot;: &quot;Apple 2024 에어팟 4세대&quot;
}

POST /products/_create/3
{
  &quot;name&quot;: &quot;Apple 2024 아이패드 mini A17 Pro&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이렇게 3개의 도큐먼트를 Elasticsearch에 저장한다고 가정한다. 그러면 Elasticsearch는 내부적으로 아래와 같이 데이터를 저장해둔다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 단어 단위로 자르기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;name: &quot;Apple 2025 맥북 에어 13 M4 10코어&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; [ Apple, 2025, 맥북, 에어, 13, M4, 10코어 ]&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: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;name: &quot;Apple 2024 에어팟 4세대&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &amp;rarr; [ Apple, 2024, 에어팟, 4세대 ]&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: #dddddd; color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &quot;name: &quot; Apple 2024 아이패드 mini A17 Pro &quot; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &amp;rarr; [ Apple, 2024, 아이패드, mini, A17, Pro ]&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 역인덱스로 저장&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;products&lt;/span&gt;의 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;name&lt;/span&gt; 필드에 대한 &lt;b&gt;역인덱스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 40%; height: 283px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토큰 (token)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도큐먼트 id&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Apple&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1, 2, 3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맥북&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;13&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;M4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10코어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2024&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[2, 3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에어팟&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[2]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4세대&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[2]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아이패드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;mini&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;A17&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pro&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필드값에서 추출돼 역인덱스에 저장된 단어를 보고 &lt;u&gt;&lt;b&gt;토큰(token)&lt;/b&gt;&lt;/u&gt;이라고 부른다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성된 역인덱스를 직접 눈으로 확인할 수는 없다. 시스템 내부적으로 생성될 뿐이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 검색을 할 경우 역인덱스를 활용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Apple 2024 아이패드&lt;/span&gt; 라고 검색하면 역인덱스를 활용해 일치하는 단어가 많은 도큐먼트를 우선적으로 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 40%; height: 283px;&quot; border=&quot;1&quot; data-ke-style=&quot;style8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토큰 (token)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도큐먼트 id&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Apple&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[1, 2, 3]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맥북&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;13&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;M4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10코어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[1]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2024&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[2, 3]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에어팟&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[2]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4세대&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[2]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;아이패드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[3]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;mini&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;A17&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pro&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[3]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;id가 1인 도큐먼트 : 단어 1개 일치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;id가 2인 도큐먼트 : 단어 2개 일치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;id가 3인 도큐먼트 : 단어 3개 일치&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이와 같은 Elasticsearch의 자체적인 로직으로 &lt;u&gt;&lt;b&gt;score(점수)&lt;/b&gt;&lt;/u&gt;를 매겨 score가 높은 순 (&lt;span style=&quot;background-color: #dddddd;&quot;&gt;id=3&lt;/span&gt; -&amp;gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;id=2&lt;/span&gt; -&amp;gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;id=1&lt;/span&gt;) 으로 도큐먼트를 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 검색어와 관련성이 높으면 높을수록 &lt;u&gt;&lt;b&gt;score(점수)&lt;/b&gt;&lt;/u&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&quot;Elasticsearch 역인덱스 (Inverted Index)의 기능을 가지고 있기 때문에, 단어의 순서랑 상관없이 도큐먼트를 조회해올 수 있는 것이다.&quot;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;✅ 애널라이저 (Analyzer) 란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문자열 (text)을 토큰으로 변환시켜주는 장치이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qjr4E/dJMcah4XL0k/IOfSvokkOW6K0kfoyymrB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qjr4E/dJMcah4XL0k/IOfSvokkOW6K0kfoyymrB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qjr4E/dJMcah4XL0k/IOfSvokkOW6K0kfoyymrB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQjr4E%2FdJMcah4XL0k%2FIOfSvokkOW6K0kfoyymrB1%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;1350&quot; height=&quot;237&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;237&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;u&gt;&lt;b&gt;애널라이저 (Analyzer)&lt;/b&gt;&lt;/u&gt;는 내부적으로 &lt;u&gt;&lt;b&gt;캐릭터 필터 (Character filter)&lt;/b&gt;&lt;/u&gt;, &lt;u&gt;&lt;b&gt;토크나이저 (tokenizer)&lt;/b&gt;&lt;/u&gt;, &lt;u&gt;&lt;b&gt;토큰 필터 (token filter)&lt;/b&gt;&lt;/u&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1️⃣ 캐릭터 필터 (character filter)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐릭터 필터는 문자열을 토큰으로 자르기 전에 문자열을 다듬는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[예시]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;html_strip 필터 적용 (HTML 태그를 제거)&lt;/li&gt;
&lt;li&gt;(mapping 필터, pattern replace 필터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2️⃣ 토크나이저 (tokenizer)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[예시]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;standard 토크나이저&lt;/b&gt; (공백 또는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;,&lt;/span&gt; , &lt;span style=&quot;background-color: #dddddd;&quot;&gt;.&lt;/span&gt; , &lt;span style=&quot;background-color: #dddddd;&quot;&gt;!&lt;/span&gt; , &lt;span style=&quot;background-color: #dddddd;&quot;&gt;?&lt;/span&gt; 와 같은 문장 부호를 기준으로 자름)&lt;/li&gt;
&lt;li&gt;(classic 토크나이저, keyword 토크나이저, pattern 토크나이저 등등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3️⃣ 토큰 필터 (token filter)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;토큰 필터는 잘린 토큰을 최종적으로 다듬는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[예시]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;lowercase 필터 적용 (소문자로 변환)&lt;/li&gt;
&lt;li&gt;stop 필터 적용 ( a, the, is 와 같은 특별한 의미를 가지지 않는 단어 제거)&lt;/li&gt;
&lt;li&gt;stemmer 필터 적용 (단어의 원래 형태로 변환)&lt;/li&gt;
&lt;li&gt;(asciifolding 필터, synonym 필터, edge_ngram 필터, kstem 필터 등등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;elasticsearch에 기본값으로 설정되어 있는 애널라이저는 &lt;u&gt;&lt;b&gt;standard analyzer&lt;/b&gt;&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;standard analyzer는 character filter는 설정되어 있지 않고, tokenizer는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;standard&lt;/span&gt;로 설정되어 있고, token filter는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;lowercase&lt;/span&gt;인 애널라이저를&amp;nbsp; 뜻한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tokenizer (standard) : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;공백 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;와 같은 문장 부호를 기준으로 자름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;token filter (lowercase) : 소문자로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 한글로 검색하려면 &lt;u&gt;&lt;b&gt;Nori(노리) Analyzer&lt;/b&gt;&lt;/u&gt;를 써야 한다.&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✅ 매핑 (mapping) 이란 ?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;매핑(mapping)&lt;/b&gt;&lt;/u&gt; 이란 &lt;u&gt;&lt;b&gt;도큐먼트의 각 필드가 어떤 데이터 타입을 가지고 있는지 정의하는 설정&lt;/b&gt;&lt;/u&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의하는 것처럼, Elasticsearch에서 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑을 정의할 수 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✅ 데이터 타입 (data type)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Elasticsearch에서 데이터 타입의 종류는 아주 많다. 그 중 자주 사용하는 데이터 타입에 대해서만 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[숫자]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10억 이하의 정수만 저장하면 되는 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;integer&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;10억이 넘어가는 정수를 저장해야 될 수도 있는 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;long&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;실수 (소숫점을 가진 숫자 포함)를 저장해야 될 수도 있는 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;double&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[문자]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열을 토큰으로 쪼개서 저장하고 싶은 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;text&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;유연한 검색이 필요할 때 (완전히 일치하지 않아도 비슷한 데이터를 조회해오는 방식)&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문자열을 토큰으로 쪼개지 않고, 문자열 그대로 저장하고 싶은 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;keyword&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정확한 검색이 필요할 때 (정확하게 일치할 때만 데이터를 조회해오는 방식)&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주의) 계산에서 쓰는 값이 아니라면 숫자가 아닌 문자로 저장해야 한다 . 예를 들어 , 휴대폰 번호나 주민등록번호에 숫자를 더하거나 빼 지않는다 . 즉 , 휴대폰 번호나 주민등록번호는 숫자가 아닌 문자로 저장해야 한다 . &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[기타]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;날짜 데이터를 저장해야 하는 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;date&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;true, false를 저장해야 하는 경우 : &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;boolean&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server</category>
      <category>elasticsearch</category>
      <category>ELK</category>
      <category>검색엔진</category>
      <category>애널라이저</category>
      <category>엘라스틱서치</category>
      <category>역인덱스</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/51</guid>
      <comments>https://lucy1215.tistory.com/51#entry51comment</comments>
      <pubDate>Tue, 31 Mar 2026 14:06:52 +0900</pubDate>
    </item>
    <item>
      <title>[Network] SSL 인증서를 갱신하는 방법을 알아보자</title>
      <link>https://lucy1215.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 사이트 유지운영을 진행하면서, 간간히 진행해야하는 작업 중 하나가 &lt;b&gt;&quot;SSL 인증서 갱신&quot;&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고객 또는 MSP 업체에서 &quot;시스템 도메인 인증서의 만료일이 ~~일 전 입니다. 인증서 갱신 요청드립니다.&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라고 온다. 이때, SSL 인증서를 서버에서 갱신해주면 되는 것이다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일단 SSL 인증서 갱신을 하기 전에, 먼저 SSL 이란 무엇일까?&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ SSL 이란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SSL (Secure Sockets Layer)&lt;/b&gt; 은 &lt;b&gt;웹 브라우저와 서버 간의 데이터를 암호화하여 인터넷 연결을 보호하는 표준 보안 기술&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엄밀히 말하면, 오늘날 실제로 쓰이는 표준은 TLS이고, SSL은 그 이전 세대 이름이다. 그래도 업계에서는 지금도 관습적으로 SSL, SSL&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쉽게 말하면 SSL/TLS는 인터넷 통신에 잠금장치는 거는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SSL의 특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클라이언트와 서버 사이의 통신을 암호화한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터가 중간에서 변조되지 않았는지 확인할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;접속한 서버가 진짜인지 확인할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HTTPS를 가능하게 하는 핵심 기술이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자에게 신뢰를 준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹뿐 아니라 다양한 네트워크 서비스에 사용된다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HTTPS.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cssJ3y/dJMcaio7Nsw/hddsp5zTMCfWIzrKkP7pOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cssJ3y/dJMcaio7Nsw/hddsp5zTMCfWIzrKkP7pOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cssJ3y/dJMcaio7Nsw/hddsp5zTMCfWIzrKkP7pOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcssJ3y%2FdJMcaio7Nsw%2Fhddsp5zTMCfWIzrKkP7pOk%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;578&quot; height=&quot;260&quot; data-filename=&quot;HTTPS.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSL.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl7S3s/dJMcahcEUxk/jw7iSsvItjRVH9zJr69GIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl7S3s/dJMcahcEUxk/jw7iSsvItjRVH9zJr69GIK/img.png&quot; data-alt=&quot;GPT가 그려준 SSL 그림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl7S3s/dJMcahcEUxk/jw7iSsvItjRVH9zJr69GIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl7S3s%2FdJMcahcEUxk%2Fjw7iSsvItjRVH9zJr69GIK%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;578&quot; height=&quot;385&quot; data-filename=&quot;SSL.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT가 그려준 SSL 그림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저가&amp;nbsp; HTTPS 사이트에 접속하면, 서버는 자신의 인증서를 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 브라우저는 대체로 다음을 확인하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 인증서를 신뢰 가능한 CA가 발급했는가.&lt;/li&gt;
&lt;li&gt;이 인증서의 도메인 이름이 현재 접속한 주소와 일치하는가.&lt;/li&gt;
&lt;li&gt;인증서가 유효 기간 안에 있는가.&lt;/li&gt;
&lt;li&gt;이상이 없으면 그다음부터 암호화된 연결을 맺는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, SSL/TLS 는 단순히 &quot;암호화만 하는 기술&quot; 이 아니라, 암호화 + 서버 신원 확인을 함께 처리하는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ SSL 인증서가 만료됐는지 어떻게 확인할까?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러면 웹 사이트에서 SSL 인증서가 만료됐는지 확인하는 방법을 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시로 Google 사이트의 SSL 인증서를 확인해보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF5sb1/dJMcafTsJ1r/MtKlG8940eIl4Fj7s6iBIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF5sb1/dJMcafTsJ1r/MtKlG8940eIl4Fj7s6iBIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF5sb1/dJMcafTsJ1r/MtKlG8940eIl4Fj7s6iBIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF5sb1%2FdJMcafTsJ1r%2FMtKlG8940eIl4Fj7s6iBIK%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;527&quot; height=&quot;512&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구글 사이트에서 &lt;b&gt;&quot;사이트 정보 보기&quot;&lt;/b&gt; 아이콘을 클릭하게 되면, 해당 팝업이 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에서 맨 위에 있는 자물쇠 모양의&amp;nbsp;&lt;b&gt;&quot;이 연결은 안전합니다.&quot;&lt;/b&gt;를&amp;nbsp;클릭하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bykfby/dJMcaiCCEBS/kmV5pWoI8eKhd7nlcTBHCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bykfby/dJMcaiCCEBS/kmV5pWoI8eKhd7nlcTBHCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bykfby/dJMcaiCCEBS/kmV5pWoI8eKhd7nlcTBHCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbykfby%2FdJMcaiCCEBS%2FkmV5pWoI8eKhd7nlcTBHCK%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;427&quot; height=&quot;310&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러면 보안 팝업이 뜨게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에서 &lt;b&gt;&quot;인증서가 유효함&quot;&lt;/b&gt;을 클릭하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpki82/dJMcag5Ue2g/tHX1iTJEwBYWO6QBoXpi4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpki82/dJMcag5Ue2g/tHX1iTJEwBYWO6QBoXpi4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpki82/dJMcag5Ue2g/tHX1iTJEwBYWO6QBoXpi4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpki82%2FdJMcag5Ue2g%2FtHX1iTJEwBYWO6QBoXpi4k%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;427&quot; height=&quot;530&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러면 이렇게 인증서 뷰어가 뜨게 된다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이게 SSL 인증서 정보다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에서 유효성 기간을 보면 &lt;b&gt;발급일, 만료일&lt;/b&gt;을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 만료일이 끝나기 전에 새로운 SSL 인증서를 발급받아 갱신을 해야 보안에 안전한 사이트가 되는 것이다.&lt;/span&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ SSL 인증서를 갱신하는 방법은?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 SSL 인증서의 만료일까지 확인하는 방법을 알았으니 SSL 인증서를 갱신하는 방법을 알아보자.&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&gt;먼저 지금 서버가 어떤 파일을 쓰는지 확인을 해야한다.&lt;/span&gt;&lt;span&gt;내 기준 Apache 를 사용하고 있고 httpd.conf 파일에서 어떤 SSL 인증서 파일을 사용하는지 확인할 수 있다.&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;httpd.conf 파일은 보통 &lt;code&gt;/etc/httpd/conf.d&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AMeUJ/dJMcafMIIsT/42Yc4FkP1F3HZcDwfKzI8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AMeUJ/dJMcafMIIsT/42Yc4FkP1F3HZcDwfKzI8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AMeUJ/dJMcafMIIsT/42Yc4FkP1F3HZcDwfKzI8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAMeUJ%2FdJMcafMIIsT%2F42Yc4FkP1F3HZcDwfKzI8K%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;700&quot; height=&quot;58&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;58&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;해당 파일에서 이렇게 SSLCertificateFile / SSLCerticiateKeyFile / SSLCertificateChainFile로 설정된 각각의 파일을 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SSLCertificateFile&lt;/b&gt; : 서버 인증서 파일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSLCertificateKeyFile&lt;/b&gt; : 서버 개인키 (private key) 파일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSLCertificateChainFile&lt;/b&gt; : 중간 인증서 체인 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 확인된 각각의 파일들은 새로 인증받은 SSL 인증서 파일들로 교체해주면 됩니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;✅ SSL 인증서를 사용,갱신하지 않았을 때 뭐가 문제일까?&lt;/span&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;다른 사이트를 접속했을 때 간혹가다 이런 팝업이나 문구를 본 적이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPTUy/dJMcagSntdn/G9nJPJc9fgCTKZqSYHyjLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPTUy/dJMcagSntdn/G9nJPJc9fgCTKZqSYHyjLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPTUy/dJMcagSntdn/G9nJPJc9fgCTKZqSYHyjLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPTUy%2FdJMcagSntdn%2FG9nJPJc9fgCTKZqSYHyjLK%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;433&quot; height=&quot;306&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;306&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;&quot;주의 요함&quot; 이 뜨는 사이트는 SSL 인증서가 설치되어 있지 않은 사이트인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 주소상 앞에 &quot;주의 요함&quot; 또는 &quot;안전하지 않음&quot; 이라는 문구가 확인된다면 개인 정보와 같은 민감 정보 입력 시 주의해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server</category>
      <category>https</category>
      <category>ssl</category>
      <category>ssl인증서</category>
      <category>SSL인증서갱신</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/50</guid>
      <comments>https://lucy1215.tistory.com/50#entry50comment</comments>
      <pubDate>Fri, 20 Mar 2026 14:00:30 +0900</pubDate>
    </item>
    <item>
      <title>[Network] X-Forwarded-For (XFF) 란 무엇일까?</title>
      <link>https://lucy1215.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트를 진행하면서 통합 테스트 중 고객이 테스트를 하는 도중에 요청을 주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;제 로컬 PC로 접속했을 때랑 VPN을 연결해서 접속했을 때, 찍히는 IP 주소가 다른데 이게 정상인가요?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;X-Forwarded-For 한번 확인 요청드립니다!&quot;&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 요청을 보고 첫번째로 든 생각은 &quot;VPN으로 접속했으면 IP 주소가 다른게 정상 아닌가?&quot; 가 첫번째였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;근데 왜 정상이지?&quot; 가 두번째였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 그냥 &quot;VPN을 연결하면 VPN의 IP 주소로 접속되어서 IP 주소가 다르다&quot; 만 알고있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 안에 자세한 내용, XFF 조차도 모르고 있었던 것이었다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✅X-Forwarded-For (XFF) 란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X-Forwarded-For 는 원래 요청을 보낸 클라이언트의 IP 주소를 전달하기 위한 HTTP 헤더이다.&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;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;li&gt;VPN&amp;nbsp; 게이트웨이&lt;/li&gt;
&lt;li&gt;웹 방화벽 (WAF)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 장비를 거쳐 서버에 요청이 들어오면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 입장에서는 직접 연결한 대상이 최종 사용자가 아니라 중간 장비로 보일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중간 장비가 원래 클라이언트 IP를 헤더에 담아서 넘겨주는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 대표적인 값이 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;X-Forwarded-For&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;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;현재 IP를 구하는 코드가 이렇게 구현이 되어있다.&lt;/p&gt;
&lt;pre id=&quot;code_1773728351537&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private String getIp() {
	HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
    	.getRequest();
    String ip = req.getHeader(&quot;X-FORWARDED-FOR&quot;);
    return ip == null ? req.getRemoteAddr() : ip;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1. &lt;span style=&quot;background-color: #dddddd;&quot;&gt;X-Forwarded-For&lt;/span&gt; 헤더가 있으면 그 값을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 없으면 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&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;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;프록시나 VPN 같은 중간 장비가 실제 사용자 IP를 전달해주면 XFF를 사용&lt;/b&gt;하고,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇지 않으면 &lt;b&gt;서버와 직접 연결된 클라이언트 주소를 사용&lt;/b&gt;하는 방식&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&lt;/span&gt; 만으로는 부족할 수 있는 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request.getRemoteAddr() 는 서버와 직접 TCP 연결을 맺은 상대의 IP를 반환한다.&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;실제 사용자 PC의 IP&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;중간에 프록시나 VPN 장비가 있으면 서버는 그 장비와 통신하기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&lt;/span&gt; 는 사용자 IP가 아니라 &lt;b&gt;중간 장비의 IP&lt;/b&gt;가 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중간 장비 없음&amp;nbsp;&amp;rarr; getRemoteAddr() = 사용자 IP&lt;/li&gt;
&lt;li&gt;중간 장비 있음 &amp;rarr; getRemoteAddr() = 프록시/VPN/게이트웨이 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✅로컬 접속과&amp;nbsp; VPN 접속에서 IP가 달라지는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 로컬 PC에서 직접 접속하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 별도의 프록시나 VPN 없이 서버에 접속한다고 가정해보면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 PC&amp;nbsp; &amp;nbsp; ----------------------&amp;gt;&amp;nbsp; &amp;nbsp;서버&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 서버가 직접 통신하는 대상은 사용자 PC 다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;X-Forwarded-For&lt;/span&gt; 없음&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&lt;/span&gt; = 실제 접속한 사용자 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 상황에서는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&lt;/span&gt; 값이 곧 원격 사용자 IP라고 볼 수 있다.&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;2. VPN을 통해 접속하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 사용자가 VPN을 켠 상태에서 접속한다고 가정해보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 PC&amp;nbsp; &amp;nbsp;----------------------------&amp;gt;&amp;nbsp; &amp;nbsp;VPN&amp;nbsp; 장비&amp;nbsp; &amp;nbsp;---------------------------&amp;gt;&amp;nbsp; &amp;nbsp;서버&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 서버는 사용자 PC와 직접 통신하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 직접 보는 대상은&lt;b&gt; VPN 장비&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;getRemoteAddr()&lt;/span&gt; = VPN 게이트웨이 또는 내부 네트워크 장비 IP&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;X-Forwarded-For&lt;/span&gt; = 원래 사용자 ip가 전달될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, VPN 환경에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 입장에서 &quot;중간 장비를 통해 들어온 요청&quot; 으로 보이기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 접속 때와 IP가 달라지는 것이 정상이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⚠️번외&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1️⃣주의할 점 : X-Forwarded-For 를 무조건 믿으면 안된다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트가 하나 있다.&lt;/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: #dddddd;&quot;&gt;X-Forwarded-For&lt;/span&gt; 는 &lt;b&gt;HTTP 헤더&lt;/b&gt;이기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰할 수 없는 외부 요청에서는 클라이언트가 임의로 넣을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모든 환경에서 무조건&lt;/p&gt;
&lt;pre id=&quot;code_1773729625687&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;req.getHeader(&quot;X-FORWARDED-FOR&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;를 신뢰하면 안 된다.&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;size18&quot;&gt;&lt;b&gt;신뢰 가능한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사내 프록시&lt;/li&gt;
&lt;li&gt;운영 중인 로드밸런서&lt;/li&gt;
&lt;li&gt;회사 VPN 게이트웨이&lt;/li&gt;
&lt;li&gt;신뢰 가능한 리버스 프록시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주의가 필요한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷에서 직접 들어오는 요청&lt;/li&gt;
&lt;li&gt;프록시 신뢰 구간이 명확하지 않은 환경&lt;/li&gt;
&lt;li&gt;헤더 위변조 가능성이 있는 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 보통&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;신뢰할 수 있는 프록시가 추가한 XFF만 사용한다&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;는 기준이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2️⃣X-Forwarded-For 에는 여러 IP가 들어올 수도 있다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시를 여러 번 거치면 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;X-Forwarded-For&lt;/span&gt; 에는 IP가 하나만 들어오지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;X-Forwarded-For: client-ip, proxy1-ip, proxy2-ip&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로는 &lt;b&gt;맨 앞의 값이 원래 클라이언트 IP&lt;/b&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;</description>
      <category>Server</category>
      <category>HTTP</category>
      <category>IP</category>
      <category>java</category>
      <category>network</category>
      <category>VPN</category>
      <category>X-Forwarded-For</category>
      <category>XFF</category>
      <category>XFF 헤더</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/49</guid>
      <comments>https://lucy1215.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 17 Mar 2026 15:58:16 +0900</pubDate>
    </item>
    <item>
      <title>[DBeaver] DB 덤프 생성 및 복구하기</title>
      <link>https://lucy1215.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실무에서 일을 하다보면 DataBase에 있는 스키마를 통째로 백업을 해야하거나 테이블 하나를 백업을 해야하는 경우가 생긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 경험으로는, DB 서버를 변경해야하는 작업에서는 DataBase 통째로 백업을 해야하고, 하나의 테이블 안에서 물리적인 DB 마이그레이션 작업이 필요한 경우에는 테이블 하나만 백업을 한다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이럴 때, 나는 DBeaver를 이용해서 테이블 또는 DB 전체를 덤프한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Intellij 안에 있는 Database도 개발을 하면서 이용을 하지만, 덤프같은 편의 기능이나 여러 DB를 연결해놓고 한번에 확인할 수 있다는 점에서 DBeaver를 이용중이다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘 다룰 내용은 DBeaver에서 DB를 덤프하는 방법과 덤프한 DB를 다시 복구하는 방법이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. DB를 덤프하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6yj2K/dJMcabQZOOo/nSRRjCvq7Ft3BrmpcbeLb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6yj2K/dJMcabQZOOo/nSRRjCvq7Ft3BrmpcbeLb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6yj2K/dJMcabQZOOo/nSRRjCvq7Ft3BrmpcbeLb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6yj2K%2FdJMcabQZOOo%2FnSRRjCvq7Ft3BrmpcbeLb1%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;578&quot; height=&quot;468&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;468&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덤프하려는 database 우클릭 후 &quot;도구&quot; 에서 &quot;Dump database&quot; 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUOkdw/dJMcafFSC04/ZvWdCVn9JlbTHsTi45UGzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUOkdw/dJMcafFSC04/ZvWdCVn9JlbTHsTi45UGzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUOkdw/dJMcafFSC04/ZvWdCVn9JlbTHsTi45UGzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUOkdw%2FdJMcafFSC04%2FZvWdCVn9JlbTHsTi45UGzK%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;578&quot; height=&quot;388&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dump database를 클릭하면 해당 팝업이 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에 Object에는 해당 서버에 있는 database의 종류와 아래에는 해당 database의 table이 뜨게 된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 해당 database의 모든 table을 덤프하고 싶다면 그대로 다음을 누르면 되고, 특정 테이블만 덤프하고 싶다면 특정 테이블만 체크해서 다음을 누르면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tluxO/dJMcad2iTjY/kqvhWNwGK4awEmAeWy1lyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tluxO/dJMcad2iTjY/kqvhWNwGK4awEmAeWy1lyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tluxO/dJMcad2iTjY/kqvhWNwGK4awEmAeWy1lyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtluxO%2FdJMcad2iTjY%2FkqvhWNwGK4awEmAeWy1lyk%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;578&quot; height=&quot;384&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;556&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음을 누르면 해당 팝업이 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 팝업은 DBeaver에서 MySQL dump(sql 백업 파일) 만들 때 옵션을 정하는 화면이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Execution Method&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Normal (no locks)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잠금(lock)을 최소화하거나 안 거는 일반 덤프 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스 사용 중인 DB에서 비교적 부담 적게 뜰 때 자주 씀&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 개발/로컬/간단 백업이면 이걸 많이 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나도 보통 Execution Method는 건들지 않고 Normal로 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Settings&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덤프 파일 안에 어떤 SQL을 넣을지 정하는 옵션이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;No CREATE statements&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테이블 생성문 (&lt;span style=&quot;background-color: #dddddd;&quot;&gt;CREATE TABLE&lt;/span&gt;) 없이 데이터만 덤프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;체크하면 구조 복원은 안 되고 데이터만 살릴 때 씀&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Add DROP statements&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복원 전에 기존 테이블/DB를 지우는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;DROP&lt;/span&gt; 구문 포함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복원할 때 기존 객체가 있으면 덮어쓰기 편함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영에서는 조심해서 써야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Disable keys&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 대량 입력 시 인덱스/키 처리 부담을 줄이기 위한 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대량 insert 성능에 도움될 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Extended inserts&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 row를 한 번의 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;Insert&lt;/span&gt; 문으로 묶어서 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파일 크기 줄고 import 속도도 보통 더 좋음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 체크해두는 편&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dump events&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MySQL Event Schduler 이벤트까지 포함해서 덤프&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Additional comments&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SQL 파일에 주석 정보 푸가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Remove DEFINER&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DEFINER=&lt;/span&gt; 정보 제거&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 서버로 옮길 때 권한 문제 줄이는 데 유용함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dump binaries in hex&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바이너리 데이터를 hex 형식으로 저장&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Structure only&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 없이 구조만 덤프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉 테이블 생성문만 백업&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;No routines&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;저장 프로시저 / 함수 같은 routine 제외&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 많이 쓰는 실무 기준으로&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 그냥 로컬 백업&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Extended inserts&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Add DROP statements&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나머지는 기본&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Start&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 다른 서버로 옮길 파일&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Extended inserts&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Remove DEFINER&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;필요하면 Add DROP statements&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 구조만 백업&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Structure only&lt;/span&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 하고 저장할 위치, 이름까지 설정하고 Start를 누르면 dump 파일이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHR1kU/dJMb99ZZeYw/I4yVFPV3HoKKjtcKnkotL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHR1kU/dJMb99ZZeYw/I4yVFPV3HoKKjtcKnkotL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHR1kU/dJMb99ZZeYw/I4yVFPV3HoKKjtcKnkotL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHR1kU%2FdJMb99ZZeYw%2FI4yVFPV3HoKKjtcKnkotL1%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;578&quot; height=&quot;362&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완료되면 이렇게 팝업이 뜰거고, 여기에서 Start를 누르면 덤프를 또 생성한다는 것이므로 &lt;b&gt;&quot;취소&quot;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취소 후 팝업이 닫히고 파일 경로로 설정한 곳을 가서 확인해보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZxFhP/dJMcai3BOE4/eJMoC4hjgWGqld20MDex9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZxFhP/dJMcai3BOE4/eJMoC4hjgWGqld20MDex9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZxFhP/dJMcai3BOE4/eJMoC4hjgWGqld20MDex9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZxFhP%2FdJMcai3BOE4%2FeJMoC4hjgWGqld20MDex9k%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;628&quot; height=&quot;38&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;38&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;dump된 sql 파일이 잘 생성되어졌다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. dump한 파일 복원&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 덤프된 sql파일을 내가 원하는 database에 실행시켜 테이블 구조 및 데이터를 복원하는 과정을 진행할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 덤프한 database는 excel 데이터베이스이고 이 데이터베이스 안에 있는 excel_test, member 테이블을 덤프했다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 이 덤프한 파일을 dbeaver-dump 데이터베이스에서 실행시켜 테이블을 복원할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1J3cY/dJMcac99YeR/eoFyLCHw4sm7N4kynlAWFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1J3cY/dJMcac99YeR/eoFyLCHw4sm7N4kynlAWFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1J3cY/dJMcac99YeR/eoFyLCHw4sm7N4kynlAWFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1J3cY%2FdJMcac99YeR%2FeoFyLCHw4sm7N4kynlAWFk%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;578&quot; height=&quot;433&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;454&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덤프한 파일을 실행시키는 방법은 해당 database 우클릭 후 &quot;도구&quot; &amp;gt; &quot;Restore database&quot; 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZWKQ/dJMcaaLkPdu/mbI2yBWEGGZyd9PHKxqcBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZWKQ/dJMcaaLkPdu/mbI2yBWEGGZyd9PHKxqcBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZWKQ/dJMcaaLkPdu/mbI2yBWEGGZyd9PHKxqcBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZWKQ%2FdJMcaaLkPdu%2FmbI2yBWEGGZyd9PHKxqcBK%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;578&quot; height=&quot;339&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;424&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클릭하면 해당 팝업이 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/begQox/dJMcaiJj958/y7IL3oLaUGmDRohwKB5fKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/begQox/dJMcaiJj958/y7IL3oLaUGmDRohwKB5fKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/begQox/dJMcaiJj958/y7IL3oLaUGmDRohwKB5fKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbegQox%2FdJMcaiJj958%2Fy7IL3oLaUGmDRohwKB5fKK%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;578&quot; height=&quot;342&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;429&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 다음 input에 아까 덤프한 sql 파일을 넣어주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 다음 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;Start!&lt;/b&gt;&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;&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;818&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJEBK/dJMcahRdl3x/DM3UBExSBadR45IUNkW9GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJEBK/dJMcahRdl3x/DM3UBExSBadR45IUNkW9GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJEBK/dJMcahRdl3x/DM3UBExSBadR45IUNkW9GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJEBK%2FdJMcahRdl3x%2FDM3UBExSBadR45IUNkW9GK%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;578&quot; height=&quot;298&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;422&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 dbeaver-dump 데이터베이스를 확인해보면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0CVUG/dJMcabpXNE4/CelTzoMwHWBX1SpbJKdk3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0CVUG/dJMcabpXNE4/CelTzoMwHWBX1SpbJKdk3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0CVUG/dJMcabpXNE4/CelTzoMwHWBX1SpbJKdk3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0CVUG%2FdJMcabpXNE4%2FCelTzoMwHWBX1SpbJKdk3k%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;578&quot; height=&quot;262&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 excel_test, member 테이블 모두 잘 복원이 되었다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DBeaver로 덤프, 복원하는 방법만 알고 있으면 데이터베이스를 안전하게 옮기는데에 큰 문제는 없을 것이다!&lt;/span&gt;&lt;/p&gt;</description>
      <category>DB</category>
      <category>DBeaver</category>
      <category>dump</category>
      <category>sql</category>
      <category>덤프</category>
      <category>덤프하는 법</category>
      <category>복원</category>
      <category>복원하는 법</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/48</guid>
      <comments>https://lucy1215.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 17 Mar 2026 11:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] 이미지(파일) 저장</title>
      <link>https://lucy1215.tistory.com/47</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;최근 SpringBoot에서 이미지(파일)를 불러와 저장할 때 어떻게 했었더라?라는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 생각이 드는 것과 동시에 이미지 파일을 업로드 하는 과정을 나 스스로 설명을 못한다는 것이 까먹었다는 증거이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번에는 가장 개발의 가장 기본이자 필수인 이미지 파일 저장 과정을 다시 해보면서 복습하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 파일의 저장에는 대표적인 방법에는 2가지 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 이미지 자체는 DB에 저장하는 방식 (BLOB 형식 그대로 사용)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BLOB (Binary Large Object) 방식은 이진 형식의 데이터를 직접 DB에 저장하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 자체가 DB에 저장되므로 별도의 경로나 URL이 필요없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업 및 복구가 용이하다.&lt;/li&gt;
&lt;li&gt;데이터의 일관성을 유지한다.&lt;/li&gt;
&lt;li&gt;파일 접근을 강력하게 제어 가능하다.&lt;/li&gt;
&lt;li&gt;파일 보안을 강화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB의 크기가 빠르게 증가할 우려가 있다.&lt;/li&gt;
&lt;li&gt;백업 및 복구 작업이 복잡해질 수 있다.&lt;/li&gt;
&lt;li&gt;DB I/O 작업이 더 많아질 수 있다.&lt;/li&gt;
&lt;li&gt;성능 저하 문제가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 경로 저장 방식으로 DB에 간접적으로 저장하는 방식 (파일 시스템에 저장)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 파일 시스템에 저장하고 DB에는 해당 파일의 URL이나 파일 이름만 저장하는 방법이다.&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;보통 파일 시스템은 DB에 비해 값이 저렴하므로 같은 용량의 이미지를 저장할 때 DB에 비해 경제적이며 DB에 이미지를 저장하는 경우보다 작업을 빠르게 처리할 수 있다. =&amp;gt; 유동적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점은 저장소가 요구된다는 점과 이미지의 주소를 알고 있는 누구나 이미지에 접근할 수 있기 때문에 대부분 추가적인 보안 처리가 필요하다.&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;2가지 방식 중 주로 파일 시스템에 저장하는 방식을 택하여 이미지를 저장했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 직접 저장하는 것보다 파일 시스템에 저장하는 것이 경제적이며, 성능면에서도 좋기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 시스템에 저장하는 과정을 진행해 보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개발 환경&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SpringBoot 3.3.2&lt;/li&gt;
&lt;li&gt;Java 17&lt;/li&gt;
&lt;li&gt;h2 DataBase&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_cCw5kHbCrQ.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/przuE/btsIScQb9XU/HwHP2Y1XuLl5JqNMI1JlVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/przuE/btsIScQb9XU/HwHP2Y1XuLl5JqNMI1JlVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/przuE/btsIScQb9XU/HwHP2Y1XuLl5JqNMI1JlVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FprzuE%2FbtsIScQb9XU%2FHwHP2Y1XuLl5JqNMI1JlVK%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;1252&quot; height=&quot;184&quot; data-filename=&quot;chrome_cCw5kHbCrQ.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저와 유저의 프로필 사진을 저장하기 위한 DB 구조를 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이미지 업로드 Table - MemberImage&lt;/li&gt;
&lt;li&gt;MultipartFile 인터페이스로 구현&lt;/li&gt;
&lt;li&gt;유저와 이미지는 일대일(1:1) 관계&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 구조와 같이 SpringBoot에서 각각의 엔티티를 작성하도록 하겠다.&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;b&gt;엔티티 생성&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Member 엔티티 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유저 정보를 저장하는 엔티티이다. MemberImage 필드를 일대일로 참조한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저가 삭제되면 이미지도 삭제되어야 하므로 영속성 전이를 설정해 준다. &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;CascadeType.ALL&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;고아 객체 관리를 위해 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;orphanRemoval을 true&lt;/span&gt;&lt;/b&gt;로 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722344636708&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter @Setter
@NoArgsConstructor
@Table(name = &quot;member&quot;)
public class Member {

    @Id
    @Column(name = &quot;user_id&quot;)
    private Long userId;

    @NotEmpty
    @Column(name = &quot;user_pw&quot;)
    private String userPw;

    @NotEmpty
    @Column(name = &quot;name&quot;)
    private String name;

    @OneToOne(mappedBy = &quot;member&quot;, cascade = CascadeType.ALL, orphanRemoval = true)
    private MemberImage memberImage;


    public Member(Long userId, String userPw, String name, MemberImage memberImage) {
        this.userId = userId;
        this.userPw = userPw;
        this.name = name;
    }
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MemberImage 엔티티 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미지를 저장할 엔티티이다. Member 엔티티를 일대일로 참조한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722345473844&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter @Setter
@NoArgsConstructor
@Table(name = &quot;member_image&quot;)
public class MemberImage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = &quot;file_num&quot;)
    private Long fileNum;

    @OneToOne
    @JoinColumn(name = &quot;user_id&quot;, nullable = false)
    private Member member;

    @NotEmpty
    @Column(name = &quot;file_name&quot;)
    private String fileName;

    public MemberImage(Member member, String fileName) {
        this.member = member;
        this.fileName = fileName;
    }
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Repository 인터페이스 생성&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MemberRepository 생성&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Member 객체를 저장하는 saveMember() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Member 객체를 찾는 finMember() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722346115140&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.example.demo.domain.Member;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class MemberRepository {

    private final EntityManager em;

    public void saveMember(Member member) {
        em.persist(member);
    }

    public Member findMember(Long userId) {
        return em.find(Member.class, userId);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;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;MemberImageRepository 생성&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MemberImage 객체를 저장하는 saveImage() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722346381432&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.example.demo.domain.MemberImage;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class MemberImageRepository {

    private final EntityManager em;

    public void saveImage(MemberImage memberImage) {
        em.persist(memberImage);
    }
}&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;b&gt;Service 생성&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MemberImageService 생성&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 파일을 저장하는 uploadImage() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;db에 저장할 이미지 파일 경로를 생성하는 saveImage() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722346594756&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.example.demo.domain.Member;
import com.example.demo.domain.MemberImage;
import com.example.demo.repository.MemberImageRepository;
import com.example.demo.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class MemberImageService {

    private final MemberRepository memberRepository;
    private final MemberImageRepository memberImageRepository;

    // 이미지 파일을 저장하는 메서드
    public void uploadImage(Member member, MultipartFile image) {
        try {
            // 이미지 파일 저장을 위한 경로 설정
            String uploadsDir = &quot;src/main/resources/static/uploads/images/&quot;;

            // 이미지 파일 경로를 저장
            String dbFilePath = saveImage(image, uploadsDir);

            // MemberImage 엔티티 생성 및 저장
            MemberImage memberImage = new MemberImage(member, dbFilePath);
            memberImageRepository.saveImage(memberImage);

        } catch (IOException e) {
            // 파일 저장 중 오류가 발생한 경우 처리
            e.printStackTrace();
        }

    }

    public String saveImage(MultipartFile image, String uploadsDir) throws IOException{

        //파일 이름 생성
        String fileName = UUID.randomUUID().toString().replace(&quot;-&quot;, &quot;&quot;) + &quot;_&quot; + image.getOriginalFilename();

        //실제 파일이 저장될 경로
        String filePath = uploadsDir + fileName;

        // DB에 저장할 경로 문자열
        String dbFilePath = &quot;/uploads/images/&quot; + fileName;

        Path path = Paths.get(filePath); // Path 객체 생성
        Files.createDirectories(path.getParent()); // 디렉토리 생성
        Files.write(path, image.getBytes()); // 디렉토리에 파일 저장

        return dbFilePath;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;MemberService 생성&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Member 객체, 이미지 파일을 저장하는 join() 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722346545348&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.example.demo.domain.Member;
import com.example.demo.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class MemberService {

    private final MemberRepository memberRepository;
    private final MemberImageService memberImageService;

    public Long join(Member member, MultipartFile image) {

        memberRepository.saveMember(member);
        memberImageService.uploadImage(member,image);

        return member.getUserId();
    }

    public Member fineOne(Long userId) {
        return memberRepository.findMember(userId);
    }
    
}&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;b&gt;Controller 생성&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MemberController 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1722347106498&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.example.demo.domain.Member;
import com.example.demo.service.MemberService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequiredArgsConstructor
@Slf4j
public class MemberController {

    private final MemberService memberService;

    @PostMapping(&quot;members/new&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; create(@Valid @RequestParam(&quot;image&quot;)MultipartFile image, @ModelAttribute Member member) {
        Long userId = memberService.join(member, image);

        return ResponseEntity.status(HttpStatus.CREATED).body(&quot;유저 등록 완료. Id : &quot; + userId);
    }
}&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;b&gt;확인&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Postman_u4XGmCNwn4.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGYD9/btsIRZpXDcE/PcnkiEiBFdO9nwvRMT9yMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGYD9/btsIRZpXDcE/PcnkiEiBFdO9nwvRMT9yMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGYD9/btsIRZpXDcE/PcnkiEiBFdO9nwvRMT9yMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGYD9%2FbtsIRZpXDcE%2FPcnkiEiBFdO9nwvRMT9yMk%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;976&quot; height=&quot;476&quot; data-filename=&quot;Postman_u4XGmCNwn4.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Postman을 이용해 유저를 생성하는 엔드포인트에 FormData 형식으로 사진과 필요한 필드를 전송하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;유저 등록 완료. Id : 1&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, DB를 확인해 보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_6GnqtUc7VC.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTBHY/btsISIOSuzV/cnRiGDQVbHkbdaooCovvdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTBHY/btsISIOSuzV/cnRiGDQVbHkbdaooCovvdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTBHY/btsISIOSuzV/cnRiGDQVbHkbdaooCovvdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTBHY%2FbtsISIOSuzV%2FcnRiGDQVbHkbdaooCovvdK%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;355&quot; data-filename=&quot;chrome_6GnqtUc7VC.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MEMBER 테이블과 MEMBER_IMAGE 테이블에 알맞게 저장되어 있는 것을 확인할 수 있다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;idea64_Jcd3jLd1G2.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4DOPI/btsIQmUb7QJ/tfnHBijnGcpwijzjFOswr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4DOPI/btsIQmUb7QJ/tfnHBijnGcpwijzjFOswr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4DOPI/btsIQmUb7QJ/tfnHBijnGcpwijzjFOswr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4DOPI%2FbtsIQmUb7QJ%2FtfnHBijnGcpwijzjFOswr0%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;459&quot; height=&quot;131&quot; data-filename=&quot;idea64_Jcd3jLd1G2.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 이미지를 저장하려는 위치인 /resources/static/uploads/images 경로가 생성되었고 해당 경로에 이미지가 추가된 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Java</category>
      <category>image</category>
      <category>JPA</category>
      <category>springboot</category>
      <category>upload</category>
      <category>이미지 저장</category>
      <category>파일 저장</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/47</guid>
      <comments>https://lucy1215.tistory.com/47#entry47comment</comments>
      <pubDate>Tue, 30 Jul 2024 23:06:36 +0900</pubDate>
    </item>
    <item>
      <title>[JPA] JPA란?</title>
      <link>https://lucy1215.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 JPA (Java Persistence API)에 대해 알아보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 JPA를 사용하지 않고 SQL문을 직접 작성하여 개발했었다. JPA는 기존에 SQL 중심적인 개발에서 객체 중심으로 개발할 수 있게 사용하는 프레임워크이다. 즉, JPA는 자바 진영에서 ORM (Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Spring Data.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bksk7C/btsIO4eMW3W/FNxkNtSc3GwAarSSX5k580/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bksk7C/btsIO4eMW3W/FNxkNtSc3GwAarSSX5k580/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bksk7C/btsIO4eMW3W/FNxkNtSc3GwAarSSX5k580/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbksk7C%2FbtsIO4eMW3W%2FFNxkNtSc3GwAarSSX5k580%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;300&quot; height=&quot;300&quot; data-filename=&quot;Spring Data.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, JPA에서 Persistence는 무슨 의미이고, 또 ORM 은 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Persistence부터 알아보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_IjxjMOfu4D.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZM88P/btsIOTqS81h/YU9Igchezso8fcn9zu6kcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZM88P/btsIOTqS81h/YU9Igchezso8fcn9zu6kcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZM88P/btsIOTqS81h/YU9Igchezso8fcn9zu6kcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZM88P%2FbtsIOTqS81h%2FYU9Igchezso8fcn9zu6kcK%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;493&quot; data-filename=&quot;chrome_IjxjMOfu4D.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;582&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;Persistence는 JPA에서 &quot;영속성&quot;이라는 의미로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA에는 &lt;b&gt;영속성 컨텍스트&amp;nbsp;&lt;/b&gt;라는 개념이 존재하는데 JPA를 이해하는데 가장 중요한 용어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속성 컨텍스트는 &lt;u&gt;&lt;b&gt;&quot;엔티티를 영구 저장하는 환경&quot;이라는&lt;/b&gt;&lt;/u&gt; 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 JPA라는 개념은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&quot;데이터를 영속성있게 관리해 주는 API&quot;라고&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;&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;다음은 ORM에 대해 알아보도록 하자.&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;여태까지 내가 Java로 DB를 조작해 온 방법은 SQL Mapper였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 직접 DB를 조작하는 SQL Mapper와 다르게 간접적으로 DB를 조작하는 방법을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘의 차이점에 대해 알아보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SQL Mapper&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Object와 SQL의 필드를 매핑하여 데이터를 객체화하는 기술이다.&lt;/li&gt;
&lt;li&gt;Mapper 방식을 사용한다면 중복되는 코드들을 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 줄 지 바인딩하는 방법&lt;/li&gt;
&lt;li&gt;ex) JdbcTemplate, Mybatis&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비슷한 SQL문이 여전히 존재한다.&lt;/li&gt;
&lt;li&gt;테이블의 필드가 추가되거나 삭제될 경우 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 한다.&lt;/li&gt;
&lt;li&gt;SQL에 의존적인 개발을 피하기 어렵다.&lt;/li&gt;
&lt;li&gt;객체답게 모델링할수록 매핑 작업만 늘어난다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제점들과 &quot;객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없을까?&quot;라는 의문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나온 것이 ORM 방식이다.&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;ORM (Object - Relational Mapping)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Object와 DB테이블을 매핑하여 데이터를 객체화하는 기술&lt;/li&gt;
&lt;li&gt;객체는 객체대로 설계, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.&lt;/li&gt;
&lt;li&gt;ORM 프레임워크가 중간에서 매핑한다.&lt;/li&gt;
&lt;li&gt;대중적인 언어에는 대부분 ORM 기술이 존재한다.&lt;/li&gt;
&lt;li&gt;ex) Hibernate, JPA, Spring-Data-JPA&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL 중심적인 개발에서 객체 중심으로 개발이 가능하다.&lt;/li&gt;
&lt;li&gt;필드 변경 시 기존 모든 SQL 수정을 해야 했던 SQL Mapper 방식과 다르게 필드만 변경하면 된다.&lt;br /&gt;=&amp;gt; 유지보수가 쉽다.&lt;/li&gt;
&lt;li&gt;성능 최적화
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;1차 캐시와 동일성 보장 : 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. =&amp;gt; 약간의 조회 성능 향상&lt;/li&gt;
&lt;li&gt;트랜잭션을 지원하는 쓰기 지연&lt;/li&gt;
&lt;li&gt;지연 로딩 : 객체가 실제 사용될 때 로딩&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트가 복잡해질수록 어려움이 있다.&lt;/li&gt;
&lt;li&gt;복잡한 SQL의 경우 개발자가 직접 추가해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 ORM 방식을 사용한다는 것, 직접 SQL 매핑하지 않는다는 것을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA에 대해 더 알아보도록 하자.&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;JPA (Java Persistence API)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음이다.&lt;/li&gt;
&lt;li&gt;JPA는 애플리케이션과 JDBC 사이에서 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 JPA를 왜 사용해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문에는 여러 가지의 답변이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, &quot;&lt;b&gt;생산성&quot;&lt;/b&gt; 측면이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 SQL Mapper에서 SQL문을 직접 작성하는 방법보다 JPA를 사용하면 훨씬 생산성 있는 개발을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA의 저장부터 조회, 수정, 삭제를 보자.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JPA 동작 - 저장&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JPA 동작 - 저장.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZP3Or/btsIQenwFSL/VdbbpkbZKpF73K8xwxmKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZP3Or/btsIQenwFSL/VdbbpkbZKpF73K8xwxmKh0/img.png&quot; data-alt=&quot;출처 : 자바 ORM 표준 JPA 프로그래밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZP3Or/btsIQenwFSL/VdbbpkbZKpF73K8xwxmKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZP3Or%2FbtsIQenwFSL%2FVdbbpkbZKpF73K8xwxmKh0%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;500&quot; height=&quot;290&quot; data-filename=&quot;JPA 동작 - 저장.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 자바 ORM 표준 JPA 프로그래밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 Member 데이터를 저장할 때, MemberDAO에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;jpa.persist(member);&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문장만 작성해 주면 DB에 Member 데이터가 저장되는 것이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JPA 동작 - 조회&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JPA 동작 - 조회.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJyDm/btsIRd2vjnW/4CQi4RMiAUHdfmatKK6jxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJyDm/btsIRd2vjnW/4CQi4RMiAUHdfmatKK6jxK/img.png&quot; data-alt=&quot;출처 : 자바 ORM 표준 JPA 프로그래밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJyDm/btsIRd2vjnW/4CQi4RMiAUHdfmatKK6jxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJyDm%2FbtsIRd2vjnW%2F4CQi4RMiAUHdfmatKK6jxK%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;500&quot; height=&quot;298&quot; data-filename=&quot;JPA 동작 - 조회.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 자바 ORM 표준 JPA 프로그래밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 DB에서 Member 데이터를 조회하려고 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Member member = jpa.find(memberId);&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문장만 작성해 주면 Member 데이터가 조회가 되는 것이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JPA - 수정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 수정 메서드를 제공하지 않는다. 따라서 데이터 수정 시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 UPDATE문이 실행하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;member.setName(&quot;변경할 이름&quot;);&lt;/b&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;&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;JPA - 삭제&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;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;jpa.remove(member);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용하면 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA는 반복적인 CRUD SQL을 처리해 준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만 하면 되고, 예측도 쉽게 할 수 있다. 또한 생산성, 유지보수, 성능 측면에서 SQL Mapper 방식보다 유리하게 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 JPA는 &lt;b&gt;패러다임의 불일치&lt;/b&gt;도 해결하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA에서는 부모클래스와 자식클래스의 관계. 즉, 상속관계가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에서는 이러한 객체의 상속관계를 지원하지 않는다. 이런 &lt;b&gt;상속관계를 JPA는 해결하였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;패러다임의 불일치.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baKRkD/btsIQIaBJDd/KQebrDhvForwfzORJw75q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baKRkD/btsIQIaBJDd/KQebrDhvForwfzORJw75q1/img.png&quot; data-alt=&quot;출처 : 자바 ORM 표준 JPA 프로그래밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baKRkD/btsIQIaBJDd/KQebrDhvForwfzORJw75q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaKRkD%2FbtsIQIaBJDd%2FKQebrDhvForwfzORJw75q1%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;230&quot; data-filename=&quot;패러다임의 불일치.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 자바 ORM 표준 JPA 프로그래밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구조에서 만약 Album 클래스를 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;저장&lt;/span&gt;&lt;/b&gt;한다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 아래의 코드를 작성할 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1722170439022&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jpa.persist(album);&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;그러면 JPA는 위의 코드를 아래의 코드를 처리하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1722170547032&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO ITEM (ID, NAME, PRICE) ...
INSERT INTO ALBUM (ARTIST) ...&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Album 클래스를 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;조회&lt;/span&gt;&lt;/b&gt;할 때도 마찬가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 아래의 코드를 작성하는 것이 할 일이다.&lt;/p&gt;
&lt;pre id=&quot;code_1722170654153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Album album = jpa.find(Album.class, albumId);&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;그러면 나머지는 JPA가 처리하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1722170721036&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT I.*, A.*
	FROM ITEM I
    	JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID&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;p data-ke-size=&quot;size16&quot;&gt;상속관계뿐만 아니라, &lt;b&gt;연관관계&lt;/b&gt;에서의 접근도 제공해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfoHjX/btsIPyUq4ri/PBLUwDzH07OpoANgHeiWa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfoHjX/btsIPyUq4ri/PBLUwDzH07OpoANgHeiWa0/img.png&quot; data-alt=&quot;출처 : 자바 ORM 표준 JPA 프로그래밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfoHjX/btsIPyUq4ri/PBLUwDzH07OpoANgHeiWa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfoHjX%2FbtsIPyUq4ri%2FPBLUwDzH07OpoANgHeiWa0%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;473&quot; height=&quot;287&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 자바 ORM 표준 JPA 프로그래밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 구조는 Member 클래스가 Team 타입의 team 필드 변수를 가지고 있는 형태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 연관관계가 있는 구조에서 Member 객체를 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;저장&lt;/b&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;개발자는 아래처럼 member 객체에 team객체를 set 하고 member 객체를 저장하는 코드를 작성하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1722171172296&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Member member = new Member();
member.setId(&quot;1&quot;);
member.setUserName(&quot;gang&quot;);

Team team = new Team();
team.setName(&quot;backend_team&quot;);

member.setTeam(team);
jpa.persist(member);&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;그러면 JPA는 아래의 코드를 데이터베이스에게 실행하라고 할 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1722171369225&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO MEMBER (ID, TEAM_ID, USERNAME) ...
INSERT INTO TEAM (ID, NAME)...&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;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: #dddddd;&quot;&gt;조회&lt;/span&gt;&lt;/b&gt;할 때도 마찬가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 아래의 코드를 작성하고&lt;/p&gt;
&lt;pre id=&quot;code_1722171458495&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();&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;나머지는 JPA가 처리하게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1722171504259&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT M.*, T.*
	FROM MEMBER M
    	JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID&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;위와 같은 구조들이 더 복잡해진다고 해도 JPA는 이를 모두 지원해 주기 때문에 문제없이 사용할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 JPA가 무엇인지, 왜 사용해야 하는지 알아보았다. 다음에는 JPA를 실제로 사용하여 개발하는 과정을 다루겠다.&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;p data-ke-size=&quot;size14&quot;&gt;참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722171688750&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;자바 ORM 표준 JPA 프로그래밍 : 네이버 도서&quot; data-og-description=&quot;네이버 도서 상세정보를 제공합니다.&quot; data-og-host=&quot;search.shopping.naver.com&quot; data-og-source-url=&quot;https://search.shopping.naver.com/book/catalog/32436007738&quot; data-og-url=&quot;https://search.shopping.naver.com/book/catalog/32436007738&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ckUtV1/hyWGZbDsrv/MlDoNBRQbbLbYSGt31QOe0/img.jpg?width=458&amp;amp;height=609&amp;amp;face=0_0_458_609,https://scrap.kakaocdn.net/dn/dDKImW/hyWGOnGdBC/0YnTbVJx13UfMfXDlbb6mK/img.jpg?width=640&amp;amp;height=853&amp;amp;face=0_0_640_853,https://scrap.kakaocdn.net/dn/pJNx8/hyWGNI4yDw/xc5jIRsoREk7mL6rEgBhhK/img.jpg?width=300&amp;amp;height=399&amp;amp;face=0_0_300_399&quot;&gt;&lt;a href=&quot;https://search.shopping.naver.com/book/catalog/32436007738&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://search.shopping.naver.com/book/catalog/32436007738&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ckUtV1/hyWGZbDsrv/MlDoNBRQbbLbYSGt31QOe0/img.jpg?width=458&amp;amp;height=609&amp;amp;face=0_0_458_609,https://scrap.kakaocdn.net/dn/dDKImW/hyWGOnGdBC/0YnTbVJx13UfMfXDlbb6mK/img.jpg?width=640&amp;amp;height=853&amp;amp;face=0_0_640_853,https://scrap.kakaocdn.net/dn/pJNx8/hyWGNI4yDw/xc5jIRsoREk7mL6rEgBhhK/img.jpg?width=300&amp;amp;height=399&amp;amp;face=0_0_300_399');&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;자바 ORM 표준 JPA 프로그래밍 : 네이버 도서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 도서 상세정보를 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;search.shopping.naver.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;
&lt;figure id=&quot;og_1722171756110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SQL Mapper와 ORM 차이&quot; data-og-description=&quot;프로그램을 실행하는 동안 그 안에서는 많은 데이터들이 사용되고, 만들어진다. 우리는 이 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 것이 필요한데, 이 개념이 바&quot; data-og-host=&quot;deveun.tistory.com&quot; data-og-source-url=&quot;https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4&quot; data-og-url=&quot;https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBqgfO/hyWGScxsNj/fhERkVp6Kyitk2qnzzKJq0/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473,https://scrap.kakaocdn.net/dn/MBly7/hyWGQy0MUD/cKrUHZW8iylraDunETItGK/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473,https://scrap.kakaocdn.net/dn/qM2AM/hyWGS4FBAm/W3SMOGNli12op6mT3EasyK/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473&quot;&gt;&lt;a href=&quot;https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBqgfO/hyWGScxsNj/fhERkVp6Kyitk2qnzzKJq0/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473,https://scrap.kakaocdn.net/dn/MBly7/hyWGQy0MUD/cKrUHZW8iylraDunETItGK/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473,https://scrap.kakaocdn.net/dn/qM2AM/hyWGS4FBAm/W3SMOGNli12op6mT3EasyK/img.png?width=625&amp;amp;height=473&amp;amp;face=0_0_625_473');&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;SQL Mapper와 ORM 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로그램을 실행하는 동안 그 안에서는 많은 데이터들이 사용되고, 만들어진다. 우리는 이 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 것이 필요한데, 이 개념이 바&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;deveun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java</category>
      <category>JPA</category>
      <category>ORM</category>
      <category>springjpa</category>
      <category>SQL Mapper</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/46</guid>
      <comments>https://lucy1215.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 28 Jul 2024 22:13:22 +0900</pubDate>
    </item>
    <item>
      <title>2023년 회고록</title>
      <link>https://lucy1215.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문득 올해 2023년을 되돌아보며 회고록을 남겨야겠다는 생각이 들어 작성하기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년이 됐을 때가 얼마 전인 것 같은데 벌써 1년이 지나갔다니... 시간이 정말 빠른 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막상 쓰려고 하니 올해 일인데도 기억이 잘 나지 않을 뿐만 아니라 올해를 정신없이 보낸 것 같은 느낌이다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Keep (이건 좋았다! 앞으로도 계속할 점)&lt;/li&gt;
&lt;li&gt;Problem (아쉬웠던 부분)&lt;/li&gt;
&lt;li&gt;Try (이렇게 해보는 건 어떨까?)&lt;/li&gt;
&lt;li&gt;Final Action Item (실행해야 될 행동)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등으로 총 4가지로 요약해서 적어보았다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Keep (이건 좋았다! 앞으로도 계속할 점)&lt;/b&gt;&lt;/span&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;첫 번째로는 회사에 입사한 것이다. 올해 4월에 NHN Service QA팀에 입사하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 입사라는 뜻깊은 경험을 가지게 되었고, 회사 팀원분들도 다들 좋으시고 팀 분위기도 너무 좋아서 금방 적응할 수 있게 되었다. 원래 QA 직종은 나에게는 익숙하지 않았던 곳이었고, 회사 업무에 대한 경험을 배우고 내년에 개발자로 이직할 예정이지만 현재 회사 생활에 대해서는 너무 만족하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 주중에는 회사를 다니지만 주말에는 알바를 하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변 지인들에게 회사와 알바를 같이 하고 있다고 말하면 다들 이해를 못 하는 표정을 짓지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 바쁘게 사는 걸 좋아하다 보니 주말 오전에도 알바를 하게 되었다. 그 덕분에 늦잠을 못 자긴 하지만.. ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바쁘게 살다 보면 뭔가 살아있음을 느끼게 되는데 이 감정이 되게 좋아서 바쁘게 살고 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 + 알바를 하는 덕분에 저축도 열심히 하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청약도 매달 넣고 있고 개인적으로 적금도 넣고 있다.&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;6월에는 운전면허를 땄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 차를 살 돈이나 이유는 없지만 미리 따놓는 게 좋을 것 같아서 도전해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운전은 역시.. 나 같은 쫄보가 하기엔 무서운 것이다.. ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 올해 자격증 시험을 여러 개 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해 초에는 컴활 자격증, 정보처리기사(필기)를 땄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10월에는 정보처리기사(실기)를 봤는데 정말 아쉽게도 한 문제로 떨어졌다..ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제는 SQLD 자격증 시험을 봤다. 결과는 12월 달에 나오는데 이건 붙었으면 좋겠다!!&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Problem (아쉬웠던 부분)&lt;/b&gt;&lt;/span&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;올해 가장 아쉬웠던 점은 회사 일로 인해 코딩/알고리즘 공부를 소홀하게 했다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 다니기 전에는 적어도 하루에 알고리즘 한 문제는 풀었었는데 바빠지다 보니 요즘에는 이것조차도 안 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 보니 코딩도 점점 까먹는 것 같다.. 코딩/알고리즘 공부를 다시 시작할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 바쁘게 살다 보니 정작 내 몸 관리를 안 한 것 같다. 평소에는 틈나면 야외 달리기나 헬스를 했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 자격증 공부를 하다 보니 운동도 안 하고 먹기만 했다.. 그 덕에 살도 쪘다 ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살이 너무 쪄서 12월부터 헬스를 다닐 예정이다. 운동 열심히 해야겠다!!&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Try (이렇게 해보는 건 어떨까?)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;올해 바쁘게만 살아와서 휴식도 필요하다는 생각이 들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;코딩 공부를 열심히 하자는 의미에서 인강을 들어보는 건 어떨까? 또한 개인 프로젝트를 하나 진행해 보는 것도 좋을 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;내년 초에 꼭 정처기 자격증을 딸 것이다. 내년에는 바로 합격하자!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;내년 이직을 위해 자소서도 미리미리 수정해 놓는 것이 좋을 것 같다. 내년 이직 파이팅!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;또한 내년에는 좋은 사람들을 많이 많이 만나고 싶다. 그러기 위해서 나부터 좋은 사람이어야 하겠지?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Final Action Item (실행해야 될 행동)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 Try부분에서 다 얘기했지만 그중에 가장 중요한 2가지만 다시 적어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해가 끝나기 전에 운동 시작하자!&lt;/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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;2023년도 한 달 밖에 남지 않았다. 한 달 동안 알차게! 행복하게! 의미 있게! 보내야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내년 2024년도 파이팅!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctnF6j/btsAw8vL03F/EmWajbYS0av2h0UwNcq3ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctnF6j/btsAw8vL03F/EmWajbYS0av2h0UwNcq3ak/img.png&quot; data-alt=&quot;퍼스널컬러 받고 바로 염색한 사진 ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctnF6j/btsAw8vL03F/EmWajbYS0av2h0UwNcq3ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctnF6j%2FbtsAw8vL03F%2FEmWajbYS0av2h0UwNcq3ak%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;419&quot; height=&quot;559&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퍼스널컬러 받고 바로 염색한 사진 ㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>2023년 회고록</category>
      <category>2024년 화이팅</category>
      <category>회고록</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/45</guid>
      <comments>https://lucy1215.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 19 Nov 2023 14:01:27 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 25206번 : 너의 평점은 (JAVA)</title>
      <link>https://lucy1215.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 회사 인턴생활 + 알바 + 운동에 치이고 살았던 나는 4개월만에 백준 문제를 풀어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4개월동안 알고리즘 문제를 푼 적이 없어 실버 5단계 문제인데도 시간이 조금 걸렸다...ㅋㅋㅋ&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;&lt;b&gt;&amp;lt;문제&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_bvsjzHFMF9.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSivMr/btsqZuhD4QH/A05tXguq4SDHiiBiKk45zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSivMr/btsqZuhD4QH/A05tXguq4SDHiiBiKk45zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSivMr/btsqZuhD4QH/A05tXguq4SDHiiBiKk45zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSivMr%2FbtsqZuhD4QH%2FA05tXguq4SDHiiBiKk45zk%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;1040&quot; height=&quot;848&quot; data-filename=&quot;chrome_bvsjzHFMF9.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_xcb3n7sLL5.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23j9d/btsq2O6W6lR/xq6MSHK3ANO45SiqocwDY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23j9d/btsq2O6W6lR/xq6MSHK3ANO45SiqocwDY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23j9d/btsq2O6W6lR/xq6MSHK3ANO45SiqocwDY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23j9d%2Fbtsq2O6W6lR%2Fxq6MSHK3ANO45SiqocwDY1%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;1058&quot; height=&quot;441&quot; data-filename=&quot;chrome_xcb3n7sLL5.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_rEo9jSVkys.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKpJg4/btsq5bHKgpb/I04dO89jMi4ehhaKYim3sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKpJg4/btsq5bHKgpb/I04dO89jMi4ehhaKYim3sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKpJg4/btsq5bHKgpb/I04dO89jMi4ehhaKYim3sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKpJg4%2Fbtsq5bHKgpb%2FI04dO89jMi4ehhaKYim3sk%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;1074&quot; height=&quot;579&quot; data-filename=&quot;chrome_rEo9jSVkys.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_KzV0qNVrdp.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4RhNY/btsq1JSn6Vo/zGxywwZbrAPpISjju1o0H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4RhNY/btsq1JSn6Vo/zGxywwZbrAPpISjju1o0H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4RhNY/btsq1JSn6Vo/zGxywwZbrAPpISjju1o0H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4RhNY%2Fbtsq1JSn6Vo%2FzGxywwZbrAPpISjju1o0H0%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;1058&quot; height=&quot;566&quot; data-filename=&quot;chrome_KzV0qNVrdp.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;문제 해석&amp;gt;&lt;/b&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;전공 평점 = (학점 x 과목평점) / 학점의 총합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*단, 학점이 P인 경우에는 계산에 포함시키지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;문제 해결&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. BufferedReader 로 과목명, 학점, 등급을 입력받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. StringTokenizer 로 학점, 등급을 저장 후,&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;4. 전공 평점을 계산해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 단, &quot;P&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;&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;&amp;lt;코드&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691897818473&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static double[] s_card = {4.5,4.0,3.5,3.0,2.5,2.0,1.5,1.0,0.0};
	static String[] r_card = {&quot;A+&quot;,&quot;A0&quot;,&quot;B+&quot;,&quot;B0&quot;,&quot;C+&quot;,&quot;C0&quot;,&quot;D+&quot;,&quot;D0&quot;,&quot;F&quot;};

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		double total=0;
		double s_total=0;
		double pass = 0;

		for(int y=0;y&amp;lt;20;y++) {

			double o_score = 0, mul = 0;
			StringTokenizer st = new StringTokenizer(br.readLine());

			st.nextToken();
			double score = Double.parseDouble(st.nextToken());
			String rank = st.nextToken();


			for(int i=0;i&amp;lt;s_card.length;i++) {
				if(rank.equals(r_card[i])) {
					o_score = s_card[i];
					mul = score * o_score;
					total+=mul;
					s_total += score;
					pass = total/s_total;
				}
				if(rank.equals(&quot;P&quot;)) {
					continue;
				}
			}


		}	
		System.out.printf(&quot;%.6f\n&quot;,pass);
	}
}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 풀면서 한가지 깨달았던 것은 &lt;b&gt;코딩은 꾸준히 해야한다는 것&lt;/b&gt;이다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도 시간이 날 때마다 꾸준히 문제를 풀어야겠다..ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/25206&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691898187589&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;25206번: 너의 평점은&quot; data-og-description=&quot;인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/25206&quot; data-og-url=&quot;https://www.acmicpc.net/problem/25206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ezmGO6/hyTCH6xTK2/umyh9KbijSp1Kamj9NnPyk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/25206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ezmGO6/hyTCH6xTK2/umyh9KbijSp1Kamj9NnPyk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;25206번: 너의 평점은&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>Baekjoon</category>
      <category>Baekjoon 25206번</category>
      <category>java 25206</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/44</guid>
      <comments>https://lucy1215.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 13 Aug 2023 12:44:50 +0900</pubDate>
    </item>
    <item>
      <title>[정보처리기사] 실기 정리 - 9. 소프트웨어 개발 보안 구축</title>
      <link>https://lucy1215.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Secure SDLC&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Secure SDLC는 보안상 안전한 소프트웨어를 개발하기 위해 SDLC에 보안 강화를 위한 프로세스를 포함한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Secure SDLC는 요구사항 분석, 설계, 구현, 테스트, 유지보수 등 SDLC 전체 단계에 걸쳐 수행되어야 할 보안 활동을 제시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Secure SDLC의 대표적인 방법론&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%; text-align: center;&quot;&gt;방법론&lt;/td&gt;
&lt;td style=&quot;width: 75.2326%; text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%; text-align: center;&quot;&gt;CLASP&lt;/td&gt;
&lt;td style=&quot;width: 75.2326%;&quot;&gt;SDLC의 초기 단계에서 보안을 강화하기 위해 개발된 방법론&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%; text-align: center;&quot;&gt;SDL&lt;/td&gt;
&lt;td style=&quot;width: 75.2326%;&quot;&gt;마이크로소프트 사에서 안전한 소프트웨어 개발을 위해 기존의 SDLC를 개선한 방법론&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%; text-align: center;&quot;&gt;Seven Touchpoints&lt;/td&gt;
&lt;td style=&quot;width: 75.2326%;&quot;&gt;소프트웨어 보안의 모범사례를 SDLC에 통합한 방법론&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;SDLC 단계별 보안 활동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 요구사항 분석 단계&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;2. 설계 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;3. 구현 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;4. 테스트 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;5. 유지보수 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 이전 과정을 모두 수행하였음에도 발생할 수 있는 보안사고들을 식별함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;size18&quot;&gt;&lt;b&gt;소프트웨어 개발 보안 요소&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: center;&quot;&gt;보안 요소&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: left;&quot;&gt;기밀성 &lt;br /&gt;(Confidentiality)&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%;&quot;&gt;- 시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용됨&lt;br /&gt;- 정보가 전송 중에 노출되더라도 데이터를 읽을 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: left;&quot;&gt;무결성 &lt;br /&gt;(Integrity)&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%;&quot;&gt;시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: left;&quot;&gt;가용성 &lt;br /&gt;(Availability)&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%;&quot;&gt;인가받은 사용자는 시스템 내의 정보와 자원을 언제라도 사용할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: left;&quot;&gt;인증 &lt;br /&gt;(Authentication)&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%;&quot;&gt;- 시스템 내의 정보와 자원을 사용하려는 사용자가 합법적인 사용자인지를 확인하는 모든 행위&lt;br /&gt;- 대표적 방법 : 패스워드, 인증용 카드, 지문 검사 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8373%; text-align: left;&quot;&gt;부인 방지 &lt;br /&gt;(NonRepudiation)&lt;/td&gt;
&lt;td style=&quot;width: 76.1627%;&quot;&gt;데이터를 송&amp;middot;수신한 자가 송&amp;middot;수신 사실을 부인할 수 없도록 송&amp;middot;수신 증거를 제공함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;시큐어 코딩(Secure Coding)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시큐어 코딩(Secure Coding)은 구현 단계에서 발생할 수 있는 보안 취약점들을 최소화하기 위해 &lt;b&gt;보안 요소들을 고려하며 코딩하는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 보안 취약점을 사전 대응하여 안정성과 신뢰성을 확보한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 보안 정책을 바탕으로 시큐어 코딩 가이드를 작성하고, 개발 참여자에게는 시큐어 코딩 교육을 실시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;입력 데이터 검증 및 표현&lt;/b&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;보안 설명&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;SQL 삽입&lt;br /&gt;(Injection)&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 웹 응용 프로그램에 SQL을 삽입하여 내부 데이터베이스(DB) 서버의 데이터를 유출 및 변조하고, 관리자 인증을 우회하는 보안 약점&lt;br /&gt;- 동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정하여 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;경로 조작 및 &lt;br /&gt;자원 삽입&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 데이터 입출력 경로를 조작하여 서버 자원을 수정 &amp;middot; 삭제할 수 있는 보안 약점&lt;br /&gt;&amp;nbsp;- 사용자 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터를 사용하여 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;크로스사이트 &lt;br /&gt;스크립팅&lt;br /&gt;(XSS)&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나, 비정상적인 기능 수행을 유발하는 보안 약점&lt;br /&gt;- HTML 태그의 사용을 제한하거나 스크립트에 삽입되지 않도록 '&amp;lt;', '&amp;gt;', '&amp;amp;' 등의 문자를 다른 문자로 치환함으로써 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;운영체제&lt;br /&gt;명령어 삽입&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 외부 입력값을 통해 시스템 명령어의 실행을 유도함으로써 권한을 탈취하거나 시스템 장애를 유발하는 보안 약점&lt;br /&gt;- 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록 하고, 외부 입력값을 검증 없이 내부 명령어로 사용하지 않음으로써 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;위험한 형식 &lt;br /&gt;파일 업로드&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템에 손상을 주거나, 시스템을 제어할 수 있는 보안 약점&lt;br /&gt;- 업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹사이트와 파일 서버의 경로 분리, 실행 속성을 제거하는 등의 방법으로 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;신뢰되지 않는&lt;br /&gt;URL 주소로&lt;br /&gt;자동접속 연결&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 입력 값으로 사이트 주소를 받는 경우 이를 조작하여 방문자를 피싱 사이트로 유도하는 보안 약점&lt;br /&gt;- 연결되는 외부 사이트의 주소를 화이트 리스트로 관리함으로써 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4418%;&quot;&gt;메모리 버퍼&lt;br /&gt;오버플로&lt;/td&gt;
&lt;td style=&quot;width: 77.5582%;&quot;&gt;- 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 때 발생하는 보안 약점&lt;br /&gt;- 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고, 설정된 범위의 메모리 내에서 올바르게 읽거나 쓸 수 있도록 함으로써 방지할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;암호 알고리즘&lt;/b&gt;&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;- 암호 방식 분류&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chrome_Ww6nhsT7pR.png&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BqaXo/btslbQiW5tT/s6kMDoOY7j3dCpuSRwIusk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BqaXo/btslbQiW5tT/s6kMDoOY7j3dCpuSRwIusk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BqaXo/btslbQiW5tT/s6kMDoOY7j3dCpuSRwIusk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBqaXo%2FbtslbQiW5tT%2Fs6kMDoOY7j3dCpuSRwIusk%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;1383&quot; height=&quot;608&quot; data-filename=&quot;chrome_Ww6nhsT7pR.png&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개인키 암호화(Private Key Encryption) 기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 개인키 암호화 기법은 &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;&amp;nbsp;- 암호화/복호화 속도가 빠르지만, 관리해야 할 키의 수가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 개인키 암호화 기법의 종류&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.3721%;&quot;&gt;스트림 암호화 방식&lt;/td&gt;
&lt;td style=&quot;width: 81.6279%;&quot;&gt;- 평문과 동일한 길이의 스트림을 생성하여 비트 단위로 암호화 하는 방식&lt;br /&gt;- 종류 : LFSR, RC4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.3721%;&quot;&gt;블록 암호화 방식&lt;/td&gt;
&lt;td style=&quot;width: 81.6279%;&quot;&gt;- 한 번에 하나의 데이터 블록을 암호화 하는 방식&lt;br /&gt;- 종류 : DES, SEED, AES, ARIA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;공개키 암호화(Public Key Encryption) 기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공개키 암호화 기법은 데이터를 &lt;b&gt;암호화할 때 사용하는 공개키(Public Key)는&lt;/b&gt; 사용자에게 &lt;b&gt;공개하고,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복호화할 때의 &lt;b&gt;비밀키(Secret Key)는 관리자가 비밀리에 관리하는 암호화 기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비대칭 암호 기법이라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관리해야 할 키의 수가 적지만, 암호화/복호화 속도가 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적으로는 RSA(Rivest Shamir Adleman) 기법이 있다.&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;size18&quot;&gt;&lt;b&gt;양방향 알고리즘의 종류&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%; text-align: center;&quot;&gt;알고리즘&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%; text-align: center;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;SEED&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%;&quot;&gt;- 1999년 한국인터넷진흥원(KISA)에서 개발한 블록 암호화 알고리즘&lt;br /&gt;- 블록 크기는 128비트이며, 키 길이에 따라 128, 256으로 분류됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;ARIA (Academy,&lt;br /&gt;Research Institute,&lt;br /&gt;Agency)&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%;&quot;&gt;2004년 국가정보원과 산학연협회가 개발한 블록 암호화 알고리즘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;DES (Data Encryption&lt;br /&gt;Standard)&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%;&quot;&gt;- 1975년 미국 NBS에서 발표한 개인키 암호화 알고리즘&lt;br /&gt;- 블록 크기는 64비트, 키 길이는 56비트이며 16회의 라운드를 수행함&lt;br /&gt;- DES를 3번 적용하여 보안을 더욱 강화한 3DES(Triple DES)도 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;AES (Advanced&lt;br /&gt;Encryption Standard)&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%;&quot;&gt;- 2001년 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘&lt;br /&gt;- DES의 한계를 느낀 NIST에서 공모한 후 발표&lt;br /&gt;- 블록 크기는 128비트이며, 키 길이에 따라 AES-128, AES-192, AES-256으로 분류됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;RSA (Rivest Shamir&lt;br /&gt;Adleman)&lt;/td&gt;
&lt;td style=&quot;width: 75.6977%;&quot;&gt;- 1978년 MIT의 라이베스트(Rivest), 샤미르(Shamir), 애들먼(Adleman)에 의해 제안된 공개키 암호화 알고리즘&lt;br /&gt;- 큰 숫자를 소인수분해 하기 어렵다는 것에 기반하여 만들어짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;해시(Hash)&lt;/b&gt;&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;- 해시 알고리즘을 해시 함수라고 부르며, 해시 함수로 변환된 값이나 키를 해시값 또는 해시키라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터의 암호화, 무결성 검증을 위해 사용될 뿐만 아니라 정보보호의 다양한 분야에서 활용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해시 함수의 종류&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3256%; text-align: center;&quot;&gt;해시 함수&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%; text-align: center;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3256%;&quot;&gt;SHA 시리즈&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%;&quot;&gt;- 1993년 미국 국가안보국(NSA)이 설계, 미국 국립표준기술 연구소(NIST)에 의해 발표됨&lt;br /&gt;- 초기 개발된 SHA-0 이후 SHA-1이 발표되었고, 다시 SHA-2라고 불리는 SHA-224, SHA-256, SHA-384, SHA-512가 발표됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3256%;&quot;&gt;MD5 &lt;br /&gt;(Message Digest&lt;br /&gt;algorithm 5)&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%;&quot;&gt;- 1991년 R.Rivest가 MD4를 대체하기 위해 고안한 암호화 해시 함수&lt;br /&gt;- 블록 크기가 512비트이며, 키 길이는 128비트임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3256%;&quot;&gt;N-NASH&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%;&quot;&gt;- 1989년 일본의 전신전화주식회사(NTT)에서 발표한 암호화 해시 함수&lt;br /&gt;- 블록 크기와 키 길이가 모두 128비트임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3256%;&quot;&gt;SNEFRU&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%;&quot;&gt;- 1990년 R.C.Merkle가 발표한 해시 함수&lt;br /&gt;- 32비트 프로세서에서 구현을 용이하게 할 목적으로 개발됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;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;size18&quot;&gt;&lt;b&gt;서비스 거부(DoS; Denial of Service) 공격&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 서비스 거부 공격이란 표적이 되는 서버의 자원을 고갈시킬 목적으로 다수의 공격자 또는 시스템에서 &lt;b&gt;대량의 데이터를 한 곳의 서버에 집중적으로 전송함으로써,&lt;/b&gt; 표적이 되는 &lt;b&gt;서버의 정상적인 기능을 방해하는 것&lt;/b&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; &amp;nbsp;- Ping of Death&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- SMURFING&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- SYN Flooding&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- TearDrop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- LAND Attack&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DDoS 공격&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;size18&quot;&gt;&lt;b&gt;Ping of Death (죽음의 핑)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ping of Death는 Ping 명령을 전송할 때 &lt;b&gt;패킷의 크기를 인터넷 프로토콜 허용 범위 이상으로 전송하여&lt;/b&gt; 공격 대상의 &lt;b&gt;네트워크를 마비시키는 서비스 거부 공격 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격에 사용되는 큰 패킷은 수백 개의 패킷으로 분할되어 전송되는데, 공격 대상은 분할된 대량의 패킷을 수신함으로써 분할되어 전송된 패킷을 재조립해야 하는 부담과 분할되어 전송된 각각의 패킷들의 ICMP Ping 메시지에 대한 응답을 처리하느라 시스템이 다운되게 된다.&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;size18&quot;&gt;&lt;b&gt;SMURFING(스머핑)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SMURFING은 &lt;b&gt;IP나 ICMP의 특성을 악용하여 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크를 불능 상태로 만드는 공격 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자는 송신 주소를 공격 대상지의 IP주소로 위장하고 해당 네트워크 라우터의 브로드캐스트 주소를 수신지로 하여 패킷을 전송하면, 라우터의 브로드캐스트 주소로 수신된 패킷은 해당 네트워크 내의 모든 컴퓨터로 전송된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 네트워크 내의 모든 컴퓨터는 수신된 패킷에 대한 응답 메시지를 송신 주소인 공격 대상지로 집중적으로 전송하게 되는데, 이로 인해 공격 대상지는 네트워크 과부하로 인해 정상적인 서비스를 수행할 수 없게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SMURFING 공격을 무력화하는 방법 중 하나는 각 네트워크 라우터에서 브로드캐스트 주소를 사용할 수 없게 미리 설정해 놓는 것이다.&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;size18&quot;&gt;&lt;b&gt;SYN Flooding&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TCP(Transmission Control Protocol)는 신뢰성 있는 전송을 위해 3-way-handshake 를 거친 후에 데이터를 전송하게 되는데, SYN Flooding은 공격자가 가상의 클라이언트로 위장하여 &lt;b&gt;3-way-handshake 과정을 의도적으로 중단시킴으로써&lt;/b&gt; 공격 대상지인&lt;b&gt; 서버가 대기 상태에 놓여 정상적인 서비스를 수행하지 못하게 하는 공격 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SYN Flooding에 대비하기 위해 수신지의 'SYN' 수신 대기 시간을 줄이거나 침입 차단 시스템을 활용한다.&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;size18&quot;&gt;&lt;b&gt;TearDrop&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터의 송&amp;middot;수신 과정에서 패킷의 크기가 커 여러 개의 분할되어 전송될 때 분할 순서를 알 수 있도록 Fragment Offset 값을 함께 전송하는데, TearDrop은 이 &lt;b&gt;Offset 값을 변경시켜 수신 측에서&lt;/b&gt; 패킷을 재조립할 때 오류로 인한 &lt;b&gt;과부하를 발생시킴으로써 시스템이 다운되도록 하는 공격 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TearDrop에 대비하기 위해 Fragment Offset이 잘못된 경우 해당 패킷을 폐기하도록 설정한다.&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;size18&quot;&gt;&lt;b&gt;LAND Attack (Local Area Network Denial Attack)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LAND Attack은 &lt;b&gt;패킷을 전송할 때 송신 IP 주소와 수신 IP 주소를 모두 공격 대상의 IP 주소로 하여&lt;/b&gt; 공격 대상에게 전송하는 것으로, 이 패킷을 받은 공격 대상은 송신 IP 주소가 자신이므로 자신에게 응답을 수행하게 되는데, 이러한 패킷이 계속해서 전송될 경우 &lt;b&gt;자신에 대해 무한히 응답하게 하는 공격&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LAND Attack에 대비하기 위해 송신 IP 주소와 수신 IP 주소의 적절성을 검사한다.&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;size18&quot;&gt;&lt;b&gt;DDoS(Distributed Denial of Service, 분산 서비스 거부) 공격&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DDoS 공격은 &lt;b&gt;여러 곳에 분산된 공격 지점에서 한 곳의 서버에 대해 분산 서비스 공격을 수행하는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크에서 취약점이 있는 호스트들을 탐색한 후 이들 호스트들에 분산 서비스 공격용 툴을 설치하 에이전트(Agent)로 만든 후 DDoS 공격에 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분산 서비스 공격용 툴 : 에이전트(Agent)의 역할을 수행하도록 설계된 프로그램으로 데몬(Daemon)이라고 부르며, 다음과 같은 종류가 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%;&quot;&gt;종류&lt;/td&gt;
&lt;td style=&quot;width: 81.3953%;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%;&quot;&gt;Trin00&lt;/td&gt;
&lt;td style=&quot;width: 81.3953%;&quot;&gt;가장 초기 형태의 데몬으로, 주로 UDP Flooding 공격을 수행함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%;&quot;&gt;TFN (Tribe Flood&lt;br /&gt;Network)&lt;/td&gt;
&lt;td style=&quot;width: 81.3953%;&quot;&gt;UDP Flooding 뿐만 아니라 TCP SYN Flooding 공격, ICMP 응답 요청, 스머핑 공격 등을 수행함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%;&quot;&gt;TFN2K&lt;/td&gt;
&lt;td style=&quot;width: 81.3953%;&quot;&gt;TFN의 확장판&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%;&quot;&gt;Stacheldraht&lt;/td&gt;
&lt;td style=&quot;width: 81.3953%;&quot;&gt;- 이전 툴들의 기능을 유지하면서, 공격자, 마스터, 에이전트가 쉽게 노출되지 않도록 암호화된 통신을 수행함&lt;br /&gt;- 툴이 자동으로 업데이트됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;네트워크 침해 공격 관련 용어&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%; text-align: center;&quot;&gt;용어&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%; text-align: center;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;세션 하이재킹&lt;br /&gt;(Session Hijacking)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;- 상호 인증 과정을 거친 후 접속해 있는 서버와 서로 접속되어 클라이언트 사이의 세션 정보를 가로채는 공격 기법으로, 접속을 위한 인증 정보 없이도 가로챈 세션을 이용해 공격자가 원래의 클라이언트인 것처럼 위장하여 서버의 자원이나 데이터를 무단으로 사용함&lt;br /&gt;- TCP 3-Way-Handshake 과정에 끼어듦으로써 클라이언트와 서버 간의 동기화된 시퀀스 번호를 가로채 서버에 무단으로 접근하는 TCP 세션 하이재킹이 대표적임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;ARP 스푸핑&lt;br /&gt;(ARP Spoofing)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;ARP의 취약점을 이용한 공격 기법으로, 자신의 물리적 주소(MAC)를 공격대상의 것으로 변조하여 공격 대상에게 도달해야 하는 데이터 패킷을 가로채거나 방해함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;스미싱 (Smishing)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;- 문자 메시지(SMS)를 이용해 사용자의 개인 신용 정보를 빼내는 수법&lt;br /&gt;- 초기에는 문자 메시지를 이용해 개인 비밀정보나 소액 결제를 유도하는 형태로 시작되었음&lt;br /&gt;- 현재는 각종 행사 안내, 경품 안내 들의 문자 메시지에 링크를 걸어 안드로이드 앱 설치 파일인 apk 파일을 설치하도록 유도하여 사용자 정보를 빼가는 수법으로 발전하고 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;스피어 피싱&lt;br /&gt;(Spear Phishing)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;사회 공학의 한 기법으로, 특정 대상을 선정한 후 그 대상에게 일반적인 이메일로 위장한 메일을 지속적으로 발송하여, 발송 메일의 본문 링크나 첨부된 파일을 클릭하도록 유도해 사용자의 개인 정보를 탈취함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;APT (Advanced&lt;br /&gt;Persistent Threats,&lt;br /&gt;지능형 지속 위협)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;˚ 다양한 IT 기술과 방식들을 이용해 조직적으로 특정 기업이나 조직 네트워크에 침투해 활동 거점을 마련한 뒤 때를 기다리면서 보안을 무력화시키고 정보를 수집한 다음 외부로 빼돌리는 형태의 공격&lt;br /&gt;˚ 공격 방법&lt;br /&gt;&amp;nbsp; &amp;nbsp;- 내부자에게 악성코드가 포함된 이메일을 오랜 기간 동안 꾸준히 발송해 한 번이라도 클릭되길 기다리는 형태&lt;br /&gt;&amp;nbsp; &amp;nbsp;- 스턱스넷(Stuxnet)과 같이 악성코드가 담긴 이동식 디스크(USB) 등으로 전파하는 형태&lt;br /&gt;&amp;nbsp; &amp;nbsp;- 악성코드에 감염된 P2P 사이트에 접속하면 악성코드에 감염되는 형태 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;무작위 대입 공격&lt;br /&gt;(B r u t e&amp;nbsp; &amp;nbsp;F o r c e&lt;br /&gt;Attack)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;암호화된 문서의 암호키를 찾아내기 위해 적용 가능한 모든 값을 대입하여 공격하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;큐싱 (Qshing)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;QR코드 (Quick Response Code)를 통해 악성 앱의 다운로드를 유도하거나 악성 프로그램을 설치하도록 하는 금용사기 기법의 하나로, QR코드와 개인정보 및 금융정보를 낚는다(Fishing)는 의미의 합성 신조어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;SQL 삽입 (Injection)&lt;br /&gt;공격&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;전문 스캐너 프로그램 혹은 봇넷 등을 이용해 웹사이트를 무차별적으로 공격하는 과정에서 취약한 사이트가 발견되면 데이터베이스 등의 데이터를 조작하는 일련의 공격 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;크로스 사이트&lt;br /&gt;스크립팅&lt;br /&gt;(XSS; Cross Site&lt;br /&gt;Scripting)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;- 네트워크를 통한 컴퓨터 보안 공격의 하나로, 웹 페이지의 내용을 사용자 브라우저에 표현하기 위해 사용되는 스크립트의 취약점을 악용한 해킹 기법&lt;br /&gt;- 사용자가 특정 게시물이나 이메일의 링크를 클릭하면 악성 스크립트가 실행되어 페이지가 깨지거나, 사용자의 컴퓨터에있는 로그인 정보나 개인 정보, 내부 자료 등이 해커에게 전달된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.0233%;&quot;&gt;스니핑(Sniffing)&lt;/td&gt;
&lt;td style=&quot;width: 76.9767%;&quot;&gt;네트워크의 중간에서 남의 패킷 정보를 도청하는 해킹 유형의 하나로 수동적 공격에 해당함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정보 보안 침해 공격 관련 용어&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%; text-align: center;&quot;&gt;용어&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%; text-align: center;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;좀비(Zombie) PC&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;악성코드에 감염되어 다른 프로그램이나 컴퓨터를 조종하도록 만들어진 컴퓨터로, C&amp;amp;C(Command &amp;amp; Control) 서버의 제어를 받아 주로 DDoS 공격 등에 이용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;C&amp;amp;C 서버&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;해커가 원격지에서 감염된 좀비 PC에 명령을 내리고 악성코드를 제어하기 위한 용도로 사용하는 서버를 말함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;봇넷(Botnet)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;악성 프로그램에 감염되어 악의적인 의도로 사용될 수 있는 다수의 컴퓨터들이 네트워크로 연결된 형태를 말함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;웜(Worm)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;네트워크를 통해 연속적으로 자신을 복제하여 시스템의 부하를 높임으로써 결국 시스템을 다운시키는 바이러스의 일종으로, 분산 서비스 거부 공격, 버퍼 오버플로 공격, 슬래머 등이 웜 공격의 한 형태임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;제로 데이 공격&lt;br /&gt;(Zero Day Attack)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;보안 취약점이 발견되었을 때 발견된 취약점의 존재 자체가 널리 공표되기도 전에 해당 취약점을 통하여 이루어지는 보안 공격으로, 공격의 신속성을 의미함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;키로거 공격&lt;br /&gt;(Key Logger Attack)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;컴퓨터 사용자의 키보드 움직임을 탐지해 ID, 패스워드, 계좌 번호, 카드번호 등과 같은 개인의 중요한 정보를 몰래 빼가는 해킹 공격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;랜섬웨어&lt;br /&gt;(Ransomware)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 파일 등을 암호화해 사용자가 열지 못하게 하는 프로그램으로, 암호 해독용 프로그램의 전달을 조건으로 사용자에게 돈을 요구하기도 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;백도어&lt;br /&gt;(Back Door, Trap&lt;br /&gt;Door)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;- 시스템 설계자가 서비스 기술자나 유지 보수 프로그램 작성자(Programmer)의 액세스 편의를 위해 시스템 보안을 제거하여 만들어놓은 비밀 통로로, 컴퓨터 범죄에 악용되기도 함&lt;br /&gt;- 백도어 탐지 방법 : 무결성 검사, 열린 포트 확인, 로그 분석, SetUID 파일 검사 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;트로이 목마&lt;br /&gt;(Trojan Horse)&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;정상적인 기능을 하는 프로그램으로 위장하여 프로그램 내에 숨어 있다가 해당 프로그램이 동작할 때 활성화되어 부작용을 일으키는 것으로, 자기 복제 능력은 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;보안 솔루션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 접근 통제, 침입 차단 및 탐지 등을 수행하여 &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;&amp;nbsp; &amp;nbsp;- 방화벽&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 침입 탐지 시스템(IDS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 침입 방지 시스템(IPS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 데이터 유출 방지(DLP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 웹 방화벽&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- VPN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- NAC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ESM&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;size18&quot;&gt;방화벽(Firewall)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방화벽은 기업이나 조직 &lt;b&gt;내부의 네트워크와 인터넷 간에 전송되는 정보를 선별하여 수용&amp;middot;거부&amp;middot;수정하는 기능을 가진 침입 차단 시스템&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내부 네트워크에서 외부로 나가는 패킷은 그대로 통과시키고, 외부에서 내부 네트워크로 들어오는 패킷은 내용을 엄밀히 체크하여 인증된 패킷만 통과시키는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;침입 탐지 시스템(IDS; Instrusion Detection System)&lt;/b&gt;&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;- &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;오용 탐지 (Misuse Detection)&lt;/span&gt;&lt;/b&gt; : 미리 입력해 둔 공격 패턴이 감지되면 이를 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;이상 탐지 (Anomaly Detection)&lt;/span&gt;&lt;/b&gt; : 평균적인 시스템의 상태를 기준으로 비정상적인 행위나 자원의 사용이 감지되면 이를 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;침입 방지 시스템(IPS; Intrusion Prevention System)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 침입 방지 시스템은&lt;b&gt; 비정상적인 트래픽을 능동적으로 차단하고 격리하는&lt;/b&gt; 등의 방어 조치를 취하는 &lt;b&gt;보안 솔루션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 침입 방지 시스템은 방화벽과 침입 탐지 시스템을 결합한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 침입 탐지 기능으로 패킷을 하나씩 검사한 후 비정상적인 패킷이 탐지되면 방화벽 기능으로 해당 패킷을 차단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터 유출 방지(DLP; Data Leakage/Loss Prevention&lt;/b&gt;)&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;- 사내 직원이 사용하는 PC와 네트워크상의 모든 정보를 검색하고 메일, 메신저, 웹하드, 네트워크 프린터 등의 사용자 행위를 탐지 &amp;middot; 통제해 외부로의 유출을 사전에 막는다.&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;size18&quot;&gt;&lt;b&gt;웹 방화벽 (Web Firewall)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 방화벽은 일반 방화벽이 탐지하지 못하는 SQL 삽입 공격, Cross-Site Scripting(XSS) 등의 &lt;b&gt;웹 기반 공격을 방어할 목적으로 만들어진 웹 서버에 특화된 방화벽&lt;/b&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;size18&quot;&gt;&lt;b&gt;VPN(Virtual Private Network, 가상 사설 통신망)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPN은 인터넷 등 통신 사업자의 &lt;b&gt;공중 네트워크와 암호화 기술을 이용하여 사용자가 마치 자신의 전용 회선을 사용하는 것처럼 해주는 보안 솔루션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 암호화된 규격을 통해 인터넷망을 전용선의 사설망을 구축한 것처럼 이용하므로 비용 부담을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원격지의 지사, 영업소, 이동 근무자가 지역적인 제한 없이 업무를 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;NAC(Network Access Control)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NAC은 &lt;b&gt;네트워크에 접속하는 내부 PC의&lt;/b&gt; MAC주소를 IP관리 시스템에 등록한 후 &lt;b&gt;일관된 보안 관리 기능을 제공하는 보안 솔루션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내부 PC의 소프트웨어 사용 현황을 관리하여 불법적인 소프트웨어 설치를 방지한다.&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;size18&quot;&gt;&lt;b&gt;ESM(Enterprise Security Management)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ESM은 다양한 장비에서 발생하는 &lt;b&gt;로그 및 보안 이벤트를 통합하여 관리하는 보안 솔루션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방화벽, IDS, IPS, 웹 방화벽, VPN 등에서 발생한 로그 및 보안 이벤트를 통합하여 관리함으로써 비용 및 자원을 절약할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 보안 솔루션 간의 상호 연동을 통해 종합적인 보안 관리 체계를 수립할 수 있다.&lt;/p&gt;</description>
      <category>자격증/정보처리기사</category>
      <category>소프트웨어 개발 보안 추구</category>
      <category>정보처리기사</category>
      <category>정처기 실기</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/43</guid>
      <comments>https://lucy1215.tistory.com/43#entry43comment</comments>
      <pubDate>Fri, 30 Jun 2023 12:10:37 +0900</pubDate>
    </item>
    <item>
      <title>[정보처리기사] 실기 정리 - 8. SQL 응용</title>
      <link>https://lucy1215.tistory.com/42</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;8.&lt;b&gt; SQL 응용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SQL - DDL&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DDL(Data Define Language, 데이터 정의어)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DDL은 DB 구조, 데이터 형식, 접근 방식 등 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DB를 구축하거나 수정할 목적으로 사용하는 언어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 번역한 결과가 데이터 사전(Data Dictionary) 이라는 특별한 파일에 여러 개의 테이블로 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DDL의 3가지 유형&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 87.4419%; height: 75px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;CREATE&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ALTER&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;TABLE에 대한 정의를 변경하는 데 사용함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;DROP&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 삭제함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE SCHEMA&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CREATE SCHEMA는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;스키마를 정의하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687502165658&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE SCHEMA 스키마명 AUTHORIZATION 사용사_id;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE DOMAIN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CREATE DOMAIN은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;도메인을 정의하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687502261786&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE DOMAIN 도메인명 [AS] 데이터_타입
	   [DEFAULT 기본값]
	   [CONSTRAINT 제약조건명 CHECK (범위값)];&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;- 기본값 : 데이터를 입력하지 않았을 때 자동으로 입력되는 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE TABLE&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CREATE TABLE은 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;테이블을 정의하는 명령문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687502554433&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE 테이블명
	(속성명 데이터_타입 [DEFAULT 기본값] [NOT NULL], &amp;middot;&amp;middot;&amp;middot;
    [, PRIMARY KEY(기본키_속성명, &amp;middot;&amp;middot;&amp;middot;)]
    [, UNIQUE(대체키_속성명, &amp;middot;&amp;middot;&amp;middot;)]
    [, FOREIGN KEY(외래키_속성명, &amp;middot;&amp;middot;&amp;middot;)]
    	REFERENCES 참조테이블(기본키_속성명, &amp;middot;&amp;middot;&amp;middot;)]
        [ON DELETE 옵션]
        [ON UPDATE 옵션]
	[, CONSTRAINT 제약조건명] [CHECK (조건식)];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 테이블에 포함될 모든 속성에 대하여 속성명과 그 속성의 데이터 타입, 기본값, NOT NULL 여부를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PRIMARY KEY : 기본키로 사용할 속성을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- UNIQUE : 대체키로 사용할 속성을 지정함, 중복된 값을 가질 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FOREIGN KEY ~ REFERENCES ~ : 외래키로 사용할 속성을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ON DELETE 옵션 : 참조 테이블의 튜플이 삭제되었을 때 기본 테이블에 취해야 할 사항을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ON UPDATE 옵션 : 참조 테이블의 참조 속성 값이 변경되었을 때 기본 테이블에 취해야 할 사항을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CONSTRAINT : 제약 조건의 이름을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CHECK : 속성 값에 대한 제약 조건을 정의함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE VIEW&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CREATE VIEW는 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;뷰(View) 를 정의하는 명령문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687502809155&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE VIEW 뷰명[(속성명[, 속성명, &amp;middot;&amp;middot;&amp;middot;])]
AS SELECT문;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE INDEX&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CREATE INDEX는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;인덱스를 정의하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687502894044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE [UNIQUE] INDEX 인덱스명
ON 테이블명(속성명 [ASC | DESC], [, 속성명 [ASC | DESC]])
[CLUSTER];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- UNIQUE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 사용된 경우 : 중복 값이 없는 속성으로 인덱스를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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; &amp;nbsp;- ASC : 오름차순 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DESC : 내림차순 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 생략된 경우 : 오름차순으로 정렬됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CLUSTER : 사용하면 인덱스가 클러스터드 인덱스로 설정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ALTER TABLE&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ALTER TABLE은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;테이블에 대한 정의를 변경하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687503077005&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 ADD 속성명 데이터_타입 [DEFAULT '기본값'];
ALTER TABLE 테이블명 ALTER 속성명 [SET DEFAULT '기본값'];
ALTER TABLE 테이블명 DROP COLUMN 속성명 [CASCADE];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADD :&amp;nbsp; 새로운 속성(열)을 추가할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ALTER : 특정 속성의 Default 값을 변경할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DROP COLUMN : 특정 속성을 삭제할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DROP&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DROP은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;스키마, 도메인, 기본 테이블, 뷰 테이블, 인덱스, 제약 조건 등을 제거하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687503262664&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP SCHEMA 스키마명 [CASCADE | RESTRICT];
DROP DOMAIN 도메인명 [CASCADE | RESTRICT];
DROP TABLE 테이블명 [CASCADE | RESTRICT];
DROP VIEW 뷰명 [CASCADE | RESTRICT];
DROP INDEX 인덱스명 [CASCADE | RESTRICT];
DROP CONSTRAINT 제약조건명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CASCADE : 제거할 요소를 참조하는 다른 모든 개체를 함께 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RESTRICT : 다른 개체가 제거할 요소를 참조중일 때는 제거를 취소한다.&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;size18&quot;&gt;&lt;b&gt;SQL - DCL&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DCL(Data Control Language, 데이터 제어어)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DCL은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;데이터의 보안, 무결성, 회복, 병행 제어 등을 정의하는 데 사용하는 언어&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DCL은 데이터베이스 관리자(DBA)가 데이터 관리를 목적으로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DCL의 종류&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;COMMIT&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;명령에 의해 수행된 결과를 실제 물리적 디스크로 저장하고,&lt;br /&gt;데이터베이스 조작 작업이 정상적으로 완료되었음을 관리자에게 알려줌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ROLLBACK&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;데이터베이스 조작 작업이 비정상적으로 종료되었을 때 원래의 상태로 복구함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;GRANT&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;데이터베이스 사용자에게 사용 권한을 부여함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;REVOKE&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;데이터베이스 사용자의 사용 권한을 취소함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GRANT / REVOKE&lt;/b&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;- GRANT : 권한 부여를 위한 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- REVOKE : 권한 취소를 위한 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자등급 지정 및 해제&lt;/p&gt;
&lt;pre id=&quot;code_1687503797069&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- GRANT 사용자등급 TO 사용자_ID_리스트 [IDENTIFIED BY 암호];
- REVOKE 사용자등급 FROM 사용자_ID_리스트;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블 및 속성에 대한 권한 부여 및 취소&lt;/p&gt;
&lt;pre id=&quot;code_1687503872731&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- GRANT 권한_리스트 ON 개체 TO 사용자 [WITH GRANT OPTION];
- REVOKE [GRANT OPTION FOR] 권한_리스트 ON 개체 FROM 사용자 [CASCADE];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 권한 종류 : ALL, SELECT, INSERT, DELETE, UPDATE 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WITH GRANT OPTION : 부여받은 권한을 다른 사용자에게 다시 부여할 수 있는 권한을 부여함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CASCADE : 권한 취소 시 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연쇄적으로 취소함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;COMMIT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- COMMIT은 트랙잭션 처리가 정상적으로 완료된 후 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;트랜잭션이 수행한 내용을 데이터베이스에 반영하는 명령&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- COMMIT 명령을 실행하지 않아도 DML문이 성공적으로 완료되면 자동으로 COMMIT되고, DML이 실패하면 자동으로 ROLLBACK이 되도록 Auto 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ROLLBACK&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ROLLBACK은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;변경되었으나 아직 COMMIT되지 않은 모든 내용들을 취소하고 데이터베이스를 이전 상태로 되돌리는 명령어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 트랜잭션 전체가 성공적으로 끝나지 못하면 일부 변경된 내용만 데이터베이스에 반영되는 비일관성(Inconsistency) 상태가 될 수 있기 때문에 일부분만 완료된 트랜잭션은 롤백(Rollback)되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SAVEPOINT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SAVEPOINT는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;트랜잭션 내에 ROLLBACK 할 위치인 저장점을 지정하는 명령어&lt;/b&gt;&lt;/span&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;- ROLLBACK 할 때 지정된 저장점까지의 트랜잭션 처리 내용이 모두 취소된다.&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;size18&quot;&gt;&lt;b&gt;SQL - DML&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DML(Data Manipulation Language, 데이터 조작어)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DML은 데이터베이스 사용자가 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;저장된 데이터를 실질적으로 관리하는데 사용되는 언어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DML은 데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DML의 유형&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;명령문&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;SELECT&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;테이블에서 튜플을 검색함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;INSERT&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;테이블에 새로운 튜플을 삽입함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;DELETE&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;테이블에서 튜플을 삭제함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;UPDATE&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;테이블에서 튜플의 내용을 갱신함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;삽입문(INSERT INTO ~ )&lt;/b&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;pre id=&quot;code_1687504405892&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO 테이블명([속성명1, 속성명2, &amp;middot;&amp;middot;&amp;middot;])
VALUES (데이터1, 데이터2, &amp;middot;&amp;middot;&amp;middot;);&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;- 기본 테이블의 모든 속성을 사용할 때는 속성명을 생략할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SELECT문을 사용하여 다른 테이블의 검색 결과를 삽입할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;삭제문 (DELETE FROM ~ )&lt;/b&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;pre id=&quot;code_1687504546471&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELETE
FROM 테이블명
[WHERE 조건];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 레코드를 삭제할 때는 WHERE절을 생략한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 레코드를 삭제하더라도 테이블 구조는 남아 있기 때문에 디스크에서 테이블을 완전히 제거하는 DROP과는 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;갱신문 (UPDATE ~ SET ~ )&lt;/b&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;pre id=&quot;code_1687504656015&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UPDATE 테이블명
SET 속성명 = 데이터[, 속성명=데이터, &amp;middot;&amp;middot;&amp;middot;]
[WHERE 조건];&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DML - SELECT-1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687504856129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [PREDICATE] [테이블명,]속성명 [AS 별칭][, [테이블명,]속성명, &amp;middot;&amp;middot;&amp;middot;]
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, &amp;middot;&amp;middot;&amp;middot;
				ORDER BY 속성명3, 속성명4, &amp;middot;&amp;middot;&amp;middot;)]
FROM 테이블명[, 테이블명, &amp;middot;&amp;middot;&amp;middot;]
[WHERE 조건]
[GROUP BY 속성명, 속성명, &amp;middot;&amp;middot;&amp;middot;]
[HAVING 조건]
[ORDER BY 속성명 [ASC | DESC]];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SELECT절&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- PREDICATE : 검색할 튜플 수를 제한하는 명령어를 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;▶ DISTINCT : 중복된 튜플이 있으면 그 중 첫 번째 한 개만 표시함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 속성명 : 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- AS : 속성이나 연산의 이름을 다른 이름으로 표시하기 위해 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FROM절 : 검색할 데이터가 들어있는 테이블 이름을 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WHERE절 : 검색할 조건을 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ORDER BY절 : 데이터를 정렬하여 검색할 때 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 속성명 : 정렬의 기준이 되는 속성명을 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- [ASC | DESC] : 정렬 방식으로, 'ASC'는 오름차순, 'DESC'는 내림차순이다. 생략하면 오름차순으로 지정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비교 연산자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;=&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&amp;lt; &amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&amp;gt;=&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;&amp;lt;=&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;같다&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;같지 않다&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;크다&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;작다&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;크거나 같다&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; text-align: center;&quot;&gt;작거나 같다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 논리 연산자 : NOT, AND, OR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LIKE 연산자 : 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플을 검색하기 위해 사용된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;대표 문자&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;%&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;_&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;모든 문자를 대표함&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;문자 하나를 대표함&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;숫자 하나를 대표함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SELECT 절에 원하는 속성을 지정하여 검색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687505341718&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) SELECT 사원 FROM 주소;&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;b&gt;조건 지정 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WHERE 절에 조건을 지정하여 조건에 만족하는 튜플만 검색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687505383015&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) SELECT * FROM 사원 WHERE 부서 = '기획' AND 주소 = '대흥동';&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;b&gt;정렬 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ORDER BY 절에 특정 속성을 지정하여 지정된 속성으로 자료를 정렬하여 검색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687505452256&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) SELECT * FROM 사원 ORDER BY 부서 ASC, 이름 DESC;&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;b&gt;하위 질의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하위 질의는 조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산자로 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687505549223&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) '취미'가 &quot;나이트댄스&quot;인 사원의 '이름'과 '주소'를 검색하시오.

SELECT 이름, 주소
FROM 사원
WHERE 이름 = (SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스');&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;b&gt;복수 테이블 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 테이블을 대상으로 검색을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687505668426&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) '경력'이 10년 이상인 사원의 '이름', '부서', '취미', '경력'을 검색하시오.

SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력 &amp;gt;= 10 AND 사원.이름 = 여가활동.이름;&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DML - SELECT-2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687505743282&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [PREDICATE] [테이블명,]속성명 [AS 별칭][, [테이블명,]속성명, &amp;middot;&amp;middot;&amp;middot;]
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, &amp;middot;&amp;middot;&amp;middot;
				ORDER BY 속성명3, 속성명4, &amp;middot;&amp;middot;&amp;middot;)]
FROM 테이블명[, 테이블명, &amp;middot;&amp;middot;&amp;middot;]
[WHERE 조건]
[GROUP BY 속성명, 속성명, &amp;middot;&amp;middot;&amp;middot;]
[HAVING 조건]
[ORDER BY 속성명 [ASC | DESC]];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그룹함수 : GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 함수를 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WINDOW 함수 : GROUP BY절을 이용하지 않고 속성의 값을 집계할 함수를 기술함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- PARTITION BY : WINDOW 함수의 적용 범위가 될 속성을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ORDER BY : PARTITION 안에서 정렬 기준으로 사용할 속성을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GROUP BY절 : 특정 속성을 기준으로 그룹화하여 검색할 때 사용한다. 일반적으로 GROUP BY절은 그룹 함수와 함께 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HAVING절 : GROUP BY와 함께 사용되며, 그룹에 대한 조건을 지정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그룹 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그룹 함수는 GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 때 사용된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 200px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;함수&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;COUNT(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 튜플 수를 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;SUM(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 합계를 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;AVG(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 평균을 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;MAX(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 최대값을 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;MIN(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 최소값을 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;STDDEV(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 표준편차를 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;VARIANCE(속성명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;그룹별 분산을 구하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;ROLLUP(속성명, 속성명, &amp;middot;&amp;middot;&amp;middot;)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;- 인수로 주어진 속성을 대상으로 그룹별 소계를 구하는 함수&lt;br /&gt;- 속성의 개수가 n개이면, n+1 레벨까지, 하위 레벨에서 상위 레벨 순으로 데이터가 집계됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;CUBE(속성명, 속성명, &amp;middot;&amp;middot;&amp;middot;)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;- ROLLUP과 유사한 형태지만 CUBE는 인수로 주어진 속성을 대상으로 모든 조합의 그룹별 소계를 구함&lt;br /&gt;- 속성의 개수가 n개이면, 2ⁿ 레벨까지, 상위 레벨에서 하위 레벨 순으로 데이터가 집계됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WINDOW 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WINDOWS 함수는 GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성의 값을 집계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수의 인수로 지정한 속성이 집계할 범위가 되는데, 이를 윈도우(WINDOW)라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WINDOW 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ROW_NUMBER() : 윈도우별로 각 레코드에 대한 일련번호를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- RANK() : 윈도우별로 순위를 반환하며, 공동 순위를 반영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DENSE_RANK() : 윈도우별로 순위를 반환하며, 공동 순위를 무시하고 순위를 부여한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WINDOW 함수 이용 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성을 범위로 하여 속성의 값을 집계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그룹 지정 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GROUP BY절에 지정한 속성을 기준으로 자료를 그룹화하여 검색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687506488909&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EX) &amp;lt;상여금&amp;gt; 테이블에서 '부서'별 '상여금'의 평균을 구하시오.

SELECT 부서, AVG(상여금) AS 평균
FROM 상여금
GROUP BY 부서;&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;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;- 집합 연산자를 사용하여 2개 이상의 테이블의 데이터를 하나로 통합한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687506542371&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 속성명1, 속성명2, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT 속성명1, 속성명2, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명
[ORDER BY 속성명 [ASC | DESC]];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 두 개의 SELECT문에 기술한 속성들은 개수와 데이터 유형이 서로 동일해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 집합 연산자의 종류 (통합 질의의 종류)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 326px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;집합 연산자&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;집합 종류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;UNION&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- 두 SELECT문의 조회 결과를 통합하여 모두 출력함&lt;br /&gt;- 중복된 행은 한 번만 출력함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;합집합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;UNION ALL&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- 두 SELECT문의 조회 결과를 통합하여 모두 출력함&lt;br /&gt;- 중복된 행도 그대로 출력함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;합집합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;INTERSECT&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;두 SELECT문의 조회 결과 중 공통된 행만 출력함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;교집합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;EXCEPT&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;첫 번째 SELECT문의 조회 결과에서 두 번째 SELECT문의 조회 결과를 제외한 행을 출력함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;차집합&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;DML - JOIN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JOIN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JOIN은 2개의 릴레이션에서 &lt;b&gt;연관된 튜플들을 결합하여, 하나의 새로운 릴레이션을 반환&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JOIN은 일반적으로 FROM절에 기술하지만, 릴레이션이 사용되는 곳 어디에나 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JOIN은 크게 INNER JOIN과 OUTER JOIN으로 구분된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;INNER JOIN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- INNER JOIN은 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건이 없는 INNER JOIN을 수행하면 CROSS JOIN과 동일한 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EQUI JOIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- EQUI JOIN은 JOIN 대상 테이블에서 공통 속성을 기준으로 '='(equal) 비교에 의해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- EQUI JOIN에서 JOIN 조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이 중 중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법을 NATURAL JOIN이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- EQUI JOIN에서 연결 고리가 되는 공통 속성을 JOIN 속성이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- WHERE절을 이용한 EQUI JOIN의 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507140213&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1, 테이블명2, &amp;middot;&amp;middot;&amp;middot;
WHERE 테이블명1.속성명 = 테이블명2.속성명;&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; &amp;nbsp; - NATURAL JOIN절을 이용한 EQUI JOIN의 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507194721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1 NATURAL JOIN 테이블명2;&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; &amp;nbsp; - JOIN ~ USING절을 이용한 EQUI JOIN의 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507259344&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1 JOIN 테이블명2 USING(속성명);&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;- NON-EQUI JOIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- NON-EQUI JOIN은 JOIN 조건에 '=' 조건이 아닌 나머지 비교 연산자, 즉 &amp;gt;, &amp;lt;, &amp;lt;&amp;gt;, &amp;gt;=, &amp;lt;= 연산자를 사용하는 JOIN 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507379471&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1, 테이블명2, &amp;middot;&amp;middot;&amp;middot;
WHERE (NON-EQUI JOIN 조건);&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OUTER JOIN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OUTER JOIN은 릴레이션에서 JOIN 조건에 만족하지 않는 튜플도 결과로 출력하기 위한 JOIN 방법으로, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LEFT OUTER JOIN : INNER JOIN의 결과를 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않는 좌측 항의 릴레이션에 있는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507591594&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1 LEFT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명(+);&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;- RIGHT OUTER JOIN : INNER JOIN의 결과를 구한 후, 좌측 항 릴레이션의 어떤 튜플과도 맞지 않는 우측 항의 릴레이션에 있는 튜플들에 NULL값을 붙여서 INNER JOIN의 결과에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507754185&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1 RIGHT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명(+) = 테이블명2.속성명;&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;- FULL OUTER JOIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합쳐 놓은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- INNER JOIN의 결과를 구한 후, 좌측 항의 릴레이션의 튜플들에 대해 우측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다. 그리고 유사하게 우측 항의 릴레이션의 튜플들에 대해 좌측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 표기 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687507915216&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT [테이블명1.]속성명, [테이블명2.]속성명, &amp;middot;&amp;middot;&amp;middot;
FROM 테이블명1 FULL OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제어문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제어문은 위에서 아래로 차례대로 실행되는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;절차형 SQL의 진행 순서를 변경하기 위해 사용하는 명령문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제어문에는 IF, LOOP 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IF문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IF문은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;조건에 따라 실행할 문장을 달리하는 제어문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 형식 1 : 조건이 참일 때만 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1687569677071&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF 조건 THEN
	
    실행할 문장1;
    실행할 문장2;
          ⋮
END IF;&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;- 형식 2 : 조건이 참일 때와 거짓일 때 실행할 문장이 다르다.&lt;/p&gt;
&lt;pre id=&quot;code_1687569866343&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IF 조건 THEN
	실행할 문장1;
ELSE
	실행할 문장2;
END IF;&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;&lt;b&gt;LOOP문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LOOP문은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;조건에 따라 실행할 문장을 반복 수행하는 제어문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 형식&lt;/p&gt;
&lt;pre id=&quot;code_1687569939333&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOOP
	실행할 문장;
    EXIT WHEN 조건;

END LOOP&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;</description>
      <category>자격증/정보처리기사</category>
      <category>sql</category>
      <category>SQL 응용</category>
      <category>정보처리기사</category>
      <category>정보처리기사 실기</category>
      <category>정처기 실기</category>
      <author>lucy1215</author>
      <guid isPermaLink="true">https://lucy1215.tistory.com/42</guid>
      <comments>https://lucy1215.tistory.com/42#entry42comment</comments>
      <pubDate>Fri, 23 Jun 2023 17:20:53 +0900</pubDate>
    </item>
  </channel>
</rss>