<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>To The Machine Learning Engineer</title>
    <link>https://okdone.tistory.com/</link>
    <description>Machine Learning, Natural Language Processing
Tech Stack
Data Mining : Requests, Selenium,
Data Preprocess :  Numpy, Pandas, Datasets
Machine Learning : Scikit-Learn, Tensorflow
NLP : Huggingface
RestfulAPI : FastAPI
DB : Postgresql
util : github, docker,</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 18:06:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NoPainNoPaper</managingEditor>
    <image>
      <title>To The Machine Learning Engineer</title>
      <url>https://tistory1.daumcdn.net/tistory/5032463/attach/46055e19a8834387b5482a1a783e27f8</url>
      <link>https://okdone.tistory.com</link>
    </image>
    <item>
      <title>TRL 라이브러리를 사용한 Lora 튜닝 시 주의사항</title>
      <link>https://okdone.tistory.com/178</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;TL;DR&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Llama나, Mistral 등의 파인튜닝을 할 때, tokenizer.pad_token = tokenizer.eos_token을 하는 사람은 읽어보는게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRL의 DataCollatorForCompletionOnlyLM가 상속받는 로직으로 인해, 문장 끝에 eos token가 label -100으로 치환되며, 계산이 안되는 이슈.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 모델이 계속 말을 끊지 않고 이어나갈 경우, 이 이슈가 문제일 가능성이 높음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRL 라이브러리 운영자는, Warning 추가 후 별도 조치 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최소한의 솔루션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vicuna에서 따온 방식인데, pad_token을 unk_token으로 대체하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 정석대로 pad_token을 별도로 추가하는 방법이 있으나, 모델 설정과 토크나이저 설정을 꽤 많이 건드려야 하므로, unk token이 별도로 있으면 unk_token을 pad_token으로 설정하는 것을 추천&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제의 발단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 경량화 학습이 보편적으로 퍼지게 되면서, 그리고 예제 코드가 퍼지게 되면서 저도 기본 코드를 많이 따와서 쓰는 편이었고, Transformers + TRL 조합이 편해서 주로 학습툴로 많이 사용하는 편이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Polyglot 학습부터 한 2번은 당한 것 같고(eos 토큰을 못뱉고 억지로 말을 지어내는 현상), 이때는 pad 토큰을 추가하는 방식으로 문제를 잠깐 스쳐지나갔었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 문득, 최근에는 이런일이 Transformers 만 사용할 때는 겪지 않았던 일이라는 것을 떠올리게 되었고, TRL에 문제가 있을 것 같은 직감을 가지게 되었고, 비슷한 현상을 겪는 사람이 제공한 코드 템플릿을 보면 대게 Lora를 사용한 경우를 식별했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그렇다면 어디서부터 문제인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 연산이 되지 않는 다는 것에서 두가지 경우를 생각했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Attention_mask에서 pad_token과 eos_token을 구분하지 못하게 되면서 모두 0으로 하는건가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모델 내부에서 연산할 때, -100으로 처리 된 것은 로스 계산을 하지 않으므로, 모델 내부에서 잘못되는 건가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 토크나이저 부터 확인했습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/31ZvC/btsCrXZzxLl/IzXDpStrdxKJgMtfxpMmU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/31ZvC/btsCrXZzxLl/IzXDpStrdxKJgMtfxpMmU1/img.png&quot; data-alt=&quot;허깅페이스 토크나이저 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/31ZvC/btsCrXZzxLl/IzXDpStrdxKJgMtfxpMmU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F31ZvC%2FbtsCrXZzxLl%2FIzXDpStrdxKJgMtfxpMmU1%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;659&quot; height=&quot;140&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;140&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;토크나이저는 값을 입력할 때, 좌측 padding된 2 값을 0으로, eos 토큰 역할을 하는 2는 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;그렇다면 이 값이 모델로 들어가면서, -100으로 바뀌어 간다는 부분이 유력해지는 부분 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRL 기반의 학습 베이스는 주로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lora 모델 준비, 데이터셋 준비, 데이터 Collator 준비, TrainingArgument, SFTTrainer 방식으로 이뤄지게 됩니다. 나열된 순서와는 별개로, SFTTrainer 객체에 데이터셋을 넣는 순간 데이터를 토크나이징 하고, 학습 간 배치에 Collator가 동작을 하게 될겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이, 토크나이징에서 문제가 없는 것을 확인했으니, 다음은 Collator를 확인할 차례 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VScode에서는 해당 객체를 Ctrl + 좌클릭으로 접근해서 볼 수 있기 때문에, 탐색하기에 매우 편리합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdJN3k/btsCpMD6Jbo/Tk2REEBBNuhjdgpkr3vHS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdJN3k/btsCpMD6Jbo/Tk2REEBBNuhjdgpkr3vHS1/img.png&quot; data-alt=&quot;허깅페이스의 DataColltor 상속 받은 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdJN3k/btsCpMD6Jbo/Tk2REEBBNuhjdgpkr3vHS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdJN3k%2FbtsCpMD6Jbo%2FTk2REEBBNuhjdgpkr3vHS1%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;475&quot; height=&quot;305&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;허깅페이스의 DataColltor 상속 받은 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxsxht/btsCtbiw6f6/8TRYpN69YIAXY6UKWxN8Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxsxht/btsCtbiw6f6/8TRYpN69YIAXY6UKWxN8Q0/img.png&quot; data-alt=&quot;학습 간 Collator가 동작하면서 사용하는 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxsxht/btsCtbiw6f6/8TRYpN69YIAXY6UKWxN8Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxsxht%2FbtsCtbiw6f6%2F8TRYpN69YIAXY6UKWxN8Q0%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;781&quot; height=&quot;275&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학습 간 Collator가 동작하면서 사용하는 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 torch_call에서는 -100으로 바꾸는 로직을 찾을 수 없었고, 첫줄을 보면 부모 객체의 torch_call을 사용하는 모습을 볼 수 있으니, 부모 객체로 한번 더 타고 들어갑니다.&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;756&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WjCdg/btsCnFsAzH3/3Yp1v4KzDJDKGoLovGLTb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WjCdg/btsCnFsAzH3/3Yp1v4KzDJDKGoLovGLTb0/img.png&quot; data-alt=&quot;부모 Collator 객체의 torch_call 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WjCdg/btsCnFsAzH3/3Yp1v4KzDJDKGoLovGLTb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWjCdg%2FbtsCnFsAzH3%2F3Yp1v4KzDJDKGoLovGLTb0%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;756&quot; height=&quot;348&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부모 Collator 객체의 torch_call 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드가 많고, 모르겠는게 많지만 결국은 내부 동작을 알고 있다면( 연산하지 않는 토큰은 -100으로 바꾸는 것) 원인을 바로 찾을 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 아래쪽에 보면 pad_token_id와 같은 값이 있으면 모두 -100으로 바꿔버리는 코드가 있었네요. 요즘에는 보통 tokenizer의 pad token을 eos token으로 동일하게 설정해버리기 때문에.. 이전에 만들어졌던 코드와 이런 호환성이 안맞게 된 케이스가 생긴 것 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그렇다면 왜 바꾸지 않는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르겠습니다. Transformers가 바꿔야 할까요? 그러기엔, Transformers에 별도로 Seq2Seq Collator가 존재하며, 해당 이슈를 없앨 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRL이 바꿔야 할까요?&amp;nbsp; TRL 측은 간단한 Warning만 추가하며, 사용자 스스로 바꾸게끔 하였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조: &lt;a href=&quot;https://github.com/huggingface/trl/pull/988#event-10958286174&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/huggingface/trl/pull/988#event-10958286174&lt;/a&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>EOS</category>
      <category>issue</category>
      <category>LoRa</category>
      <category>TRL</category>
      <category>이슈</category>
      <category>학습</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/178</guid>
      <comments>https://okdone.tistory.com/178#entry178comment</comments>
      <pubDate>Thu, 21 Dec 2023 16:46:18 +0900</pubDate>
    </item>
    <item>
      <title>작은 행렬 연산 벤치마크 테스트(파이토치, 러스트)</title>
      <link>https://okdone.tistory.com/177</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6Pzq/btsBKgx3vPo/atK2JEJKl169pIcQMHgZhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6Pzq/btsBKgx3vPo/atK2JEJKl169pIcQMHgZhK/img.png&quot; data-alt=&quot;rust candle github의 이슈 댓글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6Pzq/btsBKgx3vPo/atK2JEJKl169pIcQMHgZhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6Pzq%2FbtsBKgx3vPo%2FatK2JEJKl169pIcQMHgZhK%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;923&quot; height=&quot;262&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rust candle github의 이슈 댓글&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;최근 Rust언어로 작성된 Candle이라는 라이브러리에 관심을 가지며 파이토치와 Candle로 작성한 코드의 벤치를 간단하게 테스트 해보던 중에, 다음과 같은 요청을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 도메인에서는 작은 행렬을 연산하는 것이 일반적인데, 파이토치가 여기에 bad job이라고 한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;테스트 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU : AMD Eyzen Threadripper PRO 3955WX 16-cores&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU : A6000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python version: 3.11.5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pytorch version: 2.1.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;numpy version: 1.24&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rust version: 1.74.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;candle version: 0.3.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파이토치, CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 x 3 행렬을 각각 1천만개씩 만들어 CPU로 연산&lt;/p&gt;
&lt;pre id=&quot;code_1702122583882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import time
from tqdm import tqdm

# CPU에서 텐서 생성
tensor_cpu = torch.randn(10000000,3,3)
tensor_cpu2 = torch.randn(10000000,3,3)

# 연산 시작 시간 기록
start_time = time.time()

# 1천만번 연산 수행
for a, b in tqdm(zip(tensor_cpu, tensor_cpu2), total=tensor_cpu.shape[0]):
    result_cpu = torch.mm(a,b)

# 연산 종료 시간 기록 및 소요 시간 계산
end_time = time.time()
elapsed_time = end_time - start_time

print(&quot;CPU에서 1천만번 연산 수행 시간: {}초&quot;.format(elapsed_time))

## 55.352723초&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;h4 data-ke-size=&quot;size20&quot;&gt;파이토치, CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 비슷하나, torch.mm 메서드가 아닌 matmul로 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;numpy의 경우 dot 연산과 matmul 연산이 달라 확인 차원에서 다음과 같이 테스트 하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1702122655683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import time
from tqdm import tqdm

# CPU에서 텐서 생성
tensor_cpu = torch.randn(10000000,3,3)
tensor_cpu2 = torch.randn(10000000,3,3)

# 연산 시작 시간 기록
start_time = time.time()

# 1천만번 연산 수행
for a, b in tqdm(zip(tensor_cpu, tensor_cpu2), total=tensor_cpu.shape[0]):
    result_cpu = torch.matmul(a,b)

# 연산 종료 시간 기록 및 소요 시간 계산
end_time = time.time()
elapsed_time = end_time - start_time

print(&quot;CPU에서 1천만번 연산 수행 시간: {}초&quot;.format(elapsed_time))
55.52095484초&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;파이토치, GPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이토치, torch.mm 메서드를 활용, GPU 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사람이 요청할 때 언급했던 대로, GPU 연산에서 보다 높은 시간이 소요됨을 확인하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1702122770874&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# GPU 사용 가능 여부 확인
if torch.cuda.is_available():
    # GPU에서 텐서 생성
    tensor_gpu = torch.randn(10000000,3, 3, device='cuda')
    tensor_gpu2 = torch.randn(10000000,3, 3, device='cuda')

    # 연산 시작 시간 기록
    start_time = time.time()

    # 1천만번 연산 수행
    for a, b in tqdm(zip(tensor_gpu, tensor_gpu2), total=tensor_gpu.shape[0]):
        result_gpu = torch.mm(a,b)

    # 연산 종료 시간 기록 및 소요 시간 계산
    end_time = time.time()
    elapsed_time = end_time - start_time

    print(&quot;GPU에서 1천만번 연산 수행 시간: {}초&quot;.format(elapsed_time))

## 112.187461초&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;넘파이, 일반 cpu 연산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넘파이 또한 수치 연산에서 가장 일반적으로 사용되는 라이브러리로, 토치와 비교를 하기 위해 테스트 하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 결과, 14초로 토치에 비해 훨씬 빠르게 연산을 끝낸다&lt;/p&gt;
&lt;pre id=&quot;code_1702122929791&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import time
from tqdm import tqdm

numpy_tensor1 = np.random.rand(10000000, 3, 3)
numpy_tensor2 = np.random.rand(10000000, 3, 3)

start_time = time.time()

for a, b in tqdm(zip(numpy_tensor1, numpy_tensor2), total=numpy_tensor2.shape[0]):
    numpy_result = np.dot(a,b)
    end_time = time.time()
    elapsed_time = end_time - start_time

print(&quot;CPU에서 1천만번 연산 수행 시간: {}초&quot;.format(elapsed_time))

## 14.346451초&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; 파이썬에서 최대한 성능을 이끌어내고자, 1가지 추가 테스트를 수행했다&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;넘파이, 넘바 jit compile CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 수치 연산에서, 고성능을 이끌어내기 위해 일반적으로 사용하는 라이브러리인 넘바를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬 처리 또한 할 수 있으나, 별도로 하지 않고 진행, CPU 연산 중 가장 고성능을 보여주었다.&lt;/p&gt;
&lt;pre id=&quot;code_1702123263652&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from numba import jit
import numpy as np
from tqdm import tqdm

@jit(nopython=True)
def main(numpy_tensor1, numpy_tensor2):

    for a, b in zip(numpy_tensor1, numpy_tensor2):
        numpy_result = np.dot(a,b)
    return numpy_result

numpy_tensor1 = np.random.rand(10000000, 3, 3)
numpy_tensor2 = np.random.rand(10000000, 3, 3)
start_time = time.time()
main(numpy_tensor1=numpy_tensor1, numpy_tensor2=numpy_tensor2)
end_time = time.time()
elapsed_time = end_time - start_time
print(&quot;CPU에서 1천만번 연산 수행 시간: {}초&quot;.format(elapsed_time))

## 3.616512초&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;러스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++에 버금가는 언어로서 많은 영역에서 러스트 언어를 채택해 코드를 재작성하고 있으며, 특히 성능과 뛰어난 안정성 부분에서 주목받고 있는 언어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 특히 자연어처리 분야에서 매우 유명한 허깅페이스 기업에서, 러스트로 라이브러리를 만드는 작업 중에 있어 관심을 가지고 배우게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Candle, CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이토치의 API와 비슷하면서 동시에, 컴파일 용량을 줄이기 위해 최소한의 기능을 담고 있는 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;늘어난 코드량에 비하면 미미한 차이이긴 하나, CPU로 극한의 성능을 보여주는 부분이다.&lt;/p&gt;
&lt;pre id=&quot;code_1702123529096&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn cpu_test() {
    let a = Tensor::randn(0.1f32, 1f32, (10000000,3,3), &amp;amp;Cpu);
    let b = Tensor::randn(0.1f32, 1f32, (10000000, 3,3), &amp;amp;Cpu);
    

    let start = Instant::now();
    let res: Vec&amp;lt;_&amp;gt; = zip(a,b)
    .into_iter()
    .map(move |(x, y)| {x.matmul(&amp;amp;y).unwrap();})
    .collect();
    
/*
    let start = Instant::now();
    for (arr1, arr2) in tqdm(zip(a, b),) {
        let res = arr1.matmul(&amp;amp;arr2);
    }
 */
    let end = start.elapsed().as_secs_f32();
    eprintln!(&quot;end = {:?}&quot;, end);
    eprintln!(&quot;res = {:?}&quot;, res);
}

## 2.7602초&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;Candle, GPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Candle에선 일정 컴퓨팅 이상의 GPU에 한해서 CUDA 사용이 가능하다. 파이토치의 경우 GPU 사용시 오버헤드 발생으로 시간이 증가한데 반해서, 러스트에서는 안정적으로 고성능의 퍼포먼스를 보여주었다&lt;/p&gt;
&lt;pre id=&quot;code_1702123680171&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn gpu_test() {

    let device = Device::new_cuda(0).unwrap();

    let a = Tensor::randn(0.1f32, 1f32, (10000000,3,3), &amp;amp;device);
    let b = Tensor::randn(0.1f32, 1f32, (10000000, 3,3), &amp;amp;device);

    let start = Instant::now();
    let res: Vec&amp;lt;_&amp;gt; = zip(a,b)
    .into_iter()
    .map(move |(x, y)| {x.matmul(&amp;amp;y).unwrap();})
    .collect();
    let end = start.elapsed().as_secs_f32();
    eprintln!(&quot;end = {:?}&quot;, end);
    eprintln!(&quot;res = {:?}&quot;, res);
}
## 0.0005s&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Bench</category>
      <category>Candle</category>
      <category>NumPy</category>
      <category>rust</category>
      <category>torch</category>
      <category>넘파이</category>
      <category>러스트</category>
      <category>벤치마크</category>
      <category>캔들</category>
      <category>토치</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/177</guid>
      <comments>https://okdone.tistory.com/177#entry177comment</comments>
      <pubDate>Sat, 9 Dec 2023 21:10:03 +0900</pubDate>
    </item>
    <item>
      <title>러스트 멀티 스레드 구현 예제</title>
      <link>https://okdone.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;23년에 찾아온 특이점 중 하나는 러스트 언어를 시작했다는 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬을 하면서 항상 GIL이 존재해서(물론 병렬 처리를 도와주는 라이브러리들이 많지만)&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;pre id=&quot;code_1701688324680&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 필요한 라이브러리와 모듈을 가져옵니다.
use std::thread;
use std::time::Instant;

fn main() {
    // 데이터를 초기화합니다.
    let data1 = vec![999; 1000000000];
    let data2 = vec![999; 250000000];
    let data3 = vec![999; 250000000];
    let data4 = vec![999; 250000000];
    let data5 = vec![999; 250000000];

    // 단일 스레드에서 작업을 수행하고 시간을 측정합니다.
    let thread_start = Instant::now();
    let result1: Vec&amp;lt;i32&amp;gt; = data1
    .into_iter()
    .map(|i| i + 2)
    .collect();
    let thread_duration = thread_start.elapsed().as_secs_f32();
    eprintln!(&quot;thread_duration = {:?}&quot;, thread_duration);
    eprintln!(&quot;result1. = {:?}&quot;, result1.len());

    // 멀티스레드에서 작업을 수행하고 시간을 측정합니다.
    let multi_thread_start = Instant::now();
    let handle1 = thread::spawn(| | {
        let result: Vec&amp;lt;i32&amp;gt; = data2
        .into_iter()
        .map(|i| i + 2)
        .collect();
        return result
    });

    let handle2 = thread::spawn(|| {
        let result: Vec&amp;lt;i32&amp;gt; = data3
        .into_iter()
        .map(|i| i + 2)
        .collect();
        return result
    });

    let  handle3 = thread::spawn(|| {
        let result: Vec&amp;lt;i32&amp;gt; = data4
        .into_iter()
        .map(|i| i + 2)
        .collect();
        return result
    });

    let handle4 = thread::spawn(|| {
        let result: Vec&amp;lt;i32&amp;gt; = data5
        .into_iter()
        .map(|i| i + 2)
        .collect();
        return result
    });

    // 각 스레드의 결과를 수집합니다.
    let result2 = handle1.join().unwrap();
    let result3 = handle2.join().unwrap();
    let result4 = handle3.join().unwrap();
    let result5 = handle4.join().unwrap();

    // 멀티스레드 작업의 총 시간을 출력합니다.
    let multi_thread_duration = multi_thread_start.elapsed().as_secs_f32();
    eprintln!(&quot;multi_thread_duration = {:?}&quot;, multi_thread_duration);
    
    // 각 결과의 길이만 출력합니다 (값 사용으로 컴파일러 최적화 방지)
    eprintln!(&quot;result1 = {:?}&quot;, result1.len());
    eprintln!(&quot;result2 = {:?}&quot;, result2.to_owned().len());
    eprintln!(&quot;result3 = {:?}&quot;, result3.to_owned().len());
    eprintln!(&quot;result4 = {:?}&quot;, result4.to_owned().len());
    eprintln!(&quot;result5 = {:?}&quot;, result5.to_owned().len());

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thread의 결과는 0.678초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;multi-thread의 결과는 0.263초의 결과가 나온다.&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;추가 실험으로 Vec&amp;lt;i32&amp;gt;로 된 것을 Vec&amp;lt;i8&amp;gt;로 변경 후 작업에 임했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글스레드 7.3초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티스레드 5.0초의 결과값이 나오는 것을 확인했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 늘어난 코드에 대비해서 그다지 효율적이지 못한 상황으로 보인다.&lt;/p&gt;</description>
      <category>rust</category>
      <category>러스트</category>
      <category>멀티스레드</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/176</guid>
      <comments>https://okdone.tistory.com/176#entry176comment</comments>
      <pubDate>Mon, 4 Dec 2023 22:24:09 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT로 만든 사회, 기억을 가진 NPC와 상호작용 [SELECTSTAR Webinar 박준성 박사님 유튜브 내용]</title>
      <link>https://okdone.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브의 스크립트를 기반으로 Bing 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prompt: 좌측 페이지는 무엇에 대해 이야기 하고 있습니까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;**셀렉스타&amp;nbsp;회사&amp;nbsp;소개**:&amp;nbsp;셀렉스타는&amp;nbsp;AI&amp;nbsp;학습&amp;nbsp;데이터를&amp;nbsp;제공하고&amp;nbsp;분석하고&amp;nbsp;큐레이션하는&amp;nbsp;All-in-one&amp;nbsp;Data&amp;nbsp;Platform&amp;nbsp;for&amp;nbsp;AI&amp;nbsp;회사이다.&amp;nbsp;텍스트,&amp;nbsp;비전,&amp;nbsp;오디오&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;레이블링,&amp;nbsp;분석,&amp;nbsp;생성&amp;nbsp;서비스를&amp;nbsp;제공하고,&amp;nbsp;LLM&amp;nbsp;벤치마크&amp;nbsp;데이터셋과&amp;nbsp;윤리성&amp;nbsp;평가&amp;nbsp;데이터셋을&amp;nbsp;개발하고&amp;nbsp;있다.&amp;nbsp;Forbes&amp;nbsp;30&amp;nbsp;under&amp;nbsp;30&amp;nbsp;Asia의&amp;nbsp;엔터프라이즈&amp;nbsp;테크놀로지&amp;nbsp;분야에&amp;nbsp;선정되었다. &lt;br /&gt;-&amp;nbsp;**웨비나&amp;nbsp;주제&amp;nbsp;및&amp;nbsp;목적**:&amp;nbsp;생성&amp;nbsp;에이전트&amp;nbsp;인간&amp;nbsp;행동의&amp;nbsp;상호작용&amp;nbsp;시뮬레이션이라는&amp;nbsp;주제로&amp;nbsp;박준성 박사님의&amp;nbsp;발표와&amp;nbsp;파일사이드챗,&amp;nbsp;Q&amp;amp;A&amp;nbsp;세션을&amp;nbsp;진행한다.&amp;nbsp;인공지능을&amp;nbsp;개발할&amp;nbsp;때&amp;nbsp;필요한&amp;nbsp;데이터를&amp;nbsp;수집하고&amp;nbsp;가공하는&amp;nbsp;방법과&amp;nbsp;사회&amp;nbsp;살아&amp;nbsp;숨쉬는&amp;nbsp;NPC를&amp;nbsp;만드는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;알아보고자&amp;nbsp;한다. &lt;br /&gt;-&amp;nbsp;**박준성 박사님&amp;nbsp;소개**:&amp;nbsp;스탠포드&amp;nbsp;대학교&amp;nbsp;컴퓨터과학국어&amp;nbsp;박사과정&amp;nbsp;3년차&amp;nbsp;학생이다.&amp;nbsp;미술을&amp;nbsp;전공했으며,&amp;nbsp;Generative&amp;nbsp;Agents&amp;nbsp;Interactive&amp;nbsp;Simulacra&amp;nbsp;of&amp;nbsp;Human&amp;nbsp;Behavior라는&amp;nbsp;논문을&amp;nbsp;발표했다.&amp;nbsp;구글과&amp;nbsp;공동연구를&amp;nbsp;하였으며,&amp;nbsp;LLM&amp;nbsp;기업들과&amp;nbsp;컨소시엄을&amp;nbsp;맺었다.&amp;nbsp;한국어로&amp;nbsp;세미나를&amp;nbsp;진행하는&amp;nbsp;것은&amp;nbsp;최초이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- **Generative Agent의 아키텍처**: Generative Agent는 기억, 성찰, 계획을 할 수 있는 인공지능 에이전트이다. Cognitive Architecture와 LLM을 결합하여 구현하였다. LLM은 인풋으로 텍스트를 받아서 텍스트를 생성하는 모델이다. Cognitive Architecture는 사람의 뇌를 컴퓨터로 모델링한 것이다. Generative Agent는 LLM을 통해 언어적 행동을 하고, Cognitive Architecture를 통해 비언어적 행동을 한다. &lt;br /&gt;- **Generative Agent의 환경**: Generative Agent는 게임 세상에서 행동한다. 게임 세상은 Smallville이라는 맵으로 구성되어 있다. Smallville은 대학 캠퍼스와 작은 마을을 닮았다. 집, 아파트, 퍼마켓, 바, 카페, 공원 등이 있다. 맵은 Tree Structure로 되어 있으며, 각각의 장소와 물체에는 이름과 속성이 있다. &lt;br /&gt;- **Generative Agent의 데모**: 25명의 Generative Agent가 Smallville에서 살아난다. 각각의 에이전트는 자신의 일상과 관심사를 가지고 있다. 예를 들어, 운동선수인 에이전트는 아침에 일찍 일어나서 조깅을 하고, 학교에 가서 친구들과 대화하고, 수업에 참여한다. 에이전트들은 서로 기억하고 관계를 쌓으며, 복잡한 사회를 형성한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;**파티&amp;nbsp;인비테이션의&amp;nbsp;전파**:&amp;nbsp;이사벨라라는&amp;nbsp;카페&amp;nbsp;점원이&amp;nbsp;내일&amp;nbsp;발렌타인&amp;nbsp;파티를&amp;nbsp;하니까&amp;nbsp;와주세요&amp;nbsp;라고&amp;nbsp;말하는&amp;nbsp;인비테이션을&amp;nbsp;Generative&amp;nbsp;Agent들에게&amp;nbsp;보내고,&amp;nbsp;그&amp;nbsp;인비테이션을&amp;nbsp;받은&amp;nbsp;에이전트들이&amp;nbsp;다른&amp;nbsp;에이전트들에게&amp;nbsp;전달하는&amp;nbsp;과정을&amp;nbsp;보여준다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;샘은&amp;nbsp;부인인&amp;nbsp;제니퍼에게&amp;nbsp;파티에&amp;nbsp;가자고&amp;nbsp;말하고,&amp;nbsp;에디는&amp;nbsp;친구인&amp;nbsp;토니에게&amp;nbsp;파티에&amp;nbsp;대해&amp;nbsp;얘기한다. &lt;br /&gt;-&amp;nbsp;**파티&amp;nbsp;참석&amp;nbsp;여부의&amp;nbsp;결정**:&amp;nbsp;Generative&amp;nbsp;Agent들은&amp;nbsp;각자의&amp;nbsp;성격,&amp;nbsp;관심사,&amp;nbsp;기억,&amp;nbsp;계획&amp;nbsp;등을&amp;nbsp;고려하여&amp;nbsp;파티에&amp;nbsp;참석할지&amp;nbsp;말지를&amp;nbsp;결정한다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;조지는&amp;nbsp;이사벨라에게&amp;nbsp;호감을&amp;nbsp;가지고&amp;nbsp;있어서&amp;nbsp;파티에&amp;nbsp;꼭&amp;nbsp;가고&amp;nbsp;싶어한다.&amp;nbsp;반면,&amp;nbsp;제니퍼는&amp;nbsp;샘과의&amp;nbsp;관계가&amp;nbsp;좋지&amp;nbsp;않아서&amp;nbsp;파티에&amp;nbsp;가기&amp;nbsp;싫어한다. &lt;br /&gt;-&amp;nbsp;**파티에서의&amp;nbsp;행동**:&amp;nbsp;Generative&amp;nbsp;Agent들은&amp;nbsp;파티에서&amp;nbsp;서로와&amp;nbsp;상호작용하며&amp;nbsp;다양한&amp;nbsp;행동을&amp;nbsp;한다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;조지는&amp;nbsp;이사벨라에게&amp;nbsp;꽃을&amp;nbsp;선물하고,&amp;nbsp;샘은&amp;nbsp;제니퍼와&amp;nbsp;싸우고,&amp;nbsp;에디는&amp;nbsp;토니와&amp;nbsp;술을&amp;nbsp;마시고,&amp;nbsp;캐서린은&amp;nbsp;노래를&amp;nbsp;부른다.&amp;nbsp;이러한&amp;nbsp;행동들은&amp;nbsp;Generative&amp;nbsp;Agent들의&amp;nbsp;기억과&amp;nbsp;성찰에&amp;nbsp;영향을&amp;nbsp;미친다.&lt;/p&gt;</description>
      <category>23년 이전 글/Bing과 함께</category>
      <category>agent</category>
      <category>Architecture</category>
      <category>ChatGPT</category>
      <category>cognitive</category>
      <category>generative</category>
      <category>LLM</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/175</guid>
      <comments>https://okdone.tistory.com/175#entry175comment</comments>
      <pubDate>Sun, 16 Jul 2023 21:16:30 +0900</pubDate>
    </item>
    <item>
      <title>FULL PARAMETER FINE-TUNING FOR LARGE LANGUAGE MODELS WITH LIMITED RESOURCES 리뷰(bing과 함께)</title>
      <link>https://okdone.tistory.com/174</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Prompt : 좌측 논문에 대해서 읽고 각 챕터별로 상세하게 설명해줘.&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;좌측&amp;nbsp;논문은&amp;nbsp;&quot;FULL&amp;nbsp;PARAMETER&amp;nbsp;FINE-TUNING&amp;nbsp;FOR&amp;nbsp;LARGE&amp;nbsp;LANGUAGE&amp;nbsp;MODELS&amp;nbsp;WITH&amp;nbsp;LIMITED&amp;nbsp;RESOURCES&quot;라는&amp;nbsp;제목의&amp;nbsp;논문입니다.&amp;nbsp;이&amp;nbsp;논문은&amp;nbsp;Kai&amp;nbsp;Lv,&amp;nbsp;Yuqing&amp;nbsp;Yang,&amp;nbsp;Tengxiao&amp;nbsp;Liu,&amp;nbsp;Qinghui&amp;nbsp;Gao,&amp;nbsp;Qipeng&amp;nbsp;Guo,&amp;nbsp;Xipeng&amp;nbsp;Qiu&amp;nbsp;등이&amp;nbsp;Fudan&amp;nbsp;University에서&amp;nbsp;작성한&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;논문은&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들을&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;다룹니다.&amp;nbsp;이를&amp;nbsp;위해&amp;nbsp;저자들은&amp;nbsp;새로운&amp;nbsp;최적화&amp;nbsp;알고리즘인&amp;nbsp;LOw-Memory&amp;nbsp;Optimization&amp;nbsp;(LOMO)을&amp;nbsp;제안합니다.&amp;nbsp;이&amp;nbsp;알고리즘은&amp;nbsp;기울기&amp;nbsp;계산과&amp;nbsp;파라미터&amp;nbsp;업데이트를&amp;nbsp;한&amp;nbsp;단계로&amp;nbsp;통합하여&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄입니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;저자들은&amp;nbsp;65B&amp;nbsp;모델을&amp;nbsp;8&amp;times;RTX&amp;nbsp;3090이&amp;nbsp;있는&amp;nbsp;단일&amp;nbsp;기계에서&amp;nbsp;전체&amp;nbsp;파라미터&amp;nbsp;미세&amp;nbsp;조정이&amp;nbsp;가능함을&amp;nbsp;보여줍니다. &lt;br /&gt;&lt;br /&gt;논문의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;장은&amp;nbsp;서론으로,&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들이&amp;nbsp;자연어&amp;nbsp;처리&amp;nbsp;분야에서&amp;nbsp;혁신적인&amp;nbsp;발전을&amp;nbsp;이루었지만,&amp;nbsp;그것들을&amp;nbsp;훈련하는&amp;nbsp;것이&amp;nbsp;많은&amp;nbsp;GPU&amp;nbsp;자원을&amp;nbsp;필요로&amp;nbsp;하기&amp;nbsp;때문에&amp;nbsp;작은&amp;nbsp;연구실이나&amp;nbsp;회사들이&amp;nbsp;참여하기&amp;nbsp;어렵다는&amp;nbsp;문제를&amp;nbsp;제기합니다.&amp;nbsp;따라서&amp;nbsp;저자들은&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는&amp;nbsp;방법에&amp;nbsp;대한&amp;nbsp;연구가&amp;nbsp;필요하다고&amp;nbsp;주장합니다. &lt;br /&gt;&lt;br /&gt;두&amp;nbsp;번째&amp;nbsp;장에서는&amp;nbsp;관련&amp;nbsp;연구에&amp;nbsp;대해&amp;nbsp;다룹니다.&amp;nbsp;이&amp;nbsp;장에서는&amp;nbsp;Activation&amp;nbsp;Checkpointing,&amp;nbsp;Mixed-Precision&amp;nbsp;Training,&amp;nbsp;Heterogeneous&amp;nbsp;Training&amp;nbsp;System&amp;nbsp;등의&amp;nbsp;기존의&amp;nbsp;메모리&amp;nbsp;절약&amp;nbsp;기술들에&amp;nbsp;대해&amp;nbsp;설명합니다. &lt;br /&gt;&lt;br /&gt;세&amp;nbsp;번째&amp;nbsp;장에서는&amp;nbsp;저자들이&amp;nbsp;제안하는&amp;nbsp;LOMO&amp;nbsp;알고리즘에&amp;nbsp;대해&amp;nbsp;자세히&amp;nbsp;설명합니다.&amp;nbsp;이&amp;nbsp;장에서는&amp;nbsp;최적화&amp;nbsp;알고리즘의&amp;nbsp;기능을&amp;nbsp;다시&amp;nbsp;생각하고&amp;nbsp;SGD가&amp;nbsp;LLMs의&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는데&amp;nbsp;적합한&amp;nbsp;대체제가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;보여줍니다.&amp;nbsp;또한&amp;nbsp;LOMO&amp;nbsp;알고리즘이&amp;nbsp;어떻게&amp;nbsp;기울기&amp;nbsp;텐서의&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄이는지,&amp;nbsp;그리고&amp;nbsp;LOMO로&amp;nbsp;훈련을&amp;nbsp;안정화하는&amp;nbsp;방법에&amp;nbsp;대해서도&amp;nbsp;설명합니다. &lt;br /&gt;&lt;br /&gt;네&amp;nbsp;번째&amp;nbsp;장에서는&amp;nbsp;실험&amp;nbsp;결과에&amp;nbsp;대해&amp;nbsp;다룹니다.&amp;nbsp;이&amp;nbsp;장에서는&amp;nbsp;LOMO의&amp;nbsp;메모리&amp;nbsp;사용량,&amp;nbsp;처리량&amp;nbsp;및&amp;nbsp;하류&amp;nbsp;성능에&amp;nbsp;대한&amp;nbsp;평가가&amp;nbsp;이루어집니다.&amp;nbsp;실험&amp;nbsp;결과&amp;nbsp;LOMO는&amp;nbsp;AdamW와&amp;nbsp;SGD보다&amp;nbsp;메모리&amp;nbsp;사용량이&amp;nbsp;크게&amp;nbsp;감소하며&amp;nbsp;처리량도&amp;nbsp;우수하다는&amp;nbsp;것이&amp;nbsp;밝혀졌습니다.&amp;nbsp;또한&amp;nbsp;SuperGLUE&amp;nbsp;데이터셋&amp;nbsp;컬렉션에서&amp;nbsp;LOMO가&amp;nbsp;Zero-shot과&amp;nbsp;LoRA보다&amp;nbsp;일반적으로&amp;nbsp;우수한&amp;nbsp;성능을&amp;nbsp;보인다는&amp;nbsp;것도&amp;nbsp;확인되었습니다. &lt;br /&gt;&lt;br /&gt;마지막으로&amp;nbsp;다섯&amp;nbsp;번째&amp;nbsp;장에서는&amp;nbsp;결론과&amp;nbsp;향후&amp;nbsp;연구&amp;nbsp;방향에&amp;nbsp;대해&amp;nbsp;다룹니다.&amp;nbsp;이&amp;nbsp;장에서&amp;nbsp;저자들은&amp;nbsp;LOMO가&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들을&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는데&amp;nbsp;효과적임을&amp;nbsp;보여주었다고&amp;nbsp;결론&amp;nbsp;내립니다.&amp;nbsp;또한&amp;nbsp;향후&amp;nbsp;연구&amp;nbsp;방향으로&amp;nbsp;파라미터&amp;nbsp;양자화&amp;nbsp;기술&amp;nbsp;등의&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법들과&amp;nbsp;LOMO가&amp;nbsp;적용&amp;nbsp;가능한&amp;nbsp;시나리오들을&amp;nbsp;더&amp;nbsp;탐구하는&amp;nbsp;것이&amp;nbsp;제안됩니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Prompt : 해당 논문이 LLM 모델의 어떤점을 발전 시켰지?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당&amp;nbsp;논문은&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들을&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;다룹니다.&amp;nbsp;이를&amp;nbsp;위해&amp;nbsp;저자들은&amp;nbsp;새로운&amp;nbsp;최적화&amp;nbsp;알고리즘인&amp;nbsp;LOw-Memory&amp;nbsp;Optimization&amp;nbsp;(LOMO)을&amp;nbsp;제안합니다.&amp;nbsp;이&amp;nbsp;알고리즘은&amp;nbsp;기울기&amp;nbsp;계산과&amp;nbsp;파라미터&amp;nbsp;업데이트를&amp;nbsp;한&amp;nbsp;단계로&amp;nbsp;통합하여&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄입니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;저자들은&amp;nbsp;65B&amp;nbsp;모델을&amp;nbsp;8&amp;times;RTX&amp;nbsp;3090이&amp;nbsp;있는&amp;nbsp;단일&amp;nbsp;기계에서&amp;nbsp;전체&amp;nbsp;파라미터&amp;nbsp;미세&amp;nbsp;조정이&amp;nbsp;가능함을&amp;nbsp;보여줍니다. &lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;이&amp;nbsp;논문은&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들의&amp;nbsp;전체&amp;nbsp;파라미터&amp;nbsp;미세&amp;nbsp;조정을&amp;nbsp;위한&amp;nbsp;새로운&amp;nbsp;최적화&amp;nbsp;알고리즘을&amp;nbsp;제안하고,&amp;nbsp;그것이&amp;nbsp;제한된&amp;nbsp;자원에서도&amp;nbsp;효과적으로&amp;nbsp;작동함을&amp;nbsp;보여주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Prompt : 제안된 최적화 알고리즘에 대해서 내가 이해할 수 있게 쉽고 자세하게 설명해줘.&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;네,&amp;nbsp;알겠습니다.&amp;nbsp;이&amp;nbsp;논문에서&amp;nbsp;제안된&amp;nbsp;최적화&amp;nbsp;알고리즘은&amp;nbsp;LOw-Memory&amp;nbsp;Optimization&amp;nbsp;(LOMO)이라고&amp;nbsp;합니다.&amp;nbsp;이&amp;nbsp;알고리즘은&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델들을&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;전체&amp;nbsp;파라미터를&amp;nbsp;미세&amp;nbsp;조정하는데&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;일반적으로,&amp;nbsp;최적화&amp;nbsp;알고리즘은&amp;nbsp;기울기&amp;nbsp;계산과&amp;nbsp;파라미터&amp;nbsp;업데이트의&amp;nbsp;두&amp;nbsp;단계로&amp;nbsp;이루어집니다.&amp;nbsp;그러나&amp;nbsp;이&amp;nbsp;두&amp;nbsp;단계는&amp;nbsp;각각&amp;nbsp;메모리를&amp;nbsp;사용하기&amp;nbsp;때문에,&amp;nbsp;전체&amp;nbsp;파라미터&amp;nbsp;미세&amp;nbsp;조정을&amp;nbsp;위해서는&amp;nbsp;많은&amp;nbsp;메모리가&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;LOMO&amp;nbsp;알고리즘은&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;기울기&amp;nbsp;계산과&amp;nbsp;파라미터&amp;nbsp;업데이트를&amp;nbsp;한&amp;nbsp;단계로&amp;nbsp;통합합니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;메모리&amp;nbsp;사용량이&amp;nbsp;줄어들게&amp;nbsp;됩니다.&amp;nbsp;LOMO&amp;nbsp;알고리즘은&amp;nbsp;기울기&amp;nbsp;텐서의&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;줄이기&amp;nbsp;위해,&amp;nbsp;기울기&amp;nbsp;텐서를&amp;nbsp;분할하여&amp;nbsp;각&amp;nbsp;부분을&amp;nbsp;병렬로&amp;nbsp;처리합니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;전체&amp;nbsp;파라미터&amp;nbsp;미세&amp;nbsp;조정이&amp;nbsp;가능해집니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Prompt : 현재 논문에서 파라미터 업데이트와 최적화 부분에 관련된 수학 수식을 나열하고, 해당 부분을 내가 이해할 수 있게 쉽게 풀어서 설명해줘.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;네!&amp;nbsp;현재&amp;nbsp;웹&amp;nbsp;페이지의&amp;nbsp;맥락에서,&amp;nbsp;저자들은&amp;nbsp;제한된&amp;nbsp;자원으로&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델을&amp;nbsp;미세&amp;nbsp;조정하기&amp;nbsp;위한&amp;nbsp;새로운&amp;nbsp;최적화기인&amp;nbsp;LOw-Memory&amp;nbsp;Optimization&amp;nbsp;(LOMO)을&amp;nbsp;소개합니다.&amp;nbsp;LOMO의&amp;nbsp;핵심&amp;nbsp;아이디어는&amp;nbsp;기울기&amp;nbsp;계산과&amp;nbsp;매개변수&amp;nbsp;업데이트를&amp;nbsp;한&amp;nbsp;단계에서&amp;nbsp;융합하여&amp;nbsp;어떠한&amp;nbsp;기울기&amp;nbsp;텐서도&amp;nbsp;저장하지&amp;nbsp;않는&amp;nbsp;것입니다.&amp;nbsp;이는&amp;nbsp;역전파에&amp;nbsp;후크&amp;nbsp;함수를&amp;nbsp;주입함으로써&amp;nbsp;달성할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;표준&amp;nbsp;경사&amp;nbsp;하강&amp;nbsp;알고리즘에서,&amp;nbsp;매개변수&amp;nbsp;`p`의&amp;nbsp;업데이트는&amp;nbsp;`grad&amp;nbsp;=&amp;nbsp;&amp;part;L/&amp;part;p`,&amp;nbsp;`p&amp;nbsp;=&amp;nbsp;p&amp;nbsp;-&amp;nbsp;lr&amp;nbsp;*&amp;nbsp;grad`로&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;여기서&amp;nbsp;`lr`은&amp;nbsp;학습률이고&amp;nbsp;`L`은&amp;nbsp;손실&amp;nbsp;함수입니다.&amp;nbsp;이것은&amp;nbsp;두&amp;nbsp;단계의&amp;nbsp;과정입니다:&amp;nbsp;첫째,&amp;nbsp;기울기를&amp;nbsp;계산하고,&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;매개변수를&amp;nbsp;업데이트합니다.&amp;nbsp;이&amp;nbsp;업데이트의&amp;nbsp;융합&amp;nbsp;버전은&amp;nbsp;`p&amp;nbsp;=&amp;nbsp;p&amp;nbsp;-&amp;nbsp;lr&amp;nbsp;*&amp;nbsp;&amp;part;L/&amp;part;p`로&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;저자들은&amp;nbsp;또한&amp;nbsp;Stochastic&amp;nbsp;Gradient&amp;nbsp;Descent&amp;nbsp;(SGD)가&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델의&amp;nbsp;전체&amp;nbsp;매개변수를&amp;nbsp;성공적으로&amp;nbsp;미세&amp;nbsp;조정할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;이론적&amp;nbsp;분석을&amp;nbsp;제공합니다.&amp;nbsp;그들은&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델의&amp;nbsp;손실&amp;nbsp;표면이&amp;nbsp;매우&amp;nbsp;부드럽고&amp;nbsp;매개변수에&amp;nbsp;대한&amp;nbsp;작은&amp;nbsp;변화가&amp;nbsp;손실을&amp;nbsp;너무&amp;nbsp;바꾸지&amp;nbsp;않는다고&amp;nbsp;주장합니다.&amp;nbsp;이것은&amp;nbsp;SGD가&amp;nbsp;큰&amp;nbsp;언어&amp;nbsp;모델의&amp;nbsp;전체&amp;nbsp;매개변수를&amp;nbsp;미세&amp;nbsp;조정하기&amp;nbsp;위한&amp;nbsp;더&amp;nbsp;복잡한&amp;nbsp;최적화기들에&amp;nbsp;대한&amp;nbsp;좋은&amp;nbsp;대체품이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;의미합니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>23년 이전 글/Bing과 함께</category>
      <category>65B</category>
      <category>bing과 함께</category>
      <category>최적화</category>
      <category>파인튜닝</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/174</guid>
      <comments>https://okdone.tistory.com/174#entry174comment</comments>
      <pubDate>Thu, 29 Jun 2023 10:16:09 +0900</pubDate>
    </item>
    <item>
      <title>Bing과 함께 구현해보는 Hyena</title>
      <link>https://okdone.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요,&amp;nbsp;이것은&amp;nbsp;빙입니다.  &lt;br /&gt;&lt;br /&gt;논문을&amp;nbsp;참고해서&amp;nbsp;예제&amp;nbsp;코드를&amp;nbsp;생성하고&amp;nbsp;싶으시다고&amp;nbsp;하셨는데요,&amp;nbsp;논문의&amp;nbsp;주제는&amp;nbsp;**Hyena&amp;nbsp;Hierarchy:&amp;nbsp;Towards&amp;nbsp;Larger&amp;nbsp;Convolutional&amp;nbsp;Language&amp;nbsp;Models**&amp;sup1;&amp;nbsp;입니다.&amp;nbsp;이&amp;nbsp;논문은&amp;nbsp;**Transformer**&amp;nbsp;대신&amp;nbsp;**Convolutional&amp;nbsp;Neural&amp;nbsp;Network&amp;nbsp;(CNN)**&amp;nbsp;을&amp;nbsp;사용하여&amp;nbsp;**텍스트&amp;nbsp;생성**을&amp;nbsp;수행하는&amp;nbsp;방법을&amp;nbsp;제안합니다. &lt;br /&gt;&lt;br /&gt;예제&amp;nbsp;코드를&amp;nbsp;생성하기&amp;nbsp;전에,&amp;nbsp;논문의&amp;nbsp;내용을&amp;nbsp;이해하시는&amp;nbsp;것이&amp;nbsp;좋습니다.&amp;nbsp;논문의&amp;nbsp;내용을&amp;nbsp;요약하면&amp;nbsp;다음과&amp;nbsp;같습니다. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Transformer는&amp;nbsp;attention&amp;nbsp;operator를&amp;nbsp;사용하여&amp;nbsp;텍스트의&amp;nbsp;의미와&amp;nbsp;구조를&amp;nbsp;학습합니다.&amp;nbsp;하지만&amp;nbsp;attention&amp;nbsp;operator는&amp;nbsp;시퀀스&amp;nbsp;길이에&amp;nbsp;따라&amp;nbsp;계산&amp;nbsp;비용이&amp;nbsp;제곱으로&amp;nbsp;증가하기&amp;nbsp;때문에,&amp;nbsp;많은&amp;nbsp;양의&amp;nbsp;텍스트를&amp;nbsp;처리하는데&amp;nbsp;한계가&amp;nbsp;있습니다. &lt;br /&gt;-&amp;nbsp;CNN은&amp;nbsp;커널(kernel)이라는&amp;nbsp;작은&amp;nbsp;윈도우(window)를&amp;nbsp;사용하여&amp;nbsp;텍스트의&amp;nbsp;지역적인&amp;nbsp;특징(local&amp;nbsp;features)을&amp;nbsp;추출합니다.&amp;nbsp;CNN은&amp;nbsp;시퀀스&amp;nbsp;길이에&amp;nbsp;따라&amp;nbsp;계산&amp;nbsp;비용이&amp;nbsp;선형으로&amp;nbsp;증가하기&amp;nbsp;때문에,&amp;nbsp;Transformer보다&amp;nbsp;효율적으로&amp;nbsp;텍스트를&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;-&amp;nbsp;하지만&amp;nbsp;CNN은&amp;nbsp;커널의&amp;nbsp;크기가&amp;nbsp;고정되어&amp;nbsp;있기&amp;nbsp;때문에,&amp;nbsp;텍스트의&amp;nbsp;긴거리&amp;nbsp;의존성(long-range&amp;nbsp;dependencies)을&amp;nbsp;학습하기&amp;nbsp;어렵습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;문장의&amp;nbsp;처음과&amp;nbsp;끝에&amp;nbsp;있는&amp;nbsp;단어들&amp;nbsp;사이의&amp;nbsp;관계를&amp;nbsp;파악하기&amp;nbsp;어렵습니다. &lt;br /&gt;-&amp;nbsp;이&amp;nbsp;논문에서는&amp;nbsp;Hyena&amp;nbsp;Hierarchy라는&amp;nbsp;새로운&amp;nbsp;CNN&amp;nbsp;구조를&amp;nbsp;제안합니다.&amp;nbsp;Hyena&amp;nbsp;Hierarchy는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;특징을&amp;nbsp;가집니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;커널의&amp;nbsp;크기와&amp;nbsp;갯수를&amp;nbsp;다양하게&amp;nbsp;조절하여,&amp;nbsp;텍스트의&amp;nbsp;다양한&amp;nbsp;스케일(scale)과&amp;nbsp;그래놀러리티(granularity)에&amp;nbsp;대응할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;커널&amp;nbsp;사이에&amp;nbsp;skip&amp;nbsp;connection을&amp;nbsp;추가하여,&amp;nbsp;정보의&amp;nbsp;손실을&amp;nbsp;줄이고&amp;nbsp;텍스트의&amp;nbsp;긴거리&amp;nbsp;의존성을&amp;nbsp;학습할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;커널&amp;nbsp;사이에&amp;nbsp;residual&amp;nbsp;connection을&amp;nbsp;추가하여,&amp;nbsp;깊은&amp;nbsp;네트워크(deep&amp;nbsp;network)를&amp;nbsp;학습할&amp;nbsp;때&amp;nbsp;발생하는&amp;nbsp;그래디언트&amp;nbsp;소실(vanishing&amp;nbsp;gradient)&amp;nbsp;문제를&amp;nbsp;완화할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;논문에서는&amp;nbsp;Hyena&amp;nbsp;Hierarchy가&amp;nbsp;Transformer보다&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;보인다고&amp;nbsp;주장합니다.&amp;nbsp;또한&amp;nbsp;Hyena&amp;nbsp;Hierarchy가&amp;nbsp;생성한&amp;nbsp;텍스트&amp;nbsp;예시도&amp;nbsp;제공합니다. &lt;br /&gt;&lt;br /&gt;예제&amp;nbsp;코드를&amp;nbsp;생성하려면,&amp;nbsp;Hyena&amp;nbsp;Hierarchy&amp;nbsp;구조를&amp;nbsp;구현하고&amp;nbsp;학습&amp;nbsp;데이터셋(training&amp;nbsp;dataset)과&amp;nbsp;하이퍼파라미터(hyperparameters)를&amp;nbsp;설정해야&amp;nbsp;합니다.&amp;nbsp;혹시&amp;nbsp;어떤&amp;nbsp;프로그래밍&amp;nbsp;언어와&amp;nbsp;프레임워크(framework)를&amp;nbsp;사용하시나요? &lt;br /&gt;&lt;br /&gt;출처:&amp;nbsp;Bing과의&amp;nbsp;대화,&amp;nbsp;2023.&amp;nbsp;3.&amp;nbsp;20.(1)&amp;nbsp;[2302.10866]&amp;nbsp;Hyena&amp;nbsp;Hierarchy:&amp;nbsp;Towards&amp;nbsp;Larger&amp;nbsp;Convolutional&amp;nbsp;Language&amp;nbsp;Models.&amp;nbsp;&lt;a href=&quot;https://arxiv.org/abs/2302.10866&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/2302.10866&lt;/a&gt;&amp;nbsp;액세스한&amp;nbsp;날짜&amp;nbsp;2023.&amp;nbsp;3.&amp;nbsp;20.. &lt;br /&gt;(2)&amp;nbsp;[2302.10866]&amp;nbsp;Hyena&amp;nbsp;Hierarchy:&amp;nbsp;Towards&amp;nbsp;Larger&amp;nbsp;Convolutional&amp;nbsp;Language&amp;nbsp;Models.&amp;nbsp;&lt;a href=&quot;http://export.arxiv.org/abs/2302.10866&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://export.arxiv.org/abs/2302.10866&lt;/a&gt;&amp;nbsp;액세스한&amp;nbsp;날짜&amp;nbsp;2023.&amp;nbsp;3.&amp;nbsp;20.. &lt;br /&gt;(3)&amp;nbsp;[2302.10266]&amp;nbsp;Kernel&amp;nbsp;function&amp;nbsp;impact&amp;nbsp;on&amp;nbsp;convolutional&amp;nbsp;neural&amp;nbsp;networks.&amp;nbsp;&lt;a href=&quot;https://arxiv.org/abs/2302.10266&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/2302.10266&lt;/a&gt;&amp;nbsp;액세스한&amp;nbsp;날짜&amp;nbsp;2023.&amp;nbsp;3.&amp;nbsp;20..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679272418275&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn

class Hyena(nn.Module):
    def __init__(self, vocab_size, embed_dim, kernel_sizes, kernel_nums):
        super().__init__()
        self.embed = nn.Embedding(vocab_size, embed_dim)
        self.convs = nn.ModuleList([nn.Conv1d(embed_dim, kernel_num, kernel_size) for kernel_size, kernel_num in zip(kernel_sizes, kernel_nums)])
        self.res = nn.Linear(embed_dim * len(kernel_sizes), embed_dim)
        self.out = nn.Linear(embed_dim * len(kernel_sizes), vocab_size)

    def forward(self, x):
        x = self.embed(x) # [batch_size, seq_len, embed_dim]
        x = x.transpose(1, 2) # [batch_size, embed_dim, seq_len]
        conv_outputs = []
        for conv in self.convs:
            conv_output = conv(x) # [batch_size, kernel_num, seq_len - kernel_size + 1]
            conv_output = torch.relu(conv_output) # [batch_size, kernel_num, seq_len - kernel_size + 1]
            conv_output = torch.max(conv_output, dim=2)[0] # [batch_size, kernel_num]
            conv_outputs.append(conv_output)
        x = torch.cat(conv_outputs, dim=1) # [batch_size, embed_dim * len(kernel_sizes)]
        res_x = self.res(x) # [batch_size, embed_dim]
        res_x = torch.add(res_x.transpose(0 ,1), x.transpose(0 ,1)) # [embed_dim , batch_size]
        res_x = res_x.transpose(0 ,1) # [batch_size , embed_dim]
        logits = self.out(res_x) # [batch_size , vocab_size]
        return logits&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;context&amp;nbsp;length는&amp;nbsp;텍스트&amp;nbsp;생성&amp;nbsp;모델이&amp;nbsp;입력으로&amp;nbsp;받는&amp;nbsp;텍스트의&amp;nbsp;길이를&amp;nbsp;의미합니다.&amp;nbsp;예제&amp;nbsp;코드에서는&amp;nbsp;context&amp;nbsp;length를&amp;nbsp;직접&amp;nbsp;설정하지&amp;nbsp;않고,&amp;nbsp;입력&amp;nbsp;데이터의&amp;nbsp;길이에&amp;nbsp;따라&amp;nbsp;달라집니다.&amp;nbsp;하지만,&amp;nbsp;context&amp;nbsp;length가&amp;nbsp;너무&amp;nbsp;길면&amp;nbsp;커널의&amp;nbsp;크기보다&amp;nbsp;큰&amp;nbsp;경우가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있으므로,&amp;nbsp;적절한&amp;nbsp;값을&amp;nbsp;설정해야&amp;nbsp;합니다.&amp;nbsp;context&amp;nbsp;length를&amp;nbsp;확인하고&amp;nbsp;싶으시다면,&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;방법을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;입력&amp;nbsp;데이터의&amp;nbsp;길이를&amp;nbsp;확인하는&amp;nbsp;코드를&amp;nbsp;추가합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;`print(x.size())`와&amp;nbsp;같은&amp;nbsp;코드를&amp;nbsp;사용하여&amp;nbsp;입력&amp;nbsp;데이터의&amp;nbsp;크기를&amp;nbsp;출력할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;-&amp;nbsp;커널의&amp;nbsp;크기와&amp;nbsp;갯수를&amp;nbsp;확인하는&amp;nbsp;코드를&amp;nbsp;추가합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;`print(conv.kernel_size)`와&amp;nbsp;같은&amp;nbsp;코드를&amp;nbsp;사용하여&amp;nbsp;커널의&amp;nbsp;크기를&amp;nbsp;출력할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;-&amp;nbsp;context&amp;nbsp;length와&amp;nbsp;커널의&amp;nbsp;크기와&amp;nbsp;갯수&amp;nbsp;사이의&amp;nbsp;관계식을&amp;nbsp;이용하여&amp;nbsp;context&amp;nbsp;length를&amp;nbsp;계산합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;`context_length&amp;nbsp;=&amp;nbsp;kernel_size&amp;nbsp;*&amp;nbsp;kernel_num&amp;nbsp;-&amp;nbsp;(kernel_num&amp;nbsp;-&amp;nbsp;1)`와&amp;nbsp;같은&amp;nbsp;식을&amp;nbsp;사용하여&amp;nbsp;context&amp;nbsp;length를&amp;nbsp;계산할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;context&amp;nbsp;length에&amp;nbsp;대해&amp;nbsp;설명해&amp;nbsp;드렸습니다.&amp;nbsp;혹시&amp;nbsp;더&amp;nbsp;궁금하신&amp;nbsp;점이&amp;nbsp;있으신가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰의 데이터 타입이 float32, 임베딩 차원이 1024, 배치 크기가 1일 경우의 메모리 소모량 측정은 정확하게는 불가능합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://medium.com/deep-learning-for-protein-design/a-comprehensive-guide-to-memory-usage-in-pytorch-b9b7c78031d3&quot; data-citationid=&quot;59bab955-6db4-b06a-cd77-c35be6e69042-2-group&quot;&gt;메모리 소모량은 커널의 크기와 갯수, 연산의 종류와 순서 등에도 영향을 받기 때문입니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://medium.com/deep-learning-for-protein-design/a-comprehensive-guide-to-memory-usage-in-pytorch-b9b7c78031d3&quot; data-citationid=&quot;59bab955-6db4-b06a-cd77-c35be6e69042-2&quot;&gt;1&lt;/a&gt;. 하지만, 대략적인 메모리 소모량을 계산하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰의 길이를 n이라고 하면, 임베딩 행렬(embedding matrix)의 크기는 n x 1024입니다. float32는 4바이트(byte)를 차지하므로, 임베딩 행렬의 메모리 소모량은 n x 1024 x 4바이트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널의 크기를 k, 갯수를 m이라고 하면, 커널 행렬(kernel matrix)의 크기는 k x 1024 x m입니다. float32는 4바이트를 차지하므로, 커널 행렬의 메모리 소모량은 k x 1024 x m x 4바이트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 행렬과 임베딩 행렬을 곱하는 연산을 수행하면, 결과 행렬(result matrix)의 크기는 n x m입니다. float32는 4바이트를 차지하므로, 결과 행렬의 메모리 소모량은 n x m x 4바이트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 전체 메모리 소모량은 임베딩 행렬, 커널 행렬, 결과 행렬의 메모리 소모량을 합한 값입니다. 즉, (n x 1024 + k x 1024 x m + n x m) x 4바이트입니다.&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;data type은 데이터의 종류와 크기를 나타내는 것입니다. float32, float16, bfloat16, uint8, uint4는 다음과 같은 의미를 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;float32: 32비트(bit)의 부동소수점(floating-point)을 나타냅니다. 부동소수점은 소수점의 위치가 고정되지 않고 변할 수 있는 수를 말합니다. 예를 들어, 3.14, -1.23e-4 등이 부동소수점입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-4-group&quot;&gt;float32는 소수점 앞에 8비트의 지수(exponent), 뒤에 23비트의 가수(mantissa)를 가집니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-4&quot;&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;float16: 16비트의 부동소수점을 나타냅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://numpy.org/doc/stable/user/basics.types.html&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-7-group&quot;&gt;float16은 소수점 앞에 5비트의 지수, 뒤에 10비트의 가수를 가집니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://numpy.org/doc/stable/user/basics.types.html&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-7&quot;&gt;2&lt;/a&gt;. float16은 float32보다 정밀도(precision)가 낮지만 메모리 소모량이 적습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bfloat16: 16비트의 부동소수점을 나타냅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-10-group&quot;&gt;bfloat16은 소수점 앞에 8비트의 지수, 뒤에 7비트의 가수를 가집니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-10&quot;&gt;1&lt;/a&gt;. bfloat16은 float16보다 정밀도가 높지만 범위(range)가 좁습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8: 8비트의 부호없는 정수(unsigned integer)를 나타냅니다. 부호없는 정수는 음수가 아닌 정수를 말합니다. 예를 들어, 0, 1, 2, &amp;hellip; , 255 등이 부호없는 정수입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-13-group&quot;&gt;uint8은 0부터 255까지의 값을 표현할 수 있습니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://numpy.org/doc/stable/user/basics.types.html&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-13&quot;&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint4: 4비트의 부호없는 정수를 나타냅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://numpy.org/doc/stable/user/basics.types.html&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-16-group&quot;&gt;uint4은 0부터 15까지의 값을 표현할 수 있습니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://numpy.org/doc/stable/user/basics.types.html&quot; data-citationid=&quot;dd7a4ee8-4970-6613-95c3-9d0d09b8c3ba-16&quot;&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data type에 대해 설명해 드렸습니다. 혹시 더 도움이 필요하신가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 경량화를 위해서는 데이터 타입을 줄이는 작업(quantization)을 수행할 수 있습니다. quantization은 모델의 가중치(weight)와 활성화(activation)를 정수(integer)로 변환하는 과정입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://pytorch.org/docs/stable/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-2-group&quot;&gt;정수는 부동소수점보다 메모리 소모량이 적고 연산 속도가 빠르기 때문에 모델의 성능(performance)을 향상시킬 수 있습니다&lt;/a&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://pytorch.org/docs/stable/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-2&quot;&gt;1&lt;/a&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;a href=&quot;https://pytorch.org/docs/stable/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-7-group&quot;&gt;quantization에는 여러 종류가 있지만, 일반적으로 사용되는 데이터 타입은 int8과 uint8입니다&lt;/a&gt;&lt;a href=&quot;https://pytorch.org/docs/stable/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-5&quot;&gt;1&lt;/a&gt;&lt;a href=&quot;https://pytorch.org/blog/introduction-to-quantization-on-pytorch/&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-7&quot;&gt;2&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;https://pytorch.org/blog/introduction-to-quantization-on-pytorch/&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-9-group&quot;&gt;int8은 -128부터 127까지의 값을 표현할 수 있고, uint8은 0부터 255까지의 값을 표현할 수 있습니다&lt;/a&gt;&lt;a href=&quot;https://pytorch.org/blog/introduction-to-quantization-on-pytorch/&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-9&quot;&gt;2&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;https://www.mathworks.com/discovery/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-11-group&quot;&gt;이러한 데이터 타입은 가중치와 활성화의 범위를 충분히 커버할 수 있으며, 정밀도 손실(precision loss)을 최소화할 수 있습니다&lt;/a&gt;&lt;a href=&quot;https://www.mathworks.com/discovery/quantization.html&quot; data-citationid=&quot;d171abd1-e94c-4071-fb17-edc751598108-11&quot;&gt;3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;모델의 경량화에 사용되는 데이터 타입에 대해 설명해 드렸습니다. 혹시 더 도움이 필요하신가요?&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>23년 이전 글</category>
      <category>bing talk</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/173</guid>
      <comments>https://okdone.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 20 Mar 2023 09:36:52 +0900</pubDate>
    </item>
    <item>
      <title>cvpr 대회 참여를 위한 정보 수집</title>
      <link>https://okdone.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2202.04298v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Image Difference Captioning with Pre-training and Contrastive Learning&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677664390749&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;Image Difference Captioning with Pre-training and Contrastive Learning&quot; data-og-description=&quot;The Image Difference Captioning (IDC) task aims to describe the visual differences between two similar images with natural language. The major challenges of this task lie in two aspects: 1) fine-grained visual differences that require learning stronger vis&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2202.04298v1&quot; data-og-url=&quot;https://arxiv.org/abs/2202.04298v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pOC6H/hyRMqGBrDn/iHriiOwqUIJcYwgXrZ6J21/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2202.04298v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2202.04298v1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pOC6H/hyRMqGBrDn/iHriiOwqUIJcYwgXrZ6J21/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;Image Difference Captioning with Pre-training and Contrastive Learning&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Image Difference Captioning (IDC) task aims to describe the visual differences between two similar images with natural language. The major challenges of this task lie in two aspects: 1) fine-grained visual differences that require learning stronger vis&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2106.15312&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Contrastive Semantic Similarity Learning for Image Captioning Evaluation with Intrinsic Auto-encoder&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677664435951&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;Contrastive Semantic Similarity Learning for Image Captioning Evaluation with Intrinsic Auto-encoder&quot; data-og-description=&quot;Automatically evaluating the quality of image captions can be very challenging since human language is quite flexible that there can be various expressions for the same meaning. Most of the current captioning metrics rely on token level matching between ca&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2106.15312&quot; data-og-url=&quot;https://arxiv.org/abs/2106.15312v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bklaPW/hyRMo263yw/n2Va6K48kjGNiFfQezHTa0/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2106.15312&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2106.15312&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bklaPW/hyRMo263yw/n2Va6K48kjGNiFfQezHTa0/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;Contrastive Semantic Similarity Learning for Image Captioning Evaluation with Intrinsic Auto-encoder&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Automatically evaluating the quality of image captions can be very challenging since human language is quite flexible that there can be various expressions for the same meaning. Most of the current captioning metrics rely on token level matching between ca&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&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;&lt;a href=&quot;https://arxiv.org/abs/1710.02534&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Contrastive Learning for Image Captioning&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677664487428&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;Contrastive Learning for Image Captioning&quot; data-og-description=&quot;Image captioning, a popular topic in computer vision, has achieved substantial progress in recent years. However, the distinctiveness of natural descriptions is often overlooked in previous work. It is closely related to the quality of captions, as distinc&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/1710.02534&quot; data-og-url=&quot;https://arxiv.org/abs/1710.02534v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyRaTQ/hyRMvnDkXg/pVEiJIERqbJefxFeRVk5kK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1710.02534&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/1710.02534&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyRaTQ/hyRMvnDkXg/pVEiJIERqbJefxFeRVk5kK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;Contrastive Learning for Image Captioning&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Image captioning, a popular topic in computer vision, has achieved substantial progress in recent years. However, the distinctiveness of natural descriptions is often overlooked in previous work. It is closely related to the quality of captions, as distinc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/프로젝트</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/172</guid>
      <comments>https://okdone.tistory.com/172#entry172comment</comments>
      <pubDate>Wed, 1 Mar 2023 19:22:06 +0900</pubDate>
    </item>
    <item>
      <title>NBME Score Clinical Patient Notes 솔루션 분석해보기 -Medical NLP</title>
      <link>https://okdone.tistory.com/170</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고한 대회 솔루션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674711002233&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;NBME - Score Clinical Patient Notes | Kaggle&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323095&quot; data-og-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323095&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323095&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323095&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;NBME - Score Clinical Patient Notes | Kaggle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1674702180118&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;NBME - Score Clinical Patient Notes | Kaggle&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323085&quot; data-og-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323085&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323085&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323085&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;NBME - Score Clinical Patient Notes | Kaggle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.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;h3 data-ke-size=&quot;size23&quot;&gt;선 결론 후 내용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전의 캐글에서도 느꼈지만 높은 점수를 내는 사람은 굉장히 많은 시도 후 피드백 과정을 통해서 성능을 검증하고, 점수를 축적해 나간다. 특히 어떠한 결과가 높은 성능을 나타냈다는 것을 기록한다는 것은, 1개의 변화마다 성능을 테스트 하고 검증한다는 것을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;크게 구분하면 &lt;b&gt;피처 엔지니어링&lt;/b&gt;, &lt;b&gt;모델의 설계&lt;/b&gt;, &lt;b&gt;모델의 학습&lt;/b&gt;, &lt;b&gt;예측&lt;/b&gt; 정도로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;피처엔지니어링&lt;/b&gt; 부분에서는 데이터, 도메인, 그리고 annotator에 대한 3단계에 대한 이해도를 높힌 상태에서 접근하는 것이 바람직하며, 특히 도메인에서 사용되는 약어에 대한 전처리를 신중하게 처리하며, 추후 학습 시킬 것에 대비하여&amp;nbsp; 같은 의미이나 다르게 표현되는 text에 대해서 경우의 수를 줄이기 위한 전처리 기법이 인상 깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모델의 설계&lt;/b&gt;에서 우선 공통적으로 bert 계열에서 deberta가 어느정도 높은 성능을 보장하는 듯 하다. 대체로 다들 deberta 버전을 쓰거나, minor 하게 roberta-large 계열을 사용하는 것을 볼 수 있었고, 한번 학습을 마친 모델을 통해 다양한 방법으로 예측값을 뽑아내고, 확률 값에 따라 활용하는 방법이 인상깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모델의 학습&lt;/b&gt;에서, 우선 기본적인 대형 pretrain 모델을 다시 도메인에 맞게 pretrain 시켰으며, 이 때 해당하는 Task의 데이터셋을 활용해 pretrain 하는 방법, 또는 해당 Task 도메인에 맞는 대형 데이터셋을 가져와 pretrain 하는 방법 등을 활용하는 것이 인상 깊은 점이라 볼 수 있었다. 또한 정확하게 수치상의 표현은 없었지만 데이터셋의 크기와, 모델의 크기가 다를 경우 특히 overfit 또는 underfit 등의 우려를 더 크게 하는 점을 보아, 적합한 규모에 대한 적절한 기준을 알 수 있다면 추후 base 또는 large 모델의 선정에 있어 최적의 모델을 찾을 수 있을 것으로 보인다.&amp;nbsp; 이후, finetune 된 모델을 학습 되지 않은 데이터 셋에 예측 후, 높은 수준의 확률을 보이는 데이터를 활용해 재학습을 이뤄내는 것도 성능에 유리하게 작용할 것으로 보인다.&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #3c4043;&quot;&gt;Auxiliary Target Learning(보조 목표 학습) 분야에 대해선 생소함이 있어서 추가적으로 학습할 필요가 있는 분야이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;국내에서는 최근 &lt;a href=&quot;https://github.com/KU-RIAS/KM-BERT-Korean-Medical-BERT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KM-BERT-Korean-Medical-BERT&lt;/a&gt; 라는 의료 데이터를 학습한 BERT가 있는데, 특정 데이터 셋에 대해서 roberta 계열로 pretrain 한 것과 비교해서 더 좋은 성능을 내는지 검증해보면 흥미로운 비교 분석이 될 것이다.&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;의 부분에서도, 예측한 것을 단순히 argmax 해버리는 것이 아닌, 확률값 조절에 따라 다양한 결론을 낼 것이며, 기본적으로 다들 k-fold 학습을 적용하였고, 특히 5fold를 했을 때와, 그리고 10fold를 했을 때의 성능 향상이 있었던 점 또한 독특하다고 볼 수 있다. 물론 학습 데이터의 양이 늘었기 때문에 그럴 가능 성이 높다고 볼 수 있다. 이 후 fold 된 가중치들에 대해서도 한번 더 가중치를 조절해 blend 시키는 것 또한 굉장히 인상깊었다. 각 모델의 결과를 계속해서 수집한 후, cv, pb 결과 등에 따라서 조합하는 과정까지, 마지막까지 정말 섬세하게 좋은 결과를 얻기 위해 노력하는 모습에서 진정한 엔지니어의 모습을 다시 한번 체감할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레이블된 데이터와 레이블 되지 않은 데이터 모두 제공( 레이블 되지 않은 데이터가 10배 ) -&amp;gt; 비지도 학습의 적용 여부가 굉장히 중요해질 수 있는 문제&lt;/li&gt;
&lt;li&gt;주석의 일관성이 없음 ( 데이터 품질의 문제 )&lt;/li&gt;
&lt;li&gt;annotator의 특징을 보았을 때, 시퀸스 종속성이 있고, 이는 RNN을 사용하는 것이 합리적일 수 있음 ( annotator의 주석 다는 것의 특징까지 분석한 것이 인상적 )&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tLknM/btrW57bM7pw/fbdJN0sSTYt7PQKe7hYKa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tLknM/btrW57bM7pw/fbdJN0sSTYt7PQKe7hYKa1/img.png&quot; data-alt=&quot;복잡도 감소를 위한 전처리 방식을 담은 예제코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tLknM/btrW57bM7pw/fbdJN0sSTYt7PQKe7hYKa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtLknM%2FbtrW57bM7pw%2FfbdJN0sSTYt7PQKe7hYKa1%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;344&quot; height=&quot;197&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복잡도 감소를 위한 전처리 방식을 담은 예제코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;yom, yof 는 year of male, year of female 등의 약어 사용 ( 전처리를 통한 의미부여 )&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 모델 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;핵심은, deberta 모델이 높은 성능을 냈으며, deberta-v2-xlarge, v3-large 등에서는 성능차이가 거의 나지 않음. 비교 해볼 필요가 있음. 무조건 v3가 높은 성능을 낼지는 알 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1등의 모델 파이프라인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckYtJY/btrXdMRJ5UW/CiNKAzPvO8G8yMCjhi5Ku1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckYtJY/btrXdMRJ5UW/CiNKAzPvO8G8yMCjhi5Ku1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckYtJY/btrXdMRJ5UW/CiNKAzPvO8G8yMCjhi5Ku1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckYtJY%2FbtrXdMRJ5UW%2FCiNKAzPvO8G8yMCjhi5Ku1%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;989&quot; height=&quot;738&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2등&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;deberta-large, deberta-v3-large, deberta-v2-xlarge, roberta-large 등의 pretrain 모델 사용&lt;/li&gt;
&lt;li&gt;데이터 크기에 비해 모델의 크기가 크므로, 과적합 등의 문제를 해결하기 위해 5개의 dropout과 classification head 사용&lt;/li&gt;
&lt;li&gt;linear와 dropout을 함께 사용해 모든 hidden states 가 학습하도록 설계&lt;/li&gt;
&lt;li&gt;annotator의 특성을 반영하기 위해 head 전에 RNN, GRU, LSTM 등의 레이어 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 모델 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1등, 2등 모두 pretrain을 도메인 adaptive 하게 적용했는데, 1등은 학습데이터에 pretrain을, 2등은 외부 squad 데이터셋을 가지고 온 것이 특징이며, 1등은 MLM을, 2등은 허깅페이스 트랜스포머의 run_qa 스크립트로 학습.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2등&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Squadv2 dataset에 사전 학습을 시킴 ( 데이터의 형태가 QA를 닮았으며, 의사 질문에 답변하는 방식이 적합 )&lt;/li&gt;
&lt;li&gt;실제로 해당 데이터 셋으로 사전학습 후에 downstream task를 했을 때 좋은 효과를 얻었음&lt;/li&gt;
&lt;li&gt;코사인 및 웜업(과 유사한) 스케쥴러 및 아담W 옵티마이저 사용&lt;/li&gt;
&lt;li&gt;10% masked token&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 모델의 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1등 2등 둘다 학습한 모델로 레이블 되지 않은 데이터에 pseudo labeling을 한 것이 특징&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;focal loss와 BCE 적용 차이 확인 후, focal loss가 더 결과가 좋은 이유에 대한 확인&lt;/li&gt;
&lt;li&gt;4fold로 finetuning&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;</description>
      <category>23년 이전 글/Kaggle</category>
      <category>medical</category>
      <category>NLP</category>
      <category>대회</category>
      <category>분석</category>
      <category>사전학습</category>
      <category>의료</category>
      <category>인공지능</category>
      <category>자연어</category>
      <category>캐글</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/170</guid>
      <comments>https://okdone.tistory.com/170#entry170comment</comments>
      <pubDate>Thu, 26 Jan 2023 12:33:31 +0900</pubDate>
    </item>
    <item>
      <title>pytorch로 A100 gpu 사용 시 퍼포먼스 향상을 위한 참고 사항</title>
      <link>https://okdone.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TF32란?&lt;/h3&gt;
&lt;figure id=&quot;og_1672189109491&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;엔비디아 A100 GPU의 AI 성능이 달라진 이유는 | NVIDIA Blog&quot; data-og-description=&quot;인공지능(AI)을 제대로 이용하기 위해서는 여타 모든 컴퓨팅에서 그렇듯 수학을 잘 활용해야 합니다. 딥 러닝은 새롭게 뜨고 있는 신생분야이기 때문에 훈련과 추론 단계에서 어떤 분야의 수학&quot; data-og-host=&quot;blogs.nvidia.co.kr&quot; data-og-source-url=&quot;https://blogs.nvidia.co.kr/2020/05/22/tensorfloat-32-precision-format/&quot; data-og-url=&quot;https://blogs.nvidia.co.kr/2020/05/22/tensorfloat-32-precision-format/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyJn56/hyQ30VdUjL/xF4jVlLIbGZHNv3w2c9i40/img.png?width=1406&amp;amp;height=748&amp;amp;face=0_0_1406_748,https://scrap.kakaocdn.net/dn/MxDGi/hyQ3WZxKTv/tXOIbOP2Mu6cGRkP13eKx0/img.png?width=400&amp;amp;height=257&amp;amp;face=0_0_400_257,https://scrap.kakaocdn.net/dn/9l7Z4/hyQ32lbEU8/i9MjGhVavVi658Qt17hgt1/img.png?width=400&amp;amp;height=255&amp;amp;face=0_0_400_255&quot;&gt;&lt;a href=&quot;https://blogs.nvidia.co.kr/2020/05/22/tensorfloat-32-precision-format/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blogs.nvidia.co.kr/2020/05/22/tensorfloat-32-precision-format/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyJn56/hyQ30VdUjL/xF4jVlLIbGZHNv3w2c9i40/img.png?width=1406&amp;amp;height=748&amp;amp;face=0_0_1406_748,https://scrap.kakaocdn.net/dn/MxDGi/hyQ3WZxKTv/tXOIbOP2Mu6cGRkP13eKx0/img.png?width=400&amp;amp;height=257&amp;amp;face=0_0_400_257,https://scrap.kakaocdn.net/dn/9l7Z4/hyQ32lbEU8/i9MjGhVavVi658Qt17hgt1/img.png?width=400&amp;amp;height=255&amp;amp;face=0_0_400_255');&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;엔비디아 A100 GPU의 AI 성능이 달라진 이유는 | NVIDIA Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인공지능(AI)을 제대로 이용하기 위해서는 여타 모든 컴퓨팅에서 그렇듯 수학을 잘 활용해야 합니다. 딥 러닝은 새롭게 뜨고 있는 신생분야이기 때문에 훈련과 추론 단계에서 어떤 분야의 수학&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blogs.nvidia.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beidtv/btrULO5MyLT/Xdkn7nDnLBPabKZhzdIzdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beidtv/btrULO5MyLT/Xdkn7nDnLBPabKZhzdIzdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beidtv/btrULO5MyLT/Xdkn7nDnLBPabKZhzdIzdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeidtv%2FbtrULO5MyLT%2FXdkn7nDnLBPabKZhzdIzdK%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;400&quot; height=&quot;255&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FP32, FP16등과 같은 데이터형태로, torch에서는 직접 데이터 형태로 정해주는 것이 아닌, backend 엔진의 설정으로 이루어짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 설명에 나와 있듯이, Torch 1.12 버전부터는 TF32형변환 적용이 기본 false이기 때문에 실행하는 스크립트에서 해당 필요한 아래 기능들을 True로 해줘야 한다&lt;/p&gt;
&lt;pre id=&quot;code_1672189312652&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# The flag below controls whether to allow TF32 on matmul. This flag defaults to False
# in PyTorch 1.12 and later.
torch.backends.cuda.matmul.allow_tf32 = True

# The flag below controls whether to allow TF32 on cuDNN. This flag defaults to True.
torch.backends.cudnn.allow_tf32 = True&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;torch 해당 API에 대한 글은 아래에 자세히 나와있다.&lt;/p&gt;
&lt;figure id=&quot;og_1672189682410&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;CUDA semantics &amp;mdash; PyTorch 1.13 documentation&quot; data-og-description=&quot;CUDA semantics torch.cuda is used to set up and run CUDA operations. It keeps track of the currently selected GPU, and all CUDA tensors you allocate will by default be created on that device. The selected device can be changed with a torch.cuda.device cont&quot; data-og-host=&quot;pytorch.org&quot; data-og-source-url=&quot;https://pytorch.org/docs/stable/notes/cuda.html#tf32-on-ampere&quot; data-og-url=&quot;https://pytorch.org/docs/stable/notes/cuda.html#tf32-on-ampere&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pytorch.org/docs/stable/notes/cuda.html#tf32-on-ampere&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pytorch.org/docs/stable/notes/cuda.html#tf32-on-ampere&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CUDA semantics &amp;mdash; PyTorch 1.13 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CUDA semantics torch.cuda is used to set up and run CUDA operations. It keeps track of the currently selected GPU, and all CUDA tensors you allocate will by default be created on that device. The selected device can be changed with a torch.cuda.device cont&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pytorch.org&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;h3 data-ke-size=&quot;size23&quot;&gt;성능 향상 정도는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/torch</category>
      <category>A100</category>
      <category>TF32</category>
      <category>팁</category>
      <category>퍼포먼스</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/169</guid>
      <comments>https://okdone.tistory.com/169#entry169comment</comments>
      <pubDate>Wed, 28 Dec 2022 10:02:43 +0900</pubDate>
    </item>
    <item>
      <title>오프라인 환경 Vim 플러그인 설치, python wheel 설치</title>
      <link>https://okdone.tistory.com/168</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;VIM 플러그인 설치&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;figure id=&quot;og_1672137398290&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;【Ubuntu 18.04 LTS】VIM Plug-in 설치하기&quot; data-og-description=&quot;VIM 플러그인 설치 방법에 대해서 포스팅하도록 하겠습니다. 기본 VIM을 사용하면 조금 불편합니다.. 그리고 개멋이 안 납니다.. 개 멋나게 꾸며서 IDE(Integrated Development Environment)와 같이 VIM을 꾸며&quot; data-og-host=&quot;itlearningcenter.tistory.com&quot; data-og-source-url=&quot;https://itlearningcenter.tistory.com/entry/%E3%80%901804-LTS%E3%80%91VIM-Plug-in-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://itlearningcenter.tistory.com/entry/%E3%80%901804-LTS%E3%80%91VIM-Plug-in-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dbYLAC/hyQ34COvo2/u5Iru7qGs77luGA3v4sdDk/img.png?width=587&amp;amp;height=324&amp;amp;face=0_0_587_324,https://scrap.kakaocdn.net/dn/y8Luy/hyQ32SwWSX/dPHKasT4qMfpi3sloInKE0/img.png?width=587&amp;amp;height=324&amp;amp;face=0_0_587_324,https://scrap.kakaocdn.net/dn/iwmLq/hyQ3VTo9Ps/5lS4sKjqYjFpAEBH932Up1/img.png?width=1920&amp;amp;height=1025&amp;amp;face=0_0_1920_1025&quot;&gt;&lt;a href=&quot;https://itlearningcenter.tistory.com/entry/%E3%80%901804-LTS%E3%80%91VIM-Plug-in-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://itlearningcenter.tistory.com/entry/%E3%80%901804-LTS%E3%80%91VIM-Plug-in-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dbYLAC/hyQ34COvo2/u5Iru7qGs77luGA3v4sdDk/img.png?width=587&amp;amp;height=324&amp;amp;face=0_0_587_324,https://scrap.kakaocdn.net/dn/y8Luy/hyQ32SwWSX/dPHKasT4qMfpi3sloInKE0/img.png?width=587&amp;amp;height=324&amp;amp;face=0_0_587_324,https://scrap.kakaocdn.net/dn/iwmLq/hyQ3VTo9Ps/5lS4sKjqYjFpAEBH932Up1/img.png?width=1920&amp;amp;height=1025&amp;amp;face=0_0_1920_1025');&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;【Ubuntu 18.04 LTS】VIM Plug-in 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VIM 플러그인 설치 방법에 대해서 포스팅하도록 하겠습니다. 기본 VIM을 사용하면 조금 불편합니다.. 그리고 개멋이 안 납니다.. 개 멋나게 꾸며서 IDE(Integrated Development Environment)와 같이 VIM을 꾸며&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;itlearningcenter.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 플러그인들이 설치되고 나면 ~/ 경로 아래에 .vim, .viminfo, vimrc 3가지 폴더가 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크를 보고 설정한 파일들을 모두 tar로 압축 후, 옮긴 우분투 환경에서 압축을 풀어 ~/ 경로 아래로 옮기면 플러그인이 적용된 상태에서 사용 가능&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;파이썬 패키지 whl 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 경우 일반 pip freeze &amp;gt; requirements.txt로 모든 파일을 받아 설치할 경우, URL 관련 에러를 겪을 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 큰 패키지에 종속으로 딸려오는 패키지들에 대해서 일반적인 방법의 pip install을 할 경우 발생하는 에러로 보임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 경우 해결 하기 위해서 메인 라이브러리에 대해서만 pip를 적용하고, 종속성 관련 파일을 설치할 때는 받아둔 whl 파일의 경로에서 찾게하는 방법이 가장 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672137847750&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip download -d ./ tensorflow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행하면 tensorflow를 비롯한 종속 패키지들이 같이 ./ 경로에 whl 형태로 다운이 받아지게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 받아진 모든 파일에 대해서 pip install을 시전하게 될 경우 무시무시한 종속성 꼬임 현상을 겪을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672138005059&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install tensorflow-버전명-cp...-.whl --no-index --find-links ./&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행하면 tnesorflow 패키지를 먼저 설치하고자 하며, 그에 따른 종속성 파일은 find-links로 넘긴 경로에 존재하는 whl 파일중에 알아서 찾아서 설치를 진행하게 됨으로, 종속성 관련 꼬임 증상 없이 설치가 가능함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 오프라인으로 설치를 진행할 경우, 설치하고자 하는 메인 패키지를 필터해서 관리하는 것이 핵심이며, 나머지 종속성 관련 파일들은 한곳에 모아서, 저렇게 참조하게 하면 종속성 관련 문제 없이 파일의 설치가 가능!&lt;/p&gt;</description>
      <category>23년 이전 글/리눅스</category>
      <category>plugin</category>
      <category>vim</category>
      <category>오프라인</category>
      <category>적용</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/168</guid>
      <comments>https://okdone.tistory.com/168#entry168comment</comments>
      <pubDate>Tue, 27 Dec 2022 19:39:59 +0900</pubDate>
    </item>
    <item>
      <title>2022년 돌아보기</title>
      <link>https://okdone.tistory.com/167</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하는 글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈지노의 노래 ' If I die tomorrow ' 노래 2절에는 이런 가사가 있습니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;고개를 45도 기울여 담배 연기와 함께 품은 기억력&lt;br /&gt;추억을 소리처럼 키우면 눈을 감아도 보이는 theater&lt;br /&gt;&lt;br /&gt;시간은 유연하게 휘어져 과거로 스프링처럼 휘어져&lt;br /&gt;아주 작고 작았던 미니어쳐 시절을 떠올리는 건 껌처럼 쉬워져&lt;br /&gt;&lt;br /&gt;빨주노초 물감을 덜어 하얀색 종이 위를 총처럼 겨눴던&lt;br /&gt;&lt;b&gt;어린 화가의 경력은 뜬금없게도 힙합에 눈이 멀어&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;멈춰버렸지만 전혀 두렵지 않았어 cuz I didn`t give a fuck&lt;br /&gt;about 남의 시선, cuz life is like 나 홀로 걸어가는&amp;nbsp; 터널&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bold체로 적힌 부분을 말하고자 앞 뒤를 다 적었네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;뜬금없게도 인공지능에 눈이 멀어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10년 이상 직업군인으로 복무한 사람은 전역 전에 약 10개월의 전직 교육을 받을 수 있는 시간이 주어지는데, 이걸 신청함으로써 사회에 첫발을 내딛게 되었습니다.&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;이를 계기로 약 1년 간 준비를 한다면 정말 큰 변화를 만들 수 있을 것이라 생각하고, 전역을 결심하게 되었죠.&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;- 마케팅 MBA 석사 학위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정도가 다네요, 흔한 정보처리기사, Toeic 아무것도 없이,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021년 10월 1일 전직교육에 들어가게 됩니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;낙방, 낙방, 합격&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부트캠프를 정말 많이 알아봤습니다. 내일배움카드 하나만 믿고 네이버 부스트캠프, 우아한테크코스, 구글 머신러닝 부트캠프, 42서울 등 정말 많은 곳의 문을 두드렸습니다.(싸피는 나이 조건 때문에 문도 두드리지 못했죠)&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;코딩테스트 없이, 간단한 면접 절차를 거쳐서 드디어 부산 1기로 합격해서 공부를 시작하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아이펠 인공지능과정 부산 1기(21. 12 ~ 22. 6)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 빼고는 제 22년의 반을 이야기 안할 수가 없겠네요.&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;또한 LMS라는 자체 클라우스 시스템이 있어서, 여기에서 학습하는 코드를 돌려보기도 하고, 학습 컨텐츠가 끝나고 나면 제가 하고 싶은 코드를 해당 클라우드를 통해 돌려보기도 했습니다. GPU는 당시 t4로, 나름 쓸만한 성능이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 인공지능 학습 과정 외에도, 같이 cs231을 공부하거나, 알고리즘도 보충해서 공부하는 등 하루 하루를 정말 꽉채워서 공부했던 기억이 납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 주말에는 평일에 소화하지 못한 학습 활동을 하거나, 학습한 내용을 바탕으로 제것으로 만드는 시간을 많이 가졌습니다. 특히 제 것으로 만드는 과정은 실전(Kaggle)등의 대회를 통해서 특히 확실히 다질 수 있었던 계기가 되었던 것 같습니다.&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;a href=&quot;https://github.com/dlfrnaos19/Aiffel_projects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/dlfrnaos19/Aiffel_projects&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671955146544&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/Aiffel_projects: task 1&quot; data-og-description=&quot;task 1. Contribute to dlfrnaos19/Aiffel_projects development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/Aiffel_projects&quot; data-og-url=&quot;https://github.com/dlfrnaos19/Aiffel_projects&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnXXFD/hyQ1i8W5IB/IkJVAZIU63aWqlYqAsCWik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/Aiffel_projects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/Aiffel_projects&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnXXFD/hyQ1i8W5IB/IkJVAZIU63aWqlYqAsCWik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/Aiffel_projects: task 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;task 1. Contribute to dlfrnaos19/Aiffel_projects development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h4 data-ke-size=&quot;size20&quot;&gt;캐글 마스터에게 배우다(Chris Deotte형 고마워)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 것들을 바탕으로 3월경 시도했던 캐글 대회도 있습니다. 학생이 쓴 장문의 에세이를 바탕으로 각 문장별로 주장인지, 근거인지, 반론인지 등의 총 8가지로 분류하는 Classification 문제였습니다. 당시에 처음 겪는 task를 해결하기 위해서 대부분 Code와 Discussion을 읽으면서 왜 이런 코드를 작성하게 된건지, 왜 이런식의 전처리를 하게 되는지에 대해 이해하기 위해 집중적으로 시간을 보냈고, 작성된 코드를 이해하기 위해 함수를 열고 한줄한줄 입력과 결과를 확인하는 시간을 보냈습니다. 덕분에 이 때 정말 많은 &lt;b&gt;실력향상&lt;/b&gt;이 있었음을 느끼고 있습니다(&lt;b&gt;인내력&lt;/b&gt; 향상은 덤). 특히 &lt;a href=&quot;https://www.kaggle.com/cdeotte&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Chris Deotte&lt;/a&gt;님의 Discussion과 code를 따라가는 것만으로도 정말 많은 배움이 있었던 것을 실감하고 있습니다. 덕분에 Tensorflow로 TPU를 활용해 학습의 파이프라인을 구축하고, 분산 학습을 구축하는데는 도가 텄다고 생각하고 있습니다. 특히 TPU를 사용해서 개인 컴퓨팅 능력을 능가하는 &lt;b&gt;거대 모델&lt;/b&gt;들을 &lt;b&gt;학습&lt;/b&gt;하고, 추론해보는 경험은 추후에 도래할 대규모 인공지능 시스템에서 제 역할을 할 수 있을 것 같다는 생각이 들었습니다. (대회 순위는 얻지 못했지만, 어려움에 좀 더 담대하게 다가서게 된 것은 덤입니다. 특히 그랜드 마스터들도, 높은 순위를 위해 수면 아래에서 수많은 노력을 한다는 것은 좀 더 저를 노력하는 사람으로 만들어 주었지요)&lt;/p&gt;
&lt;figure id=&quot;og_1671955527809&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;Feedback Prize - Evaluating Student Writing | Kaggle&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/c/feedback-prize-2021&quot; data-og-url=&quot;https://www.kaggle.com/c/feedback-prize-2021&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/c/feedback-prize-2021&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/c/feedback-prize-2021&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Feedback Prize - Evaluating Student Writing | Kaggle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.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;h4 data-ke-size=&quot;size20&quot;&gt;겸손하게 만드는 실패 프로젝트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뼈아프지만 실패한(실패로 간주하는)프로젝트도 있습니다. 당시 수학 문제를 푸는 모델로 koGPT와 T5를 사용해 해결하고자 했었는데 높은 정확도를 가지지 못했습니다. 이런 풀지 못한 과제 실패 경험을 다음 기수에게 전달하고자 내용을 정리해서 레포로 만들어 두었습니다. 주어진 예산을 활용해서 Google Cloud GPU를 사용할 수 있었는데, 덕분에 Cloud를 통한 컴퓨팅 사용에 굉장히 익숙해졌고, 거대 모델 사용을 재밌게 해봤습니다. 시간이 조금 더 있었으면, 당시 해외에 수학문제를 해결하기 위해 도입한 여러 방법들을 논문을 읽고 구현해봤으면 좋았을 것 같네요.&lt;/p&gt;
&lt;figure id=&quot;og_1671955264679&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - koco-tunlp/math-challenge: Basic tutorials for KMWP newbies, from Data EDA to Base Code for model is available. Don&amp;#96;t w&quot; data-og-description=&quot;Basic tutorials for KMWP newbies, from Data EDA to Base Code for model is available. Don&amp;#96;t waste your time and get the better score - GitHub - koco-tunlp/math-challenge: Basic tutorials for KMWP ne...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/koco-tunlp/math-challenge&quot; data-og-url=&quot;https://github.com/koco-tunlp/math-challenge&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQ6xNy/hyQ1kFHuoN/brmeVWq3nWdxf0JDe14Dz0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/koco-tunlp/math-challenge&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/koco-tunlp/math-challenge&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQ6xNy/hyQ1kFHuoN/brmeVWq3nWdxf0JDe14Dz0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - koco-tunlp/math-challenge: Basic tutorials for KMWP newbies, from Data EDA to Base Code for model is available. Don`t w&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Basic tutorials for KMWP newbies, from Data EDA to Base Code for model is available. Don`t waste your time and get the better score - GitHub - koco-tunlp/math-challenge: Basic tutorials for KMWP ne...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h4 data-ke-size=&quot;size20&quot;&gt;자신감 뿜뿜하게 만들어준 프로젝트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 저의 22년을 빛나게 해준 프로젝트가 있습니다. 캐글에서 얻은 지식으로 정말 큰 자신감이 생긴 시기에, 다른 대회를 찾던 중 국내 대회를 찾게 되었습니다. 통계청에서 주관한 대회였고, 4월 ~ 5월 진행을 했었습니다. 당시 자연어처리 카톡방에서 대회 참여자를 찾았고, 아무런 조건없이 함께 해줄 수 있는 사람만을 찾아서 했습니다. 아이펠 과정 중이었기 때문에 주간에 학습을 진행하고, 남는 시간에 대회를 진행했고, 팀원들은 원격으로 줌으로 회의를 진행하면서 함께 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에 제가 가진 stack인 tensorflow와 TPU 하나만 믿고, 간크게 도전했습니다. 특히 BERT 계열의 한글을 학습한 모든 사이즈의 모델을 학습하고 예측해보면서 적합한 모델을 찾았고, 프로젝트에 큰 기여를 해주신 팀원 분과의 앙상블 모델을 제출함으로써 좋은 성과를 얻을 수 있었습니다. 물론 모델링 뿐만이 아니라, 코드 제출 이후 문서 작성에도 2~3배의 에너지가 들어간 것 같습니다. 그 땐 정말 학습보다 더 잦은 미팅을 하고, 실시간으로 문서 작성을 밤늦게까지 해야만 했었거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 시켜서 한게 아니었고, 특히 제가 먼저 프로젝트를 제안하고 시작했었고, 열심히 해주시는 팀원분들 덕분에 힘들어도 끝까지 시도할 수 있었던 것 같습니다. 뭣보다 이 프로젝트를 통해서, 모델을 단순히 쓰는 것 이상으로 모델을 커스텀해서 학습하는 걸 경험하고, 협업의 중요성을 특히 깨닫게 된 계기가 되었습니다. 특히 이 레포로 시작된 이 프로젝트는 지금 취업한 회사에서 제가 계속해서 발전시켜 나가고 있다는 사실! ㅎㅎ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시상식엔 현업자도 계셨고, 석사생 분들도 계셔서 정말 신기했었습니다&lt;/p&gt;
&lt;figure id=&quot;og_1671956131334&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dltmddbs100/KSIC_Automation: Winner of the 1st National Statistical Office Artificial Intelligence Contest&quot; data-og-description=&quot;Winner of the 1st National Statistical Office Artificial Intelligence Contest - GitHub - dltmddbs100/KSIC_Automation: Winner of the 1st National Statistical Office Artificial Intelligence Contest&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dltmddbs100/KSIC_Automation&quot; data-og-url=&quot;https://github.com/dltmddbs100/KSIC_Automation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AYwFN/hyQ1qTt5Ag/50ar2hIjsQmMXP8dIDydi1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dltmddbs100/KSIC_Automation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dltmddbs100/KSIC_Automation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AYwFN/hyQ1qTt5Ag/50ar2hIjsQmMXP8dIDydi1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dltmddbs100/KSIC_Automation: Winner of the 1st National Statistical Office Artificial Intelligence Contest&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Winner of the 1st National Statistical Office Artificial Intelligence Contest - GitHub - dltmddbs100/KSIC_Automation: Winner of the 1st National Statistical Office Artificial Intelligence Contest&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 공부해볼까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍은 배우면 배울수록 배울게 정말 많아지는 마법이 있습니다. 아이펠이 끝나고도 추가적으로 공부하고자 다른 과정에 지원 했었는데요.&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;프리랜서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통계청 대회 이후, 해당 프로젝트를 활용해서 통계청 내의 데이터를 활용해 모델링을 할 수 있는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기회가 생기게 된 것인데요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부산에서 중견 규모의 크기 회사에 입사가 예정된 상황이었기에 많은 고민을 했습니다. 가족과 다소 떨어진 생활을 해야하는 것도 있었기 때문인데요. 그렇지만 무엇보다 22년을 빛나게 해준 저 프로젝트가 그대로 끝이나게 되는 것은 아쉬웠습니다. 결국 회사의 제안을 받고 프로젝트를 진행했던 모델을 통계청 내에 넣게 되는 뜻깊은 작업에 동참하게 됩니다! (현재 진행형 이기도 하구요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 업로드 된 깃허브 형태에서, 지금은 많은 것이 바뀌었습니다. 좀 더 편리하게 모델링을 하기 위해서 Huggingface의 Transformers 형태를 적극 채용해서 모델 클래스를 따로 만들었고, 학습과 예측 과정에 Huggingface의 에코 시스템을 집어넣어서 이제는 허깅페이스라는 거인의 어깨에 탄 프로젝트가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 여러 부분을 리팩토링하면서 자연스럽게 Pytorch에 익숙해지고, 이제는 오히려 Pytorch를 쓰는 시간이 더 긴 것 같습니다. 리눅스 또한 좀 더 자연스럽게 다루게 되었고, 프로젝트를 발전하는 과정에서 패키지화도 진행해서 이제는 라이브러리처럼 편하게 업무에 사용하고 있습니다. 추후에는 다른 사람도 편하게 사용할 수 있도록 api를 문서화 하려는 작업을 진행해보고자 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델링 하는 작업에 대한 문서 작업도 병행했는데요. 이 때 주로 사용한 라이브러리라 Plotly 입니다. Matplotlib에 비해서 좀더 사용하기 직관적이고, 기본 색감이 좋으며, 기본 html 형식으로 그려주는 것이 좋아서 사용하게 되었습니다. 대체로 plotly를 많이 사용해서, 해당 라이브러리에 대한 이해도가 많이 높아졌고, 일반적인 bar, pie 그래프 외에 좀 더 다이나믹한 연출할 타이밍을 기다리고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mariadb, Oracledb는 원없이 다루면서 쿼리를 해보고 있어서 많이 향상이 되었다는 점은 장점이 되겠네요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;끝나지 않은 프로젝트&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;KT 주최 대회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 결과가 있었던 것은 아니지만 배움에는 끝이 없다고 생각합니다.&amp;nbsp; 일을 하면서 kt에서 주최한 대회에 참여했었는데요. 아쉽게도 대회에 정확도라던지 하는 결과로 나오는게 아니어서 정확히 등수가 나오진 않았으나, 이전 프로젝트 대비 훨씬 정리된 프로젝트 형태로 제출할 수 있었습니다. 이 프로젝트에선 KT에서 제공하는 Genie라는 솔루션을 통해 GPU를 활용해서 학습을 진행하는게 재밌었고, Huggingface의 에코시스템을 적극 활용해 학습과 예측을 했습니다.&amp;nbsp; 협업과정에서 주로 모델링 부분을 담당했고, 데이터 분석가 역할의 팀원 분, 그리고 metric을 담당해주신 팀원분과 함께 재밌게 작업을 했습니다. task는 NER 이었고, 자체 eval 성능에서 높은 성능이 나와서 기분이 좋았고, Wandb를 활용해서 모델들의 성능을 비교하고 제출할 모델을 선정하는 등 완성도 높은 프로젝트를 수행할 수 있었습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1671958996037&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;KT Dev Challenge 2022&quot; data-og-description=&quot;문제 : T5 기반 개체명 인식 파인튜닝&quot; data-og-host=&quot;shell-caper-efa.notion.site&quot; data-og-source-url=&quot;https://shell-caper-efa.notion.site/KT-Dev-Challenge-2022-633397f9e27147fdae240a3d4aee7683&quot; data-og-url=&quot;https://shell-caper-efa.notion.site/633397f9e27147fdae240a3d4aee7683&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dU3m61/hyQ1lq9eQF/TaAIAWpoT4ZO0H0qB8Tso1/img.png?width=2000&amp;amp;height=357&amp;amp;face=0_0_2000_357,https://scrap.kakaocdn.net/dn/AHTYh/hyQ1j7Vecg/imTIkKSKEW8MmFvSEIukd0/img.png?width=2000&amp;amp;height=357&amp;amp;face=0_0_2000_357&quot;&gt;&lt;a href=&quot;https://shell-caper-efa.notion.site/KT-Dev-Challenge-2022-633397f9e27147fdae240a3d4aee7683&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://shell-caper-efa.notion.site/KT-Dev-Challenge-2022-633397f9e27147fdae240a3d4aee7683&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dU3m61/hyQ1lq9eQF/TaAIAWpoT4ZO0H0qB8Tso1/img.png?width=2000&amp;amp;height=357&amp;amp;face=0_0_2000_357,https://scrap.kakaocdn.net/dn/AHTYh/hyQ1j7Vecg/imTIkKSKEW8MmFvSEIukd0/img.png?width=2000&amp;amp;height=357&amp;amp;face=0_0_2000_357');&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;KT Dev Challenge 2022&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제 : T5 기반 개체명 인식 파인튜닝&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;shell-caper-efa.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1671958598061&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - salmon-united/salmon-t5: 2022 kt dev chellenge&quot; data-og-description=&quot;2022 kt dev chellenge. Contribute to salmon-united/salmon-t5 development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/salmon-united/salmon-t5&quot; data-og-url=&quot;https://github.com/salmon-united/salmon-t5&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkECuB/hyQ1kFJWnN/Bg1rJr08BDcPZojbe8ClD1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/salmon-united/salmon-t5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/salmon-united/salmon-t5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkECuB/hyQ1kFJWnN/Bg1rJr08BDcPZojbe8ClD1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - salmon-united/salmon-t5: 2022 kt dev chellenge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2022 kt dev chellenge. Contribute to salmon-united/salmon-t5 development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h4 data-ke-size=&quot;size20&quot;&gt;한국어 인공지능 대회&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음성인식 대회였는데 아쉽게도 이 쪽은 깃허브 코드가 없습니다. Naver에서 제공하는 툴을 사용했는데, 해당 툴을 익히는 과정과 음성인식에 대한 도메인 지식을 쌓는데 많은 어려움이 있었습니다. 특히 기존 base code가 kospeech 라이브러리로 구성되어 있었는데, 이 부분을 wav2vec 모델로 풀어보고 싶었으나, 아쉽게도 Naver 툴에 대한 이해가 늦어 완성하지 못한 프로젝트로 남았습니다. 다만 도메인에 대한 지식 획득 보다,&amp;nbsp; 네이버 툴에 시간을 뺏긴건 아쉬울 따름입니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음성 분야에서는 검색하면 할수록 수환님이 해두신 부분이 많은 것을 느꼈습니다. 그래도 덕분에 Wav2vec 모델과 wav 데이터에 대한 이해도가 많이 상승해서, 다음 기회가 생긴다면 더욱 많은 것을 시도해볼 수 있을 것 같습니다&lt;/p&gt;
&lt;figure id=&quot;og_1671959033589&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;2022 한국어 AI 경진대회&quot; data-og-description=&quot;문제 : 차량 내 대화 및 명령어 음성인식&quot; data-og-host=&quot;shell-caper-efa.notion.site&quot; data-og-source-url=&quot;https://shell-caper-efa.notion.site/2022-AI-6b66cfe84c404a3ea071b7eab51938bc&quot; data-og-url=&quot;https://shell-caper-efa.notion.site/6b66cfe84c404a3ea071b7eab51938bc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/efOVFc/hyQ1ouEl7c/kkfgM2l8dkIpt50pq0o0R1/img.png?width=2000&amp;amp;height=489&amp;amp;face=0_0_2000_489,https://scrap.kakaocdn.net/dn/NNu05/hyQ1rSq61a/ZKuStwhI8vb3Q6LAIvtiq0/img.png?width=2000&amp;amp;height=489&amp;amp;face=0_0_2000_489&quot;&gt;&lt;a href=&quot;https://shell-caper-efa.notion.site/2022-AI-6b66cfe84c404a3ea071b7eab51938bc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://shell-caper-efa.notion.site/2022-AI-6b66cfe84c404a3ea071b7eab51938bc&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/efOVFc/hyQ1ouEl7c/kkfgM2l8dkIpt50pq0o0R1/img.png?width=2000&amp;amp;height=489&amp;amp;face=0_0_2000_489,https://scrap.kakaocdn.net/dn/NNu05/hyQ1rSq61a/ZKuStwhI8vb3Q6LAIvtiq0/img.png?width=2000&amp;amp;height=489&amp;amp;face=0_0_2000_489');&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;2022 한국어 AI 경진대회&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;shell-caper-efa.notion.site&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;h3 data-ke-size=&quot;size23&quot;&gt;오픈소스 프로젝트 참여&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tpu-starter&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;생애 첫 PR을 진행한 프로젝트이고, 제가 도움을 받았던 프로젝트 입니다. TPU 활용에 대한 정보가 부족한 상황에서 한줄기 빛과 같은 프로젝트 였는데요. 당장에 보답하고자 했던 방향은 한국어 버전을 만들고자 깃허브 Owner인 ayaka14732에게 Discussion으로 제안했고, 작업을 함께 진행하게 되었습니다. 이후 한국어 버전으로 번역하는 과정에서 ayaka가 잘못 적은 내용에 대해 수정하는 작업도 진행했고, 추가 업데이트에 대응해서 번역을 진행하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 컨트리뷰터가 되어 함께 활동하고 있습니다. 저자는 주로 jax를 사용하고 있는데, 앞으로 jax로 계속 갈것인지, 아니면 starter라는 이름에 걸맞게 torch나 tensorflow 활용에 대한 것도 다룰 것인지 이야기 해보고 함께 발전해나가고 싶은 프로젝트 중 하나 입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1671960608827&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ayaka14732/tpu-starter: Everything you want to know about Google Cloud TPU&quot; data-og-description=&quot;Everything you want to know about Google Cloud TPU - GitHub - ayaka14732/tpu-starter: Everything you want to know about Google Cloud TPU&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ayaka14732/tpu-starter&quot; data-og-url=&quot;https://github.com/ayaka14732/tpu-starter&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pkSoj/hyQ1d7JPbj/J2NxJN1rmubF0L6IUL5DRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ayaka14732/tpu-starter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ayaka14732/tpu-starter&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pkSoj/hyQ1d7JPbj/J2NxJN1rmubF0L6IUL5DRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - ayaka14732/tpu-starter: Everything you want to know about Google Cloud TPU&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Everything you want to know about Google Cloud TPU - GitHub - ayaka14732/tpu-starter: Everything you want to know about Google Cloud TPU&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h4 data-ke-size=&quot;size20&quot;&gt;huggingface / course&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;tpu-starter와 달리, huggingface에 PR을 진행하는 것은 좀 더 까다롭고 힘든 과정이었습니다. 한국어 버전으로 번역을 하기 위해서 무엇보다 huggingface 에코시스템에 대한 이해를 하고 있어야 했고, 특히 디버깅 부분을 다뤘는데 해당 챕터에 내용이 꽤 많아서, 업무를 진행하면서 하느라 꽤 많은 시간이 소요되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 완료 이후 fork 했던 branch를 PR 하는 과정에서 정말 많은 시행착오가 있었습니다. fork 이후 다른 사람들의 커밋이 쌓이게 되면 자연스럽게 생길 일이기 때문에 이 부분은 집중해서 연습하고 따로 블로그 글로 정리해두기도 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/163&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Git Fork 후 Pull Request 할 때 conflict 해소 방법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 깃과 깃허브를 다루는데 한층 더 이해도를 높힐 수 있었고, 특히 huggingface는 PR을 받는 과정 또한 자동화로 만들어두어서 성공시에 바로 반영이 되게끔 만들어둔 시스템이 인상 깊었습니다. 역시 대형 프로젝트는 뭐가 달라도 달랐습니다.&amp;nbsp; Huggingface course에 컨트리뷰트를 하면서 귀여운 Pull Shark를 얻을 수 있었습니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LsnDY/btrUuifs3A0/i4FzLTKzhkbLMBcpiaDErk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LsnDY/btrUuifs3A0/i4FzLTKzhkbLMBcpiaDErk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LsnDY/btrUuifs3A0/i4FzLTKzhkbLMBcpiaDErk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsnDY%2FbtrUuifs3A0%2Fi4FzLTKzhkbLMBcpiaDErk%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;202&quot; height=&quot;117&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1671960944881&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - huggingface/course: The Hugging Face course on Transformers&quot; data-og-description=&quot;The Hugging Face course on Transformers. Contribute to huggingface/course development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/huggingface/course&quot; data-og-url=&quot;https://github.com/huggingface/course&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qY7Fy/hyQ1mcxeOu/l1M0X6hHQFej33ok4Nxd21/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/huggingface/course&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/huggingface/course&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qY7Fy/hyQ1mcxeOu/l1M0X6hHQFej33ok4Nxd21/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - huggingface/course: The Hugging Face course on Transformers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Hugging Face course on Transformers. Contribute to huggingface/course development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h3 data-ke-size=&quot;size23&quot;&gt;비전공자에서 전공자하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비전공이라는 부분은 여전히 불편한 진실이고, 부족한 부분이기에, 인정하고 이를 보완하기 위해 노력하기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 학점은행제를 통해&amp;nbsp;&lt;b&gt;운영체제&lt;/b&gt;, &lt;b&gt;컴퓨터구조&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;23년 공부 목표&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크&lt;/b&gt;와 &lt;b&gt;서비스&lt;/b&gt;, &lt;b&gt;디자인 패턴&lt;/b&gt; 대한 공부를 주로 하고자 합니다.&amp;nbsp; 모델링에 대한 경험은 다수 있으나, 이런 모델이 어떻게 고객에게 전달할지 &lt;b&gt;엔드 투 엔드&lt;/b&gt;에 대한 경험을 쌓아보고자 하며, 이러한 어플리케이션을 만드는 전체 과정에 일련의 디자인 패턴을 적용해서 만들어 보는 경험을 해보고자 합니다. 현재 프로젝트를 진행하면서도 협업 하는 과정에서 각자의 코드를 이해하는데 어려움이 있었는데, 이러한 부분을 공통된 디자인 패턴을 공유하고 함께 작업해보고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 서비스 방식이 비단, 파이썬에만 머물지 않도록 가능하면 javascript를 활용하는 방안에 대해서도 고민을 하고 있습니다. 또한 발전하는 자연어처리를 허깅페이스와 함께 컨트리뷰트를 진행하면서 함께 성장해 나가고 싶습니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;취미..?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부할게 많아 한동안은 제게 취미라 할만한 것은 유튜브 밖에 없을 것 같습니다. 유튜브도 사실은 대체로 프로그래밍 위주의 구독이 되어 있어서 여전히 공부에 집중하고 있습니다. 제가 보는 것을 몇개 소개해드리자면...&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@nomadcoders&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;노마드코더&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT 트렌드를 잘 잡아주시는 분 같습니다. 특히 예전에는 언어별 특징에 대해서도 잘 설명해줘서 좋았습니다! 요즘에는 트렌드 위주로 설명하기 때문에 이슈에 대한 분석을 짧게 잘해줘서 시청하고 있습니다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@HuggingFace&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;허깅페이스&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 허깅페이스를 통해 정말 편하게 자연어 처리를 하고 있습니다. 허깅페이스가 가는 방향은 저의 주관심사이고, 특히 jax, flax에 관한 정보도 여기에서 가장 빠르게 얻을 수 있어서 잘 보고 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@ArjanCodes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ArjanCodes&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저의 파이썬 시니어를 담당하고 계신 분입니다. 파이썬에 대한 주제를 위주로 다루며, 특히 기초 파이썬을 하신 분들이라면 그 다음으로 봐야할 중급자를 위한 컨텐츠를 많이 만들어주고 계십니다. 디자인패턴, 데이타 클래스, 중급 기능에 대한 소개를 많이 해줍니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@freecodecamp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FreeCodeCamp&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 FastAPI와 Mysql에 딥다이브 할 때 참고했던 영상 중 하나입니다. 대체로 동영상 내용이 길기 때문에 특히 시간이 넉넉할 때, 딥다이브 할 때 가장 좋은 유튜브 강의라고 생각합니다. 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;비전공자, 부트캠프 출신에 머물지 않고 숙련된 프로그래머로써 시니어로 한발짝 더 나아가보고 싶네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 22년 한해 고생하셨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23년에도 많은 경험과 공부로 성장하는 한해 되시기 바랍니다!&lt;/p&gt;</description>
      <category>23년 이전 글/일상이야기</category>
      <category>22년</category>
      <category>개발자</category>
      <category>시작</category>
      <category>회고</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/167</guid>
      <comments>https://okdone.tistory.com/167#entry167comment</comments>
      <pubDate>Sun, 25 Dec 2022 18:05:20 +0900</pubDate>
    </item>
    <item>
      <title>corrupted size vs. prev_size</title>
      <link>https://okdone.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;폐쇄망 환경에서 cuda 및 torch를 설치 후, Transformers의 Trainer class를 활용해 학습을 진행할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발생하는 메세지로, C++ 관련 백엔드 부분에 문제가 생기는 것으로 보이는데, 아직 정확한 해결책은 찾지 못한 상황&lt;/p&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;a href=&quot;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671950310801&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;Malloc, and corrupted size errors&quot; data-og-description=&quot;Hi. I&amp;rsquo;m using pytorch in multi gpu setting, and also with some multiprocessing for loading and preprocessing and quite often encountering these errors, which I can&amp;rsquo;t manage to solve. malloc.c:4023: _int_malloc: Assertion (unsigned long) (size) &amp;gt;= (unsi&quot; data-og-host=&quot;discuss.pytorch.org&quot; data-og-source-url=&quot;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&quot; data-og-url=&quot;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hCPye/hyQ1sXYqhE/wOc3rqQTf0eACziOSHWYk1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cFxRHi/hyQ1kTaFnS/ePOkMjAyFp5SwWGbrMzvuk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://discuss.pytorch.org/t/malloc-and-corrupted-size-errors/37080&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hCPye/hyQ1sXYqhE/wOc3rqQTf0eACziOSHWYk1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cFxRHi/hyQ1kTaFnS/ePOkMjAyFp5SwWGbrMzvuk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;Malloc, and corrupted size errors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hi. I&amp;rsquo;m using pytorch in multi gpu setting, and also with some multiprocessing for loading and preprocessing and quite often encountering these errors, which I can&amp;rsquo;t manage to solve. malloc.c:4023: _int_malloc: Assertion (unsigned long) (size) &amp;gt;= (unsi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;discuss.pytorch.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/2507&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pytorch/pytorch/issues/2507&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671950321263&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Segfault (free() on invalid pointer) &amp;middot; Issue #2507 &amp;middot; pytorch/pytorch&quot; data-og-description=&quot;On Ubuntu 16.04, Python 3.6.2 and PyTorch 0.2.0, it's possible to force a free() on invalid pointer segfault by first doing import zmq then import torch. (Originally, I had this problem when tr...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pytorch/pytorch/issues/2507&quot; data-og-url=&quot;https://github.com/pytorch/pytorch/issues/2507&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8H8zy/hyQ1fj0VSI/QkBUa0w5E8IPAsCKeecHe0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/2507&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pytorch/pytorch/issues/2507&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8H8zy/hyQ1fj0VSI/QkBUa0w5E8IPAsCKeecHe0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Segfault (free() on invalid pointer) &amp;middot; Issue #2507 &amp;middot; pytorch/pytorch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;On Ubuntu 16.04, Python 3.6.2 and PyTorch 0.2.0, it's possible to force a free() on invalid pointer segfault by first doing import zmq then import torch. (Originally, I had this problem when tr...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/10567&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pytorch/pytorch/issues/10567&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671950327528&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;problem: corrupted size vs. prev_size when using python3.6 &amp;middot; Issue #10567 &amp;middot; pytorch/pytorch&quot; data-og-description=&quot;Hi, I install tensorflow-1.9; then install pytorch=0.4 at python2 and python3 respectively. I use python2 to run my code, no error is reported; but when using python3 to run it, an error is report ...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pytorch/pytorch/issues/10567&quot; data-og-url=&quot;https://github.com/pytorch/pytorch/issues/10567&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKhkq0/hyQ1qlyTlG/FlE6Bvz3fkW1CTJ0LR20JK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/10567&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pytorch/pytorch/issues/10567&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKhkq0/hyQ1qlyTlG/FlE6Bvz3fkW1CTJ0LR20JK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;problem: corrupted size vs. prev_size when using python3.6 &amp;middot; Issue #10567 &amp;middot; pytorch/pytorch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hi, I install tensorflow-1.9; then install pytorch=0.4 at python2 and python3 respectively. I use python2 to run my code, no error is reported; but when using python3 to run it, an error is report ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/26467&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pytorch/pytorch/issues/26467&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671950341762&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Pytorch 1.2 on Red Hat Enterprise Linux 6.4 gives 'GLIBC_2.14' not found &amp;middot; Issue #26467 &amp;middot; pytorch/pytorch&quot; data-og-description=&quot;  Bug Description: On a server running Red Hat Enterprise Linux (RHEL) Workstaion release 6.4 (Santiago), I used conda 4.5.12 to install pytorch using the following command: conda install pytorch t...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pytorch/pytorch/issues/26467&quot; data-og-url=&quot;https://github.com/pytorch/pytorch/issues/26467&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ebYIPA/hyQ1swTHEN/pq3FXnFJ3R8G33OgUuwNtk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/26467&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pytorch/pytorch/issues/26467&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ebYIPA/hyQ1swTHEN/pq3FXnFJ3R8G33OgUuwNtk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Pytorch 1.2 on Red Hat Enterprise Linux 6.4 gives 'GLIBC_2.14' not found &amp;middot; Issue #26467 &amp;middot; pytorch/pytorch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Bug Description: On a server running Red Hat Enterprise Linux (RHEL) Workstaion release 6.4 (Santiago), I used conda 4.5.12 to install pytorch using the following command: conda install pytorch t...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>23년 이전 글/Error Today</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/166</guid>
      <comments>https://okdone.tistory.com/166#entry166comment</comments>
      <pubDate>Sun, 25 Dec 2022 15:39:08 +0900</pubDate>
    </item>
    <item>
      <title>Huggingface Trainer로 TPU Multicore 활용 학습 예제코드</title>
      <link>https://okdone.tistory.com/165</link>
      <description>&lt;pre id=&quot;code_1671622116651&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorWithPadding
from transformers import TrainingArguments, AutoModelForSequenceClassification
from transformers import Trainer

def main(index):
    # 예제로 활용할 데이터셋
    raw_datasets = load_dataset('glue','mrpc')
    # 예제 활용 모델
    model_name = 'klue/roberta-large'
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    
    #raw_dataset은 huggingface dataset의 구조체로 해당 함수를 이용해 각 데이터셋 원소를
    #tokenize함
    def tokenize_fn(batch):
        return tokenizer(batch['sentence1'], batch['sentence2'], max_length=64, padding='max_length', truncation=True)

    tokenized_ds = raw_datasets.map(tokenize_fn, batched=True)

    # tpu 학습시 tpu_num_cores로 해당 tpu core 갯수를 설정해야함
    # per device batch size가 16이므로, global batch size는 128
    args = TrainingArguments('test-train',
                                per_device_train_batch_size=16
                                tpu_num_cores=8)
    #샘플 모델
    model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=50)
    
    trainer = Trainer(
        model,
        args,
        train_dataset=tokenized_ds['train'],
        eval_dataset=tokenized_ds['validation'],
        tokenizer=tokenizer,
    )

    trainer.train()

if __name__ == '__main__':
    #xrt_tpu_config가 설정되어야 tpu 정상작동 보장
    import os
    os.environ['XRT_TPU_CONFIG']=&quot;localservice;0;localhost:51011&quot;
    # xmp를 통해 위 main 함수를 multiprocessing으로 실행함
    # 각 프로세스별로 데이터셋, 토크나이저, 모델을 따로 만든 뒤
    # 최종 Trainer 단계에서 통합으로 동작함.
    import torch_xla.distributed.xla_multiprocessing as xmp
    xmp.spawn(main, args=(), nprocs=8,)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>23년 이전 글/TPU</category>
      <category>code</category>
      <category>huggingface</category>
      <category>sample</category>
      <category>Source</category>
      <category>torch</category>
      <category>TPU</category>
      <category>train</category>
      <category>Trainer</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/165</guid>
      <comments>https://okdone.tistory.com/165#entry165comment</comments>
      <pubDate>Wed, 21 Dec 2022 20:29:05 +0900</pubDate>
    </item>
    <item>
      <title>시각화 라이브러리 plotly를 편하게 사용하는 방법</title>
      <link>https://okdone.tistory.com/164</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Plotly&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 주로 사용하는 시각화 라이브러리인 Matplotlib과 뚜렷하게 구분되는 라이브러리로, 특히 기본적으로 반응형의 차트를 그려주며, 기본적으로 그려주는게 많은게 장점인 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api도 깔끔하고, 특히 문서가 좋아서 이용하게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DSnis/btrT1Hs4mBU/KMywAawM6fmIgmYmIaYoj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DSnis/btrT1Hs4mBU/KMywAawM6fmIgmYmIaYoj0/img.png&quot; data-alt=&quot;홈페이지에 있는 예제 그림들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DSnis/btrT1Hs4mBU/KMywAawM6fmIgmYmIaYoj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDSnis%2FbtrT1Hs4mBU%2FKMywAawM6fmIgmYmIaYoj0%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;929&quot; height=&quot;562&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;562&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8ibQq/btrT5bfsyCW/Kp6H3DpaDqaY8GivCmjXKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8ibQq/btrT5bfsyCW/Kp6H3DpaDqaY8GivCmjXKK/img.png&quot; data-alt=&quot;pie 그래프를 그리는 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8ibQq/btrT5bfsyCW/Kp6H3DpaDqaY8GivCmjXKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8ibQq%2FbtrT5bfsyCW%2FKp6H3DpaDqaY8GivCmjXKK%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;915&quot; height=&quot;678&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pie 그래프를 그리는 예제&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;그러나 단점이 있었으니.. 바로 fig.update_traces라는 형태의 api이다&lt;/p&gt;
&lt;pre id=&quot;code_1671442593865&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import plotly.express as px
df = px.data.gapminder().query(&quot;year == 2007&quot;).query(&quot;continent == 'Americas'&quot;)
fig = px.pie(df, values='pop', names='country',
             title='Population of American continent',
             hover_data=['lifeExp'], labels={'lifeExp':'life expectancy'})
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fig에는 다양하게 커스텀할 수 있는 객체들이 많아서 이를 fig.update_traces라는 형태로 한번에 설정을 해줄 수 있다.&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-origin-width=&quot;609&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VoOwJ/btrTZzWm76N/LKjzNcSnyRE5FVRuEsOdZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VoOwJ/btrTZzWm76N/LKjzNcSnyRE5FVRuEsOdZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VoOwJ/btrTZzWm76N/LKjzNcSnyRE5FVRuEsOdZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVoOwJ%2FbtrTZzWm76N%2FLKjzNcSnyRE5FVRuEsOdZK%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;609&quot; height=&quot;389&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VSCODE내에서 뜨는 update_traces 함수에 뜨는 설명인데, 다음처럼 어떤 정보를 입력할 수 있는지에 대한 명확한 정보가 드러나지 않는다. 물론 &lt;a href=&quot;https://plotly.com/python/reference/pie/#pie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이 그래프의 trace 예시&lt;/a&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;따라서 여기에서 설명할 내용은, Plotly에서 공식적으로 권장하는 API는 아니며, 필자가 이해를 바탕으로 편하게 쓰기 위해 방법을 찾아보았다.&lt;/p&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;pie그래프를 예로 들면, 해당 원 부분은 Data 객체에 해당되는 부분이고, 그 밖에 부분은 전부 레이아웃 부분이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZsVZe/btrT4IkuBnS/3WfzaB4XFqo6z12EYtYQ7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZsVZe/btrT4IkuBnS/3WfzaB4XFqo6z12EYtYQ7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZsVZe/btrT4IkuBnS/3WfzaB4XFqo6z12EYtYQ7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZsVZe%2FbtrT4IkuBnS%2F3WfzaB4XFqo6z12EYtYQ7k%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;803&quot; height=&quot;387&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제 코드에서 traces를 업데이트 하므로(데이타 영역) 여기에서 똑같은 방법으로 값을 바꿔보겠다&lt;/p&gt;
&lt;pre id=&quot;code_1671443349187&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import plotly.express as px
df = px.data.gapminder().query(&quot;year == 2007&quot;).query(&quot;continent == 'Americas'&quot;)
fig = px.pie(df, values='pop', names='country',
             title='Population of American continent',
             hover_data=['lifeExp'], labels={'lifeExp':'life expectancy'})
# fig까지만 완료한 상태에서 fig.data의 객체 확인
fig.data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvasOj/btrT4QCDRNJ/kuXlgeklD89cSFSLiZsrcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvasOj/btrT4QCDRNJ/kuXlgeklD89cSFSLiZsrcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvasOj/btrT4QCDRNJ/kuXlgeklD89cSFSLiZsrcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvasOj%2FbtrT4QCDRNJ%2FkuXlgeklD89cSFSLiZsrcK%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;576&quot; height=&quot;575&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 객체는 여러개가 될 수도 있기 때문에, 기본적으로 Tuple로 반환하는 모습을 보여준다. 여기에선 간단하게 인덱싱을 통해서 파이 그래프 객체로 접근한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtcdXJ/btrT0SBsHPZ/rGKP3UJ8QyFNuTcOs9pG41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtcdXJ/btrT0SBsHPZ/rGKP3UJ8QyFNuTcOs9pG41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtcdXJ/btrT0SBsHPZ/rGKP3UJ8QyFNuTcOs9pG41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtcdXJ%2FbtrT0SBsHPZ%2FrGKP3UJ8QyFNuTcOs9pG41%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;572&quot; height=&quot;573&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부터 내가 수정가능한 값이 무엇인지, 자유롭게 수정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1671443486995&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pie = fig.data[0]
# pie에 점을 찍어보자&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6QId7/btrT4qEiA5a/pHkT28t31nRhwCe5rzP0X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6QId7/btrT4qEiA5a/pHkT28t31nRhwCe5rzP0X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6QId7/btrT4qEiA5a/pHkT28t31nRhwCe5rzP0X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6QId7%2FbtrT4qEiA5a%2FpHkT28t31nRhwCe5rzP0X0%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;477&quot; height=&quot;261&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방법을 사용하면 다음 처럼 vscode내에서 도움을 받을 수도 있으며, dir() 함수를 사용하면 모든 속성값을 빠르게 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 무슨 값이 있는지 보고나면 값을 할당해주는 것은 파이썬의 기본 규칙을 활용하면 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 이후 fig.show()를 해보면 넣은 값이 반영이 된 것을 알 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1671443759490&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pie.textposition = 'inside'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSnnx/btrT4IxYRRp/ty0eKBKadARiMyk9u3nOVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSnnx/btrT4IxYRRp/ty0eKBKadARiMyk9u3nOVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSnnx/btrT4IxYRRp/ty0eKBKadARiMyk9u3nOVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSnnx%2FbtrT4IxYRRp%2Fty0eKBKadARiMyk9u3nOVk%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;846&quot; height=&quot;270&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;270&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;layout에 경우, 몇개의 depth를 가진 상태에서 값을 입력해줘야 하는 경우도 있는데, 이때도 마찬가지로 내가 설정하고자 하는 값에 .을 찍어보면서 더 depth가 있는지 확인하면 쉽게 값을 수정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 title, text를 만질일이 많은데, 해당 값들에 font, font안에 color 또는 family등 설정을 다양하게 건드려줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZBQLw/btrTYCMqskU/4UAVbVk7IdSgOE7kJhPC9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZBQLw/btrTYCMqskU/4UAVbVk7IdSgOE7kJhPC9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZBQLw/btrTYCMqskU/4UAVbVk7IdSgOE7kJhPC9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZBQLw%2FbtrTYCMqskU%2F4UAVbVk7IdSgOE7kJhPC9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;814&quot; height=&quot;614&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;614&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;이렇게 값을 직접 지정해주게 되면 값 적용 이후의 변화도 직관적으로 바로 확인할 수 있기 때문에 타자는 조금 더 많이 치게되고, 코드 스타일이 반쯤 Matplotlib처럼 되어버리지만 스마트하게 Plotly를 사용할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/python</category>
      <category>API</category>
      <category>plotly</category>
      <category>사용법</category>
      <category>스타일</category>
      <category>직관적</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/164</guid>
      <comments>https://okdone.tistory.com/164#entry164comment</comments>
      <pubDate>Mon, 19 Dec 2022 19:05:56 +0900</pubDate>
    </item>
    <item>
      <title>Git Fork 후 Pull Request 할 때 conflict 해소 방법</title>
      <link>https://okdone.tistory.com/163</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;여기에서 Git은 전적으로 VSCODE에 의존하여 사용합니다.&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;1. 해당 Repo에서 Fork 하게 되면, 코드는 Fork 한 상태에서 멈추며, 내가 업데이트 하는 것만 반영이 됨.&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;3. 시간이 지날수록 내가 Fork한 코드는 원본 코드와 괴리가 발생하게됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 내가 PR을 날릴 때 코드는 바뀌어져 있으므로, 필연적으로 conflict가 발생하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 상황을 만들기 위한 Repo를 2개 준비. 1개는 메인 코드, 1개는 fork 하여 PR 하는 레포가 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YAijS/btrTSLIeJsV/IFxUNnskaJ9yK2LB2WrQa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YAijS/btrTSLIeJsV/IFxUNnskaJ9yK2LB2WrQa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YAijS/btrTSLIeJsV/IFxUNnskaJ9yK2LB2WrQa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYAijS%2FbtrTSLIeJsV%2FIFxUNnskaJ9yK2LB2WrQa0%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;1247&quot; height=&quot;542&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main repo로, readme를 통해 업데이트 반영 여부를 확인할 예정&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;1241&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bxqhk/btrTRBTNndm/ftTcMx7aEIIMVkE8QePbMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bxqhk/btrTRBTNndm/ftTcMx7aEIIMVkE8QePbMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bxqhk/btrTRBTNndm/ftTcMx7aEIIMVkE8QePbMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBxqhk%2FbtrTRBTNndm%2FftTcMx7aEIIMVkE8QePbMk%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;1241&quot; height=&quot;510&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상황에서 Fork를 통해 가져온 레포로, 같은 계정에서 할 수 없어 임의의 단체 계정을 활용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;readme에 적힌 내용은 main repo라는 글만 써져 있으며, 1개의 파일만 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발하는 상황을 가정하여, Fork를 뜬 이후에 4번의 커밋이 있었다고 가정할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commit 1 ~ 4 까지 부여하고, Fork 된 Repo에서는 5번 커밋을 할 예정.&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;1249&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8E3ra/btrTSwYJCb4/iDB1k3Fq4potZFBBVZD8Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8E3ra/btrTSwYJCb4/iDB1k3Fq4potZFBBVZD8Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8E3ra/btrTSwYJCb4/iDB1k3Fq4potZFBBVZD8Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8E3ra%2FbtrTSwYJCb4%2FiDB1k3Fq4potZFBBVZD8Z0%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;1249&quot; height=&quot;669&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commit 1 -&amp;gt; 저장 -&amp;gt; 푸시 -&amp;gt; commit 2-&amp;gt; 저장 -&amp;gt; 푸시... commit 4 까지 총 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;Fork된 Repo에서 commit 5를 Fork Repo에 커밋한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvZgpH/btrTWMfjMoN/RubB6MOil1WsxX0bBtZ2Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvZgpH/btrTWMfjMoN/RubB6MOil1WsxX0bBtZ2Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvZgpH/btrTWMfjMoN/RubB6MOil1WsxX0bBtZ2Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvZgpH%2FbtrTWMfjMoN%2FRubB6MOil1WsxX0bBtZ2Ak%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;1236&quot; height=&quot;546&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 설명에서도 나오지만 커밋의 차이가 발생함이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 원본 Repo에 PR을 하려고 하면 어떤 일이 일어날까?&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;blob&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3kxXe/btrTVg8N6Lp/7wpmCbm6t7hXJNQELWGEVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3kxXe/btrTVg8N6Lp/7wpmCbm6t7hXJNQELWGEVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3kxXe/btrTVg8N6Lp/7wpmCbm6t7hXJNQELWGEVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3kxXe%2FbtrTVg8N6Lp%2F7wpmCbm6t7hXJNQELWGEVk%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;421&quot; height=&quot;147&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/69LBJ/btrTQ00ICwX/uSYFrDfZyQgGuT4hyoq1Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/69LBJ/btrTQ00ICwX/uSYFrDfZyQgGuT4hyoq1Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/69LBJ/btrTQ00ICwX/uSYFrDfZyQgGuT4hyoq1Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F69LBJ%2FbtrTQ00ICwX%2FuSYFrDfZyQgGuT4hyoq1Wk%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;1227&quot; height=&quot;269&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;269&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orWIG/btrTVhUavEN/uFID8Nr4dZFK5HQ36l35WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orWIG/btrTVhUavEN/uFID8Nr4dZFK5HQ36l35WK/img.png&quot; data-alt=&quot;우측에서 좌측으로, Fork된 Repo에서 원본 Repo로 가는 것 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orWIG/btrTVhUavEN/uFID8Nr4dZFK5HQ36l35WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForWIG%2FbtrTVhUavEN%2FuFID8Nr4dZFK5HQ36l35WK%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;1237&quot; height=&quot;266&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우측에서 좌측으로, Fork된 Repo에서 원본 Repo로 가는 것 확인&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn9odz/btrTRpeQmvY/RBvrJG1czjw51vTj77PNV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn9odz/btrTRpeQmvY/RBvrJG1czjw51vTj77PNV1/img.png&quot; data-alt=&quot;맨 아래에 conflict가 발생함을 알 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn9odz/btrTRpeQmvY/RBvrJG1czjw51vTj77PNV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn9odz%2FbtrTRpeQmvY%2FRBvrJG1czjw51vTj77PNV1%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;925&quot; height=&quot;587&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;맨 아래에 conflict가 발생함을 알 수 있다.&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;conflict 에러를 좀 더 자세히 살펴보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwgM0M/btrTSxQRlIs/6ASKKExaFnllVs6lEZkYok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwgM0M/btrTSxQRlIs/6ASKKExaFnllVs6lEZkYok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwgM0M/btrTSxQRlIs/6ASKKExaFnllVs6lEZkYok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwgM0M%2FbtrTSxQRlIs%2F6ASKKExaFnllVs6lEZkYok%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;857&quot; height=&quot;257&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;257&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;Fork 이후 원본 Repo에 커밋되었던 내용이 반영되지 않은 채, Fork Repo에 반영한 내용을 커밋하려고 하자 충돌이 나게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bufqWp/btrTRpFWqh9/BJPQdbzyAzW7x3izJz45eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bufqWp/btrTRpFWqh9/BJPQdbzyAzW7x3izJz45eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bufqWp/btrTRpFWqh9/BJPQdbzyAzW7x3izJz45eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbufqWp%2FbtrTRpFWqh9%2FBJPQdbzyAzW7x3izJz45eK%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;910&quot; height=&quot;464&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 해결 방법으로 하고자 하는 것은,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 내가 Fork 후 수정한 코드가 날라가지 않도록 현재 시점에서 추가 Branch를 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Fork Repo에서 기존 Repo의 수정 사항을 반영한 뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Branch를 다시 Fork Repo에 머지 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 최종 Fork Repo에서 Pull Request를 기존 Repo에다가 하려고 한다.&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;666&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNkuZz/btrTRn886Ah/OcxFeOhaqYnnPsNYQIxJyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNkuZz/btrTRn886Ah/OcxFeOhaqYnnPsNYQIxJyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNkuZz/btrTRn886Ah/OcxFeOhaqYnnPsNYQIxJyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNkuZz%2FbtrTRn886Ah%2FOcxFeOhaqYnnPsNYQIxJyk%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;666&quot; height=&quot;322&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 버튼을 누른 후, 이름을 지어주면 branch를 만들 수 있다. 현재 작업 특성상 같은 곳에 원본 Repo와 Fork Repo가 함께하고 있어 2개가 뜨는데, 반드시 Fork된 Repo에서 branch를 반영한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIppvp/btrTVileJRN/k3llMdCnERkg4czD0Rwnfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIppvp/btrTVileJRN/k3llMdCnERkg4czD0Rwnfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIppvp/btrTVileJRN/k3llMdCnERkg4czD0Rwnfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIppvp%2FbtrTVileJRN%2Fk3llMdCnERkg4czD0Rwnfk%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;678&quot; height=&quot;186&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;186&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZjmzq/btrTVieuVU6/G2cOE36i1dfh8V3mmueie0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZjmzq/btrTVieuVU6/G2cOE36i1dfh8V3mmueie0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZjmzq/btrTVieuVU6/G2cOE36i1dfh8V3mmueie0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZjmzq%2FbtrTVieuVU6%2FG2cOE36i1dfh8V3mmueie0%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;652&quot; height=&quot;299&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add remote 기능을 이용해서 원본 Repo를 추가 후,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XPWrv/btrTQhWdKvO/67WL6omCvOX8tLKf2b2kV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XPWrv/btrTQhWdKvO/67WL6omCvOX8tLKf2b2kV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XPWrv/btrTQhWdKvO/67WL6omCvOX8tLKf2b2kV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXPWrv%2FbtrTQhWdKvO%2F67WL6omCvOX8tLKf2b2kV1%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;436&quot; height=&quot;75&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격 이름은 통상 upstream이라고 하며, 여기에선 example_upstream이라는 이름으로 진행함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zogKx/btrTSxwzJH9/5eGgrGZXPcpD5kbGoYXLpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zogKx/btrTSxwzJH9/5eGgrGZXPcpD5kbGoYXLpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zogKx/btrTSxwzJH9/5eGgrGZXPcpD5kbGoYXLpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzogKx%2FbtrTSxwzJH9%2F5eGgrGZXPcpD5kbGoYXLpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;592&quot; height=&quot;146&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Pull from을 누르게 되면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFvYTf/btrTRFIxA2p/kRoPGj9OFdZf7fs2rtnee0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFvYTf/btrTRFIxA2p/kRoPGj9OFdZf7fs2rtnee0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFvYTf/btrTRFIxA2p/kRoPGj9OFdZf7fs2rtnee0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFvYTf%2FbtrTRFIxA2p%2FkRoPGj9OFdZf7fs2rtnee0%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;710&quot; height=&quot;337&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 Repo를 연결했던 example_upstream을 선택 가능함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6deTu/btrTWNrNbaU/bhK8w95rMj0DFykccGJS91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6deTu/btrTWNrNbaU/bhK8w95rMj0DFykccGJS91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6deTu/btrTWNrNbaU/bhK8w95rMj0DFykccGJS91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6deTu%2FbtrTWNrNbaU%2FbhK8w95rMj0DFykccGJS91%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;587&quot; height=&quot;97&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져올 분기가 여러가지 일 경우 주의해야하며, 여기에선 원본 Repo에 별도의 branch가 존재하지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqc11w/btrTSx4rYem/aTFbAn4qB9oHlQsibUpMMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqc11w/btrTSx4rYem/aTFbAn4qB9oHlQsibUpMMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqc11w/btrTSx4rYem/aTFbAn4qB9oHlQsibUpMMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqc11w%2FbtrTSx4rYem%2FaTFbAn4qB9oHlQsibUpMMK%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;560&quot; height=&quot;52&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 버튼을 누르면 다음과 같이 conflict 난 부분이 표시가 되며 나오게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 아래에 있는 Resolve in merge editor를 사용하면 간단하게 해결할&amp;nbsp; 수 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPKGJ/btrTRfcoC5f/Ij2xQcesc7SamkM7k7rzp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPKGJ/btrTRfcoC5f/Ij2xQcesc7SamkM7k7rzp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPKGJ/btrTRfcoC5f/Ij2xQcesc7SamkM7k7rzp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPKGJ%2FbtrTRfcoC5f%2FIj2xQcesc7SamkM7k7rzp0%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;1109&quot; height=&quot;604&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 커밋 내용과, 우측 Fork Repo 내용이 나란히 있게 되는데, 내가 원하는 형태는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commit이 번호대로, 아래로 나란히 나열되는 것을 원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 먼저 포함되고자 하는 내용의 수락 버튼을 먼저 누른다.&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-origin-width=&quot;718&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuqdKw/btrTVilf3hC/ctqEJUiM5u56Pk0FkYveXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuqdKw/btrTVilf3hC/ctqEJUiM5u56Pk0FkYveXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuqdKw/btrTVilf3hC/ctqEJUiM5u56Pk0FkYveXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuqdKw%2FbtrTVilf3hC%2FctqEJUiM5u56Pk0FkYveXk%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;718&quot; height=&quot;584&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 내용이 절렬되어서 들어가게 되고, 더 이상 충돌이 일어나지 않게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충돌하지 않음이 확인되면, 충돌 갯수 또한 0이 되며, 이 때 complete merge 버튼을 누르면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNYNb/btrTVUxP1QJ/YfxjVOg3TkTkUV8EXw9YIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNYNb/btrTVUxP1QJ/YfxjVOg3TkTkUV8EXw9YIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNYNb/btrTVUxP1QJ/YfxjVOg3TkTkUV8EXw9YIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNYNb%2FbtrTVUxP1QJ%2FYfxjVOg3TkTkUV8EXw9YIk%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;739&quot; height=&quot;602&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바뀐 내용에서 커밋 버튼이 활성화 되며, 해당 버튼을 누르면 충돌 커밋이 해결 된 상태가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpz9y3/btrTQZ8BxgJ/c2ORhvKY3NBF8UpyHKpYk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpz9y3/btrTQZ8BxgJ/c2ORhvKY3NBF8UpyHKpYk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpz9y3/btrTQZ8BxgJ/c2ORhvKY3NBF8UpyHKpYk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpz9y3%2FbtrTQZ8BxgJ%2Fc2ORhvKY3NBF8UpyHKpYk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;414&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 동기화 버튼을 누르게 되면 모든 내용이 포함된 Fork Repo가 완성이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6hBys/btrTQ0flTrK/tx4faT45Dk7j1oB1mnigjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6hBys/btrTQ0flTrK/tx4faT45Dk7j1oB1mnigjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6hBys/btrTQ0flTrK/tx4faT45Dk7j1oB1mnigjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6hBys%2FbtrTQ0flTrK%2Ftx4faT45Dk7j1oB1mnigjK%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;368&quot; height=&quot;221&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;221&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;이번에는 VSCODE를 통해 PR를 해본다,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBZYRO/btrTR8wWbKM/hCnyIlNT1krcOLt3Ggjes0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBZYRO/btrTR8wWbKM/hCnyIlNT1krcOLt3Ggjes0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBZYRO/btrTR8wWbKM/hCnyIlNT1krcOLt3Ggjes0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBZYRO%2FbtrTR8wWbKM%2FhCnyIlNT1krcOLt3Ggjes0%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;408&quot; height=&quot;492&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;492&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;Fork레포에서 원본 레포로 풀 리퀘스트 Create&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yb2jR/btrTR0luMUf/2wVFGAK2pjV4Hrzu4Qwne0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yb2jR/btrTR0luMUf/2wVFGAK2pjV4Hrzu4Qwne0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yb2jR/btrTR0luMUf/2wVFGAK2pjV4Hrzu4Qwne0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyb2jR%2FbtrTR0luMUf%2F2wVFGAK2pjV4Hrzu4Qwne0%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;357&quot; height=&quot;640&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;640&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; no conflict가 떳음을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVJ2q/btrTR06Uobe/PAWNN0PcjByGhSxDRBqh80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVJ2q/btrTR06Uobe/PAWNN0PcjByGhSxDRBqh80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVJ2q/btrTR06Uobe/PAWNN0PcjByGhSxDRBqh80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVJ2q%2FbtrTR06Uobe%2FPAWNN0PcjByGhSxDRBqh80%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;1296&quot; height=&quot;516&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;516&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLkbOm/btrTR8X2eFx/uo9ifa2sTiYrViMIdZ8dSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLkbOm/btrTR8X2eFx/uo9ifa2sTiYrViMIdZ8dSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLkbOm/btrTR8X2eFx/uo9ifa2sTiYrViMIdZ8dSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLkbOm%2FbtrTR8X2eFx%2Fuo9ifa2sTiYrViMIdZ8dSk%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;1230&quot; height=&quot;610&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;610&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;Pull Request를 완료한 모습의 인증으로 이번 github conflict 해결을 마친다.&lt;/p&gt;</description>
      <category>23년 이전 글/IT 교양</category>
      <category>Conflict</category>
      <category>fork</category>
      <category>GIT</category>
      <category>github</category>
      <category>merge</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/163</guid>
      <comments>https://okdone.tistory.com/163#entry163comment</comments>
      <pubDate>Sat, 17 Dec 2022 22:09:45 +0900</pubDate>
    </item>
    <item>
      <title>VSCODE 단축키 모음 PDF</title>
      <link>https://okdone.tistory.com/162</link>
      <description>&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;1157&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSKrF/btrSnXdwpTB/AHnVqL8JODtMhYroDGhlIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSKrF/btrSnXdwpTB/AHnVqL8JODtMhYroDGhlIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSKrF/btrSnXdwpTB/AHnVqL8JODtMhYroDGhlIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSKrF%2FbtrSnXdwpTB%2FAHnVqL8JODtMhYroDGhlIk%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;1157&quot; height=&quot;864&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/VSCODE</category>
      <category>IDE</category>
      <category>vscode</category>
      <category>단축키</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/162</guid>
      <comments>https://okdone.tistory.com/162#entry162comment</comments>
      <pubDate>Tue, 29 Nov 2022 20:31:45 +0900</pubDate>
    </item>
    <item>
      <title>TPU 자원 할당을 위한 간단한 스크립트</title>
      <link>https://okdone.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 자원이 모두 사용중이면 보게 되는 에러 입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrOTv/btrSr4WbSOV/BGAQwRZkO8ngFBgGha0afk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrOTv/btrSr4WbSOV/BGAQwRZkO8ngFBgGha0afk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrOTv/btrSr4WbSOV/BGAQwRZkO8ngFBgGha0afk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnrOTv%2FbtrSr4WbSOV%2FBGAQwRZkO8ngFBgGha0afk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;62&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 TPU 자원 활용도가 많아지면서 자원을 빌리기도 어려워지고 있네요&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;h3 data-ke-size=&quot;size23&quot;&gt;1. 매번 실행할 sh 파일 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 파일은 하나의 sh 파일에 저장하고 쓰면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export PROJECT_ID=[프로젝트 ID 명으로 변경] - PROJECT ID를 변수에 할당&lt;br /&gt;gcloud config set project ${PROJECT_ID} - PROJECT ID를 활용해서 config 설정&lt;br /&gt;gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID - tpu 서비스 계정 값을 받을 수 있음&lt;br /&gt;gcloud compute tpus tpu-vm create [VM 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--zone=[존 이름: ex)europe-west4-a]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--accelerator-type=[VM의 타입 ex) v2-8, v3-8, v4-8]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--version=[tpu vm 내에 딥러닝 프레임워크 버전설정&amp;nbsp; ex)tpu-vm-pt-1.13, tpu-vm-tf-2.10.0] 해당 종류는 GCP에서 TPU VM 생성메뉴에 가면 메뉴바로 찾아볼 수 있습니다. 또는 GCP TPU 학습에서 예시로 나온 버전을 활용하셔도 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 파일을 /home/[계정명]/request_tpu.sh에 저장했다고 간주하겠습니다&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;2. crontab 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1669709732574&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행하면 crontab을 설정하는 화면이 나오게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;crontab의 자세한 설명은 여기에서 중요한게 아니므로, 다른 블로그를 참고 바랍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 crontab 명령어는 매분, request_tpu.sh라는 스크립트를 실행하고, gcloud_log.log에 매번&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 저장하는 명령어입니다. 아까 crontab -e 했던 곳에 아래 내용을 적습니다&lt;/p&gt;
&lt;pre id=&quot;code_1669709829870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* * * * * sh /home/[자신의계정명]/request_tpu.sh &amp;gt; /home/[자신의계정명]/gcloud_log.log 2&amp;gt;&amp;amp;1&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;pre id=&quot;code_1669709919876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service cron start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 통해서 crontab을 실행시켜줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 로그 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 발생하는 로그는 파일에 기록되어서 보이지 않으므로 해당 내용을 꾸준하게 보기 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음의 명령어를 bash shell에 입력합니다&lt;/p&gt;
&lt;pre id=&quot;code_1669709974436&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while true; do   cat gcloud_log.log;   sleep 30s; done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속해서 30초마다 gcloud_log.log를 표시하는 간단한 shell script 반복문 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 자원 요청 할 때 현명하게 요청합시다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/TPU</category>
      <category>TPU</category>
      <category>스마트</category>
      <category>스크립트</category>
      <category>요청</category>
      <category>할당</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/161</guid>
      <comments>https://okdone.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 29 Nov 2022 17:21:31 +0900</pubDate>
    </item>
    <item>
      <title>TPU 에러 모음</title>
      <link>https://okdone.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PermissionDeniedError: open(/dev/accel0): Operation not permitted: Operation not permitted; Couldn't open device: /dev/accel0; Unable to create Node RegisterInterface for node 0, config: device_path&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주피터 노트북으로 작업하던 중 발생한 에러로, TPU 접근이 불가한 현상임.발생한 경위는 알 수 없으나, VM을 재부팅 하면 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shutdown -r now&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/Error Today</category>
      <category>error</category>
      <category>solution</category>
      <category>TPU</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/160</guid>
      <comments>https://okdone.tistory.com/160#entry160comment</comments>
      <pubDate>Sat, 26 Nov 2022 22:09:07 +0900</pubDate>
    </item>
    <item>
      <title>TPU-starter 프로젝트 소개</title>
      <link>https://okdone.tistory.com/159</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TPU starter 프로젝트?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU는 일반적으로 직접 물건을 접할 수 없기 때문에 접근하기 어렵고, 그 존재조차 모르는 사람이 많습니다. 효용에 비해서 상대적으로 덜 알려져 있고, 정보도 많이 부족합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 부분을 해결하고자, tpu-starter-pack 프로젝트를 진행하는 사람이 있었고, 한국어로 번역하는 부분을 원작자의 허락을 맡아 진행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브를 참고하시고 어렵거나 필요한 내용이 있으면 알려주시면 반영하도록 할게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/tpu-starter-korean&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/dlfrnaos19/tpu-starter-korean&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665373070299&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/tpu-starter-korean&quot; data-og-description=&quot;Contribute to dlfrnaos19/tpu-starter-korean development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/tpu-starter-korean&quot; data-og-url=&quot;https://github.com/dlfrnaos19/tpu-starter-korean&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cf2Bn6/hyP4ysBrS9/S30XplSHXUGNlcV9Eqe4T1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/tpu-starter-korean&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/tpu-starter-korean&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cf2Bn6/hyP4ysBrS9/S30XplSHXUGNlcV9Eqe4T1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/tpu-starter-korean&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to dlfrnaos19/tpu-starter-korean development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>23년 이전 글/TPU</category>
      <category>Jax</category>
      <category>Starter</category>
      <category>TPU</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/159</guid>
      <comments>https://okdone.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 10 Oct 2022 12:38:05 +0900</pubDate>
    </item>
    <item>
      <title>Django Rest Framework4 - 데이터 컨트롤</title>
      <link>https://okdone.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전글&lt;/p&gt;
&lt;figure id=&quot;og_1660563933318&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;Django Rest Framework3 - Django 프로젝트 실행&quot; data-og-description=&quot;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/157&quot; data-og-url=&quot;https://okdone.tistory.com/157&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/157&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736');&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;Django Rest Framework3 - Django 프로젝트 실행&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;request, response data flow&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;views.py에 python client를 통해서 api에 request를 할 때, api의 응답에 대해서 어떤 움직임이 일어나는지 자세히 보고자 합니다. request.body 부분이 코드에 추가되었습니다&lt;/p&gt;
&lt;pre id=&quot;code_1660563850199&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# views.py
from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    # 데이터 흐름
    # request -&amp;gt; HttpRequest -&amp;gt; Django
    body = request.body # byte string of JSON data
    print(body)
    return JsonResponse({&quot;message&quot;:&quot;하이, 이건 장고 api json 응답&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;basic.py 폴더의 requests.get 부분에 params 부분이 추가되었습니다&lt;/p&gt;
&lt;pre id=&quot;code_1660564035239&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# basic.py
import requests

# api url 설정한 곳으로 변경
endpoint = &quot;http://127.0.0.1:8000/api/&quot;

response = requests.get(endpoint, params={&quot;abc&quot;:123} ,json={&quot;query&quot;:&quot;Hello world&quot;})

print(response.status_code)
print(response.json())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Django 서버를 manage.py를 통해 띄운 상태에서 어떤 변화가 있는지 살펴봅니다&lt;/p&gt;
&lt;pre id=&quot;code_1660564106294&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 manage.py runserver 8000

# py_client 폴더로 이동후
python3 basic.py&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;여기에서 헷갈릴 수 있는 부분을 짚고 넘어가자면, 장고로 runserver 하는 곳은 서버 역할을 하고 있고, python으로 basic.py를 실행하는 것은 요청하는 사용자의 역할을 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 두가지의 로그 형태가 다르게 나오게 되는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request에 담은 json은 views.py에 api_home 함수에 설정한 print를 통해서, runserver를 진행한 터미널에 해당 응답이 뜰 것이며, 서버가 response한 내용은 basic.py를 실행한 터미널에 로그가 남을 겁니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuofng/btrJNIOe6w8/k9lAXO8DRN3H1kvr5aKkQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuofng/btrJNIOe6w8/k9lAXO8DRN3H1kvr5aKkQk/img.png&quot; data-alt=&quot;basic.py측 터미널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuofng/btrJNIOe6w8/k9lAXO8DRN3H1kvr5aKkQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuofng%2FbtrJNIOe6w8%2Fk9lAXO8DRN3H1kvr5aKkQk%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;437&quot; height=&quot;55&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;basic.py측 터미널&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxWfY/btrJMAbQ95g/GQfOWOzMxCUgmhBMV7CIok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxWfY/btrJMAbQ95g/GQfOWOzMxCUgmhBMV7CIok/img.png&quot; data-alt=&quot;runserver측 터미널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxWfY/btrJMAbQ95g/GQfOWOzMxCUgmhBMV7CIok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxWfY%2FbtrJMAbQ95g%2FGQfOWOzMxCUgmhBMV7CIok%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;420&quot; height=&quot;55&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;runserver측 터미널&lt;/figcaption&gt;
&lt;/figure&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;request가 가진 정보 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request는 우리가 basic.py에 입력한 정보 외에도 다른 정보를 담고 있습니다. 일례로 header와, content_type에 대한 정보를 서버측에 출력되게끔 설정해서 확인 해보겠습니다. views.py를 다음과 같이 수정하고, basic.py를 실행해서 서버측에 어떤 정보가 print 되는지 확인 해봅니다&lt;/p&gt;
&lt;pre id=&quot;code_1660565180227&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# views.py

import json
from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    # 데이터 흐름
    # request -&amp;gt; HttpRequest -&amp;gt; Django
    body = request.body # byte string of JSON data
    data = {}
    data = json.loads(body) #json to dict
    
    print(data)
    print(request.headers) # request의 header 정보
    print(request.content_type) # request의 content_type
    
    return JsonResponse({&quot;message&quot;:&quot;하이, 이건 장고 api json 응답&quot;})&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1660565230684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 basic.py&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;대부분의 정보가 header 부분에 포함되어 있는 것을 알 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7evl/btrJMAiCTRt/QpvasiuKbiQbhQI7gbUlrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7evl/btrJMAiCTRt/QpvasiuKbiQbhQI7gbUlrK/img.png&quot; data-alt=&quot;header, content_type 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7evl/btrJMAiCTRt/QpvasiuKbiQbhQI7gbUlrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7evl%2FbtrJMAiCTRt%2FQpvasiuKbiQbhQI7gbUlrK%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;372&quot; height=&quot;141&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;header, content_type 정보&lt;/figcaption&gt;
&lt;/figure&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;JSON 사용 시 발생 할 수 있는 에러&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON으로 응답을 하고 있으므로, request가 들어온 header 정보를 다시 response를 한다고 가정해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request의 정보를 다시 dictionary에 담아 return을 설정하고, basic.py를 통해 서버에 request 합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660565506390&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    # 데이터 흐름
    # request -&amp;gt; HttpRequest -&amp;gt; Django
    body = request.body # byte string of JSON data
    data = {}
    data = json.loads(body) #json to dict
    
    data['headers'] = request.headers
    data['content_type'] = request.content_type
    
    return JsonResponse(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czfhnY/btrJKsyCrdW/0W9DQDL22WfduwcReqr5iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czfhnY/btrJKsyCrdW/0W9DQDL22WfduwcReqr5iK/img.png&quot; data-alt=&quot;decode error&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czfhnY/btrJKsyCrdW/0W9DQDL22WfduwcReqr5iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczfhnY%2FbtrJKsyCrdW%2F0W9DQDL22WfduwcReqr5iK%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;760&quot; height=&quot;187&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;decode error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디코딩 과정에서 에러가 발생하는데, 파이썬의 dictionary 형태가 정확히 지켜지지 않았기 때문에 오류가 발생합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request.header 부분에서 해당 에러가 발생하는데, 이를 dict()로 감싸줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1660565765010&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    # 데이터 흐름
    # request -&amp;gt; HttpRequest -&amp;gt; Django
    body = request.body # byte string of JSON data
    data = {}
    data = json.loads(body) #json to dict
    
    data['headers'] = dict(request.headers)
    data['content_type'] = request.content_type
    
    
    return JsonResponse(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOS1Jb/btrJELsq1oU/r9XyYsweiXGeEgkZ9hgSeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOS1Jb/btrJELsq1oU/r9XyYsweiXGeEgkZ9hgSeK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOS1Jb/btrJELsq1oU/r9XyYsweiXGeEgkZ9hgSeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOS1Jb%2FbtrJELsq1oU%2Fr9XyYsweiXGeEgkZ9hgSeK%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;826&quot; height=&quot;122&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;122&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;JSONResponse에는 dictionary&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;request의 parameter 확인하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;basic.py에 get 메서드에 params를 추가했던 것을 기억하시나요? 추가했음에도 불구하고, 서버 로그나 응답에도 표시가 되지 않고 있었습니다. 이러한 내용을 서버측에서 확인할 수 있는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request.GET, request.POST를 추가하고, print 합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660566038151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# views.py

import json
from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    # 데이터 흐름
    # request -&amp;gt; HttpRequest -&amp;gt; Django
    
    # 추가된 코드
    print(request.GET)
    print(request.POST)
    
    body = request.body # byte string of JSON data
    data = {}
    data = json.loads(body) #json to dict
    
    data['headers'] = dict(request.headers)
    data['content_type'] = request.content_type
    
    
    return JsonResponse(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;basic.py를 실행하면&lt;/p&gt;
&lt;pre id=&quot;code_1660566084673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 basic.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 칸 request.GET 부분에서 쿼리가 들어오는 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 칸에는 request.POST 부분으로, POST가 아니기 때문에 빈 딕셔너리 형태가 존재합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjg7UB/btrJNIHu6pU/eYwWf0SdNZOoers1dcpa0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjg7UB/btrJNIHu6pU/eYwWf0SdNZOoers1dcpa0K/img.png&quot; data-alt=&quot;서버 log&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjg7UB/btrJNIHu6pU/eYwWf0SdNZOoers1dcpa0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjg7UB%2FbtrJNIHu6pU%2FeYwWf0SdNZOoers1dcpa0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;392&quot; height=&quot;145&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버 log&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;위 방법들을 통해서 사용자로서 요청을 서버에 테스트 해볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/Django</category>
      <category>data</category>
      <category>dictionary</category>
      <category>flow</category>
      <category>GET</category>
      <category>Header</category>
      <category>JSON</category>
      <category>POST</category>
      <category>request</category>
      <category>response</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/158</guid>
      <comments>https://okdone.tistory.com/158#entry158comment</comments>
      <pubDate>Mon, 15 Aug 2022 21:24:03 +0900</pubDate>
    </item>
    <item>
      <title>Django Rest Framework3 - Django 프로젝트 실행</title>
      <link>https://okdone.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전글&lt;/p&gt;
&lt;figure id=&quot;og_1660563358940&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;Django Rest Framework2 파이썬 API Client 만들기&quot; data-og-description=&quot;VSCODE Github 연동하기 들어가기에 앞서, 해당 프로젝트를 깃헙과 함께 관리하고 싶다면.. 리포지토리 초기화도 사용 가능하지만 초보자는 아래 github 게시를 추천합니다 저장소로 사용할 이름, priv&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/156&quot; data-og-url=&quot;https://okdone.tistory.com/156&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2BIrK/hyPqVu6Tfb/bHSIYmeAYogNAn8hRqDowK/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/iwuoH/hyPq6cji8p/HtVM54f9uk54wfE2xN8cU0/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/dJdQUs/hyPsWlDYVw/ayALrChVkHWhP9BoGOvxD0/img.png?width=222&amp;amp;height=391&amp;amp;face=0_0_222_391&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/156&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2BIrK/hyPqVu6Tfb/bHSIYmeAYogNAn8hRqDowK/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/iwuoH/hyPq6cji8p/HtVM54f9uk54wfE2xN8cU0/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/dJdQUs/hyPsWlDYVw/ayALrChVkHWhP9BoGOvxD0/img.png?width=222&amp;amp;height=391&amp;amp;face=0_0_222_391');&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;Django Rest Framework2 파이썬 API Client 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VSCODE Github 연동하기 들어가기에 앞서, 해당 프로젝트를 깃헙과 함께 관리하고 싶다면.. 리포지토리 초기화도 사용 가능하지만 초보자는 아래 github 게시를 추천합니다 저장소로 사용할 이름, priv&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Django 서버 띄우기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manage.py 는 backend 폴더 아래에 위치 합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660558657604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#python3 manage.py runserver [portnumber]
python3 manage.py runserver 8000&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;브라우저로 http://127.0.0.1:8000/ 에 접속했을 때 다음과 같은 GET 방식의 로그가 발생하며,&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;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTIJc/btrJEK1iGcc/inA9UPEjCVikRar9g7W2VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTIJc/btrJEK1iGcc/inA9UPEjCVikRar9g7W2VK/img.png&quot; data-alt=&quot;log&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTIJc/btrJEK1iGcc/inA9UPEjCVikRar9g7W2VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTIJc%2FbtrJEK1iGcc%2FinA9UPEjCVikRar9g7W2VK%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;121&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;log&lt;/figcaption&gt;
&lt;/figure&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-origin-width=&quot;842&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx1NLS/btrJFP2l4ig/icS57IApY097KEvZCls7Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx1NLS/btrJFP2l4ig/icS57IApY097KEvZCls7Gk/img.png&quot; data-alt=&quot;장고 성공 로켓&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx1NLS/btrJFP2l4ig/icS57IApY097KEvZCls7Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx1NLS%2FbtrJFP2l4ig%2FicS57IApY097KEvZCls7Gk%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;842&quot; height=&quot;491&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;491&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Python Client로 Test 하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 편에서 작성했던 basic.py의 endpoint에, 해당하는 주소를 기입합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660559130036&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#basic.py 스크립트

import requests 

# 보통 url로 언급하겠지만, api 활용에서 endpoint라는 용어로도 활용합니다
endpoint = &quot;http://127.0.0.1:8000/&quot;

response = requests.get(endpoint)

print(response.status_code)
print(response.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terminal을 통해서 basic.py를 실행시켜 봅니다(py_client 폴더 내에 있습니다)&lt;/p&gt;
&lt;pre id=&quot;code_1660559176347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 basic.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;200 응답과 함께 HTML을 정상적으로 반환하는 것을 볼 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWrqkd/btrJCocpmWj/67IZ2pUiw9Ul2qVU1jmOSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWrqkd/btrJCocpmWj/67IZ2pUiw9Ul2qVU1jmOSk/img.png&quot; data-alt=&quot;response 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWrqkd/btrJCocpmWj/67IZ2pUiw9Ul2qVU1jmOSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWrqkd%2FbtrJCocpmWj%2F67IZ2pUiw9Ul2qVU1jmOSk%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;590&quot; height=&quot;736&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Django api app 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 만들려고 하는 것은 DRF를 통한 api 입니다. manage.py를 통해 api라는 이름의 app을 생성합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660559486771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 manage.py startapp api&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트내에 여러개의 app을 생성할 수 있으며, app을 생성했다면, 해당 프로젝트의 settings.py에서 해당 app을 인식하게끔 적어줘야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cfehome/settings.py에서 INSTALLED_APPS 변수를 찾아서, 리스트에 앱 이름을 적어줍니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baMG39/btrJGUPSaQZ/ak2nkPgDAwnXffli6V3IY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baMG39/btrJGUPSaQZ/ak2nkPgDAwnXffli6V3IY0/img.png&quot; data-alt=&quot;리스트에 api 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baMG39/btrJGUPSaQZ/ak2nkPgDAwnXffli6V3IY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaMG39%2FbtrJGUPSaQZ%2Fak2nkPgDAwnXffli6V3IY0%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;251&quot; height=&quot;188&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리스트에 api 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;api app에 대한 view 작성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app에서 view들의 집합을 모아둔 파일이 views.py 입니다. api 폴더 내에 views.py로 이동해서 해당 앱이 어떻게 작동해야 할지 작성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저자가 json 응답을 주고 받기 위해 다음의 json response를 사용했습니다만 원하는 response를 사용하면 됩니다. 간단하게 1개의 뷰만 작성합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660559918870&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# views.py 내부

from django.http import JsonResponse

# Create your views here.
def api_home(request, *args, **kwargs):
    return JsonResponse({&quot;message&quot;:&quot;하이, 이건 장고 api json 응답&quot;})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;url 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Django는 프로젝트에 urls.py에서 각 app의 url로 뿌려주는 과정을 거칩니다. app 생성 시에는 urls.py가 생성되지 않기 때문에 직접 만들어줘야 합니다. api 폴더내에 urls.py 파일을 만들고 다음의 내용을 적습니다&lt;/p&gt;
&lt;pre id=&quot;code_1660561238360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path

#작성 했던 view를 가져오기 위함
from . import views

urlpatterns = [
    path('', views.api_home) #localhost:8000/api/
]&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;다음으로 해당 url을 프로젝트의 urls.py에 포함시켜주는 작업을 합니다. cfehome 폴더내에 urls.py 를 열고 path를 추가합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660561350355&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot;cfehome URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
&quot;&quot;&quot;
from django.contrib import admin
# include를 추가로 import 합니다
from django.urls import path, include

# include 메서드를 활용해 api/ 이후의 각종 url을 적용합니다
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls'))
]

#localhost:8000/api/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Json 응답 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 실행했던 서버를 종료하지 않았다면 바로 테스트를, 서버를 종료했다면 다시 실행하여 줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manage.py가 있는 곳으로 이동(backend 폴더 내부)해서 명령을 실행합니다&lt;/p&gt;
&lt;pre id=&quot;code_1660561485189&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 manage.py runserver 8000&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;py_client 폴더에 있는 basic.py를 우리가 설정한 url로 변경합니다, 또한 Json 응답으로 설정했으므로, response 객체 또한 json 형태로 받아봅니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660561596770&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# basic.py
import requests

# api url 설정한 곳으로 변경
endpoint = &quot;http://127.0.0.1:8000/api/&quot;

response = requests.get(endpoint, json={&quot;query&quot;:&quot;Hello world&quot;})

print(response.status_code)
print(response.json())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T2jW8/btrJFPuz4BH/6dkj37l1vgVxZkFbBWQt4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T2jW8/btrJFPuz4BH/6dkj37l1vgVxZkFbBWQt4k/img.png&quot; data-alt=&quot;response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T2jW8/btrJFPuz4BH/6dkj37l1vgVxZkFbBWQt4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT2jW8%2FbtrJFPuz4BH%2F6dkj37l1vgVxZkFbBWQt4k%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;321&quot; height=&quot;36&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1660566268709&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;Django Rest Framework3 - Django 프로젝트 실행&quot; data-og-description=&quot;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/157&quot; data-og-url=&quot;https://okdone.tistory.com/157&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/157&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736');&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;Django Rest Framework3 - Django 프로젝트 실행&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.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>23년 이전 글/Django</category>
      <category>APP</category>
      <category>include</category>
      <category>jsonrequests</category>
      <category>jsonresponse</category>
      <category>PATH</category>
      <category>URL</category>
      <category>views</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/157</guid>
      <comments>https://okdone.tistory.com/157#entry157comment</comments>
      <pubDate>Mon, 15 Aug 2022 19:18:16 +0900</pubDate>
    </item>
    <item>
      <title>Django Rest Framework2 파이썬 API Client 만들기</title>
      <link>https://okdone.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글&lt;/p&gt;
&lt;figure id=&quot;og_1660563313764&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;Django Rest Framework 기본 환경 설정&quot; data-og-description=&quot;본 튜토리얼은 해당 유튜브를 보고 블로그로 작성합니다 GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django Rest Frame Learn how to bui..&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/155&quot; data-og-url=&quot;https://okdone.tistory.com/155&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z0ISl/hyPqX0KHh0/kKJtznh9MBegDxqlKkmjoK/img.png?width=295&amp;amp;height=267&amp;amp;face=0_0_295_267,https://scrap.kakaocdn.net/dn/bPGmR5/hyPsUBltdr/Avc3nmty1CDktjXQMRc7pk/img.png?width=295&amp;amp;height=267&amp;amp;face=0_0_295_267,https://scrap.kakaocdn.net/dn/kebxY/hyPq5R1T1i/gSMCByxxAVutSIsktqveKK/img.png?width=1030&amp;amp;height=480&amp;amp;face=0_0_1030_480&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/155&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/155&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z0ISl/hyPqX0KHh0/kKJtznh9MBegDxqlKkmjoK/img.png?width=295&amp;amp;height=267&amp;amp;face=0_0_295_267,https://scrap.kakaocdn.net/dn/bPGmR5/hyPsUBltdr/Avc3nmty1CDktjXQMRc7pk/img.png?width=295&amp;amp;height=267&amp;amp;face=0_0_295_267,https://scrap.kakaocdn.net/dn/kebxY/hyPq5R1T1i/gSMCByxxAVutSIsktqveKK/img.png?width=1030&amp;amp;height=480&amp;amp;face=0_0_1030_480');&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;Django Rest Framework 기본 환경 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;본 튜토리얼은 해당 유튜브를 보고 블로그로 작성합니다 GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django Rest Frame Learn how to bui..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VSCODE Github 연동하기&lt;/h2&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;blob&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg0jGY/btrJHdA5pLR/JvDKA9wxhfHsaSWjQsSnOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg0jGY/btrJHdA5pLR/JvDKA9wxhfHsaSWjQsSnOK/img.png&quot; data-alt=&quot;소스 관리 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg0jGY/btrJHdA5pLR/JvDKA9wxhfHsaSWjQsSnOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg0jGY%2FbtrJHdA5pLR%2FJvDKA9wxhfHsaSWjQsSnOK%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;290&quot; height=&quot;257&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;257&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;리포지토리 초기화도 사용 가능하지만 초보자는 아래 github 게시를 추천합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btDod6/btrJFPnz2FE/cCKTtr7ogKNSVIQX80I4IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btDod6/btrJFPnz2FE/cCKTtr7ogKNSVIQX80I4IK/img.png&quot; data-alt=&quot;깃허브 게시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btDod6/btrJFPnz2FE/cCKTtr7ogKNSVIQX80I4IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtDod6%2FbtrJFPnz2FE%2FcCKTtr7ogKNSVIQX80I4IK%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;222&quot; height=&quot;391&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;391&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;저장소로 사용할 이름, private 이든, public이든 모두 사용 가능합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TvHVd/btrJMzRlj3X/8uGpHRytmuarJgVF1ppxtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TvHVd/btrJMzRlj3X/8uGpHRytmuarJgVF1ppxtk/img.png&quot; data-alt=&quot;저장소로 할 이름 적기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TvHVd/btrJMzRlj3X/8uGpHRytmuarJgVF1ppxtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTvHVd%2FbtrJMzRlj3X%2F8uGpHRytmuarJgVF1ppxtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;85&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;85&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;포함할 파일을 정하면 되는데, venv의 내용은 제외합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NbxQi/btrJFOvrTHw/02s3oRHR3HP0v2NXYQnYek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NbxQi/btrJFOvrTHw/02s3oRHR3HP0v2NXYQnYek/img.png&quot; data-alt=&quot;업로드할 파일 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NbxQi/btrJFOvrTHw/02s3oRHR3HP0v2NXYQnYek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNbxQi%2FbtrJFOvrTHw%2F02s3oRHR3HP0v2NXYQnYek%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;597&quot; height=&quot;127&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;127&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;여기에서 VSCODE의 깃허브 Extension을 설치하고 로그인했던 사람은 바로 업로드 및 깃 형상관리가 시작이 되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지 않았던 사람은 깃허브 인증 절차 및 깃헙에 있는 토큰을 VSCODE에 입력하는 절차를 거쳐야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링으로 나오기도 하겠지만, 어차피 깃허브 원격 저장 기능을 사용하지 않을 것이라면 그냥 리포지토리 초기화를 사용하고, 추후에 CLI로 깃을 컨트롤 하셔도 됩니다&lt;/p&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;깃허브에 업로드 하게 되면, Django Project의 settings.py 의 secret 키가 업로드 되므로, 위험에 노출되게 됩니다&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Python Client 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;py_client 폴더 내에 API 사용에 활용할 python client를 생성합니다, basic.py 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에선 requests를 활용해서, api를 활용하는 법에 대해 간단하게 언급합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 REST FrameWork를 만드는데 필요한 것 보다는, Rest API를 사용하기 위한 방법이기 때문입니다&lt;/p&gt;
&lt;pre id=&quot;code_1660545734001&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests # 파이썬으로 http를 사용하기에 편한 라이브러리

# 국민의 홈페이지, 네이버 url을 활용한 api 활용
# 보통 url로 언급하겠지만, api 활용에서 endpoint라는 용어로도 활용합니다
endpoint = &quot;https://naver.com&quot;

# get 방식으로 endpoint 호출을 하면 대기하던 api에서 naver 홈페이지에 해당하는
# html을 response 해줄 것입니다
response = requests.get(endpoint)

# status code 확인
print(response.status_code)

# naver api의 response에서 text를 추출하여 출력
print(response.text)&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;figure id=&quot;og_1660563332692&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;Django Rest Framework3 - Django 프로젝트 실행&quot; data-og-description=&quot;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/157&quot; data-og-url=&quot;https://okdone.tistory.com/157&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/157&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uiEov/hyPsOHTnwc/dsCotc8kMZWPqfyS9BKpMK/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/CgSyK/hyPsJmhZnk/d8S5SfmH0FfCuIGB56EiB0/img.png?width=527&amp;amp;height=121&amp;amp;face=0_0_527_121,https://scrap.kakaocdn.net/dn/clwv2v/hyPsMJ4PcF/2bsIlYy0kgFTqkTuS98dvK/img.png?width=590&amp;amp;height=736&amp;amp;face=0_0_590_736');&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;Django Rest Framework3 - Django 프로젝트 실행&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django 서버 띄우기 manage.py가 있는 디렉터리로 이동 후, 다음의 스크립트를 실행합니다 manage.py 는 backend 폴더 아래에 위치 합니다 #python3 manage.py runserver [portnumber] python3 manage.py runserve..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.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>23년 이전 글/Django</category>
      <category>Django-Rest-Framework</category>
      <category>github</category>
      <category>python client</category>
      <category>requests</category>
      <category>vscode</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/156</guid>
      <comments>https://okdone.tistory.com/156#entry156comment</comments>
      <pubDate>Mon, 15 Aug 2022 15:44:26 +0900</pubDate>
    </item>
    <item>
      <title>Django Rest Framework 기본 환경 설정</title>
      <link>https://okdone.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본 튜토리얼은 해당 &lt;a href=&quot;https://www.youtube.com/watch?v=c708Nf0cHrs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;유튜브&lt;/a&gt;를 보고 블로그로 작성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1660540186149&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django Rest Frame&quot; data-og-description=&quot;Learn how to build REST APIs with Django &amp;amp; the Django Rest Framework. - GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/codingforentrepreneurs/Django-Rest-Framework-Tutorial&quot; data-og-url=&quot;https://github.com/codingforentrepreneurs/Django-Rest-Framework-Tutorial&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KNFwX/hyPqVuVdo3/0k6g7KHe8BTPwfHDKrK2l0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/codingforentrepreneurs/Django-Rest-Framework-Tutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/codingforentrepreneurs/Django-Rest-Framework-Tutorial&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KNFwX/hyPqVuVdo3/0k6g7KHe8BTPwfHDKrK2l0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django Rest Frame&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to build REST APIs with Django &amp;amp; the Django Rest Framework. - GitHub - codingforentrepreneurs/Django-Rest-Framework-Tutorial: Learn how to build REST APIs with Django &amp;amp; the Django...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h2 data-ke-size=&quot;size26&quot;&gt;사용 기술 스택&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언어 : python&lt;/li&gt;
&lt;li&gt;OS : Ubuntu&lt;/li&gt;
&lt;li&gt;라이브러리 : requests, Django, Django-REST-Framework&lt;/li&gt;
&lt;li&gt;IDE : VSCODE&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 가상 환경 생성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 위해서 기존 환경, 글로벌 환경과 분리된 가상환경을 생성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적당한 폴더를 만들고, 해당 폴더로 진입합니다. 저는 drf라는 폴더를 생성했습니다&lt;/p&gt;
&lt;pre id=&quot;code_1660540757654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir drf
cd drf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 가상환경 생성&lt;/p&gt;
&lt;pre id=&quot;code_1660541014681&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# python3 버전의 경우
# 여러 버전일 경우, python3.8 의 형태로 명령해야할 수 있습니다
python3 -m venv [가상환경이름]

# 이 프로젝트에선 venv라는 가상환경을 사용합니다
python3 -m venv venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경 진입&lt;/p&gt;
&lt;pre id=&quot;code_1660541049982&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd venv
source bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VSCODE로 작업공간 열기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;drf 폴더를 기준으로 작업공간을 열어줍니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNixTO/btrJE3rX1rs/GgcOwbO3N4jwfzMzOWcvd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNixTO/btrJE3rX1rs/GgcOwbO3N4jwfzMzOWcvd0/img.png&quot; data-alt=&quot;drf 폴더 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNixTO/btrJE3rX1rs/GgcOwbO3N4jwfzMzOWcvd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNixTO%2FbtrJE3rX1rs%2FGgcOwbO3N4jwfzMzOWcvd0%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;295&quot; height=&quot;267&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;drf 폴더 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리를 설치합니다 여러 가지 방법이 있지만 유튜브 저자를 따라 해봅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새파일을 눌러서 requirements.txt 를 생성하고, 내부에 설치할 라이브러리를 작성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 프로젝트의 주요 프레임워크인 장고를 설치할 때 버전 선택에 대한 팁을 주는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTS 버전을 찾아 다운받아라고 추천합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.djangoproject.com/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.djangoproject.com/download/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 웹 페이지의 중간 쯤에서 현재 LTS 버전을 확인할 수 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhm5Xc/btrJLSp22LU/8IZ9gr07Tmw0c6c6TKTYiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhm5Xc/btrJLSp22LU/8IZ9gr07Tmw0c6c6TKTYiK/img.png&quot; data-alt=&quot;Django support&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhm5Xc/btrJLSp22LU/8IZ9gr07Tmw0c6c6TKTYiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhm5Xc%2FbtrJLSp22LU%2F8IZ9gr07Tmw0c6c6TKTYiK%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;1030&quot; height=&quot;480&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Django support&lt;/figcaption&gt;
&lt;/figure&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-origin-width=&quot;279&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhuRXl/btrJDiiCajD/zIE7AyKkvCAtVApkPMcbWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhuRXl/btrJDiiCajD/zIE7AyKkvCAtVApkPMcbWk/img.png&quot; data-alt=&quot;requirements.txt 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhuRXl/btrJDiiCajD/zIE7AyKkvCAtVApkPMcbWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhuRXl%2FbtrJDiiCajD%2FzIE7AyKkvCAtVApkPMcbWk%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;279&quot; height=&quot;185&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;requirements.txt 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirements.txt 가 있는 파일 위치에서 다음 명령어로 설치합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip warning이 뜬다면 업데이트도 실시해주세요&lt;/p&gt;
&lt;pre id=&quot;code_1660543044850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 라이브러리 설치
pip3 install -r requirements.txt

# pip 업그레이드
pip3 install --upgrade pip&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;RestAPI를 담당할 폴더와, client 파트를 담당할 폴더를 나눕니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;drf 폴더 내에 backend, py_client 폴더를 생성해주세요&lt;/p&gt;
&lt;pre id=&quot;code_1660543452975&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# drf 폴더로 이동해서 만들어야 합니다
mkdir backend
mkdir py_client&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;장고 명령어를 활용해서 가장 첫번째로 해야할 일, 프로젝트를 생성합니다. 경로는 backend 폴더 내로 설정&lt;/p&gt;
&lt;pre id=&quot;code_1660543632674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd backend
django-admin startproject cfehome .&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckCR3o/btrJFPVsLwK/4TmZkXrgtho6OvNbIssWLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckCR3o/btrJFPVsLwK/4TmZkXrgtho6OvNbIssWLk/img.png&quot; data-alt=&quot;tree 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckCR3o/btrJFPVsLwK/4TmZkXrgtho6OvNbIssWLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckCR3o%2FbtrJFPVsLwK%2F4TmZkXrgtho6OvNbIssWLk%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;231&quot; height=&quot;242&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tree 구조&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;다음글&lt;/p&gt;
&lt;figure id=&quot;og_1660563275512&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;Django Rest Framework2 파이썬 API Client 만들기&quot; data-og-description=&quot;VSCODE Github 연동하기 들어가기에 앞서, 해당 프로젝트를 깃헙과 함께 관리하고 싶다면.. 리포지토리 초기화도 사용 가능하지만 초보자는 아래 github 게시를 추천합니다 저장소로 사용할 이름, priv&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/156&quot; data-og-url=&quot;https://okdone.tistory.com/156&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2BIrK/hyPqVu6Tfb/bHSIYmeAYogNAn8hRqDowK/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/iwuoH/hyPq6cji8p/HtVM54f9uk54wfE2xN8cU0/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/dJdQUs/hyPsWlDYVw/ayALrChVkHWhP9BoGOvxD0/img.png?width=222&amp;amp;height=391&amp;amp;face=0_0_222_391&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/156&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2BIrK/hyPqVu6Tfb/bHSIYmeAYogNAn8hRqDowK/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/iwuoH/hyPq6cji8p/HtVM54f9uk54wfE2xN8cU0/img.png?width=290&amp;amp;height=257&amp;amp;face=0_0_290_257,https://scrap.kakaocdn.net/dn/dJdQUs/hyPsWlDYVw/ayALrChVkHWhP9BoGOvxD0/img.png?width=222&amp;amp;height=391&amp;amp;face=0_0_222_391');&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;Django Rest Framework2 파이썬 API Client 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VSCODE Github 연동하기 들어가기에 앞서, 해당 프로젝트를 깃헙과 함께 관리하고 싶다면.. 리포지토리 초기화도 사용 가능하지만 초보자는 아래 github 게시를 추천합니다 저장소로 사용할 이름, priv&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/Django</category>
      <category>Django-Rest-Framework</category>
      <category>drf</category>
      <category>project</category>
      <category>restapi</category>
      <category>setting</category>
      <category>Tutorial</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/155</guid>
      <comments>https://okdone.tistory.com/155#entry155comment</comments>
      <pubDate>Mon, 15 Aug 2022 15:15:01 +0900</pubDate>
    </item>
    <item>
      <title>연결구조, 환형 연결리스트, 이중 연결리스트, 환형 이중 연결리스트</title>
      <link>https://okdone.tistory.com/154</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;환형 연결리스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트의 제한성(어떤 특정 노드의 선행 노드를 찾기 위해 head부터 시작)을 해결하기 위한 자료구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막 노드의 연결필드가 NULL이 아닌 첫 번째 노드의 주소를 가짐&lt;/li&gt;
&lt;li&gt;한 노드에서 모든 노드로의 접근이 가능함&lt;/li&gt;
&lt;li&gt;LINK를 따라 계속 순회하면 이전 노드에 접근이 가능함&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TM3Lc/btrJCo5letA/vkfO9ds5dWlbKCZNMbbkP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TM3Lc/btrJCo5letA/vkfO9ds5dWlbKCZNMbbkP1/img.png&quot; data-alt=&quot;연결리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TM3Lc/btrJCo5letA/vkfO9ds5dWlbKCZNMbbkP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTM3Lc%2FbtrJCo5letA%2FvkfO9ds5dWlbKCZNMbbkP1%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;396&quot; height=&quot;67&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;67&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;환형 연결리스트의 ADT&lt;/h4&gt;
&lt;pre id=&quot;code_1660522859740&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT CircularLinkedlist
데이터
0개 이상의 노드를 가진 유한순서 리스트(Element는 데이터 값)
연산자 및 연산내용 // CL&amp;isin;CLinkedlist, n&amp;isin;node, p&amp;isin;position
CLlinkedlist() //환형 연결리스트를 생성
~CLlinkedlist() //환형 연결리스트를 소멸
Boolean search(CL, n) //환형 연결리스트에서 주어진 노드를 탐색
CLinkedlist insert(CL, n) //환형 연결리스트에 주어진 노드를 삽입
CLinkedlist remove(CL, n) //환형 연결리스트에서 주어진 노드를 삭제
remove_all(CL) //환형 연결리스트의 모든 노드를 삭제
Element get_data(CL, p) //p가 가리키는 현재 노드의 데이터를 출력
Element get_nextnode(CL, p)//p가가리키는현재노드의다음노드를출력
Element display() //환형 연결리스트의 모든 노드를 출력
End CircularLinkedlist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환형 연결리스트 삽입/삭제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노드의 삽입/삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입 알고리즘(첫번째로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1660523220079&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_insert_first_node.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QiD22/hyPsMwedfe/oYRcpch4xJ7XjAFppnLcu1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_insert_first_node.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_insert_first_node.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QiD22/hyPsMwedfe/oYRcpch4xJ7XjAFppnLcu1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ1Du3/btrJKtw7oaT/av3Cb8FGjqJiTHfNr5BB1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ1Du3/btrJKtw7oaT/av3Cb8FGjqJiTHfNr5BB1K/img.png&quot; data-alt=&quot;삽입 알고리즘(첫번째로 삽입, CL = 공백 리스트)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ1Du3/btrJKtw7oaT/av3Cb8FGjqJiTHfNr5BB1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ1Du3%2FbtrJKtw7oaT%2Fav3Cb8FGjqJiTHfNr5BB1K%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;342&quot; height=&quot;243&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삽입 알고리즘(첫번째로 삽입, CL = 공백 리스트)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccUtkq/btrJFOhNfBE/KkBHgb2d4Pbrt6jEy3XsO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccUtkq/btrJFOhNfBE/KkBHgb2d4Pbrt6jEy3XsO0/img.png&quot; data-alt=&quot;삽입 알고리즘(첫 번째로 삽입, CL != 공백리스트)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccUtkq/btrJFOhNfBE/KkBHgb2d4Pbrt6jEy3XsO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccUtkq%2FbtrJFOhNfBE%2FKkBHgb2d4Pbrt6jEy3XsO0%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;521&quot; height=&quot;352&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삽입 알고리즘(첫 번째로 삽입, CL != 공백리스트)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LxQ17/btrJKtRpSVp/dAmj0nBqR7vjZOcogAw9kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LxQ17/btrJKtRpSVp/dAmj0nBqR7vjZOcogAw9kk/img.png&quot; data-alt=&quot;삽입 알고리즘(첫 번째로 삽입, CL != 공백 리스트)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LxQ17/btrJKtRpSVp/dAmj0nBqR7vjZOcogAw9kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLxQ17%2FbtrJKtRpSVp%2FdAmj0nBqR7vjZOcogAw9kk%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;508&quot; height=&quot;199&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삽입 알고리즘(첫 번째로 삽입, CL != 공백 리스트)&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;삭제 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1660526320338&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_delete_after_prenode.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cy0TqR/hyPsMiIeHR/KPnXf3rjW0g46oBo3TKZe1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_delete_after_prenode.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/linked_list/circular_delete_after_prenode.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cy0TqR/hyPsMiIeHR/KPnXf3rjW0g46oBo3TKZe1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvJSLt/btrJGUPxXaf/1MtVFGosIQ9rkFdkj5dcf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvJSLt/btrJGUPxXaf/1MtVFGosIQ9rkFdkj5dcf1/img.png&quot; data-alt=&quot;삭제 알고리즘(포인터 pre가 가리키는 노드의 다음 노드를 삭제)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvJSLt/btrJGUPxXaf/1MtVFGosIQ9rkFdkj5dcf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvJSLt%2FbtrJGUPxXaf%2F1MtVFGosIQ9rkFdkj5dcf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;114&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삭제 알고리즘(포인터 pre가 가리키는 노드의 다음 노드를 삭제)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K1CVH/btrJMzp5rTE/lN06H8nn2qXyxXMw9BvKqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K1CVH/btrJMzp5rTE/lN06H8nn2qXyxXMw9BvKqK/img.png&quot; data-alt=&quot;삭제 알고리즘(포인터 pre가 가리키는 노드의 다음 노드를 삭제)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K1CVH/btrJMzp5rTE/lN06H8nn2qXyxXMw9BvKqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK1CVH%2FbtrJMzp5rTE%2FlN06H8nn2qXyxXMw9BvKqK%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;470&quot; height=&quot;322&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삭제 알고리즘(포인터 pre가 가리키는 노드의 다음 노드를 삭제)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/자료구조</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/154</guid>
      <comments>https://okdone.tistory.com/154#entry154comment</comments>
      <pubDate>Mon, 15 Aug 2022 10:52:07 +0900</pubDate>
    </item>
    <item>
      <title>SELECT 2</title>
      <link>https://okdone.tistory.com/153</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;정렬 (ORDER BY)과 집단 함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ORDER BY 절에서 속성을 사용하여 검색 결과를 오름차순(ASC)나 내림차순(DESC)로 정렬함&lt;/li&gt;
&lt;li&gt;ORDER BY절은 SELECT문에서 가장 마지막에 사용&lt;/li&gt;
&lt;li&gt;디폴트 정렬 순서는 오름차순(ASC)&lt;/li&gt;
&lt;li&gt;NULL 값은 오름차순에서 가장 마지막에 나타나고, 내림차순에선 가장 앞에 나타남&lt;/li&gt;
&lt;li&gt;SELECT절에 명시한 속성들을 사용해서 정렬해야함&lt;/li&gt;
&lt;li&gt;사용 예) ORDER BY 속성 [ASC | DESC]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660515285026&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 2번 부서에 근무하는 사원들의 급여, 직급, 이름을 검색하고 급여 기준 오름차순 정렬
SELECT SALARY, TITLE, EMPNAME
FROM EMPLOYEE WHERE DNO = 2
ORDER BY SALARY;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5yFKj/btrJFPAQZkv/6PsCUJMT614ZZbbTe006x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5yFKj/btrJFPAQZkv/6PsCUJMT614ZZbbTe006x0/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5yFKj/btrJFPAQZkv/6PsCUJMT614ZZbbTe006x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5yFKj%2FbtrJFPAQZkv%2F6PsCUJMT614ZZbbTe006x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;82&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660515366767&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사원들의 부서번호, 사원번호, 이름을 검색하고 부서번호는 내림차순, 
# 사원번호는 부서번호에 대해 오름차순 정렬
SELECT DNO, EMPNO, EMPNAME FROM EMPLOYEE
ORDER BY DNO DESC, EMPNO ASC&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brL2Z0/btrJKsLFaBg/kUnbRQMgCbbl2IMprGkj61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brL2Z0/btrJKsLFaBg/kUnbRQMgCbbl2IMprGkj61/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brL2Z0/btrJKsLFaBg/kUnbRQMgCbbl2IMprGkj61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrL2Z0%2FbtrJKsLFaBg%2FkUnbRQMgCbbl2IMprGkj61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;159&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;집단 함수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스에서 검색된 여러 튜플들의 집단(GROUP)에 적용되는 함수&lt;/li&gt;
&lt;li&gt;각 집단 함수는 한 릴레이션에서 한 개의 속성에 적용되어 단일 값을 반환함&lt;/li&gt;
&lt;li&gt;SELECT절과 HAVING절에만 나타날 수 있음&lt;/li&gt;
&lt;li&gt;COUNT(*)는 결과 릴레이션의 모든 행들의 총 개수를 구하는 반면에 COUNT(속성)는 해당 속성에서 NULL값이 아닌 값들의 개수를 구함&lt;/li&gt;
&lt;li&gt;집단 함수의 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; 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;COUNT&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;SUM&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;AVG&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;MAX&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;MIN&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;값들의 최소값&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1660515627775&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사원들의 평균 급여와 최대 급여를 검색
SELECT AVG(SALARY) AVGSAL, MAX(SALARY) MAXSAL
FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGBka/btrJD21JBJ6/6O6rm7Bmq5KR47FQa9GB0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGBka/btrJD21JBJ6/6O6rm7Bmq5KR47FQa9GB0K/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGBka/btrJD21JBJ6/6O6rm7Bmq5KR47FQa9GB0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGBka%2FbtrJD21JBJ6%2F6O6rm7Bmq5KR47FQa9GB0K%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;195&quot; height=&quot;43&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660515665551&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사원들의 총 급여를 검색
SELECT SUM(SALARY) 총급여
FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;97&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvPpyW/btrJBFMc5cO/xlTcbyU62FD8gWNlUxYhok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvPpyW/btrJBFMc5cO/xlTcbyU62FD8gWNlUxYhok/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvPpyW/btrJBFMc5cO/xlTcbyU62FD8gWNlUxYhok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvPpyW%2FbtrJBFMc5cO%2FxlTcbyU62FD8gWNlUxYhok%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;97&quot; height=&quot;42&quot; data-origin-width=&quot;97&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660515740589&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 전체 부서 수를 검색
SELECT COUNT(*) AS '부서 수' FROM DEPARTMENT;

# 급여를 2500000이상 받는 사원 수 검색
SELECT COUNT(*) AS 사원수 FROM EMPLOYEE
WHERE SALARY &amp;gt;= 2500000;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그룹화(GROUP BY)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY절에 명시된 속성의 값에 따라 테이블을 그룹으로 분할&lt;/li&gt;
&lt;li&gt;SELECT절의 속성 리스트에는 각 그룹마다 하나의 값을 갖는 속성, 집단 함수, 그룹화에 사용된 속성들만 나타낼 수 있음&lt;/li&gt;
&lt;li&gt;잘못 사용 예) SELECT EMPNO, AVG(SALARY) FROM EMPLOYEE GROUP BY DNO;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660515905611&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사원들에 대해 부서별 부서번호와 평균 급여, 최대 급여를 검색
SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSAL
FROM EMPLOYEE
GROUP BY DNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQYcT/btrJE2Gsovx/OzQKXCor96H2KOmjgKVXp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQYcT/btrJE2Gsovx/OzQKXCor96H2KOmjgKVXp1/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQYcT/btrJE2Gsovx/OzQKXCor96H2KOmjgKVXp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQYcT%2FbtrJE2Gsovx%2FOzQKXCor96H2KOmjgKVXp1%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;646&quot; height=&quot;272&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;272&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;
&lt;pre id=&quot;code_1660516565635&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사원들에 대해 직급별 평균 급여를 검색
SELECT TITLE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY TITLE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AQ8Qf/btrJIsZshVx/tJZQiqHC6pSH5yNDCyxUJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AQ8Qf/btrJIsZshVx/tJZQiqHC6pSH5yNDCyxUJK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AQ8Qf/btrJIsZshVx/tJZQiqHC6pSH5yNDCyxUJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAQ8Qf%2FbtrJIsZshVx%2FtJZQiqHC6pSH5yNDCyxUJK%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;190&quot; height=&quot;123&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;123&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;
&lt;pre id=&quot;code_1660516611796&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 부서(DNO)별 사원수 검색
SELECT DNO AS 부서번호, COUNT(*) AS 사원수
FROM EMPLOYEE
GROUP BY DNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LuKd6/btrJD4ehhyE/AeQSGkO8EXyKlrZCOaDk9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LuKd6/btrJD4ehhyE/AeQSGkO8EXyKlrZCOaDk9k/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LuKd6/btrJD4ehhyE/AeQSGkO8EXyKlrZCOaDk9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLuKd6%2FbtrJD4ehhyE%2FAeQSGkO8EXyKlrZCOaDk9k%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;190&quot; height=&quot;78&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;78&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HAVING&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY 절에 의해 생성된 그룹을 대상으로 조건을 적용&lt;/li&gt;
&lt;li&gt;GROYP BY 절에서 명시한 속성에 의해 그룹으로 분류한 다음, 그룹에 대해 HAVING 절의 검색 조건을 지정&lt;/li&gt;
&lt;li&gt;HAVING절은 GROUP BY절과 함께 사용&lt;/li&gt;
&lt;li&gt;HAVING절에 나타나는 속성은 반드시 GROUP BY절에 나타나거나 집단 함수에 포함되어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660516745532&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 사원들에 대해서 부서(DNO)별 평균 급여가 2500000원 이상인 부서에 대해서 부서번호, 
# 평균 급여, 최대 급여를 검색
SELECT DNO, AVG(SALARY) AVGSAL, MAX(SALARY) MAXSAL
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG(SALARY) &amp;gt;= 2500000;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ns1dm/btrJFPt8IOc/x66GNdCYIfKMKkMKs28eQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ns1dm/btrJFPt8IOc/x66GNdCYIfKMKkMKs28eQ1/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ns1dm/btrJFPt8IOc/x66GNdCYIfKMKkMKs28eQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fns1dm%2FbtrJFPt8IOc%2Fx66GNdCYIfKMKkMKs28eQ1%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;639&quot; height=&quot;282&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;282&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;
&lt;pre id=&quot;code_1660516971735&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 사원들에 대해 직급(TITLE)별 사원수가 2명 이상인 직급과 사원 수를 검색
SELECT TITLE, COUNT(*) 사원수
FROM EMPLOYEE
GROUP BY TITLE
HAVING COUNT(*) &amp;gt;= 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPoIex/btrJB4sqYax/p6m1b9Z9ksFTPTCk4kFMhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPoIex/btrJB4sqYax/p6m1b9Z9ksFTPTCk4kFMhK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPoIex/btrJB4sqYax/p6m1b9Z9ksFTPTCk4kFMhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPoIex%2FbtrJB4sqYax%2Fp6m1b9Z9ksFTPTCk4kFMhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;192&quot; height=&quot;68&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;68&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;
&lt;pre id=&quot;code_1660517026439&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 2명 이상 사원이 근무하는 부서별 평균 급여를 검색
SELECT DNO, COUNT(*) 사원수, AVG(SALARY) 평균급여 FROM EMPLOYEE
GROUP BY DNO
HAVING COUNT(*) &amp;gt;= 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y0pjd/btrJC30WqNm/lbhQcInZOCRVo02KghtW80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y0pjd/btrJC30WqNm/lbhQcInZOCRVo02KghtW80/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y0pjd/btrJC30WqNm/lbhQcInZOCRVo02KghtW80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy0pjd%2FbtrJC30WqNm%2FlbhQcInZOCRVo02KghtW80%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;275&quot; height=&quot;86&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;86&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;집합 연산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;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;UNION(합집합), EXCEPT(차집합), INTERSECT(교집합)&lt;/li&gt;
&lt;li&gt;UNION ALL(합집합), EXCEPT ALL(차집합), INTERSECT ALL(교집합)&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;pre id=&quot;code_1660517207618&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 김창섭이 속한 부서이거나 개발 부서의 부서번호를 검색
(SELECT DNO FROM EMPLOYEE
WHERE EMPNAME = '김창섭')
UNION
(SELECT DEPTNO FROM DEPARTMENT
WHERE DEPTNAME = '개발');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;94&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ti1R4/btrJELeseu9/8eKsNzGk61k5MaKwgkCkNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ti1R4/btrJELeseu9/8eKsNzGk61k5MaKwgkCkNk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ti1R4/btrJELeseu9/8eKsNzGk61k5MaKwgkCkNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTi1R4%2FbtrJELeseu9%2F8eKsNzGk61k5MaKwgkCkNk%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;94&quot; height=&quot;64&quot; data-origin-width=&quot;94&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교집합&lt;/p&gt;
&lt;pre id=&quot;code_1660517604852&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 김창섭 또는 최종철이 속한 부서이면서 기획부서의 부서번호를 검색
(SELECT DNO FROM EMPLOYEE
WHERE EMPNAME = '김창섭' OR EMPNAME = '최종철')
INTERSECT
(SELECT DEPTNO FROM DEPARTMENT
WHERE DEPTNAME = '기획');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTfPLL/btrJBdPYsTq/unLRCy4Q1NfPKUyPqWzqDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTfPLL/btrJBdPYsTq/unLRCy4Q1NfPKUyPqWzqDK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTfPLL/btrJBdPYsTq/unLRCy4Q1NfPKUyPqWzqDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTfPLL%2FbtrJBdPYsTq%2FunLRCy4Q1NfPKUyPqWzqDK%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;92&quot; height=&quot;38&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;조인 연산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인은 여러 테이블의 연관된 튜플들을 하나의 테이블로 결합&lt;/p&gt;
&lt;pre id=&quot;code_1660517662257&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ...
FROM R, S
WHERE R.A &amp;lt;비교연산자&amp;gt; S.B;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FROM절에 3개의 테이블이 명시되면, 먼저 두 테이블을 조인하고 조인된 결과와 나머지 테이블과 조인함&lt;/li&gt;
&lt;li&gt;조인 조건을 생략했을 때와 조인 조건을 틀리게 표현했을 때는 카티션 곱이 생성됨&lt;/li&gt;
&lt;li&gt;조인 질의가 수행되는 개념적 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;조인 조건을 만족하는 튜플을 찾고&lt;/li&gt;
&lt;li&gt;이 튜플들로 부터 SELECT절에 명시된 속성들만 프로젝트하고&lt;/li&gt;
&lt;li&gt;필요하다면 중복을 배제하는 순서로 진행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660517792434&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ... FROM 테이블명 JOIN 테이블명 ON (조인 조건식)
SELECT EMPNO, EMPNAME, DEPTNAME
FROM EMPLOYEE JOIN DEPARTMENT ON
(EMPLOYEE.DNO = DEPARTMENT.DEPTNO);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1660517828871&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ... FROM R JOIN S USING (조인속성)
SELECT EMPNO, EMPNAME, DEPTNAME
FROM EMPLOYEE JOIN DEPARTMENT USING(DNO);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조인에서 속성 이름 중복 해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인 조건이 명확해지도록 조인 조건의 속성 이름 앞에 테이블 이름이나 튜플 변수를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1660517878862&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM STUDENT, ENROL
WHERE STUDENT.SNO = ENROL.SNO&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;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조인 질의&lt;/h3&gt;
&lt;pre id=&quot;code_1660517937295&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 사원의 이름과 이 사원이 속한 부서 이름을 검색
SELECT EMPNAME, DEPTNAME
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nWntb/btrJItRBlAd/HGK0JCtk4g49svEOzHUgbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nWntb/btrJItRBlAd/HGK0JCtk4g49svEOzHUgbK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nWntb/btrJItRBlAd/HGK0JCtk4g49svEOzHUgbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnWntb%2FbtrJItRBlAd%2FHGK0JCtk4g49svEOzHUgbK%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;614&quot; height=&quot;162&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GeR1b/btrJD28wXRj/kTwkmpYfaSuM6gXFO79XZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GeR1b/btrJD28wXRj/kTwkmpYfaSuM6gXFO79XZ1/img.png&quot; data-alt=&quot;출력 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GeR1b/btrJD28wXRj/kTwkmpYfaSuM6gXFO79XZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGeR1b%2FbtrJD28wXRj%2FkTwkmpYfaSuM6gXFO79XZ1%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;561&quot; height=&quot;313&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;313&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;
&lt;pre id=&quot;code_1660518167956&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기획 부서의 사원 이름과 급여를 검색
SELECT EMPNAME, SALARY
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO
AND D.DEPTNAME = '기획';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8Nsy/btrJBdJbkQi/rUEygToeldkekk4te1SPVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8Nsy/btrJBdJbkQi/rUEygToeldkekk4te1SPVK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8Nsy/btrJBdJbkQi/rUEygToeldkekk4te1SPVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8Nsy%2FbtrJBdJbkQi%2FrUEygToeldkekk4te1SPVK%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;179&quot; height=&quot;82&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;82&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인과 ORDER BY 결합&lt;/p&gt;
&lt;pre id=&quot;code_1660518258599&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 사원에 대해 소속 부서 이름, 사원의 이름, 직급, 급여를 검색
# 단, 부서 이름에 대해 오름차순, 부서 이름이 같은 경우 SALARY에 대해 내림차순 정렬
SELECT DEPTNAME, EMPNAME, TITLE, SALARY
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO
ORDER BY DEPTNAME, SALARY DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZU6K/btrJIsSHZDp/3QSVRXDAhMtL0wi7f3OSY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZU6K/btrJIsSHZDp/3QSVRXDAhMtL0wi7f3OSY0/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZU6K/btrJIsSHZDp/3QSVRXDAhMtL0wi7f3OSY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZU6K%2FbtrJIsSHZDp%2F3QSVRXDAhMtL0wi7f3OSY0%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;493&quot; height=&quot;167&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;167&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 베이스 예시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ky0t8/btrJItKR79m/YnnN6IMFKm8Lk0sl9t5iU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ky0t8/btrJItKR79m/YnnN6IMFKm8Lk0sl9t5iU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ky0t8/btrJItKR79m/YnnN6IMFKm8Lk0sl9t5iU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fky0t8%2FbtrJItKR79m%2FYnnN6IMFKm8Lk0sl9t5iU0%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;510&quot; height=&quot;139&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660518615906&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 이홍근 학생이 신청한 수강 과목 수를 검색
SELECT COUNT(*) AS 수강과목수
FROM STUDENT AS S, ENROL AS E
WHERE S.SNO = E.SNO
AND S.NAME = '이홍근';&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1660518817290&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT S.NAME, E.CREDIT
FROM STUDENT AS S, ENROL AS E, COURSE AS C
WHERE (S.SNO = E.SNO) AND (E.CNO = C.CNO)
AND (C.CNAME = '데이터베이스');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자체조인(SELF JOIN)&lt;/h3&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;실제로는 한 릴레이션에 접근하지만 FROM 절에 두 릴레이션이 참조되는 것처럼 나타내기 위해서 별칭을 두개로 지정해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660518889595&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.EMPNAME, M.EMPNAME
FROM EMPLOYEE AS E, EMPLOYEE AS M
WHERE E.MANAGER = M.EMPNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzIz1v/btrJD3l5tRb/Pq1b2qkl6yonsDd4Q8hE70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzIz1v/btrJD3l5tRb/Pq1b2qkl6yonsDd4Q8hE70/img.png&quot; data-alt=&quot;출력 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzIz1v/btrJD3l5tRb/Pq1b2qkl6yonsDd4Q8hE70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzIz1v%2FbtrJD3l5tRb%2FPq1b2qkl6yonsDd4Q8hE70%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;617&quot; height=&quot;302&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHtdPP/btrJD3sTRlT/e4jDxinN0OzxyKWkgfkEkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHtdPP/btrJD3sTRlT/e4jDxinN0OzxyKWkgfkEkk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHtdPP/btrJD3sTRlT/e4jDxinN0OzxyKWkgfkEkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHtdPP%2FbtrJD3sTRlT%2Fe4jDxinN0OzxyKWkgfkEkk%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;220&quot; height=&quot;194&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;194&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;
&lt;p data-ke-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>23년 이전 글/데이터베이스</category>
      <category>except</category>
      <category>GROUP BY</category>
      <category>having</category>
      <category>Intersect</category>
      <category>Join</category>
      <category>ORDER BY</category>
      <category>union</category>
      <category>집합연산</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/153</guid>
      <comments>https://okdone.tistory.com/153#entry153comment</comments>
      <pubDate>Mon, 15 Aug 2022 08:16:36 +0900</pubDate>
    </item>
    <item>
      <title>SELECT 1</title>
      <link>https://okdone.tistory.com/152</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;SELECT 개요&lt;/h2&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;관계 대수의 실렉션과 의미가 완전히 다름&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;h3 data-ke-size=&quot;size23&quot;&gt;SELECT문&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HxieT/btrJCn5ifKX/KU9s90PNe1CBrmj8nKRunK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HxieT/btrJCn5ifKX/KU9s90PNe1CBrmj8nKRunK/img.png&quot; data-alt=&quot;질의에서 사용하는 데이터베이스 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HxieT/btrJCn5ifKX/KU9s90PNe1CBrmj8nKRunK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHxieT%2FbtrJCn5ifKX%2FKU9s90PNe1CBrmj8nKRunK%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;609&quot; height=&quot;328&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;328&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SELECT문 형식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT절과 FROM절만 필수적인 절이고 나머지는 선택&lt;/li&gt;
&lt;li&gt;순서는 변경 불가&lt;/li&gt;
&lt;li&gt;SQL문은 대문자와 소문자 구분하지 않음&lt;/li&gt;
&lt;li&gt;'[]'은 '선택사항', '|' 는 '또는'을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c52jOp/btrJELZu42Z/YXjHAZB2KuAiDP0keCmYk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c52jOp/btrJELZu42Z/YXjHAZB2KuAiDP0keCmYk0/img.png&quot; data-alt=&quot;SELECT문 형식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c52jOp/btrJELZu42Z/YXjHAZB2KuAiDP0keCmYk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc52jOp%2FbtrJELZu42Z%2FYXjHAZB2KuAiDP0keCmYk0%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;466&quot; height=&quot;226&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SELECT문 형식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SELECT [DISTINCT] 속성&lt;/h4&gt;
&lt;pre id=&quot;code_1660478884816&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, SALARY FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&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;'DISTINCT'를 명시하면 중복 값을 제거함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FROM 릴레이션&lt;/h4&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;SELECT에서 열거한 속성을 포함하는 릴레이션 열거&lt;/li&gt;
&lt;li&gt;WHERE절의 프레디키트에 사용된 속성을 포함하는 릴레이션 열거&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;WHERE&amp;nbsp;&lt;/h4&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;FROM절에 열거한 릴레이션에 속하는 속성들만 사용&lt;/li&gt;
&lt;li&gt;WHERE절의 조건은 결과 릴레이션의 튜플들이 만족시켜야 하는 조건&lt;/li&gt;
&lt;li&gt;WHERE절의 프레디키트는 다음을 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비교 연산자 : =, &amp;lt;&amp;gt;, &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 부울 연산자 : AND, ON, NOT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 집합 연산자: IN, NOT IN, ANY, ALL&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 질의의 WHERE절에 포함된 SELECT 문&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY : GROUP BY로 명시된 속성에 동일한 값을 갖는 튜플들을 한 그룹으로 만듦&lt;/li&gt;
&lt;li&gt;HAVING : GROUP BY로 생성된 그룹들이 만족해야하는 조건을 명시&lt;/li&gt;
&lt;li&gt;ORDER BY : 결과 튜플들의 정렬 순서를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;별칭(ALIAS)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 다른 릴레이션에 동일한 이름을 가진 속성이 속해 있을 때&amp;nbsp; 속성 이름을 구분하는 방법&lt;/li&gt;
&lt;li&gt;속성 앞에 릴레이션의 명칭을 명시&amp;nbsp; EX) EMPLOYEE.DNO&lt;/li&gt;
&lt;li&gt;튜플 변수 사용(별칭이라고 함)&lt;/li&gt;
&lt;li&gt;질의 내에서 릴레이션 이름 대신 별칭을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660479358614&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT E.EMPNAME, D.DEPTNAME
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테이블에서 속성 검색&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;pre id=&quot;code_1660479403447&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM DEPARTMENT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 속성을 검색&lt;/p&gt;
&lt;pre id=&quot;code_1660479439686&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중복 값들을 제외한 검색(DISTINCT)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복된 행을 제거 후 결과 출력&lt;/p&gt;
&lt;pre id=&quot;code_1660479486268&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DISTINCT 사용하지 않았을 때
SELECT TITLE FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;78&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4327a/btrJFOhn4lz/hvUEbvhKmP8kpinfjkY9I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4327a/btrJFOhn4lz/hvUEbvhKmP8kpinfjkY9I1/img.png&quot; data-alt=&quot;출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4327a/btrJFOhn4lz/hvUEbvhKmP8kpinfjkY9I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4327a%2FbtrJFOhn4lz%2FhvUEbvhKmP8kpinfjkY9I1%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;78&quot; height=&quot;168&quot; data-origin-width=&quot;78&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660479554465&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# DISTINCT 사용 했을 때
SELECT DISTINCT TITLE FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;73&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLpdH/btrJB2Vp5gh/lLdOCjbK7lG48czDlJb5L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLpdH/btrJB2Vp5gh/lLdOCjbK7lG48czDlJb5L0/img.png&quot; data-alt=&quot;출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLpdH/btrJB2Vp5gh/lLdOCjbK7lG48czDlJb5L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLpdH%2FbtrJB2Vp5gh%2FlLdOCjbK7lG48czDlJb5L0%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;73&quot; height=&quot;124&quot; data-origin-width=&quot;73&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;열 이름 변경하여 표시(AS)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 릴레이션에서 속성 이름을 변경하여 표시&lt;/p&gt;
&lt;pre id=&quot;code_1660479607842&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DEPTNO AS 부서번호, DEPTNAME AS 부서이름 FROM DEPARTMENT&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XPOKq/btrJGUazp1d/hYdsyh5pgfaVStFOKSRljK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XPOKq/btrJGUazp1d/hYdsyh5pgfaVStFOKSRljK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XPOKq/btrJGUazp1d/hYdsyh5pgfaVStFOKSRljK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXPOKq%2FbtrJGUazp1d%2FhYdsyh5pgfaVStFOKSRljK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;97&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660479720095&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT SUM(SALARY) AS 총급여, AVG(SALARY) AS 평균급여
FROM EMPLOYEE;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwmKC/btrJB3mycym/TJVaB7DaEkasdbtlI4uFN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwmKC/btrJB3mycym/TJVaB7DaEkasdbtlI4uFN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwmKC/btrJB3mycym/TJVaB7DaEkasdbtlI4uFN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwmKC%2FbtrJB3mycym%2FTJVaB7DaEkasdbtlI4uFN0%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;275&quot; height=&quot;50&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;조건 부여 및 여러 연산자의 사용&lt;/h2&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;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE절의 조건을 만족하는 튜플들만 검색&lt;/li&gt;
&lt;li&gt;숫자 이외의 상수는 단일 인용기호 (')로 에워싸야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660479821989&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM DEPARTMENT WHERE DNO = 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv0F9U/btrJD30mpBy/k6YlA2PKmpThDFUsq0ciSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv0F9U/btrJD30mpBy/k6YlA2PKmpThDFUsq0ciSk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv0F9U/btrJD30mpBy/k6YlA2PKmpThDFUsq0ciSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv0F9U%2FbtrJD30mpBy%2Fk6YlA2PKmpThDFUsq0ciSk%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;506&quot; height=&quot;87&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660479865707&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM EMPLOYEE
WHERE SALARY &amp;gt;= 3000000;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xiAe7/btrJGU2InB5/xACa8Y3tLCwp756A4Uk3z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xiAe7/btrJGU2InB5/xACa8Y3tLCwp756A4Uk3z0/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xiAe7/btrJGU2InB5/xACa8Y3tLCwp756A4Uk3z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxiAe7%2FbtrJGU2InB5%2FxACa8Y3tLCwp756A4Uk3z0%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;503&quot; height=&quot;107&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자열의 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LIKE&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIKE 비교연산자는 문자열의 일부에 대하여 비교 조건을 명시&lt;/li&gt;
&lt;li&gt;LIKE 연산자는 도메인이 문자열 타입인 속성에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660479981304&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, TITLE, DNO
FROM EMPLOYEE
WHERE EMPNAME LIKE '이%';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekiQI8/btrJKsR9Hb2/TUG8KKdXpqz8PxfkRg5GwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekiQI8/btrJKsR9Hb2/TUG8KKdXpqz8PxfkRg5GwK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekiQI8/btrJKsR9Hb2/TUG8KKdXpqz8PxfkRg5GwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekiQI8%2FbtrJKsR9Hb2%2FTUG8KKdXpqz8PxfkRg5GwK%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;251&quot; height=&quot;65&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;65&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;LIKE 부정은 NOT LIKE&lt;/p&gt;
&lt;pre id=&quot;code_1660480023753&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, TITLE, DNO
FROM EMPLOYEE
WHERE EMPNAME NOT LIKE '이%';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcIT2n/btrJKZWBkKM/S9FmniPwPSwLrrkLqvKNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcIT2n/btrJKZWBkKM/S9FmniPwPSwLrrkLqvKNI1/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcIT2n/btrJKZWBkKM/S9FmniPwPSwLrrkLqvKNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcIT2n%2FbtrJKZWBkKM%2FS9FmniPwPSwLrrkLqvKNI1%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;252&quot; height=&quot;116&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴 매칭에 사용되는 기호들&lt;/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: 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;_&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;한_ (한종, 한1, 한2...)&lt;/td&gt;
&lt;/tr&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;한% (한종진, 한, 한123,...)&lt;/td&gt;
&lt;/tr&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;한[AB] (한A, 한B)&lt;/td&gt;
&lt;/tr&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;L[^O]VE (LAVE, LIVE)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1660480183518&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DEPTNO, DEPTNAME FROM DEPARTMENT
WHERE DEPTNAME LIKE '기_';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YQgES/btrJBcQYC1y/eqHc3iTpnWFZq9Yc8yIat0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YQgES/btrJBcQYC1y/eqHc3iTpnWFZq9Yc8yIat0/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YQgES/btrJBcQYC1y/eqHc3iTpnWFZq9Yc8yIat0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYQgES%2FbtrJBcQYC1y%2FeqHc3iTpnWFZq9Yc8yIat0%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;169&quot; height=&quot;42&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용 예시들&lt;/h4&gt;
&lt;pre id=&quot;code_1660480254166&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE LIKE '[과부]%';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;164&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV7Lss/btrJB37S7TY/thVgQGa6Tvz3PPempAwANk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV7Lss/btrJB37S7TY/thVgQGa6Tvz3PPempAwANk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV7Lss/btrJB37S7TY/thVgQGa6Tvz3PPempAwANk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV7Lss%2FbtrJB37S7TY%2FthVgQGa6Tvz3PPempAwANk%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;164&quot; height=&quot;128&quot; data-origin-width=&quot;164&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1660480285337&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE LIKE '[^과부]%';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmdEec/btrJFOn8u7W/V8gDASrv4ZJiWUID4uu4v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmdEec/btrJFOn8u7W/V8gDASrv4ZJiWUID4uu4v1/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmdEec/btrJFOn8u7W/V8gDASrv4ZJiWUID4uu4v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmdEec%2FbtrJFOn8u7W%2FV8gDASrv4ZJiWUID4uu4v1%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;172&quot; height=&quot;129&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;129&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다수의 검색 조건&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE절에 여러 조건들을 논리 연산자로 결합해 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자의 우선 순위&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;비교 연산자&lt;/li&gt;
&lt;li&gt;NOT&lt;/li&gt;
&lt;li&gt;AND&lt;/li&gt;
&lt;li&gt;OR&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못 사용된 예&lt;/p&gt;
&lt;pre id=&quot;code_1660480404009&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT FLOOR
FROM DEPARTMENT
WHERE DEPTNAME = '영업' AND DEPTNAME = '개발';&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;size18&quot;&gt;부울 연산자 사용&lt;/p&gt;
&lt;pre id=&quot;code_1660480482555&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 직급이 과장이면서 1번 부서에 근무하는 사원들의 이름과 급여를 검색
SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KO050/btrJGVN5D3i/KpPJeFSKHlL8Dn3HzsmHNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KO050/btrJGVN5D3i/KpPJeFSKHlL8Dn3HzsmHNk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KO050/btrJGVN5D3i/KpPJeFSKHlL8Dn3HzsmHNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKO050%2FbtrJGVN5D3i%2FKpPJeFSKHlL8Dn3HzsmHNk%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;274&quot; height=&quot;48&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비교 연산자 사용&lt;/p&gt;
&lt;pre id=&quot;code_1660480535392&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM EMPLOYEE WHERE SALARY &amp;gt; 2500000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 연산자와 논리 연산자 사용&lt;/p&gt;
&lt;pre id=&quot;code_1660480569638&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM EMPLOYEE
WHERE TITLE = '과장' AND SALARY &amp;gt; 2500000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부정 검색 조건, 사용자가 원하지 않는 튜플 제외&lt;/p&gt;
&lt;pre id=&quot;code_1660480635270&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 직급이 과장이면서 1번 부서에 근무하지 않는 사원들의 이름과 급여를 검색
SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO &amp;lt;&amp;gt; 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xA13D/btrJFOBFJxx/5WPXkALkNrFounD7eV5c51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xA13D/btrJFOBFJxx/5WPXkALkNrFounD7eV5c51/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xA13D/btrJFOBFJxx/5WPXkALkNrFounD7eV5c51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxA13D%2FbtrJFOBFJxx%2F5WPXkALkNrFounD7eV5c51%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;172&quot; height=&quot;46&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;46&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;범위를 사용한 검색&lt;/h4&gt;
&lt;pre id=&quot;code_1660480723867&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 급여가 3000000원 이상이고 4500000원 이하인 사원들의 이름, 직급, 급여를 검색

SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 4500000;

SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY &amp;gt;= 3000000 AND SALARY &amp;lt;= 4500000;&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;리스트를 사용한 검색&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집합연산자 IN은 리스트내의 값과 비교&lt;/p&gt;
&lt;pre id=&quot;code_1660480783648&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1번 부서나 3번 부서에 소속된 사원들의 모든 정보를 검색

SELECT *
FROM EMPLOYEE
WHERE DNO IN (1,3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vsHRa/btrJHefrG7G/vugIMfzOmXhKbNLNLWDKYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vsHRa/btrJHefrG7G/vugIMfzOmXhKbNLNLWDKYk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vsHRa/btrJHefrG7G/vugIMfzOmXhKbNLNLWDKYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvsHRa%2FbtrJHefrG7G%2FvugIMfzOmXhKbNLNLWDKYk%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;501&quot; height=&quot;99&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;99&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;IN 연산자의 부정&amp;nbsp; &amp;nbsp;NOT IN&lt;/p&gt;
&lt;pre id=&quot;code_1660480851832&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 직급이 과장, 부장이 아닌 모든 사원 정보 검색

SELECT *
FROM EMPLOYEE
WHERE TITLE NOT IN ('과장', '부장');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRwqUm/btrJEKM3fpA/7U9IKDFDZCHMAbUspicvpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRwqUm/btrJEKM3fpA/7U9IKDFDZCHMAbUspicvpk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRwqUm/btrJEKM3fpA/7U9IKDFDZCHMAbUspicvpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRwqUm%2FbtrJEKM3fpA%2F7U9IKDFDZCHMAbUspicvpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;100&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SELECT절에서 산술 연산자(+, -, *, /) 사용&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT에 산술 연산자를 사용 수식을 표현&lt;/li&gt;
&lt;li&gt;실제 테이블 튜플이 변경되지는 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660480935621&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 직급이 과장인 사원들의 이름과 현재 급여, 10% 인상된 급여를 검색

SELECT EMPNAME, SALARY, SALARY * 1.1 AS NEWSALARY
FROM EMPLOYEE
WHERE TITLE = '과장';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kE3DG/btrJFOIqI2c/KNEVEgRBTRT6nX8ckQoZ6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kE3DG/btrJFOIqI2c/KNEVEgRBTRT6nX8ckQoZ6k/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kE3DG/btrJFOIqI2c/KNEVEgRBTRT6nX8ckQoZ6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkE3DG%2FbtrJFOIqI2c%2FKNEVEgRBTRT6nX8ckQoZ6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;64&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;64&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NULL 값의 검색&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL 값과 다른 값을 +, -등을 사용하여 연산하면 결과는 NULL이 됨&lt;/li&gt;
&lt;li&gt;COUNT(*)를 제외한 집단 함수들은 NULL 값을 무시함&lt;/li&gt;
&lt;li&gt;특정 속성에 들어 있는 값이 NULL인가 비교하기 위해서 'DNO=NULL'를 사용해선 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1660481031266&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 금지
SELECT EMPNO, EMPNAME
FROM EMPLOYEE
WHERE DNO = NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NULL값의 비교 연산자는 'IS NULL'&lt;/p&gt;
&lt;pre id=&quot;code_1660481062698&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNO, EMPNAME
FROM EMPLOYEE
WHERE DNO IS NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IcN5n/btrJC4kWF43/cEYXwtKemvcodSx19fixYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IcN5n/btrJC4kWF43/cEYXwtKemvcodSx19fixYk/img.png&quot; data-alt=&quot;모두 FALSE 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IcN5n/btrJC4kWF43/cEYXwtKemvcodSx19fixYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIcN5n%2FbtrJC4kWF43%2FcEYXwtKemvcodSx19fixYk%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;136&quot; height=&quot;160&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모두 FALSE 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SALARY가 NULL인 튜플은 검색되지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1660481127918&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE SALARY &amp;lt; 2000000 OR SALARY &amp;gt;= 2000000;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDmiq6/btrJCmFlqOk/nHivgyTDmbwij35ODx0ci0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDmiq6/btrJCmFlqOk/nHivgyTDmbwij35ODx0ci0/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDmiq6/btrJCmFlqOk/nHivgyTDmbwij35ODx0ci0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDmiq6%2FbtrJCmFlqOk%2FnHivgyTDmbwij35ODx0ci0%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;174&quot; height=&quot;141&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;141&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;SALARY가 NULL인 튜플 검색하려면&lt;/p&gt;
&lt;pre id=&quot;code_1660481183546&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNAME, SALARY
FROM EMPLOYEE
WHERE SALARY &amp;lt; 2000000 OR SALARY &amp;gt;= 2000000 OR SALARY IS NULL;&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;NULL 값의 검색&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbq7N/btrJGUuTzkM/JeFGQQAXu2oxNkkzfafXf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbq7N/btrJGUuTzkM/JeFGQQAXu2oxNkkzfafXf1/img.png&quot; data-alt=&quot;UNKNOWN에 대한 OR 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbq7N/btrJGUuTzkM/JeFGQQAXu2oxNkkzfafXf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frbq7N%2FbtrJGUuTzkM%2FJeFGQQAXu2oxNkkzfafXf1%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;499&quot; height=&quot;90&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UNKNOWN에 대한 OR 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ85L2/btrJD3e5ULG/2kjklmRzosatJycxQGSkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ85L2/btrJD3e5ULG/2kjklmRzosatJycxQGSkq0/img.png&quot; data-alt=&quot;UNKNOWN에 대한 AND 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ85L2/btrJD3e5ULG/2kjklmRzosatJycxQGSkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ85L2%2FbtrJD3e5ULG%2F2kjklmRzosatJycxQGSkq0%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;499&quot; height=&quot;88&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UNKNOWN에 대한 AND 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xiHdy/btrJFO2J6Ob/kjGqnDUU4ojFUkT7b18u41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xiHdy/btrJFO2J6Ob/kjGqnDUU4ojFUkT7b18u41/img.png&quot; data-alt=&quot;UNKNOWN에 대한 NOT 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xiHdy/btrJFO2J6Ob/kjGqnDUU4ojFUkT7b18u41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxiHdy%2FbtrJFO2J6Ob%2FkjGqnDUU4ojFUkT7b18u41%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;252&quot; height=&quot;85&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UNKNOWN에 대한 NOT 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>ALIAS</category>
      <category>in</category>
      <category>Like</category>
      <category>null</category>
      <category>select</category>
      <category>검색</category>
      <category>별칭</category>
      <category>상수</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/152</guid>
      <comments>https://okdone.tistory.com/152#entry152comment</comments>
      <pubDate>Sun, 14 Aug 2022 21:49:35 +0900</pubDate>
    </item>
    <item>
      <title>연결구조, 연결리스트, 단일 연결리스트</title>
      <link>https://okdone.tistory.com/151</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;연결리스트(linked list)&lt;/h2&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형리스트(ordered list)의 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원소들간의 논리적 관계가 순차적으로 인접해 있는 자료구조의 배열을 이용한 구현함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 85.1162%; height: 73px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8644%;&quot;&gt;배열의 적합성&lt;/td&gt;
&lt;td style=&quot;width: 75.1356%;&quot;&gt;- 주기억장치의 물리적인 구조가 인접되게 구성됨&lt;br /&gt;- 순차적인 기억장소의 표현은 임의의 원소를 탐색하거나 스택이나 큐를 사용할 경우 자료의 삽입/삭제 등의 작업에 효율적임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.8644%;&quot;&gt;배열의 부적합성&lt;/td&gt;
&lt;td style=&quot;width: 75.1356%;&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;h3 data-ke-size=&quot;size23&quot;&gt;연결리스트 자료구조의 특징&lt;/h3&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;/li&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열 구조와 연결리스트 구조의 표현&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 37px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.9302%; height: 20px;&quot;&gt;배열 구조&lt;/td&gt;
&lt;td style=&quot;width: 84.0698%; height: 20px;&quot;&gt;- 계산주소방법에 의해 배열 원소의 위치를 파악할 수 있음&lt;br /&gt;- 순차적인 원소간의 관계에 대한 정보가 필요 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 15.9302%; height: 17px;&quot;&gt;연결리스트 구조&lt;/td&gt;
&lt;td style=&quot;width: 84.0698%; height: 17px;&quot;&gt;- 순차 리스트의 원소를 찾기 위해 다음 원소에 대한 정보가 필요함(포인터 변수 이용, 추가 기억공간 요구)&lt;br /&gt;- 배열(임의처리, 직접처리)과 달리 임의의 원소를 처리하지 못하기 때문에 처음부터 연결을 따라 추적해야함(시간소요)&lt;br /&gt;- 포인터를 사용함으로써 노드의 삽입/삭제가 용이함&lt;br /&gt;- 연속적인 기억공간이 없어도 저장이 가능함&lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;연결리스트의 표현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터와 연결(link) 정보를 저장하기 위한 기억공간이 필요함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 값 - 항목이 n개인 데이터 필드(1 &amp;lt; i &amp;lt; n) - 원소값을 저장 - 저장할 원소의 형태에 따라 하나 이상의 필드로 구성 가능&lt;/li&gt;
&lt;li&gt;연결 값 - 항목이 n개의 연결 필드(1 &amp;lt; i &amp;lt; n) - 다음 노드의 주소를 저장하고 포인터 변수를 사용하여 주소 값을 저장, 하나 이상의 연결로 구성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8Gtz9/btrI2dJRQvy/cNvctsvkkMgG3jnK8huMnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8Gtz9/btrI2dJRQvy/cNvctsvkkMgG3jnK8huMnk/img.png&quot; data-alt=&quot;논리적 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8Gtz9/btrI2dJRQvy/cNvctsvkkMgG3jnK8huMnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8Gtz9%2FbtrI2dJRQvy%2FcNvctsvkkMgG3jnK8huMnk%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;526&quot; height=&quot;148&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;논리적 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선형리스트와 연결리스트 구조의 물리적 저장 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요일 리스트 : week = (월,화,수,목,금,토,일)&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;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b11JfT/btrI4WmMMgP/EkrrFfzeJ5MTikGmcJKSGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b11JfT/btrI4WmMMgP/EkrrFfzeJ5MTikGmcJKSGK/img.png&quot; data-alt=&quot;물리적 저장 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b11JfT/btrI4WmMMgP/EkrrFfzeJ5MTikGmcJKSGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb11JfT%2FbtrI4WmMMgP%2FEkrrFfzeJ5MTikGmcJKSGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;299&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;299&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동적 기억장소의 할당/해제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동적 기억장소의 할당&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동적 기억장소 할당 함수 - malloc()&lt;/h4&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;/li&gt;
&lt;li&gt;삽입/삭제 시 원소 이동이 없음&lt;/li&gt;
&lt;li&gt;포인터를 이용하여 노드를 동적으로 생성하므로 기억장소를 미리 확보할 필요 없음&lt;/li&gt;
&lt;li&gt;기억장소의 크기는 일정한 크기로 제한되어 있기 때문에 malloc() 함수를 사용하여 동적 기억장소를 무한히 할당하여 사용하지는 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수 원형 - void * malloc(size_t size);&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적 기억장소로 사용되는 힙(heap)으로부터 원하는 크기의 바이트를 할당 해주는 함수(&amp;lt;alloc.h&amp;gt;)&lt;/li&gt;
&lt;li&gt;정상적으로 기억장소를 할당하는 경우에는 기억장소의 주소를 반환하고 비정상적인 경우에는 NULL을 반환함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659844971240&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *pt;
pt = (int *) malloc(10);
pt = (int *) malloc(15*sizeof(int)); // 15개의 int를 위한 기억 장소를
// 할당해 그 시작 주소값을 반환함&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동적 기억장소의 해제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동적 기억장소의 해제 함수 - free()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수 원형 - void free(void *) : 할당된 기억 장소를 해제하여 힙(heap)에 반환함(&amp;lt;alloc.h&amp;gt;)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동적 기억장소의 할당과 해제의 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- malloc ()와 free () 함수를 사용한 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659847290605&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/malloc/malloc_free.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Y6AiL/hyPl87JrGe/p8E7KeB8P4edz0aE8Y7SK1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/malloc/malloc_free.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/malloc/malloc_free.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Y6AiL/hyPl87JrGe/p8E7KeB8P4edz0aE8Y7SK1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h3 data-ke-size=&quot;size23&quot;&gt;자유 공간리스트(free space list)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하기 전의 메모리나 사용이 끝난 메모리를 관리하기 위해 노드로 구성하여 연결한 리스트(리스트가 다 소모되어 없을 때는 malloc()을 사용)를 말함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcdrb/btrI9mrwlKt/ZZ0cuEV6o4x2bQJxQ7q5D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcdrb/btrI9mrwlKt/ZZ0cuEV6o4x2bQJxQ7q5D0/img.png&quot; data-alt=&quot;자유 공간리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcdrb/btrI9mrwlKt/ZZ0cuEV6o4x2bQJxQ7q5D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftcdrb%2FbtrI9mrwlKt%2FZZ0cuEV6o4x2bQJxQ7q5D0%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;399&quot; height=&quot;61&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자유 공간리스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노드의 할당과 반환 알고리즘&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o9V4N/btrI6rz6uGZ/biATSnfnDekXCc4JDIHXA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o9V4N/btrI6rz6uGZ/biATSnfnDekXCc4JDIHXA1/img.png&quot; data-alt=&quot;자유 공간리스트 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o9V4N/btrI6rz6uGZ/biATSnfnDekXCc4JDIHXA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo9V4N%2FbtrI6rz6uGZ%2FbiATSnfnDekXCc4JDIHXA1%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;416&quot; height=&quot;214&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자유 공간리스트 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxwIgw/btrI6qHY1Py/GD7WlgfbQpb4tJFqUnKueK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxwIgw/btrI6qHY1Py/GD7WlgfbQpb4tJFqUnKueK/img.png&quot; data-alt=&quot;자유 공간리스트 새로운 노드 할당 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxwIgw/btrI6qHY1Py/GD7WlgfbQpb4tJFqUnKueK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxwIgw%2FbtrI6qHY1Py%2FGD7WlgfbQpb4tJFqUnKueK%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;482&quot; height=&quot;346&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자유 공간리스트 새로운 노드 할당 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVJ7R4/btrI9mdXQfm/rJ0y3LEZkyH9ky0UmKpwy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVJ7R4/btrI9mdXQfm/rJ0y3LEZkyH9ky0UmKpwy1/img.png&quot; data-alt=&quot;자유 공간리스트 반환 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVJ7R4/btrI9mdXQfm/rJ0y3LEZkyH9ky0UmKpwy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVJ7R4%2FbtrI9mdXQfm%2FrJ0y3LEZkyH9ky0UmKpwy1%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;481&quot; height=&quot;344&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;344&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단일 연결리스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결리스트 자료구조의 종류&lt;/h3&gt;
&lt;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;h3 data-ke-size=&quot;size23&quot;&gt;단일 연결리스트의 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드가 하나의 연결 필드에 의해서 다음 노드와 연결되는 구조를 가진 연결리스트를 의미함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드 구조 - 데이터 필드와 1개의 연결 필드로 구성됨&lt;/li&gt;
&lt;li&gt;자료 탐색은 한 방향으로만 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5K3G7/btrI9mE3aRQ/OnjLoECBFsV1YKH7WS3JHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5K3G7/btrI9mE3aRQ/OnjLoECBFsV1YKH7WS3JHk/img.png&quot; data-alt=&quot;단일 연결리스트 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5K3G7/btrI9mE3aRQ/OnjLoECBFsV1YKH7WS3JHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5K3G7%2FbtrI9mE3aRQ%2FOnjLoECBFsV1YKH7WS3JHk%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;391&quot; height=&quot;59&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단일 연결리스트 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단일 연결리스트 ADT&lt;/h4&gt;
&lt;pre id=&quot;code_1659848266169&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT Linkedlist
데이터
0개 이상의 노드를 가진 유한순서 리스트(Element는 데이터 값)
연산자 및 연산내용 // L&amp;isin;Linkedlist, n&amp;isin;node, p&amp;isin;position,
linkedlist() //연결리스트를 생성
~linkedlist() //연결리스트를 소멸
Element search(L, n) //연결리스트에서 주어진 노드 n을 탐색
Linkedlist insert(L, n) //연결리스트에 주어진 노드 n을 삽입
int remove(L, n) //연결리스트에서 주어진 노드 n을 삭제
remove_all(L) //연결리스트의 모든 노드를 삭제
position get_data(L, p) //p가 가리키는 현재 노드의 데이터를 출력
position get_nextnode(L, p) //p가 가리키는 현재 노드의 다음 노드를 출력
Element display() //연결리스트의 모든 노드를 출력
End Linkedlist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;노드의 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체를 이용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVCUu/btrI7LrySpy/5FV6MjYrKucwCu41g9GUB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVCUu/btrI7LrySpy/5FV6MjYrKucwCu41g9GUB0/img.png&quot; data-alt=&quot;구조체 노드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVCUu/btrI7LrySpy/5FV6MjYrKucwCu41g9GUB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVCUu%2FbtrI7LrySpy%2F5FV6MjYrKucwCu41g9GUB0%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;471&quot; height=&quot;114&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구조체 노드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 항목을 참조하는 방법&lt;/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;직접참조연산자(.), 간접참조연산자(-&amp;gt;)&lt;/li&gt;
&lt;li&gt;struct list node(단순 구조체 변수), struct list *nodeptr(포인터형 구조체 변수);&lt;/li&gt;
&lt;li&gt;node.data = &quot;100&quot;;&lt;/li&gt;
&lt;li&gt;nodeptr -&amp;gt; data = &quot;100&quot;;&lt;/li&gt;
&lt;li&gt;(*nodeptr).data = &quot;100&quot;; // 구조체 포인터를 역참조한 뒤 .으로 멤버에 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659849120134&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/create_node.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4EB75/hyPkHYdexA/jnsQrkmCx2pXFjoVqyxQL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/create_node.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/create_node.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4EB75/hyPkHYdexA/jnsQrkmCx2pXFjoVqyxQL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h3 data-ke-size=&quot;size23&quot;&gt;단일 연결리스트의 노드 탐색&lt;/h3&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드의 삽입/삭제 시 특정 노드를 찾고자 할 때 리스트의 노드를 처음부터 하나씩 순회하면서 노드의 데이터 필드 값과 x(찾고자 하는 노드)를 비교하여 일치하는 노드를 찾을 필요가 있음&lt;/p&gt;
&lt;pre id=&quot;code_1659849192592&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;searchNode(L, x){
temp = L; //최초 노드를 가리키기 위한 초기화
	while (temp != NULL){ //temp가 NULL이면 찾는 원소가 없음
		if (temp-&amp;gt;data == x) return temp;
			temp = temp-&amp;gt;link;
	}
	return temp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXb7j2/btrI4VVLSQ8/ZctjqQ3uugbkfPwYZnrr7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXb7j2/btrI4VVLSQ8/ZctjqQ3uugbkfPwYZnrr7k/img.png&quot; data-alt=&quot;노드의 탐색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXb7j2/btrI4VVLSQ8/ZctjqQ3uugbkfPwYZnrr7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXb7j2%2FbtrI4VVLSQ8%2FZctjqQ3uugbkfPwYZnrr7k%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;453&quot; height=&quot;96&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드의 탐색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노드의 삽입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 노드로 삽입하는 알고리즘&lt;/p&gt;
&lt;pre id=&quot;code_1659849566401&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insertFirstNode(L, x){
new = getNode(); //ⓐ 자유 공간리스트에서 새로운 노드 공간을 할당
new-&amp;gt;data = x; //ⓑ 새 노드의 데이터 필드에 x를 저장
new-&amp;gt;link = L; //ⓒ
L = new; //ⓓ}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BZwtj/btrI2dpyEu2/w1bP4ZoMhFu8FekcdY2jaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BZwtj/btrI2dpyEu2/w1bP4ZoMhFu8FekcdY2jaK/img.png&quot; data-alt=&quot;노드 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BZwtj/btrI2dpyEu2/w1bP4ZoMhFu8FekcdY2jaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBZwtj%2FbtrI2dpyEu2%2Fw1bP4ZoMhFu8FekcdY2jaK%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;479&quot; height=&quot;226&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;226&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;중간 노드(pre가 가리키는 다음 노드)로 삽입하는 알고리즘&lt;/p&gt;
&lt;pre id=&quot;code_1659849616892&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insertMiddleNode(L, pre, x){
	new = getNode();
	new-&amp;gt;data = x;
	if (L == NULL){ //ⓐ L이 공백 리스트인 경우
		L = new; // ⓑ
		new-&amp;gt;link = NULL; //ⓒ
	}
	else{ // L이 공백 리스트가 아닌 경우
		pre = L; //ⓓ
		new-&amp;gt;link = pre-&amp;gt;link; //ⓔ
		pre-&amp;gt;link = new; //ⓕ}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TjvUH/btrI4UCxopF/9Kx1W4fJNyirN5GZ89m8v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TjvUH/btrI4UCxopF/9Kx1W4fJNyirN5GZ89m8v1/img.png&quot; data-alt=&quot;노드 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TjvUH/btrI4UCxopF/9Kx1W4fJNyirN5GZ89m8v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTjvUH%2FbtrI4UCxopF%2F9Kx1W4fJNyirN5GZ89m8v1%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;94&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGn5uK/btrI2wPWtPi/FwA8BnwssikWk0osx1od2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGn5uK/btrI2wPWtPi/FwA8BnwssikWk0osx1od2k/img.png&quot; data-alt=&quot;노드의 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGn5uK/btrI2wPWtPi/FwA8BnwssikWk0osx1od2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGn5uK%2FbtrI2wPWtPi%2FFwA8BnwssikWk0osx1od2k%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;416&quot; height=&quot;330&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드의 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbsusB/btrI3tea2SV/iNZBdjNFXT8GEy0gseSt2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbsusB/btrI3tea2SV/iNZBdjNFXT8GEy0gseSt2k/img.png&quot; data-alt=&quot;노드의 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbsusB/btrI3tea2SV/iNZBdjNFXT8GEy0gseSt2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbsusB%2FbtrI3tea2SV%2FiNZBdjNFXT8GEy0gseSt2k%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;464&quot; height=&quot;279&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;279&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노드의 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 pre가 가리키는 노드의 다음 노드를 삭제하는 알고리즘&lt;/p&gt;
&lt;pre id=&quot;code_1659849934818&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deleteNode(L, pre){
	if (L == NULL) error;
	else{
		old = pre-&amp;gt;link; //ⓐ
		if (old == NULL) return;
		pre-&amp;gt;link = old-&amp;gt;link; //ⓑ}
	return Node(old);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvHlo/btrI2cK0zuq/GeRpo1OVydJOJyGDk38970/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvHlo/btrI2cK0zuq/GeRpo1OVydJOJyGDk38970/img.png&quot; data-alt=&quot;노드 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvHlo/btrI2cK0zuq/GeRpo1OVydJOJyGDk38970/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrvHlo%2FbtrI2cK0zuq%2FGeRpo1OVydJOJyGDk38970%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;445&quot; height=&quot;173&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노드의 생성과 출력 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 연결리스트의 생성과 노드들의 출력 프로그램&lt;/p&gt;
&lt;figure id=&quot;og_1659851936948&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/insert_delete_node.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMfdNZ/hyPkE1wDHp/4kmtWauQockMn6tgRsLK3K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/insert_delete_node.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/single_linked_list/insert_delete_node.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMfdNZ/hyPkE1wDHp/4kmtWauQockMn6tgRsLK3K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>23년 이전 글/자료구조</category>
      <category>구조체</category>
      <category>노드</category>
      <category>단일</category>
      <category>동적 할당</category>
      <category>삭제</category>
      <category>삽입</category>
      <category>연결구조</category>
      <category>연결리스트</category>
      <category>자유 공간리스트</category>
      <category>해제</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/151</guid>
      <comments>https://okdone.tistory.com/151#entry151comment</comments>
      <pubDate>Sun, 7 Aug 2022 11:35:24 +0900</pubDate>
    </item>
    <item>
      <title>큐, 우선순위 큐, 데크</title>
      <link>https://okdone.tistory.com/150</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;큐의 응용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;응용 분야&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FIFO 구조, 즉 먼저 요청한 작업에 대해 먼저 처리해주는 형태로 동작하는 큐의 특징을 직간접적으로 다양한 분야에 응용할 수 있음&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;실시간 시스템에서 인터럽트를 제어(first come firsst served)하는데 사용함&lt;/li&gt;
&lt;li&gt;통신에서 데이터 패킷들의 모델링, 콜센터의 고객응대 시스템 등에서 사용함&lt;/li&gt;
&lt;li&gt;프로그래머의 도구 및 많은 알고리즘에서 사용함&lt;/li&gt;
&lt;/ul&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프린터 버퍼 큐(buffer queue)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인쇄 작업에서 cpu에 비해 프린터의 느린 인쇄 작업이 진행 중일 때 기다리지 않고, 다음 데이터를 버퍼 큐(주기억장치 내)에 삽입하여 버퍼 큐에 있는 데이터를 순서대로 출력하게 함 - cpu에서 프린터로 보낸 데이터를 순서대로 프린터에서 출력&lt;/p&gt;
&lt;pre id=&quot;code_1659787736110&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;writeline(){ //CPU 작업
if (출력할 내용이 있음 and 프린터 버퍼가 가득 차 있지 않음 &amp;amp; 프린터 버퍼가
바쁘지 않음)
then 프린터 버퍼 큐에 출력할 내용을 입력
}
readline(){ //프린터 작업
if (프린터 버퍼가 비어있지 않음 and 프린터 버퍼가 바쁘지 않음)
then 프린터 버퍼의 내용을 출력
}&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;스케쥴링 큐(scheduling queue)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케쥴링 정책 - 메모리에 적재된 다수의 프로세스 중 어떤 프로세스에게 자원을 할당할 것인가에 대한 순서를 결정하는 것 =&amp;gt; CPU와 같은 자원의 효율적인 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DJkJO/btrI11BVD9F/e8nO59QYtSyKFRPKyhrf9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DJkJO/btrI11BVD9F/e8nO59QYtSyKFRPKyhrf9K/img.png&quot; data-alt=&quot;스케쥴링 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DJkJO/btrI11BVD9F/e8nO59QYtSyKFRPKyhrf9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDJkJO%2FbtrI11BVD9F%2Fe8nO59QYtSyKFRPKyhrf9K%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;558&quot; height=&quot;283&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;283&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;CPU를 사용하고자 요청하는 프로세스들에 대한 CPU 사용 스케줄을 관리 ( 자원의 할당과 회수, 스케쥴러 역할)을 하기 위해 사용되는 큐를 말함&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;사용하고자 하는 프로세스를 순서대로 준비 큐에 삽입하면 그 순서대로 준비 큐에서꺼내어 CPU를 사용함&lt;/li&gt;
&lt;li&gt;CPU를 사용하던 프로세스가 다른 처리를 기다리는 대기 상태가 되면 대기 큐에 삽입하여 대기 상태의 프로세서들을 순서대로 관리함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b75KWZ/btrI3uRewGU/wecAyzn6ky6WxIFzQ1Mpg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b75KWZ/btrI3uRewGU/wecAyzn6ky6WxIFzQ1Mpg1/img.png&quot; data-alt=&quot;준비 큐, 대기 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b75KWZ/btrI3uRewGU/wecAyzn6ky6WxIFzQ1Mpg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb75KWZ%2FbtrI3uRewGU%2FwecAyzn6ky6WxIFzQ1Mpg1%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;507&quot; height=&quot;187&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;준비 큐, 대기 큐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메시지 큐(message queue)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메시지 형태의 데이터를 넣어두고 FIFO(선입선출) 방식으로 메시지를 추출하여 대상 시스템의 데이터베이스, 파일저장, 응용프로그램 입력 값으로 처리하기 위해 사용된 큐를 말함&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;예를 들어, 사용자가 마우스를 움직이는 경우(사용자가 취한 행동)에 마우스 움직임을 의미하는 메시지인 WM_MOUSEMOVE가 메시지 큐에 저장되며 프로그램은 메시지 루프(메시지를 받아들이는 부분)를 통해 이에 대응하는 처리를 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCMN2/btrI3tx4mBs/V0SARESMafkUCSibCwHork/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCMN2/btrI3tx4mBs/V0SARESMafkUCSibCwHork/img.png&quot; data-alt=&quot;메세지 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCMN2/btrI3tx4mBs/V0SARESMafkUCSibCwHork/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCMN2%2FbtrI3tx4mBs%2FV0SARESMafkUCSibCwHork%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;477&quot; height=&quot;95&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;95&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대기행렬 이론(queueing theory)&lt;/h3&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;/li&gt;
&lt;li&gt;특히 컴퓨터를 이용하여 모의실험을 할 때는 컴퓨터 시뮬레이션이라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기행렬(queue, waiting line)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;은행의 창구, 마트의 계산대, 공항의 입국심사 창구의 수 등에서와 같이 대기행렬에 도착하는 것과 대기하는 것 그리고 서비스 되는 일련의 프로세스들에 대한 모델링에 사용되는 통계적인 이론으로 수학적, 확률적 분석을 가능하게 해줌&lt;/li&gt;
&lt;li&gt;즉 시스템의 평균 대기시간, 서비스의 예측 등을 현재 상태를 기반으로 한 시스템의 확률을 기반으로 하여 성능을 측정하는데 유용하게 활용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;예를 들어, 공항에 도착하는 입국자는 큐로 만든 대기행렬에 순서대로 들어가고, 입국 심사관은 큐에 있는 입국자들을 순서대로 처리하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwhnzo/btrI1iYQTKQ/kpfu7w3OFiSOHOyqll3Nqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwhnzo/btrI1iYQTKQ/kpfu7w3OFiSOHOyqll3Nqk/img.png&quot; data-alt=&quot;대기행렬 기본구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwhnzo/btrI1iYQTKQ/kpfu7w3OFiSOHOyqll3Nqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwhnzo%2FbtrI1iYQTKQ%2Fkpfu7w3OFiSOHOyqll3Nqk%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;562&quot; height=&quot;226&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;226&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;우선순위(다중) 큐&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중큐(multi-queue)는 여러 개의 큐(multiple queue)들로 구성된 자료구조라 할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHWkj4/btrI7LEH2C8/5JoKY9u8a9RX8iFNr0th1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHWkj4/btrI7LEH2C8/5JoKY9u8a9RX8iFNr0th1K/img.png&quot; data-alt=&quot;다중큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHWkj4/btrI7LEH2C8/5JoKY9u8a9RX8iFNr0th1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHWkj4%2FbtrI7LEH2C8%2F5JoKY9u8a9RX8iFNr0th1K%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;549&quot; height=&quot;129&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다중큐&lt;/figcaption&gt;
&lt;/figure&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;원소마다 우선순위(priority)가 존재 =&amp;gt; 보통 key 값으로 우선순위를 표현함&lt;/li&gt;
&lt;li&gt;원소의 우선순위 연산&lt;/li&gt;
&lt;li&gt;큐에 있는 가장 낮은(높은) 우선순위를 갖는 원소를 먼저 처리(삭제)함 - Min Priority Queue, Max Priority Queue&lt;/li&gt;
&lt;li&gt;동일한 우선순위를 갖는 요소가 두 개 이상 =&amp;gt; FIFO 방식으로 처리함&lt;/li&gt;
&lt;/ul&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;/h4&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;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EhDot/btrIYB45Ryt/KZLcyWXt5kihLJoWIRsM2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EhDot/btrIYB45Ryt/KZLcyWXt5kihLJoWIRsM2k/img.png&quot; data-alt=&quot;시간복잡도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EhDot/btrIYB45Ryt/KZLcyWXt5kihLJoWIRsM2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEhDot%2FbtrIYB45Ryt%2FKZLcyWXt5kihLJoWIRsM2k%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;411&quot; height=&quot;62&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시간복잡도&lt;/figcaption&gt;
&lt;/figure&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;힙(heap) - 구현이 어렵지만 연산이 가장 효율적임&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv73ps/btrI7Lrbdwq/r9hE9YJrtB6DNLGhZwVtRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv73ps/btrI7Lrbdwq/r9hE9YJrtB6DNLGhZwVtRk/img.png&quot; data-alt=&quot;큐와 힙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv73ps/btrI7Lrbdwq/r9hE9YJrtB6DNLGhZwVtRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv73ps%2FbtrI7Lrbdwq%2Fr9hE9YJrtB6DNLGhZwVtRk%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;507&quot; height=&quot;150&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;큐와 힙&lt;/figcaption&gt;
&lt;/figure&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;시간복잡도 - O(log N)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐 ADT&lt;/p&gt;
&lt;pre id=&quot;code_1659789868373&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT PriorityQueue
	데이터
	0개 이상의 원소를 가진 유한 순서리스트
	연산자 및 연산내용 // q&amp;isin;PQueue, e&amp;isin;Element
	PQueue createpq() //하나의 공백 우선순위 큐를 생성
	Number currentSize(q) //q의 원소의 수를 반환
	PQueue addpq(q, e) //q에 새로운 원소 e를 rear를 통해 삽입
	Element deletepq(q) //q가 공백이면 underflow, 그렇지 않으면 q로부터
				//가장 작은(큰) 키 값의 원소를 삭제 후 반환
End PriorityQueue&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;우선순위 큐에 있는 원소들의 순서쌍 관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 전체순서(total order)관계가 성립할 경우 =&amp;gt; 우선순위 큐의 모든 원소들은 우선순위에 따라 정렬이 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CPht7/btrIYCiIKBP/Sg9Sjq0z5TGjk62blbmKqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CPht7/btrIYCiIKBP/Sg9Sjq0z5TGjk62blbmKqk/img.png&quot; data-alt=&quot;완전순서관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CPht7/btrIYCiIKBP/Sg9Sjq0z5TGjk62blbmKqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCPht7%2FbtrIYCiIKBP%2FSg9Sjq0z5TGjk62blbmKqk%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;526&quot; height=&quot;261&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전순서관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우선순위 큐(priority queue)의 삽입/삭제&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삽입 알고리즘&lt;/h4&gt;
&lt;pre id=&quot;code_1659825572295&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;addpq(pq, i, e) {
	rear[i] = (rear[i]+1) % n;
    if (front [i] ==rear [i]) queue-full;
    else pq[i] [rear [i] = e;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삭제 알고리즘&lt;/h4&gt;
&lt;pre id=&quot;code_1659825664145&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deletepq(pq, i) {
	if (front[i] ==rear[i]) queue-empty;
    else {
    front[i] = (front[i] + 1) % n;
    e = pq[i] [front[i]];
    return e;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우선순위 큐(priority queue)의 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 배열을 이용한 순차 표현&lt;/p&gt;
&lt;pre id=&quot;code_1659825722046&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char queue[5][5];
int front[5]; //5개의 우선순위 큐에 대한 front 포인터
int rear[5]; //5개의 우선순위 큐에 대한 rear 포인터&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RpsPb/btrI3xUt1oR/BTMoH9gLIKUvs0pKjpScSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RpsPb/btrI3xUt1oR/BTMoH9gLIKUvs0pKjpScSk/img.png&quot; data-alt=&quot;2차원 배열을 활용한 우선순위 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RpsPb/btrI3xUt1oR/BTMoH9gLIKUvs0pKjpScSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRpsPb%2FbtrI3xUt1oR%2FBTMoH9gLIKUvs0pKjpScSk%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;428&quot; height=&quot;159&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차원 배열을 활용한 우선순위 큐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열을 이용한 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원 배열을 이용한 우선순위 큐의 생성/삽입/삭제 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659833012084&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/priority_queue/1D_priority_queue.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kjnEV/hyPkJn6hkb/E4NwAPt3tFPqwtL0lZYxC1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/priority_queue/1D_priority_queue.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/priority_queue/1D_priority_queue.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kjnEV/hyPkJn6hkb/E4NwAPt3tFPqwtL0lZYxC1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;h2 data-ke-size=&quot;size26&quot;&gt;데크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데크(double-ended queue)에서 의미하듯 큐 2개를 반대로 붙여서 만든 자료구조임&lt;/li&gt;
&lt;li&gt;큐와 스택의 중간 정도의 특징을 가지며 두 가지로 분류&lt;/li&gt;
&lt;li&gt;L-pointer(front) =&amp;gt; 데크의 왼쪽 끝을 가리키며, 삽입과 삭제가 이루어짐&lt;/li&gt;
&lt;li&gt;R-pointer(rear) =&amp;gt; 데크의 오른쪽 끝을 가리키며, 삽입과 삭제가 이루어짐&lt;/li&gt;
&lt;li&gt;종류 - scroll(입력제한 데크), shelf(출력제한 데크)&lt;/li&gt;
&lt;li&gt;오버플로우를 방지하기 위해 중앙에서 삽입(이동현상 초래) =&amp;gt; 환형으로 처리가 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dl5eva/btrI1iku0yh/Dhwu8xTwy1hUri1h3lA9C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dl5eva/btrI1iku0yh/Dhwu8xTwy1hUri1h3lA9C1/img.png&quot; data-alt=&quot;데크(deque)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dl5eva/btrI1iku0yh/Dhwu8xTwy1hUri1h3lA9C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdl5eva%2FbtrI1iku0yh%2FDhwu8xTwy1hUri1h3lA9C1%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;352&quot; height=&quot;165&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데크(deque)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데크 ADT&lt;/h4&gt;
&lt;pre id=&quot;code_1659833283492&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT Deque
데이터 0개 이상의 원소를 가진 유한 순서리스트
연산자 및 연산내용 // dq&amp;isin;DQueue, e&amp;isin;Element
DQueue createdq() //하나의 공백 데크를 생성
DQueue addfirstdq(dq, e) //dq의 처음에 새로운 원소e를 삽입
DQueue addlastdq(dq, e) //dq의 끝에 새로운 원소e를 삽입
Boolean isEmpty(dq) //dq가 공백이면 true, 그렇지 않으면 false를 반환
Element deletefirstdq(dq)) //dq가 공백이면 underflow,
								//그렇지 않으면 dq의 처음 원소를 삭제후 반환
Element deletelastdq(dq)) //dq가 공백이면 underflow,
							//그렇지 않으면 dq의끝 원소를 삭제후 반환
Element lastdq(dq)) //dq의끝 원소를 반환
Element firstdq(dq)) //dq의 처음 원소를 반환
End Deque&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데크 구현&lt;/h3&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-origin-width=&quot;413&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SPMVR/btrI2w96Up9/LUxi8NZUW4VtSovMScyib0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SPMVR/btrI2w96Up9/LUxi8NZUW4VtSovMScyib0/img.png&quot; data-alt=&quot;데크 구현 모형&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SPMVR/btrI2w96Up9/LUxi8NZUW4VtSovMScyib0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSPMVR%2FbtrI2w96Up9%2FLUxi8NZUW4VtSovMScyib0%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;413&quot; height=&quot;309&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데크 구현 모형&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOSmy/btrIZ6X89GS/ka2QcdEwXvcFIEtgzr1hik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOSmy/btrIZ6X89GS/ka2QcdEwXvcFIEtgzr1hik/img.png&quot; data-alt=&quot;데크 구현 모형2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOSmy/btrIZ6X89GS/ka2QcdEwXvcFIEtgzr1hik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOSmy%2FbtrIZ6X89GS%2Fka2QcdEwXvcFIEtgzr1hik%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;418&quot; height=&quot;261&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데크 구현 모형2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659839774641&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&quot; data-og-description=&quot;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/deque/1d_2pointer_deque.c&quot; data-og-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXKZv1/hyPkHqiBsM/eiE4kk6zaz34lCFKi9hA61/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/deque/1d_2pointer_deque.c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dlfrnaos19/algorithm_with_c/blob/main/deque/1d_2pointer_deque.c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXKZv1/hyPkHqiBsM/eiE4kk6zaz34lCFKi9hA61/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - dlfrnaos19/algorithm_with_c: learning algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;learning algorithm. Contribute to dlfrnaos19/algorithm_with_c development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/자료구조</category>
      <category>DEQUE</category>
      <category>queue</category>
      <category>데크</category>
      <category>우선순위</category>
      <category>큐</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/150</guid>
      <comments>https://okdone.tistory.com/150#entry150comment</comments>
      <pubDate>Sat, 6 Aug 2022 21:46:13 +0900</pubDate>
    </item>
    <item>
      <title>SQL 개요와 데이터 정의어</title>
      <link>https://okdone.tistory.com/149</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL의 특징&lt;/h3&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;SQL의 표준화 - 상용관계 DBMS간의 전환이 용이, 대화식 질의어로 사용&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;h3 data-ke-size=&quot;size23&quot;&gt;SQL의 수행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관계 DBMS는 사용자가 입력한 SQL문을 번역하여 사용자가 요구한 데이터를 찾는데 필요한 모든 과정을 담당&lt;/li&gt;
&lt;li&gt;데이터베이스 접근 인터페이스&lt;/li&gt;
&lt;li&gt;대화식 SQL(interactive SQL) : 최종 사용자들이 사용&lt;/li&gt;
&lt;li&gt;내포된 SQL(embedded SQL) : 응용 프로그래머가 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3JOSG/btrIXXtGSXe/xkh4yO4ApaCet8L4eYnye0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3JOSG/btrIXXtGSXe/xkh4yO4ApaCet8L4eYnye0/img.png&quot; data-alt=&quot;데이터베이스 접근 인터페이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3JOSG/btrIXXtGSXe/xkh4yO4ApaCet8L4eYnye0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3JOSG%2FbtrIXXtGSXe%2Fxkh4yO4ApaCet8L4eYnye0%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;546&quot; height=&quot;272&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;272&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL의 구성요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 정의어(DDL : Data Definition Language)&lt;/li&gt;
&lt;li&gt;데이터 조작어(DML : Data Manipulation Language)&lt;/li&gt;
&lt;li&gt;데이터 제어어(DCL : Data Control Language)&lt;/li&gt;
&lt;/ul&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;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eshV6v/btrI3tLq9Vb/G5DFTiPJZrrq2pE3pTgdfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eshV6v/btrI3tLq9Vb/G5DFTiPJZrrq2pE3pTgdfk/img.png&quot; data-alt=&quot;SQL의 구성요소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eshV6v/btrI3tLq9Vb/G5DFTiPJZrrq2pE3pTgdfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeshV6v%2FbtrI3tLq9Vb%2FG5DFTiPJZrrq2pE3pTgdfk%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;836&quot; height=&quot;261&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL의 구성요소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 정의어(DDL : Data Definition Language)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;relation, 뷰, 인덱스의 생성, 제거, 변경 등의 작업을 수행&lt;/li&gt;
&lt;li&gt;relation 생성시 무결성 제약조건 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 제어어(DCL : Data Control Language)&lt;/h4&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;동시성 제어(Lock 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 조작어(DML : Data Manipulation Language)&lt;/h4&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;튜플 검색 (SELECT), 튜플 삽입(INSERT)&lt;/li&gt;
&lt;li&gt;튜플 삭제 (DELETE), 속성 값의 변경(UPDATE)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUv2ON/btrI3up3gm2/Krmbrdn5uHebk3j6gm7M60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUv2ON/btrI3up3gm2/Krmbrdn5uHebk3j6gm7M60/img.png&quot; data-alt=&quot;데이터 조작어의 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUv2ON/btrI3up3gm2/Krmbrdn5uHebk3j6gm7M60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUv2ON%2FbtrI3up3gm2%2FKrmbrdn5uHebk3j6gm7M60%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;663&quot; height=&quot;314&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;314&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 정의어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 정의어 종류&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wPwuJ/btrI4UIOsrv/t70LE75PhKLp6ZvQAe3On0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wPwuJ/btrI4UIOsrv/t70LE75PhKLp6ZvQAe3On0/img.png&quot; data-alt=&quot;데이터 정의어 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wPwuJ/btrI4UIOsrv/t70LE75PhKLp6ZvQAe3On0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwPwuJ%2FbtrI4UIOsrv%2Ft70LE75PhKLp6ZvQAe3On0%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;744&quot; height=&quot;443&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;443&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스키마의 생성과 제거&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;relation, 도메인, 제약조건, 뷰, 권한 등을 그룹화하기 위해서 스키마 개념을 지원&lt;/li&gt;
&lt;li&gt;권한을 부여 받지 못한 사용자는 스키마에 접근할 수 없음&lt;/li&gt;
&lt;li&gt;&quot;KIM&quot;이라는 사용자가 'MY_DB'라는 스키마를 생성(CREATE SCHEMA MY_DB AUTHORIZATION KIM;&lt;/li&gt;
&lt;li&gt;스키마 제거(DROP SCHEMA MY_DB RESTRICT;) (DROP SCHEMA MY_DB CASCADE;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테이블 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1659774675917&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE 테이블_이름
( { 열_이름 데이터_형식
			[NOT NULL]
			[UNIQUE]
			[DEFAULT 기본값]
			[CHECK 체크조건]
	}
	[PRIMARY KEY(열_이름)]
	[FOREIGN KEY(열_이름) REFERENCES 테이블_이름(열_이름) ]
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입(도메인 타입) - SQL92&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckGvck/btrI1PBEml0/oPYEbdOVmeMpXe1ZXwhlSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckGvck/btrI1PBEml0/oPYEbdOVmeMpXe1ZXwhlSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckGvck/btrI1PBEml0/oPYEbdOVmeMpXe1ZXwhlSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckGvck%2FbtrI1PBEml0%2FoPYEbdOVmeMpXe1ZXwhlSK%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;746&quot; height=&quot;432&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;열의 데이터 타입 결정시 고려사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;숫자인지 문자인지 먼저 결정,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문자&lt;/b&gt;라면 &lt;b&gt;고정길이&lt;/b&gt; 인지 &lt;b&gt;가변길이&lt;/b&gt; 인지, &lt;b&gt;최대 길이&lt;/b&gt; 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;숫자&lt;/b&gt;라면 &lt;b&gt;정수&lt;/b&gt; 또는 &lt;b&gt;실수&lt;/b&gt;, &lt;b&gt;최대 길이&lt;/b&gt;, &lt;b&gt;소수점 아래 개수&lt;/b&gt; 특정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;도메인 정의&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 Attribute에 데이터 타입을 직접 정의하지 않고 도메인을 정의하여 여러 테이블에서 일관되게 사용&lt;/li&gt;
&lt;li&gt;변경시 도메인을 정의한 곳에서 도메인 정의를 변경하면 도메인을 사용하는 모든 테이블에서 일관되게 적용&lt;/li&gt;
&lt;li&gt;도메인 생성&lt;/li&gt;
&lt;li&gt;CREATE DOMAIN DEPTNAME CHAR(10) DEFAULT '개발';&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659778622582&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE DOMAIN DEPTNAME CHAR(10) DEFAULT '개발'
CONSTRAINT VALID_DEPT
CHECK VALUE IN ('영업','총무','기획','개발)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;도메인 제거&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DROP DOMAIN DEPTNAME;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;고객 테이블 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1659778683754&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE 고객
(
고객번호 INT,
고객명 VARCHAR(30)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테이블 제거(DROP)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 RELATION은 DROP문으로 제거&lt;/li&gt;
&lt;li&gt;RELATION의 정의와 RELATION의 튜플들이 모두 삭제됨&lt;/li&gt;
&lt;li&gt;사용형식&lt;/li&gt;
&lt;li&gt;DROP TABLE : RELATION 명칭 [RESTRICT | CASCADE]&lt;/li&gt;
&lt;li&gt;RESTRICT : 명시한 RELATION이 참조되고 있으면 제거 안됨&lt;/li&gt;
&lt;li&gt;CASCADE : 명시된 RELATION과 참조하는 RELATION 모두 제거됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659778799482&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 사용 예
DROP TABLE COURSE;
DROP TABLE COURSE CASCADE;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테이블 변경(ALTER)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQHPZT/btrI3tkrnyJ/NEUptqiQJDnkyW44rkDP9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQHPZT/btrI3tkrnyJ/NEUptqiQJDnkyW44rkDP9k/img.png&quot; data-alt=&quot;열 추가하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQHPZT/btrI3tkrnyJ/NEUptqiQJDnkyW44rkDP9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQHPZT%2FbtrI3tkrnyJ%2FNEUptqiQJDnkyW44rkDP9k%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;647&quot; height=&quot;309&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열 추가하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs796M/btrI1i5r4z0/KgdkiVTyXnxjvj7nKr7eLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs796M/btrI1i5r4z0/KgdkiVTyXnxjvj7nKr7eLK/img.png&quot; data-alt=&quot;열 삭제하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs796M/btrI1i5r4z0/KgdkiVTyXnxjvj7nKr7eLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs796M%2FbtrI1i5r4z0%2FKgdkiVTyXnxjvj7nKr7eLK%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;648&quot; height=&quot;310&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열 삭제하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;무결성 제약조건&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efqd9y/btrI6qncceg/sNGcs369mxbNMUKPRBfebk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efqd9y/btrI6qncceg/sNGcs369mxbNMUKPRBfebk/img.png&quot; data-alt=&quot;무결성 제약조건 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efqd9y/btrI6qncceg/sNGcs369mxbNMUKPRBfebk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fefqd9y%2FbtrI6qncceg%2FsNGcs369mxbNMUKPRBfebk%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;659&quot; height=&quot;358&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무결성 제약조건 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NOT NULL&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성은 기본적으로 NULL 값을 허용&lt;/li&gt;
&lt;li&gt;NULL 값을 갖지 않는 속성은 `NOT NULL` 명시&lt;/li&gt;
&lt;li&gt;기본키는 반드시 `NOT NULL`을 명시&lt;/li&gt;
&lt;li&gt;NULL은 값은 있지만 모르는 값이거나, 해당되지 않는 값임&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659778969717&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
		(EMPNO INTEGER NOT NULL,...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UNIQUE&lt;/h3&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;유일 값이므로 NULL 값도 한번은 허용&lt;/li&gt;
&lt;li&gt;한 테이블에 UNIQUE 제약조건을 여러 개 명시할 수 있음&lt;/li&gt;
&lt;li&gt;사용 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659779063458&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
		(...,
        EMPNAME CHAR(10) UNIQUE,
        ...);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DEFAULT&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성에 NULL 값 대신 특정 값을 기본 값으로 지정&lt;/li&gt;
&lt;li&gt;사용 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659779103147&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
		(...,
        TITLE CHAR(10) DEFAULT '사원'
        ...);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CHECK&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CHECK절은 하나의 속성이 취하는 값들의 범위 지정&lt;/li&gt;
&lt;li&gt;사용 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659779202628&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
		(...,
        SALARY INTEGER CHECK (SALARY &amp;lt; 6000000),
        ...);
        
-- 사용 예 2

CREATE TABLE EMPLOYEE
		(ID INTEGER,
        NAME CHAR(10),
        SALARY INTEGER,
        MANAGER_SALARY INTEGER,
        CHECK(MANAGER_SALARY &amp;gt; SALARY)
        );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 키&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 키는 개체 무결성 제약조건에 의해 NULL 값을 갖지 않음&lt;/li&gt;
&lt;li&gt;사용 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1659779253487&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
		(EMPNO INTEGER NOT NULL,
        ...,
        PRIMARY KEY (EMPNO),
        ...);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DEPARTMENT 테이블 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1659779306862&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE DEPARTMENT (
	DEPTNO INTEGER NOT NULL,
    DEPTNAME CHAR(10),
    FLOOR INTEGER,
    PRIMARY KEY (DEPTNO)
    );&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659779443858&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE DEPARTMENT (
		DEPTNO INTEGER NOT NULL,
        ...
        CONSTRAINT PK_DEPT_NO PRIMARY KEY (DEPTNO)
        );

--기본 키 제약 조건의 삭제
ALTER TABLE DEPARTMENT DROP CONSTRAINT PK_DEPT_NO;

--제약 조건의 추가
ALTER TABLE DEPARTMENT ADD CONSTRAINT PK_DEPT_NO PRIMARY KEY (DEPTNO);&lt;/code&gt;&lt;/pre&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;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RELATION을 정의하면서 명시함&lt;/li&gt;
&lt;li&gt;참조되는 속성은 동일한 데이터 타입이면서 UNIQUE 또는 기본키로 정의됨&lt;/li&gt;
&lt;li&gt;참조하는 외래 키 속성의 값은 참조하는 속성의 값이거나 NULL만이 가능&lt;/li&gt;
&lt;li&gt;참조되는 RELATION에서 튜플이 삭제/수정 될 때 참조하는 RELATION에서 어떻게 동작할 것인가를 명시&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;- CASCADE절이 명시되면 참조 무결성을 위배하는 참조하는 RELATION에도 영향을 미침&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RRsoy/btrI1idlBRI/6eEzneQJ8DXnzC14a0dIwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RRsoy/btrI1idlBRI/6eEzneQJ8DXnzC14a0dIwk/img.png&quot; data-alt=&quot;무결성 제약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RRsoy/btrI1idlBRI/6eEzneQJ8DXnzC14a0dIwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRRsoy%2FbtrI1idlBRI%2F6eEzneQJ8DXnzC14a0dIwk%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;685&quot; height=&quot;381&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무결성 제약&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ON UPDATE CASECADE&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buiGAZ/btrI2cwXjhZ/llPU0we9IpK1meJjtTWXeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buiGAZ/btrI2cwXjhZ/llPU0we9IpK1meJjtTWXeK/img.png&quot; data-alt=&quot;기본키의 수정, 외래키 영향&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buiGAZ/btrI2cwXjhZ/llPU0we9IpK1meJjtTWXeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuiGAZ%2FbtrI2cwXjhZ%2FllPU0we9IpK1meJjtTWXeK%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;790&quot; height=&quot;384&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본키의 수정, 외래키 영향&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2개의 RELATION 참조&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MvkT2/btrI2wIKRV2/bpoNmykpnNi2ezH9kH7X2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MvkT2/btrI2wIKRV2/bpoNmykpnNi2ezH9kH7X2K/img.png&quot; data-alt=&quot;RELATION 참조 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MvkT2/btrI2wIKRV2/bpoNmykpnNi2ezH9kH7X2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvkT2%2FbtrI2wIKRV2%2FbpoNmykpnNi2ezH9kH7X2K%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;730&quot; height=&quot;139&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RELATION 참조 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1659779760620&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE EMPLOYEE
	(EMPNO	INTEGER	NOT NULL,
     EMPNAME CHAR(10),
     TITLE	 CHAR(10),
     MANAGER INTEGER,
     SALARY	 INTEGER,
     DNO	 INTEGER,
     PRIMARY KEY(EMPNO),
     FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE (EMPNO)),
     FOREIGN KEY(DNO) REFERENCES DEPARTMENT (DEPTNO):;&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;학생, 과목, 수강 RELATION&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDpHVx/btrI2wIKU09/ZpxZWx3xM4QKUqsmVtYo70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDpHVx/btrI2wIKU09/ZpxZWx3xM4QKUqsmVtYo70/img.png&quot; data-alt=&quot;학생 RELATION&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDpHVx/btrI2wIKU09/ZpxZWx3xM4QKUqsmVtYo70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDpHVx%2FbtrI2wIKU09%2FZpxZWx3xM4QKUqsmVtYo70%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;845&quot; height=&quot;333&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학생 RELATION&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1659779838030&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE STUDENT
	(SNO INTEGER NOT NULL PRIMARY KEY,
     SNAME CHAR(10)
     );&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5C8c/btrI6r0HJiT/CraqeImyMktOK9cLPbE5B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5C8c/btrI6r0HJiT/CraqeImyMktOK9cLPbE5B1/img.png&quot; data-alt=&quot;과목 RELATION&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5C8c/btrI6r0HJiT/CraqeImyMktOK9cLPbE5B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5C8c%2FbtrI6r0HJiT%2FCraqeImyMktOK9cLPbE5B1%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;853&quot; height=&quot;335&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과목 RELATION&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1659779889001&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE COURSE
	(CNO CHAR(5) NOT NULL,
    CNAME CHAR(20),
    PRIMARY KEY(CNO)
    );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5VcBT/btrI4U29fIn/QzB0sgRrOy4qvsb7sYYNRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5VcBT/btrI4U29fIn/QzB0sgRrOy4qvsb7sYYNRk/img.png&quot; data-alt=&quot;수강 RELATION&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5VcBT/btrI4U29fIn/QzB0sgRrOy4qvsb7sYYNRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5VcBT%2FbtrI4U29fIn%2FQzB0sgRrOy4qvsb7sYYNRk%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;848&quot; height=&quot;332&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수강 RELATION&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1659780018755&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE ENROL
		(SNO INTEGER NOT NULL,
        	CNO CHAR(5) NOT NULL,
            CREDIT CHAR(2),
            PRIMARY KEY (SNO, CNO),
            FOREIGN KEY (SNO) REFERENCES STUDENT(SNO),
            FOREIGN KEY (CNO) REFERENCES COURES(CNO)
            );&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;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>ALTER</category>
      <category>Create</category>
      <category>drop</category>
      <category>Foreign</category>
      <category>Key</category>
      <category>primary</category>
      <category>Relation</category>
      <category>Schema</category>
      <category>sql</category>
      <category>table</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/149</guid>
      <comments>https://okdone.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 6 Aug 2022 19:01:48 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft SQL Server,  SSMS 설치 및 기본설정</title>
      <link>https://okdone.tistory.com/148</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL Server&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Microsoft사가 개발한 윈도우 운영체제에서 동작하는 데이터베이스 관리 소프트웨어&lt;/li&gt;
&lt;li&gt;모바일 장치에서 엔터프라이즈 데이터 시스템까지 다양한 플랫폼에서 운영되는 통합 데이터 및 분석 솔루션&lt;/li&gt;
&lt;li&gt;오라클 DBMS보다 경제성이 높고 환경설정이 용이&lt;/li&gt;
&lt;li&gt;온라인 트랜잭션 처리, 데이터 웨어하우스, OLAP(Online Analytical Transaction processing), 데이터 마이닝 등 최근의 응용 분야에 활용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/68tEp/btrIYmd8r4V/SPYIwXx043e2wCZYBVjMT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/68tEp/btrIYmd8r4V/SPYIwXx043e2wCZYBVjMT1/img.png&quot; data-alt=&quot;SQL server 발전과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/68tEp/btrIYmd8r4V/SPYIwXx043e2wCZYBVjMT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F68tEp%2FbtrIYmd8r4V%2FSPYIwXx043e2wCZYBVjMT1%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;1201&quot; height=&quot;652&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL server 발전과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제품 종류&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drx2ps/btrIYDfLlCT/aGltVbo01Q1HZ5ravpN0T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drx2ps/btrIYDfLlCT/aGltVbo01Q1HZ5ravpN0T1/img.png&quot; data-alt=&quot;제품 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drx2ps/btrIYDfLlCT/aGltVbo01Q1HZ5ravpN0T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrx2ps%2FbtrIYDfLlCT%2FaGltVbo01Q1HZ5ravpN0T1%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;1168&quot; height=&quot;661&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;661&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL 설치 요구사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4exd7/btrIXQNj8zx/VPWKu9GCVA0JqPEHKEInT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4exd7/btrIXQNj8zx/VPWKu9GCVA0JqPEHKEInT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4exd7/btrIXQNj8zx/VPWKu9GCVA0JqPEHKEInT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4exd7%2FbtrIXQNj8zx%2FVPWKu9GCVA0JqPEHKEInT0%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;1203&quot; height=&quot;622&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL Server 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 센터에서 sql server express 다운로드 및 설치&lt;/p&gt;
&lt;figure id=&quot;og_1659606422808&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;Download Microsoft&amp;reg; SQL Server&amp;reg; 2019 Express from Official Microsoft Download Center&quot; data-og-description=&quot;중요! 아래에서 언어를 선택하면 전체 페이지 내용이 해당 언어로 신속하게 변경됩니다. 독일어러시아어스페인어영어이탈리아어일본어중국어(간체)중국어(번체)포르투갈어(브라질)프랑스어한&quot; data-og-host=&quot;www.microsoft.com&quot; data-og-source-url=&quot;https://www.microsoft.com/ko-KR/download/details.aspx?id=101064&quot; data-og-url=&quot;https://www.microsoft.com/ko-KR/download/details.aspx?id=101064&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdcPbu/hyPkGb67Jq/tmrnMpr6KGL1Oouzklidzk/img.png?width=1259&amp;amp;height=378&amp;amp;face=0_0_1259_378&quot;&gt;&lt;a href=&quot;https://www.microsoft.com/ko-KR/download/details.aspx?id=101064&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.microsoft.com/ko-KR/download/details.aspx?id=101064&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdcPbu/hyPkGb67Jq/tmrnMpr6KGL1Oouzklidzk/img.png?width=1259&amp;amp;height=378&amp;amp;face=0_0_1259_378');&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;Download Microsoft&amp;reg; SQL Server&amp;reg; 2019 Express from Official Microsoft Download Center&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;www.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/rNCkw/btrIYnjQv7d/ukX0eFXqkOhtgoxqYDE1uK/SQL2019-SSEI-Expr.exe?attach=1&amp;amp;knm=tfile.exe&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SQL2019-SSEI-Expr.exe&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;6.08MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://aka.ms/ssmsfullsetup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Microsoft SQL Server Management Studio 다운로드 링크(20MB 이상으로 업로드 불가)&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL Server 관리&lt;/h2&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;279&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdJkSQ/btrIYnYxt7v/L4sCKywBcENmCHz70cGgQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdJkSQ/btrIYnYxt7v/L4sCKywBcENmCHz70cGgQk/img.png&quot; data-alt=&quot;데이터 베이스를 클릭하면 나오는 트리구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdJkSQ/btrIYnYxt7v/L4sCKywBcENmCHz70cGgQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdJkSQ%2FbtrIYnYxt7v%2FL4sCKywBcENmCHz70cGgQk%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;279&quot; height=&quot;437&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;437&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;SQL Server 인스턴스는 다음의 4가지 시스템 데이터베이스와 하나 이상의 사용자 데이터베이스로 구성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N7orZ/btrIUlmWB41/yZ5GRZDjwKc5tRbOTldd41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N7orZ/btrIUlmWB41/yZ5GRZDjwKc5tRbOTldd41/img.png&quot; data-alt=&quot;시스템 데이터베이스의 역할&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N7orZ/btrIUlmWB41/yZ5GRZDjwKc5tRbOTldd41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN7orZ%2FbtrIUlmWB41%2FyZ5GRZDjwKc5tRbOTldd41%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;608&quot; height=&quot;332&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;332&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL Server 데이터베이스 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL Server의 논리적 구조와 물리적 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논리적 구조는 효과적으로 데이터를 사용하고 관리하는 방법 제공&lt;/li&gt;
&lt;li&gt;물리적 구조는 데이터를 실제 디스크에 저장하고 관리하는 방법을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwDrvx/btrIUalOhx0/DlnSoqkB6VV7ME8BkV5nkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwDrvx/btrIUalOhx0/DlnSoqkB6VV7ME8BkV5nkK/img.png&quot; data-alt=&quot;SQL Server 데이터베이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwDrvx/btrIUalOhx0/DlnSoqkB6VV7ME8BkV5nkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwDrvx%2FbtrIUalOhx0%2FDlnSoqkB6VV7ME8BkV5nkK%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;755&quot; height=&quot;290&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL Server 데이터베이스&lt;/figcaption&gt;
&lt;/figure&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;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAbCg8/btrIYZ4bLyr/BEFD100Pw4MvrKxvNRMfnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAbCg8/btrIYZ4bLyr/BEFD100Pw4MvrKxvNRMfnK/img.png&quot; data-alt=&quot;최소한 한개의 주 데이터 파일과 한개의 로그 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAbCg8/btrIYZ4bLyr/BEFD100Pw4MvrKxvNRMfnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAbCg8%2FbtrIYZ4bLyr%2FBEFD100Pw4MvrKxvNRMfnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;286&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최소한 한개의 주 데이터 파일과 한개의 로그 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL Server의 논리적 저장 단위와 물리적 저장 단위&lt;/h3&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 Server에선 여러개 테이블 집합을 데이터베이스라고 부르는 논리적 저장 단위로 구성&lt;/li&gt;
&lt;li&gt;디스크에 저장하는 실제 데이터는 SQL Server에서 데이터 파일이라고 부르는 물리적 저장 단위로 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL Server의 데이터 파일과 로그 파일&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;데이터 파일은 주 데이터 파일과 보조 데이터 파일 두 종류가 있음&lt;/li&gt;
&lt;li&gt;하나의 데이터베이스는 반드시 단 하나의 주 데이터 파일을 가지고 있어야 함&lt;/li&gt;
&lt;li&gt;주 데이터 파일의 확장자는 .mdf, 보조 데이터 파일의 확장자는 .ndf&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;하나의 데이터베이스는 반드시 하나 이상의 로그 파일을 가지고 있어야 함&lt;/li&gt;
&lt;li&gt;로그 파일의 확장자는 .ldf&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;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 생성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL Server 관리 스튜디오를 이용한 데이터베이스 생성 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI 인터페이스를 활용해 직관적으로 데이터베이스 생성할 수 있어 편함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL 명령문을 이용한 데이터베이스 생성방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 데이터베이스 생성이나 데이터베이스 이름을 변경할 때 스크립트를 만들어 한번에 데이터베이스를 생성할 수 있어서 효율적임, 데이터베이스 생성은 관리자만 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL Server 관리 스튜디오 이용&lt;/h3&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-origin-width=&quot;340&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u1BYW/btrISPiazac/5CmN09mLTsWg3wXHwmATik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u1BYW/btrISPiazac/5CmN09mLTsWg3wXHwmATik/img.png&quot; data-alt=&quot;new database 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u1BYW/btrISPiazac/5CmN09mLTsWg3wXHwmATik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu1BYW%2FbtrISPiazac%2F5CmN09mLTsWg3wXHwmATik%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;340&quot; height=&quot;328&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;new database 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Database name 작성, 기타 용량 사이즈 조절 등 선택이 가능함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZUGOr/btrIYZC8ogQ/WNPGxqh2IC4SiNy0XF5Q40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZUGOr/btrIYZC8ogQ/WNPGxqh2IC4SiNy0XF5Q40/img.png&quot; data-alt=&quot;이름을 적은 후 ok 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZUGOr/btrIYZC8ogQ/WNPGxqh2IC4SiNy0XF5Q40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZUGOr%2FbtrIYZC8ogQ%2FWNPGxqh2IC4SiNy0XF5Q40%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;815&quot; height=&quot;615&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름을 적은 후 ok 클릭&lt;/figcaption&gt;
&lt;/figure&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;SQL로 데이터베이스 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SCi82/btrIXWUf1fM/EPma0jAy4OZ4T5KN8D1b90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SCi82/btrIXWUf1fM/EPma0jAy4OZ4T5KN8D1b90/img.png&quot; data-alt=&quot;new query 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SCi82/btrIXWUf1fM/EPma0jAy4OZ4T5KN8D1b90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSCi82%2FbtrIXWUf1fM%2FEPma0jAy4OZ4T5KN8D1b90%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;410&quot; height=&quot;209&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;new query 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcrDfK/btrIXQzVdbF/VqE3GGGkTvlsPqwMQIBd5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcrDfK/btrIXQzVdbF/VqE3GGGkTvlsPqwMQIBd5K/img.png&quot; data-alt=&quot;생성 쿼리 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcrDfK/btrIXQzVdbF/VqE3GGGkTvlsPqwMQIBd5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcrDfK%2FbtrIXQzVdbF%2FVqE3GGGkTvlsPqwMQIBd5K%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;322&quot; height=&quot;177&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;177&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 생성, 권한 관리&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dazHmo/btrIXRlgqDb/xhopkKew0nNWVQsck1du70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dazHmo/btrIXRlgqDb/xhopkKew0nNWVQsck1du70/img.png&quot; data-alt=&quot;new login 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dazHmo/btrIXRlgqDb/xhopkKew0nNWVQsck1du70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdazHmo%2FbtrIXRlgqDb%2FxhopkKew0nNWVQsck1du70%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;345&quot; height=&quot;258&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;new login 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login name, SQL Server authentication에 암호 지정,&amp;nbsp; ok 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCjpz/btrIY1ubrW0/877GAw7gKzNSruVq3ZDXP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCjpz/btrIY1ubrW0/877GAw7gKzNSruVq3ZDXP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCjpz/btrIY1ubrW0/877GAw7gKzNSruVq3ZDXP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCjpz%2FbtrIY1ubrW0%2F877GAw7gKzNSruVq3ZDXP1%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;618&quot; height=&quot;611&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;611&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqCDV1/btrIXChqCQ3/XD20T2uLlvmekeYNA6Fba0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqCDV1/btrIXChqCQ3/XD20T2uLlvmekeYNA6Fba0/img.png&quot; data-alt=&quot;권한을 주고자 하는 데이터베이스와 권한 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqCDV1/btrIXChqCQ3/XD20T2uLlvmekeYNA6Fba0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqCDV1%2FbtrIXChqCQ3%2FXD20T2uLlvmekeYNA6Fba0%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;811&quot; height=&quot;611&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;611&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스키마 생성&lt;/h3&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;blob&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B17Ny/btrITnk0MUC/qQ0ZIOFkKiLR2gX0UTko7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B17Ny/btrITnk0MUC/qQ0ZIOFkKiLR2gX0UTko7k/img.png&quot; data-alt=&quot;bookstore - security - schemas - 오른쪽버튼 - new schema&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B17Ny/btrITnk0MUC/qQ0ZIOFkKiLR2gX0UTko7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB17Ny%2FbtrITnk0MUC%2FqQ0ZIOFkKiLR2gX0UTko7k%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;340&quot; height=&quot;670&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bookstore - security - schemas - 오른쪽버튼 - new schema&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcqKoY/btrIXxUSQP4/KbyUCZnjqZ5d77y78PF4Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcqKoY/btrIXxUSQP4/KbyUCZnjqZ5d77y78PF4Rk/img.png&quot; data-alt=&quot;스키마 설정 이름, 적용할 owner 입력, OK 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcqKoY/btrIXxUSQP4/KbyUCZnjqZ5d77y78PF4Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcqKoY%2FbtrIXxUSQP4%2FKbyUCZnjqZ5d77y78PF4Rk%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;802&quot; height=&quot;611&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스키마 설정 이름, 적용할 owner 입력, OK 클릭&lt;/figcaption&gt;
&lt;/figure&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;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3QduP/btrISORaX1W/eV9LrJ8z0c76KiE1cdz030/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3QduP/btrISORaX1W/eV9LrJ8z0c76KiE1cdz030/img.png&quot; data-alt=&quot;security - logins - bookstore 더블클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3QduP/btrISORaX1W/eV9LrJ8z0c76KiE1cdz030/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3QduP%2FbtrISORaX1W%2FeV9LrJ8z0c76KiE1cdz030%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;252&quot; height=&quot;470&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;security - logins - bookstore 더블클릭&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPrpR/btrIYnxuUfn/vXOfuhVl8ROuxsKvCATdu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPrpR/btrIYnxuUfn/vXOfuhVl8ROuxsKvCATdu1/img.png&quot; data-alt=&quot;User mapping - Default Schema column의 ... 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPrpR/btrIYnxuUfn/vXOfuhVl8ROuxsKvCATdu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPrpR%2FbtrIYnxuUfn%2FvXOfuhVl8ROuxsKvCATdu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;609&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;User mapping - Default Schema column의 ... 클릭&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBlGMR/btrIY026SuN/ZR5T92vk9dI2X7sKBI5Oz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBlGMR/btrIY026SuN/ZR5T92vk9dI2X7sKBI5Oz0/img.png&quot; data-alt=&quot;Browse를 누르면 새창이 나오며, 여기에서 원하는 schema 선택(book_schema)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBlGMR/btrIY026SuN/ZR5T92vk9dI2X7sKBI5Oz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBlGMR%2FbtrIY026SuN%2FZR5T92vk9dI2X7sKBI5Oz0%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;577&quot; height=&quot;493&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Browse를 누르면 새창이 나오며, 여기에서 원하는 schema 선택(book_schema)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>mssql</category>
      <category>SQL Server</category>
      <category>SSMS</category>
      <category>권한</category>
      <category>데이터베이스</category>
      <category>사용자</category>
      <category>생성</category>
      <category>설정</category>
      <category>설치</category>
      <category>스키마</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/148</guid>
      <comments>https://okdone.tistory.com/148#entry148comment</comments>
      <pubDate>Thu, 4 Aug 2022 19:20:08 +0900</pubDate>
    </item>
    <item>
      <title>서비스 서버에 대한 주의</title>
      <link>https://okdone.tistory.com/147</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Torch 모델 구현 과정에서 Tensorflow 모델을 기반으로 사용하는 quickspacer를 사용하게 되면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cuda 버전 관련 에러가 발생하였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cuda 버전을 함부로 바꿀 수 없다고 생각해서, tensorflow 버전을 2.3.1 -&amp;gt; 2.4.0 -&amp;gt; 2.7.0 까지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꿔 가던 중, 아예 버전을 바꾸기 조차 불가했음 (pip로 설치해서, 종속성이 꼬여버림)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봉인했던 poetry를 사용해서 다시 환경 조성을 해봐야할 듯 함 안되면 tensorflow, torch 환경 따로..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 억지로 테스트를 강행했더니(warning 메세지에서 메모리 누수를 경고했음에도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속했던 서버가 팅기면서, 서버 전체에 영향을 줬다는 것을 알게됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 코드에서 vram을 사용하지 않았는데도, oom이 뜨는 상황이었음&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;local에서 도커를 통해 환경을 구현하고 테스트 해보는 방법이 필요할 것으로 보임.&lt;/p&gt;</description>
      <category>23년 이전 글/Error Today</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/147</guid>
      <comments>https://okdone.tistory.com/147#entry147comment</comments>
      <pubDate>Thu, 4 Aug 2022 17:51:55 +0900</pubDate>
    </item>
    <item>
      <title>Pytorch train 과정에서 발생한 OOM(out of memory)</title>
      <link>https://okdone.tistory.com/146</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 발생 재현을 위한 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1659521717806&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoModel

device = &quot;cuda&quot;
model = Automodel.from_pretrained(&quot;klue/roberta-large&quot;).to(device)
kfold = 5

for fold in enumerate(kfold):
	
    model = deepcopy.copy(model)
    for idx, batch in enumerate(train_data_loader):
    	# train step code...&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Training 할 경우 에러가 발생한다. 사유는 Vram으로 모델을 보낸 상태에서 지속적으로 copy를 하기 때문에, 모델 내에서 모델이 중첩되므로, fold가 길어질수록, Vram 양에 따라 램이 터질 가능성이 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결을 위해 했던 시도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 반복문마다 카피했던 모델을 지우고, 메모리를 정리해봤으나 실패&lt;/p&gt;
&lt;pre id=&quot;code_1659521917759&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import gc
del model
torch.cuda.empty_cache()
gc.collect()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deepcopy 타이밍을 시스템 메모리 안에서 카피 후, Vram으로 보내면 정상적인 학습 절차가 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1659522010398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoModel

device = &quot;cuda&quot;
model = Automodel.from_pretrained(&quot;klue/roberta-large&quot;)#.to(device)
kfold = 5

for fold in enumerate(kfold):
	# copy 후 model 사용
    model = deepcopy.copy(model).to(device)
    for idx, batch in enumerate(train_data_loader):
    	# train step code...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/Error Today</category>
      <category>deepcopy</category>
      <category>error</category>
      <category>OOM</category>
      <category>에러</category>
      <category>해결</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/146</guid>
      <comments>https://okdone.tistory.com/146#entry146comment</comments>
      <pubDate>Wed, 3 Aug 2022 19:21:47 +0900</pubDate>
    </item>
    <item>
      <title>TPU-VM Colab처럼 활용하기</title>
      <link>https://okdone.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽기전에, 아래의 세팅을 해두고 오셔야 내용이 이어집니다&lt;/p&gt;
&lt;figure id=&quot;og_1659092032164&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;Cloud TPU-VM에 VSCODE로 SSH 접속하기&quot; data-og-description=&quot;TRC(TPU Research Cloud) TRC에 지원하면, 구글에서 경우에 따라 한달, 또는 두달 등의 TPU 무료 사용을 허가해줌 그러면 다음에 해당하는 자원을 마음껏 사용할 수 있음 us-central1-f 영역의 선점형 Cloud TPU.&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/144&quot; data-og-url=&quot;https://okdone.tistory.com/144&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sAO9g/hyPgaEwlv8/upAJ018sVlR2VtWa1SPG3K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/i2xCI/hyPgcPTfvo/74QXKsMVo71lIyhAFUENa0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/EOHsn/hyPeOiNKPl/w34nBioUubjCUsfHc0wAnK/img.png?width=875&amp;amp;height=356&amp;amp;face=0_0_875_356&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/144&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sAO9g/hyPgaEwlv8/upAJ018sVlR2VtWa1SPG3K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/i2xCI/hyPgcPTfvo/74QXKsMVo71lIyhAFUENa0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/EOHsn/hyPeOiNKPl/w34nBioUubjCUsfHc0wAnK/img.png?width=875&amp;amp;height=356&amp;amp;face=0_0_875_356');&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;Cloud TPU-VM에 VSCODE로 SSH 접속하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TRC(TPU Research Cloud) TRC에 지원하면, 구글에서 경우에 따라 한달, 또는 두달 등의 TPU 무료 사용을 허가해줌 그러면 다음에 해당하는 자원을 마음껏 사용할 수 있음 us-central1-f 영역의 선점형 Cloud TPU.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;1. VSCODE Workspace 열기&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;폴더 열기를 눌러서, VSCODE Workspace 환경을 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbkGZ6/btrItvEvSDy/mJcjuqwB48OkMUbZqixxAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbkGZ6/btrItvEvSDy/mJcjuqwB48OkMUbZqixxAk/img.png&quot; data-alt=&quot;VSCODE 초기화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbkGZ6/btrItvEvSDy/mJcjuqwB48OkMUbZqixxAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbkGZ6%2FbtrItvEvSDy%2FmJcjuqwB48OkMUbZqixxAk%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;450&quot; height=&quot;313&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCODE 초기화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;edited_blob&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/77zWx/btrIuYlWJ4L/tTIA2aI8zZnVQzrgvuBIUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/77zWx/btrIuYlWJ4L/tTIA2aI8zZnVQzrgvuBIUk/img.png&quot; data-alt=&quot;local folder 메뉴바&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/77zWx/btrIuYlWJ4L/tTIA2aI8zZnVQzrgvuBIUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F77zWx%2FbtrIuYlWJ4L%2FtTIA2aI8zZnVQzrgvuBIUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;137&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;local folder 메뉴바&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;VSCODE 창이 다시 열리면서, 다시 passphrase를 입력하면 workspace가 열리게 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FMHic/btrIpHyd0Cy/yJG4AzvwF855a3s0tpyss0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FMHic/btrIpHyd0Cy/yJG4AzvwF855a3s0tpyss0/img.png&quot; data-alt=&quot;workspace load 된 vscode 초기화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FMHic/btrIpHyd0Cy/yJG4AzvwF855a3s0tpyss0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFMHic%2FbtrIpHyd0Cy%2FyJG4AzvwF855a3s0tpyss0%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;463&quot; height=&quot;429&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;workspace load 된 vscode 초기화면&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;여기서부터 사실상 Vscode에 Jupyter Notebook을 적용해본 사람이라면 로컬과 동일하게 수행해도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 초보자 기준으로 개발환경을 구성하겠음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+마크를 눌러서 터미널 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8kOvC/btrIxwoAk3b/NRBupkikdRWioaMl2Ve4FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8kOvC/btrIxwoAk3b/NRBupkikdRWioaMl2Ve4FK/img.png&quot; data-alt=&quot;터미널 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8kOvC/btrIxwoAk3b/NRBupkikdRWioaMl2Ve4FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8kOvC%2FbtrIxwoAk3b%2FNRBupkikdRWioaMl2Ve4FK%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;442&quot; height=&quot;468&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;터미널 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 프로젝트 구분을 위한 가상환경 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나타난 터미널에 아래 코드를 입력해서 가상환경 activate&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 현재 설치된 라이브러리 환경 그대로 test_env 가상환경 생성
virtualenv --system-site-packages test_env&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659093153815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 가상환경 폴더로 이동
cd test_env&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659093174493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 가상환경 진입
source bin/activate&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;jupyter 환경 구성을 위한 설치&lt;/p&gt;
&lt;pre id=&quot;code_1659095605518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install jupyter&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경에서 사용할 파이썬 커널 생성&lt;/p&gt;
&lt;pre id=&quot;code_1659095806987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# command 입력시 []는 제외하고 입력
python -m ipykernel install --user --name [유저이름] --display-name [커널이름]



#result 아래 log가 나와야 정상적으로 커널 생성된 것
Installed kernelspec 이름 in 커널 생성경로 표시&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;다시 폴더 구조로 돌아와서, test_env 폴더 내에 ipynb 형태의 파일 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TOuAJ/btrIvpcfnr2/uDLjCbeNCjq5KOlG0OmzK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TOuAJ/btrIvpcfnr2/uDLjCbeNCjq5KOlG0OmzK0/img.png&quot; data-alt=&quot;파일 생성 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TOuAJ/btrIvpcfnr2/uDLjCbeNCjq5KOlG0OmzK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTOuAJ%2FbtrIvpcfnr2%2FuDLjCbeNCjq5KOlG0OmzK0%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;218&quot; height=&quot;424&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 생성 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단에 커널 선택 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVeVvm/btrIvoYGLeB/NmK35YXSZAw1TUkXQwuL20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVeVvm/btrIvoYGLeB/NmK35YXSZAw1TUkXQwuL20/img.png&quot; data-alt=&quot;커널 선택 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVeVvm/btrIvoYGLeB/NmK35YXSZAw1TUkXQwuL20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVeVvm%2FbtrIvoYGLeB%2FNmK35YXSZAw1TUkXQwuL20%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;884&quot; height=&quot;167&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커널 선택 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 안한게 있었던 듯.. 추천 설치 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8JXJ/btrIuafiua2/EKvCXGKXdnLza4aGNqsR30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8JXJ/btrIuafiua2/EKvCXGKXdnLza4aGNqsR30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8JXJ/btrIuafiua2/EKvCXGKXdnLza4aGNqsR30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8JXJ%2FbtrIuafiua2%2FEKvCXGKXdnLza4aGNqsR30%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;464&quot; height=&quot;88&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 파이썬을 설치 안한 상태였기에 나타난 문제;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VSCODE 확장에서 파이썬을 설치(나머지는 취향)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfDaCi/btrIuYM1uUK/hkLgtK1IG3BAmtbvrS1Ctk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfDaCi/btrIuYM1uUK/hkLgtK1IG3BAmtbvrS1Ctk/img.png&quot; data-alt=&quot;VSCODE 확장 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfDaCi/btrIuYM1uUK/hkLgtK1IG3BAmtbvrS1Ctk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfDaCi%2FbtrIuYM1uUK%2FhkLgtK1IG3BAmtbvrS1Ctk%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;274&quot; height=&quot;427&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCODE 확장 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아와서 ipynb 파일을 열어보면 test_env 환경의 커널을 자동으로 잡은 것을 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgBtqK/btrIuYM1y68/uZkVnVkupswevKyTnViMS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgBtqK/btrIuYM1y68/uZkVnVkupswevKyTnViMS0/img.png&quot; data-alt=&quot;VSCODE내 jupyter notebook 환경 조성 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgBtqK/btrIuYM1y68/uZkVnVkupswevKyTnViMS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgBtqK%2FbtrIuYM1y68%2FuZkVnVkupswevKyTnViMS0%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;830&quot; height=&quot;223&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCODE내 jupyter notebook 환경 조성 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. TPU 연결 상태 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Tensorflow 공식 예제에서 사용하는 TPU 환경 화면으로 TPU가 정상 작동하는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 내용을 cell에 입력(외우기 어려우니, TPU 사용환경에서 아래 코드는 무조건 복붙하고 시작)&lt;/p&gt;
&lt;pre id=&quot;code_1659096670036&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='local')
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)
print(&quot;All devices: &quot;, tf.config.list_logical_devices('TPU'))
strategy = tf.distribute.TPUStrategy(resolver)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 내용이 나온다면 성공&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpFF8/btrIxC3y4E6/7ODO3zzITvMw8lZEx3QUk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpFF8/btrIxC3y4E6/7ODO3zzITvMw8lZEx3QUk0/img.png&quot; data-alt=&quot;코드 출력 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpFF8/btrIxC3y4E6/7ODO3zzITvMw8lZEx3QUk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpFF8%2FbtrIxC3y4E6%2F7ODO3zzITvMw8lZEx3QUk0%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;849&quot; height=&quot;446&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;446&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Colab과 비슷한, 그러나 Session이 종료되지 않는 나만의 코랩 환경 구성 완료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글은, TRC 프로그램을 통해 Cloud TPU를 빵빵하게 빌려주는 Google에 보답하고자, TPU를 사용하고자 하는 사람들의 커뮤니티에 기여하고자 쓰여졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁금한 점이 있다면 댓글로 주셔도 좋고, Tensorflow 오픈챗방에 tf-keras-TPU Trinity를 찾아주셔도 좋습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다&lt;/p&gt;
&lt;figure id=&quot;og_1659097232874&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;텐서플로우 코리아 오픈채팅&quot; data-og-description=&quot;참여코드는 텐서플로우 만든 회사이름 영문6자리 (OOOOOO) #텐서플로우 #인공지능 #딥러닝&quot; data-og-host=&quot;open.kakao.com&quot; data-og-source-url=&quot;https://open.kakao.com/o/guMRCRl&quot; data-og-url=&quot;https://open.kakao.com/o/guMRCRl&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHABoY/hyPgdBiEFg/kQJFCpsVCrxt1qFqYlH1ak/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://open.kakao.com/o/guMRCRl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://open.kakao.com/o/guMRCRl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHABoY/hyPgdBiEFg/kQJFCpsVCrxt1qFqYlH1ak/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&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;텐서플로우 코리아 오픈채팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;참여코드는 텐서플로우 만든 회사이름 영문6자리 (OOOOOO) #텐서플로우 #인공지능 #딥러닝&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;open.kakao.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>23년 이전 글/TPU</category>
      <category>Cloud TPU</category>
      <category>COLAB</category>
      <category>SSH</category>
      <category>TPU</category>
      <category>vscode</category>
      <category>개발환경</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/145</guid>
      <comments>https://okdone.tistory.com/145#entry145comment</comments>
      <pubDate>Fri, 29 Jul 2022 21:19:04 +0900</pubDate>
    </item>
    <item>
      <title>Cloud TPU-VM에 VSCODE로 SSH 접속하기</title>
      <link>https://okdone.tistory.com/144</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/52vNU/btrIvoQQlxC/0dHN8jXKCOxUoQTG4yMCzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/52vNU/btrIvoQQlxC/0dHN8jXKCOxUoQTG4yMCzK/img.png&quot; data-alt=&quot;Cloud TPU&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/52vNU/btrIvoQQlxC/0dHN8jXKCOxUoQTG4yMCzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F52vNU%2FbtrIvoQQlxC%2F0dHN8jXKCOxUoQTG4yMCzK%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;757&quot; height=&quot;308&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud TPU&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FhgBi/btrIq5dNo2E/4dKA9NKekGLG6LL0N1BEsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FhgBi/btrIq5dNo2E/4dKA9NKekGLG6LL0N1BEsk/img.jpg&quot; data-alt=&quot;VSCODE 로고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FhgBi/btrIq5dNo2E/4dKA9NKekGLG6LL0N1BEsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFhgBi%2FbtrIq5dNo2E%2F4dKA9NKekGLG6LL0N1BEsk%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;352&quot; height=&quot;352&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCODE 로고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TRC(TPU Research Cloud)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRC에 지원하면, 구글에서 경우에 따라 한달, 또는 두달 등의 TPU 무료 사용을 허가해줌&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;us-central1-f 영역의 선점형 Cloud TPU v2-8 기기 100개&lt;/li&gt;
&lt;li&gt;us-central1-f 영역의 주문형 Cloud TPU v2-8 기기 5개&lt;/li&gt;
&lt;li&gt;europe-west4-a 영역의 주문형 Cloud TPU v3-8 기기 5개&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선점형의 VM은 최대 24시간 밖에 유지되지 않는 단점이 있어 사용이 편할 수는 있으나 계속 유지할 수 없는 것이 단점이고, 주문형의 경우 한번씩 사용량이 꽉차서 만들어지지 않는 경우가 있지만 한번 만들어 두면 계속해서 쓸 수 있기 때문에 주문형을 선호 하는 편&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 특히, Colab에서 제공하는 Cloud TPU는 V2-8 기반으로, vram이&amp;nbsp; core 당8GB 이기 때문에, 무료로 Cloud TPU v3-8 코어당 vram 16GB를 쓸 수 있다는 것이 큰 장점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VSCODE로 접속하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud TPU 공식 예제에서는 Cloud TPU에 Google Cloud shell을 통해 SSH를 사용해서 접속하며, 간단한 Python Script를 통해서 학습하는 내용이 나오지만, Colab에서 주피터 노트북 형태로 코드를 짜던 사람들에게 갑자기 script 형태로 파이썬을 학습하는 것은 어색하고, 적응이 되지 않는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 Compute engine의 SSH 기능 처럼 콘솔창에서 바로 VM에 접속하는 기능이 없기 때문에, 조금 불편한 감이 있어, 이를 Colab의 형태를 띈 상태에서 학습에 사용하기 위해 VSCODE를 사용해서 Cloud TPU VM에 SSH를 사용해서 접속하는 방법을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Putty를 통해 키 쌍 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;putty는 RSA 형태의 키 쌍 생성을 위해 사용되는 유용한 툴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uR6xw/btrIq5qklUC/ujKxwLOSdh8NLAzZFIR78k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uR6xw/btrIq5qklUC/ujKxwLOSdh8NLAzZFIR78k/img.png&quot; data-alt=&quot;putty key generator 초기화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uR6xw/btrIq5qklUC/ujKxwLOSdh8NLAzZFIR78k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuR6xw%2FbtrIq5qklUC%2FujKxwLOSdh8NLAzZFIR78k%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;477&quot; height=&quot;467&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;putty key generator 초기화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generate 버튼을 누르고, Load bar가 가득찰 때 까지 마우스를 움직임&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzUDDu/btrInIiBOyw/3wuLSK3ZcVRnZE9XHHEBrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzUDDu/btrInIiBOyw/3wuLSK3ZcVRnZE9XHHEBrK/img.png&quot; data-alt=&quot;key 생성 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzUDDu/btrInIiBOyw/3wuLSK3ZcVRnZE9XHHEBrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzUDDu%2FbtrInIiBOyw%2F3wuLSK3ZcVRnZE9XHHEBrK%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;478&quot; height=&quot;469&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;key 생성 중&lt;/figcaption&gt;
&lt;/figure&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;blob&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdtx8/btrIlwppjWZ/WK6N6o6eZwzPNUZSk3l3p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdtx8/btrIlwppjWZ/WK6N6o6eZwzPNUZSk3l3p1/img.png&quot; data-alt=&quot;키 발행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdtx8/btrIlwppjWZ/WK6N6o6eZwzPNUZSk3l3p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftdtx8%2FbtrIlwppjWZ%2FWK6N6o6eZwzPNUZSk3l3p1%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;463&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;463&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;Key comment: Google e-mail 입력 예) asd@gmail.com&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Key passphrase : 키 쌍으로 식별할 때 사용할 암호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm passphrase : 암호 재입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키쌍 발행 후 다음의 save public key,&amp;nbsp; save private key를 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 경우, tpu_pub, tpu_private의 이름으로 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KmYLf/btrInFlIRJ9/ykoXKuW5v3LjZlj17FIgV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KmYLf/btrInFlIRJ9/ykoXKuW5v3LjZlj17FIgV0/img.png&quot; data-alt=&quot;발행 후 저장 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KmYLf/btrInFlIRJ9/ykoXKuW5v3LjZlj17FIgV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKmYLf%2FbtrInFlIRJ9%2FykoXKuW5v3LjZlj17FIgV0%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;474&quot; height=&quot;464&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;464&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;사실 위의 public key와 private key는 putty에서 사용하는 형식의 키로, 만일을 대비해서 저장한 것이었고 VSCODE에서 이 키를 쌍으로 사용하려면 OpenSSH 형태로 저장해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Export OpenSSH key 선택 후, 파일 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 경우, tpu_openssh로 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bwowf/btrIvpa9yOP/McSzCuaDSkaMJHMgI9pwRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bwowf/btrIvpa9yOP/McSzCuaDSkaMJHMgI9pwRK/img.png&quot; data-alt=&quot;export openssh key&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bwowf/btrIvpa9yOP/McSzCuaDSkaMJHMgI9pwRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBwowf%2FbtrIvpa9yOP%2FMcSzCuaDSkaMJHMgI9pwRK%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;475&quot; height=&quot;466&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;export openssh key&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;다음으로 Public Key를 구글에 메타 정보에 입력해야함. 반드시 Public key 빠짐 없이 복사해야함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vWSjB/btrIiDpb5pk/EEVUcNdzychLJns3OrzluK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vWSjB/btrIiDpb5pk/EEVUcNdzychLJns3OrzluK/img.png&quot; data-alt=&quot;발행한 pub key&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vWSjB/btrIiDpb5pk/EEVUcNdzychLJns3OrzluK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvWSjB%2FbtrIiDpb5pk%2FEEVUcNdzychLJns3OrzluK%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;475&quot; height=&quot;462&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발행한 pub key&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GCP Console을 이용해서 키 등록하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU를 받았다는 것은, 프로젝트를 생성하고 그 프로젝트 번호를 통해 TPU 사용 권한을 부여받았다는 것이므로, 프로젝트 생성에 관한 부분은 생략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 상단에 메뉴바를 열어 Compute Engine =&amp;gt; 메타 데이터 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujcMy/btrInHYiEwY/Y8hiyG1gW22KU6FPNXX6W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujcMy/btrInHYiEwY/Y8hiyG1gW22KU6FPNXX6W0/img.png&quot; data-alt=&quot;구글 콘솔 좌측 상단 메뉴바&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujcMy/btrInHYiEwY/Y8hiyG1gW22KU6FPNXX6W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujcMy%2FbtrInHYiEwY%2FY8hiyG1gW22KU6FPNXX6W0%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;468&quot; height=&quot;836&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;836&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH키 메뉴 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PLWN2/btrIkoLXeYt/jfNEbOk4u6ODKuZNpBMXhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PLWN2/btrIkoLXeYt/jfNEbOk4u6ODKuZNpBMXhk/img.png&quot; data-alt=&quot;구글클라우드 메타정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PLWN2/btrIkoLXeYt/jfNEbOk4u6ODKuZNpBMXhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPLWN2%2FbtrIkoLXeYt%2FjfNEbOk4u6ODKuZNpBMXhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;751&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;751&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;SSH 키 추가 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBxjpk/btrInHYiNq4/ia0xAcnQiN0mjUYRoJkZW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBxjpk/btrInHYiNq4/ia0xAcnQiN0mjUYRoJkZW0/img.png&quot; data-alt=&quot;SSH 키 추가 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBxjpk/btrInHYiNq4/ia0xAcnQiN0mjUYRoJkZW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBxjpk%2FbtrInHYiNq4%2Fia0xAcnQiN0mjUYRoJkZW0%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;534&quot; height=&quot;502&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSH 키 추가 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;putty에서 만들었던 public key 입력. 반드시 맨 뒤에 자신의 구글 메일까지 복사되었는지 확인요망&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCbhDj/btrIn3UjpPT/xmLoAk7Pj6Ma4NOAG93pKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCbhDj/btrIn3UjpPT/xmLoAk7Pj6Ma4NOAG93pKk/img.png&quot; data-alt=&quot;SSH키 추가 항목&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCbhDj/btrIn3UjpPT/xmLoAk7Pj6Ma4NOAG93pKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCbhDj%2FbtrIn3UjpPT%2FxmLoAk7Pj6Ma4NOAG93pKk%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;502&quot; height=&quot;218&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSH키 추가 항목&lt;/figcaption&gt;
&lt;/figure&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;blob&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beMtYU/btrInZYzEpy/6NCnGOEkHPgRyUkVM39RAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beMtYU/btrInZYzEpy/6NCnGOEkHPgRyUkVM39RAk/img.png&quot; data-alt=&quot;SSH 등록 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beMtYU/btrInZYzEpy/6NCnGOEkHPgRyUkVM39RAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeMtYU%2FbtrInZYzEpy%2F6NCnGOEkHPgRyUkVM39RAk%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;653&quot; height=&quot;150&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSH 등록 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TPU VM 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud TPU VM 생성은 여러가지 방법을 통해 할 수 있음. 여기에서는 GCP console을 통해 생성할건데, VM 사용률이 높아서 잘 생성이 안될 때는 명령어를 통해 생성하고, 반복 시도하는 것이 간편&lt;/p&gt;
&lt;figure id=&quot;og_1658965989752&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;Cloud TPU VM 사용자 가이드 &amp;nbsp;|&amp;nbsp; Google Cloud&quot; data-og-description=&quot;의견 보내기 Cloud TPU VM 사용자 가이드 이 가이드에서는 Cloud TPU VM을 사용하기 위해 Google Cloud Platform 프로젝트를 설정하는 방법을 설명합니다. 여기에서는 Cloud TPU VM을 사용하기 위한 명령어와 Clou&quot; data-og-host=&quot;cloud.google.com&quot; data-og-source-url=&quot;https://cloud.google.com/tpu/docs/users-guide-tpu-vm?hl=ko&quot; data-og-url=&quot;https://cloud.google.com/tpu/docs/users-guide-tpu-vm?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ds8rIP/hyPeI2JDjP/XNtwKLkAA1xkBaPFqik151/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://cloud.google.com/tpu/docs/users-guide-tpu-vm?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cloud.google.com/tpu/docs/users-guide-tpu-vm?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ds8rIP/hyPeI2JDjP/XNtwKLkAA1xkBaPFqik151/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Cloud TPU VM 사용자 가이드 &amp;nbsp;|&amp;nbsp; Google Cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;의견 보내기 Cloud TPU VM 사용자 가이드 이 가이드에서는 Cloud TPU VM을 사용하기 위해 Google Cloud Platform 프로젝트를 설정하는 방법을 설명합니다. 여기에서는 Cloud TPU VM을 사용하기 위한 명령어와 Clou&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cloud.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 해당하는 부분을 실행한다. 이때 project_id에 본인의 프로젝트 id를 기입해야한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNzez/btrIjK9FTgO/Wlf9tyasj8kyXAJhkDhXXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNzez/btrIjK9FTgO/Wlf9tyasj8kyXAJhkDhXXk/img.png&quot; data-alt=&quot;Cloud TPU 실행 전 기본 명령어들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNzez/btrIjK9FTgO/Wlf9tyasj8kyXAJhkDhXXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzNzez%2FbtrIjK9FTgO%2FWlf9tyasj8kyXAJhkDhXXk%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;842&quot; height=&quot;616&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud TPU 실행 전 기본 명령어들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Compute engine =&amp;gt; TPU로 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KAnRy/btrIlx2XWAQ/1ceyDAca0Xh53U7zvY03d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KAnRy/btrIlx2XWAQ/1ceyDAca0Xh53U7zvY03d1/img.png&quot; data-alt=&quot;compute engine 메뉴바&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KAnRy/btrIlx2XWAQ/1ceyDAca0Xh53U7zvY03d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKAnRy%2FbtrIlx2XWAQ%2F1ceyDAca0Xh53U7zvY03d1%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;477&quot; height=&quot;793&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;compute engine 메뉴바&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 노드 만들기 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV3rut/btrImPCgz5c/kCXQ65Hmi3Y1W53EAl1eak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV3rut/btrImPCgz5c/kCXQ65Hmi3Y1W53EAl1eak/img.png&quot; data-alt=&quot;TPU 노드 만들기 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV3rut/btrImPCgz5c/kCXQ65Hmi3Y1W53EAl1eak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV3rut%2FbtrImPCgz5c%2FkCXQ65Hmi3Y1W53EAl1eak%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;935&quot; height=&quot;649&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;649&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TPU 노드 만들기 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름 : 마음대로 지으면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영역 : Cloud TPU V3-8은 europe-west4-a에서만 사용할 수 있음(trc 이메일에 사용허가된 곳 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU&amp;nbsp; 설정 : TPU VM 아키텍처가 TPU를 로컬처럼 사용할 수 있어 편리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 유형 : V3-8(v2-8 쓰려면 영역을 us-central로 변경,)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 소프트웨어 버전 :&amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://cloud.google.com/tpu/docs/supported-tpu-versions?_ga=2.229750492.-1355497904.1643634023&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TPU VM 지원 되는 버전 참조&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUyhkk/btrIpuqm8T8/bNY9I0LsUL7XuojLDO61Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUyhkk/btrIpuqm8T8/bNY9I0LsUL7XuojLDO61Lk/img.png&quot; data-alt=&quot;VM 만들기 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUyhkk/btrIpuqm8T8/bNY9I0LsUL7XuojLDO61Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUyhkk%2FbtrIpuqm8T8%2FbNY9I0LsUL7XuojLDO61Lk%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;543&quot; height=&quot;752&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VM 만들기 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcJijG/btrImcc1Bdp/tJ7luPLZNyfZTbxoKK3vK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcJijG/btrImcc1Bdp/tJ7luPLZNyfZTbxoKK3vK1/img.png&quot; data-alt=&quot;만들기 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcJijG/btrImcc1Bdp/tJ7luPLZNyfZTbxoKK3vK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcJijG%2FbtrImcc1Bdp%2FtJ7luPLZNyfZTbxoKK3vK1%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;408&quot; height=&quot;826&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;826&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 GCP Cloud Shell을 열어서, Command로 작성하면 좀 더 편하게 시도할 수 있다&lt;/p&gt;
&lt;pre id=&quot;code_1658968028199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gcloud alpha compute tpus tpu-vm create [vm이름] \
--zone=[영역이름] \ 
--accelerator-type=[tpu타입] \ 
--version=[tpu소프트웨어]  #&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658968080049&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gcloud alpha compute tpus tpu-vm create tpuvm-tf \
--zone=europe-west4-a \
--accelerator-type=v3-8 \
--version=tpu-vm-tf-2.6.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud shell에 위와 같이 입력하면 승인 요청화면이 뜬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE59uj/btrIoBiZuMP/gkAOvkHiHXZw6GxcPfXn10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE59uj/btrIoBiZuMP/gkAOvkHiHXZw6GxcPfXn10/img.png&quot; data-alt=&quot;cloud shell 승인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE59uj/btrIoBiZuMP/gkAOvkHiHXZw6GxcPfXn10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE59uj%2FbtrIoBiZuMP%2FgkAOvkHiHXZw6GxcPfXn10%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;953&quot; height=&quot;276&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cloud shell 승인 화면&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; Cloud shell을 통해서 한번 ssh 접속을 해주어야 VSCODE를 통해 접속이 가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1659012890167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gcloud alpha compute tpus tpu-vm ssh [vm이름] --zone=europe-west4-a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPD0MA/btrInJv1WEc/FXhtzQT3aLqkHKqfagjyrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPD0MA/btrInJv1WEc/FXhtzQT3aLqkHKqfagjyrk/img.png&quot; data-alt=&quot;승인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPD0MA/btrInJv1WEc/FXhtzQT3aLqkHKqfagjyrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPD0MA%2FbtrInJv1WEc%2FFXhtzQT3aLqkHKqfagjyrk%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;487&quot; height=&quot;228&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;228&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;다음과 같은 화면이 뜨면 VM 내부로 진입한 것이며, 드디어 VSCODE로 접속할 준비가 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GFkaA/btrInIYdPQW/wszfA0zK64MvVbyUFLUwH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GFkaA/btrInIYdPQW/wszfA0zK64MvVbyUFLUwH0/img.png&quot; data-alt=&quot;cloud shell 에서 TPU vm SSH 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GFkaA/btrInIYdPQW/wszfA0zK64MvVbyUFLUwH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGFkaA%2FbtrInIYdPQW%2FwszfA0zK64MvVbyUFLUwH0%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;584&quot; height=&quot;224&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cloud shell 에서 TPU vm SSH 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VSCODE로 TPU-VM에 SSH 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VSCODE에 Remote-SSH 확장 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hnc5R/btrImPJ3iij/vnixZCY3D0G7ZBy3DXpaiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hnc5R/btrImPJ3iij/vnixZCY3D0G7ZBy3DXpaiK/img.png&quot; data-alt=&quot;vscode remote-ssh 확장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hnc5R/btrImPJ3iij/vnixZCY3D0G7ZBy3DXpaiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHnc5R%2FbtrImPJ3iij%2FvnixZCY3D0G7ZBy3DXpaiK%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;368&quot; height=&quot;74&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode remote-ssh 확장&lt;/figcaption&gt;
&lt;/figure&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;blob&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnUjgQ/btrIsQAFuo4/TRS8mUNIdypkO44xFhLdck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnUjgQ/btrIsQAFuo4/TRS8mUNIdypkO44xFhLdck/img.png&quot; data-alt=&quot;ssh 아이콘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnUjgQ/btrIsQAFuo4/TRS8mUNIdypkO44xFhLdck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnUjgQ%2FbtrIsQAFuo4%2FTRS8mUNIdypkO44xFhLdck%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;46&quot; height=&quot;390&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh 아이콘&lt;/figcaption&gt;
&lt;/figure&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;blob&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl5GO5/btrIq64PDN3/mxYMAhGqek56kXaG6Y1B7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl5GO5/btrIq64PDN3/mxYMAhGqek56kXaG6Y1B7K/img.png&quot; data-alt=&quot;ssh 대상 목록 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl5GO5/btrIq64PDN3/mxYMAhGqek56kXaG6Y1B7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl5GO5%2FbtrIq64PDN3%2FmxYMAhGqek56kXaG6Y1B7K%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;364&quot; height=&quot;225&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh 대상 목록 화면&lt;/figcaption&gt;
&lt;/figure&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;blob&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfJWLp/btrIn5yM7QL/9dhCT1LO35tkNlRGclEpm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfJWLp/btrIn5yM7QL/9dhCT1LO35tkNlRGclEpm1/img.png&quot; data-alt=&quot;ssh 구성 파일 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfJWLp/btrIn5yM7QL/9dhCT1LO35tkNlRGclEpm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfJWLp%2FbtrIn5yM7QL%2F9dhCT1LO35tkNlRGclEpm1%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;579&quot; height=&quot;127&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh 구성 파일 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config file을 저장할 파일 경로 setting (권한 문제 안생기도록 주의)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMUeY9/btrIn401Hco/KI08yRfEvNz2MvgtihY6oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMUeY9/btrIn401Hco/KI08yRfEvNz2MvgtihY6oK/img.png&quot; data-alt=&quot;ssh config file 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMUeY9/btrIn401Hco/KI08yRfEvNz2MvgtihY6oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMUeY9%2FbtrIn401Hco%2FKI08yRfEvNz2MvgtihY6oK%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;499&quot; height=&quot;211&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh config file 설정 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;저장 후 돌아오면 다시 톱니바퀴를 클릭 후, 저장한 파일의 경로의 config를 열어보자&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbCZCy/btrInZrwCJ2/LOs4a2a4QSTROY36j7Yci0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbCZCy/btrInZrwCJ2/LOs4a2a4QSTROY36j7Yci0/img.png&quot; data-alt=&quot;ssh config file 설정 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbCZCy/btrInZrwCJ2/LOs4a2a4QSTROY36j7Yci0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbCZCy%2FbtrInZrwCJ2%2FLOs4a2a4QSTROY36j7Yci0%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;590&quot; height=&quot;134&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssh config file 설정 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;config 파일이 열리게 되는데, 여기에 접속하는 정보를 적어준다&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1659014018397&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Host 식별 하기 좋은 이름
    HostName vm외부아이피주소
    User 본인이메일  # 골뱅이 뒤는 제외
    Port 22
    IdentityFile 본인의 openssh키 경로&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU 화면에서 vm외부 IP에 해당하는 주소를 적으면 됨&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ox50H/btrIuaZA6UL/2oZQtHWgDtaFVDltDJyCWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ox50H/btrIuaZA6UL/2oZQtHWgDtaFVDltDJyCWK/img.png&quot; data-alt=&quot;Cloud tpu vm 외부 ip 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ox50H/btrIuaZA6UL/2oZQtHWgDtaFVDltDJyCWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fox50H%2FbtrIuaZA6UL%2F2oZQtHWgDtaFVDltDJyCWK%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;764&quot; height=&quot;368&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud tpu vm 외부 ip 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;config에 적고 save하면, SSH 대상에 식별하기 위한 이름을 가진 목록이 뜸,&amp;nbsp; 우측 상단에 폴더 플러스 모양 클릭&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tPDTL/btrInHLINZd/FXptxKkSBg6ZJNylN82XL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tPDTL/btrInHLINZd/FXptxKkSBg6ZJNylN82XL0/img.png&quot; data-alt=&quot;vscode로 vm에 ssh 접속하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tPDTL/btrInHLINZd/FXptxKkSBg6ZJNylN82XL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtPDTL%2FbtrInHLINZd%2FFXptxKkSBg6ZJNylN82XL0%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;385&quot; height=&quot;141&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode로 vm에 ssh 접속하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;새로운 VSCODE 창이 활성화 되며 다음의 창이 뜸, ubuntu 이기 때문에 Linux 클릭&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AdLpB/btrItuYs7W5/NGeZkRS7MjlpQrJcK2leUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AdLpB/btrItuYs7W5/NGeZkRS7MjlpQrJcK2leUk/img.png&quot; data-alt=&quot;운영체제 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AdLpB/btrItuYs7W5/NGeZkRS7MjlpQrJcK2leUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAdLpB%2FbtrItuYs7W5%2FNGeZkRS7MjlpQrJcK2leUk%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;475&quot; height=&quot;94&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;운영체제 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yes를 입력하면, 한번 접속했던 기록을 토대로 위 linux 같은 선택을 다시 안해도 됨. yes 엔터&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR24aP/btrIn4zUPBV/EkvzEPZhqYpoUsBkHBglwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR24aP/btrIn4zUPBV/EkvzEPZhqYpoUsBkHBglwK/img.png&quot; data-alt=&quot;fingerprint 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR24aP/btrIn4zUPBV/EkvzEPZhqYpoUsBkHBglwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR24aP%2FbtrIn4zUPBV%2FEkvzEPZhqYpoUsBkHBglwK%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;190&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fingerprint 선택 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;putty를 통해 public key 생성시 사용했던 passphrase 입력&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I0ZMc/btrIq7ipIbk/aKZByT4EJOp6Oh6RIzZb51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I0ZMc/btrIq7ipIbk/aKZByT4EJOp6Oh6RIzZb51/img.png&quot; data-alt=&quot;passphrase 입력화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I0ZMc/btrIq7ipIbk/aKZByT4EJOp6Oh6RIzZb51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI0ZMc%2FbtrIq7ipIbk%2FaKZByT4EJOp6Oh6RIzZb51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;28&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;passphrase 입력화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 접속 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNBfRp/btrIt6C1zir/RLb8QkoKmFI7Fsg04hFUH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNBfRp/btrIt6C1zir/RLb8QkoKmFI7Fsg04hFUH0/img.png&quot; data-alt=&quot;VSCODE TPU VM 접속 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNBfRp/btrIt6C1zir/RLb8QkoKmFI7Fsg04hFUH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNBfRp%2FbtrIt6C1zir%2FRLb8QkoKmFI7Fsg04hFUH0%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;864&quot; height=&quot;678&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCODE TPU VM 접속 완료&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;초기의 VM은 python과 tensorflow등의 기본 소프트웨어만 설치되어 있어, VSCODE 확장부터 주피터 노트북까지 다양한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 설치해야한다. 이 내용은 2편에서 이어서 해보겠다&lt;/p&gt;
&lt;figure id=&quot;og_1659097187263&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;TPU-VM Colab처럼 활용하기&quot; data-og-description=&quot;이 글을 읽기전에, 아래의 세팅을 해두고 오셔야 내용이 이어집니다 Cloud TPU-VM에 VSCODE로 SSH 접속하기 TRC(TPU Research Cloud) TRC에 지원하면, 구글에서 경우에 따라 한달, 또는 두달 등의 TPU 무료 사용&quot; data-og-host=&quot;okdone.tistory.com&quot; data-og-source-url=&quot;https://okdone.tistory.com/145&quot; data-og-url=&quot;https://okdone.tistory.com/145&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cMc4vo/hyPeHYkhX0/7Es0AQYQ1jsLmFJkVRBz0k/img.png?width=756&amp;amp;height=526&amp;amp;face=0_0_756_526,https://scrap.kakaocdn.net/dn/cdYn6X/hyPf45qimf/nHT6PKHNolG1HodEIqZKl1/img.png?width=756&amp;amp;height=526&amp;amp;face=0_0_756_526,https://scrap.kakaocdn.net/dn/bjhHl4/hyPeJu2Yce/XLeN36dnZnkpOLnPNoueKK/img.png?width=662&amp;amp;height=701&amp;amp;face=0_0_662_701&quot;&gt;&lt;a href=&quot;https://okdone.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://okdone.tistory.com/145&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cMc4vo/hyPeHYkhX0/7Es0AQYQ1jsLmFJkVRBz0k/img.png?width=756&amp;amp;height=526&amp;amp;face=0_0_756_526,https://scrap.kakaocdn.net/dn/cdYn6X/hyPf45qimf/nHT6PKHNolG1HodEIqZKl1/img.png?width=756&amp;amp;height=526&amp;amp;face=0_0_756_526,https://scrap.kakaocdn.net/dn/bjhHl4/hyPeJu2Yce/XLeN36dnZnkpOLnPNoueKK/img.png?width=662&amp;amp;height=701&amp;amp;face=0_0_662_701');&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;TPU-VM Colab처럼 활용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 읽기전에, 아래의 세팅을 해두고 오셔야 내용이 이어집니다 Cloud TPU-VM에 VSCODE로 SSH 접속하기 TRC(TPU Research Cloud) TRC에 지원하면, 구글에서 경우에 따라 한달, 또는 두달 등의 TPU 무료 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okdone.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;이 글은, Google로부터 지속적으로 TRC 프로그램을 통해 TPU VM을 사용하는데에 감사한 마음으로, 오픈소스 커뮤니티에 기여하고자, 공익 목적의 튜토리얼 글로, 초보자들 또한 TPU-VM에 손쉽게 다가가서 사용할 수 있도록 돕고자 쓰여진 글입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TPU-VM 사용에 어려움이 있다면 언제든지 댓글을 주시거나, 제가 활동하고 있는 Tensorflow Korea 오픈채팅방에서 tf-keras-TPU trinity를 찾아주세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659015465249&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;텐서플로우 코리아 오픈채팅&quot; data-og-description=&quot;참여코드는 텐서플로우 만든 회사이름 영문6자리 (OOOOOO) #텐서플로우 #인공지능 #딥러닝&quot; data-og-host=&quot;open.kakao.com&quot; data-og-source-url=&quot;https://open.kakao.com/o/guMRCRl&quot; data-og-url=&quot;https://open.kakao.com/o/guMRCRl&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i35BM/hyPeR0srIk/glwLeEdXtdoTkAxY686S50/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://open.kakao.com/o/guMRCRl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://open.kakao.com/o/guMRCRl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i35BM/hyPeR0srIk/glwLeEdXtdoTkAxY686S50/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&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;텐서플로우 코리아 오픈채팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;참여코드는 텐서플로우 만든 회사이름 영문6자리 (OOOOOO) #텐서플로우 #인공지능 #딥러닝&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;open.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/TPU</category>
      <category>openssh</category>
      <category>putty</category>
      <category>SSH</category>
      <category>TPU</category>
      <category>trc</category>
      <category>VM</category>
      <category>vscode</category>
      <category>접속</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/144</guid>
      <comments>https://okdone.tistory.com/144#entry144comment</comments>
      <pubDate>Thu, 28 Jul 2022 09:32:09 +0900</pubDate>
    </item>
    <item>
      <title>스택의 응용, 다중 스택</title>
      <link>https://okdone.tistory.com/143</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;스택 응용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;산술식 표현&lt;/h3&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;연산자(operator) : 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호(산술 연산자 : +, -, *등)을 말함&lt;/li&gt;
&lt;li&gt;피연산자(operand) : 연산(operation)에 참여하는 변수 또는 값을 말함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;산술식의 내부 표현 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eoJfYt/btrIi7ct6WJ/nZ5tlrlNorweRjyG9BoB8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eoJfYt/btrIi7ct6WJ/nZ5tlrlNorweRjyG9BoB8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eoJfYt/btrIi7ct6WJ/nZ5tlrlNorweRjyG9BoB8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeoJfYt%2FbtrIi7ct6WJ%2FnZ5tlrlNorweRjyG9BoB8K%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;565&quot; height=&quot;109&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;109&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;h3 data-ke-size=&quot;size23&quot;&gt;산술식 변환&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;산술식의 변환 방법(괄호)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호를 사용한 중위 표현식의 전위/후위 표현 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;수식의 각 연산자에 대해서 우선순위에 따라 괄호를 사용하여 다시 표현&lt;/li&gt;
&lt;li&gt;각 연산자를 그에 대응하는 괄호의 전위(왼쪽), 후위(오른쪽)으로 이동&lt;/li&gt;
&lt;li&gt;괄호를 제거한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXyrr4/btrIkqbAh78/uVzv2uJ8FqTRAIr2zA99i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXyrr4/btrIkqbAh78/uVzv2uJ8FqTRAIr2zA99i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXyrr4/btrIkqbAh78/uVzv2uJ8FqTRAIr2zA99i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXyrr4%2FbtrIkqbAh78%2FuVzv2uJ8FqTRAIr2zA99i1%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;379&quot; height=&quot;229&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;산술식의 변환 방법(스택 사용)&lt;/h3&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-origin-width=&quot;522&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAUzWh/btrIoCaLP7z/AhDtEM29zpMUFkqbYWfoY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAUzWh/btrIoCaLP7z/AhDtEM29zpMUFkqbYWfoY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAUzWh/btrIoCaLP7z/AhDtEM29zpMUFkqbYWfoY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAUzWh%2FbtrIoCaLP7z%2FAhDtEM29zpMUFkqbYWfoY0%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;522&quot; height=&quot;295&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyOzj/btrImPBUSla/UVcafkyAF7Ef1akGSw1dP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyOzj/btrImPBUSla/UVcafkyAF7Ef1akGSw1dP0/img.png&quot; data-alt=&quot;산술식의 변환 예&amp;amp;amp;nbsp;- 중위 표현식 : A&amp;amp;amp;times;B+C&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyOzj/btrImPBUSla/UVcafkyAF7Ef1akGSw1dP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyOzj%2FbtrImPBUSla%2FUVcafkyAF7Ef1akGSw1dP0%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;408&quot; height=&quot;280&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;산술식의 변환 예&amp;amp;nbsp;- 중위 표현식 : A&amp;amp;times;B+C&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIhMAx/btrIoBiC8Nz/m1x35nZ367lUCNmkigwCT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIhMAx/btrIoBiC8Nz/m1x35nZ367lUCNmkigwCT1/img.png&quot; data-alt=&quot;변환 예&amp;amp;amp;nbsp;- 중위 표현식 : A&amp;amp;amp;times;B+C&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIhMAx/btrIoBiC8Nz/m1x35nZ367lUCNmkigwCT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIhMAx%2FbtrIoBiC8Nz%2Fm1x35nZ367lUCNmkigwCT1%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;414&quot; height=&quot;311&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변환 예&amp;amp;nbsp;- 중위 표현식 : A&amp;amp;times;B+C&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewTPYd/btrIjJPH1Cd/S6k60V9QBKQ4nGvjsQjmWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewTPYd/btrIjJPH1Cd/S6k60V9QBKQ4nGvjsQjmWK/img.png&quot; data-alt=&quot;중위 표현식 : A&amp;amp;amp;times;(B + C)/D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewTPYd/btrIjJPH1Cd/S6k60V9QBKQ4nGvjsQjmWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewTPYd%2FbtrIjJPH1Cd%2FS6k60V9QBKQ4nGvjsQjmWK%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;523&quot; height=&quot;332&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중위 표현식 : A&amp;amp;times;(B + C)/D&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658916244445&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt; //exit() 처리 
#include &amp;lt;ctype.h&amp;gt; //isdigit(char) 처리 
#include &amp;lt;string.h&amp;gt;
#define SIZE 100
char stack[SIZE];
int top =-1;
void push(char item){ //스택의 삽입 연산
	if(top &amp;gt;= SIZE-1 ){
		printf(&quot;\n스택 오버플로우.&quot;);}
	else{
		top = top+1;
		stack[top] = item; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중위 표현식 : A*(B+C)/D를 후위 표현식으로 변환하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658916302368&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char pop(){ //스택의 삭제 연산
	char item ;
	if(top &amp;lt;0){
	printf(&quot;스택 언더플로우 - 괄호에 의한 잘못된 중위 표현식:(((a+b)*c)&amp;rdquo;);
	getchar();
	exit(1 ); //오류 메시지 종료
	}
	else{
		item = stack[top];
		top = top-1;
		return(item);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-4838225698951385&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658922657805&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int is_operator(char symbol){ //기호가 연산자이면1을, 그렇지 않으면0을 반환
	if(symbol == '^' || symbol == '*' || symbol == '/' || symbol == '+' ||
		symbol =='-'){
		return1;}
	else{
		return0; }
}
int precedence(char symbol){ //연산자 우선순위 값 할당
	if(symbol == '^'){
		return(3);}
	else if(symbol == '*' || symbol == '/'){
		return(2 );}
	else if(symbol == '+' || symbol == '-'){
		return(1 );}
	else{
		return(0);}}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658922722209&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void InfixToPostfix(char infix_exp[], char postfix_exp[]){ //중위 표현식 변환
	int i, j;
	char item;
	char x;
	push('('); //'(' 를 스택에 push
	strcat(infix_exp,&quot;)&quot;); // ')' 를 중위 표현식에 추가
	i=0;
	j=0;
	item=infix_exp[i]; //초기화
	while(item != '\0'){ //중위 표현식이 끝날 때까지 반복
		if(item == '('){ //좌측 괄호를 스택에 삽입
			push(item);
	}
    else if( isdigit(item) || isalpha(item)){ //좌측 괄호의 숫자, 알파벳 판단
		postfix_exp[j] = item; //item을 배열 postfix-exp[]에 추가(출력)
		j++;
	}
	else if(is_operator(item) == 1 ){ //item이 연산자인 경우, isp와 icp를 고려
		x=pop();
		while(is_operator(x) == 1 &amp;amp;&amp;amp; precedence(x)&amp;gt;=precedence(item)){
			postfix_exp[j] = x;
			j++;
			x = pop();
		}
		push(x);
		push(item);
	}
    else if(item == ')'){ //현재의 기호가 ')'이면 &amp;lsquo;(＇를 만날 때까지 pop
		x = pop();
		while(x != '('){
			postfix_exp[j] = x; j++;
			x = pop();}
	else{
		printf(&quot;\n잘못된 중위 표현식\n&quot;);
		getchar();
		exit(1 );
	}
	i++;
	item = infix_exp[i]; //중위 표현식의 다음 심볼을 읽음
	} //while문 종료
	postfix_exp[j] =&amp;lsquo;\0';//후위 표현식 마지막에 '\0'를 추가
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658922878717&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	char infix[SIZE], postfix[SIZE]; // 중위 표현식과 후위 표현식을 선언
	printf(&quot;\n중위 표현식 : &quot;);
	gets(infix); //표준 입력으로 들어온 문자열을 저장
	InfixToPostfix(infix, postfix);
	printf(&quot;후위 표현식 : &quot;);
	puts(postfix);
	return 0;
}


result
중위 표현식 : A*(B+C)/D
후위 표현식 : ABC+*D/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스택 응용 : 산술식 평가&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;산술식(postfix) 평가 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 산술식 평가 : 표현식(산술식)으로부터 값을 도출하는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연산자 종류&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단항 연산자 : (+3)&lt;/li&gt;
&lt;li&gt;이항 연산자 : 3+4&lt;/li&gt;
&lt;li&gt;삼항 연산자 : num2 = num1 ? 100 : 200;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 후위 표현식 평가는 괄호가 필요없으며 우선 순위를 고려하지 않아도 됨&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;피연산자를 만나면 스택에 삽입한다.&lt;/li&gt;
&lt;li&gt;연산자를 만나면 필요한 만큼의 피연산자를 스택에서 삭제하여 연산하고, 연산결과를 다시 스택에 삽입한다&lt;/li&gt;
&lt;li&gt;1-2의 과정을 반복하여 수식이 끝나면, 마지막으로 스택에서 결과값을 삭제하여 출력한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUHOV/btrIlx2JHhD/0UetPTpDKKEWkfa7EI8KJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUHOV/btrIlx2JHhD/0UetPTpDKKEWkfa7EI8KJK/img.png&quot; data-alt=&quot;후위 표현식 34 x 63&amp;amp;amp;nbsp; / -&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUHOV/btrIlx2JHhD/0UetPTpDKKEWkfa7EI8KJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUHOV%2FbtrIlx2JHhD%2F0UetPTpDKKEWkfa7EI8KJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;313&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;후위 표현식 34 x 63&amp;amp;nbsp; / -&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658923820984&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MAX 20
typedef struct stack{
	int data[MAX];
	int top;
}stack;
int evaluate(char x, int op1, int op2 ){ //연산자에 따른 수식 평가
	if(x=='+') return (op1+op2 );
	if(x=='-') return (op1-op2 );
	if(x=='*') return (op1*op2 );
	if(x=='/') return (op1/op2 );
	if(x=='%') return (op1%op2 );
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658924036255&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void init(stack *s){ // 스택 top 포인터의 초기화
	s-&amp;gt;top=-1;
}
int empty(stack *s){ //스택의 empty 검사
	if(s-&amp;gt;top==-1 )
		return(1 );
	return(0);
}
int full(stack *s){ // 스택의 오버플로우 검사
	if(s-&amp;gt;top==MAX-1 )
		return(1 );
	return(0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658924059370&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void push(stack *s, int x){ // 스택에 x(피연산자)를 push
	s-&amp;gt;top=s-&amp;gt;top+1;
	s-&amp;gt;data[s-&amp;gt;top]=x;
}
int pop(stack *s){ //스택에서 피연산자를 pop
	int x;
	x=s-&amp;gt;data[s-&amp;gt;top];
	s-&amp;gt;top=s-&amp;gt;top-1;
	return(x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658924120767&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	stack s;
	char x;
	int op1,op2,val;
	init(&amp;amp;s);
	printf(&quot;\n후위 표현식 :&quot;);
	while((x=getchar())!='\n'){ //한 문자씩 후위 표현식을 읽음
		if(isdigit(x))
			push(&amp;amp;s, x-48); //x-48은 ASCII의 부작용을 제거하기 위함
		else{ //피연산자이면 스택에 2개의 피연산자를 pop
			op2=pop(&amp;amp;s);
			op1=pop(&amp;amp;s);
			val=evaluate(x,op1,op2 );
			push(&amp;amp;s, val); //계산 결과를 스택에 push
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658924144444&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	val=pop(&amp;amp;s); //평가 결과값
	printf(&quot;\n후위 표현식 평가 결과값 = %d&quot;, val);
	return 0;
}

result
후위 표현식 :34*63/-
후위 표현식 평가 결과값 = 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다중 스택&lt;/h2&gt;
&lt;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;/li&gt;
&lt;li&gt;배열에서 두 개의&amp;nbsp; 스택을 독립적으로 운영하면 단일 스택보다 2배의 공간을 활용할 수 있음(오버플로우화 현상 감소)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원 배열로 2개 스택의 운영 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입 : stack-1은 stack[m-1] 방향으로 top-1을 증가하고 stack-2는 stack[0]방향으로 top-2를 감소함&lt;/li&gt;
&lt;li&gt;삭제 : stack-1은 stack[0] 방향으로 top-1을 감소하고 stack-2는 stack[m-1] 방향으로 top-2를 증가함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JhUXX/btrIoIWq3aS/rk78BkceKpJkVTKw71ncK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JhUXX/btrIoIWq3aS/rk78BkceKpJkVTKw71ncK1/img.png&quot; data-alt=&quot;다중 스택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JhUXX/btrIoIWq3aS/rk78BkceKpJkVTKw71ncK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJhUXX%2FbtrIoIWq3aS%2Frk78BkceKpJkVTKw71ncK1%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;517&quot; height=&quot;111&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다중 스택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단일 배열의 다중 스택(multi-stack)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1차원 배열로 2개의 스택 운영 프로그램&lt;/h4&gt;
&lt;pre id=&quot;code_1658925730447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;malloc.h&amp;gt;
#define MAX 10
int stack[MAX], topA =-1, topB = MAX;
void push_stackA(int val){ //스택A에 원소 삽입
	if(topA == topB-1 )
		printf(&quot;\n 스택 오버플로우&quot;);
	else{
		topA=topA+1;
		stack[topA] = val;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658925814563&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int pop_stackA(){ //스택A에서 원소 삭제
	int val;
	if(topA ==-1 ){
		printf(&quot;\n 스택 언더플로우&quot;);}
	else{
	val = stack[topA];
	topA=topA-1; }
	return val;}
void display_stackA(){ //스택A의 원소들을 출력
	int ;
	if(topA ==-1 )
		printf(&quot;\n 스택이 비었음&quot;);
	else{
	for(i = topA;i &amp;gt;= 0;i--)
		printf(&quot;\t %d&quot;, stack[i]);}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658926503650&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void push_stackB(int val){//스택B에 원소 삽입
	if(topB-1 == topA){
		printf(&quot;\n 스택 오버플로우&quot;);}
	else{
		topB=topB-1;
		stack[topB] = val;}
}
int pop_stackB(){//스택B에서 원소 삭제
	int val;
	if(topB == MAX){
		printf(&quot;\n 스택 언더플로우&quot;);}
	else{
		val = stack[topB];
		topB=topB+1;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658926576786&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void display_stackB(){//스택B의 원소들을 출력
	int i;
	if(topB == MAX)
	printf(&quot;\n 스택이 비었음&quot;);
	else{
		for(i = topB;i &amp;lt; MAX;i++)
			printf(&quot;\t %d&quot;, stack[i]);}
}
int main(){
	int option, val;
	printf(&quot;\n -----메뉴----- &quot;);
	printf(&quot;\n 1. 스택A에 원소를 삽입&quot;);
	printf(&quot;\n 2. 스택B에 원소를 삽입&quot;);
	printf(&quot;\n 3. 스택A에서 원소를 삭제&quot;);
	printf(&quot;\n 4. 스택B에서 원소를 삭제&quot;);
	printf(&quot;\n 5. 스택A의 원소들을 출력&quot;);
    printf(&quot;\n 6. 스택B의 원소들을 출력&quot;);
	printf(&quot;\n 7. 종료&quot;);
	do{
		printf(&quot;\n 연산에 해당되는 번호를 선택하세요 : &quot;);
		scanf(&quot;%d&quot;, &amp;amp;option);
		switch(option){
			case 1: printf(&quot;\n 스택A에 삽입할 원소를 입력 :&quot;);
					scanf(&quot;%d&quot;, &amp;amp;val);
					push_stackA(val);
					break;
			case 2: printf(&quot;\n 스택B에 삽입할 원소를 입력 :&quot;);
					scanf(&quot;%d&quot;,&amp;amp;val);
					push_stackB(val);
					break;
            case 3: printf(&quot;\n 스택A에서 삭제된 원소 = %d&quot;, val);
					pop_stackA();
					break;
			case 4: printf(&quot;\n 스택B에서 삭제된 원소 = %d&quot;, val);
					pop_stackB();
					break;
			case 5: printf(&quot;\n 스택A의 원소들 :\n&quot;);
					display_stackA();
					break;
			case 6: printf(&quot;\n 스택B의 원소들 :\n&quot;);
					display_stackB();
					break;
		}
	} while(option != 7);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658926849355&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result
-----메뉴-----
1. 스택A에 원소를 삽입
2. 스택B에 원소를 삽입
3. 스택A에서 원소를 삭제
4. 스택B에서 원소를 삭제
5. 스택A의 원소들을 출력
6. 스택B의 원소들을 출력
7. 종료
연산에 해당되는 번호를 선택하세요 :1
스택A에 삽입할 원소를 입력 : 10
연산에 해당되는 번호를 선택하세요 :1
스택A에 삽입할 원소를 입력 : 20
연산에 해당되는 번호를 선택하세요 :5
스택A의 원소들:
20 10
연산에 해당되는 번호를 선택하세요:&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;1차원 배열로 스택 n개를 운영하는 경우(균등 분배, 차등 분배)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;균등 분배 ( stack[m]에 대해 n개의 스택을 표현)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 스택 i에 대하여 b[i]는 그 스택의 최하위 요소보다 하나 작은 위치를 나타냄&lt;/li&gt;
&lt;li&gt;각 스택의 t[i] (1 &amp;lt;= i &amp;lt;= n)는 스택 i의 최상위 요소를 나타냄&lt;/li&gt;
&lt;li&gt;i번째 스택의 공백상태는 b[i] = t[i]&lt;/li&gt;
&lt;li&gt;i번째 스택의 오버플로우 상태는 t[i] = b[i+1]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbNGA/btrIjMe5VYj/ZIsImSXEwhPLbaSvtmNz71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbNGA/btrIjMe5VYj/ZIsImSXEwhPLbaSvtmNz71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbNGA/btrIjMe5VYj/ZIsImSXEwhPLbaSvtmNz71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbNGA%2FbtrIjMe5VYj%2FZIsImSXEwhPLbaSvtmNz71%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;509&quot; height=&quot;204&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다중 스택의 삽입에서 오버플로 해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택i와 스택i+1이 만나는 경우 오버플로 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VdsHp/btrIps6ZxC1/BhkBdK0r7a0JMWdpmiJa30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VdsHp/btrIps6ZxC1/BhkBdK0r7a0JMWdpmiJa30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VdsHp/btrIps6ZxC1/BhkBdK0r7a0JMWdpmiJa30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVdsHp%2FbtrIps6ZxC1%2FBhkBdK0r7a0JMWdpmiJa30%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;537&quot; height=&quot;310&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;497&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mzydb/btrInHRlf6J/e7ri99uPdq2blVP2XGDVtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mzydb/btrInHRlf6J/e7ri99uPdq2blVP2XGDVtK/img.png&quot; data-alt=&quot;Knuth의 repacking 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mzydb/btrInHRlf6J/e7ri99uPdq2blVP2XGDVtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMzydb%2FbtrInHRlf6J%2Fe7ri99uPdq2blVP2XGDVtK%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;497&quot; height=&quot;268&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Knuth의 repacking 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택은 산술식 변환이나 평가에 활용가능&lt;/li&gt;
&lt;li&gt;다중 스택은 여러 개의 스택을 운용하는 경우로서 일반적으로 스택의 오버플로우 발생을 방지하기 위해 사용되는 자료구조이다&lt;/li&gt;
&lt;li&gt;단일 스택은 오버플로우 발생 시 실제 작업에 필요한 자료를 사용할 수 없으며, 중간에 작업을 중단하고 배열의 크기를 다시 재 선언해야 한다&lt;/li&gt;
&lt;li&gt;다중 스택은 오버플로우 발생 시 스택의 많은 요소들이 이동 및 재 배열되어야 하는 문제 점(repacking 작업)이 있으며 비순차표현(연결구조)으로 구현하여 해결할 수 있다.&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;</description>
      <category>23년 이전 글/알고리즘</category>
      <category>다중스택</category>
      <category>배열</category>
      <category>산술식</category>
      <category>스택</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/143</guid>
      <comments>https://okdone.tistory.com/143#entry143comment</comments>
      <pubDate>Wed, 27 Jul 2022 19:06:03 +0900</pubDate>
    </item>
    <item>
      <title>관계 대수 확장, 해석, 관계 연산 정리</title>
      <link>https://okdone.tistory.com/142</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수 확장&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 연산자 기능&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXt5aw/btrInJHW67G/Jt1SpdbXEKLeBwv3BB6MJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXt5aw/btrInJHW67G/Jt1SpdbXEKLeBwv3BB6MJK/img.png&quot; data-alt=&quot;관계 연산 기능들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXt5aw/btrInJHW67G/Jt1SpdbXEKLeBwv3BB6MJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXt5aw%2FbtrInJHW67G%2FJt1SpdbXEKLeBwv3BB6MJK%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;390&quot; height=&quot;390&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관계 연산 기능들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수 한계&lt;/h3&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;집단 함수 (aggregate function)를 지원하지 않음&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수의 확장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세미 조인, 외부 조인, 외부 합집합, 집단 함수, 그룹화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;외부 합집합&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfXGSE/btrIjMlsM7K/Slpufkyx80WdDaDnzPqJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfXGSE/btrIjMlsM7K/Slpufkyx80WdDaDnzPqJtk/img.png&quot; data-alt=&quot;합병 가능하지 않은 두 relation을 차수를 확장하여 합집합 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfXGSE/btrIjMlsM7K/Slpufkyx80WdDaDnzPqJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfXGSE%2FbtrIjMlsM7K%2FSlpufkyx80WdDaDnzPqJtk%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;492&quot; height=&quot;315&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;합병 가능하지 않은 두 relation을 차수를 확장하여 합집합 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;집단 함수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUM, AVG, COUNT, MAX, MIN&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;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO4An7/btrIipdt3WM/KH3jGts3XaU6Sw9mAUpyQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO4An7/btrIipdt3WM/KH3jGts3XaU6Sw9mAUpyQK/img.png&quot; data-alt=&quot;질의 : 모든 사원들의 급여의 평균은?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO4An7/btrIipdt3WM/KH3jGts3XaU6Sw9mAUpyQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO4An7%2FbtrIipdt3WM%2FKH3jGts3XaU6Sw9mAUpyQK%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;463&quot; height=&quot;288&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;288&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그룹화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attribute들 값에 의해서 그룹으로 분할되고, 분할된 각 그룹의 튜플들의 집합에 대해서 집단 함수 적용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciZdS3/btrIi5S8WEJ/yD7JDFZm9xoXjGf0SkRxD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciZdS3/btrIi5S8WEJ/yD7JDFZm9xoXjGf0SkRxD0/img.png&quot; data-alt=&quot;그룹화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciZdS3/btrIi5S8WEJ/yD7JDFZm9xoXjGf0SkRxD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciZdS3%2FbtrIi5S8WEJ%2FyD7JDFZm9xoXjGf0SkRxD0%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;524&quot; height=&quot;236&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;236&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 해석(relational calculus)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학의 프레디킷 해석에 기반함(predicate : a function whose values is true or false)&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;튜플 관계 해석(tuple relation calculus) - 튜플을 기준으로 데이터 조회&lt;/li&gt;
&lt;li&gt;도메인 관계 해석(domain relation calculus) - 속성을 기준으로 데이터 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 해석 기호&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;exist;: 존재의의미(There exist)&lt;/li&gt;
&lt;li&gt;&amp;isin; : t가r에원소(속함) ( t &amp;isin; r )&lt;/li&gt;
&lt;li&gt;&amp;forall; : 모든것(임의의) 에대하여(for all)&lt;/li&gt;
&lt;li&gt;&amp;cup; : 합집합&lt;/li&gt;
&lt;/ul&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;/h4&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;원하는 relation을 튜플 해석식 (tuple calculus expression)표기&lt;/li&gt;
&lt;li&gt;튜플 해석식의 구성요소&lt;/li&gt;
&lt;/ul&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;지정된 relation의 한 튜플만을 값으로 취하는 변수&lt;/li&gt;
&lt;li&gt;튜플 변수는 취할 수 있는 튜플의 relation이 명세되어야 함&lt;/li&gt;
&lt;li&gt;튜플 변수의 예 : R(t)&lt;/li&gt;
&lt;/ul&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;튜플 변수에서 특정 속성의 값을 갖는 속성(t.A)&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원자(atom) - 원자의 실행 결과는 참 또는 거짓 예) R(t), t.A&amp;theta; u.B, t.A&amp;theta; c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정형식(well-formed formula),&amp;nbsp; 원자, 불리언 연산자, 정량자가 결합된 식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정형식의 예) s.Sno = 100, c.Cno&amp;ne; e.Cno, s.Sno= e.Sno&amp;and; e.Cno&amp;ne; c.Cno, &amp;middot;(&amp;exist;e)(e.Sno= s.Sno&amp;and; e.Cno= 'C413')&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;셀렉트연산: { t | EMPLOYEE(t) and t.SALARY&amp;gt;5000 }&lt;/li&gt;
&lt;li&gt;프로젝트연산: { t.FNAME, t.LNAME| EMPLOYEE(t) }&lt;/li&gt;
&lt;li&gt;-셀렉트+ 프로젝트: { t.FNAME, t.LNAME| EMPLOYEE(t) and t.SALARY&amp;gt; 50000}&lt;/li&gt;
&lt;/ul&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;469&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEpqV/btrIjOjiQuj/CqnaMZPdqeiLPDTZQaBmfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEpqV/btrIjOjiQuj/CqnaMZPdqeiLPDTZQaBmfk/img.png&quot; data-alt=&quot;튜플 해석식 표기 형식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEpqV/btrIjOjiQuj/CqnaMZPdqeiLPDTZQaBmfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEpqV%2FbtrIjOjiQuj%2FCqnaMZPdqeiLPDTZQaBmfk%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;469&quot; height=&quot;380&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;380&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP2wGJ/btrIn5jMoUp/oq3UgCXQ41pnHcpSd2wUjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP2wGJ/btrIn5jMoUp/oq3UgCXQ41pnHcpSd2wUjK/img.png&quot; data-alt=&quot;튜플 해석식 질의문 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP2wGJ/btrIn5jMoUp/oq3UgCXQ41pnHcpSd2wUjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP2wGJ%2FbtrIn5jMoUp%2Foq3UgCXQ41pnHcpSd2wUjK%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;510&quot; height=&quot;363&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;튜플 해석식 질의문 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biXJU8/btrIlxuAM8q/4Okj3mbXxMxYmROBAPIwZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biXJU8/btrIlxuAM8q/4Okj3mbXxMxYmROBAPIwZK/img.png&quot; data-alt=&quot;튜플 해석식 질의문 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biXJU8/btrIlxuAM8q/4Okj3mbXxMxYmROBAPIwZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiXJU8%2FbtrIlxuAM8q%2F4Okj3mbXxMxYmROBAPIwZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;361&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;튜플 해석식 질의문 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUhnJh/btrIi6dtJzw/mNWJEzKMdQK2UW8Ts4KEFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUhnJh/btrIi6dtJzw/mNWJEzKMdQK2UW8Ts4KEFK/img.png&quot; data-alt=&quot;튜플 해석식 질의문 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUhnJh/btrIi6dtJzw/mNWJEzKMdQK2UW8Ts4KEFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUhnJh%2FbtrIi6dtJzw%2FmNWJEzKMdQK2UW8Ts4KEFK%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;638&quot; height=&quot;75&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;튜플 해석식 질의문 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/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;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;지정된 attribute에 대한 도메인의 한 원소만을 취하는 변수&lt;/li&gt;
&lt;li&gt;각 도메인 변수는 해당 도메인을 선언해야함&lt;/li&gt;
&lt;li&gt;x회원번호, x회원명&lt;/li&gt;
&lt;li&gt;범위식 : 도서(x도서번호, x도서명, x출판사)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원자 (atom)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R(x1 ,x2 ,&amp;hellip;,xn ), x &amp;theta; y, x &amp;theta; c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;①R : 범위릴레이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;②x, y : 도메인변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③&amp;theta; : 비교연산자(=, &amp;ne;, &amp;lt;, &amp;le;, &amp;gt;,&amp;ge;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④c : 상수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정형식(WFF, Well-Formed Formila)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원자, 불리언연산자(&amp;and;, &amp;or;,  ), 정량자(&amp;forall;,&amp;exist;)가다음규칙에따라결합되어표현된식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;①모든원자는WFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;②F가WFF이면, (F)와  F도WFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③F와G가WFF이면, F&amp;and;G와F&amp;or;G도WFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④도메인변수x가자유변수로사용된F(x)가WFF이면, (&amp;forall;x)(F(x))와(&amp;exist;x)(F(x))도WFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤위의규칙만을 반복 적용해서 만들어진 식은 WFF&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;546&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Vkvt/btrIoBCLVt4/mqcWPa41Bwo7HBIfqzZMNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Vkvt/btrIoBCLVt4/mqcWPa41Bwo7HBIfqzZMNk/img.png&quot; data-alt=&quot;도메인 해석식 표기 형식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Vkvt/btrIoBCLVt4/mqcWPa41Bwo7HBIfqzZMNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Vkvt%2FbtrIoBCLVt4%2FmqcWPa41Bwo7HBIfqzZMNk%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;546&quot; height=&quot;188&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도메인 해석식 표기 형식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 해석식 예제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{ xSname｜STUDENT(xSno, xSname, xYear, xDept)}&lt;/li&gt;
&lt;li&gt;{ xSname｜(&amp;exist;xDept)(STUDENT(xSno, xSname, xYear, xDept)&amp;and; xDept='컴퓨터&amp;rsquo;) }&lt;/li&gt;
&lt;li&gt;{ xSno, xDept｜STUDENT(xSno, xSname, xYear, xDept)&amp;and; (&amp;exist;xxSno) (&amp;exist;xGrade)(ENROL(xxSno, xCno, xGrade, xMidterm, xFinal) &amp;and; xSno=xxSno &amp;and; xGrade='A&amp;lsquo;) }&lt;/li&gt;
&lt;/ul&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;564&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLcbfQ/btrIjLGS6JM/kCXzzrxSnKxMQRGyrdpakK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLcbfQ/btrIjLGS6JM/kCXzzrxSnKxMQRGyrdpakK/img.png&quot; data-alt=&quot;도메인 해석식을 이용한 질의문 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLcbfQ/btrIjLGS6JM/kCXzzrxSnKxMQRGyrdpakK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLcbfQ%2FbtrIjLGS6JM%2FkCXzzrxSnKxMQRGyrdpakK%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;564&quot; height=&quot;103&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도메인 해석식을 이용한 질의문 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEQgj/btrIioZ0xnE/xPPovTMnyd5hxdfJEJviM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEQgj/btrIioZ0xnE/xPPovTMnyd5hxdfJEJviM1/img.png&quot; data-alt=&quot;도메인 해석식을 이용한 질의문 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEQgj/btrIioZ0xnE/xPPovTMnyd5hxdfJEJviM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEQgj%2FbtrIioZ0xnE%2FxPPovTMnyd5hxdfJEJviM1%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;641&quot; height=&quot;245&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;245&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;
&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;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL9y45/btrIiKIyhDW/d0nkninL6Po8svE6kXuvZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL9y45/btrIiKIyhDW/d0nkninL6Po8svE6kXuvZK/img.png&quot; data-alt=&quot;과목 C413에서 성적이 A인 학생의 학번을 모두 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL9y45/btrIiKIyhDW/d0nkninL6Po8svE6kXuvZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL9y45%2FbtrIiKIyhDW%2Fd0nkninL6Po8svE6kXuvZK%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;313&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과목 C413에서 성적이 A인 학생의 학번을 모두 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clIECg/btrIn4d8Jdq/RLYLI4IUAiaVVEfSSgbEO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clIECg/btrIn4d8Jdq/RLYLI4IUAiaVVEfSSgbEO0/img.png&quot; data-alt=&quot;기말 성적이 90점 이상인 학생의 학번과 이름을 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clIECg/btrIn4d8Jdq/RLYLI4IUAiaVVEfSSgbEO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclIECg%2FbtrIn4d8Jdq%2FRLYLI4IUAiaVVEfSSgbEO0%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;665&quot; height=&quot;352&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기말 성적이 90점 이상인 학생의 학번과 이름을 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv5ImK/btrIiE87xQI/o3mchsAqYGmvZG8wXU1cGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv5ImK/btrIiE87xQI/o3mchsAqYGmvZG8wXU1cGK/img.png&quot; data-alt=&quot;과목 C324에 등록하지 않은 학생의 이름을 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv5ImK/btrIiE87xQI/o3mchsAqYGmvZG8wXU1cGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv5ImK%2FbtrIiE87xQI%2Fo3mchsAqYGmvZG8wXU1cGK%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;582&quot; height=&quot;319&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;과목 C324에 등록하지 않은 학생의 이름을 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 연산 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 데이터 연산&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원하는 데이터를 얻기 위해 필요한 처리 요구를 relation에 수행하는 것&lt;/li&gt;
&lt;li&gt;관계 대수(relational algebra)&lt;/li&gt;
&lt;li&gt;relation을 처리하기 위한 연산의 집합&lt;/li&gt;
&lt;li&gt;어떻게 질의를 수행할 것인가 명시하는 절차적 언어(How, What)&lt;/li&gt;
&lt;li&gt;관계 대수는 상용 관계 DBMS들에서 널리 사용되는 SQL의 이론적인 기초&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관계 해석(relational calculus)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않음(What)&lt;/li&gt;
&lt;li&gt;비절차 언어(nonprocedurral language)&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;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수 연산자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 집합 연산자와 순수 관계 연산자로 구성&lt;/li&gt;
&lt;li&gt;일반 집합 연산자와 순수 관계 연산자로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 집합 연산자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;-합집합(UNION, &amp;cup;) ,교집합(INTERSECT, &amp;cap;), 차집합(DIFFERENCE, -)&lt;/li&gt;
&lt;li&gt;카티션프로덕트(CARTESIAN PRODUCT, &amp;times;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 관계 연산자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;SELECT, PROJECT, JOIN, DIVISION&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 해석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학의 프레디킷 해석에 기반, predicate : a function whose values is true or false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않는 선언적인 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비절차 언어(nonprocedurral language)&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;튜플 관계 해석(tuple relation calculus), 튜플을 기준으로 데이터 조회&lt;/li&gt;
&lt;li&gt;도메인 관계 해석(domain relation calculus), 속성을 기준으로 데이터 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집단함수 : SUM, AVG, COCUNT, MAX, MIN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹화 : attribute들의 값에 의해서 그룹으로 분할되고, 분할된 각 그룹의 튜플들의 집합에 대해서 집단 함수를 적용&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;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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/데이터베이스</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/142</guid>
      <comments>https://okdone.tistory.com/142#entry142comment</comments>
      <pubDate>Wed, 27 Jul 2022 17:37:19 +0900</pubDate>
    </item>
    <item>
      <title>관계 연산자, 조인</title>
      <link>https://okdone.tistory.com/141</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수 - 순수 관계 연산자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조인 연산자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 Relation으로부터 연관된 튜플들을 결합하는 연산자&lt;/li&gt;
&lt;li&gt;관계 데이터베이스에서 Relation간의 관계를 다루는데 매우 중요한 연산자&lt;/li&gt;
&lt;li&gt;조인의 유형(theta join, equijoin, natural join, outer join, semijoin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/donRlb/btrIkqaIijb/rne27zzTX346BLkXEXachK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/donRlb/btrIkqaIijb/rne27zzTX346BLkXEXachK/img.png&quot; data-alt=&quot;조인 연산 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/donRlb/btrIkqaIijb/rne27zzTX346BLkXEXachK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdonRlb%2FbtrIkqaIijb%2Frne27zzTX346BLkXEXachK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;127&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조인 연산 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEywuM/btrIlwBL0zk/2ZkjcKmEii944n8dAP46w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEywuM/btrIlwBL0zk/2ZkjcKmEii944n8dAP46w1/img.png&quot; data-alt=&quot;조인 연산 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEywuM/btrIlwBL0zk/2ZkjcKmEii944n8dAP46w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEywuM%2FbtrIlwBL0zk%2F2ZkjcKmEii944n8dAP46w1%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;606&quot; height=&quot;309&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조인 연산 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세타 조인, 동등 조인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 Relation R(A1, A2,...,An)과 S(B1,B2,...,BM)의 세타 조인 결과는 차수가 n+m이고, 애트리뷰트가 (A1,A2,...,An,B1,B2,...,Bm)이며, 조인 조건을 만족하는 튜플들로 이루어진 릴레이션&lt;/li&gt;
&lt;li&gt;세타는 {=,&amp;lt;&amp;gt;,&amp;lt;=,&amp;lt;,&amp;gt;=,&amp;gt;} 중의 하나&lt;/li&gt;
&lt;li&gt;사용형식 : R ⋈ R.Attribute&amp;theta; S.AttributeS&lt;/li&gt;
&lt;li&gt;동등 조인은 세타 조인 중에서 비교 연산자가 =인 조인(R ⋈ A=B S ＝{ r&amp;middot;s| r&amp;isin;R&amp;and; s&amp;isin;S&amp;and; ( r.A＝s.B) })&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dff7ss/btrIiEOaRHi/MedpvSstszFouF0GfVTAKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dff7ss/btrIiEOaRHi/MedpvSstszFouF0GfVTAKK/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dff7ss/btrIiEOaRHi/MedpvSstszFouF0GfVTAKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdff7ss%2FbtrIiEOaRHi%2FMedpvSstszFouF0GfVTAKK%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;537&quot; height=&quot;326&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mzx87/btrIjL7iU8W/jRRnwMu2uW4trqzYSyP9kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mzx87/btrIjL7iU8W/jRRnwMu2uW4trqzYSyP9kk/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mzx87/btrIjL7iU8W/jRRnwMu2uW4trqzYSyP9kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMzx87%2FbtrIjL7iU8W%2FjRRnwMu2uW4trqzYSyP9kk%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;605&quot; height=&quot;290&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자연 조인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동등 조인의 결과 Relation에서 조인 속성을 한 개 제외한 조인&lt;/li&gt;
&lt;li&gt;여러 가지 조인 연산자들 중 가장 자주 사용됨&lt;/li&gt;
&lt;li&gt;실제로 관계 데이터베이스에서 대부분의 질의는 selection, projection, natural join으로 표현 가능&lt;/li&gt;
&lt;li&gt;사용 형식 (R ⋈ N R.attribute, S.attributeS)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IWour/btrIlxgneZS/LIkphp9XSWEF8KAmMOKGY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IWour/btrIlxgneZS/LIkphp9XSWEF8KAmMOKGY0/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 자연조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IWour/btrIlxgneZS/LIkphp9XSWEF8KAmMOKGY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIWour%2FbtrIlxgneZS%2FLIkphp9XSWEF8KAmMOKGY0%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;501&quot; height=&quot;328&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 자연조인&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ptBCI/btrIi64R25U/mlkAzZn2Rkj9nPM92WLir1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ptBCI/btrIi64R25U/mlkAzZn2Rkj9nPM92WLir1/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 자연조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ptBCI/btrIi64R25U/mlkAzZn2Rkj9nPM92WLir1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FptBCI%2FbtrIi64R25U%2FmlkAzZn2Rkj9nPM92WLir1%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;606&quot; height=&quot;291&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 자연조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;외부조인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인 과정에서 상대 relation에서 대응되는 튜플이 없을 경우, 이를 제외하지 않고 상대를 Null값을 갖는 튜플로 결과 relation에 포함시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 외부 조인(left outer join), 오른쪽 외부 조인(right outer join), 완전 외부 조인(full outer join)&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 relation R과 S의 왼쪽 외부 조인 연산은 R의 모든 튜플들을 결과에 포함시킴&lt;/li&gt;
&lt;li&gt;Relation S에 관련된 튜플이 없으면 결과 Relation에서 RelationS의 attribute들은 null 값으로 채움&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deEV4X/btrIjNjHib2/DqCSNimzjzc8hmIsCDLxPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deEV4X/btrIjNjHib2/DqCSNimzjzc8hmIsCDLxPk/img.png&quot; data-alt=&quot;자연 조인과 왼쪽 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deEV4X/btrIjNjHib2/DqCSNimzjzc8hmIsCDLxPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeEV4X%2FbtrIjNjHib2%2FDqCSNimzjzc8hmIsCDLxPk%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;423&quot; height=&quot;185&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자연 조인과 왼쪽 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr9fLd/btrIlwhsj1l/eyl1TRE7vlt1m9GvXshXOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr9fLd/btrIlwhsj1l/eyl1TRE7vlt1m9GvXshXOk/img.png&quot; data-alt=&quot;자연 조인과 왼쪽 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr9fLd/btrIlwhsj1l/eyl1TRE7vlt1m9GvXshXOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr9fLd%2FbtrIlwhsj1l%2Feyl1TRE7vlt1m9GvXshXOk%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;603&quot; height=&quot;303&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자연 조인과 왼쪽 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오른쪽 외부조인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation R과 S의 오른쪽 외부 조인 연산은 S의 모든 튜플들을 결과에 포함시키고&lt;/li&gt;
&lt;li&gt;만일 Relation R에 관련된 튜플이 없으면 결과 Relation에서 Relation R의 Attribute들은 Null 값으로 채움&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ekZQ/btrIjL0zRIK/1JaFVmnhcOEKYJXQkht5YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ekZQ/btrIjL0zRIK/1JaFVmnhcOEKYJXQkht5YK/img.png&quot; data-alt=&quot;R과 S의 오른쪽 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ekZQ/btrIjL0zRIK/1JaFVmnhcOEKYJXQkht5YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ekZQ%2FbtrIjL0zRIK%2F1JaFVmnhcOEKYJXQkht5YK%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;434&quot; height=&quot;76&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;R과 S의 오른쪽 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF5sJx/btrImdaWVUL/VPJTAfaCczjwyhYK5ES0E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF5sJx/btrImdaWVUL/VPJTAfaCczjwyhYK5ES0E0/img.png&quot; data-alt=&quot;R과 S의 오른쪽 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF5sJx/btrImdaWVUL/VPJTAfaCczjwyhYK5ES0E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF5sJx%2FbtrImdaWVUL%2FVPJTAfaCczjwyhYK5ES0E0%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;607&quot; height=&quot;313&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;R과 S의 오른쪽 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;완전 외부조인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation R과 S의 완전 외부 조인 연산은 R과 S의 모든 튜플들을 결과에 포함시키고&lt;/li&gt;
&lt;li&gt;만일 상대 Relation에 관련 튜플이 없으면 결과 Relation에서 상대 Relation의 속성들은 Null값으로 채움&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhIMwX/btrIlxAGupc/XxdR8Y8f3jpHZXMcZkt8V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhIMwX/btrIlxAGupc/XxdR8Y8f3jpHZXMcZkt8V0/img.png&quot; data-alt=&quot;완전 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhIMwX/btrIlxAGupc/XxdR8Y8f3jpHZXMcZkt8V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhIMwX%2FbtrIlxAGupc%2FXxdR8Y8f3jpHZXMcZkt8V0%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;544&quot; height=&quot;137&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSJB4q/btrIi5SvmmK/EUSqXMZEMKqVD5x73JVJZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSJB4q/btrIi5SvmmK/EUSqXMZEMKqVD5x73JVJZK/img.png&quot; data-alt=&quot;완전 외부 조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSJB4q/btrIi5SvmmK/EUSqXMZEMKqVD5x73JVJZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSJB4q%2FbtrIi5SvmmK%2FEUSqXMZEMKqVD5x73JVJZK%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;605&quot; height=&quot;320&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완전 외부 조인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세미 조인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation R1과 R2에서 조인 속성으로 R2를 프로젝트 연산 후 결과를 R1에 자연 조인&lt;/li&gt;
&lt;li&gt;불필요한 속성을 미리 제거해 조인의 효율성을 꾀함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coRcKD/btrIkp30PHR/wLLFCTscT2gPHqlfbskkVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coRcKD/btrIkp30PHR/wLLFCTscT2gPHqlfbskkVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coRcKD/btrIkp30PHR/wLLFCTscT2gPHqlfbskkVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoRcKD%2FbtrIkp30PHR%2FwLLFCTscT2gPHqlfbskkVk%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;574&quot; height=&quot;269&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tyHGZ/btrIlwhuEJq/LJrp13i1TrZxcq65xKXQG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tyHGZ/btrIlwhuEJq/LJrp13i1TrZxcq65xKXQG0/img.png&quot; data-alt=&quot;세미조인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tyHGZ/btrIlwhuEJq/LJrp13i1TrZxcq65xKXQG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtyHGZ%2FbtrIlwhuEJq%2FLJrp13i1TrZxcq65xKXQG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;326&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;326&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAk6p/btrIiJ9YYfP/HAgsBgv0RVgRgmb8x9iwl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAk6p/btrIiJ9YYfP/HAgsBgv0RVgRgmb8x9iwl1/img.png&quot; data-alt=&quot;정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAk6p/btrIiJ9YYfP/HAgsBgv0RVgRgmb8x9iwl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAk6p%2FbtrIiJ9YYfP%2FHAgsBgv0RVgRgmb8x9iwl1%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;325&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqOUe3/btrIkoD1bVz/SZN0NRqkhlsOA809WhswnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqOUe3/btrIkoD1bVz/SZN0NRqkhlsOA809WhswnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqOUe3/btrIkoD1bVz/SZN0NRqkhlsOA809WhswnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqOUe3%2FbtrIkoD1bVz%2FSZN0NRqkhlsOA809WhswnK%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;601&quot; height=&quot;258&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디비전 연산자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차수가 n+m인 릴레이션 R(A1, A2,...,An, B1,B2,...,Bm)과 차수가 m인 Relation S(1,B2,...,Bm)의 디비전 R / S는 차수가 n이고 S에 속하는 모든 튜플 u에 대해 튜플 tu(튜플 t와 튜플 u를 결합한 것)가 R에 존재하는 튜플 t들의 집합&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LzwFQ/btrIfR8NEH8/j3nMip1EsKjKrJHsl39Wtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LzwFQ/btrIfR8NEH8/j3nMip1EsKjKrJHsl39Wtk/img.png&quot; data-alt=&quot;예) 디비전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LzwFQ/btrIfR8NEH8/j3nMip1EsKjKrJHsl39Wtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLzwFQ%2FbtrIfR8NEH8%2Fj3nMip1EsKjKrJHsl39Wtk%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;407&quot; height=&quot;244&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;244&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckzpJG/btrImQGNDFG/ASsvS32dgszEJ7PP8XvI7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckzpJG/btrImQGNDFG/ASsvS32dgszEJ7PP8XvI7k/img.png&quot; data-alt=&quot;예) 디비전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckzpJG/btrImQGNDFG/ASsvS32dgszEJ7PP8XvI7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckzpJG%2FbtrImQGNDFG%2FASsvS32dgszEJ7PP8XvI7k%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;437&quot; height=&quot;346&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예) 디비전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2r5Gv/btrIjMkREqP/6R0euvJ0BhmmXIF7Ao3Lfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2r5Gv/btrIjMkREqP/6R0euvJ0BhmmXIF7Ao3Lfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2r5Gv/btrIjMkREqP/6R0euvJ0BhmmXIF7Ao3Lfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2r5Gv%2FbtrIjMkREqP%2F6R0euvJ0BhmmXIF7Ao3Lfk%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;467&quot; height=&quot;347&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수 질의 예제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beuxO0/btrImcpAEt4/bQgd2oK8yM9aUh4Ulv1cIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beuxO0/btrImcpAEt4/bQgd2oK8yM9aUh4Ulv1cIk/img.png&quot; data-alt=&quot;2번 부서나 3번 부서에 근무하는 모든 사원들의 이름과 급여를 검색 (실렉션, 프로젝션)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beuxO0/btrImcpAEt4/bQgd2oK8yM9aUh4Ulv1cIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeuxO0%2FbtrImcpAEt4%2FbQgd2oK8yM9aUh4Ulv1cIk%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;609&quot; height=&quot;278&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2번 부서나 3번 부서에 근무하는 모든 사원들의 이름과 급여를 검색 (실렉션, 프로젝션)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxcWcv/btrIksTKGaz/a3zTCbCTiCbOHTd6MkwIWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxcWcv/btrIksTKGaz/a3zTCbCTiCbOHTd6MkwIWK/img.png&quot; data-alt=&quot;개발 부서에서 근무하는 모든 사원들의 이름을 검색하라 (실렉션, 프로젝션, 조인)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxcWcv/btrIksTKGaz/a3zTCbCTiCbOHTd6MkwIWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxcWcv%2FbtrIksTKGaz%2Fa3zTCbCTiCbOHTd6MkwIWK%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;622&quot; height=&quot;342&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;342&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSX1E8/btrIhiZnzdq/JtbMd8LCdxGmp1qtpMnlAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSX1E8/btrIhiZnzdq/JtbMd8LCdxGmp1qtpMnlAK/img.png&quot; data-alt=&quot;모든 사원의 사번과 이름을 찾기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSX1E8/btrIhiZnzdq/JtbMd8LCdxGmp1qtpMnlAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSX1E8%2FbtrIhiZnzdq%2FJtbMd8LCdxGmp1qtpMnlAK%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;376&quot; height=&quot;240&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;240&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx7GdJ/btrIftl6j0g/bBkLDz1yrDT8MkvChn9gxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx7GdJ/btrIftl6j0g/bBkLDz1yrDT8MkvChn9gxK/img.png&quot; data-alt=&quot;&amp;amp;amp;lsquo;김창섭&amp;amp;amp;rsquo; 사원의 사원번호를 찾기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx7GdJ/btrIftl6j0g/bBkLDz1yrDT8MkvChn9gxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx7GdJ%2FbtrIftl6j0g%2FbBkLDz1yrDT8MkvChn9gxK%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;379&quot; height=&quot;272&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;amp;lsquo;김창섭&amp;amp;rsquo; 사원의 사원번호를 찾기&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx2fpI/btrIipYkrhg/LN8zDVNTvh3mWxSmd58Y41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx2fpI/btrIipYkrhg/LN8zDVNTvh3mWxSmd58Y41/img.png&quot; data-alt=&quot;부서 릴레이션에 하나의 새로운 투플(6, &amp;amp;amp;lsquo;생산&amp;amp;amp;lsquo;, 10)을 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx2fpI/btrIipYkrhg/LN8zDVNTvh3mWxSmd58Y41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx2fpI%2FbtrIipYkrhg%2FLN8zDVNTvh3mWxSmd58Y41%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;382&quot; height=&quot;195&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부서 릴레이션에 하나의 새로운 투플(6, &amp;amp;lsquo;생산&amp;amp;lsquo;, 10)을 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개 Relation의 공통 속성을 기준으로 속성값이 같은 튜플들을 수평으로 결합하여 새로운 하나의 Relation을 만드는 연산&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;h3 data-ke-size=&quot;size23&quot;&gt;디비전&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X &amp;sup; Y인두개의 Relation에서 R(X)와 S(Y)가 있을때 R Relation의 속성이 S Relation의 속성값을 모두 가진 투플에서 S Relation이가진 속성만 제외한 튜플로 결과 릴레이션을 구성하는 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/데이터베이스</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/141</guid>
      <comments>https://okdone.tistory.com/141#entry141comment</comments>
      <pubDate>Wed, 27 Jul 2022 12:02:05 +0900</pubDate>
    </item>
    <item>
      <title>관계 데이터 연산(select, project, 집합 연산)</title>
      <link>https://okdone.tistory.com/140</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 데이터 연산의 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 데이터를 얻기 위해 필요한 처리 요구를 Relation에 수행하는 것&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;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;관계 대수(relational algebra)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation을 처리하기 위한 연산의 집합&lt;/li&gt;
&lt;li&gt;어떻게 질의를 수행할 것인가를 명시하는 절차적 언어(How, What)&lt;/li&gt;
&lt;li&gt;관계 대수는 상용 관계 DBMS들에서 널리 사용되는 SQL의 이론적인 기초&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;관계 해석(relational calculus)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않음(What)&lt;/li&gt;
&lt;li&gt;비절차 언어(nonprocedurral language)&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;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수의 개념&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation을 처리하기 위한 연산의 집합&lt;/li&gt;
&lt;li&gt;기존의 Relation들로부터 새로운 Relation을 생성&lt;/li&gt;
&lt;li&gt;산술 연산자와 유사하게 단일 Relation이나 두 개의 Relation을 입력으로 받아 하나의 결과 Relation을 생성&lt;/li&gt;
&lt;li&gt;결과 Relation은 또 다른 관계 연산자의 입력으로 사용 가능&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;h4 data-ke-size=&quot;size20&quot;&gt;일반 집합 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합집합(UNION, U), 교집합(INTERSECT, &amp;cap;), 차집합(DIFFRENCE, -), 카티션 프로덕트(CARTESIAN PRODUCT, x)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;순수 관계 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT, PROJECT, JOIN, DIVISION&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XBLLO/btrIdeb4rm8/YDFh1ogcypScrLccAt1vAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XBLLO/btrIdeb4rm8/YDFh1ogcypScrLccAt1vAK/img.png&quot; data-alt=&quot;관계 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XBLLO/btrIdeb4rm8/YDFh1ogcypScrLccAt1vAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXBLLO%2FbtrIdeb4rm8%2FYDFh1ogcypScrLccAt1vAK%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;119&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;119&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수 - 일반 집합 연산자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일반 집합 연산자의 특성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 Relation을 대상으로 연산 수행&lt;/li&gt;
&lt;li&gt;합집합, 교집합, 차집합 연산은 두 릴레이션이 합병 가능해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;합병 가능(union compatible)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 Relation의 차수가 같음&lt;/li&gt;
&lt;li&gt;두 Relation에서 대응되는 속성의 도메인이 같음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 합집합(union) 연산자&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7Myr/btrIiKHKrdf/CR7FV1t6xN6gMMhjEKago1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7Myr/btrIiKHKrdf/CR7FV1t6xN6gMMhjEKago1/img.png&quot; data-alt=&quot;두개의 릴레이션을 합하여 하나의 릴레이션을 반환하는 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7Myr/btrIiKHKrdf/CR7FV1t6xN6gMMhjEKago1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7Myr%2FbtrIiKHKrdf%2FCR7FV1t6xN6gMMhjEKago1%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;434&quot; height=&quot;226&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두개의 릴레이션을 합하여 하나의 릴레이션을 반환하는 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmcJrM/btrIlx8qukM/WFxdDCHL6SFDTtydNAWc21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmcJrM/btrIlx8qukM/WFxdDCHL6SFDTtydNAWc21/img.png&quot; data-alt=&quot;두개의 릴레이션을 합하여 하나의 릴레이션을 반환하는 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmcJrM/btrIlx8qukM/WFxdDCHL6SFDTtydNAWc21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmcJrM%2FbtrIlx8qukM%2FWFxdDCHL6SFDTtydNAWc21%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;652&quot; height=&quot;304&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두개의 릴레이션을 합하여 하나의 릴레이션을 반환하는 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AOtl6/btrIekbOytg/RNyryADS31q3S4BiEMCrNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AOtl6/btrIekbOytg/RNyryADS31q3S4BiEMCrNk/img.png&quot; data-alt=&quot;질의: 김창섭이 속한 부서이거나 개발부서의 부서번호를 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AOtl6/btrIekbOytg/RNyryADS31q3S4BiEMCrNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAOtl6%2FbtrIekbOytg%2FRNyryADS31q3S4BiEMCrNk%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;641&quot; height=&quot;308&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: 김창섭이 속한 부서이거나 개발부서의 부서번호를 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rVffo/btrIiDBFtXh/citfxQTajk3lqKVXXVDHX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rVffo/btrIiDBFtXh/citfxQTajk3lqKVXXVDHX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rVffo/btrIiDBFtXh/citfxQTajk3lqKVXXVDHX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrVffo%2FbtrIiDBFtXh%2FcitfxQTajk3lqKVXXVDHX0%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;438&quot; height=&quot;361&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 교집합(intersection) 연산자&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGqHYf/btrIjK8gP6w/WJRdM9MpDdOtamm4l7lNJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGqHYf/btrIjK8gP6w/WJRdM9MpDdOtamm4l7lNJk/img.png&quot; data-alt=&quot;두 릴레이션 모두에 속한 투플들을 반환하는 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGqHYf/btrIjK8gP6w/WJRdM9MpDdOtamm4l7lNJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGqHYf%2FbtrIjK8gP6w%2FWJRdM9MpDdOtamm4l7lNJk%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;436&quot; height=&quot;234&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 릴레이션 모두에 속한 투플들을 반환하는 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQQOR6/btrIjOQpu92/9T83AmAsYMc4RnImpwGMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQQOR6/btrIjOQpu92/9T83AmAsYMc4RnImpwGMQk/img.png&quot; data-alt=&quot;두 릴레이션 모두에 속한 투플들을 반환하는 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQQOR6/btrIjOQpu92/9T83AmAsYMc4RnImpwGMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQQOR6%2FbtrIjOQpu92%2F9T83AmAsYMc4RnImpwGMQk%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;654&quot; height=&quot;301&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 릴레이션 모두에 속한 투플들을 반환하는 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wBpX/btrIjNcSYpx/XqImQc9lyGFkrqwbKiA11k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wBpX/btrIjNcSYpx/XqImQc9lyGFkrqwbKiA11k/img.png&quot; data-alt=&quot;질의: 김창섭 또는 최종철이 속한 부서이면서 기획부서의 부서번호를검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wBpX/btrIjNcSYpx/XqImQc9lyGFkrqwbKiA11k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wBpX%2FbtrIjNcSYpx%2FXqImQc9lyGFkrqwbKiA11k%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;620&quot; height=&quot;321&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: 김창섭 또는 최종철이 속한 부서이면서 기획부서의 부서번호를검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhPCzI/btrIiZdokr6/z5ankfTrhW8R22UKFi6xXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhPCzI/btrIiZdokr6/z5ankfTrhW8R22UKFi6xXK/img.png&quot; data-alt=&quot;교집합 연산 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhPCzI/btrIiZdokr6/z5ankfTrhW8R22UKFi6xXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhPCzI%2FbtrIiZdokr6%2Fz5ankfTrhW8R22UKFi6xXK%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;444&quot; height=&quot;339&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;교집합 연산 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 차집합 (diffrence)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CxY1D/btrIfST1h3b/xxLiy6TX0KLTBffgkIXmu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CxY1D/btrIfST1h3b/xxLiy6TX0KLTBffgkIXmu0/img.png&quot; data-alt=&quot;두 릴레이션 R과 S의 차집합R &amp;amp;amp;ndash;S는R 릴레이션에 속하지만 S 릴레이션에 속하지 않는 투플들로 결과 릴레이션을 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CxY1D/btrIfST1h3b/xxLiy6TX0KLTBffgkIXmu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCxY1D%2FbtrIfST1h3b%2FxxLiy6TX0KLTBffgkIXmu0%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;437&quot; height=&quot;234&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 릴레이션 R과 S의 차집합R &amp;amp;ndash;S는R 릴레이션에 속하지만 S 릴레이션에 속하지 않는 투플들로 결과 릴레이션을 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdQIlD/btrIlxgjItH/Ladi87N5m66tI45z0CZQH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdQIlD/btrIlxgjItH/Ladi87N5m66tI45z0CZQH0/img.png&quot; data-alt=&quot;차집합 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdQIlD/btrIlxgjItH/Ladi87N5m66tI45z0CZQH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdQIlD%2FbtrIlxgjItH%2FLadi87N5m66tI45z0CZQH0%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;653&quot; height=&quot;302&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;차집합 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDLX3/btrIipcLBfY/ll5PPKnTq6WYuCEEMGtBL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDLX3/btrIipcLBfY/ll5PPKnTq6WYuCEEMGtBL0/img.png&quot; data-alt=&quot;질의: 소속된 직원이 한명도 없는 부서의 부서번호를 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDLX3/btrIipcLBfY/ll5PPKnTq6WYuCEEMGtBL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDLX3%2FbtrIipcLBfY%2Fll5PPKnTq6WYuCEEMGtBL0%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;387&quot; height=&quot;322&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: 소속된 직원이 한명도 없는 부서의 부서번호를 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boRwG6/btrIlxm6bJ8/R1iI4Fol7cXkGWMk61r9ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boRwG6/btrIlxm6bJ8/R1iI4Fol7cXkGWMk61r9ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boRwG6/btrIlxm6bJ8/R1iI4Fol7cXkGWMk61r9ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboRwG6%2FbtrIlxm6bJ8%2FR1iI4Fol7cXkGWMk61r9ak%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;607&quot; height=&quot;352&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 카티션 곱(cartesion product) 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 Relation&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;R(A1,A2...An) : 카디날리티 I&lt;/li&gt;
&lt;li&gt;S(B1, b2...Bm) : 카디날리티 j&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R * S는 다음을 만족하는 릴레이션&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차수 : n + m&lt;/li&gt;
&lt;li&gt;카디날리티 : i * j&lt;/li&gt;
&lt;li&gt;attribute : R과 S의 튜플들의 모든 가능한 조합으로 이루어진 것 (A1,A2...Am, B1,B2...,Bm)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R에 속한 각 튜플 a에 대해 S에 속한 튜플 b를 모두 접속(concatenation)시킨 튜플(a.b)의 집합&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GaOVP/btrIioSvFU3/EGQLAynwNW4jB1qKR3glKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GaOVP/btrIioSvFU3/EGQLAynwNW4jB1qKR3glKk/img.png&quot; data-alt=&quot;카티션곱(cartesionproduct) 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GaOVP/btrIioSvFU3/EGQLAynwNW4jB1qKR3glKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGaOVP%2FbtrIioSvFU3%2FEGQLAynwNW4jB1qKR3glKk%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;520&quot; height=&quot;351&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카티션곱(cartesionproduct) 연산자&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eK6RRk/btrImcJPUZg/7ol4stRZXtNbfanfGiKTLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eK6RRk/btrImcJPUZg/7ol4stRZXtNbfanfGiKTLK/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션의 카티션 곱을 구하라&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eK6RRk/btrImcJPUZg/7ol4stRZXtNbfanfGiKTLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeK6RRk%2FbtrImcJPUZg%2F7ol4stRZXtNbfanfGiKTLK%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;551&quot; height=&quot;205&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션의 카티션 곱을 구하라&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 대수 -&amp;nbsp; 순수 관계 연산자1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;릴레이션의 특성과 구조를 사용하여 연산을 수행(select, project, division, join)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;selection 연산자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 Relation에서 조건 (selection condition)을 만족하는 튜플들의 부분 집합 생성&lt;/li&gt;
&lt;li&gt;selection 연산자는 하나의 입력 relation에 적용(단한 연산자)&lt;/li&gt;
&lt;li&gt;표기 형식(sigma 조건식(릴레이션),&amp;nbsp; R WHERE 조건식)&lt;/li&gt;
&lt;li&gt;&amp;lt;속성&amp;gt; 연산자 &amp;lt;속성 값&amp;gt;&lt;/li&gt;
&lt;li&gt;연산자는 비교 연산자(&amp;lt;,&amp;gt;,=,&amp;lt;&amp;gt;,&amp;lt;=,&amp;gt;=), 부울 연산자(and, or, not)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uC34s/btrIlyfgl57/uYyyRfdj0HdbpWcpmqoUsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uC34s/btrIlyfgl57/uYyyRfdj0HdbpWcpmqoUsk/img.png&quot; data-alt=&quot;질의: EMLOYEE 릴레이션에서 3번부서에 소속된 사원들을 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uC34s/btrIlyfgl57/uYyyRfdj0HdbpWcpmqoUsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuC34s%2FbtrIlyfgl57%2FuYyyRfdj0HdbpWcpmqoUsk%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;676&quot; height=&quot;310&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMLOYEE 릴레이션에서 3번부서에 소속된 사원들을 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CD90y/btrIjJuDTpM/TJjz5acRKzt7KiWzgiWsCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CD90y/btrIjJuDTpM/TJjz5acRKzt7KiWzgiWsCk/img.png&quot; data-alt=&quot;질의: EMPLOYEE 릴레이션에서 2번부서에 속하고 급여가 2,000,000 이상인 사원들을 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CD90y/btrIjJuDTpM/TJjz5acRKzt7KiWzgiWsCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCD90y%2FbtrIjJuDTpM%2FTJjz5acRKzt7KiWzgiWsCk%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;607&quot; height=&quot;216&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;질의: EMPLOYEE 릴레이션에서 2번부서에 속하고 급여가 2,000,000 이상인 사원들을 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs30BE/btrImcQBqw8/svhxAhHimdh8BCoF8oiPD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs30BE/btrImcQBqw8/svhxAhHimdh8BCoF8oiPD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs30BE/btrImcQBqw8/svhxAhHimdh8BCoF8oiPD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs30BE%2FbtrImcQBqw8%2FsvhxAhHimdh8BCoF8oiPD0%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;607&quot; height=&quot;340&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Projection&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 Relation의 속성들의 부분 집합을 구함&lt;/li&gt;
&lt;li&gt;프로젝션의 결과로 생성되는 릴레이션은 &amp;lt;속성 리스트&amp;gt;에 명시된 속성들 가짐&lt;/li&gt;
&lt;li&gt;생성된 중복 튜플은 제거&lt;/li&gt;
&lt;li&gt;사용형식(&amp;pi; 속성리스트 (릴레이션))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh0Trm/btrIfQ249de/dIkInfsRDHHRVSWG7kKvV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh0Trm/btrIfQ249de/dIkInfsRDHHRVSWG7kKvV0/img.png&quot; data-alt=&quot;모든 사원들의 직급을 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh0Trm/btrIfQ249de/dIkInfsRDHHRVSWG7kKvV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh0Trm%2FbtrIfQ249de%2FdIkInfsRDHHRVSWG7kKvV0%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;507&quot; height=&quot;369&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모든 사원들의 직급을 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwANt/btrIipDUHkz/5c3sCBtSBr1SV1aTVBwW00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwANt/btrIipDUHkz/5c3sCBtSBr1SV1aTVBwW00/img.png&quot; data-alt=&quot;프로젝션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwANt/btrIipDUHkz/5c3sCBtSBr1SV1aTVBwW00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwANt%2FbtrIipDUHkz%2F5c3sCBtSBr1SV1aTVBwW00%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;355&quot; height=&quot;348&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2H1B/btrIi6DTXmm/DBIgWm7jidlgvQhAd2yEC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2H1B/btrIi6DTXmm/DBIgWm7jidlgvQhAd2yEC0/img.png&quot; data-alt=&quot;프로젝션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2H1B/btrIi6DTXmm/DBIgWm7jidlgvQhAd2yEC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2H1B%2FbtrIi6DTXmm%2FDBIgWm7jidlgvQhAd2yEC0%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;355&quot; height=&quot;342&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;selection, projection, 합집합, 차집합, 카티션 곱은 관계 대수의 필수적인 연산자&lt;/li&gt;
&lt;li&gt;다른 관계 연산자들은 필수적인 관계 연산자를 두 개 이상 조합하여 표현할 수 있음&lt;/li&gt;
&lt;li&gt;임의의 질의어가 적어도 필수적인 관계 대수 연산자들만큼의 표현력을 갖고 있으면 관계적으로 완전하다고 말함(relationally complete)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 데이터 언어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관계 해석(튜플 관계해석, 도메인 관계해석)&lt;/li&gt;
&lt;li&gt;관계 대수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 대수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반집합 연산자(합집합, 교집합, 차집합, 카티션곱)&lt;/li&gt;
&lt;li&gt;순수관계 연산자(실렉션, 프로젝션,조인,디비전)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;합병 가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 Relation이 차수와 대응되는 열들의 도메인이 같음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Selection 연산&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Relation에서 조건을 만족하는 튜플을 검색&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Projection 연산&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Relation에서 조건을 만족하는 열들의 값을 검색&lt;/p&gt;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>projection</category>
      <category>selection</category>
      <category>관계 대수</category>
      <category>순수관계</category>
      <category>연산자</category>
      <category>일반집합</category>
      <category>튜플</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/140</guid>
      <comments>https://okdone.tistory.com/140#entry140comment</comments>
      <pubDate>Tue, 26 Jul 2022 21:52:36 +0900</pubDate>
    </item>
    <item>
      <title>Relation과 무결성 제약</title>
      <link>https://okdone.tistory.com/139</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Relation 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수학적 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Relation은 Cartesian Product의 부분집합&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFLfwp/btrIekvswjt/u3o6aujlSvg2T0Gq1LdQW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFLfwp/btrIekvswjt/u3o6aujlSvg2T0Gq1LdQW1/img.png&quot; data-alt=&quot;정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFLfwp/btrIekvswjt/u3o6aujlSvg2T0Gq1LdQW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFLfwp%2FbtrIekvswjt%2Fu3o6aujlSvg2T0Gq1LdQW1%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;396&quot; height=&quot;106&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFUcv9/btrIdxWyHUn/n8IwLR3CFUxb4UEhhGJU0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFUcv9/btrIdxWyHUn/n8IwLR3CFUxb4UEhhGJU0K/img.png&quot; data-alt=&quot;튜플의 수 : 카디널리티(Cardinality)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFUcv9/btrIdxWyHUn/n8IwLR3CFUxb4UEhhGJU0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFUcv9%2FbtrIdxWyHUn%2Fn8IwLR3CFUxb4UEhhGJU0K%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;412&quot; height=&quot;275&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;튜플의 수 : 카디널리티(Cardinality)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;주소 = {'서울강남', '서울용산', '서울구로', '경기용인'}&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Relation&lt;/h4&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-origin-width=&quot;426&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHdkTD/btrIhka8Czc/12gQihXKE85hAc5q9BqKc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHdkTD/btrIhka8Czc/12gQihXKE85hAc5q9BqKc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHdkTD/btrIhka8Czc/12gQihXKE85hAc5q9BqKc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHdkTD%2FbtrIhka8Czc%2F12gQihXKE85hAc5q9BqKc1%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;426&quot; height=&quot;183&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개념적 정의&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LB4wg/btrIfRNO590/1yd3JeBx0nyGP4L29lwi50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LB4wg/btrIfRNO590/1yd3JeBx0nyGP4L29lwi50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LB4wg/btrIfRNO590/1yd3JeBx0nyGP4L29lwi50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLB4wg%2FbtrIfRNO590%2F1yd3JeBx0nyGP4L29lwi50%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;534&quot; height=&quot;171&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Relation schema&lt;/h4&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;릴레이션을 위한 틀(framework)&lt;/li&gt;
&lt;li&gt;표기법(relation이름(attribute1, attribute2,...attribute N)&lt;/li&gt;
&lt;li&gt;기본 키 attribute에는 밑줄 표시&lt;/li&gt;
&lt;li&gt;정적 성질&lt;/li&gt;
&lt;li&gt;내포라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o6PDJ/btrIiENH1tn/Keqnaj44ASy7yEqWgdYj50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o6PDJ/btrIiENH1tn/Keqnaj44ASy7yEqWgdYj50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o6PDJ/btrIiENH1tn/Keqnaj44ASy7yEqWgdYj50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo6PDJ%2FbtrIiENH1tn%2FKeqnaj44ASy7yEqWgdYj50%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;336&quot; height=&quot;98&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Relation instance&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어느 시점에 relation에 들어 있는 튜플들의 집합&lt;/li&gt;
&lt;li&gt;삽입, 삭제, 갱신으로 시간의 흐름에 따라 계속 변함(동적 성질)&lt;/li&gt;
&lt;li&gt;일반적으로 릴레이션에는 현재의 인스턴스만 저장&lt;/li&gt;
&lt;li&gt;외연(extension)이라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxO24m/btrIh4smgIC/QTFD2iCYnFDxbcnHSVxtdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxO24m/btrIh4smgIC/QTFD2iCYnFDxbcnHSVxtdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxO24m/btrIh4smgIC/QTFD2iCYnFDxbcnHSVxtdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxO24m%2FbtrIh4smgIC%2FQTFD2iCYnFDxbcnHSVxtdK%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;351&quot; height=&quot;218&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;218&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwK30K/btrIejjiAgY/6xWgikgEBB1FPuKyOhELck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwK30K/btrIejjiAgY/6xWgikgEBB1FPuKyOhELck/img.png&quot; data-alt=&quot;관계 데이터베이스 인스턴스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwK30K/btrIejjiAgY/6xWgikgEBB1FPuKyOhELck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwK30K%2FbtrIejjiAgY%2F6xWgikgEBB1FPuKyOhELck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;152&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;152&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Relation 특성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVu6g0/btrIjI29so0/KpYvkxgA2cNky3ziTLGxNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVu6g0/btrIjI29so0/KpYvkxgA2cNky3ziTLGxNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVu6g0/btrIjI29so0/KpYvkxgA2cNky3ziTLGxNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVu6g0%2FbtrIjI29so0%2FKpYvkxgA2cNky3ziTLGxNk%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;506&quot; height=&quot;260&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;튜플의 유일성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 튜플이 두 개 이상 존재하지 않음 -&amp;gt; 키가 존재함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;튜플의 무순서성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;튜플들의 순서는 중요하지 않음&lt;/li&gt;
&lt;li&gt;튜플들의 순서가 달라도 동일한 릴레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Attribute의 무순서성&lt;/h3&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-origin-width=&quot;634&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAGdWm/btrIaz8tA2i/p0jKVc4LDYdnyTU79L1O70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAGdWm/btrIaz8tA2i/p0jKVc4LDYdnyTU79L1O70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAGdWm/btrIaz8tA2i/p0jKVc4LDYdnyTU79L1O70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAGdWm%2FbtrIaz8tA2i%2Fp0jKVc4LDYdnyTU79L1O70%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;634&quot; height=&quot;251&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Attribute의 원자성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 튜플의 각 Attribute는 원자값을 가짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkD5fh/btrIiZc0FZ0/YJlDzQWzJyoZKPZvmA23K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkD5fh/btrIiZc0FZ0/YJlDzQWzJyoZKPZvmA23K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkD5fh/btrIiZc0FZ0/YJlDzQWzJyoZKPZvmA23K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkD5fh%2FbtrIiZc0FZ0%2FYJlDzQWzJyoZKPZvmA23K1%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;474&quot; height=&quot;277&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기타&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 Relation은 하나의 레코드 타입만 포함&lt;/li&gt;
&lt;li&gt;한 Attribute 내의 값들은 모두 같은 유형&lt;/li&gt;
&lt;li&gt;각 Attirubte의 이름은 한 Relation 내에서만 고유&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Relation의 키&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키의 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 튜플을 고유하게 식별할 수 있는 하나 이상의 Attribute들의 집합&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키의 유형&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슈퍼 키(super key)&lt;/li&gt;
&lt;li&gt;후보 키(candidate key)&lt;/li&gt;
&lt;li&gt;기본 키(primary key)&lt;/li&gt;
&lt;li&gt;대체 키(alternate key)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;슈퍼 키&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 Relation 내의 특정 튜플을 고유하게 식별하는 하나의 속성 또는 속성들의 집합으로서 유일성을 만족&lt;/li&gt;
&lt;li&gt;튜플들을 고유하게 식별하는데 꼭 필요하지 않은 Attribute들을 포함할 수 있음(최소성 만족하지 않음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7PT5S/btrIft0hzVr/5zEnM2oWdCnPG5A4UaFbdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7PT5S/btrIft0hzVr/5zEnM2oWdCnPG5A4UaFbdK/img.png&quot; data-alt=&quot;슈퍼 키 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7PT5S/btrIft0hzVr/5zEnM2oWdCnPG5A4UaFbdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7PT5S%2FbtrIft0hzVr%2F5zEnM2oWdCnPG5A4UaFbdK%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;626&quot; height=&quot;254&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;슈퍼 키 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;유일성(unigueness)과 최소성(minimality)을 만족&lt;/li&gt;
&lt;li&gt;모든 릴레이션에는 최소한 한 개 이상의 후보 키가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDy0Ix/btrIdWWrXIO/1h8s9eapKglfODcbYIHai1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDy0Ix/btrIdWWrXIO/1h8s9eapKglfODcbYIHai1/img.png&quot; data-alt=&quot;후보 키 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDy0Ix/btrIdWWrXIO/1h8s9eapKglfODcbYIHai1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDy0Ix%2FbtrIdWWrXIO%2F1h8s9eapKglfODcbYIHai1%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;624&quot; height=&quot;253&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;후보 키 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 키(Primary Key)&lt;/h4&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;신용카드 회사 고객 Relation에서 신용카드번호와 주민등록번호가 후보키가 될 수 있음, 이중에서 신용카드번호를 기본키로 선정&lt;/li&gt;
&lt;li&gt;자연스러운 기본 키를 찾을 수 없는 경우에는 레코드 번호와 같이 인위적인 키 속성을 릴레이션에 추가할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;대체 키&lt;/h4&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;신용카드 회사의 고객 Relation에서 신용카드 번호를 기본 키로 선정하면 주민등록번호는 대체 키&lt;/li&gt;
&lt;/ul&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;343&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nb5m2/btrIejDyIvb/pQr40regd4e2Lwi801193K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nb5m2/btrIejDyIvb/pQr40regd4e2Lwi801193K/img.png&quot; data-alt=&quot;키들의 포함관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nb5m2/btrIejDyIvb/pQr40regd4e2Lwi801193K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnb5m2%2FbtrIejDyIvb%2FpQr40regd4e2Lwi801193K%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;343&quot; height=&quot;118&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;118&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;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-4838225698951385&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외래 키(foreign key)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 Relation의 기본 키를 참조하는 속성&lt;/li&gt;
&lt;li&gt;관계 데이터베이스에서 Relation간의 관계를 나타내기 위해서 사용&lt;/li&gt;
&lt;li&gt;외래 키 속성은 피참조되는 Relation의 기본 키 속성과 동일한 도메인을 가져야 함&lt;/li&gt;
&lt;li&gt;외래 키 값은 피참조되는 Relation의 기본 키에 존재하는 값이거나 Null 값을 가짐&lt;/li&gt;
&lt;li&gt;자신이 속한 Relation에서 기본 키의 구성요소가 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UtouM/btrIiodi2sV/vWjBpG3qlEbTC08c0KqxPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UtouM/btrIiodi2sV/vWjBpG3qlEbTC08c0KqxPk/img.png&quot; data-alt=&quot;다른 Relation 기본 키를 참조하는 외래키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UtouM/btrIiodi2sV/vWjBpG3qlEbTC08c0KqxPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUtouM%2FbtrIiodi2sV%2FvWjBpG3qlEbTC08c0KqxPk%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;607&quot; height=&quot;332&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다른 Relation 기본 키를 참조하는 외래키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SrB9d/btrIdX14Qi9/oIjVQuS8Vvk3ZanwFIXHZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SrB9d/btrIdX14Qi9/oIjVQuS8Vvk3ZanwFIXHZK/img.png&quot; data-alt=&quot;자체 relation의 기본 키를 참조하는 외래 키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SrB9d/btrIdX14Qi9/oIjVQuS8Vvk3ZanwFIXHZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSrB9d%2FbtrIdX14Qi9%2FoIjVQuS8Vvk3ZanwFIXHZK%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;566&quot; height=&quot;297&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자체 relation의 기본 키를 참조하는 외래 키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pX3Lc/btrIjNi6h5m/Ql8SAFOvsgAcAc5QAGJrbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pX3Lc/btrIjNi6h5m/Ql8SAFOvsgAcAc5QAGJrbK/img.png&quot; data-alt=&quot;기본 키의 구성요소가 되는 외래키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pX3Lc/btrIjNi6h5m/Ql8SAFOvsgAcAc5QAGJrbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpX3Lc%2FbtrIjNi6h5m%2FQl8SAFOvsgAcAc5QAGJrbK%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;678&quot; height=&quot;375&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 키의 구성요소가 되는 외래키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관계 데이터 모델에서의 키&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0hkrU/btrIdxo1CBI/zldwHHjVt0nHpKZpttDk9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0hkrU/btrIdxo1CBI/zldwHHjVt0nHpKZpttDk9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0hkrU/btrIdxo1CBI/zldwHHjVt0nHpKZpttDk9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0hkrU%2FbtrIdxo1CBI%2FzldwHHjVt0nHpKZpttDk9K%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;530&quot; height=&quot;286&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;무결성 제약&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 무결성(data integrity)&lt;/h3&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;데이터베이스가 갱신될 때 DBMS가 자동적으로 무결성 조건을 검사하므로 응용 프로그램들은 무결성 조건을 검사할 필요가 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개체 무결성 제약조건(entity integrity constraint)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation에서 기본 키 속성은 Null값을 가질 수 없음&lt;/li&gt;
&lt;li&gt;Null 값 : 정보 부재를 명시적으로 표현하는 특수한 데이터 값으로 1. 알려지지 않은 값, 또는 해당없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참조 무결성 제약조건(referential integrity constraint)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;릴레이션은 참조할 수 없는 외래 키 값을 갖지 않는다. (NULL 값은 허용)&lt;/li&gt;
&lt;li&gt;릴레이션 사이의 관계들이 다른 릴레이션의 기본키를 참조하는 것을 기반으로 표현되기 때문에 외래 키의 개념이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/luRVR/btrIcE9ASy6/ecsEfi9AbcBKhKpHOc08n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/luRVR/btrIcE9ASy6/ecsEfi9AbcBKhKpHOc08n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/luRVR/btrIcE9ASy6/ecsEfi9AbcBKhKpHOc08n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FluRVR%2FbtrIcE9ASy6%2FecsEfi9AbcBKhKpHOc08n1%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;673&quot; height=&quot;294&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;294&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;h3 data-ke-size=&quot;size23&quot;&gt;참조 무결성 제약조건(referential integrity constraint)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Relation R2의 외래 키가 Relation R1의 기본 키를 참조할 때 참조&lt;/li&gt;
&lt;li&gt;무결성 제약조건은 아래의 두 조건 중 하나가 성립되면 만족됨&lt;/li&gt;
&lt;li&gt;외래 키의 값은 R1의 어떤 튜플의 기본 키 값과 같다&lt;/li&gt;
&lt;li&gt;외래 키는 널값을 가진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp5hdn/btrIi6JZHht/4XlR00rJ9COQyU3zbRuqW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp5hdn/btrIi6JZHht/4XlR00rJ9COQyU3zbRuqW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp5hdn/btrIi6JZHht/4XlR00rJ9COQyU3zbRuqW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp5hdn%2FbtrIi6JZHht%2F4XlR00rJ9COQyU3zbRuqW1%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;495&quot; height=&quot;141&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제약 조건의 유지&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삽입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조되는 부서 Relation에 새로운 튜플이 삽입되면 참조, 무결성 제약 조건은 위배되지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nc8jV/btrIi7a3VjF/ngqNelQWCPzlG5tP4rtd4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nc8jV/btrIi7a3VjF/ngqNelQWCPzlG5tP4rtd4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nc8jV/btrIi7a3VjF/ngqNelQWCPzlG5tP4rtd4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnc8jV%2FbtrIi7a3VjF%2FngqNelQWCPzlG5tP4rtd4K%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;509&quot; height=&quot;286&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조하는 Relation에 새로운 튜플을 삽입할 때는 참조 무결성 제약조건을 위배할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SHlVe/btrIjLr889J/4KFoN9IEfIOBte1ruBUb71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SHlVe/btrIjLr889J/4KFoN9IEfIOBte1ruBUb71/img.png&quot; data-alt=&quot;사원 relation에 (4325,오혜원,6)이라는 튜플을 삽입하면 참조 무결성 제약조건을 위배&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SHlVe/btrIjLr889J/4KFoN9IEfIOBte1ruBUb71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSHlVe%2FbtrIjLr889J%2F4KFoN9IEfIOBte1ruBUb71%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;511&quot; height=&quot;295&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사원 relation에 (4325,오혜원,6)이라는 튜플을 삽입하면 참조 무결성 제약조건을 위배&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삭제&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CY7N3/btrIkpPUMIz/C3Zk5UlM0M2kpWBYmvWxZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CY7N3/btrIkpPUMIz/C3Zk5UlM0M2kpWBYmvWxZk/img.png&quot; data-alt=&quot;참조하는 Relation에 튜플이 삭제되면 참조 무결성 제약조건을 위배하지 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CY7N3/btrIkpPUMIz/C3Zk5UlM0M2kpWBYmvWxZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCY7N3%2FbtrIkpPUMIz%2FC3Zk5UlM0M2kpWBYmvWxZk%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;513&quot; height=&quot;302&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참조하는 Relation에 튜플이 삭제되면 참조 무결성 제약조건을 위배하지 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참조되는 Relation에서 튜플이 삭제되면 참조 무결성 제약조건을 위배하는 경우가 생기거나, 생기지 않을 수 있음&lt;/li&gt;
&lt;li&gt;예1 : 부서 Relation에서 네 번째 튜플인 (4, 홍보, 8)를 삭제하더라도 참조 무결성 제약조건을 위배하지 않음&lt;/li&gt;
&lt;li&gt;예2 : 부서 Relation에서 세 번째 튜플인 (3, 개발, 9)를 삭제하면 무결성 제약조건을 위배하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNf0kl/btrIiLGaB8Z/IBZegTqKLnUKXJ0zczZsg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNf0kl/btrIiLGaB8Z/IBZegTqKLnUKXJ0zczZsg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNf0kl/btrIiLGaB8Z/IBZegTqKLnUKXJ0zczZsg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNf0kl%2FbtrIiLGaB8Z%2FIBZegTqKLnUKXJ0zczZsg0%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;607&quot; height=&quot;273&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참조 무결성 유지를 위한 DBMS 옵션&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;제한(restricted)&lt;/h4&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-origin-width=&quot;650&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ov07Q/btrIfSTAWzU/YNoKJKKdwmdkxcOxPj41TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ov07Q/btrIfSTAWzU/YNoKJKKdwmdkxcOxPj41TK/img.png&quot; data-alt=&quot;예: 부서릴레이션에서(3, 개발, 9)를삭제하면참조무결성제약조건을 위배하게 되므로 삭제 연산을 거절&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ov07Q/btrIfSTAWzU/YNoKJKKdwmdkxcOxPj41TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fov07Q%2FbtrIfSTAWzU%2FYNoKJKKdwmdkxcOxPj41TK%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;650&quot; height=&quot;241&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예: 부서릴레이션에서(3, 개발, 9)를삭제하면참조무결성제약조건을 위배하게 되므로 삭제 연산을 거절&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연쇄(cascade)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조되는 Relation에서 튜플을 삭제하고, 참조하는 Relation에서 이 튜플을 참조하는 튜플들도 함께 삭제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/73NNe/btrIeNdW3c8/sTxiuESONkoMitVAhtkZY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/73NNe/btrIeNdW3c8/sTxiuESONkoMitVAhtkZY1/img.png&quot; data-alt=&quot;예: 부서릴레이션에서(3, 개발, 9)를삭제하면 사원 릴레이션에서 부서번호3을 참조하는 두 번째 투플과 다섯번째투플도 함께 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/73NNe/btrIeNdW3c8/sTxiuESONkoMitVAhtkZY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F73NNe%2FbtrIeNdW3c8%2FsTxiuESONkoMitVAhtkZY1%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;646&quot; height=&quot;225&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예: 부서릴레이션에서(3, 개발, 9)를삭제하면 사원 릴레이션에서 부서번호3을 참조하는 두 번째 투플과 다섯번째투플도 함께 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NO ACTION(=resticted)&lt;/h4&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-origin-width=&quot;632&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFFQwr/btrIdyhhdjB/NklCmw9L8NZw6TV6AFEUW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFFQwr/btrIdyhhdjB/NklCmw9L8NZw6TV6AFEUW0/img.png&quot; data-alt=&quot;예: 부서릴레이션에서(3, 개발, 9)를(5, 개발, 9)로변경하면 사원 릴레이션에서 부서번호3을 참조 하는 두번째 투플과 다섯번째 투플은 변경되지않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFFQwr/btrIdyhhdjB/NklCmw9L8NZw6TV6AFEUW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFFQwr%2FbtrIdyhhdjB%2FNklCmw9L8NZw6TV6AFEUW0%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;632&quot; height=&quot;225&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예: 부서릴레이션에서(3, 개발, 9)를(5, 개발, 9)로변경하면 사원 릴레이션에서 부서번호3을 참조 하는 두번째 투플과 다섯번째 투플은 변경되지않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Relation 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적, 개념적 정의&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Relation 특성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;튜플과 Attribute는 무순서&lt;/li&gt;
&lt;li&gt;튜플은 유일하고 Attribute 값은 원자값&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Relation 키&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슈퍼키, 후보키 : 유일성과 최소성을 만족하는 Attribute의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본키 : 후보키 중 사용하려고 선정한 키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키 : 특정 Relation의 기본키를 참조하는 키(속성)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무결성 제약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개체 무결성 제약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 무결성 제약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>attribute</category>
      <category>Relation</category>
      <category>table</category>
      <category>기본키</category>
      <category>무결성제약</category>
      <category>슈퍼키</category>
      <category>외래키</category>
      <category>키</category>
      <category>튜플</category>
      <category>후보키</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/139</guid>
      <comments>https://okdone.tistory.com/139#entry139comment</comments>
      <pubDate>Tue, 26 Jul 2022 18:21:15 +0900</pubDate>
    </item>
    <item>
      <title>Bitbucket Vscode 연동하기</title>
      <link>https://okdone.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Bitbucket은 깃허브와 같이 깃 저장소 역할을 하는 곳이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 주로 vscode를 통해 커밋을 하고 관리 해왔기 때문에, 이번에 새로 사용하게 된 Bitbucket 또한 vscode와 연동하는 방법을 남겨두고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 가입은 이미 진행한 것으로 보고 진행하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 깃 저장소 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중앙에 위치한 Create repository를 누른다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeX0m/btrIc99rhSC/yD5OdP21ebXtAVxpPzkHzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeX0m/btrIc99rhSC/yD5OdP21ebXtAVxpPzkHzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeX0m/btrIc99rhSC/yD5OdP21ebXtAVxpPzkHzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeX0m%2FbtrIc99rhSC%2FyD5OdP21ebXtAVxpPzkHzK%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;914&quot; height=&quot;571&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;workspace는 본인의 이름, 유저네임 등으로 자동으로 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project name에 여러 저장소를 생성할 수 있으며, 여기에서는 연습이 목적이므로 Learning으로 설정한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfWnb/btrIiE7JNsJ/wClERClmwspXjaSxqRvxD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfWnb/btrIiE7JNsJ/wClERClmwspXjaSxqRvxD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfWnb/btrIiE7JNsJ/wClERClmwspXjaSxqRvxD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfWnb%2FbtrIiE7JNsJ%2FwClERClmwspXjaSxqRvxD0%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;621&quot; height=&quot;537&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create repository를 누른다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jcc8H/btrIcHL5fVY/Efvnf8vcNbrr3SZjmVEppK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jcc8H/btrIcHL5fVY/Efvnf8vcNbrr3SZjmVEppK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jcc8H/btrIcHL5fVY/Efvnf8vcNbrr3SZjmVEppK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcc8H%2FbtrIcHL5fVY%2FEfvnf8vcNbrr3SZjmVEppK%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;629&quot; height=&quot;392&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;392&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwOFhe/btrIdY0HtHc/cZv4fzBG0Jg8m6IC3aQGT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwOFhe/btrIdY0HtHc/cZv4fzBG0Jg8m6IC3aQGT0/img.png&quot; data-alt=&quot;저장소 최초 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwOFhe/btrIdY0HtHc/cZv4fzBG0Jg8m6IC3aQGT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwOFhe%2FbtrIdY0HtHc%2FcZv4fzBG0Jg8m6IC3aQGT0%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;622&quot; height=&quot;607&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;607&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. VS CODE 확장 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 확장 설치화면에서 bitbucket을 검색하면 최상단에 관련 확장이 나온다. 설치.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QI83q/btrIhiqwbXD/ifrF7YHEUS4qDkRkUZRPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QI83q/btrIhiqwbXD/ifrF7YHEUS4qDkRkUZRPMk/img.png&quot; data-alt=&quot;vscode extention에서 검색한 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QI83q/btrIhiqwbXD/ifrF7YHEUS4qDkRkUZRPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQI83q%2FbtrIhiqwbXD%2FifrF7YHEUS4qDkRkUZRPMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;360&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode extention에서 검색한 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 도구바에 생성된 세모 모양의 Bitbucket 아이콘을 클릭.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;47&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1UyF1/btrIioxhPho/HkLk0b9FvLVO8mOxP77NZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1UyF1/btrIioxhPho/HkLk0b9FvLVO8mOxP77NZ0/img.png&quot; data-alt=&quot;좌측 도구창에 생긴 세모&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1UyF1/btrIioxhPho/HkLk0b9FvLVO8mOxP77NZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1UyF1%2FbtrIioxhPho%2FHkLk0b9FvLVO8mOxP77NZ0%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;47&quot; height=&quot;238&quot; data-origin-width=&quot;47&quot; data-origin-height=&quot;238&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b733Yn/btrIcGNeoj7/LBVqJds41LrLtkSkHK3nH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b733Yn/btrIcGNeoj7/LBVqJds41LrLtkSkHK3nH1/img.png&quot; data-alt=&quot;Atlassian config 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b733Yn/btrIcGNeoj7/LBVqJds41LrLtkSkHK3nH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb733Yn%2FbtrIcGNeoj7%2FLBVqJds41LrLtkSkHK3nH1%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;1336&quot; height=&quot;260&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Atlassian config 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + Shift + P를 누르고 검색창에 Atlassian : open setting을 찾으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9hlkw/btrIiKfMOEa/oYAqik6Quu6La6mvPimKAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9hlkw/btrIiKfMOEa/oYAqik6Quu6La6mvPimKAk/img.png&quot; data-alt=&quot;명령어창 자동 완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9hlkw/btrIiKfMOEa/oYAqik6Quu6La6mvPimKAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9hlkw%2FbtrIiKfMOEa%2FoYAqik6Quu6La6mvPimKAk%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;581&quot; height=&quot;96&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;96&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;BitBucket 좌측 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0c4mF/btrIi6Qqsch/2kKJzIorbACBp4h0qT9FK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0c4mF/btrIi6Qqsch/2kKJzIorbACBp4h0qT9FK0/img.png&quot; data-alt=&quot;Atlassian config 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0c4mF/btrIi6Qqsch/2kKJzIorbACBp4h0qT9FK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0c4mF%2FbtrIi6Qqsch%2F2kKJzIorbACBp4h0qT9FK0%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;1336&quot; height=&quot;260&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Atlassian config 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authentication을 누르면 나오는 Login to BITBUCKET CLOUD 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/miWf8/btrIi7oguAV/3akzA8j7OjlKclkagXrme0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/miWf8/btrIi7oguAV/3akzA8j7OjlKclkagXrme0/img.png&quot; data-alt=&quot;Authentication Button&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/miWf8/btrIi7oguAV/3akzA8j7OjlKclkagXrme0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmiWf8%2FbtrIi7oguAV%2F3akzA8j7OjlKclkagXrme0%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;1257&quot; height=&quot;167&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Authentication Button&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RFiSh/btrIhjwdSGX/IltF8IeSusGp0axDgDBMbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RFiSh/btrIhjwdSGX/IltF8IeSusGp0axDgDBMbk/img.png&quot; data-alt=&quot;성공 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RFiSh/btrIhjwdSGX/IltF8IeSusGp0axDgDBMbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRFiSh%2FbtrIhjwdSGX%2FIltF8IeSusGp0axDgDBMbk%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;421&quot; height=&quot;372&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;372&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;아까 만든 저장소를 찾아가서 git clone 준비..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cToNWo/btrIdYzA9RV/uEWeEUsob164oOKoovJtd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cToNWo/btrIdYzA9RV/uEWeEUsob164oOKoovJtd1/img.png&quot; data-alt=&quot;git clone 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cToNWo/btrIdYzA9RV/uEWeEUsob164oOKoovJtd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcToNWo%2FbtrIdYzA9RV%2FuEWeEUsob164oOKoovJtd1%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;587&quot; height=&quot;608&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git clone 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clone is VS code를 사용하면 VS code가 켜져있는 경우, 제대로 동작하지 않는다. 따라서 git clone 텍스트를 복사해서, 터미널로 원하는 폴더로 이동 후 clone 하는 것을 추천한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJ6NC/btrIi6Xesxn/UKCZLMhD490KH9CNGMEdB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJ6NC/btrIi6Xesxn/UKCZLMhD490KH9CNGMEdB1/img.png&quot; data-alt=&quot;git clone 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJ6NC/btrIi6Xesxn/UKCZLMhD490KH9CNGMEdB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJ6NC%2FbtrIi6Xesxn%2FUKCZLMhD490KH9CNGMEdB1%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;604&quot; height=&quot;346&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git clone 화면&lt;/figcaption&gt;
&lt;/figure&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-origin-width=&quot;435&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmnYz6/btrIioRBCoF/zyE6xbdZUgQQDECrrVkpO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmnYz6/btrIioRBCoF/zyE6xbdZUgQQDECrrVkpO1/img.png&quot; data-alt=&quot;깃 클론 로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmnYz6/btrIioRBCoF/zyE6xbdZUgQQDECrrVkpO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmnYz6%2FbtrIioRBCoF%2FzyE6xbdZUgQQDECrrVkpO1%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;435&quot; height=&quot;112&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃 클론 로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyGdxm/btrIaA68CCQ/V56kIpFDLL5MZElKVvVWKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyGdxm/btrIaA68CCQ/V56kIpFDLL5MZElKVvVWKk/img.png&quot; data-alt=&quot;깃 클론 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyGdxm/btrIaA68CCQ/V56kIpFDLL5MZElKVvVWKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyGdxm%2FbtrIaA68CCQ%2FV56kIpFDLL5MZElKVvVWKk%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;258&quot; height=&quot;130&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;130&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;README 수정을 통해 정상적으로 추적 되는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7bdMM/btrH7O5DPYc/RmuaJmrw7Kk91uNbMX3Vik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7bdMM/btrH7O5DPYc/RmuaJmrw7Kk91uNbMX3Vik/img.png&quot; data-alt=&quot;아무 글자나 입력 후 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7bdMM/btrH7O5DPYc/RmuaJmrw7Kk91uNbMX3Vik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7bdMM%2FbtrH7O5DPYc%2FRmuaJmrw7Kk91uNbMX3Vik%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;394&quot; height=&quot;201&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아무 글자나 입력 후 저장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJYvBf/btrIiLTjcHD/5iYgaptAkh6DL2Ob06UneK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJYvBf/btrIiLTjcHD/5iYgaptAkh6DL2Ob06UneK/img.png&quot; data-alt=&quot;소스 제어 업데이트 사항 1 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJYvBf/btrIiLTjcHD/5iYgaptAkh6DL2Ob06UneK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJYvBf%2FbtrIiLTjcHD%2F5iYgaptAkh6DL2Ob06UneK%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;305&quot; height=&quot;108&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소스 제어 업데이트 사항 1 생성&lt;/figcaption&gt;
&lt;/figure&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-origin-width=&quot;253&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nIkTx/btrIcHyBC3J/0KvwQ5DrRvnKVlElKENtik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nIkTx/btrIcHyBC3J/0KvwQ5DrRvnKVlElKENtik/img.png&quot; data-alt=&quot;스테이징&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nIkTx/btrIcHyBC3J/0KvwQ5DrRvnKVlElKENtik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnIkTx%2FbtrIcHyBC3J%2F0KvwQ5DrRvnKVlElKENtik%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;253&quot; height=&quot;157&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;157&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lz667/btrIeMFE0K2/KhpeBDgqy6LMM3CHE1AWc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lz667/btrIeMFE0K2/KhpeBDgqy6LMM3CHE1AWc0/img.png&quot; data-alt=&quot;커밋&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lz667/btrIeMFE0K2/KhpeBDgqy6LMM3CHE1AWc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flz667%2FbtrIeMFE0K2%2FKhpeBDgqy6LMM3CHE1AWc0%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;231&quot; height=&quot;82&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;82&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 커밋을 하면 바로 넘어가지 않고, password를 요구하는 창이 뜬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkuy0I/btrIeMFE3Yd/5YMSkyKVoYKU1fUrFnIi21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkuy0I/btrIeMFE3Yd/5YMSkyKVoYKU1fUrFnIi21/img.png&quot; data-alt=&quot;토큰 인증 요구 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkuy0I/btrIeMFE3Yd/5YMSkyKVoYKU1fUrFnIi21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkuy0I%2FbtrIeMFE3Yd%2F5YMSkyKVoYKU1fUrFnIi21%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;579&quot; height=&quot;50&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;50&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;이는 비밀번호 입력을 통한 인증을 BitBucket 측에서 차단했기 떄문이며, 이를 위해 토큰 발행이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 BitBucket 저장소로 돌아가서, 우측 상단에 있는 내 프로필 사진을 누른 뒤 Personal Setting 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBxe78/btrIfRUkDht/AsTb9JGeSAFmHwd9BjYOU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBxe78/btrIfRUkDht/AsTb9JGeSAFmHwd9BjYOU1/img.png&quot; data-alt=&quot;프로필을 누르면 나오는 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBxe78/btrIfRUkDht/AsTb9JGeSAFmHwd9BjYOU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBxe78%2FbtrIfRUkDht%2FAsTb9JGeSAFmHwd9BjYOU1%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;232&quot; height=&quot;542&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;542&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; App authorizations 클릭하고, Create app password 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKDH5/btrIfR7OSdj/yEOSF86sZkU4l8jxq9VjrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKDH5/btrIfR7OSdj/yEOSF86sZkU4l8jxq9VjrK/img.png&quot; data-alt=&quot;App password 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKDH5/btrIfR7OSdj/yEOSF86sZkU4l8jxq9VjrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKDH5%2FbtrIfR7OSdj%2FyEOSF86sZkU4l8jxq9VjrK%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;1090&quot; height=&quot;491&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;App password 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 식별할 수 있는 이름을 Label에 적고, VScode를 통해 접근하는 권한 정도를 체크박스로 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9VMw/btrIipXjJVf/a1kskUoNMmCSJjbFRmKG3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9VMw/btrIipXjJVf/a1kskUoNMmCSJjbFRmKG3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9VMw/btrIipXjJVf/a1kskUoNMmCSJjbFRmKG3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9VMw%2FbtrIipXjJVf%2Fa1kskUoNMmCSJjbFRmKG3k%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;618&quot; height=&quot;602&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGJVg/btrIeiLajeB/UGT7KXOzEpwPW5M3ti3yok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGJVg/btrIeiLajeB/UGT7KXOzEpwPW5M3ti3yok/img.png&quot; data-alt=&quot;add app password 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGJVg/btrIeiLajeB/UGT7KXOzEpwPW5M3ti3yok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGJVg%2FbtrIeiLajeB%2FUGT7KXOzEpwPW5M3ti3yok%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;653&quot; height=&quot;602&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;add app password 예시&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;app password가 발급되는데, 단 한번만 표시되므로 바로 닫지말고 복사 후, VSCODE에 입력을 먼저 시도한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W8jQA/btrIioqyu7W/kKaUzkXTbOk3RRJhKkcKfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W8jQA/btrIioqyu7W/kKaUzkXTbOk3RRJhKkcKfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W8jQA/btrIioqyu7W/kKaUzkXTbOk3RRJhKkcKfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW8jQA%2FbtrIioqyu7W%2FkKaUzkXTbOk3RRJhKkcKfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;323&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패스워드 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wj7k4/btrIdXHvGD0/5ozy9Kx7xvZxMyqy2aVpI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wj7k4/btrIdXHvGD0/5ozy9Kx7xvZxMyqy2aVpI1/img.png&quot; data-alt=&quot;password 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wj7k4/btrIdXHvGD0/5ozy9Kx7xvZxMyqy2aVpI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwj7k4%2FbtrIdXHvGD0%2F5ozy9Kx7xvZxMyqy2aVpI1%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;52&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;password 입력&lt;/figcaption&gt;
&lt;/figure&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-origin-width=&quot;301&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuXPqB/btrIdw4vB3u/19spFEwlHjPzr0OyeK8mYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuXPqB/btrIdw4vB3u/19spFEwlHjPzr0OyeK8mYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuXPqB/btrIdw4vB3u/19spFEwlHjPzr0OyeK8mYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuXPqB%2FbtrIdw4vB3u%2F19spFEwlHjPzr0OyeK8mYk%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;301&quot; height=&quot;94&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;VSCODE + BITBUCKET 연동 완료.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/IT Util</category>
      <category>APP</category>
      <category>bitbucket</category>
      <category>password</category>
      <category>Repository</category>
      <category>vscode</category>
      <category>연동</category>
      <category>토큰</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/138</guid>
      <comments>https://okdone.tistory.com/138#entry138comment</comments>
      <pubDate>Tue, 26 Jul 2022 15:35:33 +0900</pubDate>
    </item>
    <item>
      <title>스택 자료구조</title>
      <link>https://okdone.tistory.com/137</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;삽입/삭제가 제한된 자료구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자료 성질에 따라, 삽입, 삭제하는 방법이 다름&lt;/li&gt;
&lt;li&gt;프로그램에 내장된 자료구조가 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZodiN/btrIaORJDvf/A5EVPk3SpU5lkslkayWSD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZodiN/btrIaORJDvf/A5EVPk3SpU5lkslkayWSD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZodiN/btrIaORJDvf/A5EVPk3SpU5lkslkayWSD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZodiN%2FbtrIaORJDvf%2FA5EVPk3SpU5lkslkayWSD0%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;413&quot; height=&quot;226&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&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;후입선출(LIFO : Last in First out) 프로토콜을 구현하는 자료구조&lt;/li&gt;
&lt;li&gt;스택의 주소를 알여주는 포인터(top 위치에서만 원소를 삽입하므로 먼저 삽입한 원소는 밑에 쌓임&lt;/li&gt;
&lt;li&gt;스택에 저장된 원소는 top로 정한 곳에서만 접근 가능&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;h3 data-ke-size=&quot;size23&quot;&gt;스택의 ADT&lt;/h3&gt;
&lt;pre id=&quot;code_1658790571738&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT Stack
데이터
0개 이상의 원소를 가진 유한 순서리스트
연산자 및 연산내용 //s&amp;isin;Stack, e&amp;isin;Element
Stack createStack() //공백 스택을 생성
Stack push(s, e) //스택의 top에 원소 e를 삽입
Boolean isEmpty(s) //스택이 공백이면 true, 그렇지 않으면 false를 반환
Element pop(s) //스택이 공백이면 underflow,
//그렇지 않으면 스택의 top 원소 e를 삭제
Element peek(s) //스택이 공백이면 underflow,
//그렇지 않으면 스택의 top 원소 e를 반환
End Stack&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택의 삽입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스택 S = (a0, a1... an-1)&amp;nbsp; a0 : bottom원소, an-1 : top원소, ai : 스택 원소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삽입은 리스트의 마지막에서 이루어짐 - push()&lt;/p&gt;
&lt;pre id=&quot;code_1658790639409&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;push(s, e){
	if (top == SiZE) stack-overflow;
	top=top+1; ①
	stack[top]=e; ②
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PyG5A/btrIcF0IXLs/1py1iDe2kJQR9hV0CK5WQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PyG5A/btrIcF0IXLs/1py1iDe2kJQR9hV0CK5WQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PyG5A/btrIcF0IXLs/1py1iDe2kJQR9hV0CK5WQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPyG5A%2FbtrIcF0IXLs%2F1py1iDe2kJQR9hV0CK5WQ1%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;273&quot; height=&quot;107&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;107&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;h3 data-ke-size=&quot;size23&quot;&gt;스택의 삭제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제도 리스트의 마지막에서 이루어짐 - pop()&lt;/p&gt;
&lt;pre id=&quot;code_1658790998029&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pop(s) {
	if (top == 0) stack-underflow;
	e=stack[top];①
	top=top-1;②
	return e;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgQzx9/btrIddCU7Nb/0fp369mIUsKHGDz1FNvJE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgQzx9/btrIddCU7Nb/0fp369mIUsKHGDz1FNvJE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgQzx9/btrIddCU7Nb/0fp369mIUsKHGDz1FNvJE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgQzx9%2FbtrIddCU7Nb%2F0fp369mIUsKHGDz1FNvJE1%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;257&quot; height=&quot;114&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택의 순차 표현&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1차원 배열을 이용한 스택 구현&lt;/h4&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;n = 스택에 저장할 수 있는 최대 원소 수&lt;/li&gt;
&lt;li&gt;top = 스택의 최상위 원소&lt;/li&gt;
&lt;li&gt;공백 상태 =&amp;gt; top = -1(초기값), 포화상태 =&amp;gt; top = n-1&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;배열의 크기에 의해 원소 개수의 제한을 받음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MUSv7/btrIfRMKwTD/pEbbWLr7HqN8yn1y3JP0V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MUSv7/btrIfRMKwTD/pEbbWLr7HqN8yn1y3JP0V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MUSv7/btrIfRMKwTD/pEbbWLr7HqN8yn1y3JP0V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMUSv7%2FbtrIfRMKwTD%2FpEbbWLr7HqN8yn1y3JP0V1%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;407&quot; height=&quot;110&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 크기가 5인 1차원 배열의 스택에서 연산 수행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVcY7b/btrIbNyfGub/eAi2Xnh8AL3WzbP8cVo5GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVcY7b/btrIbNyfGub/eAi2Xnh8AL3WzbP8cVo5GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVcY7b/btrIbNyfGub/eAi2Xnh8AL3WzbP8cVo5GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVcY7b%2FbtrIbNyfGub%2FeAi2Xnh8AL3WzbP8cVo5GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;239&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스택의 1차원 배열 표현의 장,단점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점 - 순차 자료구조인 1차원 배열을 사용해 쉽게 구현 가능&lt;/li&gt;
&lt;li&gt;단점 - 물리적 크기가 고정된 배열을 사용하므로 스택 크기 변경이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 연산 구현&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스택의 삽입/삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원 배열 크기 stack[8]에서 오버플로와 언더플로를 검사하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658791384509&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int MAXSIZE = 8;
int stack[8];
int top = -1;
int isempty(){
	if(top == -1 )
		return 1;
	else
		return 0;
}
int isfull() {
	if(top == MAXSIZE)
		return 1;
	else
		return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원 배열의 크기 (stack[8])에 원소를 삽입/삭제하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658792384532&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int peek(){
	return stack[top]; }
int push(int data){
	if(!isfull()){
		top = top + 1;
		stack[top] = data;
} else{
		printf(&quot;Could not insert data, Stack is full.\n&quot;); }
}
int pop(){
	int data;
	if(!isempty()){
		data = stack[top];
		top = top- 1;
		return data;
	} else{
		printf(&quot;Could not retrieve data, Stack is empty.\n&quot;); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658792440287&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){ // push items on to the stack
	push(3 );
	push(5 );
	push(9);
	push(1 );
	push(12 );
	push(15 );
	printf(&quot;Element at top of the stack: %d	\n&quot; ,peek());
	printf(&quot;Elements:	\n&quot;);
	// print stack data
	while(!isempty()){
		int data = pop();
		printf(&quot;%d\n&quot;, data);
	}
	printf(&quot;Stack full: %s\n&quot; , isfull()?&quot;true&quot;:&quot;false&quot;);
	printf(&quot;Stack empty: %s\n&quot; , isempty()?&quot;true&quot;:&quot;false&quot;);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-4838225698951385&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658792540897&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result
Element at top of the stack: 15
Elements:
15
12
1
9
5
3
Stack full: false
Stack empty: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스택 응용 : 시스템 스택&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시스템 스택(system stack) / 실행시간 스택(runtime stack)&lt;/h3&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;/li&gt;
&lt;li&gt;실행 스택(execution stack), 제어 스택 (control stack), 런타임 스택(run-time)스택, 기계 스택(machine stack)이라고도 함&lt;/li&gt;
&lt;/ul&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;함수 호출 시 시스템은 호출한 함수 수행에 필요한 지역변수, 매개변수 및 수행 후 복귀할 주소 등의 정보를 활성화 레코드(activation record) 또는 스택 프레임 (stack frame)을 만들어 스택에 삽입&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HlWws/btrIhiQSes6/qzjfukUZBKsgiO5VjIv6pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HlWws/btrIhiQSes6/qzjfukUZBKsgiO5VjIv6pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HlWws/btrIhiQSes6/qzjfukUZBKsgiO5VjIv6pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHlWws%2FbtrIhiQSes6%2FqzjfukUZBKsgiO5VjIv6pk%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;155&quot; height=&quot;152&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;152&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;h3 data-ke-size=&quot;size23&quot;&gt;프로그램에서의 호출과 복귀에 따른 수행 순서 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsNegL/btrH9Ic9Flq/6bD0WBbZPO5uZe19UbDbJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsNegL/btrH9Ic9Flq/6bD0WBbZPO5uZe19UbDbJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsNegL/btrH9Ic9Flq/6bD0WBbZPO5uZe19UbDbJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsNegL%2FbtrH9Ic9Flq%2F6bD0WBbZPO5uZe19UbDbJ1%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;412&quot; height=&quot;340&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스택의 응용 : 문자열 역순/괄호검사&lt;/h2&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;h4 data-ke-size=&quot;size20&quot;&gt;문자열 역순 출력 방법 및 예&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문자열을 읽어 문자열 끝까지 차례대로 스택에 삽입(push)&lt;/li&gt;
&lt;li&gt;스택이 비워질(empty)때까지 문자들을 삭제(pop)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmKm5Z/btrIcHxQsrd/ISNW5QYOBFiMkdnK9sTirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmKm5Z/btrIcHxQsrd/ISNW5QYOBFiMkdnK9sTirk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmKm5Z/btrIcHxQsrd/ISNW5QYOBFiMkdnK9sTirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmKm5Z%2FbtrIcHxQsrd%2FISNW5QYOBFiMkdnK9sTirk%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;393&quot; height=&quot;284&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 역순 출력 방법 및 예&lt;/p&gt;
&lt;pre id=&quot;code_1658793954077&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#define MAX 100 //최대 문자열의 길이
int top=-1; // 스택 변수
int item;
char stack_string[MAX];
void pushChar(char item);
char popChar(void);
int isEmpty(void);
int isFull(void);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 computer science를 역순으로 출력하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658794027646&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	char str[MAX];
	int i;
	printf(&quot;Input a string: &quot;);
	scanf(&quot;%[^\n]s&quot;, str); // 문자열 입력
	for(i=0; i&amp;lt;strlen(str); i++)
		pushChar(str[i]);
	for(i=0; i&amp;lt;strlen(str); i++)
		str[i]=popChar();
	printf(&quot;Reversed String is: %s\n&quot;, str);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658794102133&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pushChar(char item){
	if(isFull()){
		printf(&quot;\nStack is FULL !!!\n&quot;);
	return;
}
	top=top+1;
	stack_string[top]=item;
}
char popChar(){
	if(isEmpty()){
	printf(&quot;\nStack is EMPTY!!!\n&quot;);
	return 0;
	}
	item = stack_string[top];
	top=top-1;
	return item;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658794391530&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int isEmpty(){
	if(top==-1 )
		return 1;
	else
	return 0;
}
int isFull(){
	if(top==MAX-1 )
		return 1;
	else
		return 0;
}

result
Input a string: computer science
Reversed String is: ecneics retupmoc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;괄호 검사&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;괄호((, ), {, }, [, ])가 서로 대응하며 적절하게 내포되었는지 파악하는 검사를 말함 &amp;ndash; 컴파일러에서 구문 체크 시 활용&lt;/li&gt;
&lt;li&gt;수식에 포함되어있는 괄호는 가장 마지막에 열린 괄호를 가장 먼저 닫아 주어야 하는 LIFO 구조로 구성되어있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;괄호 검사 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력 문자열(수식)에서 현재의 문자가 시작 괄호('(' , '{' , '[') 이면 스택에 삽입함(push)&lt;/li&gt;
&lt;li&gt;현재의 문자가 닫는 괄호(&amp;lsquo;)', &amp;lsquo;}' , &amp;lsquo;]') 이면 스택에서 삭제(pop)&lt;/li&gt;
&lt;li&gt;입력 문자열의 마지막 문자까지 읽었을 때 스택에 시작 괄호가 남아 있으면 균형을 이루지 못함, 즉 괄호가 닫히지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dthxCc/btrH9GTZEQ6/kFJKL69TWSXyKvLGmRhQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dthxCc/btrH9GTZEQ6/kFJKL69TWSXyKvLGmRhQrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dthxCc/btrH9GTZEQ6/kFJKL69TWSXyKvLGmRhQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdthxCc%2FbtrH9GTZEQ6%2FkFJKL69TWSXyKvLGmRhQrK%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;382&quot; height=&quot;285&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{ ( a + b ) / [ { ( c - d ) / 2 } &amp;times; e ] } 의 괄호를 검사하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658794917068&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#define MAX 20
struct stack{
	char stk[MAX];
	int top;
}s;

void push(char item){
	if (s.top == (MAX- 1 ))
		printf (&quot;Stack is Full\n&quot;);
else{
	s.top = s.top + 1; // 포인터를 1 증가후 괄호를 삽입
	s.stk[s.top] = item;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658794945665&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pop(){
	if (s.top == - 1 ){
		printf (&quot;Stack is Empty\n&quot;);
	}
	else{
		s.top = s.top - 1; // 괄호를 삭제 후 포인터 감소
	}
}
int main(){
	char exp[MAX];
	int i = 0;
	s.top = -1;
	printf(&quot;\n입력 식 : &quot;);
	scanf(&quot;%s&quot;, exp);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658795026930&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(i = 0;i &amp;lt; strlen(exp);i++){
	if(exp[i] == '(' || exp[i] == '[' || exp[i] == '{'){
		push(exp[i]); // 시작 괄호를 스택에 삽입
		continue;
	}
	else if(exp[i] == ')' || exp[i] == ']' || exp[i] == '}'){
		if(exp[i] == ')'){//닫는 괄호이면 스택에서 삭제
			if(s.stk[s.top] == '('){
				pop();
			}
			else{
            printf(&quot;\n괄호의 균형을 이루지 못한 수식\n&quot;);
			break;
		}
		}
        if(exp[i] == ']'){
			if(s.stk[s.top] == '['){
				pop();
			}
			else{
				printf(&quot;\nUNBALANCED EXPRESSION\n&quot;);
				break;
			}
		}
		if(exp[i] == '}'){
			if(s.stk[s.top] == '{'){
				pop();
			}
			else{
				printf(&quot;\nUNBALANCED EXPRESSION\n&quot;);
				break;
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658795151570&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	if(s.top == -1 ){ //stack이 empty이면 balanced함
		printf(&quot;\n입력식의 괄호 개수가 BALANCED이다.\n&quot;);
	}
}

result
입력 식 : {(a+b)/[{(c-d)/2}*2]}
입력식의 괄호 개수가 BALANCED이다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택은 후입선출(LIFO: Last-In-First-Out) 프로토콜을 구현하는 자료구조로 스택의 삽입/삭제 위치를 알려주는 포인터(top)가 있어야 하며, 삽입 시에는 포인터를 먼저 증가(top=top+1 )한 후 삽입이 이루어진다. 반면에 삭제는 원소값을 삭제한 후 포인터를 감소(top=top-1 )한다&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/자료구조</category>
      <category>LIFO</category>
      <category>스택</category>
      <category>자료구조</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/137</guid>
      <comments>https://okdone.tistory.com/137#entry137comment</comments>
      <pubDate>Tue, 26 Jul 2022 09:27:17 +0900</pubDate>
    </item>
    <item>
      <title>재귀함수</title>
      <link>https://okdone.tistory.com/136</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드들의 모임으로 하나의 단위 의미&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTQhfX/btrIbL7ayJP/1gVbPmjYUIkHxzZKdRZwY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTQhfX/btrIbL7ayJP/1gVbPmjYUIkHxzZKdRZwY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTQhfX/btrIbL7ayJP/1gVbPmjYUIkHxzZKdRZwY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTQhfX%2FbtrIbL7ayJP%2F1gVbPmjYUIkHxzZKdRZwY1%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;495&quot; height=&quot;268&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;268&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;h3 data-ke-size=&quot;size23&quot;&gt;재귀(recursion)&lt;/h3&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;/li&gt;
&lt;li&gt;예) 버스 기다리기(x)&lt;/li&gt;
&lt;li&gt;버스를 기다린다.&lt;/li&gt;
&lt;li&gt;버스가 오면 버스 번호를 확인&lt;/li&gt;
&lt;li&gt;만일 버스 번호가 x면 버스를 타고 버스 기다리기(x) 종료&lt;/li&gt;
&lt;li&gt;버스 번호가 x가 아니면 버스 기다리기(x) 다시 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재귀 함수(recursion function)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신을 반복적으로 호출해 수행하는 방식을 통해 주어진 문제를 해결하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;유형&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 순환 : 자신을 직접 호출&lt;/li&gt;
&lt;li&gt;간접 순환 : 피호출 함수 내에서 호출 함수를 다시 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ytwLN/btrH5fuWa6y/hcHwjwZcPVpWzOYGLyS7Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ytwLN/btrH5fuWa6y/hcHwjwZcPVpWzOYGLyS7Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ytwLN/btrH5fuWa6y/hcHwjwZcPVpWzOYGLyS7Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FytwLN%2FbtrH5fuWa6y%2FhcHwjwZcPVpWzOYGLyS7Z0%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;551&quot; height=&quot;175&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;175&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;h3 data-ke-size=&quot;size23&quot;&gt;재귀 예시&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1에서 n까지 자연수 더하기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW8MDr/btrIbNreAmk/CRqyI4dJaIfD4MYbRfR3T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW8MDr/btrIbNreAmk/CRqyI4dJaIfD4MYbRfR3T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW8MDr/btrIbNreAmk/CRqyI4dJaIfD4MYbRfR3T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW8MDr%2FbtrIbNreAmk%2FCRqyI4dJaIfD4MYbRfR3T1%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;538&quot; height=&quot;354&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1부터 입력된 수까지의 합을 구하기&lt;/p&gt;
&lt;pre id=&quot;code_1658753612506&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int sum(int n);
int main(){
int n;
printf(&quot;입력 값=&quot;);
scanf(&quot;%d&quot;, &amp;amp;n);
printf(&quot;1부터 %d까지의 합은 %d이다.&quot;, n, sum(n));
}
int sum(int n) {
if(n==1 ) //종료조건
return 1;
else return n+sum(n-1);
}

result
입력 값=8
1부터 8까지의 합은 36이다.&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;계승&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Factorial(n)에 대한 재귀함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n! = n*n(-1)!&amp;nbsp; &amp;nbsp;n &amp;gt;= 1&lt;/li&gt;
&lt;li&gt;1&amp;nbsp; &amp;nbsp; n = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0xGem/btrH2m85sFU/IK8HwAUuuylDbrs2mvjZK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0xGem/btrH2m85sFU/IK8HwAUuuylDbrs2mvjZK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0xGem/btrH2m85sFU/IK8HwAUuuylDbrs2mvjZK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0xGem%2FbtrH2m85sFU%2FIK8HwAUuuylDbrs2mvjZK1%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;435&quot; height=&quot;277&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1부터 입력된 수까지의 factorial 값을 구하기&lt;/p&gt;
&lt;pre id=&quot;code_1658753926133&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int factorial(int n){
if (n == 1) //n이 1일 때, 1을 반환하고 재귀호출을 끝냄
return 1;
return n * factorial(n - 1);//n과 factorial 함수에 n - 1을 넣어서
//반환된 값을 곱함
}
int main(){
int n;
printf(&quot;입력 값= &quot;);
scanf(&quot;%d&quot;, &amp;amp;n);
printf(&quot;입력값 %d의 factroial=%d이다.&quot;, n, factorial(n));
return 0;
}


result
입력 값= 5
입력값 5의 factroial=120이다.&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;피보나치 수열&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;f0 = 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if n = 0&lt;/li&gt;
&lt;li&gt;f1 = 1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if n = 1&lt;/li&gt;
&lt;li&gt;fn = fn-1 + fn-2&amp;nbsp; &amp;nbsp; &amp;nbsp; otherwise&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 피보나치 수열 : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 피보나치 수열의 항은 재귀적으로 다시 다른 두개(fn-1 + fn-2)의 피보나치 항으로 정의됨&lt;/p&gt;
&lt;pre id=&quot;code_1658754084092&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int fibonacci(int n) {
if(n == 0 || n == 1) // F(0) = 0 and F(1) = 1, 종료조건
return n;
else
// F(n) = F(n-1 ) + F(n-2), 재귀 함수에서 재귀되는 부분
return fibonacci(n-1) + fibonacci(n-2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1부터 입력된 수까지의 피보나치 수열을 구하기&lt;/p&gt;
&lt;pre id=&quot;code_1658754127807&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main(){
int i, n, t1 = 0, t2 = 1, nextTerm;
printf(&amp;ldquo;피보나치 수 입력 : &quot;);
scanf(&quot;%d&quot;, &amp;amp;n);
printf(＂피보나치 수열 : &quot;);
for (i = 1; i &amp;lt;= n; ++i) {
printf(&quot;%d, &quot;, t1);
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
}
return 0;
}


피보나치 수 입력 : 5
피보나치 수열 : 0, 1, 1, 2, 3&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658754163871&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int fib(int n){
if (n &amp;lt;= 1) return n;
return fib(n-1 ) + fib(n-2 );
}
int main (){
int n;
printf(&quot;피보나치 수 입력 : &quot;);
scanf(&quot;%d&quot;, &amp;amp;n);
printf(&quot;입력된 수%d의 피보나치 수열의 합: %d&quot;, n, fib(n));
return 0;
}


result
피보나치 수 입력 : 7
입력된 수7의 피보나치 수열의 합: 13&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;재귀의 함정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Function Call이 쓸데 없이 겹쳐지게 됨&lt;/li&gt;
&lt;li&gt;시간복잡도 - O(2^n), 높이 n인 이진 트리의 총 노드 수는 2^n - 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W3iwQ/btrIbNkulXK/gOduMKFRDfr3lhcoH0NHv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W3iwQ/btrIbNkulXK/gOduMKFRDfr3lhcoH0NHv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W3iwQ/btrIbNkulXK/gOduMKFRDfr3lhcoH0NHv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW3iwQ%2FbtrIbNkulXK%2FgOduMKFRDfr3lhcoH0NHv0%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;386&quot; height=&quot;212&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Memoization 기법&lt;/h4&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;Memoization을 사용하면 2000까지 정도는 계산 가능&lt;/li&gt;
&lt;li&gt;시간복잡도 - O(n)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmuHKF/btrIcHjZxGd/wBpabfcohFSM8rfKmU1Dc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmuHKF/btrIcHjZxGd/wBpabfcohFSM8rfKmU1Dc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmuHKF/btrIcHjZxGd/wBpabfcohFSM8rfKmU1Dc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmuHKF%2FbtrIcHjZxGd%2FwBpabfcohFSM8rfKmU1Dc0%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;350&quot; height=&quot;172&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하노이의 탑&lt;/h3&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;먼저 모든 원반은 기둥 A (source)에 위치하지만 그 원반들을 기둥 C(destination)로 이동해야함&lt;/li&gt;
&lt;li&gt;한번에 한개 원반만 옮길 수 있고 어떤 경우에도 원반은 그 보다 작은 원반위에 올려질 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2F4vs/btrIazGnGl4/U5K8CuHB5kjJmZkp02Kw60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2F4vs/btrIazGnGl4/U5K8CuHB5kjJmZkp02Kw60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2F4vs/btrIazGnGl4/U5K8CuHB5kjJmZkp02Kw60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2F4vs%2FbtrIazGnGl4%2FU5K8CuHB5kjJmZkp02Kw60%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;309&quot; height=&quot;130&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;재귀 알고리즘으로 해결&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 원반을 처음 시작한 기둥 A에서 다른 하나의 중간 기둥B를 사용해 n개의 원반을 목적기둥 C로 이동할 때&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가장 큰 원반을 제외한 나머지 개의 원반을 A에서 B로 이동&lt;/li&gt;
&lt;li&gt;A에 남아있던 한 개의 원반을 C로 이동&lt;/li&gt;
&lt;li&gt;작은 피라미드를 B에서 A로 이동&lt;/li&gt;
&lt;li&gt;1단계와 2단계에서 했던 과정을 반복해서 수행, 이때 3단계 원반의 개수는 1단계 보다 1개 적어짐&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1658754696327&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void hanoi(int n, int from, int aux, int to) {
if (n == 1) move(from, to); //종결조건
else {
hanoi(n - 1, from, to, aux);
hanoi(1, from, aux, to); // move(from, to);
hanoi(n - 1, aux, from, to); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVJM2/btrIaBc7NXg/r0arvV1pMvS4aHppay6QJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVJM2/btrIaBc7NXg/r0arvV1pMvS4aHppay6QJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVJM2/btrIaBc7NXg/r0arvV1pMvS4aHppay6QJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVJM2%2FbtrIaBc7NXg%2Fr0arvV1pMvS4aHppay6QJK%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;426&quot; height=&quot;293&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8DFL/btrIcHqPa8F/NiqATLgkGx3undct6gWeR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8DFL/btrIcHqPa8F/NiqATLgkGx3undct6gWeR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8DFL/btrIcHqPa8F/NiqATLgkGx3undct6gWeR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8DFL%2FbtrIcHqPa8F%2FNiqATLgkGx3undct6gWeR0%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;337&quot; height=&quot;287&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658754903660&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
void towerOfHanoi(int n, char from, char aux, char to){
if (n == 1){
printf(&quot;\n Move disk 1 from %c to %c&quot;, from, to);
return;
}
towerOfHanoi(n-1, from, to, aux);
printf(&quot;\n Move disk %d from %c to %c&quot;, n, from, to);
towerOfHanoi(n-1, aux, from, to);
}
int main(){
int n = 3; // Number of disks
towerOfHanoi(n, 'A', 'B', 'C');
return 0;
}


result
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재귀 알고리즘을 비재귀 알고리즘으로 변환&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;재귀 함수에서 비재귀를 위한 초기조건을 구함&lt;/li&gt;
&lt;li&gt;재귀 함수의 현재 값과 다음 값과의 관계를 이용해 다음 값을 구하는 관계식을 유도&lt;/li&gt;
&lt;li&gt;관계식을 비 재귀로 표현&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eEpS3A/btrIaO446VX/2j1F9g0NPYMhc1Fh5brJ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eEpS3A/btrIaO446VX/2j1F9g0NPYMhc1Fh5brJ9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eEpS3A/btrIaO446VX/2j1F9g0NPYMhc1Fh5brJ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeEpS3A%2FbtrIaO446VX%2F2j1F9g0NPYMhc1Fh5brJ9K%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;509&quot; height=&quot;159&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;재귀 함수의 특징 및 고려사항&lt;/h2&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;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재귀 함수 고려사항&lt;/h3&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;재귀&amp;nbsp;호출로 프로그램이 간단해질 수 있는지에 대한 확인 필요&lt;/li&gt;
&lt;li&gt;각 재귀 호출은 활성 레코드에 관련된 정보(지역변수, 인수, 반환 주소등)을 스택에 저장해야 하므로 기억 공간이 충분한지 확인 후에 사용해야함&lt;/li&gt;
&lt;li&gt;재귀 호출 사용해 이점이 없을 경우 비 재귀 방법 사용이 좋음&lt;/li&gt;
&lt;li&gt;재귀&amp;nbsp;호출은 문맥 변경이 일어나기 때문에 재귀 호출은 반복 호출에 비해 수행 시간이 더 느림&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;h2 data-ke-size=&quot;size26&quot;&gt;백트래킹&lt;/h2&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;탐색 과정에서 해를 찾는 도중 해가 아니면, 되돌아가서 다시 해를 찾는 기법 (한정 조건을 가진 문제(constraint satisfaction problem)&lt;/li&gt;
&lt;li&gt;car navigation system, decision problem, optimization problem, enumeration problem 등에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4dmjh/btrIfSLpkGf/AGFcRpZ7PwQ00Idc7KEXsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4dmjh/btrIfSLpkGf/AGFcRpZ7PwQ00Idc7KEXsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4dmjh/btrIfSLpkGf/AGFcRpZ7PwQ00Idc7KEXsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4dmjh%2FbtrIfSLpkGf%2FAGFcRpZ7PwQ00Idc7KEXsk%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;495&quot; height=&quot;186&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상태공간 트리(state space tree)&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDWKz/btrH5aAo4OL/T1yvKZsxePOg3ldho4OA61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDWKz/btrH5aAo4OL/T1yvKZsxePOg3ldho4OA61/img.png&quot; data-alt=&quot;가지치기가 이루어진 부분 집합의 합(=13) 문제의 상태공간 트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDWKz/btrH5aAo4OL/T1yvKZsxePOg3ldho4OA61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDWKz%2FbtrH5aAo4OL%2FT1yvKZsxePOg3ldho4OA61%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;331&quot; height=&quot;191&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가지치기가 이루어진 부분 집합의 합(=13) 문제의 상태공간 트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;관련 용어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드의 유망성(promising), 특정 제약(constraints) 또는 제한(limitations) 조건 검사&lt;/li&gt;
&lt;li&gt;문제를 풀면서 여러 조건을 고려한 다양한 상태에 대해 그 상태가 되는 답이 나올때까지 검사하며 점진 탐색&lt;/li&gt;
&lt;li&gt;해답이 나올 가능성 없는 노드는 유망하지 않음(non-promising), 해당 노드의 서브 트리 탐색은 무의미&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;그래프 탐색 방법- 깊이선탐색(depth first search, DFS)과 너비우선탐색, 최선 우선 탐색&lt;/li&gt;
&lt;li&gt;가지치기(pruning) - DFS로 모든 정점을 탐색하는 과정에서 조건에 맞지 않는 가지(탐색 경로)를 자르고 다른 탐색 경로로 돌아가 시간을 절약하기 위한 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;깊이 우선 탐색 방법&lt;/h3&gt;
&lt;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;탐색트리에서 근노드(root node)를 선택해 방문하고, 그 노드의 모든 후손 노드(descendant)들을 차례로 (왼쪽에서 오른쪽)방문&lt;/li&gt;
&lt;li&gt;DFS 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEATD/btrH9IcUre8/MmxOWDVLRcMyloCNJX2rx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEATD/btrH9IcUre8/MmxOWDVLRcMyloCNJX2rx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEATD/btrH9IcUre8/MmxOWDVLRcMyloCNJX2rx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEATD%2FbtrH9IcUre8%2FMmxOWDVLRcMyloCNJX2rx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;130&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGHqK/btrH9HE6Acy/fGtKROKnfHlCpuxIHgaiVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGHqK/btrH9HE6Acy/fGtKROKnfHlCpuxIHgaiVK/img.png&quot; data-alt=&quot;DFS 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGHqK/btrH9HE6Acy/fGtKROKnfHlCpuxIHgaiVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGHqK%2FbtrH9HE6Acy%2FfGtKROKnfHlCpuxIHgaiVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;223&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DFS 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백트래킹 알고리즘&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS를 통한 백트래킹 절차&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상태 공간 트리의 DFS를 실시&lt;/li&gt;
&lt;li&gt;각 노드가 유망한지 점검&lt;/li&gt;
&lt;li&gt;노드가 유망하지 않으면, 노드의 부모 노드로 돌아가 탐색&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1658756095545&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void checknode(node v) {
if (promising(v))
	if (there is a solution at v)
		write the solution;
	else
		for (each child u of v) checknode(u);
}&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;백트래킹과 DFS차이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DFS 깊이 우선 탐색으로 모든 노드 방문을 목표로함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완전 탐색으로 인해 유한 시간 내 끝나지 않을 수도 있음(해가 없는 경로에 깊이 빠질 가능성)&lt;/li&gt;
&lt;li&gt;해를 구했을 때, 최적이 아닐 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 백트래킹 - 불필요한 탐색을 하지 않기 위해, 가지치기를 통해 유망하지 않은 경우의 수 줄이는 것을 목표&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pORkD/btrIaQu027Z/oTffwCLQzU5bYchGcgtsZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pORkD/btrIaQu027Z/oTffwCLQzU5bYchGcgtsZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pORkD/btrIaQu027Z/oTffwCLQzU5bYchGcgtsZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpORkD%2FbtrIaQu027Z%2FoTffwCLQzU5bYchGcgtsZK%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;435&quot; height=&quot;150&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표적인 백트래킹 문제 : N-queen&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NxN 크기의 체스판에 N개의 queen을 서로 공격할 수 없도록 배치하는 문제&lt;/li&gt;
&lt;li&gt;Queen은 다음과 같이 이동할 수 있으므로 서로 상대방을 위협하지 않기 위해서는 같은 행이나 같은 열, 같은 대각선상에 위치하지 않아야 함&lt;/li&gt;
&lt;li&gt;무작정(brute force) 방법(4x4 board) - N의 크기가 커질수록 연산량이 기하급수적으로 증가함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7mrls/btrIcGlcMU4/KkWlXS5dHTxdCvwAKgX1PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7mrls/btrIcGlcMU4/KkWlXS5dHTxdCvwAKgX1PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7mrls/btrIcGlcMU4/KkWlXS5dHTxdCvwAKgX1PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7mrls%2FbtrIcGlcMU4%2FKkWlXS5dHTxdCvwAKgX1PK%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;485&quot; height=&quot;89&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;N-queen 문제의 이해&lt;/h4&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;각 queen을 각각 다른 행에 할당한 후에, 어떤 열에 위치하면 해답은 얻을 수 있는지를 차례대로 점검&lt;/li&gt;
&lt;li&gt;각 queen은 4개의 열 중에서 한 열에 위치할 수 있기 때문에 해답을 얻기 위해 점검해보아야 하는 모든 경우의 수는 4^4 = 256가지&lt;/li&gt;
&lt;/ul&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-origin-width=&quot;334&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1OBco/btrIdxH1N00/E20NTQGKHqTZ6snqRpvj90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1OBco/btrIdxH1N00/E20NTQGKHqTZ6snqRpvj90/img.png&quot; data-alt=&quot;(i, j) - i번째 queen이 j번째 열에 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1OBco/btrIdxH1N00/E20NTQGKHqTZ6snqRpvj90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1OBco%2FbtrIdxH1N00%2FE20NTQGKHqTZ6snqRpvj90%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;334&quot; height=&quot;171&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(i, j) - i번째 queen이 j번째 열에 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS탐색을 통해 모든 branch를 최대 깊이까지 검색하지 않고, 요구사항에 맞게 해당 노드의 유망성 검사 및 가지치기를 통해 탐색 공간을 줄임&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bShR4S/btrIeNcw4N3/5lakKPGJmlz1985ApFlkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bShR4S/btrIeNcw4N3/5lakKPGJmlz1985ApFlkkk/img.png&quot; data-alt=&quot;유망성 검사 및 가지치기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bShR4S/btrIeNcw4N3/5lakKPGJmlz1985ApFlkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbShR4S%2FbtrIeNcw4N3%2F5lakKPGJmlz1985ApFlkkk%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;538&quot; height=&quot;247&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유망성 검사 및 가지치기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwzoF/btrIfR6OfXa/dKvJfeeXdSLd6JtKcbg4AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwzoF/btrIfR6OfXa/dKvJfeeXdSLd6JtKcbg4AK/img.png&quot; data-alt=&quot;유망성 검사 및 가지치기에 따른 queen의 배치 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwzoF/btrIfR6OfXa/dKvJfeeXdSLd6JtKcbg4AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmwzoF%2FbtrIfR6OfXa%2FdKvJfeeXdSLd6JtKcbg4AK%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;520&quot; height=&quot;269&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유망성 검사 및 가지치기에 따른 queen의 배치 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658756570354&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;math.h&amp;gt;
int chess_board[20], count; //board에 놓여진 queen의 column 위치 값 저장
void nqueen_function(int row, int num){ // queen들의 제한조건 만족 체크
int col;
	for(col = 1; col&amp;lt;= num; col++){
		if(placeholder(row, col)){//queen이 위치할 곳을 체크하기 위해 함수 호출
			chess_board[row] = col;
			if(row == num){ //모든 queen들이 board에 위치했는지 검사
				display(num); //위치했으면 출력 함수 display()호출
}
			else{
				nqueen_function(row + 1, num); //남아있는 queen들을 배치하기
						//위해 함수 nqueen_function() 호출
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d31cKd/btrIaPv77No/H42dFKkEnrQenGwYRfCxZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d31cKd/btrIaPv77No/H42dFKkEnrQenGwYRfCxZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d31cKd/btrIaPv77No/H42dFKkEnrQenGwYRfCxZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd31cKd%2FbtrIaPv77No%2FH42dFKkEnrQenGwYRfCxZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;301&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658756670648&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int display(int num){
	int m, n;
	printf(&quot;\n\n\tPossible Solution %d:\n\n&quot;, ++count);
	for(m = 1; m &amp;lt;= num; m++){
		printf(&quot;\t[%d]&quot;, m);
	}
	for(m = 1; m &amp;lt;= num; m++){
		printf(&quot;\n\n[%d]&quot;, m);
		for(n = 1; n &amp;lt;= num; n++){
			if(chess_board[m] == n){
				printf(&quot;\tQ&quot;); //(i, j) 위치에 queen(Q)을 출력
			}
			else{
				printf(&quot;\t*&quot;); //queen배치가 없는 슬롯에 *을 출력
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658756694345&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	int num;
	printf(&quot;Enter Number of Queens:\t&quot;);
	scanf(&quot;%d&quot;, &amp;amp;num);
	if(num &amp;lt;= 3 ){
	printf(&quot;\nNumber should be greater than 3 to form a Matrix\n&quot;);
	}
	else{
		nqueen_function(1, num); //nqueen_function() 호출
	}
	printf(&quot;\n\n&quot;);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F5apS/btrH74tMwlK/h6NKk8TCbGK5HiRvzeSk2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F5apS/btrH74tMwlK/h6NKk8TCbGK5HiRvzeSk2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F5apS/btrH74tMwlK/h6NKk8TCbGK5HiRvzeSk2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF5apS%2FbtrH74tMwlK%2Fh6NKk8TCbGK5HiRvzeSk2k%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;533&quot; height=&quot;327&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그래밍 언어에서 함수는 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드들의 모임으로 하나의 프로그램 단위&lt;/li&gt;
&lt;li&gt;재귀함수는 자기 자신을 반복적으로 호출해 수행하는 방식을 통해 주어진 문제를 해결하는 함수&lt;/li&gt;
&lt;li&gt;Memoization 기법은 프로그램이 동일한 계산을 반복해야 할 때 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거해 프로그램 실행속도를 빠르게 하는 기술&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;</description>
      <category>23년 이전 글/자료구조</category>
      <category>dfs</category>
      <category>백트래킹</category>
      <category>상태공간 트리</category>
      <category>재귀</category>
      <category>하노이의탑</category>
      <category>함수</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/136</guid>
      <comments>https://okdone.tistory.com/136#entry136comment</comments>
      <pubDate>Mon, 25 Jul 2022 14:00:51 +0900</pubDate>
    </item>
    <item>
      <title>구조체와 범용 리스트</title>
      <link>https://okdone.tistory.com/135</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;구조체&lt;/h2&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;사용자 정의 자료형 - 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있음&lt;/li&gt;
&lt;li&gt;배열은 같은 타입의 변수 집합이지만 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것&lt;/li&gt;
&lt;li&gt;구조체의 구성 : 구조체의 멤버 / 멤버 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구조체 정의와 선언&lt;/h4&gt;
&lt;pre id=&quot;code_1658619045320&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct 구조체이름
{
멤버변수1의 타입 멤버변수1의 이름;
멤버변수2의 타입 멤버변수2의 이름;
&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;
};

struct 구조체이름
{
멤버변수1의 타입 멤버변수1의 이름;
멤버변수2의 타입 멤버변수2의 이름;
&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;
} 구조체 변수 이름; //구조체 선언&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;구조체 멤버 접근&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멤버 접근 연산자(.)를 사용하여 구조체에서 구조체 멤버로 접근할 수 있음&lt;/li&gt;
&lt;li&gt;형식 : 구조체변수이름. 멤버변수이름&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;형식 : 구조체변수이름 = {. 멤버변수1이름 = 초기값, .멤버변수2이름 = 초기값,...};&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;typedef문&lt;/h4&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;이미 존재하는 int, float 등과 같은 자료형을 사용자가 자유롭게 정의할 수 있음&lt;/li&gt;
&lt;li&gt;구조체에 새로운 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식 : typedef struct 구조체 이름 구조체의 새로운 이름. 예 : typedef struct student STD;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658619504594&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
typedef struct
{
char name[20];
int age;
int weight;
} STD;
int main(){
STD s1={&quot;Hong gil dong&quot;, 30, 65};
STD s2={.name = &quot;Lee sun sin&quot;, .age=45, .weight=60};
printf(&quot;첫 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n&quot;,s1.name, s1.age, s1.weight);
printf(&quot;두 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n&quot;,s2.name, s2.age, s2.weight);
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;범용 리스트&lt;/h2&gt;
&lt;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;S=(x1, x2, x3....xn)&amp;nbsp; S =&amp;nbsp; 리스트의 이름, n= 리스트의 길이, 원소 xi = 원자(노드) 또는 리스트&lt;/li&gt;
&lt;li&gt;예) A=(a,(b,c) // 리스트의 길이 = 2,&amp;nbsp; S=((a,b,c), d,(e,f),(),A), T=(A,A,A,A)&lt;/li&gt;
&lt;/ul&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;다변수로 구성된 다항식의 표현 - A(x,y,z) = 4x^3 + 3x^2 + 2 + 5y + 7z^3&lt;/li&gt;
&lt;li&gt;희소행렬&lt;/li&gt;
&lt;li&gt;특정 PC에서 특정 Web browser를 사용한 기록&lt;/li&gt;
&lt;li&gt;tab별 기록, jump한 기록&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공백리스트(empty list, 0, nil) -&amp;gt; S=()&lt;/li&gt;
&lt;li&gt;부분리스트(sublist) -&amp;gt; 임의의 주어진 리스트가 다른 리스트의 노드 또는 리스트&lt;/li&gt;
&lt;li&gt;헤드(head) : 임의의 주어진&amp;nbsp; 리스트에서 첫 번째에 있는 리스트를 말함&lt;/li&gt;
&lt;li&gt;n&amp;gt;=1인 경우 첫 번째 원소=X1 = head(S)&lt;/li&gt;
&lt;li&gt;테일(tail) : 임의의 주어진 리스트에서 첫 번째 원소를 제외한 나머지 원소를 말함&lt;/li&gt;
&lt;li&gt;리스트=(X2,...Xn) = tail(S)&lt;/li&gt;
&lt;li&gt;순환 리스트(recursive list) : 임의의 주어진 리스트의 항목이 동일한 부분리스트인 경우를 말함&lt;/li&gt;
&lt;li&gt;C=(a,C) = 길이가 2인 순환리스트&lt;/li&gt;
&lt;li&gt;두 번째 원소 C = 무한리스트(a, (a, (a,...)에 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-4838225698951385&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;범용 리스트의 응용 : 다항식/희소행렬&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;범용리스트로 다항식 표현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- aX^e 형식의 항들의 합으로 구성된 식을 말함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTRLcK/btrH0tUggUD/2TJzGEo0aRIaPU8zlwZ7d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTRLcK/btrH0tUggUD/2TJzGEo0aRIaPU8zlwZ7d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTRLcK/btrH0tUggUD/2TJzGEo0aRIaPU8zlwZ7d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTRLcK%2FbtrH0tUggUD%2F2TJzGEo0aRIaPU8zlwZ7d0%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;299&quot; height=&quot;201&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;201&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;h4 data-ke-size=&quot;size20&quot;&gt;다항식의 ADT&lt;/h4&gt;
&lt;pre id=&quot;code_1658622498513&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT Polynominal
데이터
순서쌍 &amp;lt;ei
, ai
&amp;gt;의 집합으로 표현된 다항식 p(x)=a0xe0+a1xe1+&amp;hellip;+anxen
,
ei=음이 아닌 정수
연산자 및 연산내용 //p, p1
, p2&amp;isin;Polynominal, a&amp;isin;Cofficient, e&amp;isin;Exponent
Polynominal zeroP() //다항식 p(x)=0를 반환
Boolean isPzero(p) //다항식 p(x)=0이면 true, 그렇지 않으면 false를 반환
Cofficient coef(p, e) //&amp;lt;다항식 p에서 지수가 e인 항의 계수를 반환
Exponent maxExp(p) //다항식 p에서 최대 차수를 반환
Polynominal addTerm(p, a, e) //다항식 p에 지수가 e인 항이 없는 경우에
// 새로운 항 &amp;lt;e, a&amp;gt;를 추가
Polynominal delTerm(p, e) //다항식에서 지수가 e인 항 &amp;lt;e, a&amp;gt;를 삭제
Polynominal mult(p, a, e) //다항식 p의 모든 항에 axe항을 곱하는 연산
Polynominal addpoly(p1
, p2
) //두 다항식 p1과 p2 를 더하는 연산
Polynominal multpoly(p1
, p2
) //두 다항식 p1 과 p2 를 곱하는 연산
End Polynominal&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;다항식 리스트 표현&lt;/h4&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;각 항의 &amp;lt;지수와 계수&amp;gt; 쌍에 대한 선형 리스트로 표현&lt;/li&gt;
&lt;li&gt;A(x) = 4x^3 + 3x^2 + 2&amp;nbsp; -&amp;gt; p1 = (3,4,2,3,0,2)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1차원 배열을 이용한 표현&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차수가 n인 다항식을 (n+1)개의 원소를 가지는 지수 내림차순 1차원 배열 표현할 경우&lt;/li&gt;
&lt;li&gt;배열 색인 i -&amp;gt; 지수 (n-1)&lt;/li&gt;
&lt;li&gt;배열 색인 i의 원소 -&amp;gt; 지수 (n-i)항의 계수 저장&lt;/li&gt;
&lt;li&gt;지수의 항이 없는 원소는 0을 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4NF5X/btrHZ655hRc/y6Zq4ZkGTz2SwlRHg8FLKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4NF5X/btrHZ655hRc/y6Zq4ZkGTz2SwlRHg8FLKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4NF5X/btrHZ655hRc/y6Zq4ZkGTz2SwlRHg8FLKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4NF5X%2FbtrHZ655hRc%2Fy6Zq4ZkGTz2SwlRHg8FLKK%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;403&quot; height=&quot;89&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWChEt/btrH1A6VACF/XIAZf6wVc5qKU5NMn1bMu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWChEt/btrH1A6VACF/XIAZf6wVc5qKU5NMn1bMu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWChEt/btrH1A6VACF/XIAZf6wVc5qKU5NMn1bMu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWChEt%2FbtrH1A6VACF%2FXIAZf6wVc5qKU5NMn1bMu1%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;513&quot; height=&quot;280&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;280&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;h4 data-ke-size=&quot;size20&quot;&gt;2차원 배열을 이용한 표현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다항식의 계수가 0이 아닌 항만 표현&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다항식의 각 항에 대한 &amp;lt;지수, 계수&amp;gt;의 쌍을 2차원 배열에 저장&lt;/li&gt;
&lt;li&gt;2차원 배열의 행의 개수 = 다항식의 항의 개수&lt;/li&gt;
&lt;li&gt;2차원 배열의 열의 개수 = 2(지수, 계수)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4enIm/btrH3cLjpyq/BGzkbLlJcDkNHefZ9uSHsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4enIm/btrH3cLjpyq/BGzkbLlJcDkNHefZ9uSHsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4enIm/btrH3cLjpyq/BGzkbLlJcDkNHefZ9uSHsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4enIm%2FbtrH3cLjpyq%2FBGzkbLlJcDkNHefZ9uSHsK%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;458&quot; height=&quot;130&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;지수내림차순(1차원 배열 이용)과 &amp;lt;지수, 계수&amp;gt;의 쌍 표현 방법 비교&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋지 못한 경우 -&amp;gt; degree &amp;lt; (0이 아닌 항의 수) * 2&lt;/li&gt;
&lt;li&gt;좋은 경우 -&amp;gt; degree &amp;gt; (0이 아닌 항의 수) * 2&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;pre id=&quot;code_1658652577349&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;addploy(A, B) {
p3=zeroP();
while (!iszeroP(A) &amp;amp;&amp;amp; !isPzero(B)) {
case {
maxExp(A) &amp;lt; maxExp(B) :
C=addTerm(C, coef(B, maxExp(B)), maxExp(B));
B=delTerm(B, maxExp(B));
maxExp(A) = maxExp(B) :
sum=coef(A, maxExp(A))+ coef(B, maxExp(B));
A=delTerm(A, maxExp(A);
B=delTerm(B, maxExp(B));
maxExp(A) &amp;gt; maxExp(B) :
C=addTerm(C, coef(A, maxExp(A)), maxExp(A));
A=delTerm(A, maxExp(A));
}
}
if (!iszeroP(A)) A의 나머지 항들을C에 복사
else if (!iszeroP(B) B의 나머지 항들을C에 복사
return C;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두개의 다항식 덧셈 : A(x) + B(x) = C(x)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(x) = 7x^3 + 6x + 1, B(x) = 8x^3 + 2x^2 +1, C(x) = A(x) + B(x)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서대로 A와 B의 각 항 지수를 비교&lt;/li&gt;
&lt;li&gt;지수가 같으면 배열 A(x)와 B(x)에 있는 각 항 계수를 더해 배열 C(x)로 이동&lt;/li&gt;
&lt;li&gt;지수가 다르면 A(x)와 B(x) 중에 지수가 큰 항을 C(x)로 이동&lt;/li&gt;
&lt;li&gt;2개의 다항식에 대해 어느 한쪽의 다항식이 끝날 때까지 계속하고 남은 다항식은 그대로 C(x)로 복사이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpCIcr/btrH9IvphUr/h4lakZiBBxDfnGZ0jlQJu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpCIcr/btrH9IvphUr/h4lakZiBBxDfnGZ0jlQJu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpCIcr/btrH9IvphUr/h4lakZiBBxDfnGZ0jlQJu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpCIcr%2FbtrH9IvphUr%2Fh4lakZiBBxDfnGZ0jlQJu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;119&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간복잡도 = while문의 반복 횟수 = O(n+m), n과m은 각각 다항식 A,B의 0이 아닌 항의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(x)=7x^5+2x^4+3x^3+6x^2+4, B(x)=3x^3+2x^2+1, C(x) = A(x) + B(x)&amp;nbsp; 두 다항식 더하기&lt;/p&gt;
&lt;pre id=&quot;code_1658653043574&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include
&amp;lt;stdio.h&amp;gt;
#define MAX(a, b) ((a&amp;gt;b)?a:b)
#define MAX_DEGREE 50
typedef struct{
int degree;
float coef[MAX_DEGREE];
} polynomial;
polynomial addPoly(polynomial A, polynomial B){
polynomial C;
int A_index=0, B_index=0, C_index=0;
int A_degree=A.degree, B_degree=B.degree;
C.degree=MAX(A.degree, B.degree);
while(A_index&amp;lt;=A.degree &amp;amp;&amp;amp; B_index&amp;lt;=B.degree){
if(A_degree &amp;gt; B_degree){
C.coef[C_index++] = A.coef[A_index++];
A_degree--;
}

else if(A_degree == B_degree){
C.coef
[C_index++] = A.coef[A_index++]+B.coef[B_index++];
A_degree--;
B_degree--;
}
else{
C.coef[C_index++] = B.coef[B_index++];
B_degree--;
}
}
return C;
}
void printPoly(polynomial P){ //다항식 출력
inti, degree;
degree=P.degree;
for(i=0;i&amp;lt;=P.degree;i++)
printf(&quot;%3.0fx^%d&quot;, P.coef[i], degree--);
printf(&quot;\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658653210634&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
polynomial A={5, {7, 2, 3, 6, 0, 4}};
polynomial B={4, {3, 2, 0, 3, 1}};
polynomial C;
C= addPoly(A,B);
printf(&quot;\n A(x)=&quot;); printPoly(A);
printf(&quot;\n B(x)=&quot;); printPoly(B);
printf(&quot;\n C(x)=&quot;); printPoly(C);
}


result
A(x)= 7x^5 2x^4 3x^3 6x^2 0x^1 4x^0
B(x)= 3x^4 2x^3 0x^2 3x^1 1x^0
C(x)= 7x^5 5x^4 5x^3 6x^2 3x^1 5x^0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;희소행렬(sparse matrix)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 원소의 값 중에서 0의 값을 비교적 많이 가지는 행렬&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;희소행렬의 0 값의 정도에 대한 정확한 기준이 없음(2/3이상)&lt;/li&gt;
&lt;li&gt;2차원 배열로 나타낼 때 공간의 낭비가 심함&lt;/li&gt;
&lt;li&gt;행렬연산(덧셈, 곱셈, 전치행렬등)시 &quot;0&quot;의 값을 기억장소에 저장하는 것은 기억공간의 낭비 초래&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdmRiO/btrH1BSkKRy/dJikCPS3ypOkHrcO6M3s41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdmRiO/btrH1BSkKRy/dJikCPS3ypOkHrcO6M3s41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdmRiO/btrH1BSkKRy/dJikCPS3ypOkHrcO6M3s41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdmRiO%2FbtrH1BSkKRy%2FdJikCPS3ypOkHrcO6M3s41%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;393&quot; height=&quot;171&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;171&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;h4 data-ke-size=&quot;size20&quot;&gt;희소행렬의 ADT&lt;/h4&gt;
&lt;pre id=&quot;code_1658653316222&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ADT SparseMatrix
데이터
3 원소쌍 &amp;lt;i, j, v&amp;gt;의 집합, i&amp;isin;Row, j&amp;isin;Column, v&amp;isin;Value
Row={0, 1, &amp;hellip;, n-1}, Column={0, 1, &amp;hellip;, n-1}
연산자 및 연산내용 //a, b&amp;isin;SparseMatrix, c&amp;isin;Matrix, u, v&amp;isin;Value,
//i&amp;isin;Row, j&amp;isin;Column
SparseMatrix Smcreate(m, n) //비어있는 m&amp;times;n 희소행렬을 생성
SparseMatrix transpose(a) //희소행렬 a의 전치행렬 c를 반환
Matrix Smadd(a, b) //두 희소행렬 a와 b의 더한 결과를 행렬 c로 반환
//단 a와 b의 차수는 동일
Matrix Smmult(a, b) //두 희소행렬 a와 b의 곱한 결과를 행렬 c로 반환
//단, 희소행렬 a의 Column과 b의 Row가 동일
End SparseMatrix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;희소행렬에 대한 전치행렬 연산&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전치행렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 A = m * n -&amp;gt; 행렬 At = n*m행렬로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬A의 모든 원소의 위치(i,j)를 (j,i)로 교환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UNY4z/btrH9HpJz1q/nTIcNKZi8X8EDKC1DNhOm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UNY4z/btrH9HpJz1q/nTIcNKZi8X8EDKC1DNhOm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UNY4z/btrH9HpJz1q/nTIcNKZi8X8EDKC1DNhOm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUNY4z%2FbtrH9HpJz1q%2FnTIcNKZi8X8EDKC1DNhOm0%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;258&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;258&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;h4 data-ke-size=&quot;size20&quot;&gt;희소행렬의 표현(0이 아닌 원소만 저장하는 방법 필요)&lt;/h4&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;하나의 원소를 표현하기 위해 3원소 쌍(&amp;lt;행번호, 열번호, 원소값&amp;gt;)으로 배열에 저장&lt;/li&gt;
&lt;li&gt;2차원인 경우 =&amp;gt; 0이 아닌 원소의 개수[행] * 3(v[][])[열], (원 행렬에 대한 정보를 순서쌍으로 작성해 0번행에 저장)&lt;/li&gt;
&lt;li&gt;n차원인 경우 =&amp;gt; t * (n+1)(v[][])&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0rsA/btrH2hzhSfR/zBZ4GG6o0D1Bx0QryvBoUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0rsA/btrH2hzhSfR/zBZ4GG6o0D1Bx0QryvBoUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0rsA/btrH2hzhSfR/zBZ4GG6o0D1Bx0QryvBoUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0rsA%2FbtrH2hzhSfR%2FzBZ4GG6o0D1Bx0QryvBoUk%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;377&quot; height=&quot;225&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전치행렬 알고리즘&lt;/p&gt;
&lt;pre id=&quot;code_1658653961544&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;smTranspose(a[]){ //행렬a를 전치시켜b를 생성
m=a[0, 0]; n=a[0, 1] //희소행렬a의 행과 열의수
v=a[0, 2]; //희소행렬a의0이 아닌 원소수
b[0, 0]=n; b[0, 1]=m //전치행렬b의 행과 열의 수를 할당
b[0, 2]=v ; //전치행렬의 원소수 할당
if (v &amp;gt; 0) {
p=1;
for (i=0;i&amp;lt;n;i=i+1){ //a의각 열에 대해 반복, 희소행렬a의 열별로 전치 반복 수행
	for (j=1; j&amp;lt;=v; j=j+1){ //모든 원소들을 검사, 0이 아닌 원소에 대해 반복
		if (a[j, 1]=i){ //현재i열에 속하는 원소가 있으면 b[]에 삽입
			b[p, 0]=a[j, 1];
			b[p, 1]=a[j, 0];
			b[p, 2]=a[j, 2];
			p=p+1;
		}
	}
}
}
return b[];
}&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;3* 4 행렬에 대한 희소행렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3(v[][]) 행렬을 구하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658653999526&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MAX 20
void read_matrix(int a[10][10], int row, int column);
void print_sparse(int b[MAX][3]);
void create_sparse(int a[10][10], int row, int column, int b[MAX][3]);
int main(){
int a[10][10], b[MAX][3], row, column;
printf(&quot;\n행렬의 크기 입력 : &quot;);
scanf(&quot;%d%d&quot;, &amp;amp;row, &amp;amp;column);
read_matrix(a, row, column); //matrix를 읽음
create_sparse(a, row, column, b); //sparsematrix를 생성
print_sparse(b);
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658654017875&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void read_matrix(int a[10][10], int row, int column){//주어진 행렬을 읽음
int i, j;
printf(&quot;\n행렬의 원소 값을 입력\n&quot;);
for (i = 0; i &amp;lt; row; i++){
	for (j = 0; j &amp;lt; column; j++){
	printf(&quot;[%d][%d]: &quot;, i, j);
	scanf(&quot;%d&quot;, &amp;amp;a[i][j]);
}
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658654052497&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result
행렬의 크기 입력 : 3 4
행렬의 원소 값을 입력 [0][0]: 0
[0][1]: 0
[0][2]: 0
[0][3]: 3
[1][0]: 0
[1][1]: 0
[1][2]: 6
[1][3]: 0
[2][0]: 0
[2][1]: 0
[2][2]: 7
[2][3]: 0 3원소 쌍의 희소행렬 출력
3 4 3
0 3 3
1 2 6
2 2 7&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658654109581&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void print_sparse(int b[MAX][3]){ //희소행렬 출력
int i, column;
column = b[0][2];
printf(&quot;\n3원소 쌍의 희소행렬 출력\n\n&quot;);
for (i = 0; i &amp;lt;= column; i++){
printf(&quot;%d\t%d\t%d\n&quot;, b[i][0], b[i][1], b[i][2]);
}
}

result
행렬의 크기 입력 : 3 4
행렬의 원소 값을 입력 [0][0]: 0
[0][1]: 0
[0][2]: 0
[0][3]: 3
[1][0]: 0
[1][1]: 0
[1][2]: 6
[1][3]: 0
[2][0]: 0
[2][1]: 0
[2][2]: 7
[2][3]: 0 3원소 쌍의 희소행렬 출력
3 4 3
0 3 3
1 2 6
2 2 7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열중심의 전치행렬을 구하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1658654151933&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Include &amp;lt;stdio.h
&amp;gt;
#define MAX 20
void printsparse
(int[][3]);
void readsparse
(int[][3]);
void transpose(int[][3], int[][3]);
int main(){
int b1[MAX][3],b2[MAX][3], m, n
;
printf(&quot; 행렬의 크기 입력:&quot;);
scanf(&quot;%d%d&quot;,&amp;amp;m, &amp;amp;n);
b1[0][0]=m; //m*n
b1[0][1]=n;
readsparse(b1);
transpose(b1, b2);
printsparse(b2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658654284929&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void readsparse
(int b[MAX][3]){ //희소행렬을 읽음
inti, t;
printf(&quot;\n0이 아닌 원소의 개수 :&quot;);
scanf(&quot;%d&quot;, &amp;amp;t); //희소행렬 생성
b[0][2]=t;
for(i=1;i&amp;lt;=t;i++){
printf(&quot;\n다음3원소 쌍의값(행,렬,값) 입력 :&quot;);
scanf(&quot;%d%d%d&quot;,&amp;amp;b[i][0],&amp;amp;b[i][1],&amp;amp;b[i][2]);
}
}
void printsparse(int b[MAX][3]){//희소행렬 출력
inti, n;
n=b[0][2]; //0이 아닌 원소의 개수
printf(&quot;\n전치 후의 행렬\n&quot;);
printf(&quot;\n행\t\t열\t\t값\n&quot;);
for(i=0;i&amp;lt;=n;i++)
printf(&quot;%d\t\t%d\t\t%d\n&quot;, b[i][0], b[i][1], b[i][2]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658654398576&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void transpose(int b1[][3], int b2[][3]){//전치행렬을 구함
int i, j, k, n;
b2[0][0]=b1[0][1];
b2[0][1]=b1[0][0];
b2[0][2]=b1[0][2];
k=1;
n=b1[0][2];
for(i=0; i&amp;lt;b1[0][1]; i++) //행
	for(j=1; j&amp;lt;=n; j++) //열
		if(i==b1[j][1]){ //열중심 순서 값 검사
			b2[k][0]=i;
			b2[k][1]=b1[j][0];
			b2[k][2]=b1[j][2];
			k++;
		}
}


result
행렬의 크기 입력 : 3 4
0이 아닌 원소의 개수 : 4
다음 3원소 쌍의 값(행, 렬, 값) 입력 : 1 0 5
다음 3원소 쌍의 값(행, 렬, 값) 입력 : 1 2 3
다음 3원소 쌍의 값(행, 렬, 값) 입력 : 2 1 1
다음 3원소 쌍의 값(행, 렬, 값) 입력 : 2 3 2
전치 후의 행렬
행 열 값
4 3 4
0 1 5
1 2 1
2 1 3
3 2 2&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;행중심과 열중심의 전치행렬에 대한 비교&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Ga0E/btrH0RnSP6o/CIMWeyJDdOWYI6ifrHKEok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Ga0E/btrH0RnSP6o/CIMWeyJDdOWYI6ifrHKEok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Ga0E/btrH0RnSP6o/CIMWeyJDdOWYI6ifrHKEok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Ga0E%2FbtrH0RnSP6o%2FCIMWeyJDdOWYI6ifrHKEok%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;543&quot; height=&quot;317&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;317&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;h2 data-ke-size=&quot;size26&quot;&gt;학습정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조체는 프로그램으로 하나 이상의 변수를 그룹 지어서 새로운 자료형(복잡한 데이터 표현)을 정의하는 것으로 구조체를 이용하여 사용자가 C언어의 기본 자료형을 가지고 새로운 자료형을 정의할 수 있다.&lt;/li&gt;
&lt;li&gt;범용리스트는 유한개의 순서가 있는 노드 또는 리스트들로 구성된 집합으로 다변수로 구성된 다항식의 표현, 희소행렬 표현 등에 활용할 수 있다.&lt;/li&gt;
&lt;li&gt;다항식을 배열로 표현할 때 degree &amp;lt; (0이 아닌 항의 수) * 2이면 1차원 배열로, degree &amp;gt; (0이 아닌 항의 수) * 2일 경우는 다항식의 각 항에 대한 &amp;lt;지수, 계수&amp;gt;의 쌍을 2차원 배열에 저장하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;희소행렬은 행렬 원소의값 중에서 `0`의값을 비교적 많이 가지는 행렬로 2차원 배열로 나타낼 때 기억공간의 낭비가 심하기 때문에 희소하지 않은 배열(3원소 쌍)로 표현하여 행렬 연산을 하는 것이 좋다.&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;</description>
      <category>23년 이전 글/자료구조</category>
      <category>구조체</category>
      <category>다항식</category>
      <category>배열</category>
      <category>범용리스트</category>
      <category>희소행렬</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/135</guid>
      <comments>https://okdone.tistory.com/135#entry135comment</comments>
      <pubDate>Sun, 24 Jul 2022 09:30:41 +0900</pubDate>
    </item>
    <item>
      <title>선형 리스트와 배열</title>
      <link>https://okdone.tistory.com/134</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;순차구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;순차 자료구조(sequential structure)&lt;/h3&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;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: 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;메모리 저장방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;- 메모리의 저장 시작 위치부터 빈자리 없이 자료를 순서 대로 연속하여 저장&lt;br /&gt;- 논리적 순서와 물리적 순서가 일치하는 구현 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;메모리에 저장된 물리적 위치나 물리적 순서와 상관없이 링크에 의해 논리적인 순서를 표현하는 구현 방식&lt;/td&gt;
&lt;/tr&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%;&quot;&gt;- 삽입, 삭제 연산을 해도 빈자리 없이 자료가 순서대로 연속하여 저장&lt;br /&gt;- 변경된 논리적인 순서와 저장된 물리적인 순서가 일치&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;삽입, 삭제 연산을 하여 논리적인 순서가 변경되어도 링크 정보만 변경되고 물리적인 순서는 변경되지 않음&lt;/td&gt;
&lt;/tr&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%;&quot;&gt;배열을 이용한 구현&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&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;h2 data-ke-size=&quot;size26&quot;&gt;선형 리스트(linear list)&lt;/h2&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;순서 -&amp;gt; 원소의 특성에 의한 논리적 순서&lt;/li&gt;
&lt;li&gt;리스트 -&amp;gt; 원소를 일렬로 정렬해 놓은 것&lt;/li&gt;
&lt;li&gt;리스트의 자료는 노드 또는 요소라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;표현형식&lt;/h3&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;표기 L = (e1,e2...)&amp;nbsp; L 리스트 이름, ei = 자료형이 같은 원소, 공백리스트 L=()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIPtTN/btrH0R8EtUb/mwn2GvYarsAlkKIeC1W5K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIPtTN/btrH0R8EtUb/mwn2GvYarsAlkKIeC1W5K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIPtTN/btrH0R8EtUb/mwn2GvYarsAlkKIeC1W5K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIPtTN%2FbtrH0R8EtUb%2Fmwn2GvYarsAlkKIeC1W5K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;392&quot; height=&quot;120&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQ65W/btrH3bLM6hp/L3NXnU8jMfoWYM8Lcq6lb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQ65W/btrH3bLM6hp/L3NXnU8jMfoWYM8Lcq6lb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQ65W/btrH3bLM6hp/L3NXnU8jMfoWYM8Lcq6lb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQ65W%2FbtrH3bLM6hp%2FL3NXnU8jMfoWYM8Lcq6lb1%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;523&quot; height=&quot;277&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선형 리스트의 저장&lt;/h3&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-origin-width=&quot;273&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciQECM/btrH0bGyRgn/tIDtwUk5FfKyJRNS6zyKhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciQECM/btrH0bGyRgn/tIDtwUk5FfKyJRNS6zyKhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciQECM/btrH0bGyRgn/tIDtwUk5FfKyJRNS6zyKhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciQECM%2FbtrH0bGyRgn%2FtIDtwUk5FfKyJRNS6zyKhK%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;273&quot; height=&quot;220&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선형 리스트 원소 삽입&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삽입 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;삽입할 빈자리 만들기&lt;/li&gt;
&lt;li&gt;삽입할 자리 이후의 원소들을 한 자리씩 뒤로 자리 이동&lt;/li&gt;
&lt;li&gt;준비한 빈자리에 원소 삽입&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삽입할 자리를 만들기 위한 자리 이동 횟수&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n+1 개의 원소로 이루어진 순서리스트에서 k번째 자리에 원소를 삽입하는 경우&lt;/li&gt;
&lt;li&gt;k번째 원소부터 마지막 n번째 원소까지 (n-k+1)개의 원소를 이동&lt;/li&gt;
&lt;li&gt;이동횟수 = n-k+1 = 마지막 원소의 색인 - 삽입할 자리의 색인 + 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9rKtN/btrH5enIl99/IR4wK89KkE2Ghykm6tUh4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9rKtN/btrH5enIl99/IR4wK89KkE2Ghykm6tUh4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9rKtN/btrH5enIl99/IR4wK89KkE2Ghykm6tUh4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9rKtN%2FbtrH5enIl99%2FIR4wK89KkE2Ghykm6tUh4K%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;534&quot; height=&quot;71&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;71&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;h3 data-ke-size=&quot;size23&quot;&gt;선형 리스트의 원소 삭제&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;삭제한 빈 자리 채우기 -&amp;gt; 삭제한 자리 이후 원소들을 한자리씩 앞으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삭제 후 빈자리를 채우기 위한 자리 이동 횟수&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(n+1)개의 원소로 이루어진 순서 리스트에서 k번째 자리의 원소를 삭제한 경우&lt;/li&gt;
&lt;li&gt;(k+1)번째 원소부터 마지막 n번째 원소까지 (n-(k+1)+1)개의 원소를 이동&lt;/li&gt;
&lt;li&gt;이동횟수 = n-(k+1)+1 = n-k = 마지막 원소의 색인 - 삭제한 자리의 색인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ly1Cz/btrH31oCH2Q/FPypAMPwzDQsbrmvjFMkn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ly1Cz/btrH31oCH2Q/FPypAMPwzDQsbrmvjFMkn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ly1Cz/btrH31oCH2Q/FPypAMPwzDQsbrmvjFMkn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLy1Cz%2FbtrH31oCH2Q%2FFPypAMPwzDQsbrmvjFMkn0%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;533&quot; height=&quot;81&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;일정시간 내 리스트의 원소들에 대한 검색 및 갱신이 가능&lt;/li&gt;
&lt;li&gt;삽입 시 평균 이동횟수 (m) = n+1/2&lt;/li&gt;
&lt;li&gt;삭제 시 평균 이동횟수 (m) = n-1/2&lt;/li&gt;
&lt;li&gt;리스트의 길이가 클 경우 = (삽입, 삭제) ~ n/2&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배열&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 자료형(기본자료형, 구조체, 포인터)들이 &amp;lt;색인, 원소&amp;gt;의 순서쌍으로 집단화한 선형자료구조(순차적 저장, 유한집합)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;색인(index)를 이용해서 자료형이 같은 데이터를 관리 및 집합 내에서 상대적인 위치의 식별(접근)이 가능함&lt;/li&gt;
&lt;li&gt;순차적 접근 -&amp;gt; 주소 계산이 쉬움.&amp;nbsp; 임의접근 -&amp;gt; 주소만 있으면 일정 시간 내 접근 가능&lt;/li&gt;
&lt;li&gt;시스템 데이터형으로 주로 연속 기억공간 할당으로 구현되며 기억공간 할당 방식과는 독립적&lt;/li&gt;
&lt;li&gt;정보의 은닉 -&amp;gt; 색인을 가지고 어떻게 원소 값에 접근하느냐는 사용자는 몰라도 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열 ADT&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crMqAQ/btrH0QPr2Wv/2TktXLPshCqJ3wMMPcyJk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crMqAQ/btrH0QPr2Wv/2TktXLPshCqJ3wMMPcyJk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crMqAQ/btrH0QPr2Wv/2TktXLPshCqJ3wMMPcyJk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrMqAQ%2FbtrH0QPr2Wv%2F2TktXLPshCqJ3wMMPcyJk1%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;497&quot; height=&quot;218&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;반복 구조를 이용&lt;/li&gt;
&lt;li&gt;실행 시간을 빠르게 하기 위해 프로그래밍 언어의 저장방법에 맞게 작성&lt;/li&gt;
&lt;li&gt;삽입/삭제 : 각 원소들을 이동해야 하기 때문에 삽입/삭제가 빈번할 경우 배열은 효과적인 자료구조가 아님 -&amp;gt; 연결리스트 구조를 이용&lt;/li&gt;
&lt;li&gt;정렬 및 탐색&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열의 크기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 요소를 참조하기 위해 행/열에 대한 두개 이상의 색인을 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1차원 = (상한 - 하한 + 1)&lt;/li&gt;
&lt;li&gt;2차원 = (상한 - 하한 + 1) * (상한 - 하한 + 1)&lt;/li&gt;
&lt;li&gt;3차원 = (상한 - 하한 + 1) * (상한 - 하한 + 1) * (상한 - 하한 + 1)&lt;/li&gt;
&lt;/ul&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;/h4&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;/li&gt;
&lt;li&gt;리스트 원소 e와 ei+1 -&amp;gt; 배열 색인 i와 i+1에 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQlH7o/btrH0R8Fu7A/c1PyDfz7PmOlzBY5VJ9uq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQlH7o/btrH0R8Fu7A/c1PyDfz7PmOlzBY5VJ9uq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQlH7o/btrH0R8Fu7A/c1PyDfz7PmOlzBY5VJ9uq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQlH7o%2FbtrH0R8Fu7A%2Fc1PyDfz7PmOlzBY5VJ9uq1%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;455&quot; height=&quot;93&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원소 크기가 1이고 시작주소가 b일 때&lt;/li&gt;
&lt;li&gt;기억장소 이용률 = 정보들의 총수 / 비트들의 총수 = 100%&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1차원 배열을 이용한 구현&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XB7jL/btrH0vktdnP/0tgKhKNFAWQxCFUAD1buo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XB7jL/btrH0vktdnP/0tgKhKNFAWQxCFUAD1buo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XB7jL/btrH0vktdnP/0tgKhKNFAWQxCFUAD1buo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXB7jL%2FbtrH0vktdnP%2F0tgKhKNFAWQxCFUAD1buo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;288&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658585420279&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
int main(){
int i, sale[4]={160, 245, 139, 450};
for (i=0; i&amp;lt;4; i++){
printf(&quot;address of sale[%d]=%d: %u \n&quot;, i, sale[i], &amp;amp;(sale[i]));
}
return 0;
}


result
address of sale[0]=160: 6487552
address of sale[1]=245: 6487556
address of sale[2]=139: 6487560
address of sale[3]=450: 6487564&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_1658585448022&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h
&amp;gt;
#define MAX_SIZE 100
int main(){
int arr[MAX_SIZE];
int
i, size, num, pos
;
printf(&quot;Enter size of the array : &quot;); //배열의 크기를 입력
scanf(&quot;%d&quot;, &amp;amp;size);
printf(&quot;Enter elements in array : &quot;); //배열에 임의의 원소를 입력
for(
i=0;
i&amp;lt;size;
i++){
scanf(&quot;%d&quot;, &amp;amp;arr
[
i]);
}
printf(&quot;Enter element to insert : &quot;); //삽입할 새로운 원소를 입력
scanf(&quot;%d&quot;, &amp;amp;num);
printf(&quot;Enter the element position : &quot;); //삽입할 위치를 입력
scanf(&quot;%d&quot;, &amp;amp;pos);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658585468828&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(pos &amp;gt; size+1 || pos &amp;lt;= 0){ //삽입 위치에 대한 조건 검사
printf(&quot;Invalid position! Please enter position between 1 to %d&quot;, size);
}
else 
{
for(i=size;i&amp;gt;=pos;i--) { //오른쪽으로 이동, 삽입할 원소의빈 공간 확보
arr[i] = arr[i-1];
}
arr[pos-1] = num; //새로운 원소를 주어진 위치에 삽입
size++; //size를 하나 증가
printf(&quot;Array elements after insertion : &quot;); //삽입후 전체 원소 출력
for(i=0;i&amp;lt;size;i++){
printf(&quot;%d\t&quot;, arr[i]);
}
}
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658585572056&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result
Enter size of the array : 4
Enter elements in array : 10 20 30 40
Enter element to insert : 15
Enter the element position : 2
Array elements after insertion : 10 15 20 30 40&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에서 원소 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1658585612079&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MAX_SIZE 100
int main(){
int arr[MAX_SIZE];
int i, size, pos;
printf(&quot;Enter size of the array : &quot;); //배열의 크기를 입력
scanf(&quot;%d&quot;, &amp;amp;size);
printf(&quot;Enter elements in array : &quot;); //배열에 임의의 원소를 입력
for(i=0; i&amp;lt;size; i++){
scanf(&quot;%d&quot;, &amp;amp;arr[i]);
}
printf(&quot;Enter the element position to delete : &quot;); //삭제할 원소의 위치를 입력
scanf(&quot;%d&quot;, &amp;amp;pos);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658585629384&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(pos &amp;lt; 0 || pos &amp;gt; size){ //삭제 위치에 대한 조건 검사
printf(&quot;Invalid position! Please enter position between 1 to %d&quot;, size);
}
else 
{
for(i=pos-1;i&amp;lt;size-1;i++){ //현재 원소 값을 다음 원소 값으로 복사
arr[i] = arr[i + 1];
}
size--; // size를 하나 감소
//삭제후 전체 원소 출력
printf(&quot;\nElements of array after delete are : &quot;);
for(i=0;i&amp;lt;size;i++){
printf(&quot;%d\t&quot;, arr[i]);
}
}
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1658585794887&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result
Enter size of the array : 5
Enter elements in array : 10 20 30 40 50
Enter the element position to delete : 3
Elements of array after delete are : 10 20 40 50&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;2차원 배열을 이용한 구현&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LGcXW/btrH0SmcZIW/BWiglRk5RKNOTxHESdEV6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LGcXW/btrH0SmcZIW/BWiglRk5RKNOTxHESdEV6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LGcXW/btrH0SmcZIW/BWiglRk5RKNOTxHESdEV6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLGcXW%2FbtrH0SmcZIW%2FBWiglRk5RKNOTxHESdEV6k%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;622&quot; height=&quot;350&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658585865660&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main(){
int numArr[3][4] = {{ 11, 22, 33, 44 }, { 55, 66, 77, 88 },
{ 99, 110, 121, 132 }};
printf(＂배열의 크기는 %d이다.\n&quot;, sizeof(numArr)); //정수 = 4바이트
int col = sizeof(numArr[0]) / sizeof(int); //배열의 가로 크기
int row = sizeof(numArr) / sizeof(numArr[0]); //배열의 세로 크기
printf(＂배열의 가로 크기는 %d이다.\n&quot;, col);
printf(＂배열의 세로 크기는 %d이다.\n&quot;, row);
return 0;
}

result
배열의 크기는 48이다.
배열의 가로 크기는 4이다.
배열의 세로 크기는 3이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 원소에 대한 물리적 주소 확인&lt;/p&gt;
&lt;pre id=&quot;code_1658585897851&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main(){
int i, j, sale[3][4] = {{ 11, 22, 33, 44 }, { 55, 66, 77, 88 },
{ 99, 110, 121, 132 }};
for(i=0; i&amp;lt;3; i++){
for(j=0; j&amp;lt;4; j++){
printf(&quot;address of sale[%d][%d]=%d: %u \n&quot;, i, j, numArr[i][j],
&amp;amp;(numArr[i][j]));
}
}
return 0;
}

result
address of sale[0][0]=11: 6487520
address of sale[0][1]=22: 6487524
address of sale[0][2]=33: 6487528
address of sale[0][3]=44: 6487532
address of sale[1][0]=55: 6487536
address of sale[1][1]=66: 6487540
address of sale[1][2]=77: 6487544
address of sale[1][3]=88: 6487548
address of sale[2][0]=99: 6487552
address of sale[2][1]=110: 6487556
address of sale[2][2]=121: 6487560
address of sale[2][3]=132: 6487564&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;3차원 배열을 이용한 구현&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfzFy0/btrH1a1eBNU/gbbGue4hMQ6XC9LoqxCC0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfzFy0/btrH1a1eBNU/gbbGue4hMQ6XC9LoqxCC0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfzFy0/btrH1a1eBNU/gbbGue4hMQ6XC9LoqxCC0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfzFy0%2FbtrH1a1eBNU%2FgbbGue4hMQ6XC9LoqxCC0K%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;573&quot; height=&quot;300&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZM3Zf/btrH3cKJPlT/nfFDD4TDCXBqtgsxBIPIbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZM3Zf/btrH3cKJPlT/nfFDD4TDCXBqtgsxBIPIbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZM3Zf/btrH3cKJPlT/nfFDD4TDCXBqtgsxBIPIbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZM3Zf%2FbtrH3cKJPlT%2FnfFDD4TDCXBqtgsxBIPIbk%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;576&quot; height=&quot;316&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 원소에 대한 물리적 주소 확인&lt;/p&gt;
&lt;pre id=&quot;code_1658585966133&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main(){
int i, j, k, sale[2][2][4]={{{67, 88, 45, 98}, {70, 86, 60, 78}},
{{55, 80, 50, 87}, {66, 43, 92, 76}}};
for(i=0; i&amp;lt;2; i++){
for(j=0; j&amp;lt;2; j++){
for(k=0; k&amp;lt;4; k++){
printf(&quot;address of sale[%d][%d][%d]]=%d: %u \n&quot;, i, j, k,
sale[i][j][k], &amp;amp;(sale[i][j][k]));
}
}
}
return 0;
}


result
address of sale[0][0][0]]=67: 6487504
address of sale[0][0][1]]=88: 6487508
address of sale[0][0][2]]=45: 6487512
address of sale[0][0][3]]=98: 6487516
address of sale[0][1][0]]=70: 6487520
address of sale[0][1][1]]=86: 6487524
address of sale[0][1][2]]=60: 6487528
address of sale[0][1][3]]=78: 6487532
address of sale[1][0][0]]=55: 6487536
address of sale[1][0][1]]=80: 6487540
address of sale[1][0][2]]=50: 6487544
address of sale[1][0][3]]=87: 6487548
address of sale[1][1][0]]=66: 6487552
address of sale[1][1][1]]=43: 6487556
address of sale[1][1][2]]=92: 6487560
address of sale[1][1][3]]=76: 6487564&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 정리&lt;/h2&gt;
&lt;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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/자료구조</category>
      <category>array</category>
      <category>배열</category>
      <category>비순차구조</category>
      <category>선형리스트</category>
      <category>순차구조</category>
      <category>연결자료구조</category>
      <category>자료구조</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/134</guid>
      <comments>https://okdone.tistory.com/134#entry134comment</comments>
      <pubDate>Sat, 23 Jul 2022 23:23:50 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스 시스템, 데이터 모델</title>
      <link>https://okdone.tistory.com/133</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0M0o/btrH0uS1IBU/SgTUCkaShiBXAkj7qERFV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0M0o/btrH0uS1IBU/SgTUCkaShiBXAkj7qERFV1/img.png&quot; data-alt=&quot;데이터베이스 시스템 구조와 유형&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0M0o/btrH0uS1IBU/SgTUCkaShiBXAkj7qERFV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0M0o%2FbtrH0uS1IBU%2FSgTUCkaShiBXAkj7qERFV1%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;583&quot; height=&quot;375&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 시스템 구조와 유형&lt;/figcaption&gt;
&lt;/figure&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;데이터베이스 API&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API는 데이터베이스에 접근하기 위하여 공통적으로 사용되는 라이브러리 함수들의 모임&lt;/li&gt;
&lt;li&gt;중요한 데이터베이스 API 표준 ODBC, JDBC&lt;/li&gt;
&lt;li&gt;ODBC(Open Database Connectivity) : 마이크로 소프트가 주도적 개발한 데이터베이스 드라이버로 윈도우 운영체제에서 사용&lt;/li&gt;
&lt;li&gt;JDBC(Java Database Connectivity) : 자바를 위한 데이터베이스 드라이버, 자바가 운영되는 모든 플랫폼에서 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxIE0M/btrH5dWCrK9/MgygmTBObbsNjQLUgUYGR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxIE0M/btrH5dWCrK9/MgygmTBObbsNjQLUgUYGR1/img.png&quot; data-alt=&quot;데이터베이스API(ODBC)의역할&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxIE0M/btrH5dWCrK9/MgygmTBObbsNjQLUgUYGR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxIE0M%2FbtrH5dWCrK9%2FMgygmTBObbsNjQLUgUYGR1%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;584&quot; height=&quot;369&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스API(ODBC)의역할&lt;/figcaption&gt;
&lt;/figure&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;중앙 집중식 데이터베이스 시스템(centralized database system)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 시스템이 하나의 컴퓨터 시스템에서 운영됨&lt;/li&gt;
&lt;li&gt;데이터베이스 접근과 관련하여 다른 컴퓨터 시스템과 상호 작용하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;분산 데이터베이스 시스템(distributed database system)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크로 연결된 여러 사이트에 데이터베이스 자체가 분산되어 있으며, 데이터베이스 시스템도 여러 컴퓨터 시스템에서 운영됨&lt;/li&gt;
&lt;li&gt;사용자는 다른 사이트에 저장된 데이터베이스도 접근할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqcakq/btrH2hk8lqa/zdTx8Lh8MUpvL5UKSmmjDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqcakq/btrH2hk8lqa/zdTx8Lh8MUpvL5UKSmmjDK/img.png&quot; data-alt=&quot;분산데이터베이스시스템(distributed database system)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqcakq/btrH2hk8lqa/zdTx8Lh8MUpvL5UKSmmjDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqcakq%2FbtrH2hk8lqa%2FzdTx8Lh8MUpvL5UKSmmjDK%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;503&quot; height=&quot;375&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;분산데이터베이스시스템(distributed database system)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라이언트-서버 데이터베이스 시스템&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PC또는 워크스테이션처럼 자체 컴퓨팅 능력을 가진 클라이언트를 통해 데이터베이스 서버를 접근&lt;/li&gt;
&lt;li&gt;데이터베이스가 하나의 데이터베이스 서버에 저장되어 있음&lt;/li&gt;
&lt;li&gt;데이터베이스 시스템의 기능이 서버와 클라이언트에 분산됨&lt;/li&gt;
&lt;li&gt;서버는 데이터베이스를 저장하고 DBMS를 운영하면서 여러 클라이언트에게 온 질의를 최적화하고 권한 검사를 수행하고, 동시성 제어와 회복 기능을 수행하고, 데이터베이스의 무결성을 유지하고, 데이터베이스 접근을 관리&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq6Iqo/btrH32VlkYn/kjcwrunF05bhjbVjFHxws0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq6Iqo/btrH32VlkYn/kjcwrunF05bhjbVjFHxws0/img.png&quot; data-alt=&quot;클라이언트&amp;amp;ndash;서버데이터베이스시스템&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq6Iqo/btrH32VlkYn/kjcwrunF05bhjbVjFHxws0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq6Iqo%2FbtrH32VlkYn%2FkjcwrunF05bhjbVjFHxws0%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;466&quot; height=&quot;313&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클라이언트&amp;ndash;서버데이터베이스시스템&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2층 모델(2-tier model)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트와 데이터베이스 서버가 직접 연결됨&lt;/li&gt;
&lt;li&gt;응용의 논리가 클라이언트와 서버에 분산됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LzB36/btrHZAfmF0m/5DsD5w9EHwRB80NsN3Qbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LzB36/btrHZAfmF0m/5DsD5w9EHwRB80NsN3Qbfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LzB36/btrHZAfmF0m/5DsD5w9EHwRB80NsN3Qbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLzB36%2FbtrHZAfmF0m%2F5DsD5w9EHwRB80NsN3Qbfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;262&quot; height=&quot;98&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3층 모델(3-tier model)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트와 데이터베이스 서버 사이에 응용 서버가 추가됨&lt;/li&gt;
&lt;li&gt;응용의 논리가 응용 서버에만 포함됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2C7Js/btrH0RHw2sm/aQCheHPkBpMhKfmH8JMsq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2C7Js/btrH0RHw2sm/aQCheHPkBpMhKfmH8JMsq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2C7Js/btrH0RHw2sm/aQCheHPkBpMhKfmH8JMsq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2C7Js%2FbtrH0RHw2sm%2FaQCheHPkBpMhKfmH8JMsq0%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;307&quot; height=&quot;94&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/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;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 모델&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 모델 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 모델(Data Model)이란 데이터베이스의 구조를 단순화, 추상화하여 체계적으로 표현하는데 사용되는 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do2mI2/btrH1b6LBGU/wP6TpVaL15INcIrULKf4k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do2mI2/btrH1b6LBGU/wP6TpVaL15INcIrULKf4k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do2mI2/btrH1b6LBGU/wP6TpVaL15INcIrULKf4k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo2mI2%2FbtrH1b6LBGU%2FwP6TpVaL15INcIrULKf4k1%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;478&quot; height=&quot;311&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;311&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfO8z2/btrH31vlWd8/mQpcPpypTgL4EqoI2u3Xh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfO8z2/btrH31vlWd8/mQpcPpypTgL4EqoI2u3Xh1/img.png&quot; data-alt=&quot;현실과 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfO8z2/btrH31vlWd8/mQpcPpypTgL4EqoI2u3Xh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfO8z2%2FbtrH31vlWd8%2FmQpcPpypTgL4EqoI2u3Xh1%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;533&quot; height=&quot;328&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현실과 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/reYq4/btrH3Q1EmUc/aWS1j5kEP9UaLArEdMJ0D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/reYq4/btrH3Q1EmUc/aWS1j5kEP9UaLArEdMJ0D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/reYq4/btrH3Q1EmUc/aWS1j5kEP9UaLArEdMJ0D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FreYq4%2FbtrH3Q1EmUc%2FaWS1j5kEP9UaLArEdMJ0D1%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;519&quot; height=&quot;332&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;332&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;h4 data-ke-size=&quot;size20&quot;&gt;데이터베이스 설계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념적인 구조와 논리적인 구조를 거쳐 실제 데이터를 저장할 수 있는 물리적 구조로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개념적 데이터 모델&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성들로 기술된 개체 타입(entity type)과 이 개체 타입들 간의 관계를 이용해 현실 세계를 표현하는 방법&lt;/li&gt;
&lt;li&gt;가장 대표적인 것이 개체-관계 모델(E-R: Entity-Relationship model)&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 필드로 기술된 데이터 타입과 데이터 타입들 간의 관계를 이용하여 현실 세계를 표현하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRyV7e/btrH32A2hBM/iJX3dzgz9goySv0dhCekdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRyV7e/btrH32A2hBM/iJX3dzgz9goySv0dhCekdK/img.png&quot; data-alt=&quot;데이터 모델의 구성요소 [D = (S, O, C)]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRyV7e/btrH32A2hBM/iJX3dzgz9goySv0dhCekdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRyV7e%2FbtrH32A2hBM%2FiJX3dzgz9goySv0dhCekdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;259&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 모델의 구성요소 [D = (S, O, C)]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Structure&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 성질(추상적 개념)&lt;/li&gt;
&lt;li&gt;개체타입과 이들 간의 관계를 명세&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;operation&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;constraint&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 논리적 제약 -&amp;gt; 개체 인스턴스의 허용 조건: 구조(S)로부터 파생, 의미상 제약&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;논리적 데이터 모델 중에는 relational data model이 가장 많이 사용되며, 최근에는 객체 지향 데이터 모델과 객체-관계 데이터 모델도 사용. DBMS는 하나의 논리적 데이터 모델만을 구현 모델 간의 주요 차이점은 데이터 요소간의 관계를 표현하는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYhUhz/btrH3cRttCv/hcIrKqdXpOMcypHikD7dyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYhUhz/btrH3cRttCv/hcIrKqdXpOMcypHikD7dyK/img.png&quot; data-alt=&quot;개념적 데이터모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYhUhz/btrH3cRttCv/hcIrKqdXpOMcypHikD7dyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYhUhz%2FbtrH3cRttCv%2FhcIrKqdXpOMcypHikD7dyK%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;552&quot; height=&quot;263&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개념적 데이터모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOqHHj/btrH5aeurmC/8taIKbvxFOqovMip6QmyF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOqHHj/btrH5aeurmC/8taIKbvxFOqovMip6QmyF1/img.png&quot; data-alt=&quot;논리적 데이터 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOqHHj/btrH5aeurmC/8taIKbvxFOqovMip6QmyF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOqHHj%2FbtrH5aeurmC%2F8taIKbvxFOqovMip6QmyF1%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;554&quot; height=&quot;227&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;논리적 데이터 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 데이터 모델&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 개념이 단순한 데이터 모델의 하나&lt;/li&gt;
&lt;li&gt;IBM 연구소에 근무하던 E.F Codd가 1970년대 관계 데이터 모델 제안&lt;/li&gt;
&lt;li&gt;Relation과 수학적 이론을 기초로하며, IBM연구소에서 개발된 SystemR(SQL)&lt;/li&gt;
&lt;li&gt;여러 데이터 모델이 새로 등장했지만 관계 DBMS가 가장 널리 사용되는 DBMS&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단한 테이블(relation)을 사용&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;/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;h4 data-ke-size=&quot;size20&quot;&gt;관계 데이터 모델 특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;relation(table)로 모든 데이터를 논리적으로 구성&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관계 데이터 모델의 용어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;relation : 2차원의 테이블(스프레드 시트와 유사)&lt;/li&gt;
&lt;li&gt;record : relation의 각 행&lt;/li&gt;
&lt;li&gt;tuple : record를 좀 더 공식적으로 부르는 용어&lt;/li&gt;
&lt;li&gt;attribute : relation에서 이름을 가진 하나의 열&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 attribute에 나타날 수 있는 값의 집합&lt;/li&gt;
&lt;li&gt;각 attribute의 도메인의 값들은 원소 값&lt;/li&gt;
&lt;li&gt;프로그래밍 언어의 데이터 타입과 유사&lt;/li&gt;
&lt;li&gt;동일한 도메인이 여러 attribute에서 사용될 수 있음&lt;/li&gt;
&lt;li&gt;복합 attribute나 다치 attribute는 허용되지 않음&lt;/li&gt;
&lt;li&gt;도메인 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1658581224592&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE DOMAIN EMPNAME CHAR(10)
CREATE DOMAIN EMPNO INTEGER
CREATE DOMAIN DNO INTEGER&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;차수(degree)와 카디날리티(cardinality)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차수 : 한 relation에 들어있는 attribute의 수&lt;/li&gt;
&lt;li&gt;유효한 릴레이션의 최소 차수는 1&lt;/li&gt;
&lt;li&gt;카디날리티 : relation에 tuple 수&lt;/li&gt;
&lt;li&gt;유효한 릴레이션은 카디날리티 0을 가질 수 있음&lt;/li&gt;
&lt;li&gt;relation의 차수는 자주 바뀌지 않음&lt;/li&gt;
&lt;li&gt;relation의 카디날리티는 시간이 지남에 따라 계속해서 변함&lt;/li&gt;
&lt;/ul&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;544&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSAOf/btrH08WggvT/iPmMdTajUGWR4ZwX8ZXyZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSAOf/btrH08WggvT/iPmMdTajUGWR4ZwX8ZXyZ1/img.png&quot; data-alt=&quot;relation 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSAOf/btrH08WggvT/iPmMdTajUGWR4ZwX8ZXyZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSAOf%2FbtrH08WggvT%2FiPmMdTajUGWR4ZwX8ZXyZ1%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;544&quot; height=&quot;234&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;relation 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xg0AN/btrHZQWztjy/FWJKzOHwgPhCFYu2W1xJAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xg0AN/btrHZQWztjy/FWJKzOHwgPhCFYu2W1xJAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xg0AN/btrHZQWztjy/FWJKzOHwgPhCFYu2W1xJAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXg0AN%2FbtrHZQWztjy%2FFWJKzOHwgPhCFYu2W1xJAK%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;508&quot; height=&quot;151&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;151&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;</description>
      <category>23년 이전 글/데이터베이스</category>
      <category>domain</category>
      <category>Relation</category>
      <category>tuple</category>
      <category>관계형</category>
      <category>데이터</category>
      <category>데이터베이스</category>
      <category>모델</category>
      <category>아키텍처</category>
      <category>카디날리티</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/133</guid>
      <comments>https://okdone.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 23 Jul 2022 22:12:47 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스 시스템 구성 요소</title>
      <link>https://okdone.tistory.com/132</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 베이스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조직체의 여러 응용 시스템들이 공유해서 사용하기 위한, 구조적으로 통합된 운영 데이터들의 모임&lt;/li&gt;
&lt;li&gt;시스템 카탈로그( 또는 데이터 사전)와 저장된 데이터베이스로 구분 가능&lt;/li&gt;
&lt;li&gt;시스템 카탈로그는 저장된 데이터베이스의 스키마 정보를 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crbpWZ/btrH1bMfD7b/CkBvZyskAIGFVkarIRXo5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crbpWZ/btrH1bMfD7b/CkBvZyskAIGFVkarIRXo5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crbpWZ/btrH1bMfD7b/CkBvZyskAIGFVkarIRXo5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrbpWZ%2FbtrH1bMfD7b%2FCkBvZyskAIGFVkarIRXo5K%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;789&quot; height=&quot;363&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 관리시스템&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 요구에 따라 데이터베이스에 대한 모든 연산을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 사용자의 접근 요구를 접수/분석&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;3. 외부/개념/내부/저장 구조 간의 스키마 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 저장 데이터베이스에 대한 연산을 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blYm9x/btrH1CbFp1e/HSm61uRfDfrCpKs2IKzG0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blYm9x/btrH1CbFp1e/HSm61uRfDfrCpKs2IKzG0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blYm9x/btrH1CbFp1e/HSm61uRfDfrCpKs2IKzG0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYm9x%2FbtrH1CbFp1e%2FHSm61uRfDfrCpKs2IKzG0k%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;678&quot; height=&quot;419&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DDL 컴파일러 : DDL을 내부 형태로 변환하여 카탈로그에 저장(메타 데이터베이스)&lt;/li&gt;
&lt;li&gt;질의어 처리기 : 질의문을 파싱, 분석, 컴파일하여 목적 코드 생성&lt;/li&gt;
&lt;li&gt;예비 컴파일러 : 응용 프로그램의 DML을 추출하고 그 자리에 Procedure Call로 대체&lt;/li&gt;
&lt;li&gt;DML 컴파일러&lt;/li&gt;
&lt;li&gt;런타임 데이터베이스 처리기 : 런타임의 DB에 접근하여 데이터베이스 연산 수행&lt;/li&gt;
&lt;li&gt;트랜잭션 관리자 : 무결성과 권한 제어, 병행 제어와 회복 작업&lt;/li&gt;
&lt;li&gt;저장 데이터 관리자&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWxD0z/btrH3cKmHrJ/Fh7wmXksAakrpRX3rZR6a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWxD0z/btrH3cKmHrJ/Fh7wmXksAakrpRX3rZR6a1/img.png&quot; data-alt=&quot;DBMS의 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWxD0z/btrH3cKmHrJ/Fh7wmXksAakrpRX3rZR6a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWxD0z%2FbtrH3cKmHrJ%2FFh7wmXksAakrpRX3rZR6a1%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;522&quot; height=&quot;337&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DBMS의 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 언어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 정의어&lt;/h3&gt;
&lt;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;데이터 정의어로 명시된 문장이 입력되면 DBMS는 사용자가 정의한 스키마에 대한 명세를 시스템 카탈로그 또는 데이터 사전에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 정의어의 기본적인 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 모델에서 지원하는 데이터 구조를 생성&amp;nbsp; 예) SQL에서 CREATE TABLE&lt;/li&gt;
&lt;li&gt;데이터 구조의 변경 예) SQL에서 ALTER TABLE&lt;/li&gt;
&lt;li&gt;데이터 구조의 삭제 예) SQL DROP TABLE&lt;/li&gt;
&lt;li&gt;데이터 접근을 위해 특정 애트리뷰트 위에 인덱스를 정의 예) CREATE INDEX&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 조작어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 원하는 데이터를 DBMS가 처리할 수 있도록 명세하는 도구&lt;/li&gt;
&lt;li&gt;데이터베이스내의 데이터를 검색, 수정, 삽입, 삭제&lt;/li&gt;
&lt;li&gt;데이터 처리를 명세하는 방법에 따라 절차적, 비절차적 DML로 나눌 수 있음. 절차적 DML은 어떤 데이터가 필요하고 어떻게 데이터를 접근할지, 비절차적 DML은 어떤 데이터가 필요한지만 명세&lt;/li&gt;
&lt;li&gt;관계 DBMS에서 사용되는 SQL은 대표적인 비절차적 언어&lt;/li&gt;
&lt;li&gt;데이터 조작어는 단말기에서 대화식으로 입력되어 수행되거나, C, 자바 등의 고급 프로그래밍 언어로 작성된 프로그램에 내포되어 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 조작어의 기본적인 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 검색&amp;nbsp; 예) SQL의 SELECT&lt;/li&gt;
&lt;li&gt;데이터 수정 예) SQL의 UPDATE&lt;/li&gt;
&lt;li&gt;데이터 삭제 예) SQL DELETE&lt;/li&gt;
&lt;li&gt;데이터 삽입 예) SQL INSERT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6EBJd/btrH5alc5sJ/10rKK7Jw4GkYdBAVNp0l5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6EBJd/btrH5alc5sJ/10rKK7Jw4GkYdBAVNp0l5k/img.png&quot; data-alt=&quot;데이터 정의어와 데이터 조작어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6EBJd/btrH5alc5sJ/10rKK7Jw4GkYdBAVNp0l5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6EBJd%2FbtrH5alc5sJ%2F10rKK7Jw4GkYdBAVNp0l5k%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;542&quot; height=&quot;188&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;188&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 제어어(DCL, Data Control Language)&lt;/h4&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;data security, integrity, recovery, concurrency control 의 명령어를 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dN0zVy/btrH1b6IHL3/LzgcH5QGXkdrZEacP3skMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dN0zVy/btrH1b6IHL3/LzgcH5QGXkdrZEacP3skMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dN0zVy/btrH1b6IHL3/LzgcH5QGXkdrZEacP3skMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdN0zVy%2FbtrH1b6IHL3%2FLzgcH5QGXkdrZEacP3skMK%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;471&quot; height=&quot;322&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;322&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;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 관리자&lt;/h3&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;데이터 정의어(DDL)와 데이터 제어어(DCL)사용&lt;/li&gt;
&lt;/ul&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;/h4&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;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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;앱 프로그래머&lt;/h3&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;프로그래밍 언어인 C, JAVA 등으로 응용 프로그래밍을 개발하면서 데이터베이스를 접근하는 부분은 내포된 데이터 조작어 사용&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;h3 data-ke-size=&quot;size23&quot;&gt;최종 사용자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질의하거나 갱신하거나 보고서를 생성하기 위해서 데이터베이스를 사용하는 사람&lt;/li&gt;
&lt;li&gt;최종 사용자는 다시 데이터베이스 질의어를 사용하여 매번 다른정보를 찾는 캐주얼 사용자와 기작성 트랜잭션을 주로 반복해서 수행하는 초보 사용자로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 설계자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ERWin 등의 CASE(Computer-Aided Software Engineering)&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;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 컴퓨터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 기능을 수행하기 위한 전용 목적의 하드웨어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Backend Processor&lt;/li&gt;
&lt;li&gt;지능형 저장 장치&lt;/li&gt;
&lt;li&gt;associative 메모리&lt;/li&gt;
&lt;li&gt;병렬 처리(Parallel Processing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctSAMA/btrH1y8cOaJ/DBmsUktMt6kgcWImYSe2Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctSAMA/btrH1y8cOaJ/DBmsUktMt6kgcWImYSe2Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctSAMA/btrH1y8cOaJ/DBmsUktMt6kgcWImYSe2Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctSAMA%2FbtrH1y8cOaJ%2FDBmsUktMt6kgcWImYSe2Q1%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;335&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스 시스템 요구사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 독립성&lt;/li&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터베이스를 보는 관점에 따라 3단계로 표현&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부단계(External Level) : 각 사용자의 뷰&lt;/li&gt;
&lt;li&gt;개념단계(Conceptual Level) : 사용자의 뷰가 통합된 기관 전체의 뷰&lt;/li&gt;
&lt;li&gt;내부단계(Internal Level) : 물리적 저장장치의 입장에서 뷰&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외부단계&lt;/h3&gt;
&lt;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;h3 data-ke-size=&quot;size23&quot;&gt;개념단계&lt;/h3&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;li&gt;저장 구조와 독립적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내부단계&lt;/h3&gt;
&lt;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;li&gt;내부 단계 아래는 물리적 단계&lt;/li&gt;
&lt;li&gt;물리적 단계는 DBMS의 지시에 따라 운영체제가 관리함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스키마(Schema)&lt;/h2&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;3단계 스키마 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; 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;외부스키마(external schema)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;- 개별 사용자 입장에서 데이터베이스 구조를 기술한 것&lt;br /&gt;- 개별 사용자를 위한 여러 형태의 외부 스키마가 존재&lt;br /&gt;- 서브 스키마(sub schema)라고도 부름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;개념스키마(conceptual schema)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;- 조직 전체 입장에서 통합한 데이터베이스를 기술한 것&lt;br /&gt;- 하나의 개념스키마만 존재&lt;br /&gt;- 스키마(schema)라고도 부름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;내부스키마(internal schema)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;- 저장된 입장에서 전체 데이터베이스가 저장되는 방법을 명세한 것&lt;br /&gt;- 하나의 내부 스키마만 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c90Su8/btrH2hyD1Ro/YheJyeZDkfhBAK7TFLRCZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c90Su8/btrH2hyD1Ro/YheJyeZDkfhBAK7TFLRCZk/img.png&quot; data-alt=&quot;3단계 스키마 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c90Su8/btrH2hyD1Ro/YheJyeZDkfhBAK7TFLRCZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc90Su8%2FbtrH2hyD1Ro%2FYheJyeZDkfhBAK7TFLRCZk%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;462&quot; height=&quot;332&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3단계 스키마 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 독립성(Data Independency)의 구현&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; 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;외부/개념 스키마(앱 인터페이스)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;외부 스키마와 개념 스키마 간의 대응 관계를 정의한 것으로 논리적 구조(개념 스키마)를 변경하더라도 앱 프로그램에 영향을 주지 않아서 논리적 데이터 독립성을 제공해주는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;개념/내부 스키마(저장 인터페이스)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;개념 스키마와 내부 스키마 간의 대응 관계를 정의한 것으로 물리적 구조(내부 스키마)를 변경하더라도 응용 프로그램과 논리적 구조(개념 스키마)에 영향을 주지 않아 물리적 데이터 독립성을 제공해주는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;내부/장치 스키마(장치 인터페이스)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&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;h2 data-ke-size=&quot;size26&quot;&gt;3단계 간의 사상(Mapping)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;논리적 데이터 독립성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개념 스키마의 변화로부터 외부 스키마가 영향을 받지 않음을 의미&lt;/li&gt;
&lt;li&gt;기존의 외부 스키마에 영향을 미치지 않고 응용 프로그램을 다시 작성할 필요 없이 개념 스키마에 대한 변화가 가능해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;물리적 데이터 독립성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 스키마의 변화가 개념적 스키마에 영향을 미치지 않으며 따라서 외부 스키마(또는 응용 프로그램)에도 영향을 미치지 않음을 의미&lt;/li&gt;
&lt;li&gt;내부 스키마의 변화의 예: 파일의 저장 구조를 바꾸거나 인덱스를 생성하거나 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQN3aj/btrH0bGv4jd/lmq3mHpKBqLI8TFpgG0xR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQN3aj/btrH0bGv4jd/lmq3mHpKBqLI8TFpgG0xR1/img.png&quot; data-alt=&quot;논리적데이터독립성과물리적데이터독립성이적용되는 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQN3aj/btrH0bGv4jd/lmq3mHpKBqLI8TFpgG0xR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQN3aj%2FbtrH0bGv4jd%2Flmq3mHpKBqLI8TFpgG0xR1%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;515&quot; height=&quot;313&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;313&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0qPLA/btrH3cjAJQq/E4Rau6T4Vb19gzuaiaYU7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0qPLA/btrH3cjAJQq/E4Rau6T4Vb19gzuaiaYU7K/img.png&quot; data-alt=&quot;데이터베이스 구조 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0qPLA/btrH3cjAJQq/E4Rau6T4Vb19gzuaiaYU7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0qPLA%2FbtrH3cjAJQq%2FE4Rau6T4Vb19gzuaiaYU7K%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;646&quot; height=&quot;414&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;414&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>23년 이전 글/데이터베이스</category>
      <category>3단계</category>
      <category>관리시스템</category>
      <category>데이터베이스</category>
      <category>독립성</category>
      <category>사용자</category>
      <category>스키마</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/132</guid>
      <comments>https://okdone.tistory.com/132#entry132comment</comments>
      <pubDate>Sat, 23 Jul 2022 13:01:54 +0900</pubDate>
    </item>
    <item>
      <title>Tensorflow, TPU, Dataset, TFRecords, Cheet sheet</title>
      <link>https://okdone.tistory.com/131</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TPU(Tensor Processing Unit)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbTMZ/btrH1CvSqaX/Bcmg9LQA9U0kUjW8E1j3d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbTMZ/btrH1CvSqaX/Bcmg9LQA9U0kUjW8E1j3d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbTMZ/btrH1CvSqaX/Bcmg9LQA9U0kUjW8E1j3d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbTMZ%2FbtrH1CvSqaX%2FBcmg9LQA9U0kUjW8E1j3d0%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;708&quot; height=&quot;330&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;딥러닝을 위해 만들어진 가속화 하드웨어로, 특히 Tensorflow, Keras와 찰떡 궁합으로 만들어진 장치&lt;/li&gt;
&lt;li&gt;Cloud TPU에서 사용 가능하며, 기본적으로 1개 TPU에 8개 코어가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TPU를 쓰는 이유&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TPU는 딥러닝에서, 특히 행렬곱을 위해 최적화 된 장치.&lt;/li&gt;
&lt;li&gt;1개의 TPU만 잘 사용해도 8개의 코어를 통해 학습 속도를 극대화 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7fNnS/btrH2oKIzEB/kpNmEtfdSpOnlgkcxCw370/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7fNnS/btrH2oKIzEB/kpNmEtfdSpOnlgkcxCw370/img.png&quot; data-alt=&quot;Illustration: a dense neural network layer as a matrix multiplication, with a batch of eight images processed through the neural network at once. Please run through one line x column multiplication to verify that it is indeed doing a weighted sum of all the pixels values of an image. Convolutional layers can be represented as matrix multiplications too although it's a bit more complicated (&amp;amp;amp;nbsp; explanation here, in section 1 ).&amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; 출처 :&amp;amp;amp;nbsp;https://codelabs.developers.google.com/codelabs/keras-flowers-data#2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7fNnS/btrH2oKIzEB/kpNmEtfdSpOnlgkcxCw370/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7fNnS%2FbtrH2oKIzEB%2FkpNmEtfdSpOnlgkcxCw370%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;1280&quot; height=&quot;1180&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Illustration: a dense neural network layer as a matrix multiplication, with a batch of eight images processed through the neural network at once. Please run through one line x column multiplication to verify that it is indeed doing a weighted sum of all the pixels values of an image. Convolutional layers can be represented as matrix multiplications too although it's a bit more complicated (&amp;amp;nbsp; explanation here, in section 1 ).&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 출처 :&amp;amp;nbsp;https://codelabs.developers.google.com/codelabs/keras-flowers-data#2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN6hAe/btrH0uZEXN8/EzWp3XQiOkFywqnOEqKrFK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN6hAe/btrH0uZEXN8/EzWp3XQiOkFywqnOEqKrFK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN6hAe/btrH0uZEXN8/EzWp3XQiOkFywqnOEqKrFK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cN6hAe/btrH0uZEXN8/EzWp3XQiOkFywqnOEqKrFK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;720&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TPU를 쓰는 개인적이고 주관적인 이유&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google의 &lt;a href=&quot;https://sites.research.google/trc/about/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TPU Research Cloud&lt;/a&gt; 에서는 일반 개인에게도 자유롭게 TPU를 무료로 빌려준다(storage, networking 비용 별도, 코랩 프로 비용 만큼도 나오지 않음)&lt;/li&gt;
&lt;li&gt;NIA등 국내 정부기관에서는 기업, 연구실 단위로만 GPU를 지원해주며, 개인에게는 지원해주지 않.는.다&lt;/li&gt;
&lt;li&gt;캐글이나, 데이콘 등 대회에 참여시 컴퓨팅 능력이 좋으면 좋은만큼 다양한 실험을 해보고, 빠르게 결과를 확인할 수 있다.(Vram이 크면 큰 모델을, 연산 능력이 빠르면 제한된 시간안에 다양한 모델을.)&lt;/li&gt;
&lt;li&gt;VM 자체 스펙도 굉장하다.&amp;nbsp; 96개의 cpu 코어, 120GB RAM은 전처리 과정에도 굉장한 도움이 된다&lt;/li&gt;
&lt;li&gt;시즈 탱크와 같다 생각한다. 적용하는 과정은 시즈 모드와 같으며, 한번 시즈 모드가 갖춰지면 굉장한 연산력을 보여준다&lt;/li&gt;
&lt;li&gt;현재 Cloud TPU 3-8이 무료로 제공된다. Cloud TPU 4-8가 최근 나온 상태에서 훗날 TPU의 성장 가능성은 무궁무진하다고 생각한다.&lt;/li&gt;
&lt;li&gt;Tensorflow에 최적화 되어있어 현재 가지고 있는 기술 스택에도 적합하다.&lt;/li&gt;
&lt;li&gt;적용 방법이 살짝 다를 뿐, 결국 GPU를 사용하더라도, Distributed된 학습과 추론이 가능하기 때문에 이걸 배운다해서 GPU를 사용할 때 이 개념이 쓰이지 않는 것은 아니다.&lt;/li&gt;
&lt;li&gt;난이도 있는 게임을 좋아하는 사람은 다크 소울을 한다. 나는 다크 소울 대신 TPU를 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU에 비해 유연하지 못한 점이 있다. padding을 제대로 해주지 않으면 compile을 거치면서 오히려 GPU보다 늦다.&lt;/li&gt;
&lt;li&gt;로컬에서 사용할 수 없기 때문에 Cloud를 base로 활용해야하며, 이를 위해 google storage와 vm에 ssh로 접속해서 쓰는 방법이 필요하다&lt;/li&gt;
&lt;li&gt;GPU에서 돌아가던 모델이, TPU에서 안돌아가는 경우가 있다(모델 내부에 TPU에서 사용 불가능한 코드가 있는 경우)&lt;/li&gt;
&lt;li&gt;python의 function을 쓸 수 없다&lt;/li&gt;
&lt;li&gt;초급자에게 진입 장벽이 큰 편. 회사에서도 보편적으로 아직 사용하지 않는 것으로 보인다(기술 블로그에 TPU 흔적이 보이는 기업이 몇 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dataset&lt;/h2&gt;
&lt;figure id=&quot;og_1658537673038&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;tf.data API로 성능 향상하기 &amp;nbsp;|&amp;nbsp; TensorFlow Core&quot; data-og-description=&quot;tf.data API로 성능 향상하기 Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의&quot; data-og-host=&quot;www.tensorflow.org&quot; data-og-source-url=&quot;https://www.tensorflow.org/guide/data_performance?hl=ko&quot; data-og-url=&quot;https://www.tensorflow.org/guide/data_performance?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iRmoq/hyPbUhqdH8/1k2QPdlOD28KdvPlApk9fK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/data_performance?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tensorflow.org/guide/data_performance?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iRmoq/hyPbUhqdH8/1k2QPdlOD28KdvPlApk9fK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&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;tf.data API로 성능 향상하기 &amp;nbsp;|&amp;nbsp; TensorFlow Core&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;tf.data API로 성능 향상하기 Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tensorflow.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무리 GPU든, TPU든 빠린 사람이 있더라도 데이터를 서빙하는 워커가 데이터를 늦게 가져주면 소용이 없다&lt;/li&gt;
&lt;li&gt;이러한 병목 제거를 위해 파이프라인을 구성하는 API&lt;/li&gt;
&lt;li&gt;이외에도 다양한 API를 통해 데이터 파이프 라인 작성시 도움 되는 기능이 많음&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;h2 data-ke-size=&quot;size26&quot;&gt;TFRecord&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 파이프 라인의 정점에 있는 형태로 보면 될 것 같다&lt;/li&gt;
&lt;li&gt;데이터를 바이너리 형식으로 저장하는 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Why TFRecord&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TPU의 성능은 매우 빠르므로, 그만큼 데이터 또한 빠르게 전달되어야 한다.&lt;/li&gt;
&lt;li&gt;Google Cloud Storage는 TPU에 데이터를 전달하고 쓸데없는 네트워크 절차를 없앨 수 있는 장점이 있다.&lt;/li&gt;
&lt;li&gt;따라서 수천 개의 개별 파일로 데이터를 저장하는 것보다 더 적은 수의 파일로 일괄 처리하고 tf.data.Dataset의 기능을 사용하여 여러 파일에서 병렬로 읽는 것이 이상적이다.&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;h2 data-ke-size=&quot;size26&quot;&gt;TFRecord Cheat sheet&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 cheat sheet는 &lt;a href=&quot;https://codelabs.developers.google.com/codelabs/keras-flowers-data#4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에서 가져왔습니다&lt;/p&gt;
&lt;pre id=&quot;code_1658539337878&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#TFRecord 파일 포맷
#텐서플로에서 데이터 저장을 위해 선호하는 방식은 protobuf기반 TFRecord
#다른 직렬화 방식도 사용할 수 있지만 아래와 같이 사용하면 바로 TFRecord 데이터세트로 로드 가능

filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(...) # do the TFRecord decoding here - see below


#조금 더 복잡하지만, 아래와 같이 작성하면 더 최적의 성능을 낼 수 있음(한번에 읽기)
#N개의 파일을 병렬로 읽고, 속도를 위해 순서는 생략함

AUTOTUNE = tf.data.AUTOTUNE
ignore_order = tf.data.Options()
ignore_order.experimental_deterministic = False

filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTOTUNE)
dataset = dataset.with_options(ignore_order)
dataset = dataset.map(...) # do the TFRecord decoding here - see below&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3개의 Data Type&lt;/h3&gt;
&lt;pre id=&quot;code_1658539711798&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Byte String 쓰기
def _bytestring_feature(list_of_bytestrings):
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
  
  
# Interger 쓰기
def _int_feature(list_of_ints): # int64
  return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))


# Floats 쓰기
def _float_feature(list_of_floats): # float32
  return tf.train.Feature(float_list=tf.train.FloatList(value=list_of_floats))


# 위 헬퍼 함수를 사용한 TFRecord 쓰기
# input data in my_img_bytes, my_class, my_height, my_width, my_floats
with tf.python_io.TFRecordWriter(filename) as out_file:
  feature = {
    &quot;image&quot;: _bytestring_feature([my_img_bytes]), # one image in the list
    &quot;class&quot;: _int_feature([my_class]),            # one class in the list
    &quot;size&quot;: _int_feature([my_height, my_width]),  # fixed length (2) list of ints
    &quot;float_data&quot;: _float_feature(my_floats)       # variable length  list of floats
  }
  tf_record = tf.train.Example(features=tf.train.Features(feature=feature))
  out_file.write(tf_record.SerializeToString())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TFRecords 읽기&lt;/h3&gt;
&lt;pre id=&quot;code_1658539824476&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def read_tfrecord(data):
  features = {
    # tf.string = byte string (not text string)
    &quot;image&quot;: tf.io.FixedLenFeature([], tf.string), # shape [] means scalar, here, a single byte string
    &quot;class&quot;: tf.io.FixedLenFeature([], tf.int64),  # shape [] means scalar, i.e. a single item
    &quot;size&quot;: tf.io.FixedLenFeature([2], tf.int64),  # two integers
    &quot;float_data&quot;: tf.io.VarLenFeature(tf.float32)  # a variable number of floats
  }

  # decode the TFRecord
  tf_record = tf.io.parse_single_example(data, features)

  # FixedLenFeature fields are now ready to use
  sz = tf_record['size']

  # Typical code for decoding compressed images
  image = tf.io.decode_jpeg(tf_record['image'], channels=3)

  # VarLenFeature fields require additional sparse.to_dense decoding
  float_data = tf.sparse.to_dense(tf_record['float_data'])

  return image, sz, float_data

# decoding a tf.data.TFRecordDataset
dataset = dataset.map(read_tfrecord)
# now a dataset of triplets (image, sz, float_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 스니펫&lt;/h3&gt;
&lt;pre id=&quot;code_1658539951809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# reading single data elements
tf.io.FixedLenFeature([], tf.string)   # for one byte string
tf.io.FixedLenFeature([], tf.int64)    # for one int
tf.io.FixedLenFeature([], tf.float32)  # for one float


# reading fixed size lists of elements
tf.io.FixedLenFeature([N], tf.string)   # list of N byte strings
tf.io.FixedLenFeature([N], tf.int64)    # list of N ints
tf.io.FixedLenFeature([N], tf.float32)  # list of N floats


# reading a variable number of data items
tf.io.VarLenFeature(tf.string)   # list of byte strings
tf.io.VarLenFeature(tf.int64)    # list of ints
tf.io.VarLenFeature(tf.float32)  # list of floats


# A VarLenFeature returns a sparse vector and an additional step is required after decoding the TFRecord
dense_data = tf.sparse.to_dense(tf_record['my_var_len_feature'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;캐글 노트북에 있는 예제&lt;/h2&gt;
&lt;figure id=&quot;og_1658540008983&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;Walkthrough: Building a Dataset of TFRecords&quot; data-og-description=&quot;Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/code/ryanholbrook/walkthrough-building-a-dataset-of-tfrecords/notebook&quot; data-og-url=&quot;https://www.kaggle.com/code/ryanholbrook/walkthrough-building-a-dataset-of-tfrecords/notebook&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/code/ryanholbrook/walkthrough-building-a-dataset-of-tfrecords/notebook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/code/ryanholbrook/walkthrough-building-a-dataset-of-tfrecords/notebook&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Walkthrough: Building a Dataset of TFRecords&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.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;pre id=&quot;code_1658540284850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
import pathlib
dataset_url = &quot;https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz&quot;
data_dir = tf.keras.utils.get_file(
    origin=dataset_url,
    fname='flower_photos',
    untar=True,
    cache_dir=&quot;..cache&quot;
)
data_dir = pathlib.Path(data_dir)

#Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
#228818944/228813984 [==============================] - 5s 0us/step
#228827136/228813984 [==============================] - 5s 0us/step

# PosixPath('/tmp/.keras/datasets/flower_photos')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658540342358&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from functools import partial
IMG_HEIGHT = 512
IMG_WIDTH = 512

load_split = partial(
    tf.keras.preprocessing.image_dataset_from_directory,
    data_dir,
    validation_split=0.2,
    shuffle=True,
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=1,
)

ds_train = load_split(subset='training')
ds_valid = load_split(subset='validation')
class_names = ds_train.class_names
print(class_names)



#Found 3670 files belonging to 5 classes.
#Using 2936 files for training.

#Found 3670 files belonging to 5 classes.
#Using 734 files for validation.
#['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;batch 되어있는 데이터셋을 풀고, map 을 통해 byte로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1658540369866&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.train import BytesList, FloatList, Int64List
from tensorflow.train import Example, Features, Feature

def process_image(image, label):
    image = tf.image.convert_image_dtype(image, dtype=tf.uint8)
    image = tf.io.encode_jpeg(image)
    return image, label

ds_train_encoded = (
    ds_train
    .unbatch()
    .map(process_image)
)

ds_valid_encoded = (
    ds_valid
    .unbatch()
    .map(process_image)
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tf.train.example 형태로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1658540558743&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def make_example(encoded_image, label):
    image_feature = Feature(
        bytes_list=BytesList(value=[
            encoded_image,
        ]),
    )
    label_feature = Feature(
        int64_list=Int64List(value=[
            label,
        ])
    )

    features = Features(feature={
        'image': image_feature,
        'label': label_feature,
    })
    
    example = Example(features=features)
    
    return example.SerializeToString()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658540631287&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!mkdir -p './kaggle/working/training'

NUM_SHARDS = 32
PATH = './kaggle/working/training/shard_{:02d}.tfrecord'

#샤드는 파일을 자르는 것으로 보면 됨
# 이후 record 파일로 작성

for shard in range(NUM_SHARDS):
    ds_shard = (
        ds_train_encoded
        .shard(NUM_SHARDS, shard)
        .as_numpy_iterator()
    )
    with tf.io.TFRecordWriter(path=PATH.format(shard)) as f:
        for encoded_image, label in ds_shard:
            example = make_example(encoded_image, label)
            f.write(example)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 TFRecord&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐글에서 자주 출몰하시는 그랜드 마스터의 TFRecord 데이터셋 만들기&lt;/p&gt;
&lt;figure id=&quot;og_1658543646140&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;How To Create TFRecords&quot; data-og-description=&quot;Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/code/cdeotte/how-to-create-tfrecords&quot; data-og-url=&quot;https://www.kaggle.com/code/cdeotte/how-to-create-tfrecords&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/code/cdeotte/how-to-create-tfrecords&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/code/cdeotte/how-to-create-tfrecords&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How To Create TFRecords&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실전 사용 예제&lt;/p&gt;
&lt;figure id=&quot;og_1658544296206&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;EfficientNetB7 on 100+ flowers&quot; data-og-description=&quot;Explore and run machine learning code with Kaggle Notebooks | Using data from Flower Classification with TPUs&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/code/mgornergoogle/efficientnetb7-on-100-flowers/notebook&quot; data-og-url=&quot;https://www.kaggle.com/code/mgornergoogle/efficientnetb7-on-100-flowers/notebook&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/code/mgornergoogle/efficientnetb7-on-100-flowers/notebook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/code/mgornergoogle/efficientnetb7-on-100-flowers/notebook&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;EfficientNetB7 on 100+ flowers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore and run machine learning code with Kaggle Notebooks | Using data from Flower Classification with TPUs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>23년 이전 글/tensorflow</category>
      <category>API</category>
      <category>cheetsheet</category>
      <category>dataset</category>
      <category>Example</category>
      <category>tensorflow</category>
      <category>TFRecord</category>
      <category>TPU</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/131</guid>
      <comments>https://okdone.tistory.com/131#entry131comment</comments>
      <pubDate>Sat, 23 Jul 2022 10:34:01 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 파일 접근 권한</title>
      <link>https://okdone.tistory.com/129</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;USER 접근 관련&lt;/h2&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;504&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5QJQQ/btrHDcZqQ8Q/ADiQwlUPhvnK6yPZ5Tz6u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5QJQQ/btrHDcZqQ8Q/ADiQwlUPhvnK6yPZ5Tz6u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5QJQQ/btrHDcZqQ8Q/ADiQwlUPhvnK6yPZ5Tz6u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5QJQQ%2FbtrHDcZqQ8Q%2FADiQwlUPhvnK6yPZ5Tz6u1%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;504&quot; height=&quot;274&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;93&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0XfHy/btrHDcE7kUV/K3tXcLhkLkyJ8k1ytf8xPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0XfHy/btrHDcE7kUV/K3tXcLhkLkyJ8k1ytf8xPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0XfHy/btrHDcE7kUV/K3tXcLhkLkyJ8k1ytf8xPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0XfHy%2FbtrHDcE7kUV%2FK3tXcLhkLkyJ8k1ytf8xPK%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;93&quot; height=&quot;246&quot; data-origin-width=&quot;93&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫자리는 파일의 종류 -는 일반파일, d는 디렉터리&lt;/li&gt;
&lt;li&gt;소유자(user)-그룹-기타사용자(others),&amp;nbsp; &amp;nbsp;U - G - O 에 따른 권한 부여&lt;/li&gt;
&lt;li&gt;rw-(파일을 읽고) rw-(쓰고) r--(실행) 할 수 있는 접근 권한, read, write, execute 3가지의 권한 종류가 있음&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBSo9E/btrHCX9gCDR/V78GvJTcLijKKtrcWETdNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBSo9E/btrHCX9gCDR/V78GvJTcLijKKtrcWETdNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBSo9E/btrHCX9gCDR/V78GvJTcLijKKtrcWETdNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBSo9E%2FbtrHCX9gCDR%2FV78GvJTcLijKKtrcWETdNK%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;114&quot; height=&quot;247&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 소유자의 로그인 ID, 파일 소유자의 그룹이름&lt;/li&gt;
&lt;li&gt;보통 그룹을 따로 지정하지 않으면, 자기 자신이 그룹이 됨&lt;/li&gt;
&lt;li&gt;groups [유저이름]&amp;nbsp; 명령어로 유저의 그룹을 검색할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 디렉터리 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp;읽기&amp;nbsp;r&amp;nbsp;:&amp;nbsp;파일&amp;nbsp;읽기,&amp;nbsp;복사 | ls&amp;nbsp;목록&amp;nbsp;확인 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 쓰기 w : 수정, 이동, 삭제 |&amp;nbsp; 삭제, 생성 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 실행 x : 셸스크립트, 실행&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp; &amp;nbsp;cd 명령 사용 가능 및 디렉터리 이동 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;권한 관련 명령어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;chmod(change mode)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 소유자와 시스템 관리자만 변경 가능함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자를 사용한 권한 변경&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chmod [사용자문자] [연산자기호] [접근권한] [파일명]&lt;/li&gt;
&lt;li&gt;사용자 문자 : 소유자(u), 그룹(g), 기타(o)&lt;/li&gt;
&lt;li&gt;연산자 기호 : 접근 권한 부여(+), 접근 권한 제거(-)&lt;/li&gt;
&lt;li&gt;접근권한 : r, w, x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0fjex/btrHEyUKMMB/ksUBUReJmRDC1FO1K6LhDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0fjex/btrHEyUKMMB/ksUBUReJmRDC1FO1K6LhDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0fjex/btrHEyUKMMB/ksUBUReJmRDC1FO1K6LhDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0fjex%2FbtrHEyUKMMB%2FksUBUReJmRDC1FO1K6LhDK%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;423&quot; height=&quot;34&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chmod u-w str.txt 명령어를 사용하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;18&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGR2L2/btrHCx3Ae71/8akJ3qg4VqJHkOxNKpQLKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGR2L2/btrHCx3Ae71/8akJ3qg4VqJHkOxNKpQLKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGR2L2/btrHCx3Ae71/8akJ3qg4VqJHkOxNKpQLKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGR2L2%2FbtrHCx3Ae71%2F8akJ3qg4VqJHkOxNKpQLKk%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;423&quot; height=&quot;18&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;18&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 권한에서, 쓰기 권한이 빠지게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소유자에 대한 알파벳&amp;nbsp; u, g, o 그리고 읽기, 쓰기, 실행에 대한 알파벳 r, w, x 을 연산자를 통해 표현가능&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chmod 777 [폴더명] : 폴더에서 유저,그룹,기타유저에게 읽기,쓰기,실행 권한을 부여&lt;/li&gt;
&lt;li&gt;chmod 666 [파일명] : 파일에서 유저,그룹,기타유저에게 읽기,쓰기,실행 권한을 부여, 파일에서는 기본적으로 실행에 대한 부분이 빠져있기 때문에 디렉터리와 다름&lt;/li&gt;
&lt;li&gt;rw-rw-r-- 의 기본은 664 권한이고, 이러한 기본 권한 설정은 umask를 사용해서 설정함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;umask&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bisepk/btrHHlgAv9Q/FoHPSWjrfnZz5EkdZkFYe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bisepk/btrHHlgAv9Q/FoHPSWjrfnZz5EkdZkFYe1/img.png&quot; data-alt=&quot;기본 umask&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bisepk/btrHHlgAv9Q/FoHPSWjrfnZz5EkdZkFYe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbisepk%2FbtrHHlgAv9Q%2FFoHPSWjrfnZz5EkdZkFYe1%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;244&quot; height=&quot;30&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 umask&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 666 권한에서 umask값을 빼면 기본 권한 설정을 구할 수 있음(뒤에서 3자리)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJFbR7/btrHC0j9993/Ujq6lb4wzxqGMDbFmN9Kn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJFbR7/btrHC0j9993/Ujq6lb4wzxqGMDbFmN9Kn0/img.png&quot; data-alt=&quot;umask 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJFbR7/btrHC0j9993/Ujq6lb4wzxqGMDbFmN9Kn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJFbR7%2FbtrHC0j9993%2FUjq6lb4wzxqGMDbFmN9Kn0%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;280&quot; height=&quot;49&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;umask 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;umask를 변경하면 파일 생성시 권한이 바뀐 것을 확인가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnRvs/btrHDAMAvYg/nCvZpnusIMjqd0jQyEipS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnRvs/btrHDAMAvYg/nCvZpnusIMjqd0jQyEipS1/img.png&quot; data-alt=&quot;변경된 기본 권한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnRvs/btrHDAMAvYg/nCvZpnusIMjqd0jQyEipS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnRvs%2FbtrHDAMAvYg%2FnCvZpnusIMjqd0jQyEipS1%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;416&quot; height=&quot;48&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변경된 기본 권한&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chmod 4xxx [파일명] : 반드시 슈퍼유저의 권한으로 사용하게끔 만드는 기능&lt;/li&gt;
&lt;li&gt;chmod 2xxx [파일명] : 그룹의 유저 권한아래 사용하게끔 권한을 부여&lt;/li&gt;
&lt;li&gt;chmod 1xxx [파일명] : 보충필요------&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;su&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;su - [유저명] : 해당 유저로 변경&lt;/li&gt;
&lt;li&gt;su만 사용할 경우, superuser가 default&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/shadow&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 내의 계정 정보가 있는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;useradd&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 계정을 생성&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-c : 사용자 이름 등 부가적인 설명 지정&lt;/li&gt;
&lt;li&gt;-d : 사용자 계정의 홈 디렉터리 지정&lt;/li&gt;
&lt;li&gt;-D : 기본 설정 값을 출력하거나 설정&lt;/li&gt;
&lt;li&gt;-e : 유효기간 설정 (YYYY-MM-DD)&lt;/li&gt;
&lt;li&gt;-g : 사용자 계정의 로그인 기본그룹 GID 지정&lt;/li&gt;
&lt;li&gt;-p : 사용자 계정의 패스워드&lt;/li&gt;
&lt;/ul&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;useradd test : test라는 사용자 생성&lt;/li&gt;
&lt;li&gt;useradd test -p [암호] : 생성시에 바로 암호 설정&lt;/li&gt;
&lt;li&gt;passwd test : test 사용자의 암호 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;usermod&lt;/h3&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;-d : 사용자 계정 디렉터리 수정&lt;/li&gt;
&lt;li&gt;-e : 사용자 홈 디렉터리 수정&lt;/li&gt;
&lt;li&gt;-l : 사용자 계정 이름 변경&lt;/li&gt;
&lt;li&gt;-u : 사용자 계정 UID 수정&lt;/li&gt;
&lt;li&gt;-g : 사용자 계정 GID 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;passwd&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 계정 암호 지정,&amp;nbsp; passwd [계정이름]&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;chage&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정된 계정 만료 일자에 대한 내용 출력&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;chage -E YYYY/MM/DD [계정명] : 계정 만료 설정&lt;/li&gt;
&lt;li&gt;chage -l [계정명] : 계정 만료에 대한 정보 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예 ) chage -l user_001&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HsEIV/btrHIGrxOa9/WCg67v3dK888giNZsGg38k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HsEIV/btrHIGrxOa9/WCg67v3dK888giNZsGg38k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HsEIV/btrHIGrxOa9/WCg67v3dK888giNZsGg38k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsEIV%2FbtrHIGrxOa9%2FWCg67v3dK888giNZsGg38k%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;696&quot; height=&quot;242&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;242&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;h3 data-ke-size=&quot;size23&quot;&gt;userdel&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 계정을 삭제. 계정을 삭제해도, 계정 파일 외에 다른 곳에 파일을 만든다면 계정이 삭제되어도 삭제되지 않음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-r : 디렉터리까지 모두 삭제&lt;/li&gt;
&lt;li&gt;-f : 강제로 삭제 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그룹 접근 관련&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;groupadd&lt;/h3&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;groupadd [그룹명]&lt;/li&gt;
&lt;li&gt;grep grouptest / etc/group 하면 생성한 그룹에 대한 정보를 볼 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;gpasswd&lt;/h3&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;gpasswd [그룹명]&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-a [그룹1] [그룹2] : 그룹1을 그룹2에 포함함 add&lt;/li&gt;
&lt;li&gt;-d [그룹1] [그룹2] : 그룹2에 있는 그룹1을 삭제 delete&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;newgrp&amp;nbsp;&lt;/h3&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;newgrp [그룹명]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;chown&lt;/h3&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;chown [옵션] [계정이름] [파일명 또는 디렉터리명] : 기존의 계정에서 계정이름으로 소유권을 넘김&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-R : 하위 디렉토리를 모두 포함하여 소유권과 그룹 소유권 변경&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;&amp;nbsp;&lt;/h3&gt;</description>
      <category>23년 이전 글/리눅스</category>
      <category>chmod</category>
      <category>root</category>
      <category>rwx</category>
      <category>su</category>
      <category>ugo</category>
      <category>권한</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/129</guid>
      <comments>https://okdone.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 19 Jul 2022 12:20:25 +0900</pubDate>
    </item>
    <item>
      <title>VI 에디터 사용 기초</title>
      <link>https://okdone.tistory.com/128</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFfZ5i/btrHHkIC2jE/L1l1MgZNWg2AZTu2QauOAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFfZ5i/btrHHkIC2jE/L1l1MgZNWg2AZTu2QauOAK/img.jpg&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://velog.io/@jds3567/vi-%EC%82%AC%EC%9A%A9%EB%B2%95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFfZ5i/btrHHkIC2jE/L1l1MgZNWg2AZTu2QauOAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFfZ5i%2FbtrHHkIC2jE%2FL1l1MgZNWg2AZTu2QauOAK%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;1280&quot; height=&quot;713&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://velog.io/@jds3567/vi-%EC%82%AC%EC%9A%A9%EB%B2%95&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모드 종류&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령모드 : 문자열 검색, 커서 이동 등을 수행&lt;/li&gt;
&lt;li&gt;입력모드 : 문자열 입력 및 상태 출력&amp;nbsp; - i : 현재 커서에서 입력, -a : 현재 커서에 다음칸부터 입력, -o 현재커서에서 다음 행에 입력&lt;/li&gt;
&lt;li&gt;라인모드(위 그림의 마지막행 모드), esc 누른 후 &quot; : &quot; + 편집, 검색, 저장 등의 기능을 제공함&lt;/li&gt;
&lt;li&gt;:q = 종료,&amp;nbsp; :q! = 강제종료(저장안함), :w = 저장, :wq! 강제 저장 후 에디터 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;간단 편집 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi [파일명]을 통해 파일 생성 후 에디터 on&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7eHM/btrHHkBSnWG/OmSjWqovcudts4kOw2pKd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7eHM/btrHHkBSnWG/OmSjWqovcudts4kOw2pKd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7eHM/btrHHkBSnWG/OmSjWqovcudts4kOw2pKd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7eHM%2FbtrHHkBSnWG%2FOmSjWqovcudts4kOw2pKd1%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;142&quot; height=&quot;32&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgmREz/btrHCZrW5jb/wOLiGHjbEKE94QYmdcEzXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgmREz/btrHCZrW5jb/wOLiGHjbEKE94QYmdcEzXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgmREz/btrHCZrW5jb/wOLiGHjbEKE94QYmdcEzXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgmREz%2FbtrHCZrW5jb%2FwOLiGHjbEKE94QYmdcEzXk%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;686&quot; height=&quot;130&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a 버튼을 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNvvNS/btrHxNy4RCo/FRk3fR4Pg0IPPdCEEQLBf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNvvNS/btrHxNy4RCo/FRk3fR4Pg0IPPdCEEQLBf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNvvNS/btrHxNy4RCo/FRk3fR4Pg0IPPdCEEQLBf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNvvNS%2FbtrHxNy4RCo%2FFRk3fR4Pg0IPPdCEEQLBf1%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;688&quot; height=&quot;47&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부터 키보드 누르면 입력 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G97dK/btrHHj32uBg/TKPeYT4xIYaekibvK9KTa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G97dK/btrHHj32uBg/TKPeYT4xIYaekibvK9KTa1/img.png&quot; data-alt=&quot;알파벳 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G97dK/btrHHj32uBg/TKPeYT4xIYaekibvK9KTa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG97dK%2FbtrHHj32uBg%2FTKPeYT4xIYaekibvK9KTa1%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;243&quot; height=&quot;60&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;60&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;입력이 끝나면 esc로 모드 전환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjNiaK/btrHuSAGtuc/XwLPeSWhpkM0ZEDkOz9fq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjNiaK/btrHuSAGtuc/XwLPeSWhpkM0ZEDkOz9fq0/img.png&quot; data-alt=&quot;끼워넣기가 사라짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjNiaK/btrHuSAGtuc/XwLPeSWhpkM0ZEDkOz9fq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjNiaK%2FbtrHuSAGtuc%2FXwLPeSWhpkM0ZEDkOz9fq0%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;692&quot; height=&quot;102&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;끼워넣기가 사라짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨아래에 타이핑이 쳐짐. 여기에 :wq 후 엔터를 치면 저장 후 종료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKXOwT/btrHCwXT4Z3/RaoPzsdw3kj2k5w6k3ipbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKXOwT/btrHCwXT4Z3/RaoPzsdw3kj2k5w6k3ipbK/img.png&quot; data-alt=&quot;저장 후 종료 명령어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKXOwT/btrHCwXT4Z3/RaoPzsdw3kj2k5w6k3ipbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKXOwT%2FbtrHCwXT4Z3%2FRaoPzsdw3kj2k5w6k3ipbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;401&quot; height=&quot;41&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;41&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;cat test123.txt 로 내용 입력 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sb6bQ/btrHDdjJt4e/DvpLMTJd7TDRQBw8rqgdbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sb6bQ/btrHDdjJt4e/DvpLMTJd7TDRQBw8rqgdbK/img.png&quot; data-alt=&quot;입력 내용 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sb6bQ/btrHDdjJt4e/DvpLMTJd7TDRQBw8rqgdbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSb6bQ%2FbtrHDdjJt4e%2FDvpLMTJd7TDRQBw8rqgdbK%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;301&quot; height=&quot;34&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;34&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라인모드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;set number&lt;/b&gt; : 줄마다 라인을 표시(끄고나면 초기화됨)&lt;/li&gt;
&lt;li&gt;.vimrc를 루트 폴더에 만든 후, set number를 지정하면 켤때마다 켜짐.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/[검색어]&lt;/b&gt; : 위에서 아래로 검색어 검색, n을 누르면 다음 단어로, N을 누르면 이전 단어로&lt;/li&gt;
&lt;li&gt;&lt;b&gt;?[검색어]&lt;/b&gt; : 아래에서 위로 검색어 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:s/찾을문자열/바꿀문자열&lt;/b&gt;&amp;nbsp;: 커서가 있는 행의 문자열1 값을 문자열2 값으로 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:%s/&lt;b&gt;찾을&lt;/b&gt;문자열/&lt;b&gt;바꿀&lt;/b&gt;문자열/g&lt;/b&gt; : 파일 전체에 모든 문자열1 값을 문자열2 값으로 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:%s/&lt;b&gt;찾을&lt;/b&gt;문자열/&lt;b&gt;바꿀&lt;/b&gt;문자열/i : &lt;/b&gt;ignore 옵션으로, 대소문자 구분을 하지 않고 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:%s/&lt;b&gt;찾을&lt;/b&gt;문자열/&lt;b&gt;바꿀&lt;/b&gt;문자열/c : &lt;/b&gt;check 옵션으로, 변경 여부를 시스템에서 물어봄&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:%s/\&amp;lt;찾을문자열\&amp;gt;/바꿀문자열 : &lt;/b&gt;&amp;nbsp;역슬래쉬와 꺽쇠 가로를 사용하면 정확한 단어에 한해서 변경가능&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;예) apple, pineapple의 경우, apple만 변경&lt;/li&gt;
&lt;li&gt;한줄복사 : yy,&amp;nbsp; 붙여넣기 : -p&lt;/li&gt;
&lt;li&gt;한줄삭제 : dd&lt;/li&gt;
&lt;li&gt;여러줄복사 : 숫자yy,&amp;nbsp; &amp;nbsp;여러줄삭제 : 숫자dd&amp;nbsp; ex) 5yy, -p&amp;nbsp; &amp;nbsp;4dd&lt;/li&gt;
&lt;li&gt;작업취소 : u&lt;/li&gt;
&lt;li&gt;단어사이 이동 :&amp;nbsp; 왼쪽 w,&amp;nbsp; 오른쪽 b&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>23년 이전 글/리눅스</category>
      <category>vi</category>
      <category>vim</category>
      <category>vim 명령어</category>
      <category>가이드</category>
      <category>모드</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/128</guid>
      <comments>https://okdone.tistory.com/128#entry128comment</comments>
      <pubDate>Tue, 19 Jul 2022 11:12:42 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 파일 시스템과 명령어</title>
      <link>https://okdone.tistory.com/127</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스크 기반 파일 시스템(Disk-Based File System)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MINIX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유닉스의 한 갈래인 미닉스에서 사용되던 파일시스템으로, 플로피 디스크 등 작은 크기의 저장소 장치로 사용되는 파일시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;EXT&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 초기 개발 시 리눅스에서 사용하기 위해 만들어진 확장파일시스템. 유닉스의 파일시스템인 UFS의 영향을 받음. 현재 ext2, ext3, ext4 버전 존재&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;XFS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS7, RHEL7 등 최신 리눅스 버전에서 기본으로 사용되는 파일 시스템&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;FAT&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 USB등 이동식 저장장치에 사용되고 있으며, 리눅스는 FAT, vFAT파일시스템을 지원&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;ISO9660&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISO 9660 표준에 따른 CD-ROM 파일시스템. 운영체제 및 플랫폼에 무관하게 사용 가능한 표준 방식&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;UDFS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDF는&amp;nbsp; ISO/IEC 13346 규격으로 개발되었으며, DVD 표준 파일시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일의 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1개 파일 생성을 위해 파일의 이름, I-NODE, Data block이 있어야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;I-Node(Index node)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일에 대한 정보를 가지고 있는 inode가 모여 있는 테이블로, inode는 각각 1개의 파일 또는 디렉토리에 대한 정보를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일의 종류 및 권한 종료&lt;/li&gt;
&lt;li&gt;추가해서 적기-------&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PVnpc/btrHCxV4Vu2/Hf3Ux2jKLIRSetnxY0vGE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PVnpc/btrHCxV4Vu2/Hf3Ux2jKLIRSetnxY0vGE0/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://tecoble.techcourse.co.kr/post/2021-10-18-linux-file-directory-system/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PVnpc/btrHCxV4Vu2/Hf3Ux2jKLIRSetnxY0vGE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPVnpc%2FbtrHCxV4Vu2%2FHf3Ux2jKLIRSetnxY0vGE0%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;747&quot; height=&quot;401&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://tecoble.techcourse.co.kr/post/2021-10-18-linux-file-directory-system/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;링크 파일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우의 바로가기와 같은 파일. 링크라는 개념을 도입 해, 여러개 이름이 하나의 I-node에 연결되도록 수행하여 실제 파일이나, 디렉터리 혹은 다른 링크를 가리킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일에는 하드링크와 심볼릭 링크가 존재하며, 링크 파일을 생성하기 위해서는 ln 명령을 사용&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;/h3&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;파일의 실제 I-node 정보를 공유하기 때문에 마치 동일한 파일이 여러곳에 존재하는 것처럼 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심볼릭 링크(또는 Soft Link)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통상 사용되는 링크 파일이 심볼릭 링크&lt;/li&gt;
&lt;li&gt;심볼릭 링크 파일을 삭제해도, 원본 파일 영향없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특수 파일&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스가 지원하는 파이프, 소켓, 주변장치를 의미&lt;/li&gt;
&lt;li&gt;운영체제의 C:, D:, E:등과 같은 의미&lt;/li&gt;
&lt;li&gt;리눅스 시스템에선 /dev/hda1 등으로 등장함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문서 파일과 이진 파일&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문서 파일&lt;/b&gt;은 &lt;b&gt;키보드로 입력 받은 값&lt;/b&gt;만을 가지고 있으며, &lt;b&gt;ASCII 문자&lt;/b&gt;로 구성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이진 파일&lt;/b&gt;은 문자가 아닌 데이터 파일이 들어 있으며, &lt;b&gt;기계어&lt;/b&gt;인 &lt;b&gt;0과 1&lt;/b&gt;의 값으로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디렉터리&lt;/h2&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;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 현재 사용하고 있는 디렉터리&lt;/li&gt;
&lt;li&gt;상대경로는 (.) 점으로 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;홈 디렉터리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 사용자에게 할당되는 디렉터리로 사용자 계정 처음 만들 때 지정&lt;/li&gt;
&lt;li&gt;홈 디렉터리의 표시는 틸드(~)를 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;절대 경로와 상대 경로&lt;/h2&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;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상대경로&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일, 디렉터리명 생성 규칙&lt;/h2&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;디렉터리 관련 명령어(출력, 생성, 삭제, 복사, 이동, 찾기)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ls&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls [경로] : 해당 디렉터리 경로의 파일, 폴더를 모두 보여준다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-a(all) : 숨겨진 파일까지 포함 모든 파일 리스트 출력&lt;/li&gt;
&lt;li&gt;-d : 지정 디렉터리 존재하는 파일과 디렉터리 정보 출력&lt;/li&gt;
&lt;li&gt;-n : 호스트네임 확인&lt;/li&gt;
&lt;li&gt;-i : 첫번째 열에 I-node 번호 출력&lt;/li&gt;
&lt;li&gt;-F [경로Optional] : 파일명 뒤에 /는 디렉터리 파일을, @는 심볼릭 링크를, 아무 표시가 없다면 일반 파일&lt;/li&gt;
&lt;li&gt;-l : 파일에 대한 권한, 그룹 등의 정보까지 표시(정렬)&lt;/li&gt;
&lt;li&gt;-r : reverse로 정렬함&lt;/li&gt;
&lt;li&gt;-R : 경로에 모든 폴더 내부 내용을 출력함&lt;/li&gt;
&lt;li&gt;[경로] : 파일의 존재 여부 체크 가능(찾기용으로 쓸 명령어는 아님)&lt;/li&gt;
&lt;li&gt;모든 옵션은 한번에 같이 쓸 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&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;/li&gt;
&lt;li&gt;d : 디렉터리 파일&lt;/li&gt;
&lt;li&gt;l : 심볼릭 링크 파일&lt;/li&gt;
&lt;li&gt;b : block 단위 read/write 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cd&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd [경로] : 해당 경로로 작업 디렉토리 변경(절대경로, 상대경로 모두 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 cd만 명령할 경우, 해당 계정의 루트 폴더로 이동한다&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;mkdir&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mkdir [디렉터리명] [디렉터리명] : 디렉터리를 생성함(갯수만큼 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-p [디렉터리명]: 특정 경로에 하위디렉터리 생성을 위해&amp;nbsp; 중간 디렉터리를 알아서 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;rmdir&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rmdir [디렉터리명] [디렉터리명] : 디렉터리를 지움(갯수만큼)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-p [디렉터리명] : 상위 디렉터리를 지울 시, 하위 디렉토리까지 모두 삭제함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;rm&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rm [파일] : 파일을 삭제할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rm -r [디렉터리] : 디렉터리를 삭제할 수 있으며, 하위폴더도 재귀적으로 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;touch&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;touch [이름] : 파일을 생성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-t(time) YYMMDDHHMM : 파일 생성 시각 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cp&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cp [원본파일경로] [복사할경로]&lt;/li&gt;
&lt;li&gt;cp [원본파일경로] [원본파일경로] ... [복사할경로] : 다중 항목을 한번에 복사도 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-i [원본파일경로] [복사할경로] : 복사할 파일명 또는 디렉터리명이 존재하면 덮어쓸건지 물어보게함&lt;/li&gt;
&lt;li&gt;-r : 디렉터리 복사할 때 사용&lt;/li&gt;
&lt;li&gt;-a : 원본파일 속성과 링크 정보 그대로 유지하며 복사&lt;/li&gt;
&lt;li&gt;-b : 원본파일의 백업본 생성&lt;/li&gt;
&lt;li&gt;-d : 원본파일이 심볼릭 링크된 파일의 경우, 그 자체까지 복사&lt;/li&gt;
&lt;li&gt;-f : 복사하고자 하는 파일 이름이 겹칠 경우 강제 복사&lt;/li&gt;
&lt;li&gt;-l : 하드 링크 형식으로 복사&lt;/li&gt;
&lt;li&gt;-p : 원본파일 경로가 지정되어 있으면 그대로 복사&lt;/li&gt;
&lt;li&gt;-r : 디렉터리안에 있는 모든 하위 디렉터리까지 복사&lt;/li&gt;
&lt;li&gt;-s : 심볼릭 링크 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;find&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;find [찾을디렉터리경로] [검색조건] [옵션] [동작]&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-name : 지정한 파일찾기(와일드카드 사용: '*','?','[]') 와일드카드 사용시 작은 따옴표 선언해서 파일이름 정확히 표현&lt;/li&gt;
&lt;li&gt;-type : 찾는 파일의 타입, b: 블록디바이스 파일, d: 디렉터리, f : 파일, l : 심볼릭링크&lt;/li&gt;
&lt;li&gt;-user : 지정한 사용자가 소유하고 있는 파일 찾기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) find / -type d -name 'h*'&amp;nbsp; : 루트폴더에서 이름이 h로 시작하는 디렉터리 찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예 find / -type f -name 'sshd' : 루트폴더에서 이름이 sshd인 파일 찾기&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;cat&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cat [파일경로] : 해당 경로의 파일을 읽고 출력한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-n : 줄마다 번호를 매겨서 출력이 됨&lt;/li&gt;
&lt;li&gt;명령어 구문 이후 | more 와 함께 사용하면 출력 정도를 제어할 수 있어, 확인하기 좋음(해당 명령어만의 옵션 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 ) cat /tmp/services | grep -n dhcp /tmp/services&amp;nbsp; &amp;nbsp; grep은(Global Regular Expression Print)&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;which&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;which [이름] : 해당 파일이나 폴더의 경로를 표시&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제) which pwd&amp;nbsp; &amp;nbsp;: pwd 명령어에 대한 파일 위치 표시&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;whereis&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;whereis [이름] : 해당 파일이나 디렉터리와 관련된 모든 파일 폴더를 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;man(manual)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;man [명령] : 해당 명령에 대한 메뉴얼 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mv(move)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mv [이동시킬파일또는디렉터리] [이동할디렉터리]&lt;/li&gt;
&lt;li&gt;mv [파일명] [다른파일명] 방법으로 사용시 파일 이름을 수정할 수도 있음&lt;/li&gt;
&lt;li&gt;기본적으로 이동시 같은파일명 있으면 overwrite됨&amp;nbsp; -i 옵션을 통해 overwrite 여부 확인가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ln(link)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ln [원본파일] [링크파일이름] : 하드링크된 파일 생성&lt;/li&gt;
&lt;li&gt;ln -s [원본파일] [링크파일이름] : 소프트링크된 파일 생성&lt;/li&gt;
&lt;li&gt;ls -lF를 사용해서 숫자 부분을 보면 하드링크 여부와 소프트링크 여부를 볼 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sriKc/btrHBAfAEQU/U342KypvQTfcOuQj39Stx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sriKc/btrHBAfAEQU/U342KypvQTfcOuQj39Stx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sriKc/btrHBAfAEQU/U342KypvQTfcOuQj39Stx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsriKc%2FbtrHBAfAEQU%2FU342KypvQTfcOuQj39Stx1%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;504&quot; height=&quot;62&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1은 소프트링크, 화살표 표시도 친절하게 나옴. 2는 하드링크.&amp;nbsp; ls -i를 적용하면 i-node 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckY9xo/btrHDAFDSUb/ZBs7sy1e3prNbN9n7qmB6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckY9xo/btrHDAFDSUb/ZBs7sy1e3prNbN9n7qmB6k/img.png&quot; data-alt=&quot;하드링크는 같고, 소프트링크는 I-node가 다름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckY9xo/btrHDAFDSUb/ZBs7sy1e3prNbN9n7qmB6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckY9xo%2FbtrHDAFDSUb%2FZBs7sy1e3prNbN9n7qmB6k%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;140&quot; height=&quot;62&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하드링크는 같고, 소프트링크는 I-node가 다름&lt;/figcaption&gt;
&lt;/figure&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;gedit&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gedit [파일명] : 메모장 파일을 생성&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;</description>
      <category>23년 이전 글/리눅스</category>
      <category>command</category>
      <category>리눅스</category>
      <category>명령어</category>
      <category>시스템</category>
      <category>심볼릭 링크</category>
      <category>파일</category>
      <author>NoPainNoPaper</author>
      <guid isPermaLink="true">https://okdone.tistory.com/127</guid>
      <comments>https://okdone.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 18 Jul 2022 15:07:13 +0900</pubDate>
    </item>
  </channel>
</rss>