<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>idle_idle.log</title>
        <link>https://velog.io/</link>
        <description>data</description>
        <lastBuildDate>Wed, 31 May 2023 05:01:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>idle_idle.log</title>
            <url>https://velog.velcdn.com/images/idle_idle/profile/e1d1044a-3727-4d3f-bd2c-05f2a9a84e8f/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. idle_idle.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/idle_idle" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[snowflake_BUILD[.local]_서울_20230531]]></title>
            <link>https://velog.io/@idle_idle/snowflakeBUILD.local</link>
            <guid>https://velog.io/@idle_idle/snowflakeBUILD.local</guid>
            <pubDate>Wed, 31 May 2023 05:01:10 GMT</pubDate>
            <description><![CDATA[<h2 id="핸즈온랩">핸즈온랩</h2>
<p>(데이터 파이프라인 구축하기)</p>
<h3 id="01staging-and-loading-data">01.Staging and Loading Data</h3>
<p>alter warehouse compute_wh set warehouse_size=&#39;Medium&#39;;
alter warehouse compute_wh set warehouse_size=&#39;x2large&#39;;</p>
<p>웨어하우스 크기가 클수록 적재 시간이 빨라져야한다.(흐음...테스트 시 더 느려짐)</p>
<h3 id="02stream-and-task">02.Stream and Task</h3>
<h4 id="스트림-오브젝트">스트림 오브젝트</h4>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/ec3950f2-978f-42a4-ad4c-b93542caaa45/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/373a8639-451e-4502-ab5e-d37f9d2da83d/image.png" alt=""></p>
<p>select system$task_dependents_enable(&#39;citibike.streamdata.t_capture_data_task&#39;);</p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/51c81a19-1401-47fe-a923-8eb651f5e5e7/image.png" alt=""></p>
<h3 id="03external-table-and-mview">03.External Table and Mview</h3>
<h3 id="04data-sharing">04.Data Sharing</h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/5a5318d5-7836-47c2-932d-d83256c8a3ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/2021847a-66ac-4814-92ce-6e52240238ff/image.png" alt=""></p>
<h3 id="05marketplace">05.Marketplace</h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/bb6be238-34b1-40da-8f6d-a799c6e088e6/image.png" alt=""></p>
<hr>
<h2 id="snowpark-streamlit">Snowpark, Streamlit</h2>
<h3 id="snowpark">Snowpark</h3>
<p>: Snowflake + Spark ?
: <a href="https://aimpointdigital.com/snowpark-for-python-vs-pyspark/">https://aimpointdigital.com/snowpark-for-python-vs-pyspark/</a></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/8b79c7aa-b08e-4031-8355-336a53b17ba4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/538aba5b-a28c-46df-b70f-f4117a4a6179/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/450b41c4-3035-4c0b-875c-0ff98fed03e6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/00312412-925c-4cac-8837-bcf074eb36e8/image.png" alt=""></p>
<h3 id="streamlit">Streamlit</h3>
<p><a href="https://gpt-recruit.com/">https://gpt-recruit.com/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SNOWFLAKE ASCENT_20230406]]></title>
            <link>https://velog.io/@idle_idle/SNOWFLAKE-ASCENT20230406</link>
            <guid>https://velog.io/@idle_idle/SNOWFLAKE-ASCENT20230406</guid>
            <pubDate>Thu, 06 Apr 2023 01:49:32 GMT</pubDate>
            <description><![CDATA[<h2 id="snowflake">Snowflake</h2>
<p>행사장 와이파이가 안되어 집에 간다...&gt;&lt;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 살펴보기]]></title>
            <link>https://velog.io/@idle_idle/PostgreSQL-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@idle_idle/PostgreSQL-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 10 Mar 2023 04:29:08 GMT</pubDate>
            <description><![CDATA[<p><a href="https://d2.naver.com/helloworld/227936">https://d2.naver.com/helloworld/227936</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(3)]]></title>
            <link>https://velog.io/@idle_idle/Python-%EA%B8%B0%EC%B4%883</link>
            <guid>https://velog.io/@idle_idle/Python-%EA%B8%B0%EC%B4%883</guid>
            <pubDate>Fri, 03 Mar 2023 02:15:25 GMT</pubDate>
            <description><![CDATA[<h3 id="while문">while문</h3>
<ul>
<li>특정 조건에서 반복해서 문장을 수행해야 할 경우 while문을 사용한다.</li>
<li>반복문이라고도 부른다.</li>
<li>조건문이 참인 동안에 while문 하위의 소스 코드들이 반복해서 수행된다.</li>
</ul>
<h3 id="while문-기본-구조">while문 기본 구조</h3>
<pre><code>#초기값 -&gt; 조건식 -&gt; 실행문 -&gt; 증감식

&lt;초기값&gt;
while &lt;조건문&gt;:
    &lt;수행할 문장1&gt;
    &lt;수행할 문장2&gt;
    &lt;수행할 문장3&gt;
    ...
    &lt;증감식&gt;</code></pre><pre><code>#예제(1)
i = 1

while i &lt;= 5:
    print(&#39;안녕하세요. 숫자 {} 입니다.&#39; .format(i))
    i += 1    


...    


#예제(2) - while문 break문 사용
i = 1

while i &lt;= 5:
    print(&#39;안녕하세요. 숫자 {} 입니다.&#39; .format(i))
    i += 1

    if i == 4:
        print(&#39;while 반복문을 나갑니다.&#39;)
        break


...    


#예제(3) - while 무한 반복문
while True:
    print(&quot;Ctrl+C를 눌러야 while문을 빠져나갈 수 있습니다.&quot;)


...    


#예제(4) - 실무 사용 예시: ETL 체크    
from pymssql import connect
import pandas as pd
import time

HOST = &#39;xxx.xxx.xx.xxx&#39;  # 서버IP주소
USER = &#39;usr_xxxxxx&#39;         # 접속계정
PASS = &#39;xxxxxxxxxx&#39;          # 접속패스워드
DB = &#39;xxxxx&#39;             # 연결DB명

try:
    while True:
        with connect(HOST, USER, PASS, DB) as sql:
            query = &quot;EXEC [DB명].[스키마명].[모듈명]&quot; #SP명

            chk_df = pd.read_sql(query, con=sql)

            if chk_df[&#39;rtrn&#39;][0] == 1:
                print(chk_df)
                print(&#39;성공!&#39;)
                break
            else:
                print(&#39;실패!&#39;)            
                time.sleep(6)
                pass

except KeyboardInterrupt:
    print(&#39;강제 중지&#39;)


...    


#예제(5) - 실무 사용 예시: 로그인 체크
userid = &#39;pythonuser&#39;
userpw = &#39;123456&#39;

print(&#39;&gt;&gt;&gt; 로그인 &lt;&lt;&lt;&#39;)

i = 1
count = 5 #로그인 시도 가능 횟수

while i &lt;= count:
    #입력 받기
    inputUserid = input(&#39;사용자: &#39;)
    inputUesrpw = input(&#39;비밀번호: &#39;)

    #입력 확인하기
    if userid == inputUserid and userpw == inputUesrpw:
        print(&#39;\n로그인 성공!&#39;)
        print(&#39;{}님 환영합니다.&#39;.format(userid))
        break
    else:
        print(&#39;\n로그인 실패!&#39;)

    i += 1 # 증감식 -&gt; 로그인 재시도        </code></pre><p>...</p>
<h3 id="for문">for문</h3>
<ul>
<li>while문과 비슷한 반복문</li>
<li>정해진 횟수만큼 반복한다.</li>
</ul>
<h3 id="for문-기본구조">for문 기본구조</h3>
<pre><code>for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...</code></pre><pre><code>#예제(1) - for문 리스트 활용
for i in [1,2,3,4,5]:
    print(i)   


...    


#예제(2) - for문 튜플 활용
for i in (1,2,3,4,5):
    print(i)   


...    


#예제(3) - for문 문자열 활용
for i in &quot;12345&quot;:
    print(i)

for i in &quot;강아지&quot;:
    print(i)   

##range()함수: range(시작값, 종료(앞)값, 간격)
##미자막 숫자는 제외된다는 사실!!!

for i in range(1,7):
    print(i)

for i in range(1,7,3):
    print(i)


...    


#예제(4) - for문 셋 활용
for i in {1,2,3,4,5}:
    print(i)   


...    


#예제(5) - for문 딕션너리 활용
dic = {&quot;a&quot;:1, &quot;b&quot;:2, &quot;c&quot;:3}

for i in dic:
    print(dic[i])


...    


#예제(6) - for문 구구단 구성
for h in range(2,10):
    print(&#39;{}단&#39;.format(h))
    for i in range(1,10):
        print(&#39;{} x {} = {}&#39;.format(h,i,h*i))
    print(&#39;\n&#39;)    </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(2)]]></title>
            <link>https://velog.io/@idle_idle/2.-Python-%EA%B8%B0%EC%B4%882</link>
            <guid>https://velog.io/@idle_idle/2.-Python-%EA%B8%B0%EC%B4%882</guid>
            <pubDate>Thu, 02 Feb 2023 10:07:24 GMT</pubDate>
            <description><![CDATA[<h3 id="조건문-종류">조건문 종류</h3>
<ul>
<li>단일 if문</li>
<li>if ~ else문</li>
<li>if ~ elif ~ else문</li>
</ul>
<p>...</p>
<h3 id="관계논리-연산자">관계/논리 연산자</h3>
<p>관계 연산자 다음 논리 연산자가 계산된다.</p>
<h4 id="관계-연산자">관계 연산자</h4>
<pre><code>&gt;
&gt;=
&lt;
&lt;=
==
!=
</code></pre><h4 id="논리-연산자">논리 연산자</h4>
<pre><code>and
or
not</code></pre><p>...</p>
<h3 id="단일-if문">단일 if문</h3>
<blockquote>
<p>사용법</p>
</blockquote>
<pre><code>if 조건문:
    소스코드</code></pre><blockquote>
<p>다양한 조건문</p>
</blockquote>
<pre><code>in, not in
list[], tuple(), 문자열</code></pre><blockquote>
<p>사용 예시</p>
</blockquote>
<pre><code>a = 1
if a == 1:
    print(&#39;if문 조건이 참입니다.&#39;)</code></pre><pre><code>a = 1
if a == 1:
    print(&#39;if문 조건이 참입니다.&#39;)</code></pre><pre><code>a = 2
b = 8
if a == 2 and b == 8:
    print(&#39;a는 2이며 b는 8입니다.&#39;)
if a == 2 or b == 99:
    print(&#39;a는 2이거나 b는 8입니다.&#39;)</code></pre><pre><code>st_list = [&#39;초롱이&#39;,&#39;밀키&#39;]
if &#39;초롱이&#39; in st_list:
    print(&#39;목록에 있습니다.&#39;)</code></pre><pre><code>msg = &#39;안녕하세요.&#39;
if &#39;안녕&#39; in msg:
    print(&#39;해당 단어가 포함되어 있습니다.&#39;)</code></pre><p>...</p>
<h3 id="if--else문">if ~ else문</h3>
<blockquote>
<p>사용법</p>
</blockquote>
<pre><code>if 조건문:
    소스코드    
else:
    소스코드</code></pre><blockquote>
<p>사용 예시</p>
</blockquote>
<pre><code>a = 10
if a == 2:
    print(&#39;a는 2와 같습니다.&#39;)    
else:
    print(&#39;a는 2와 같지 않습니다.&#39;)</code></pre><pre><code>num = &#39;숫자&#39;
if num.isdigit(): #isdigit는 정수형만 확인
    print(&#39;숫자입니다.&#39;)    
else:
    print(&#39;숫자가 아닙니다.&#39;)</code></pre><pre><code>num = 11
if num % 2 == 0:
    print(&#39;짝수&#39;)
else:
    print(&#39;홀수&#39;)</code></pre><pre><code>usrid = &#39;soyoung&#39;
usrpw = &#39;12345&#39;
...
inputid  = input(&#39;사용자:&#39;)
inputpw = input(&#39;비밀번호:&#39;)
...
if usrid == inputid and usrpw == inputpw:
    print(&#39;로그인 성공&#39;)
    print(f&#39;{usrid}님 환영합니다.&#39;)
    print(&#39;{}님 환영합니다.&#39; .format(usrid))    
else:
    print(&#39;로그인 실패&#39;) </code></pre><p>...</p>
<h3 id="if--elif--else문">if ~ elif ~ else문</h3>
<blockquote>
<p>사용법</p>
</blockquote>
<pre><code>if 조건문:
    소스코드    
elif 조건문:
    소스코드    
else:
    소스코드</code></pre><blockquote>
<p>사용 예시</p>
</blockquote>
<pre><code>num = 9
if num == 1:
    print(&#39;1입니다.&#39;)    
elif num == 2:
    print(&#39;2입니다.&#39;)    
elif num == 3:
    print(&#39;3입니다.&#39;)    
elif num == 4:
    print(&#39;4입니다.&#39;)    
else:
    print(&#39;모두 틀립니다.&#39;)</code></pre><pre><code>kor = input(&#39;국어 점수:&#39;)
eng = input(&#39;영어 점수:&#39;)
math = input(&#39;수학 점수:&#39;)
...
...
if not kor.isdigit(): #정수 여부 확인
    kor = 0 #0 처리
else:
    kor = int(kor) #형변환(문자-&gt;숫자)
...
...
if not eng.isdigit():
    eng = 0
else:
    eng = int(eng)
...
...    
if not math.isdigit():
    math = 0
else:
    math = int(math)
...
...
total = kor + eng + math
avg = total/3
...
...
if avg &gt;= 90 and avg &lt;= 100:
    grade = &#39;A&#39;
elif avg &gt;= 50 and avg &lt; 90:
    grade = &#39;B&#39;
else:
    grade = &#39;C&#39;
...
...     
print(f&#39;국어점수: {kor}\n&#39;
      f&#39;평균: {avg:.2f}\n&#39; #소수점 둘째 자리까지 출력
      f&#39;학점: {grade}&#39;)    
...
...
print(&#39;국어점수&#39; + str(kor) + &#39;\n&#39;) #숫자 -&gt; 문자로 형변환 필요</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[PostgreSQL 설치 및 기초 학습]]></title>
            <link>https://velog.io/@idle_idle/PostgreSQL-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EC%B4%88-%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@idle_idle/PostgreSQL-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EC%B4%88-%ED%95%99%EC%8A%B5</guid>
            <pubDate>Fri, 27 Jan 2023 01:32:59 GMT</pubDate>
            <description><![CDATA[<h3 id="참고자료">참고자료</h3>
<p><a href="https://dora-guide.com/postgresql-install/">https://dora-guide.com/postgresql-install/</a></p>
<h3 id="postgresql-설치-확인-방법">PostgreSQL 설치 확인 방법</h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/823b8f73-2cdd-4b60-9211-4285462d1288/image.png" alt=""></p>
<h3 id="pgadmin">pgAdmin</h3>
<ul>
<li>PostgreSQL Management Tools
<img src="https://velog.velcdn.com/images/idle_idle/post/c3a1088a-2932-47da-8b93-3b2f5a9f6313/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/ea6d1333-d0d8-4b10-94ee-dba41acc3f97/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/fda99e11-fa6e-4a98-ab42-5604624345ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/225c7f5a-9c53-43d8-b947-ef2047de335c/image.png" alt=""></p>
<h3 id="테이블-생성-및-입력">테이블 생성 및 입력</h3>
<pre><code>CREATE TABLE public.test_20230127
(
    id integer NOT NULL,
    col_character character(500),
    col_text text,
    col_json json,
    col_date date,
    col_timestamp timestamp without time zone,
    PRIMARY KEY (id)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.test_20230127
OWNER to postgres;


INSERT INTO public.test_20230127 VALUES(1, &#39;가나다라마바사&#39;, &#39;가나다라마바사&#39;, &#39;가나다라마바사&#39;, CURRENT_DATE, CURRENT_DATE);
/*
DETAIL:  잘못된 토큰: &quot;가나다라마바사&quot;
CONTEXT:  JSON 자료, 1 번째 줄: 가나다라마바사
*/

INSERT INTO public.test_20230127 VALUES
(1
 , &#39;가나다라마바사&#39;
 , &#39;가나다라마바사&#39;
 , &#39;{
      &quot;users&quot;: [
        {
          &quot;userId&quot;: 1,
          &quot;firstName&quot;: &quot;AAAAA&quot;,
          &quot;lastName&quot;: &quot;as23&quot;,
          &quot;phoneNumber&quot;: &quot;123456&quot;,
          &quot;emailAddress&quot;: &quot;AAAAA@test.com&quot;,
          &quot;homepage&quot;: &quot;https://amogg.tistory.com/1&quot;
        }
      ]
    }&#39;
 , CURRENT_DATE
 , CURRENT_DATE);
/*
INSERT 0 1
Query returned successfully in 38 msec.
*/

COMMIT;
/*
경고:  현재 트랜잭션 작업을 하지 않고 있습니다
COMMIT
Query returned successfully in 34 msec.
*/
/*
AutoCommit &quot;ON&quot;이 Default 설정인 것으로 확인됨.
*/</code></pre><p><img src="https://velog.velcdn.com/images/idle_idle/post/e34b0f12-a5c3-4a3f-888d-297e204494c4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 기초(1)]]></title>
            <link>https://velog.io/@idle_idle/Python-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@idle_idle/Python-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Wed, 21 Dec 2022 09:41:09 GMT</pubDate>
            <description><![CDATA[<h3 id="특징">특징</h3>
<ul>
<li>인터프리터</li>
<li>동적 타이핑</li>
<li>객체 지향 프로그래밍</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li>간결하고 쉬운 문법</li>
<li>다양한 라이브러리 제공(selenium, flask, pymssql 등)</li>
</ul>
<h3 id="설치-프로그램무료">설치 프로그램(무료)</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/e1b49f49-f09d-471c-bbdd-e3d1946fa16a/image.png" alt=""></p>
<ul>
<li>Miniconda: 가상 실행 환경(Python이 자동으로 같이 설치됨)</li>
<li>Pycharm: 개발 통합 환경(...)</li>
<li>Jupyter: 개발 통합 환경(cell 단위 실행 및 결과 확인)</li>
</ul>
<h3 id="colab">Colab</h3>
<ul>
<li>구글에서 제공하는 웹형 Python 개발 환경</li>
</ul>
<h3 id="miniconda">Miniconda</h3>
<ul>
<li>가상 실행 환경으로 base가 기본 가상환경</li>
<li>가상 실행 환경이 필요한 이유:
ex)  각각의 버전에 맞춰 개발 구현을 위한 가상 환경<ul>
<li>pandas: 1.0.0, numpy: 2.1.0, selenium: 1.3.4</li>
<li>pandas: 1.0.1, numpy: 1.1.1, tensorflow: 1.5.5</li>
</ul>
</li>
</ul>
<h3 id="jupyter">Jupyter</h3>
<p>Anaconda Prompt에서 jupyter 설치 방법</p>
<pre><code>  pip install jupyter notebook</code></pre><p>  Anaconda Prompt에서 jupyter 구동 방법</p>
<pre><code>  jupyter notebook</code></pre><p>  잘안된다면 pip 버전 업그레이드 후 재설치 필요</p>
<pre><code>  python -m pip install --upgrade pip</code></pre><h3 id="기초-문법">기초 문법</h3>
<pre><code>print(&#39;a&#39;) #a
print(&#39;a&#39;+&#39;b&#39;) #ab
print(&#39;a&#39;,&#39;b&#39;) #a b
print(&#39;a&#39;*10) #aaaaaaaaaa
print(&#39;a&#39;+1) #TypeError: must be str, not int

print(100+5) #105
print(100-5) #95
print(100/5) #20.0
print(100*5) #500
print(100**2) #10000
print(100%3) #1

print(&quot;&#39;hello world&#39;&quot;) #&#39;hello world&#39;
print(&#39;&quot;hello world&quot;&#39;) #&quot;hello world&quot;
print(&#39;he\&#39;s&#39;) #he&#39;s

print(len(&#39;ssssss&#39;)) #6


# \n 줄바꿈
# \t 탭

print(&#39;a \n b&#39;)
#a 
# b

-------------------------------------------------------------------------------

# 데이터 형식: 숫자형(정수/실수), 문자형 
# 데이터 데이터(자료)구조: 리스트, 딕셔너리, 튜플, 데이터프레임 

# 데이터 형식 확인 방법
type(1) #int
type(-0.02) #float

-------------------------------------------------------------------------------

# 변수.매쏘드
# 객체는 기능 + 구성요소
# 매쏘드는 객체에서 실행할 수 있는 기능

# count: 해당 문자가 문자열에 몇개 있는지 확인
# find: 문자 위치 찾기
# upper: 대문자로 변경
# lower: 소문자로 변경
# strip: 양쪽 공백 제거
# rstrip: 오른쪽 공백 제거
# lstrip: 왼쪽 공백 제거
# split : 구분자 기호로 문자 나누기

# len은 python에서 제공하는 순수 함수


a = &#39;asdfasdfasbbfasfd&#39;
a.count(&#39;b&#39;) #2

a = &#39;python is the best&#39;
a.find(&#39;b&#39;) #14

a = &#39;2022-02-16&#39;
a.split(&#39;-&#39;) #[&#39;2022&#39;, &#39;02&#39;, &#39;16&#39;]

-------------------------------------------------------------------------------

# 군집 자료형
## list[]: 순서O, 중복O, 수정O
## tuple(): 순서O, 중복O, 수정X ~ 속도가 빠르기에 Python Native 함수 내부에서 많이 사용
## dictionary{}: 순서X, 중복X, 수정O ~ {key: value, key2: value, ...}, 키 중복이 불가능하다.
## set{}: 순서X, 중복X, 수정O ~ 수학의 집합과 비슷한 개념

### 순서O란? 인덱스 기반 접근

-------------------------------------------------------------------------------

## list 리스트[]
a = []
print(a) #[]

a = [1,2,3]
print(a) #[1, 2, 3]

a = [[1,2,3], [&#39;a&#39;], &#39;B&#39;]
print(a) #[[1, 2, 3], [&#39;a&#39;], &#39;B&#39;]

a = [1,2,33]
b = [3,4,5]
c = [[&#39;cc&#39;,&#39;dd&#39;]]
print(a+b) #[1, 2, 33, 3, 4, 5]
print(a*3) #[1, 2, 33, 1, 2, 33, 1, 2, 33]
print(len(a)) #3
print(a+b+c) #[1, 2, 33, 3, 4, 5, [&#39;cc&#39;, &#39;dd&#39;]]

# 변수.매쏘드
# append: 리스트 요소 추가하기
# extend: 리스트 확장하기
# sort: 리스트 정렬하기 (숫자,알파벳은 가능하나, None은 정렬 불가능)
# reverse: 리스트 요소 뒤집기

a = [1,2,3]
a.append(4)
print(a) #[1, 2, 3, 4]

a = [1,2,3]
a.append([4,5])
print(a) #[1, 2, 3, [4, 5]]

a = [1,2,3]
a.extend([4,5])
print(a) #[1, 2, 3, 4, 5]

a = [10,1,2,3,4]
a.sort()
print(a.sort())#None

a = [10,1,2,3,4]
a.sort()
print(a) #[1, 2, 3, 4, 10]

a = [10,1,2,3,None]
a.sort() #TypeError: &#39;&lt;&#39; not supported between instances of &#39;NoneType&#39; and &#39;int&#39;

a = [10,1,2,3,[1,2]]
a.sort() #TypeError: &#39;&lt;&#39; not supported between instances of &#39;list&#39; and &#39;int&#39;

a = [1,2,3,&#39;z&#39;]
a.reverse()

a = [1,2,3,&#39;z&#39;]
print(a.reverse()) #None

a = [1,2,3,&#39;z&#39;]
a.reverse()
print(a) #[&#39;z&#39;, 3, 2, 1]


## 리스트 값 입력, 값 삭제, 값 카운트
a = [1,2,3,&#39;z&#39;]
print(a) #[1, 2, 3, &#39;z&#39;]

a.insert(0,&#39;A&#39;)
print(a) #[&#39;A&#39;, 1, 2, 3, &#39;z&#39;]

a.insert(1,&#39;z&#39;)
print(a) #[&#39;A&#39;, &#39;z&#39;, 1, 2, 3, &#39;z&#39;]

a.remove(&#39;z&#39;)
print(a) #[&#39;A&#39;, 1, 2, 3, &#39;z&#39;]

a.count(&#39;A&#39;) #1

-------------------------------------------------------------------------------

## tuple 튜플()
a = (1)
type(a) #int

a = (1,)
type(a) #tuple

a = 1,
type(a) #tuple

a = 1,2,&#39;aa&#39;,&#39;A&#39;
type(a) #tuple
print(a) #(1, 2, &#39;aa&#39;, &#39;A&#39;)

b = a + a
print(b) #(1, 2, &#39;aa&#39;, &#39;A&#39;, 1, 2, &#39;aa&#39;, &#39;A&#39;)

b = a * a #TypeError: can&#39;t multiply sequence by non-int of type &#39;tuple&#39;

a = 1,2,&#39;aa&#39;,&#39;A&#39;
b = a*3

print(b) #(1, 2, &#39;aa&#39;, &#39;A&#39;, 1, 2, &#39;aa&#39;, &#39;A&#39;, 1, 2, &#39;aa&#39;, &#39;A&#39;)
len(b) #12

-------------------------------------------------------------------------------

## dictionary 닥셔너리{}
dic = {&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93}
type(dic) # dict
print(dic) #{&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93}

dic = [{&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93}]
type(dic) #list
print(dic) #[{&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93}]

dic = {&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93}
print(dic[&#39;name&#39;]) #소영
type(print(dic[&#39;name&#39;])) #NoneType

dic[&#39;address&#39;] = &#39;마포구 상암동&#39;
print(dic) #{&#39;name&#39;: &#39;소영&#39;, &#39;age&#39;: 93, &#39;birth&#39;: 93, &#39;address&#39;: &#39;마포구 상암동&#39;}

del dic[&#39;age&#39;]
print(dic) #{&#39;name&#39;: &#39;소영&#39;, &#39;birth&#39;: 93, &#39;address&#39;: &#39;마포구 상암동&#39;}


# 딕셔너리{} 함수
# 변수.매쏘드
print(dic.keys()) #dict_keys([&#39;name&#39;, &#39;birth&#39;, &#39;address&#39;])
print(dic.values()) #dict_values([&#39;소영&#39;, 93, &#39;마포구 상암동&#39;])
print(dic.items()) #dict_items([(&#39;name&#39;, &#39;소영&#39;), (&#39;birth&#39;, 93), (&#39;address&#39;, &#39;마포구 상암동&#39;)])

-------------------------------------------------------------------------------

# Bool
## True 참
## False 거짓

1 == 1 #True
1 != 1 #False

# 자료형의 참과 거짓
a = &#39;python&#39;
b = &#39;&#39;
print(bool(a)) #True
print(bool(b)) #False

a = 1254
b = -1254
c = 0
print(bool(a)) #True
print(bool(b)) #True
print(bool(c)) #False
</code></pre><h3 id="참고자료">참고자료</h3>
<p><a href="https://velog.io/@yejin20/Python-%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90">https://velog.io/@yejin20/Python-%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</a></p>
<p><a href="https://artist-developer.tistory.com/22">https://artist-developer.tistory.com/22</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL Server New Feature 강의]]></title>
            <link>https://velog.io/@idle_idle/SQL-Server-%EA%B0%95%EC%9D%98</link>
            <guid>https://velog.io/@idle_idle/SQL-Server-%EA%B0%95%EC%9D%98</guid>
            <pubDate>Wed, 21 Dec 2022 05:04:50 GMT</pubDate>
            <description><![CDATA[<ul>
<li>이장래 강사님 (<a href="mailto:jangrae@gmail.com">jangrae@gmail.com</a>)</li>
<li>SQL Server Version: 2022 &lt;- 2019 &lt;- 2017 &lt;- 2016 &lt;- 2014 ...</li>
</ul>
<h3 id="1-최근에-추가된-또는-최신-함수들">1. 최근에 추가된 또는 최신 함수들</h3>
<ul>
<li>CONCAT: 구분자 사용 불가능</li>
<li>CONCAT_WS: 구분자 사용 가능 (2017+)</li>
<li>CONCAT은 데이터형식을 고민하지 않고 데이터를 합칠 수 있다.</li>
</ul>
<ul>
<li><p>CHOOSE: 나열된 값 중에서 지정한 위치의 값 반환 ... CHOOSE(NTILE(), , ,)</p>
</li>
<li><p>LTRIM, RTRIM, TRIM: 앞/뒤 공백 제거 -&gt; 앞/뒤 특정 문자 제거 (2022+)</p>
<blockquote>
<pre><code>TRIM(LEADING &#39;$# &#39; FROM @str1)
TRIM(TRAILING &#39;$# &#39; FROM @str1)
TRIM(BOTH &#39;$# &#39; FROM @str1)</code></pre></blockquote>
</li>
</ul>
<ul>
<li><p>TRY CONVERT: 변환 오류 시 NULL 반환</p>
</li>
<li><p>OFFSET ... FETCH: 몇번부터 몇번까지의 행을 불러오는 것 (ROW_NUMBER 보다 성능적으로도 우수)</p>
<blockquote>
<pre><code>OFFSET 5 ROWS
FETCH NEXT 5 ROWS ONLY
</code></pre></blockquote>
<p>5개 행을 건너뛰고 
5개 행을 가져와</p>
</li>
<li><p>GREATEST, LEAST: 행 단위에서 가장 큰 값, 가장 작은 값 반환 (2022+)</p>
</li>
<li><p>STRING_AGG: 문자열 집계 (2017+)</p>
</li>
<li><p>STRING_SPLIT: 구분자가 있는 문자열을 행으로 분리 (2016+)</p>
</li>
<li><p>STRING_SPLIT: Ordinal 옵션 기능 추가 (2022+)</p>
<blockquote>
<pre><code>FROM STRING_SPLIT(@STR, &#39;/&#39;, 1)</code></pre></blockquote>
</li>
<li><p>DATETRUNC: 지정한 위치까지 날짜와 시간 표시 (2022+)</p>
</li>
<li><p>IS DISTINCT FROM, IS NOT DISTINCT FROM: 상이한 값 또는 상이하지 않는 값 확인, 단 NULL을 포함하여 비교 가능 (2022+)</p>
<blockquote>
<pre><code>SELECT *
FROM #TABLE
WHERE COL1 IS DISTINCT FROM 50
</code></pre></blockquote>
<p>다음 구문과 동일한 의미
WHERE ISNULL(COL1,0) &lt;&gt; 50</p>
</li>
</ul>
<ul>
<li><p>WINDOWS: OVER절에서 창 함수가 적용되기 전 행 집합의 분할 및 순서 결정 (2022+)</p>
<blockquote>
<pre><code>SELECT *
     , RANK() OVER win AS col1
     , DENSE_RANK() OVER win AS col2
     , NTILE(3) OVER win AS col3
FROM #TABLE
WHERE 지역 = &#39;ANSAN&#39;
WINDOW win AS (PARTITION BY 성별 ORDER BY 포인트 DESC);</code></pre></blockquote>
</li>
<li><p>SELECT INTO ... ON: 파일그룹을 지정하여 저장</p>
<blockquote>
<pre><code>SELECT *
INTO TABLE2 ON FILEGROUP1
FROM TABLE1</code></pre></blockquote>
</li>
</ul>
<h3 id="2-스칼라-udf-인라인-처리-2019">2. 스칼라 UDF 인라인 처리 (2019+)</h3>
<ul>
<li>과거 버전에서 스칼라 사용자 정의 함수 사용 시 결과 Row 수 만큼 함수를 타게 된다.</li>
<li>2019년+ 버전 부터는 쿼리를 재해석하여 필요 테이블과 내부 조인 처리하여 스칼라 함수를 타게 해준다.</li>
<li>VIEW에서는 버전과 상관 없이 쿼리를 재해석하여 필요한 테이블만 타도록 처리해준다.</li>
</ul>
<h3 id="3-테이블-변수-지연-컴파일-2022">3. 테이블 변수 지연 컴파일 (2022+)</h3>
<ul>
<li>과거 버전에서 테이블 변수(@table)는 테이블 통계 관리가 되지 않는다. 제대로된 실행 계획을 타지 않는다.</li>
<li>2022년+ 버전 부터는 테이블 변수의 통계가 관리되고 정상 실행 계획을 탄다. (임시 테이블 동작과 동일해짐)</li>
</ul>
<h3 id="4-향상된-인덱스-작업-2019">4. 향상된 인덱스 작업 (2019+)</h3>
<ul>
<li>다시 시작 가능한 인덱스 REBUILD 작업 (RESUMABLE = ON)</li>
<li>단, Enterprise Edition에서 사용 가능 (ONLINE = ON, RESUMABLE = ON)</li>
<li>WAIT_AT_LOW_PRIORITY 옵션</li>
</ul>
<h3 id="5-설치-화면-변경-2022">5. 설치 화면 변경 (2022+)</h3>
<ul>
<li>데이터베이스 엔진 구성: MaxDOP, 메모리</li>
<li>MaxDOP: 최대 병렬 처리 수준 정의</li>
</ul>
<h3 id="6-polybase를-사용한-데이터-가상화">6. PolyBase를 사용한 데이터 가상화</h3>
<h3 id="7-가속-데이터베이스-복구-프로세스-adr">7. 가속 데이터베이스 복구 프로세스 (ADR)</h3>
<ul>
<li>SET ACCELERATED_DATABASE_RECOVERY = ON</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[GraphDB Neo4j 모델링]]></title>
            <link>https://velog.io/@idle_idle/GraphDB-Neo4j-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@idle_idle/GraphDB-Neo4j-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Thu, 15 Dec 2022 05:01:39 GMT</pubDate>
            <description><![CDATA[<h2 id="올바른-graphdb-모델링">올바른 GraphDB 모델링</h2>
<blockquote>
</blockquote>
<h4 id="1-먼저-query를-생각한다">1. 먼저 query를 생각한다.</h4>
<p>사용자는 데이터로부터 무엇을 알고싶은지 &#39;유저 스토리&#39;를 기반으로 시작
예를들어, &quot;내가 일하는 회사의 직원 중 누가 나와 비슷한 기술을 갖고 있고, 지식을 교환할 수 있는지 알고 싶다&quot;</p>
<blockquote>
</blockquote>
<h4 id="2-사용-사례를-이용해-관계-정렬하기">2. 사용 사례를 이용해 관계 정렬하기</h4>
<p>질의 기능을 모델링하고 질의가 모델을 결정할 수 있는 방법으로 다양한 사용사례(use cases)에 대해 노드 간에 가질 수 있는 서로 다른 관계 유형을 사용한다.
서로 다른 사용 사례에 대하여 2개의 동일한 노드 사이에 복수의 관계를 사용할 수 있다.
특정 사용 사례를 위하여 두 노드 사이에 특정 관계를 사용하는 것이 모델을 추가시 발생하는 복잡성에 비해 비용이 낮다.</p>
<blockquote>
</blockquote>
<h4 id="3-다항-관계-찾기">3. 다항 관계 찾기</h4>
<p>다항 관계는 특정 개념을 자연스럽고 편리하게 표현하기 위해 하나의 개념을 하나 이상의 개념에 관계를 연결한다.</p>
<blockquote>
</blockquote>
<h4 id="4-세밀한-노드-세밀한-패턴--granulate-pattern">4. 세밀한 노드 (세밀한 패턴 = granulate pattern)</h4>
<p>그래프 모델에서는 적은 수의 속성을 가지고 있는 얇은 노드와 관계를 생성한다. 즉, 노드와 관계는 매우 잘게 쪼개져있고 세분화돼있다.</p>
<blockquote>
</blockquote>
<p>*비교 : 관계형 모델에서는 데이터베이스 정규화를 사용하여 세분화한다.
관계형 모델은 질의시 테이블 조인이 발생하고, 조인 연산에 비용이 많이든다. 따라서 비정규화 하려는 경향이 있는데, 비정규화 하게되면 데이터 중복문제 발생</p>
<blockquote>
</blockquote>
<ul>
<li>모델링 하다보면 속성 자체가 노드가 돼야하나? 속성으로 모델링 해야하나? 고민하게 된다.<blockquote>
</blockquote>
이때는 다음과 같이 접근하면된다.</li>
<li>해당 속성이 그래프 탐색 중에 평가할 필요가 없다면, 노드 속성으로 유지하자. 모델을 좀 더 단순하게 유지할 수 있다.</li>
<li>그래프 탐색 중에 해당 속성을 평가 해야한다면, 해당 브랜드를 자신의 노드 범주로 분리하는 것이 있다. 노드를 탐색하는 것이 종종 모든경로에서 각 노드의 속성을 평가하는 것보다 쉽고 빠르다.<blockquote>
</blockquote>
<h4 id="5-필요한-경우-그래프의-색인-기능-사용하기">5. 필요한 경우 그래프의 색인 기능 사용하기</h4>
추가) property vs relationship</li>
</ul>
<h2 id="올바르지-못한-graphdb-모델링">올바르지 못한 GraphDB 모델링</h2>
<blockquote>
</blockquote>
<h4 id="1-풍부한-속성-사용하기">1. 풍부한 속성 사용하기</h4>
<p>속성을 별도의 노드로 분할한 다음 관계를 사용해 연결하면 훨씬 효율적으로 해결 가능하다.</p>
<blockquote>
</blockquote>
<h4 id="2-여러-가지-개념을-나타내는-노드">2. 여러 가지 개념을 나타내는 노드</h4>
<blockquote>
</blockquote>
<h4 id="3-연결되지-않은-그래프">3. 연결되지 않은 그래프</h4>
<blockquote>
</blockquote>
<h4 id="4-고밀집-노드-패턴">4. 고밀집 노드 패턴</h4>
<p>그래프 순회에서 문제가 생기는 것은 그래프의 일부가 모두 같은 노드에 연결되는 고밀집 노드 또는 슈퍼노드다.   </p>
<blockquote>
</blockquote>
<p>그래프 순회 관점에서 봤을때 많은 관계를 갖고있는 슈퍼 노드는 다음 단계가 무엇인지를 결정하기 위해 그 노드에 연결된 모든 관계를 순서대로 평가해야 하기 때문에 문제가 될 수 있다.</p>
<blockquote>
</blockquote>
<p>-&gt; fan-out패턴을 적용하여 구성한다. 즉 직접 연결하는 대신 메타노드에 연결한다. 메타 노드는 상호 연결되고 최종적으로 실제 노드와 연결된다.
ex) 아티스트 마돈나에게 fan들이 좋아요를 100개를 연결하는 상황을 모델링해보면 직접 연결하는 대신 메타 노드를 사용하여 연결할 수 있다.</p>
<h2 id="graphdb-모델링-순서-및-예시">GraphDB 모델링 순서 및 예시</h2>
<blockquote>
</blockquote>
<p><em>Graph Data Model = Whiteboard-Friendly</em></p>
<h4 id="1-matrix---whiteboard-model">1. Matrix - whiteboard model</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/1efa4ce9-3290-41eb-af9b-1a710ba7967a/image.png" alt=""></p>
</blockquote>
<h4 id="2-matrix---match-node-and-relationship-format-of-property-graph-model">2. Matrix - match node and relationship format of property graph model</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/16960907-0696-4b16-b544-87a638b181a2/image.png" alt=""></p>
</blockquote>
<h4 id="3-matrix---add-labels-and-properties">3. Matrix - add labels and properties</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/3eeca212-66fc-4a17-9e81-0d31c71bece8/image.png" alt=""></p>
</blockquote>
<h4 id="4-matrix---final-model-in-neo4j">4. Matrix - final model in Neo4j</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/bd82612c-0e2d-4238-ad63-b3076c8d44c5/image.png" alt="">
Describing a Domain
To better understand the process of designing a graph data model, let us take an example domain for a small set of data and walk through each step of how to create a graph data model from it.
Consider the following scenario describing our example data entities and connections.
-&gt; Scenario: Two people, Sally and John, are friends. Both John and Sally have read the book, Graph Databases.</p>
</blockquote>
<p>Defining Nodes
You can often find nodes for the graph model by identifying nouns in your domain. Entities such as a car, a person, a customer, a company, an asset, and others similar can be defined as nodes for a good starting point.
-&gt; Scenario: Two people, Sally and John, are friends. Both John and Sally have read the book, Graph Databases.</p>
<blockquote>
</blockquote>
<p>Extracting the nodes:</p>
<ul>
<li>John</li>
<li>Sally</li>
<li>Graph Databases<blockquote>
</blockquote>
Remember that a graph database takes each instance of an entity as a separate node (John and Sally would be two separate nodes, even though they are both people), and Graph Databases would be a separate node from another book.<blockquote>
</blockquote>
Defining Labels</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[GraphDB Neo4j 기본 데이터 구조]]></title>
            <link>https://velog.io/@idle_idle/GraphDB-Neo4j-%EA%B8%B0%EB%B3%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@idle_idle/GraphDB-Neo4j-%EA%B8%B0%EB%B3%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Thu, 15 Dec 2022 04:33:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/idle_idle/post/41b7359a-59f1-4bb5-bec7-2a8005a02491/image.png" alt="">
<img src="https://velog.velcdn.com/images/idle_idle/post/0c108217-486a-47d7-a490-5d45b8ef0eec/image.png" alt="">
<img src="https://velog.velcdn.com/images/idle_idle/post/2a0b9768-7985-421f-ba24-ca2d594e7483/image.png" alt=""></p>
<h2 id="node">Node</h2>
<ul>
<li>개체 정보를 저장하는데 사용된다.</li>
</ul>
<h2 id="relationship">Relationship</h2>
<ul>
<li>관계는 노드를 명시적으로 연결하는데 사용한다.</li>
<li>구성 : 유형, 시작노드, 종료노드, 방향</li>
<li>관계형 데이터베이스에서 미리 계산된 조인과 유사하다.</li>
</ul>
<h4 id="관계는-항상-방향이-있다">관계는 항상 방향이 있다</h4>
<h4 id="관계는-항상-유형이-있다">관계는 항상 유형이 있다</h4>
<h4 id="관계는-데이터의-패턴을-형성한다">관계는 데이터의 패턴을 형성한다.</h4>
<p>조인은 그래프DB에서 더 이상 시간이 소요되는 쿼리 작업이아니다.
두 노드 사이를 연결할 수 있다면 방향성을 가지고 있다.
즉, 순방향과 역방향 순회 모두 가능하다.
관계는 Type을 가질 수 있으며 시작 노드(start node)와 종료 노드(end node)를 가지고 있다.
이때 &#39;No broken links&#39;가 있는데 시작 노드만 존재하거나 종료 노드만 존재하고 관계는 존재하지 않는다는 의미이다.
관계를 삭제하지 않은 채 노드를 삭제할 수 는 없다.
관계도 (키-값)쌍으로 구성된 속성을 가진다.
두 노드 사이에 여러 개의 관계를 가질 수 있다.</p>
<h2 id="property">Property</h2>
<ul>
<li>노드와 관계 모두 속성을 담고 있는 컨테이너다. 이름/값 쌍으로 되어있다.</li>
<li>노드는 하나 이상의 필드 또는 속성을 가질수 있다.</li>
<li>관계 역시 속성을 가진다.</li>
</ul>
<h2 id="label">Label</h2>
<ul>
<li>레이블은 노드를 분류하는 방법으로, 하위 그래프를 신속하고 효율적으로 작성할 수 있다.</li>
<li>노드당 여러개의 레이블 설정가능</li>
<li>관계는 단 하나의 레이블 가진다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네트워킹_Public vs. Private]]></title>
            <link>https://velog.io/@idle_idle/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9Public-vs.-Private</link>
            <guid>https://velog.io/@idle_idle/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9Public-vs.-Private</guid>
            <pubDate>Mon, 12 Dec 2022 06:58:02 GMT</pubDate>
            <description><![CDATA[<p><em>잘모르는 부분을 일단 끄적여본다.</em></p>
<p><a href="https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm">https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm</a>
<a href="https://www.avg.com/en/signal/public-vs-private-ip-address">https://www.avg.com/en/signal/public-vs-private-ip-address</a>
<a href="https://yoonix.tistory.com/11">https://yoonix.tistory.com/11</a>
<a href="https://dontbesatisfied.tistory.com/13">https://dontbesatisfied.tistory.com/13</a></p>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/87a5f6ad-ee47-4565-af7b-79918542e6d3/image.png" alt=""></p>
<h2 id="vcn">VCN</h2>
<ul>
<li>OCI(Oracle Cloud Infrastructure)에서 제공하는 Virtual Cloud Network(가상 클라우드 네트워크)</li>
<li>사용자 정의가 가능한 전용 클라우드 네트워크 제공</li>
<li>가상의 클라우드 네트워킹 서브넷, 라우팅, 방화벽, 기본 IPsec VPN 등</li>
</ul>
<h2 id="subnet">Subnet</h2>
<ul>
<li>하나의 IP 네트워크 주소를 지역적으로 나누어 여러 개의 서로 연결된 지역 네트워크로 사용할 수 있도록 하는 방법</li>
<li>즉, 네트워크의 논리적인 분할</li>
<li>네트워크를 운영 중인 서비스의 규모에 맞게 분할하여 사용하기 위한 기술로, 낭비되는 IP주소 자원을 최소화하려는 것이 주된 목적</li>
<li>브로드캐스팅을 사용할 때 네트워크의 규모를 줄여서 브로드캐스팅으로 인한 부하를 줄일 수 있음</li>
</ul>
<h2 id="public-subnetip">Public Subnet/IP</h2>
<ul>
<li>외부에서 접근이 가능한 네트워크 영역</li>
<li>외부에서 접근할 때 항상 Internet Gateway를 거쳐서 접근하게 됨</li>
<li>해당 Subnet은 인터넷과 연결이 가능하므로 해당 Subnet에 위치한 리소스들은 공인 IP(Public IP)를 가질 수 있음</li>
</ul>
<h2 id="private-subnetip">Private Subnet/IP</h2>
<ul>
<li>외부에서 다이렉트로 접근이 불가능한 네트워크 영역</li>
<li>해당 Subnet에 위치한 리소스들은 외부와의 연결이 불가능함</li>
<li>인터넷 연결이 필요하다면 NAT Gateway를 이용하여 접근 가능, 단 내부에서 외부로만 접근이 가능함</li>
<li>Private Subnet을 사용하는 이유는 엄격하게 다뤄야할 리소스들을 안전하게 관리하기 위함</li>
<li>초기 환경 구축을 위해 로컬에서 접속을 한다면 접속이 불가능함, 외부에서 다이렉트로 접속할 공인 IP(Public IP)가 할당이 안되어 있기 때문 ~ SSH 터널링 방법을 사용하여 같은 VCN에 있는 Public Subnet을 통해 접속할 수 있음</li>
</ul>
<h2 id="public-server">Public Server</h2>
<h2 id="private-server">Private Server</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL Server 2022_데이터베이스 백업 및 복원]]></title>
            <link>https://velog.io/@idle_idle/SQL-Server-2022%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EC%9B%90</link>
            <guid>https://velog.io/@idle_idle/SQL-Server-2022%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EC%9B%90</guid>
            <pubDate>Thu, 17 Nov 2022 02:23:19 GMT</pubDate>
            <description><![CDATA[<p>참고자료: <a href="https://learn.microsoft.com/ko-kr/sql/relational-databases/backup-restore/back-up-and-restore-of-sql-server-databases?view=sql-server-ver16">https://learn.microsoft.com/ko-kr/sql/relational-databases/backup-restore/back-up-and-restore-of-sql-server-databases?view=sql-server-ver16</a></p>
<h2 id="백업-이유">[백업 이유]</h2>
<ul>
<li>백업은 데이터를 보호하는 유일한 방법</li>
<li>서버 간 DB 복사, Always On 가용성 그룹, DB 미러링 설정, 보관 등 데이터베이스를 관리하는 용도로도 유용하게 사용</li>
</ul>
<h2 id="백업-용어-설명">[백업 용어 설명]</h2>
<p><strong>- 백업(하다):</strong> Back Up, 데이터 레코드를 복사하거나 트랜잭션 로그에서 레코드를 기록하여 백업(본)을 만드는 프로세스</p>
<p><strong>- 백업(본):</strong> Backup, 오류가 발생한 후에 데이터를 복원/복구하는데 사용할 수 있는 데이터 복사본으로 데이터베이스 백업을 통해 새 위치에 복원할 수도 있음</p>
<p><strong>- 백업 디바이스:</strong> Backup Device, 백업이 기록되는 대상이자 복원하는 원본이 되는 디스크 또는 테이프 디바이스</p>
<p><strong>- 백업 미디어:</strong> Backup Media, (하나 이상의) 백업이 기록된 (하나 이상의) 테이프 또는 디스크 파일</p>
<p><strong>- 데이터 백업:</strong> Data Backup, 전체 데이터베이스 백업, 부분 데이터베이스 백업 또는 데이터 파일 집합이나 파일 그룹 등의 데이터 백업</p>
<p><strong>- 데이터베이스 백업:</strong> Databaase Backup, 데이터베이스 백업만 의미함 - &#39;전체 데이터베이스 백업&#39;은 백업이 완료된 시점의 전체 데이터베이스를 나타내고, &#39;차등 데이터베이스 백업&#39;은 가장 최근의 전체 데이터베이스 백업 이후에 데이터베이스에 수행된 변경 내용만 포함함</p>
<p><strong>- 차등 백업:</strong> Differential Backup, 최신 전체 백업을 기반으로 해당 기준 이후에 변경된 데이터만 포함하는 데이터 백업</p>
<p><strong>- 전체 백업:</strong> Full Backup, 모든 데이터와 해당 데이터를 복구할 수 있을 만큼의 로그를 포함하는 데이터 백업</p>
<p><strong>- 로그 백업:</strong> Log Backup, 이전 로그 백업에서 백업되지 않은 모든 로그 레코드를 포함하는 트랜잭션 로그 백업(-&gt; 전체 복구 모델인 경우)</p>
<p><strong>- 복구(하다):</strong> Recover, 데이터베이스를 안정적이고 일관된 상태로 되돌리는 것</p>
<p><strong>- 복구(본):</strong> Recovery,</p>
<p><strong>- 복구 모델:</strong> Recovery Model,</p>
<p><strong>- 복원:</strong> Restore,</p>
<p>작성 중~~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL Server 2022_비즈니스 연속성 및 데이터베이스 복구]]></title>
            <link>https://velog.io/@idle_idle/SQL-Server-2022%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%97%B0%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@idle_idle/SQL-Server-2022%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%97%B0%EC%86%8D%EC%84%B1</guid>
            <pubDate>Tue, 15 Nov 2022 05:49:52 GMT</pubDate>
            <description><![CDATA[<p>참고자료: <a href="https://learn.microsoft.com/ko-kr/sql/database-engine/sql-server-business-continuity-dr?view=sql-server-ver16">https://learn.microsoft.com/ko-kr/sql/database-engine/sql-server-business-continuity-dr?view=sql-server-ver16</a></p>
<ul>
<li>SQL Server의 고가용성 및 재해 복구를 위한 비즈니스 연속성 필요</li>
<li>비즈니스 연속성의 목표는 중단을 최소화하거나 중단 없이 비즈니스를 계속 운영하는 것</li>
<li>가용성 기능을 사용할 수 있는 주요 방법
   1) 고가용성(HA)
   2) 재해 복구
   3) 마이그레이션 및 업그레이드
   4) 하나 이상의 데이터베이스에서 읽을 수 있는 복사본 확장</li>
<li>SQL Server 복제는 가용성 기능으로 공식 지정되지는 않았지만 특정 시나리오에서 데이터 중복을 위해 종종 사용됨</li>
</ul>
<h2 id="고가용성">[고가용성]</h2>
<ul>
<li>클라우드 지역의 데이터 센터 또는 단일 지역에 국한된 문제가 발생하는 경우 SQL Server 인스턴스 또는 데이터베이스를 사용할 수 있도록 하는 것</li>
</ul>
<h3 id="--always-on-가용성-그룹"><strong>- Always On 가용성 그룹</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/d85d2b72-c455-497a-b473-634f005dafe0/image.png" alt=""></p>
<blockquote>
<ul>
<li>데이터베이스의 각 트랜잭션을 &quot;Replica&quot;라고 하는 다른 인스턴스로 보내 데이터베이스 수준의 보호를 제공함</li>
</ul>
</blockquote>
<ul>
<li>SE 또는 EE 버전에서 배포할 수 있으며, 인스턴스는 독립 실행형이거나 Always On FCI 일 수 있음</li>
<li>트랜잭션이 발생하면 replica로 전송되기 때문에 복구 지점 및 복구 시간 목표를 낮추기 위한 요구 사항이 있는 경우 가용성 그룹(AG)을 사용하는 것이 좋음</li>
<li>replica 간의 데이터 이동은 동기식/비동기식이며, EE에서는 동기식으로 최대 3개의 replica가 허용됨</li>
<li>AG에는 primary replica에 있는 데이터베이스의 전체 읽기/쓰기 복사본이 하나 있고, 모든 secondary replica는 최종 사용자/애플리케이션에서 직접 트랜잭션을 수신할 수 없음</li>
<li>인스턴스 수준이 아닌 데이터베이스 수준의 보호만 제공됨 - (예시)인스턴스 수준의 로그인, 연결된 서버 및 SQL Server 에이전트 작업은 수동으로 동기화해야 함</li>
<li>AG에는 Listener라는 구성요소가 있어서 primary replica를 호스팅하는 인스턴스를 몰라도 연결이 가능함</li>
<li>AG는 자동/수동 장애 조치, 즉 Failover를 제공함 - 자동 failover는 동기화된 데이터 이동이 구성되어 있고 primary replica와 secondary replica의 데이터베이스가 동기화된 상태이면 발생할 수 있음</li>
</ul>
<blockquote>
<h4 id="always-on-가용성-그룹-클러스터-유형"><strong>Always On 가용성 그룹 클러스터 유형</strong></h4>
<ul>
<li>WSFC(Windows Server Failover Cluster)</li>
</ul>
</blockquote>
<ul>
<li>EXTERNAL</li>
<li>NONE</li>
</ul>
<h3 id="--always-on-fci"><strong>- Always On FCI</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/df1b91fb-d48b-4846-957f-4eed1d155473/image.png" alt=""></p>
<blockquote>
<ul>
<li>FCI = Failover Cluster Instance</li>
</ul>
</blockquote>
<ul>
<li>SQL Server 전체 설치에 대해 가용성을 제공하는 방법/인스턴스</li>
<li>기본 서버에 문제가 발생할 경우 데이터베이스, SQL Server 에이전트 작업, 연결된 서버 등 인스턴스 내부의 모든 항목이 다른 서버로 이동</li>
<li>공유 스토리지 필요(FCI와 물리적으로 분리된 스토리지 사용 필요) - FCI의 리소스는 주어진 시간에 한 노드에서만 실행하고 소유 가능</li>
<li>FCI에서는 데이터 손실이 거의 없지만 데이터 복사본이 하나라는 주의사항이 존재함 - 데이터베이스 복사본을 확보하기 위한 AG 및 log shipping과 같은 다른 가용성 방법과도 결합됨</li>
<li>FCI가 다른 노드로 failover하게 되면 노드를 중지하고 다른 노드에서 시작하게 됨 - 정상 복구 프로세스를 거치게 되며 롤포워드가 필요한 트랜잭션은 롤포워드가 수행되며 불완전한 트랜잭션은 롤백됨</li>
<li>데이터베이스는 복구가 완료된 후에만 사용할 수 있으며 일반적으로 AG의 failover 보다 더 많은 시간이 소요됨</li>
<li>FCI는 primary/secondary replica를 호스트하는 인스턴스 중 하나로 AG에 참여 가능</li>
</ul>
<h3 id="--로그-전달log-shipping"><strong>- 로그 전달(Log shipping)</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/a0302388-5333-4f57-8188-7f2623ba6eb4/image.png" alt=""></p>
<blockquote>
<ul>
<li>복구 시점 및 복구 목표가 유연하거나 해당 데이터베이스가 업무상 덜 중요하다면 log shipping을 사용함</li>
</ul>
</blockquote>
<ul>
<li>log shipping 프로세스: Primary 트랜잭션 로그 백업 자동 생성 -&gt; (하나 이상의) Warm Standby 인스턴스에 트랜잭션 로그 백업 복사 -&gt; 해당 트랜잭션 로그 백업을 대기 항목으로 자동 적용</li>
<li>log shipping은 SQL Server 에이전트 작업을 사용하여 트랜잭션 로그 백업/복사/적용하는 프로세스를 자동화함</li>
<li>트랜잭션 로그 적용은 지연될 수 있음 - WHERE절 없는 UPDATE와 같은 명령을 보내면 standby에 변경사항이 전달되지 않아 primary시스템을 복구하는 동안 전환될 수 있음</li>
<li>log shipping은 구성하기 쉽지만 primary에서 warm standby로 역할 변경하는 것은 항상 수동</li>
<li>단일 AG에는 여러 데이터베이스가 포함될 수 있지만 log shipping은 데이터베이스별로 구성 필요</li>
</ul>
<h2 id="재해-복구">[재해 복구]</h2>
<ul>
<li>Primary 가용성 위치에 지진이나 홍수와 같은 치명적인 재해가 발생하는 경우, 자사 시스템이 다른 곳에서 온라인 상태가 되도록 준비 필요</li>
</ul>
<h3 id="--always-on-가용성-그룹-1"><strong>- Always On 가용성 그룹</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/e8005a68-f132-4c11-b394-6b7dafeea17e/image.png" alt=""></p>
<blockquote>
<ul>
<li>고가용성을 위해 하나의 데이터센터에 로컬인 replica를 확보하고 재해 복구를 위해 다른 데이터센터에 원격 replica를 확보하는 것으로 primary replica는 모든 secondary replica를 동기화된 상태로 유지 필요</li>
</ul>
</blockquote>
<ul>
<li>secondary replica는 읽기 전용 쿼리에서 사용될 수 있음(EE에서만 제공하는 기능) - 단, secondary replica는 순수 복사본이기에 데이터 조작 및 인덱스 적용 등이 필요하다면 primary replica에서 수행해야 함</li>
</ul>
<h3 id="--always-on-fci-1"><strong>- Always On FCI</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/7725928a-fbdd-4ded-b6f3-a83062afedf3/image.png" alt=""></p>
<blockquote>
<ul>
<li>FCI 공유 스토리지(디스크) 관련 추가 고려가 필요함</li>
</ul>
</blockquote>
<ul>
<li>primary 및 secondary에서 동일한 공유 디스크를 사용할 수 있어야 하기 때문에 FCI에서 사용하는 디스크가 다른 곳에 있도록 하려면 하드웨어 계층에서 스토리지 공급업체가 제공하는 기능 또는 Windows Server의 스토리지 복제본 사용과 같은 외적인 방법이 필요</li>
</ul>
<h3 id="--로그-전달log-shipping-1"><strong>- 로그 전달(Log shipping)</strong></h3>
<blockquote>
<ul>
<li>log shipping은 가장 오래된 재해 복구 방법으로 AG 및 FCI와 함께 사용되면 비용 측면에서 효율적이며 상대적으로 간단한 재해 복구 방법을 제공함</li>
</ul>
</blockquote>
<h2 id="마이그레이션-및-업그레이드">[마이그레이션 및 업그레이드]</h2>
<ul>
<li>신규 인스턴스를 배포하거나 기존 인스턴스를 업그레이드할 때 업무가 오래 중단되는 상태는 지양되도록 가용성 기능을 사용하여 계획된 아키텍처 변경, 서버 전환, 플랫폼 변경, 패치 적용 등으로 인한 가동 중지 시간을 최소화하는 방법 필요</li>
</ul>
<h3 id="--always-on-가용성-그룹-2"><strong>- Always On 가용성 그룹</strong></h3>
<p><img src="https://velog.velcdn.com/images/idle_idle/post/011db021-5476-416c-9c5b-bacfab08c47a/image.png" alt=""></p>
<blockquote>
<ul>
<li>전제: (하나 이상의) AG에 속하는 기존 인스턴스를 SQL Server 최신 버전으로 업그레이드 한다면!</li>
</ul>
</blockquote>
<ul>
<li>신규 서버로 마이그레이션하면서 구성(운영체제/SQL Server 버전 등)은 변경하지 않는다면 해당 서버를 기존 기본 클러스터에 노드로 추가하고 AG에 추가 후 replica(s)가 정상 상태가 되면 신규 서버에 수동 failover를 수행할 수 있으며 이전 서버는 AG에서 제거하고 최종적으로 서비스를 해제할 수 있음</li>
<li>클러스터 유형이 &#39;NONE&#39;인 AG를 마이그레이션 및 업그레이드가 가능한데 AG 구성에서 클러스터 유형을 짜맞출 수 없으므로 모든 replica는 클러스터 유형이 &#39;NONE&#39;이어야만 함</li>
<li>분산형 AG를 사용하여 서로 다른 클러스터 유형으로 구성된 AG를 확장할 수 있음</li>
</ul>
<h3 id="--always-on-fci-2"><strong>- Always On FCI</strong></h3>
<blockquote>
<ul>
<li>FCI는 자체적으로 기존 마이그레이션 또는 업그레이드를 지원할 수 없음</li>
</ul>
</blockquote>
<h3 id="--로그-전달log-shipping-2"><strong>- 로그 전달(Log shipping)</strong></h3>
<blockquote>
<ul>
<li>log shipping은 마이그레이션 및 업그레이드 수행 시 많이 사용되는 옵션</li>
</ul>
</blockquote>
<ul>
<li>서버 전환 시 원본에서 모든 트래픽이 중단되면 최종 트랜잭션 로그를 가져와 복사하고 새 구성에 적용(백업/복원 기반) - 해당 시점에서 데이터베이스를 Online 상태로 만들 수 있음</li>
<li>log shipping은 다른 가용성 작업 보다 전환 시간이 좀 더 소요될 수는 있으나 분 단위 정도의 차이로 측정됨</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>