<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>힘들 땐 삑삑 울자 삑삑도요처럼</title>
        <link>https://velog.io/</link>
        <description>삑삑도요가 되자</description>
        <lastBuildDate>Sun, 19 Mar 2023 14:00:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>힘들 땐 삑삑 울자 삑삑도요처럼</title>
            <url>https://velog.velcdn.com/images/jaik_lee/profile/e775bb17-4e06-4974-9d15-b0ffad8fc714/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 힘들 땐 삑삑 울자 삑삑도요처럼. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jaik_lee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[보안 1일 1지식] 대칭키]]></title>
            <link>https://velog.io/@jaik_lee/%EB%B3%B4%EC%95%88-1%EC%9D%BC-1%EC%A7%80%EC%8B%9D-%EB%8C%80%EC%B9%AD%ED%82%A4</link>
            <guid>https://velog.io/@jaik_lee/%EB%B3%B4%EC%95%88-1%EC%9D%BC-1%EC%A7%80%EC%8B%9D-%EB%8C%80%EC%B9%AD%ED%82%A4</guid>
            <pubDate>Sun, 19 Mar 2023 14:00:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/e4f7b44f-676a-4cbf-9a11-fdd0a001620e/image.png" alt=""></p>
<p><strong>대칭 열쇠 암호(symmetric-key algorithm)는 암호화와 복호화에 같은 열쇠(key)를 사용하는 암호</strong>를 말한다. </p>
<p>대칭 열쇠 암호는 <strong>암복호화 속도가 빠르지만 상대편도 같은 열쇠를 가지고 있어야 하므로 이를 전달하는 과정에서 약점이 노출</strong>된다.</p>
<p>대칭 열쇠 암호의 대표적인 예가 AES와 DES이다.</p>
<hr>
<p>AES - <strong>AES는 Advanced Encryption Standard의 약자로 &#39;고급 암호화 표준&#39;라는 의미</strong>이다. </p>
<p>AES는 미국 표준 기술 연구소에 의해서 연방 정보 처리 표준으로 지정된 암호화 방식이며 NSA에 의해 1급 비밀에 사용할 수 있도록 승인된 암호화 알고리즘 중 유일하게 공개된 알고리즘이다. <strong>대칭키를 쓰는 블럭 암호</strong>이다. 높은 안전성과 속도로 인해 인기를 얻어 전 세계적으로 많이 이용되고 있다. 이러한 이점으로 인해서 랜섬웨어에 많이 이용되고 있기도 하다.</p>
<hr>
<p>DES - 1975년에 IBM에서 개발하고 1979년에 미국 NBS(National Bureau of Standards, 현 NIST)가 국가 표준 암호 알고리즘으로 지정한 대칭키 암호 알고리즘.</p>
<blockquote>
<p>Source of Contents
<a href="https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf">Announcing the ADVANCED ENCRYPTION STANDARD (AES) </a>
<a href="https://www.youtube.com/watch?v=mlzxpkdXP58&amp;ab_channel=AAA">AES Rijndael Cipher - Visualization</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1713 후보 추천하기]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1713-%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%ED%95%98%EA%B8%B0-ec3eamfb</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1713-%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%ED%95%98%EA%B8%B0-ec3eamfb</guid>
            <pubDate>Thu, 15 Dec 2022 10:51:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/e5d70a9c-35d4-4847-b775-129e6f5b7506/image.png" alt=""></p>
<h2 id="풀이">풀이</h2>
<pre><code class="language-python">N = int(input())
M = int(input())
recommend = list(map(int, input().split()))

slot = dict()
cnt = 0
for rec in recommend:
    # 슬롯이 꽉 차있는 상태에서 교체해야 하는 경우
    if len(slot) &gt;= N and not rec in slot:
        # 가장 갯수가 적은 것을 삭제함
        del slot[min(slot, key=lambda x:slot[x])]
    # 이미 있는 거면 추천 수를 하나씩 추가함
    try: slot[rec][0] += 1
    # 새로 추가했다면 카운트를 하나씩 추가함
    except:
        slot[rec] = [1, cnt]
        cnt += 1
print(*sorted(slot.keys()))</code></pre>
<h2 id="감상">감상</h2>
<p>아직 제대로 해시를 잘 사용하지 못하는 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 17615 볼 모으기]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-17615-%EB%B3%BC-%EB%AA%A8%EC%9C%BC%EA%B8%B0</link>
            <guid>https://velog.io/@jaik_lee/BOJ-17615-%EB%B3%BC-%EB%AA%A8%EC%9C%BC%EA%B8%B0</guid>
            <pubDate>Mon, 12 Dec 2022 04:39:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/e531e3b9-e0c2-4551-b60e-8a725cf769cc/image.png" alt=""></p>
<h2 id="풀이">풀이</h2>
<pre><code class="language-python">N = int(input())
S = input()
RED = S.count(&#39;R&#39;)
BLUE = len(S)-RED

# 하나만 갖고 있는 경우 한번만 옮기면 되니까 답 후보 중 하나
ans = min(RED, BLUE)

cnt_1 = 0
cnt_2 = 0

# 한 색깔만 있는 경우에는 0을 출력
if N-RED == 0 or N-BLUE == 0:
    print(0)
else:
    # 왼쪽으로 모는 게 빠른 경우를 출력
    for i in range(0, len(S)):
        if S[i] != S[0]:
            break
        else:
            cnt_1 += 1
    if S[0] == &#39;R&#39;:
        ans = min(ans, RED-cnt_1)
    else:
        ans = min(ans, BLUE-cnt_1)
    # 오른쪽으로 모는 게 빠른 경우를 출력
    for i in range(N-1, -1, -1):
        if S[i] != S[N-1]:
            break
        else:
            cnt_2 += 1
    if S[N-1] == &#39;R&#39;:
        ans = min(ans, RED-cnt_2)
    else:
        ans = min(ans, BLUE-cnt_2)
    print(ans)</code></pre>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/7aca17e7-3e4a-43bd-af62-28e505d62312/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마감과 계획과 잡설]]></title>
            <link>https://velog.io/@jaik_lee/%EB%A7%88%EA%B0%90%EA%B3%BC-%EA%B3%84%ED%9A%8D%EA%B3%BC-%EC%9E%A1%EC%84%A4</link>
            <guid>https://velog.io/@jaik_lee/%EB%A7%88%EA%B0%90%EA%B3%BC-%EA%B3%84%ED%9A%8D%EA%B3%BC-%EC%9E%A1%EC%84%A4</guid>
            <pubDate>Thu, 08 Dec 2022 20:35:34 GMT</pubDate>
            <description><![CDATA[<h1 id="자격증-어학">자격증, 어학</h1>
<h3 id="한자-3급12월-내">한자 3급(12월 내)</h3>
<h3 id="cos-pro1월-7일">COS PRO(1월 7일)</h3>
<h3 id="신용분석사2월-18일">신용분석사(2월 18일)</h3>
<h3 id="투자자산운용사6월">투자자산운용사(6월)</h3>
<h3 id="opic-or-toeic-speaking">OPIc or TOEIC Speaking</h3>
<h3 id="toeic9월에-만료">TOEIC(9월에 만료)</h3>
<br>

<h1 id="블로그">블로그</h1>
<h3 id="1-자격증-공부-현황-new">1. 자격증 공부 현황 (New!)</h3>
<h3 id="2-매일-알고리즘-풀이">2. 매일 알고리즘 풀이</h3>
<h3 id="3-java-공부">3. JAVA 공부</h3>
<h3 id="4-사이드-프로젝트가능하면">4. 사이드 프로젝트(가능하면)</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Plant Go!] 소개글]]></title>
            <link>https://velog.io/@jaik_lee/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Plant-Go</link>
            <guid>https://velog.io/@jaik_lee/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Plant-Go</guid>
            <pubDate>Sat, 12 Nov 2022 10:39:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/16fe5958-c229-4f93-9658-9be10146a8e6/image.png" alt=""></p>
<br>

<h1 id="🌿-plant-go-🌿">🌿 Plant Go! 🌿</h1>
<ul>
<li>나만의 식물도감 및 수집 서비스</li>
<li>삼성청년SW아카데미 7기 서울 특화 7반 A703 특화 프로젝트(빅데이터 분산)</li>
</ul>
<br>

<h1 id="🗓-프로젝트-기간">🗓 프로젝트 기간</h1>
<ul>
<li>2022년 8월 22일 ~ 2022년 10월 07일</li>
</ul>
<br>

<h1 id="🛠-프로젝트-팀원">🛠 프로젝트 팀원</h1>
<p>총 5인</p>
<br>

<h1 id="💻-기술-스택">💻 기술 스택</h1>
<br>
<img src ="https://img.shields.io/badge/framework-SpringBoot-green"></img>
<img src="https://img.shields.io/badge/Library-React-blue"> 
<img src ="https://img.shields.io/badge/database-MySQLDB-purple"></img>
<br>
<img src ="https://img.shields.io/badge/language-Java%2C%20JavaScript-blueviolet"></img>
<img src ="https://img.shields.io/badge/server-S3-orange"></img>
<img src ="https://img.shields.io/badge/server-Docker-blue"></img>
<img src ="https://img.shields.io/badge/server-Jenkins-red"></img>
<img src ="https://img.shields.io/badge/server-Nginx-green"></img>
<br>
<br>

<br>

<h1 id="🎮-협업툴">🎮 협업툴</h1>
<br>
<img alt="Gitlab" src ="https://img.shields.io/badge/Gitlab-181717.svg?&style=for-the-badge&logo=Gitlab&logoColor=white"/>
<img alt="MatterMost" src ="https://img.shields.io/badge/MatterMost-blue.svg?&style=for-the-badge&logo=MatterMost&logoColor=white"/>
<img alt="Notion" src ="https://img.shields.io/badge/Notion-white.svg?&style=for-the-badge&logo=Notion&logoColor=black"/>
<img alt="Webex" src ="https://img.shields.io/badge/Webex-181717.svg?&style=for-the-badge&logo=Webex&logoColor=green"/>


<br>

<h1 id="⚙-시스템-아키텍처">⚙ 시스템 아키텍처</h1>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/e16a36fb-1b4b-47cd-b704-aeef18626cfd/image.png" alt=""></p>
<br>

<h1 id="🎞-프로젝트-설명">🎞 프로젝트 설명</h1>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/f7b40dd9-3536-4482-a9d7-69722cfbaa93/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/b96558e2-afd0-4d51-a682-a713c4cde0d9/image.jpg" alt=""></p>
<br>

<h1 id="🎞-실행-화면">🎞 실행 화면</h1>
<ul>
<li>Main page<ul>
<li>소셜 로그인 구현 (카카오톡, 구글, 네이버)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/bae085b0-2ae3-4956-9419-9975a52c05ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/f214ec65-5ad9-46be-8bb7-65126bb0879f/image.gif" alt=""></p>
<p><br><br></p>
<ul>
<li>Map<ul>
<li>등록된 식물 마커 표시</li>
<li>사진 조회</li>
<li>map 드래그, zoom in/out</li>
<li>마커 클러스터링 구현</li>
</ul>
</li>
</ul>
<p><img src="blob:https://velog.io/5f520fc7-c3c4-405f-b8ba-86aaafdec0a2" alt="업로드중.."></p>
<p><br><br></p>
<ul>
<li>Camera &amp; Plant Information<ul>
<li>식물 사진 촬영</li>
<li>Plant.id API를 이용한 식물 정보 제공</li>
<li>식물 사진 등록</li>
</ul>
</li>
</ul>
<p><img src="blob:https://velog.io/c5720cf0-2d8d-416a-af79-0bc00946af56" alt="업로드중.."></p>
<ul>
<li><p>Plants Book</p>
<ul>
<li>Collected/Uncollected 식물 조회</li>
<li>무한스크롤 구현</li>
</ul>
</li>
<li><p>Photo Cards</p>
<ul>
<li>포토카드 등록 후 메모 수정 기능</li>
</ul>
</li>
</ul>
<p><img src="blob:https://velog.io/70144d91-db7d-4329-bd37-d5707f787e03" alt="업로드중.."></p>
<ul>
<li>Ranking<ul>
<li>클러스터 서버, Spark를 이용한 분산 처리</li>
<li>회원별 수집한 식물 종류 갯수 카운트</li>
<li>상위 30위 랭킹 조회</li>
<li>3분 간격으로 랭킹 갱신</li>
</ul>
</li>
</ul>
<p><img src="blob:https://velog.io/00672272-1fcc-419b-8f9b-ee145a36195f" alt="업로드중.."></p>
<p><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1946 신입사원]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1946-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1946-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90</guid>
            <pubDate>Wed, 12 Oct 2022 12:24:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/a209f937-367f-4bc4-8202-1ae65cd79fa0/image.png" alt=""></p>
<h3 id="greedy">Greedy</h3>
<ul>
<li>중요한 것은 각 숫자별로 &#39;최저값&#39;을 어떻게 설정하는가이다.</li>
<li>당연히 1등부터 점수가 있으니까 1등이 제일 최저값이지만, 1등이라고 해서 모두 [1, 1] 형식인 것은 아니다</li>
<li>그러므로 한 분야의 1등을 정한 뒤 나머지 부분의 최저값을 계속 갱신해 나가는 것이 이번의 할 일이다(다른 쪽의 1등이 나올 때까지)</li>
</ul>
<pre><code class="language-python">
import sys
sys.stdin = open(&#39;input.txt&#39;)
T = int(input())
for _ in range(T):
    N = int(input())
    count = 0
    candidate = [list(map(int, input().split())) for _ in range(N)]
    # 한 분야의 1등을 정하기 위해 정렬한다(이 경우는 1차 시험에서 1등한 사람의 기준이다).
    candidate.sort(key=lambda x:x[0])
    # 답에 우선 1차 시험 1등을 넣어 놓는다.
    answer = [candidate[0]]
    for i in range(1, N):
        # 1차 시험 1등의 각각의 점수보다 같거나 큰 사람을 계속 더해나간다. 
        # 그러다 보면 각 시험의 최고점(1등)이 가진 다른 부분의 시험 점수를 가진 사람들이 뽑혀나가게 되고,
        # 그 사람들이 뽑힐 수 있는 최저점이 되어 간다.
        if candidate[i][0]&lt;=answer[-1][0] or candidate[i][1]&lt;=answer[-1][1]:
            answer.append(candidate[i])
    print(len(answer))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1197 최소 스패닝 트리]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1197-%EC%B5%9C%EC%86%8C-%EC%8A%A4%ED%8C%A8%EB%8B%9D-%ED%8A%B8%EB%A6%AC</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1197-%EC%B5%9C%EC%86%8C-%EC%8A%A4%ED%8C%A8%EB%8B%9D-%ED%8A%B8%EB%A6%AC</guid>
            <pubDate>Wed, 28 Sep 2022 13:25:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/0e3a20d5-f51c-4d50-ab43-c255c4db678f/image.png" alt=""></p>
<h1 id="크루스칼-알고리즘을-배워보자">크루스칼 알고리즘을 배워보자.</h1>
<p><a href="https://gmlwjd9405.github.io/2018/08/28/algorithm-mst.html">https://gmlwjd9405.github.io/2018/08/28/algorithm-mst.html</a>
<a href="https://techblog-history-younghunjo1.tistory.com/262">https://techblog-history-younghunjo1.tistory.com/262</a></p>
<ol>
<li>가중치를 기준으로 간선을 정렬한다.</li>
<li>Union-Find 알고리즘을 이용해 Cycle 여부를 확인한다.</li>
<li>Cycle이 아니라면, 최소 스패닝 트리에 들어갈 수 있으므로 넣는다.</li>
<li>모든 점이 연결된 이후에 연결되는 점들은 Find에 걸리므로 자동으로 없어짐</li>
</ol>
<pre><code class="language-python">V, E = map(int, input().split())

# 부모 테이블을 초기화

parent = [i for i in range(V+1)]

# find 연산

def find(parent, x):
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]

# union 연산

def union(parent, a, b):
    a = find(parent, a)
    b = find(parent, b)
    if a&lt;b:
        parent[b] = a
    else:
        parent[a] = b

# 간선 정보를 담을 리스트와 최소 신장 트리 계산 변수 정의
edges = [list(map(int, input().split())) for _ in range(E)]
total_cost = 0

edges.sort(key=lambda x: (x[2]))

# 간선 정보 하나씩 확인하면서 크루스칼 알고리즘 수행
for a, b, cost in edges:
    if find(parent, a) != find(parent, b):
        union(parent, a, b)
        total_cost += cost

print(total_cost)</code></pre>
<h2 id="union-find는-눈-감고-풀-수-있도록-꼭-외우자">Union-Find는 눈 감고 풀 수 있도록 꼭 외우자!</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1149 RGB 거리]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1149-RGB-%EA%B1%B0%EB%A6%AC</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1149-RGB-%EA%B1%B0%EB%A6%AC</guid>
            <pubDate>Wed, 28 Sep 2022 12:25:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/02a5ac68-4bd2-4409-8dc6-c0abd8f6b55c/image.png" alt=""></p>
<p>아이디어</p>
<ol>
<li>경우의 수는 총 3가지(첫번째 집을 R, G, B로 할 지)</li>
<li>N번째에서의 최솟값은, 그 전에 최솟값을 했을 때 어떤 걸 고를지에 대한 것임</li>
<li>즉 i번째의 최솟값은 i-1번째에서 최솟값을 가졌을 때 어떤 RGB를 고를지에 대한 것</li>
<li>그러므로 최솟값을 선택한 흔적을 계속 쌓아가면 됨</li>
</ol>
<pre><code class="language-python"># 집의 숫자
# 집의 숫자
N = int(input())
# 집어 넣을 색깔의 숫자
houses = [list(map(int, input().split())) for _ in range(N)]
for i in range(1, len(houses)):
    # 1번째 집에서 RGB를 각각 선택하는 건 0번째 집에서 어떤 선택을 했냐에 따라 가질 수 있는 최저값이 달라짐
    houses[i][0] = min(houses[i - 1][1], houses[i - 1][2]) + houses[i][0]
    houses[i][1] = min(houses[i - 1][0], houses[i - 1][2]) + houses[i][1]
    houses[i][2] = min(houses[i - 1][0], houses[i - 1][1]) + houses[i][2]
    # 따라서 1번째에서 R을 칠한다면 0번째에서 G, B 중 최저값을 칠했어야 하고
    # 나머지 2가지도 마찬가지
    # 이 값을 계속 쌓아나가는 것
print(min(houses[N - 1][0], houses[N - 1][1], houses[N - 1][2]))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 9251 LCS]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-9251-LCS</link>
            <guid>https://velog.io/@jaik_lee/BOJ-9251-LCS</guid>
            <pubDate>Wed, 28 Sep 2022 11:16:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/0a2fe643-295a-40fe-92cd-69870652f307/image.png" alt=""></p>
<p>시간 제한이 2초(사실 0.1초지만 파이썬 농어촌전형으로 2초 줌)
그렇다는 건 최대 1000글자니까 부분 집합 모두 구하는 건 불가능하다는 뜻</p>
<p>빡대가리이기 때문에 DP는 솔직히 답이 없다(2차원 DP 쉣 ㅋㅋ)
열심히 풀이 보긴 봤는데 내가 이해한 바는 다음과 같다</p>
<ol>
<li>두 문자열 길이가 다를 수 있다</li>
<li>문자열 하나를 이중 리스트로 비교해가면서 있는지 확인</li>
<li>NxM에서 문자열 길이를 더해가면서 비교하면 기존에 만들 수 있던 길이보다 +1인지, 최대 길이인지 확인 가능</li>
</ol>
<pre><code class="language-python">A = input()
B = input()

matrix = [[0]*(len(B)+1) for _ in range(len(A)+1)]
for i in range(1, len(A)+1):
    for j in range(1, len(B)+1):
        if A[i-1] == B[j-1]:
            matrix[i][j] = matrix[i-1][j-1]+1
        else:
            matrix[i][j] = max(matrix[i-1][j], matrix[i][j-1])

print(matrix[-1][-1])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1715 카드 정렬하기]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1715-%EC%B9%B4%EB%93%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1715-%EC%B9%B4%EB%93%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 27 Sep 2022 15:27:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/ae82d3fb-2bd1-4bc5-9913-98d6aa5bd14f/image.png" alt=""></p>
<h1 id="1-우선-스택을-이용해서-차례대로-더해보자">1. 우선 스택을 이용해서 차례대로 더해보자.</h1>
<pre><code class="language-python">import sys
input = sys.stadin.readline
N = int(input())
cards = list(int(input()) for _ in range(N))
tmp = cards[0]
stack_list = []
for i in range(1, N):
    tmp = tmp+cards[i]
    stack_list.append(tmp)
print(sum(stack_list))</code></pre>
<p>8%에서 틀렸다. 아무래도 답이 아닌 것 같다.</p>
<p>반례를 보니 30,40,50,60이 있을 때 최소 비교는 360이다.</p>
<p>이 코드는 370을 뱉는다.</p>
<p>이유를 알겠다.</p>
<p>-&gt; 최솟값을 구해서 더해야 하는데, 그냥 무지성으로 앞에서부터 더하다 보면 최솟값이 아닌 값을 더할 수 있게 됨</p>
<h1 id="2-최소값을-힙큐를-이용해-2개-뽑아낸-후-더한-값을-다시-안-쪽에-집어넣고-더한-값은-스택에-계속-더한다-알고리즘에-하나-남을-때까지-반복한다">2. 최소값을 힙큐를 이용해 2개 뽑아낸 후, 더한 값을 다시 안 쪽에 집어넣고 더한 값은 스택에 계속 더한다. 알고리즘에 하나 남을 때까지 반복한다.</h1>
<pre><code class="language-python">import heapq
import sys
sys.stdin = open(&#39;input.txt&#39;)

N = int(input())
answer = 0
# 갯수가 하나밖에 없는 카드 뭉치는 그냥 반환
if N == 1:
    print(int(input()))
else:
    # 카드 뭉치를 리스트로 받아줌(사실 빈 리스트 생성 후 힙푸시로 넣어도 무방함. 그게 더 빠를 듯)
    cards = list(int(input()) for _ in range(N))
    # 리스트를 힙큐로 만들어 줌
    heapq.heapify(cards)
    while len(cards)&gt;1:
        # heappop을 이용해 최솟값을 2개씩 뽑아준다.
        stack1 = heapq.heappop(cards)
        stack2 = heapq.heappop(cards)
        # 더한 값을 일단 answer에 담아주고
        answer += (stack1+stack2)
        # heappush를 이용해 다시 힙큐 속으로 넣어준다.
        heapq.heappush(cards, stack1+stack2)
    print(answer)</code></pre>
<p>틀렸다.</p>
<p>100%에서</p>
<p>왜냐하면 정답은 &#39;비교횟수&#39;이기 때문에 하나만 있으면 비교횟수가 0이어야 하는데 예외 처리를 받아오는 카드 뭉치 숫자로 했다.(빠간가)</p>
<h1 id="3-오류-수정">3. 오류 수정</h1>
<pre><code class="language-python">import heapq
import sys
sys.stdin = open(&#39;input.txt&#39;)

N = int(input())
answer = 0
if N == 1:
    print(0)
else:
    cards = list(int(input()) for _ in range(N))
    heapq.heapify(cards)
    while len(cards)&gt;1:
        stack1 = heapq.heappop(cards)
        stack2 = heapq.heappop(cards)
        answer += (stack1+stack2)
        heapq.heappush(cards, stack1+stack2)
    print(answer)</code></pre>
<h2 id="정답">정답!</h2>
<ol>
<li><p>&#39;리스트 안&#39;에서 최솟값을 구하는 건 무조건 힙큐 생각해봅시다.</p>
</li>
<li><p>조건을 &#39;제대로&#39; 보고 제발 문제를 풉시다.</p>
</li>
<li><p>힙큐는 무적이다 파이썬은 신이고</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩 테스트 준비] 매일 풀이]]></title>
            <link>https://velog.io/@jaik_lee/%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84-%EB%A7%A4%EC%9D%BC-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@jaik_lee/%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84-%EB%A7%A4%EC%9D%BC-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Tue, 27 Sep 2022 14:41:54 GMT</pubDate>
            <description><![CDATA[<h1 id="순서">순서</h1>
<h2 id="0927화">09/27(화)</h2>
<ul>
<li>문자열 : <a href="https://velog.io/@jaik_lee/BOJ-1522-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B5%90%ED%99%98">1522 문자열 교환</a> G5</li>
<li>그리디 : <a href="https://velog.io/@jaik_lee/BOJ-1715-%EC%B9%B4%EB%93%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0">1715 카드 정렬하기</a> G4<h2 id="0928수">09/28(수)</h2>
</li>
<li>문자열 : <a href="https://velog.io/@jaik_lee/BOJ-9251-LCS">9251 LCS</a> G5</li>
<li>DP : <a href="https://velog.io/@jaik_lee/BOJ-1149-RGB-%EA%B1%B0%EB%A6%AC">1149 RGB 거리</a> S1</li>
<li>그래프 : <a href="https://velog.io/@jaik_lee/BOJ-1197-%EC%B5%9C%EC%86%8C-%EC%8A%A4%ED%8C%A8%EB%8B%9D-%ED%8A%B8%EB%A6%AC">1197 최소 스패닝 트리</a> G4<h2 id="0929목">09/29(목)</h2>
<h2 id="0930금">09/30(금)</h2>
<h2 id="1001토">10/01(토)</h2>
</li>
<li>새마을금고 코테</li>
<li>데브매칭 하반기 코테<h2 id="1002">10/02</h2>
<h2 id="1003">10/03</h2>
<h2 id="1004">10/04</h2>
<h2 id="1005">10/05</h2>
<h2 id="1006">10/06</h2>
<h2 id="1007">10/07</h2>
<h2 id="1008">10/08</h2>
<h2 id="1009">10/09</h2>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 1522 문자열 교환]]></title>
            <link>https://velog.io/@jaik_lee/BOJ-1522-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B5%90%ED%99%98</link>
            <guid>https://velog.io/@jaik_lee/BOJ-1522-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B5%90%ED%99%98</guid>
            <pubDate>Tue, 27 Sep 2022 12:05:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/ba68363c-3a5b-4448-9414-36b7dd3a7ca8/image.png" alt=""></p>
<ol>
<li>예를 들어, &#39;aaabaaaabaa&#39;와 같은 경우</li>
<li>최대로 a가 연속되는 수는 a의 숫자와 같다.</li>
<li>따라서 슬라이딩 윈도우나 브루트포스를 통해 가장 &#39;b&#39;의 숫자가 적은 곳을 고르면 된다.</li>
<li>대신 이번에 고려할 점은 <strong>이 순회가 원형</strong>이기 때문에 순차배열이 아닌 원형 배열을 생각해야 한다는 점. 그래서 원형 배열까지 고려한 슬라이딩 윈도우(크기는 &#39;a&#39;의 갯수만큼)로 풀면 된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PRGMS] 가장 큰 수 ]]></title>
            <link>https://velog.io/@jaik_lee/PRGMS-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%88%98</link>
            <guid>https://velog.io/@jaik_lee/PRGMS-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%88%98</guid>
            <pubDate>Sat, 24 Sep 2022 09:38:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/7333d193-3ec1-4e8a-b283-4233daf7f825/image.png" alt=""></p>
<h1 id="내가-몰랐던-것">내가 몰랐던 것</h1>
<p>다중 정렬 문제에서 내가 모르는 게 너무 많다.</p>
<p>특히 sort(key=lambda x: ())에 들어갈 것들에 대해 너무 모르는 느낌이다.</p>
<h1 id="정답-코드">정답 코드</h1>
<pre><code>def solution(numbers):

# 문자열 형태로 바꾼다.

    numbers = list(map(str, numbers))

# x*3을 주면, x를 3번 복제한 것을 가지고 비교를 하게 된다.
# 왜 3번이냐면, 원소가 1000이하(3자리 수)이기 때문이다. 1000은 000이니까 제외.
# 그래서 x를 3번 복제한 걸 가지고 비교한다. 그러면 666, 101010, 222를 갖고 비교하게 된다.
# 그리고 reverse=True 인자를 주면 내림차순으로 비교가 된다.

    numbers.sort(key = lambda x: x*3, reverse=True)

# int str를 한번 더 변환하지 않는다면 0,0,0을 비교할 수 없다.

    return str(int(&#39;&#39;.join(numbers)))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[PRGMS] 숫자 블록]]></title>
            <link>https://velog.io/@jaik_lee/PRGMS-%EC%88%AB%EC%9E%90-%EB%B8%94%EB%A1%9D</link>
            <guid>https://velog.io/@jaik_lee/PRGMS-%EC%88%AB%EC%9E%90-%EB%B8%94%EB%A1%9D</guid>
            <pubDate>Sat, 24 Sep 2022 08:37:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/4206387c-c992-470d-967a-0a341ed835af/image.png" alt=""></p>
<h1 id="정답-코드">정답 코드</h1>
<pre><code>def solution(begin, end):
    answer = []
    for i in range(begin, end+1):
        k = int(i != 1)  # 소수도 있으므로 1을 일단 대입함.
        for j in range(2, int(i**0.5)+1): # i**0.5 == sqrt(i)
            if i%j == 0 and i//j &lt;= 10000000: # 약수가 될 수 있는 최대 숫자는 10,000,000
                k = i//j  # j가 2부터 커지기 때문에 처음 만나는 i//j가 약수 중 가장 큰 값(그 때 멈춤)
                break
        answer.append(k)
    return answer</code></pre><h1 id="공부할-거리">공부할 거리</h1>
<h2 id="1-최대-약수-구하는-법---약수는-sqrtx를-통해-쉽게-구할-수-있음-왜냐하면-sqrtx-이전까지만-구해도-충분하기-때문">1. 최대 약수 구하는 법 -&gt; 약수는 sqrt(x)를 통해 쉽게 구할 수 있음. 왜냐하면 sqrt(x) 이전까지만 구해도 충분하기 때문</h2>
<h2 id="2-숫자가-10억을-넘어가면-on만-되도-당연히-못풂">2. 숫자가 10억을 넘어가면 O(n)만 되도 당연히 못풂</h2>
<h2 id="3-1천만의-sqrt10000000은-10000이므로-쉽게-이중배열-가능">3. 1천만의 sqrt(10000000)은 10,000이므로 쉽게 이중배열 가능</h2>
<h2 id="4-10000x10000--10000000이므로-on-가능">4. 10,000x10,000 = 10,000,000이므로 O(n) 가능</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PRGMS] 영어 끝말잇기]]></title>
            <link>https://velog.io/@jaik_lee/PRGMS-%EC%98%81%EC%96%B4-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</link>
            <guid>https://velog.io/@jaik_lee/PRGMS-%EC%98%81%EC%96%B4-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</guid>
            <pubDate>Sat, 24 Sep 2022 06:16:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/61157e55-a279-456e-872b-bedabfec1bc9/image.png" alt=""></p>
<h1 id="정답코드">정답코드</h1>
<pre><code>def solution(n, words):
    answer = [0, 0]
    gone = [[] for _ in range(n)]
    word = []
    for i in range(len(words)):
        # 이미 말한 단어를 말한다면
        if words[i] in word:
            answer[1] = len(gone[i%n])+1
            answer[0] = i%n+1
            break
        # 끝 글자와 맞지 않는 글자를 말한다면
        elif len(word)&gt;0 and words[i][0] != word[-1][-1]:
            answer[1] = len(gone[i%n])+1
            answer[0] = i%n+1
            break
        else:
            gone[i%n].append(words[i])
            word.append(words[i])
    return answer</code></pre><p>몇 가지 고려 사항이 있는 걸 감안하면 쉬운 문제(레벨 1수준?)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PRGMS] 최댓값과 최솟값]]></title>
            <link>https://velog.io/@jaik_lee/PRGMS-%EC%B5%9C%EB%8C%93%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</link>
            <guid>https://velog.io/@jaik_lee/PRGMS-%EC%B5%9C%EB%8C%93%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</guid>
            <pubDate>Thu, 22 Sep 2022 20:10:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jaik_lee/post/166c103b-c617-4941-9f8e-fbd4d0f10e41/image.png" alt=""></p>
<h2 id="아주-간단하게-풀었던-문제">아주 간단하게 풀었던 문제</h2>
<h3 id="1-공백을-split을-이용해-없애준다">1. 공백을 split()을 이용해 없애준다.</h3>
<h3 id="2-int-형식으로-바꿔준다이-때-음수는-자동으로-음수로-바뀜">2. int 형식으로 바꿔준다(이 때 음수는 자동으로 음수로 바뀜</h3>
<h3 id="3-sort를-통해-정렬">3. sort()를 통해 정렬</h3>
<h3 id="4-0번-인덱스와--1번-인덱스를-추출">4. 0번 인덱스와 -1번 인덱스를 추출</h3>
<br>

<p>정답 코드</p>
<pre><code>def solution(s):
    answer = &#39;&#39;
    answer_list = s.split()
    for i in range(len(answer_list)):
        answer_list[i] = int(answer_list[i])
    answer_list.sort()
    answer= f&#39;{answer_list[0]} {answer_list[-1]}&#39;
    return answer</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[QUEANT] 소개글]]></title>
            <link>https://velog.io/@jaik_lee/QUEANT-%EC%86%8C%EA%B0%9C%EA%B8%80</link>
            <guid>https://velog.io/@jaik_lee/QUEANT-%EC%86%8C%EA%B0%9C%EA%B8%80</guid>
            <pubDate>Mon, 22 Aug 2022 10:02:09 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트-우수상-수상3위">프로젝트 우수상 수상(3위)</h1>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/27df4f19-61d9-4445-afcb-d9313cfecae9/image.png" alt=""></p>
<p>&nbsp;</p>
<p>프로젝트의 이름은 &#39;QueÆnt&#39; 로, 여왕개미(QueenAnt) 의 약자를 의미합니다.<br>한국에서는 개인 투자자들을 개미라고 부르기도 하는데, 안정적인 투자를 통해 여왕개미가 되자는 뜻을 내포하고 있습니다.</p>
<p>최근, 금리가 올라가며 은행의 예,적금 상품에 관심이 많아졌습니다.
QueÆnt에서는 국내 은행들의 예,적금 상품들의 정보를 제공하고, 사용자 조건에 적합한 예,적금 상품을 추천함으로써 효율적으로, 그리고 효과적으로 자신의 포트폴리오를 구성해 수익률을 비교해볼 수 있는 서비스를 제공합니다.</p>
<p>&nbsp;</p>
<p><br><br><br><br></p>
<h1 id="목차">목차</h1>
<br>

<ol>
<li>서비스 소개 및 기획</li>
<li>서비스의 특징</li>
<li>아키텍처 &amp; 버전</li>
<li>팀원 소개</li>
<li>서비스 구동 영상 GIF</li>
</ol>
<p>&nbsp;
<br><br><br><br></p>
<h1 id="1-서비스-소개-및-기획">1. 서비스 소개 및 기획</h1>
<h3 id="erd">ERD</h3>
<br>

<p><img src="https://velog.velcdn.com/images/jaik_lee/post/45a52fa6-cc47-4576-98e4-5f3793fc6c0d/image.jpg" alt=""></p>
<p>&nbsp;</p>
<h3 id="와이어프레임">와이어프레임</h3>
<br>

<p><img src="https://velog.velcdn.com/images/jaik_lee/post/da60bada-d510-4908-84be-2ab836700f9d/image.jpg" alt=""></p>
<p>&nbsp;
<br><br><br><br></p>
<h1 id="2-서비스의-특징">2. 서비스의 특징</h1>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/8b7dbf57-44b5-4f8a-9575-1a18d7f78c29/image.jpg" alt=""></p>
<p>&nbsp;</p>
<ul>
<li>국내 시중 은행 및 저축 은행의 예,적금 정보 제공</li>
<li>실제로 보유하고 있는 상품을 등록하고 관리</li>
<li>은행 예,적금 상품들로 가상 포트폴리오를 생성하고 수익률을 비교/분석</li>
<li>자산관리 관련 뉴스와 컨텐츠 제공</li>
</ul>
<p>&nbsp;
<br><br><br><br></p>
<h1 id="3-아키텍처--버전">3. 아키텍처 &amp; 버전</h1>
<h3 id="아키텍처">아키텍처</h3>
<p>&nbsp;</p>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/3b051563-94aa-44af-a2e9-e732b0e15959/image.png" alt=""></p>
<p>&nbsp;</p>
<h3 id="버전">버전</h3>
<h4 id="⭐frontend">⭐FrontEnd</h4>
<ul>
<li>Visual Studio Code 1.70.0</li>
<li>Node.js 16.16.0</li>
<li>Vue3</li>
<li>Vue/cli 5.0.4</li>
<li>Npm 8.11.0</li>
<li>Axios 0.27.2</li>
<li>Bootstrap-vue 5.1.3</li>
<li>Ckeditor5-vue 4.0.1</li>
<li>Vuex 4.0.2</li>
<li>Vue3-apexcharts 1.4.1</li>
</ul>
<h4 id="⭐backendspringboot">⭐BackEnd(SpringBoot)</h4>
<ul>
<li>IntelliJ</li>
<li>Spring boot 2.6.7</li>
<li>Spring-boot-jpa</li>
<li>Spring Security</li>
<li>Java 8</li>
<li>Junit 4.13.1</li>
<li>Mysql connector java 8.0.29</li>
<li>Json Web Token 0.11.2</li>
<li>Spring Fox BootStarter 3.0.0</li>
<li>Jsoup 1.14.3</li>
<li>ModelMapper 2.4.2</li>
<li>Spring Cloud Starter AWS 2.2.6</li>
</ul>
<h4 id="⭐backenddjango">⭐BackEnd(Django)</h4>
<ul>
<li>Python 3.10.5</li>
<li>Django-apscheduler 0.6.2</li>
<li>PyMySQL 1.0.2</li>
<li>Bs4 0.0.1</li>
<li>Gunicorn 19.6.0</li>
<li>Lxml 4.9.1</li>
</ul>
<h4 id="⭐cicd">⭐CICD</h4>
<ul>
<li>AWS EC2</li>
<li>MariaDB</li>
<li>Docker</li>
<li>Nginx</li>
<li>Jenkins</li>
</ul>
<p>&nbsp;
<br><br><br><br></p>
<h1 id="4-팀원-소개-ssafy-7기-a201">4. 팀원 소개 (SSAFY 7기 A201)</h1>
<p><br><br><br></p>
<table>
    <tr>
        <td align="center" >팀장 류인영</td>
        <td align="center">팀원 이재익</td>
        <td align="center">팀원 이종은</td>
    </tr>
    <tr>
        <td align="center">#Backend #Server</td>
        <td align="center">#Frontend #Publishing</td>
        <td align="center">#Frontend #Axios</td>
    </tr>
    <tr>
        <td align="center">팀원 전선영</td>
        <td align="center">팀원 한동현</td>
        <td align="center">팀원 김상협</td>
    </tr>
    <tr>
        <td align="center">#Backend #Planning</td>
        <td align="center">#Data Parse & Crawl</td>
        <td align="center">#Frontend #Backend</td>
    </tr>
</table>

<p><br><br><br><br></p>
<h1 id="5-서비스-구동-영상-gif">5. 서비스 구동 영상 GIF</h1>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/5038ea21-d974-4fd0-be45-ba0e340664d0/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/b2a2605c-9f41-42bf-a0c5-71e9f7eee390/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/a0d86c21-7842-4ff1-8ec2-cfb83c51de4b/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/95cca46c-b433-4d8c-bed4-1a08959a4a6d/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/112bc692-0569-444b-9917-314cd6528736/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/b02516c6-fbf5-40e4-b924-a22325855838/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/5ad05d55-3353-4243-b6bf-563394f1aa03/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/f1a78506-8d6d-4dd3-a381-76d0151895a1/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/68282e41-5be6-4957-8885-9c463bcc54aa/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/fca97442-ddf1-4ee3-85c9-361e35851914/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/59759e3f-91b8-4e42-b1ca-4a9eca4fe003/image.gif" alt="">
<img src="https://velog.velcdn.com/images/jaik_lee/post/ed61c86d-3df4-4a0f-93d1-4cdda048cd27/image.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[정보처리기사 실기] 정리본]]></title>
            <link>https://velog.io/@jaik_lee/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%A0%95%EB%A6%AC%EB%B3%B8</link>
            <guid>https://velog.io/@jaik_lee/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%A0%95%EB%A6%AC%EB%B3%B8</guid>
            <pubDate>Sun, 17 Jul 2022 21:33:02 GMT</pubDate>
            <description><![CDATA[<h1 id="1단원--요구사항-확인">1단원 : 요구사항 확인</h1>
<h3 id="1-소프트웨어-생명-주기">1. 소프트웨어 생명 주기</h3>
<ul>
<li>소프트웨어를 개발하기 위한 과정을 각 단계별로 나눈 것</li>
<li>나선형 모형, 폭포수 모형, 프로토타입 모형, 애자일 모형 존재<ul>
<li>나선형 모형 : 여러번의 SW 개발 과정을 거쳐 점진적으로 완벽한 최종 SW를 개발하는 모형</li>
<li>폭포수 모형 : 고전적 생명 주기 모형</li>
<li>프로토타입 모형 : 실제 개발될 소프트웨어에 대한 견본품을 만들어 최종 결과물을 예측</li>
<li>애자일 모형<ul>
<li>특정한 개발 방법론 X, 요구사항 변화에 유연하게 대응, 일정한 주기 반복</li>
<li>스크럼, XP, 칸반, 린, 기능중심개발(FDD) 등</li>
<li>소프트웨어 공학 : 소프트웨어의 위기를 극복하기 위한 방안으로 연구된 학문<ul>
<li>여러가지 방법론과 도구, 관리 기법들을 통하여 소프트웨어의 품질과 생산성 향상을 목적</li>
</ul>
</li>
<li>스크럼<ul>
<li>PO(백로그 담당), SM(가이드 역할), DT(그냥 일반 팀원)</li>
<li>스프린트 계획 회의 -&gt; 스프린트 -&gt; 일일 스크럼 회의, 스프린트 검토 회의 -&gt; 스프린트 회고</li>
</ul>
</li>
<li>XP<ul>
<li>의사소통, 단순성, 용기, 존중, 피드백</li>
<li>XP 실천 방법<ul>
<li>페어 프로그래밍, 공동 코드 소유, 테스트 주도 개발, 전체 팀, 계속적 통합, 리팩토링, 소규모 릴리즈</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="2-관리-시스템들">2. 관리 시스템들</h3>
<ul>
<li>DBMS : 가용성, 성능, 기술 지원, 구축 비용, 상호 호환성</li>
<li>WAS(웹 어플리케이션 서버) : 가용성, 성능, 기술 지원, 구축 비용</li>
<li>오픈 소스 : 라이선스 종류, 사용자 수, 기술의 지속 가능성</li>
</ul>
<h3 id="3-요구사항">3. 요구사항</h3>
<ul>
<li><p>소프트웨어가 어떤 문제를 해결하기 위해 제공하는 서비스에 대한 설명과 정상적으로 운영되는 데 필요한 제약 조건</p>
</li>
<li><p>기능 요구사항</p>
<ul>
<li>시스템이 무엇을 하는지, 어떤 기능을 하는지 등에 대한 <strong>기능</strong>이나 <strong>수행</strong>과 관련된 요구 사항</li>
</ul>
</li>
<li><p>비기능 요구사항</p>
<ul>
<li>품질이나 제약사항과 관련된 요구사항</li>
</ul>
</li>
<li><p>요구사항 개발 프로세스</p>
<ul>
<li><p>도출</p>
</li>
<li><p>분석</p>
<ul>
<li>개발 대상에 대한 사용자의 요구 사항을 이해하고 문서화 하는 활동</li>
<li>DFD : 자료의 흐름 및 변환 과정과 기능을 도형 중심으로 기술. 구조적 분석 기법에 이용<ul>
<li>프로세스, 자료 흐름, 자료 저장소, 단말로 구성</li>
<li>자료 사전 : 정의(=), 연결(+), 생략( () ), 선택( [] ), 반복( {} ), 설명(**)</li>
</ul>
</li>
<li>분석용 CASE : 요구사항을 자동으로 분석하고, 요구사항 분석 명세서를 기술하도록 개발된 도구.<ul>
<li>SADT, SREM(=RSL/REVS), PSL/PSA, TAGS</li>
<li>SADT : SoftTech社 개발. 시스템 정의/소프트웨어 요구사항 분석/시스템 및 소프트웨어 설계를 위한 도구</li>
<li>HIPO : 시스템 실행 과정인 입력, 처리, 출력의 기능을 표현한 것. 하향식 소프트웨어 개발을 위한 문서화 도구.<ul>
<li>고유 모듈로 분할하여 이들 간의 인터페이스를 계층 구조로 표현한 것을 HIPO Chart라고 함.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>명세</p>
<ul>
<li>분석된 요구사항을 바탕으로 모델 작성, 문서화</li>
<li>정형 명세 기법 : VDM, Z, Petri-net, CSP</li>
<li>비정형 명세 기법 : FSM, Decision Table, ER모델링, State Chart(SADT) 등</li>
</ul>
</li>
<li><p>확인</p>
</li>
</ul>
</li>
</ul>
<h3 id="4-uml">4. UML</h3>
<ul>
<li>UML은 시스템 개발 과정에서 참여자 상호 간의 의사소통이 원활하게 이루어지도록 표준화한 대표적 객체지향 모델링 언어</li>
<li>구성 요소는 사물(Things), 다이어그램(Diagram), 관계(Relationships)<ul>
<li>다이어그램은 사물과 관계를 도형으로 표현한 것<ul>
<li>구조적 다이어그램<ul>
<li>클래스 다이어 그램<ul>
<li>클래스, 제약조건, 관계로 구성</li>
<li>연관 클래스 : 연관 관계에 있는 두 클래스에 추가적으로 표현해야 할 속성이나 오퍼레이션이 있는 경우 생성하는 클래스</li>
</ul>
</li>
<li>객체 다이어그램 : 럼바우의 객체 지향 분석 기법, 인스턴스를 특정 시점의 객체와 객체 사이의 관계로 표현</li>
<li>컴포넌트 다이어그램 : 구현 단계에서 사용, 컴포넌트 간의 관계나 컴포넌트 간의 인터페이스를 표현</li>
<li>배치 다이어그램 : 구현 단계에서 사용, 물리적 요소의 위치</li>
<li>복합체 구조 다이어그램 : 복합 구조</li>
<li>패키지 다이어그램 : 유스케이스나 클래스 등의 모델 요소를 그룹화한 <strong>패키지들의 관계</strong>를 표현<ul>
<li>패키지, 객체, 의존관계</li>
</ul>
</li>
</ul>
</li>
<li>행위 다이어그램<ul>
<li>유스케이스 다이어그램 : 시스템, 액터, 유스케이스, 관계로 구성됨.<ul>
<li>포함 관계(include) : 새롭게 만든 유스케이스 쪽으로 점선 화살표 연결</li>
<li>확장 관계(exclude) : 원래 유스케이스 쪽으로 점선 화살표 연결</li>
</ul>
</li>
<li>시퀀스 다이어그램 : 시스템, 객체들의 메시지<ul>
<li>액터, 객체, 생명선, 실행 상자, 메시지, 객체 소멸, 프레임</li>
</ul>
</li>
<li>커뮤니케이션 다이어그램 : 객체들의 메시지, 객체들 간 연관 관계 표현(시퀀스와의 차이점)<ul>
<li>액터, 객체, 링크, 메시지</li>
</ul>
</li>
<li>상태 다이어그램 : 럼바우 동적 모델링 활용, 상호작용에 따라 상태 변화하는 것 표현<ul>
<li>상태, 시작 상태, 종료 상태, 상태 전환, 이벤트, 프레임</li>
</ul>
</li>
<li>활동 다이어그램 : 객체 처리 로직이나 조건에 따른 처리 흐름(조건노드 등)<ul>
<li>액션, 액티비티, 시작노드, 종료노드, 조건 노드(나가는 게 2 이상), 병합 노드(들어오는 게 2 이상), 포크 노드(네모, 나가는 게 2 이상), 조인 노드(네모, 들어오는 게 2 이상), 스윔 레인(주체 구분선)</li>
</ul>
</li>
<li>상호작용 개요 다이어그램, 타이밍 다이어그램 : 이름 그대로 쓰면 됨.</li>
</ul>
</li>
</ul>
</li>
<li>관계는 사물과 사물 사이의 연광성을 표현한 것<ul>
<li>연관 관계 : Association, 실선 연결, 서로 관련되어 있는 관계(사람-집)</li>
<li>집합 관계 : Aggregation, 속이 빈 마름모, 포함되어 있는 관계(컴퓨터-마우스)</li>
<li>포함 관계 : Composition, 속 찬 마름모, 포함하는 사물 변화가 포함되는 사물에게 영향을 미치는 관계(문-키)</li>
<li>일반화 관계 : Generalization, 속이 빈 화살표, 하나의 사물이 다른 사물에 비해 더 일반적이거나 구체적인 관계(커피 - 아메리카노, 에스프레소)</li>
<li>의존 관계 : Dependency, 점선 화살표, 서로에게 영향을 주는 짧은 시간 동안만 연관을 유지하는 관계(등급-할인율)</li>
<li>실체화 관계 : 속이 빈 점선 화살표, 사물이 할 수 있거나 해야하는 <strong>기능</strong>(날 수 있다-새, 비행기)</li>
</ul>
</li>
</ul>
</li>
<li>럼바우, 부치, 제이콥슨 등의 객체지향 방법론의 장점을 통합함.</li>
<li>스테레오 타입 : UML에서 표현하는 기본 기능 외에 추가적인 기능을 표현하는 것(&lt;&lt;&gt;&gt; 내에 표현할 형태를 기술)</li>
</ul>
<h3 id="5-개발-방법론">5. 개발 방법론</h3>
<ul>
<li>객체지향 방법론 : 개체를 하나의 객체로 만들어 이 객체들을 조립해서 필요한 SW를 구현하는 방법론<ul>
<li>요구사항 분석-설계-구현-테스트-유지보수(인도)</li>
</ul>
</li>
<li>컴포넌트 기반 방법론 : 기존의 시스템이나 SW를 구성하는 컴포넌트를 조합하여 하나의 새로운 App을 제작<ul>
<li>개발 준비-분석-설계-구현-테스트-전개-인도</li>
</ul>
</li>
<li>소프트웨어 재사용 : 이미 개발되어 인정받은 소프트웨어를 다른 소프트웨어 개발이나 유지에 사용하는 것<ul>
<li>합성 중심 : 블록을 끼워 맞춰 소프트웨어를 완성(<strong>블록 구성 방법</strong>이라고도 함)</li>
<li>생성 중심 : 추상화 형태로 써진 명세를 구체화하여 프로그램을 만드는 방법(<strong>패턴 구성 방법</strong>이라고도 함)</li>
</ul>
</li>
<li>소프트웨어 재공학 : 기존 시스템을 이용하여 나은 시스템을 구축, 새로운 기능 추가로 SW 성능 향상</li>
<li>CASE : SW 개발 과정에서 사용되는 과정 전체 또는 일부를 컴퓨터와 전용 SW 도구를 사용하여 자동화!<ul>
<li>소프트웨어 생명 주기 전 단계 연결, 그래픽 지원, 다양한 SW 개발 모형 지원</li>
</ul>
</li>
<li>비용 산정 기법<ul>
<li>하향식 비용 산정 기법<ul>
<li>전문가 감정 기법, 델파이 기법</li>
</ul>
</li>
<li>상향식 비용 산정 기법<ul>
<li>LOC : 낙+중*4+비/6<ul>
<li>COCOMO : 보헴 제안, LOC에 의함. Man-Month로 나타냄.<ul>
<li>COCOMO 유형 : 조직형(5만 이하), 반분리형(30만 이하), 임베디드형</li>
</ul>
</li>
</ul>
</li>
<li>수학적 산정 기법<ul>
<li>Putnam : 노력 분포를 예상. Rayleigh-Nordon 곡선 노력 분포도가 기초. 푸트남이 제안. 생명 주기 예측 모형</li>
<li>기능 점수 모형 : 소프트웨어의 기능을 증대시키는 요인 별로 가중치 부여, 기능 점수 구한 후 비용 산정.<ul>
<li>자료 입력(입력 양식), 정보 출력(출력 보고서), 명령어(사용자 질의수), 데이터 파일, 외부 루틴과의 인터페이스</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>비용 산정 자동화 추정 도구 : SLIM(Rayleigh-Norden + Putnam), ESTIMACS(FP 모형)</li>
<li>PERT : 전체 작업의 상호 관계를 표시하는 네트워크(낙관, 가능성, 비관으로 종료 시기 결정)</li>
<li>CPM : 필요한 작업 나열, 작업에 필요한 소요 기간 예측. 임계 경로(최장 경로) 찾기</li>
<li>간트 차트 : 시간선 차트. 막대 도표를 이용하여 작업 일정을 표시하는 프로젝트 일정표.</li>
</ul>
</li>
<li>소프트웨어 생명 주기 표준 및 평가 모델<ul>
<li>ISO/IEC 12207 : 생명 주기 프로세스. 기본, 지원, 조직으로 나눔.</li>
<li>CMMI : 초기, 관리, 정의, 정량적 관리, 최적화(초관정정최)로 나눠 업무 능력 및 조직 성숙도를 평가</li>
<li>SPICE : ISO/IEC 15504, 소프트웨어의 품질 및 생산성 향상을 위해 소프트웨어 프로세스를 평가.<ul>
<li>불완전, 수행, 관리, 확립, 예측, <strong>최적화</strong></li>
</ul>
</li>
</ul>
</li>
<li>테일러링 : 소프트웨어 개발 방법론의 젗라, 사용기법 등을 수정 및 보완하는 작업<ul>
<li>내부적 기준 : 목표 환경, 요구사항, 프로젝트 규모, 보유 기술</li>
<li>외부적 기준 : 법적 제약사항, 표준 품질 기준</li>
</ul>
</li>
<li>개발 프레임워크 : SW 개발에 공통적으로 사용되는 구성 요소와 아키텍처를 일반화 -&gt; 반제품 형태의 SW 시스템<ul>
<li>스프링 : 자바를 위한 Open Source 경량형 App Framework</li>
<li>특성 : 모듈화, 재사용성, 확장성, 제어의 역흐름</li>
</ul>
</li>
</ul>
<hr>

<h1 id="2단원--데이터-입출력-구현">2단원 : 데이터 입출력 구현</h1>
<h3 id="1-데이터-전반">1. 데이터 전반</h3>
<ul>
<li>데이터 전환 : 데이터를 추출하여 새로 개발할 정보 시스템에서 운영할 수 있도록 변환한 후 적재하는 과정</li>
<li>데이터 검증 : 원래 데이터를 목적 시스템의 데이터로 전환하는 과정이 정상적으로 수행되었는지 확인</li>
<li>오류 데이터 측정 및 정제 : 데이터 품질 분석 -&gt; 오류 데이터 측정 -&gt; 오류 데이터 정제</li>
</ul>
<h3 id="2-데이터베이스">2. 데이터베이스</h3>
<h4 id="데이터-베이스-기초-및-설계">데이터 베이스 기초 및 설계</h4>
<ul>
<li><p>공동으로 사용될 데이터를 <strong>중복을 배제하여 통합</strong>하고, <strong>저장장치에 저장하여 항상 사용</strong>할 수 있도록 운영하는 데이터</p>
<ul>
<li>통합된 데이터, 저장된 데이터, 운영 데이터, 공용 데이터로 구분</li>
</ul>
</li>
<li><p>DBMS : 사용자의 요구에 따라 정보를 생성, DB를 관리해주는 소프트웨어</p>
<ul>
<li>정의기능, 조작기능, 제어기능 존재(DDL, DML, DCL)</li>
</ul>
</li>
<li><p>스키마 : 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세</p>
<ul>
<li>외부 스키마 : 각 개인의 입장에서 필요로 하는 DB의 논리적 구조의 정의</li>
<li>개념 스키마 : DB의 전체적인 논리적 구조, 하나만 존재.</li>
<li>내부 스키마 : 물리적 저장장치의 입장에서 본 DB 구조</li>
</ul>
</li>
<li><p>DB 설계 순서 : 요구 조건 분석 -&gt; 개념 -&gt; 논리 -&gt; 물리 -&gt; 구현</p>
<ul>
<li>개념적 설계 : 현실 세계에 대한 인식을 추상적 개념으로 표현하는 과정</li>
<li>논리적 설계 : 현실의 자료를 특정 DBMS가 지원하는 논리적 자료 구조로 변환(Mapping)하는 과정</li>
<li>물리적 설계 : 논리적 구조의 데이터를 물리적 구조의 데이터로 변환</li>
</ul>
</li>
<li><p>데이터 모델 : 현실 세계의 정보를 체계적으로 표현한 개념적 모형</p>
<ul>
<li>구조 : 데이터 구조 및 정적 성질 표현</li>
<li>연산 : 실제 데이터를 처리하는 작업에 대한 명세</li>
<li>제약 조건 : 논리적인 제약 조건</li>
</ul>
</li>
<li><p>개체 : 데이터베이스에 표현하려는 것. 현실 세계의 대상체</p>
<ul>
<li>유일한 식별자에 의해 식별</li>
</ul>
</li>
<li><p>관계 : 1:1, 1:N, N:M으로 구별</p>
</li>
<li><p>E-R 모델 : 현실 세계의 무질서한 데이터를 개념적인 논리 데이터로 표현하기 위한 방법</p>
<ul>
<li>사각형(개체), 마름모(관계), 타원(속성), 이중 타원(다중 속성), 밑줄 타원(기본키), 복수 타원(복합 속성), 관계, 선/링크</li>
</ul>
</li>
<li><p>관계형 DB의 릴레이션 구조</p>
<ul>
<li>속성(애트리뷰트)(학번, 이름, 학년...), 튜플(가로줄 하나), 도메인(속성의 자료값의 집합)</li>
<li>릴레이션 스키마(속성의 집합) + 릴레이션 인스턴스(실제 값)으로 구성</li>
<li>튜플의 수를 카디널리티 또는 기수, 대응수라고 함</li>
<li>속성의 수를 디그리 또는 차수라고 함</li>
</ul>
</li>
<li><p>후보키, 기본키, 대체키, 슈퍼키, 외래키</p>
<ul>
<li>후보키는 유일성과 최소성을 모두 만족, 기본키는 후보키 중에 나옴. 나머지 후보키는 대체키</li>
<li>슈퍼키는 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키(최소성 만족X, 유일성은 만족)</li>
<li>외래키는 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합</li>
</ul>
</li>
<li><p>무결성 : 참조 무결성과 개체 무결성</p>
<ul>
<li>참조 무결성 : 외래키 값은 Null or 참조 릴레이션의 기본키 값과 동일. 참조 X하는 외래키는 불가.</li>
<li>개체 무결성 : 기본키는 Not Null, 중복 X</li>
</ul>
</li>
<li><p>관계대수 : 원하는 정보와 그 정보를 검색하기 위해서 어떻게 유도하는가를 기술하는 절차적인 언어</p>
<ul>
<li>관계연산자<ul>
<li>Select : 시그마(수평 연산, 튜플의 부분집합을 구함)</li>
<li>Project : 파이(수직 연산, 애트리뷰트의 부분집합을 구함)</li>
<li>Join : 애도리본(두 개의 릴레이션을 합침. 커티시언 프로덕트 후 셀렉트)</li>
<li>Division : 나누기(R+S 할 때 R-S한 속성을 구하는 연산)</li>
</ul>
</li>
<li>일반 집합 연산자<ul>
<li>합집합 = U</li>
<li>교집합 = 뒤집은 U</li>
<li>차집합 = -</li>
<li>교차곱 = X</li>
</ul>
</li>
</ul>
</li>
<li><p>관계해석 : 관계 데이터의 연산을 표현하는 방법</p>
</li>
</ul>
<h4 id="이상과-정규반정규화">이상과 정규/반정규화</h4>
<ul>
<li>이상 : 삽입 이상, 삭제 이상, 갱신 이상<ul>
<li>삽입 이상 : 삽입 불가되는 현상</li>
<li>삭제 이상 : 상관없는 값도 함께 삭제</li>
<li>갱신 이상 : 일부 튜플의 정보만 갱신, 정보에 불일치성이 생김</li>
</ul>
</li>
<li>함수적 종속과 정규화 :<ul>
<li>제 1 정규화 : 도메인이 모두 원자값</li>
<li>제 2 정규화 : 부분적 함수 종속 제거</li>
<li>제 3 정규화 : 이행적 함수 종속 제거</li>
<li>BCNF : 결정자이면서 후보키가 아닌 것 제거</li>
<li>제 4 정규화 : 다치 종속 제거</li>
<li>제 5 정규화 : 조인 종속성 이용</li>
</ul>
</li>
<li>반정규화 : 정규화된 데이터 모델을 의도적으로 통합/중복/분리하여 정규화 원칙을 위배하는 행위<ul>
<li>중복 테이블 추가<ul>
<li>집계 테이블 : 집계 데이터를 위한 테이블 생성 + 트리거 설정</li>
<li>진행 테이블 : 이력 관리</li>
<li>특정 부분만을 포함하는 테이블 추가</li>
</ul>
</li>
</ul>
</li>
<li>시스템 카탈로그 : 다양한 객체에 관한 정보를 포함하는 Sys DB</li>
</ul>
<h4 id=""></h4>
<h4 id="트랜잭션">트랜잭션</h4>
<ul>
<li>트랜잭션 : 작업 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산(논리적 기능을 수행하기 위함)<ul>
<li>원자성, 일관성, 독립성, 영속성</li>
</ul>
</li>
<li>CRUD 분석 : 프로세스와 테이블 간에 CRUD 매트릭스를 만들어서 트랜잭션을 분석하는 것</li>
<li>INDEX : 데이터 레코드를 빠르게 접근하기 위해 &lt;키 값, 포인터&gt; 쌍으로 구성되는 데이터 구조</li>
<li>클러스티드/넌 클러스티드 인덱스<ul>
<li>클러스티드 인덱스 : 키의 순서에 따라 데이터도 정렬</li>
<li>넌 클러스티드 인덱스 : 키 값만 정렬, 데이터는 정렬 X</li>
</ul>
</li>
<li>뷰 : 하나 이상의 기본 테이블로부터 유도된 가상 테이블(CREATE와 DROP 문 사용)</li>
<li>파티션 : 대용량의 테이블이나 인덱스를 작은 논리적 단위로 나눈 것<ul>
<li>범위 분할 : 월별, 일별</li>
<li>해시 분할 : 고객번호, 주민번호같이 데이터가 고른 칼럼에 효과적</li>
<li>조합 분할 : 범위 분할로 분할하고 다시 해시 함수 적용</li>
</ul>
</li>
<li>분산 데이터베이스의 목표<ul>
<li>위치 투명성 : 단지 논리적 명칭으로 액세스</li>
<li>중복 투명성 : 마치 하나의 데이터처럼</li>
<li>병행 투명성 : 다수 트랜잭션이 동시 실현해도 결과 영향 X</li>
<li>장애 투명성 : 장애에도 불구하고 트랜잭션 명확히.</li>
</ul>
</li>
</ul>
<h3 id="3-데이터-복구-및-보안">3. 데이터 복구 및 보안</h3>
<ul>
<li>RTO/RPO : Recovery Time Objective 목표 복구 시간, Recovery Point Objective 목표 복구 시점</li>
<li>암호화 : 암호화와 복호화 과정을 거침. 개인키 암호 방식과 공개키 암호 방식으로 나뉨.</li>
<li>접근 통제<ul>
<li>임의 접근 통제(DAC) : 사용자 신원에 따라 접근 권한 부여</li>
<li>강제 접근 통제(MAC) : 주체와 객체 등급 비교 후 접근 권한 부여</li>
<li>역할 기반 접근 통제(RBAC) : 사용자 역할에 따라 접근 권한 부여</li>
</ul>
</li>
<li>스토리지 : 대용량 데이터 저장하기 위해 서버와 저장장치 연결하는 기술<ul>
<li>DAS : 전용 케이블로 직접 연결</li>
<li>NAS : 네트워크 통해 연결</li>
<li>SAN : DAS의 빠른 처리와 NAS의 파일 공유 장점 혼합. 전용 네트워크 별도 구성</li>
</ul>
</li>
</ul>
<h3 id="4-자료구조">4. 자료구조</h3>
<ul>
<li>선형 구조<ul>
<li>배열 : 크기와 형이 동일한 자료들이 순서대로 나열. 정적인 자료 구조</li>
<li>선형 리스트</li>
<li>스택 : LIFO</li>
<li>큐 : FIFO</li>
<li>데크</li>
</ul>
</li>
<li>비선형 구조<ul>
<li>그래프 : 정점과 간선의 두 집합, 방향과 무방향 그래프로 나뉨<ul>
<li>최대 간선수 : 방향 그래프는 N(N-1), 무방향 그래프는 N(N-1)/2</li>
</ul>
</li>
<li>트리 : 사이클 없는 그래프<ul>
<li>맨 위에 있는 노드는 <strong>루트 노트</strong></li>
<li>각 노드에서 뻗어나온 가지의 수는 <strong>디그리</strong></li>
<li>자식이 하나도 없는 노드는 <strong>단말 노드</strong></li>
<li>레벨은 근 노드가 레벨 1</li>
<li>깊이는 노드가 가질 수 있는 최대의 레벨</li>
<li>Preorder : 루트-&gt;왼-&gt;오른</li>
<li>Inorder : 왼-&gt;루트-&gt;오른</li>
<li>Postorder : 왼-&gt;오른-&gt;루트</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>정렬은 생략함</strong></p>
<hr>

<h1 id="3단원--통합-구현">3단원 : 통합 구현</h1>
<h3 id="1-통합-구현">1. 통합 구현</h3>
<ul>
<li><p>통합구현 : 송수신 모듈과 중계 모듈 간 연계를 구현하는 것 </p>
<ul>
<li>송수신 시스템, 모듈, 중계시스템, 연계데이터, 네트워크로 구성</li>
</ul>
</li>
<li><p>연계 매커니즘 : 데이터 생성 및 추출 -&gt; 코드 매핑 및 데이터 변환 -&gt; 인터페이스 테이블 또는 파일 생성 -&gt; 연계 서버 또는 송신 어댑터</p>
<ul>
<li>연계 매커니즘의 연계 방식 : 직접 연ㄱ녜 방식, 간접 연계 방식</li>
</ul>
</li>
<li><p>연계 서버/송, 수신 시스템 : </p>
<ul>
<li>송신 시스템은 인터페이스 테이블 또는 파일의 데이터를 전송 형식에 맞도록 변환 및 송신을 수행하는 시스템</li>
<li>수신 시스템 : 수신 데이터를 인터페이스 테이블이나 파일로 생성하는 시스템</li>
<li>연계 서버는 모든 처리를 수행. </li>
</ul>
</li>
<li><p>연계 테스트 : 케이스 작성 -&gt; 환경 구축 -&gt; 수행 -&gt; 검증</p>
</li>
<li><p>연계 데이터 보안 : 전송 구간 보안과 데이터 자체를 보안하는 것으로 나뉨</p>
</li>
<li><p>XML : 특수한 목적을 갖는 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어, 웹브라우저 간 HTML 문법이 호환되지 않는 문제와 SGML의 복잡함을 해결하기 위해 개발.</p>
</li>
<li><p>SOAP : 네트워크 상에서 HTTP/HTTPS, SMTP 등을 이용하여 XML을 교환하기 위한 통신 규약</p>
</li>
<li><p>WSDL : 웹서비스와 관련된 서식이나 프로토콜 등을 표준적인 방법으로 기술하고 게시하기 위한 언어</p>
</li>
</ul>
<hr>

<h1 id="4단원--서버-프로그램-구현">4단원 : 서버 프로그램 구현</h1>
<h3 id="1-개발-환경">1. 개발 환경</h3>
<ul>
<li><p>개발 환경 구축 : 개발 프로젝트를 이해하고 SW 및 HW 장비를 구축</p>
</li>
<li><p>하드웨어 환경 : Web Server, WAS, DB Server, File Server</p>
</li>
<li><p>소프트웨어 환경 : 시스템 소프트웨어(OS, 서버 프로그램, DBMS) + 개발 소프트웨어</p>
</li>
<li><p>웹 서버 기능 : HTTP/HTTPS 지원, 통신 기록, 정적 파일 관리, 대역폭 제한, 가상 호스팅(하나의 서버로 여러개 도메인 연결), 인증</p>
</li>
<li><p>개발 언어 선정 기준 : 적정성, 효율성, 이식성, 친밀성, 범용성</p>
</li>
</ul>
<h3 id="2-개발-패턴과-방법">2. 개발 패턴과 방법</h3>
<ul>
<li><p>소프트웨어 아키텍처 : SW를 구성하는 요소들 간의 관계를 표현하는 시스템의 구조 또는 구조체</p>
<ul>
<li>품질 속성 : 시스템, 비즈니스, 아키텍처 측면으로 나뉨</li>
</ul>
</li>
<li><p>모듈화 : 시스템의 기능들을 모듈 단위로 나누는 것</p>
</li>
<li><p>추상화 : 전체적이고 포괄적인 개념 설계 후 차례로 세분화해서 구체화시킴</p>
<ul>
<li>과정 추상화, 자료 추상화, 제어 추상화로 나뉨</li>
</ul>
</li>
<li><p>단계적 분해 : 상위의 중요 개념으로부터 하위의 개념으로 구체화 시킴</p>
</li>
<li><p>정보 은닉 : 한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 함</p>
</li>
<li><p>상위 설계와 하위 설계</p>
<ul>
<li>상위 설계 : 아키텍처, 예비 설계 / 구조, DB, 인터페이스를 설계</li>
<li>하위 설계 : 모듈, 상세 설계 / 컴포넌트, 자료구조, 알고리즘을 설계</li>
</ul>
</li>
<li><p>협약에 의한 설계 : 컴포넌트 설계 시 클래스에 대한 여러 가정을 공유할 수 있도록 명세한 것</p>
<ul>
<li>선행 조건, 결과 조건, 불변 조건</li>
</ul>
</li>
<li><p>아키텍처 패턴 : 전형적인 해결 방식 및 예제</p>
<ul>
<li><p>레이어 패턴 : 계층으로 구분하여 구성</p>
</li>
<li><p>클라이언트-서버 패턴 : 하나의 서버-여러개의 클라이언트 컴포넌트</p>
</li>
<li><p>파이프-필터 패턴 : 데이터 스트림 절차의 각 단계를 필터로 캡슐화, 파이프 통해 전송 / 대표적으로 UNIX 쉘</p>
</li>
<li><p>MVC 패턴 : 모델, 뷰, 컨트롤러로 구성</p>
</li>
<li><p>마스터-슬레이브 패턴 : 장애 허용/병렬 컴퓨팅 시스템</p>
</li>
<li><p>브로커 패턴 : 분산 환경 시스템, 사용자가 원하는 서비스와 특성을 브로커에 요청 -&gt; 브로커가 연결</p>
</li>
<li><p>피어-투-피어 : 하나의 컴포넌트가 클라이언트 or 서버 둘다 가능(파일 공유 네트워크)</p>
</li>
<li><p>이벤트-버스 패턴 : 소스가 이벤트 메시지를 발행(퍼블리시)하면, 구독한 리스너들이 이벤트를 처리(알림 서비스)</p>
</li>
<li><p>블랙보드 패턴 : 모든 컴포넌트들이 블랙보드 &amp; 공유 데이터 저장소에 접근 가능(음성 인식, 차량 식별 등)</p>
</li>
<li><p>인터프리터 패턴 : 각 라인을 수행하는 방법을 지정, 기호마다 클래스를 갖도록 구성(번역기, 컴파일러, 인터프리터)</p>
</li>
</ul>
</li>
</ul>
<h3 id="3-객체-지향">3. 객체 지향</h3>
<ul>
<li>객체 지향 : SW의 각 요소를 객체로 만든 후 그 객체를 조립해 SW를 개발하는 기법<ul>
<li>객체 : 데이터 + 함수</li>
<li>클래스 : 공통된 속성 및 연산을 갖는 객체 집합</li>
<li>메시지 : 객체의 동작이나 연산을 일으키는 외부의 요구 사항</li>
<li>캡슐화 : 외부 접근 제한, 세부내용 은닉</li>
<li>상속 : 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려 받는 것</li>
<li>다형성 : 각각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 것</li>
<li>연관성 : 두 개 이상의 객체들이 상호 참조하는 관계<ul>
<li>is member of : 연관화, 상호 관련</li>
<li>is instance of : 분류화, 동일한 특성</li>
<li>is part of : 집단화, 하나의 상위 객체를 구성</li>
<li>is a : 일반화, 특수화/상세화</li>
</ul>
</li>
</ul>
</li>
<li>객체 지향 분석 : 객체, 속성, 연산, 관계 등을 정의하여 모델링하는 작업<ul>
<li>방법론<ul>
<li>럼바우 : 객동기<ul>
<li>객체 모델링 = 정보 모델링 : 객체 다이어그램으로 표시</li>
<li>동적 모델링 : 동적인 행위 표현</li>
<li>기능 모델링 : 자료 흐름도 이용</li>
</ul>
</li>
<li>부치 : 미시,거시</li>
<li>제이콥슨 : 유스케이스</li>
<li>코드와 요르돈 : E-R 다이어그램</li>
<li>Wirfs-Brock : 분석과 설계 간 구분 없음</li>
</ul>
</li>
</ul>
</li>
<li>SOLID : SRP(단일 책임), OCP(개방-폐쇄), LSP(리스코프 치환), ISP(인터페이스 분리), DIP(의존 역전)</li>
</ul>
<h3 id="4-모듈">4. 모듈</h3>
<ul>
<li>모듈 : 모듈화를 통해 분리된 시스템의 각 기능</li>
<li>결합도 : 자스제외공내<ul>
<li>내용(Content) : 직접 참조</li>
<li>공통(Common) : 공통 데이터 영역</li>
<li>외부(External) : 외부 다른 모듈</li>
<li>제어(Control) : 제어 요소를 전달</li>
<li>스탬프(Stamp) : 자료구조</li>
<li>자료(Data) : 자료 요소로만 구성</li>
</ul>
</li>
<li>응집도 : 우논시절교순기<ul>
<li>우연(Coincidental) : 서로 관련 없음</li>
<li>논리(Logical) : 유사한 성격이나 특정 형태</li>
<li>시간적(Temporal) : 특정 시간</li>
<li>절차(Procedural) : 순차적으로 수행</li>
<li>통신(Communication) : 동일한 입출력</li>
<li>순차적(Sequential) : 하나의 출력이 그 다음 입력</li>
<li>기능(Functional Cohesion) : 모든 기능 요소</li>
</ul>
</li>
<li>팬인/팬아웃 : 팬아웃은 나가는 화살표 숫자 팬인은 들어오는 숫자</li>
<li>N-S 차트 : 논리의 기술에 중점을 두고 도형을 이용해 표현하는 방법</li>
<li>단위 모듈 : 한 가지 동작을 수행하는 기능을 모듈로 구현한 것</li>
<li>IPC : 모듈 간 통신 방식을 구현하기 위해 사용되는 대표적 프로그래밍 인터페이스 집합<ul>
<li>대표 메소드 : 공유 메모리, 소켓, 세마포어, 파이프와 네임드 파이프, 메시지 큐잉</li>
</ul>
</li>
</ul>
<h3 id="5-테스트">5. 테스트</h3>
<ul>
<li><p>테스트 케이스 : 소프트웨어가 요구사항을 정확하게 준수했는지 확인하기 위핸 테스트 항목에 대한 명세서</p>
</li>
<li><p>공통 모듈 명세 기법의 종류:</p>
<ul>
<li>정확성, 명확성, 완전성(모든 것을 기술), 일관성(상호 충돌 안나게 작성), 추적성</li>
</ul>
</li>
<li><p>재사용 : 이미 개발된 기능들을 새로운 시스템이나 기능 개발에 사용하기 적합하도록 최적화하는 작업</p>
<ul>
<li>함수와 객체 단위</li>
<li>컴포넌트 단위</li>
<li>애플리케이션 단위</li>
</ul>
</li>
<li><p>코드 주요 기능 : 식별, 분류, 배열, 표준화, 간소화</p>
<ul>
<li><p>종류</p>
<ul>
<li><p>순차 코드 1 2 3 4</p>
</li>
<li><p>블록 코드 1001~1100</p>
</li>
<li><p>10진 코드 1000 : 공학, 2000 : 문학...</p>
</li>
<li><p>그룹 분류 코드 1-01-001 : 본사-총무부-인사계</p>
</li>
<li><p>연상 코드 TV-40 40인치 TV</p>
</li>
<li><p>표의 숫자 코드 120-720-1500 : 두께X폭X길이</p>
</li>
<li><p>합성 코드 : 연상코드 + 순차코드 등 2개 이상 코드 조합(KE-711 댄공 711기)</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="6-디자인-패턴">6. 디자인 패턴</h3>
<ul>
<li>디자인 패턴 : 모듈 간의 관계 및 인터페이스를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제<ul>
<li>생성<ul>
<li>추상 팩토리 : 연관 서브 클래스, 서로 연관-의존하는 객체 그룹</li>
<li>빌더 : 객체의 생성 과정과 표현 방법을 분리, 인스턴스 건축하듯 조합</li>
<li>팩토리 메소드 : 가상 생성자 패턴, 객체 생성을 서브 클레스에서 처리하도록 분리해 캡슐화<ul>
<li>상위 클래스에서 인터페이스만 정의, 실제 생성은 서브 클래스 담당</li>
</ul>
</li>
<li>프로토타입 : 원본 객체를 복제해 객체 생성, 비용 큰 경우</li>
<li>싱글톤 : 인스턴스가 하나뿐임을 보장. 생성된 객체를 어디서든 참조</li>
</ul>
</li>
<li>구조<ul>
<li>어댑터 : 호환성이 없는 클래스의 인터페이스를 다른 클래스가 이용할 수 있도록 변환<ul>
<li>기존 클래스 이용 원하지만 인터페이스가 일치하지 않을 때 이용</li>
</ul>
</li>
<li>브리지 : 구현부에서 추상층을 분리, 기능과 구현을 두 개의 별도 클래스로 구현</li>
<li>컴포지트 : 복합 객체와 단일 객체를 구분없이 다루고자 사용. 객체를 트리 구조로 구성</li>
<li>퍼케이드 : Wrapper 객체 필요. 서브 클래스 상위에 인터페이스 구현. 서브클래스 기능 간편 사용</li>
<li>플라이웨이트 : 가능한 한 공유해서 사용해 메모리 절약. 다수의 유사 객체를 생성하거나 조작할 때 유용</li>
<li>프록시 : 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할 수행. 네트워크 연결 등에 사용</li>
</ul>
</li>
<li>행위는 생략</li>
</ul>
</li>
</ul>
<h3 id="7-기타">7. 기타</h3>
<ul>
<li>서버 개발 프레임워크 : 대부분 MVC 기반.<ul>
<li>CodeIgniter : PHP 기반.</li>
<li>Ruby on Rails : Ruby 기반</li>
</ul>
</li>
<li>API : 라이브러리를 이용할 수 있도록 규칙 등을 정의해 놓은 인터페이스<ul>
<li>공개 API를 Open API라고 함</li>
</ul>
</li>
<li>배치 프로그램 : 여러 작업들을 미리 정해진 일련의 순서에 따라 일괄적으로 처리하도록 만든 프로그램<ul>
<li>대용량 데이터, 자동화, 견고성, 안정성/신뢰성, 성능이 꼭 필요</li>
<li>배치 스케줄러 : 스프링 배치, Quartz, Cron이 있음</li>
</ul>
</li>
</ul>
<h1 id="7단원--애플리케이션-테스트-관리">7단원 : 애플리케이션 테스트 관리</h1>
<h3 id="1-애플리케이션-테스트">1. 애플리케이션 테스트</h3>
<h4 id="테스트-종류">테스트 종류</h4>
<ul>
<li><p>애플리케이션 테스트 : 결함 찾아내는 행위 또는 절차</p>
<ul>
<li>검증 테스트 : 개발자 입장에서 테스트</li>
<li>확인 테스트 : 사용자 입장에서 테스트</li>
<li>기본 원리 :<ul>
<li>파레토 법칙 : 20-80, 일부에 집중됨</li>
<li>살충제 패러독스 : 동일한 TC로 여러 번 테스트하다보면 결함이 더 이상 발견되지 않음</li>
<li>오류-부재의 궤변 : 결함이 없어도 요구사항 만족 못하면 품질 높은 것 아님</li>
</ul>
</li>
</ul>
</li>
<li><p>테스트 기반에 따른 테스트</p>
<ul>
<li>명세 기반 테스트<ul>
<li>동등 분할, 경계값 분석</li>
</ul>
</li>
<li>구조 기반 테스트<ul>
<li>구문 기반, 결정 기반, 조건 기반</li>
</ul>
</li>
<li>경험 기반 테스트<ul>
<li>에러 추정, 체크 리스트, 탐색적 테스팅</li>
</ul>
</li>
</ul>
</li>
<li><p>목적에 따른 테스트</p>
<ul>
<li>회복 테스트 : 여러가지 결함을 주고 복구되는지 확인</li>
<li>안전 테스트 : 침입으로부터 보호하는지 확인</li>
<li>강도 테스트 : 과부하</li>
<li>성능 테스트 : 응답시간, 처리량 테스트</li>
<li>구조 테스트 : 논리 경로, 복잡도 평가</li>
<li>회귀 테스트 : 변경 또는 수정시 결함 없는지 확인. 이미 테스트된 프로그램의 테스팅을 반복.</li>
<li>병행 테스트 : 변경 후와 변경 전 소프트웨어에 동일한 데이터 입력하고 비교</li>
</ul>
</li>
<li><p>정적 테스트 : 프로그램 실행 X</p>
<ul>
<li>워크스루</li>
<li>인스펙션</li>
</ul>
</li>
<li><p>동적 테스트 : 프로그램 실행</p>
<ul>
<li>화이트박스 테스트 : 원시 코드를 오픈, 모든 논리적 경로를 테스트<ul>
<li>기초 경로 검사</li>
<li>제어 구조 검사<ul>
<li>조건 검사, 루프 검사, 데이터 흐름 검사</li>
</ul>
</li>
<li>검증 기준<ul>
<li>분기 검증 기준 = 결정 검증 기준 : 모든 <strong>조건문</strong> True와 False인 경우를 모두 한 번 씩 수행</li>
<li>조건 검증 기준 : 개별 <strong>조건식</strong> 결과를 확인</li>
</ul>
</li>
</ul>
</li>
<li>블랙박스 테스트 : 기능 테스트라고도 함. 사용자의 요구사항 명세를 보면서 테스트.<ul>
<li>동치 분할 검사 : 타당한 입력 자료와 타당하지 않은 입력 자료 개수를 균등하게 입력</li>
<li>경계값 분석 : 조건의 경계값을 테스트</li>
<li>원인-효과 그래프 검사 : 입력과 출력 모두를 체계적으로 분석해 효용성이 높은 TC를 선정해 검사</li>
<li>오류 예측 검사 : 경험에 의한 검사</li>
<li>비교 검사 : 여러 버전의 프로그램에 동일한 TC를 제공(병행 테스트와 비슷)</li>
</ul>
</li>
</ul>
</li>
<li><p>개발 단계에 따른 테스트</p>
<ul>
<li>단위 테스트 : 모듈이나 컴포넌트에 초점을 맞춰 테스트, 구조 기반 테스트를 주로 시행</li>
<li>통합 테스트 : 단위 테스트가 완료된 모듈들을 결합하여 하나의 시스템으로 완성시키는 과정에서의 테스트<ul>
<li>비점진적 통합 방식 : 모든 모듈이 미리 결합되어 있는 프로그램 전체를 테스트</li>
<li>점진적 통합 방식 : 모듈 단위로 단계적으로 통합<ul>
<li>하향식 통합 : 상위 모듈에서 하위 모듈 방향으로 통합. 제어 모듈의 종속 모듈은 스텁으로 대체</li>
<li>상향식 통합 : 하위-&gt;상위, 더미 모듈인 드라이버를 작성. 하위 모듈은 클러스터로 결합</li>
<li>혼합식 통합 = 샌드위치식 통합 : 하위 수준에서는 상향, 상위 수준에서는 하향.</li>
</ul>
</li>
</ul>
</li>
<li>시스템 테스트 : 개발된 소프트웨어가 완벽하게 수행되는가를 점검</li>
<li>인수 테스트 : 사용자의 요구사항을 충족하는 지 점검<ul>
<li>알파 테스트 : 사용자가 개발자 앞에서 행하는 테스트, 통제된 환경</li>
<li>베타 테스트 : 실업무를 가지고 사용자가 직접 테스트</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="테스트-케이스">테스트 케이스</h4>
<ul>
<li><p>테스트 케이스 : 테스트 항목에 대한 명세서. 사용자의 요구사항을 정확하게 준수했는지 확인하기 위해 설계.</p>
</li>
<li><p>테스트 시나리오 : 테스트 케이스 묶은 집합</p>
</li>
<li><p>테스트 오라클 : 사전에 정의된 참값을 대입하여 비교하는 기법</p>
<ul>
<li>참, 샘플링, 휴리스틱(추정), 일관성(변경 있을 때 수행 전과 수행 후 결과 값 동일한지 확인)</li>
</ul>
</li>
<li><p>테스트 자동화 도구</p>
<ul>
<li>정적 실행 도구</li>
<li>테스트 실행 도구 : 스크립트 언어 사용</li>
<li>성능 테스트 도구 : 처리량, 응답 시간, 경과 시간, 자원 사용률 테스트<ul>
<li>JMeter(다양한 프로토콜 지원), LoadUI(Drag&amp;Drop 등 편리성 강화), OpenSTA</li>
</ul>
</li>
<li>테스트 통제 도구</li>
<li>테스트 하네스 도구 : 애플리케이션의 컴포넌트 및 모듈을 테스트 하기 위해 생성된 코드와 데이터<ul>
<li>드라이버, 스텁, 슈트, 케이스, 스크립트, 목 오브젝트로 구성</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="결함">결함</h4>
<ul>
<li>결함 : 개발자가 설계한 것과 다르게 동작하거나 다른 결과가 발생되는 것</li>
<li>결함 상태 추적 : 테스트에서 발견된 결함은 지속적으로 상태 변화를 추적하고 관리<ul>
<li>분포, 추세, 에이징을 측정해 추적</li>
</ul>
</li>
<li>결함 분류 : 시스템 결함, 기능 결함, GUI 결함, 문서 결함</li>
<li>결함 심각도 : High, Medium, Low / Critical, Major, Normal, Minor, Simple</li>
<li>결함 우선순위 : Critical, High, Medium, Low / 즉시 해결, 주의 요망, 대기, 개선 권고</li>
</ul>
<h4 id="모니터링">모니터링</h4>
<ul>
<li>시스템 모니터링 : 자원 사용량 확인 및 분석 도구<ul>
<li>Scouter, Zabbix</li>
</ul>
</li>
<li>복잡도/시간 복잡도<ul>
<li>빅 오 표기법</li>
</ul>
</li>
<li>순환 복잡도 : 논리적인 복잡도를 측정하기 위한 소프트웨어<ul>
<li>V(G) = E-N+2(화살표 수-노드 수+2)</li>
</ul>
</li>
</ul>
<h4 id="최적화">최적화</h4>
<ul>
<li>소스 코드 최적화 : 클린 코드로 작성하는 것<ul>
<li>클린 코드 작성 원칙 : 가독성, 단순성, 의존성 배제, 중복성 최소화, 추상화</li>
</ul>
</li>
<li>나쁜 코드의 예<ul>
<li>스파게티 코드 : 코드의 로직이 서로 복잡하게 얽힘</li>
<li>외계인 코드 : 아주 오래되거나 참고문서/개발자가 없어 유지보수가 어려운 코드</li>
</ul>
</li>
<li>소스 코드 품질 분석 도구<ul>
<li>정적 분석 도구 : pmd, cppcheck, SonarQube, checkstyle 등</li>
<li>동적 분석 도구 : Avalanche, Valgrind 등</li>
</ul>
</li>
</ul>
<h1 id="9단원--소프트웨어-개발-보안-구축">9단원 : 소프트웨어 개발 보안 구축</h1>
<ul>
<li><p>Secure SDLC : SDLC + 보안</p>
<ul>
<li>CLASP : SDLC의 초기 단계에서 보안 강화하기 위해 개발된 방법론</li>
<li>SDL : MS社에서 제안한 방법론</li>
<li>Seven Touchpoints : 모범사례를 SDLC에 통합한 방법론</li>
</ul>
</li>
<li><p>소프트웨어 개발 보안 요소</p>
<ul>
<li>기밀성 : 인가된 사용자에게만 접근 허용, 전송 중 노출되어도 데이터 읽기 불가</li>
<li>무결성 : 인가된 사용자만 수정 가능</li>
<li>가용성 : 인가된 사용자는 언제든 정보와 자원 사용 가능</li>
<li>인증 : 합법적인 사용자인지 확인하는 모든 행위<ul>
<li>지식 기반, 소유 기반, 생체 기반, 위치 기반, 행위 기반</li>
</ul>
</li>
<li>부인 방지 : 송, 수신 사실을 부인할 수 없도록 증거를 제공</li>
</ul>
</li>
<li><p>시큐어 코딩 : 보안 요소를 고려하여 코딩하는 것</p>
</li>
<li><p>세션 통제 : 세션의 연결과 연결로 인해 발생하는 정보를 관리하는 것</p>
</li>
<li><p>입력 데이터 검증 및 표현 관련 용어</p>
<ul>
<li>경로 순회 : 기호를 악용하여 허가되지 않은 파일에 접근</li>
<li>스크립트 : 소프트웨어를 수행하는데 필요한 처리 절차가 기록된 텍스트<ul>
<li>asp, jsp, php</li>
</ul>
</li>
</ul>
</li>
<li><p>SQL 삽입 : 내부 DB 서버의 데이터를 유출 및 변조, 관리자 인증을 우회하는 보안 약점</p>
</li>
<li><p>XSS : 악의적인 스크립트를 삽입해 정보를 탈취하거나 비정상적인 기능 수행 유발</p>
</li>
<li><p>메모리 버퍼 오버 플로 : 할당된 메모리 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 때 유발</p>
</li>
<li><p>보안 기능 관련 용어</p>
<ul>
<li>HTTPS : HTTP + 암호 통신 규약</li>
<li>SSL(Secure Sockets Layer) : TCP/IP 계층과 애플리케이션 사이에 위치하여 인증, 암호화, 무결성 보장</li>
<li>하드 코딩 : 데이터를 코드 내부에 직접 입력</li>
</ul>
</li>
<li><p>TOCTOU 경쟁 조건 : 검사 시점과 사용 시점을 고려하지 않고 코딩하는 경우 발생하는 보안 약점</p>
</li>
<li><p>널 포인터 역참조 : 널 포인터가 가리키는 메모리 위치에 값을 저장할 때 발생하는 보안 약점</p>
<ul>
<li>스택 가드 : 복귀 주소와 변수 사이에 특정 값 저장 후 그 값이 변경되면 오버플로우 상태로 판단해 실행 중단</li>
</ul>
</li>
<li><p>접근 제어자 : Public -&gt; Protected -&gt; Default -&gt; Private</p>
</li>
<li><p>개인 키 암호화 기법 : 동일한 키로 데이터를 암호화-복호화</p>
<ul>
<li>스트림 암호화 방식 : 평문과 동일한 길이의 스트림을 생성해 비트 단위로 암호화, LFSR, RC4</li>
<li>블록 암호화 방식 : 한 번에 하나의 데이터 블록을 암호화 하는 방식, DES, SEED, AES, ARIA<ul>
<li>SEED : KISA, 1999년, 128비트</li>
<li>ARIA : 국정원+산학연협회, 2004년, AES 알고리즘 규격</li>
<li>DES : 미국 NBS, 1975년, 64비트, 3번 적용한 3DES가 있음</li>
<li>AES : 미국 NIST, 2001년, 128비트, 키 길이에 따라 AES-128, AES-192 등으로 분류</li>
</ul>
</li>
</ul>
</li>
<li><p>공개 키 암호화 기법 : 공개키로 암호화, 비밀키로 복호화</p>
<ul>
<li>RSA : 라이베스트+샤미르+애들먼, 큰 수 소인수분해 하기 어렵다는 점에서 착안</li>
</ul>
</li>
<li><p>해시 : 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환</p>
<ul>
<li>SHA시리즈, HAVAL, MD4, MD5, N-NASH, SNEFRU 등</li>
<li>SHA 시리즈 : 미국 국가 안보국(NSA), NIST 발표, SHA-512까지 발표됨</li>
<li>MD5 : 1991년 라이베스트가 MD4를 대체하기 위하 고안. 512비트</li>
<li>N-NASH : 일본NTT에서 발표. 128비트</li>
<li>SNEFRU : 머클이 1990년 발표. 32비트 프로세스에서 구현 용이하게 할 목적.</li>
</ul>
</li>
<li><p>TKIP : WEP의 취약성을 보완한 데이터 보안 프로토콜</p>
</li>
<li><p>보안 아키텍처 : 보안 요소 및 보안 체계를 식별하고 이들 간의 관계를 정의한 구조</p>
</li>
<li><p>보안 프레임워크 : 안전한 정보 시스템 환경을 유지하고 보안 수준을 향상시키기 위한 체계, ISO 27001, BS7799 기반</p>
</li>
<li><p>방화벽 : 정보 선별, 수용/거부/수정 기능 가진 침입 차단 시스템</p>
</li>
<li><p>침입 탐지 시스템</p>
<ul>
<li>오용 탐지 : 이미 입력해 둔 공격 패턴을 감지</li>
<li>이상 탐지 : 평균적인 시스템 상태를 기준으로 이상함을 감지</li>
</ul>
</li>
<li><p>침입 방지 시스템 : 비정상적인 트래픽을 능동적으로 차단하고 격리하는 보안 솔루션. </p>
<ul>
<li>방화벽+침입 탐지 시스템</li>
</ul>
</li>
<li><p>데이터 유출 방지(DLP) : 내부 정보의 외부 유출을 방지하는 보안 솔루션</p>
</li>
<li><p>웹 방화벽 : SQL 삽입 공격, XSS 등 웹 기반 공격을 방어할 목적으로 만들어진 웹 서버에 특화된 방화벽</p>
</li>
<li><p>VPN : 마치 자신의 전용 회선을 사용하는 것처럼 해주는 보안 솔루션</p>
<ul>
<li>암호화된 규격을 통해 인터넷망을 전용선의 사설망을 구축한 것처럼 이용.</li>
</ul>
</li>
<li><p>NAC : Network Access Control, 내부 PC의 MAC 주소를 IP 관리 시스템에 등록한 후 일관된 보안 관리 기능을 제공</p>
</li>
<li><p>ESM : Enterprise Security Management, 다양한 장비에서 발생하는 로그 및 보안 이벤트를 통합하여 관리</p>
</li>
<li><p>AAA : 인증(Authenticcation), 인가(Authorization), 과금(Accounting)</p>
</li>
<li><p>정보보호관리체계(ISMS) : 우리나라는 KISA에서 운영. 정보 자산을 안전하게 보호하기 위한 보호 절차와 대책</p>
</li>
<li><p>서비스 거부 공격</p>
<ul>
<li>Ping of death : 패킷 크기를 허용 범위 이상으로 전송</li>
<li>SMURFING : 엄청난 양의 데이터를 집중적으로 보냄(IP, ICMP 특성 악용)</li>
<li>SYN Flooding : 3-way-handshake를 의도적으로 중단시킴</li>
<li>TearDrop : Fragment Offset 값을 의도적으로 변경시켜 과부하를 발생시킴</li>
<li>LAND Attack : 송신, 수신 IP 주소를 모두 같게 해서 무한하게 응답하게 해서 과부하 발생</li>
<li>DDos(분산 서비스 거부)  : 좀비PC를 이용해 여러 곳에서 분산 공격 시행<ul>
<li>이용 툴 : Trin00, TFN, TFN2k, Stacheldraht</li>
</ul>
</li>
</ul>
</li>
<li><p>세션 하이재킹 : 클라이언트 사이의 세션 정보를 가로채는 공격 기법</p>
<ul>
<li>3-way-handshake 과정에 끼어드는 TCP 세션 하이재킹이 대표적</li>
</ul>
</li>
<li><p>ARP Spoofing : ARP 취약점 이용. 자신의 MAC을 공격 대상의 것으로 변조. 패킷을 가로채거나 방해함</p>
<ul>
<li>ARP : IP -&gt; MAC으로 바꿔주는 프로토콜</li>
</ul>
</li>
<li><p>스니핑 : 네트워크 중간에서 남의 패킷 정보를 도청</p>
</li>
<li><p>워터링 홀 : 웹사이트를 사전에 감염</p>
</li>
<li><p>키로거 공격 : 키보드 움직임을 탐지</p>
</li>
<li><p>랜섬웨어 : 돈 요구하는 등 내부 문서나 파일을 암호화</p>
</li>
<li><p>백도어 : 시스템 설계자가 액세스 편의를 위해 시스템 보안을 제거하여 만들어 놓은 비밀 통로</p>
<ul>
<li>탐지 방법 : 무결성 검사, 열린 포트 확인, 로그 분석, SetUID 파일 검사 등</li>
</ul>
</li>
<li><p>기타 용어</p>
<ul>
<li>스미싱</li>
<li>스피어 피싱 : 특정 대상을 선정해 계속 이메일 발송</li>
<li>APT : 지능형 지속 위협, 조직적으로 공격하는 것</li>
<li>무작위 대입 공격(브루트 포스 공격) : 계속 모든 값을 대입</li>
<li>큐싱 : QR+피싱</li>
<li>WEP : 유선급 프라이버시, LAN급의 보안과 프라이버시 수준의 무선 랜 보안 프로토콜</li>
<li>WPA2 : 무선랜 보안 기술 규격(WEP 취약성 대안)</li>
<li>EDR : 엔드포인트 영역 모니터링</li>
<li>TMS : 전사적 IT 인프라에 대한 위협정보를 관리하는 정보보호 통합관리 시스템</li>
<li>DTLS : SSL/TLS와 유사한 보안 기능, UDP 기반</li>
<li>크리덴셜 스터핑 : 이미 확보해놓은 로그인 자격 증명을 다른 계정에 무작위로 대입</li>
<li>POODLE : TLS 연결을 SSL 3.0으로 낮춰 그 취약점을 이용해 암호문 해독</li>
<li>DDE : 오피스에서 앱에 데이터 전달하는 프로토콜. 일반 문서로 위장한 악성 코드에 대한 취약점 존재.</li>
<li>좀비 PC + C&amp;C 서버 + 봇넷</li>
<li>웜</li>
<li>제로데이 공격 : 취약점 존재 자체가 공표되기도 전에 이미 공격하는 것</li>
<li>트로이 목마</li>
<li>CC(Common Criteria) 인증 : 국제적인 정보보안 평가기준</li>
<li>멀버타이징 : 멀웨어 + 광고(Advertising)</li>
<li>정보공유분석센터(ISAC) : 취약점과 그 대응방안에 대한 정보를 제공하고, 실시간 경보 및 분석체계 운영</li>
<li>BCP(업무 연속성 계획) : RTO, RPO, 업무 영향 분석(BIA) 실시해 비즈니스 연속성을 보장하기 위한 계획</li>
<li>데이터 디들링 : 처리할 자료를 다른 자료와 바꿔서 처리하는 것</li>
<li>비트 로커 : 윈도우 전용 볼륨 암호화 기능, TPM+ASE-128</li>
<li>공급망 공격 : 소프트웨어 공급망에 침투하여 악성코드를 배포.</li>
</ul>
</li>
</ul>
<h1 id="11단원--응용-sw-기초-기술-활용">11단원 : 응용 SW 기초 기술 활용</h1>
<h3 id="1-운영체제">1. 운영체제</h3>
<ul>
<li>운영체제(OS) : 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임.<ul>
<li>목적 :<ul>
<li>처리능력 향상</li>
<li>반환시간 감소</li>
<li>사용 가능도 향상</li>
<li>신뢰도 향상</li>
</ul>
</li>
<li>UNIX : 대부분 C언어, 트리 구조 파일 시스템, 1960년대 개발, 시분할 시스템(TIme Sharing System)<ul>
<li>커널(프로그램과 하드웨어 간 인터페이스 담당), 쉘(시스템과 사용자 간 인터페이스 담당)로 구성</li>
</ul>
</li>
<li>LINUX : 리누스 토발즈 개발<ul>
<li>cat 파일 내용 표시, cp 파일 복사, rm 파일 삭제, find 파일 찾음, mv 파일 이동</li>
<li>chown 파일 소유자와 그룹 변경</li>
<li>kill 프로세스를 종료, fork 새로운 프로세스 생성, ps 현재 실행중인 프로세스 표시</li>
<li>ls 파일 목록 표시</li>
<li>mkdir 디렉토리 생성, rmdir 디렉토리 삭제, cd 디렉토리 위치 변경, pwd 현재 작업중인 디렉토리 경로 표시</li>
<li>who 현재 접속 중인 사용자 표시</li>
<li>chmod<ul>
<li>8진법 숫자를 이용한 방법으로 파일 보호 모드 설정</li>
<li>rwx 순(read, write, x는 실행)으로 8진법으로 숫자 변경해서 표현</li>
<li>111은 7, 101은 5같은 식</li>
<li>chmod 775 a.txt =&gt; a라는 파일에 사용자는 읽쓰실 모두, 그룹은 읽실, 기타는 실행만 허가</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="2-기억장치">2. 기억장치</h3>
<ul>
<li>기억장치 관리<ul>
<li>반입 전략 : 언제 주기억장치로 프로그램이나 데이터를 적재할 것인지를 결정<ul>
<li>요구 반입 : 요구할 때 적재</li>
<li>예상 반입 : 미리 예상하여 적재</li>
</ul>
</li>
<li>배치 전략<ul>
<li>최초 적합 : 빈 곳 중 첫 번째</li>
<li>최적 적합 : 단편화 가장 작게 남기는 것</li>
<li>최악 적합 : 단편화 가장 많이 남기는 것</li>
</ul>
</li>
</ul>
</li>
<li>주기억장치 할당 기법 : 주기억장치에 프로그램이나 데이터를 실행시키기 위해 어떻게 할당할 지 결정<ul>
<li>연속 할당 : 연속으로 할당<ul>
<li>단일 분할 할당 : 한순간에는 오직 한 명의 사용자만이 주기억장치의 사용자 영역을 사용<ul>
<li>오버레이 기법 : 주기억장치보다 큰 사용자 프로그램을 사용하기 위한 기법</li>
<li>스와핑 기법 : 하나의 프로그램 전체를 주기억장치에 할당하여 사용하다가 필요에 따라 다른 프로그램과 교체 </li>
</ul>
</li>
<li>다중 분할 할당<ul>
<li>고정 분할 할당 기법 = 정적 할당 기법 : 사용자 영역을 여러 개의 고정된 크기로 분할. 각 영역에 할당하여 수행</li>
<li>가변 분할 할당 기법 = 동적 할당 기법 : 프로그램을 주기억장치에 적재하면서 필요한 만큼의 크기로 영역을 분할<ul>
<li>고정 분할 할당 기법의 단편화를 줄이기 위해 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>분산 할당 : 특정 단위 조각으로 나누어 분산하여 할당. 가상기억장치 사용<ul>
<li>가상기억장치(Virtual Memory) : 보조기억장치의 일부를 주기억장치처럼 사용하는 것.</li>
<li>페이징 기법 : 프로그램과 주기억장치의 영역을 동일한 크기로 나눈 후 주기억장치 영역에 프로그램 적재 후 실행<ul>
<li>일정한 크기로 나눈 단위를 <strong>페이지</strong>라고 하고, 이 페이지 크기로 나누어진 주기억장치 단위를 <strong>페이지 프레임</strong>이라고 함.</li>
<li>페이지 교체 알고리즘<ul>
<li>페이지 부재가 발생하면 어떤 페이지 프레임을 선택하여 교체할 것인지 결정해야 함</li>
<li>OPT : Optimal replacement(최적 교체) : 앞으로 가장 오랫동안 사용하지 않을 페이지를 교체. 가장 효율적</li>
<li>FIFO : 선납선출</li>
<li>LRU : Least Recently Use, 최근에 가장 오랫동안 사용하지 않은 페이지를 교체</li>
<li>LFU : Least Frequently Use, 사용 빈도가 가장 적은 페이지를 교체</li>
<li>NUR : Not Used Recently, 최근에 사용하지 않은 페이지를 교체<ul>
<li>참조 비트와 변형 비트를 사용해 최근 사용 여부를 확인</li>
</ul>
</li>
<li>SCR : Second Chance Replacement(2차 기회 교체), 가장 오랫동안 주기억장치에 있던 페이지 중 자주 사용되는 페이지의 교체를 방지하기 위한 기법</li>
</ul>
</li>
<li>Localty(국부성, 지역성, 구역성, 국소성) : 프로세스 실행 중 주기억장치 참조 시 일부 페이지만 집중적으로 참조<ul>
<li>시간 구역성 : 일정 시간 동안 하나의 페이지를 집중적으로 액세스</li>
<li>공간 구역성 : 일정 위치의 페이지를 집중적으로 액세스</li>
<li>워킹 셋 이론의 기반<ul>
<li>워킹 셋 : 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>세그멘테이션 기법 : 프로그램을 다양한 크기의 논리적인 단위로 나눈 후 주기억장치에 적재시켜 실행<ul>
<li>논리적인 크기로 나눈 단위를 세그먼트라고 하고, 각 세그먼트는 고유한 이름과 크기를 가짐.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="3-프로세스">3. 프로세스</h3>
<ul>
<li>스래싱 : 프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상</li>
<li>프로세스 : 실행중인 프로그램<ul>
<li>PCB를 가진 프로그램, 실기억장치에 저장된 프로그램, 디스패치가 가능한 단위, 프로시저가 활동중인 것...</li>
</ul>
</li>
<li>PCB(프로세스 제어 블록) : 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓은 곳<ul>
<li>프로세스 현재 상태, 포인터, 프로세스 고유 식별자, CPU 레지스터 정보, 주기억장치 관리 정보, 입출력 상태 정보, 계정 정보</li>
</ul>
</li>
<li>프로세스 상태 전이 :<ul>
<li>제출-&gt;접수-&gt;(디스크)-&gt;(준비-&gt;실행-&gt;대기)-&gt;종료</li>
<li>디스패치 : 준비 상태에서 실행 상태로 전이</li>
<li>Wake Up : 대기 상태에서 준비 상태로 전이</li>
<li>스풀링 : 디스크에 입출력 데이터를 일단 저장해 두는 것</li>
</ul>
</li>
<li>스레드 : 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위 또는 프로세스 내 작업 단위<ul>
<li>경량 프로세스라고도 함.</li>
</ul>
</li>
<li>스케줄링 : 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업<ul>
<li>비선점 스케줄링 : 강제로 못 뺏는 경우<ul>
<li>FCFS(선입선출) : 오는대로 할당</li>
<li>SJF : 짧은 것부터 할당, 대기시간은 앞 프로세스의 반환 시간. 반환시간은 프로세스의 대기 시간+실행시간</li>
<li>HRN : 우선순위를 부여. 공식은 (대기 시간+서비스시간)/서비스시간</li>
</ul>
</li>
<li>선점 스케줄링 : 강제로 빼앗을 수 있는 경우<ul>
<li>Round Robin, SRT, 선점 우선순위, 다단계 큐, 다단계 피드백 큐 등</li>
</ul>
</li>
</ul>
</li>
<li>환경변수 : 시스템 소프트웨어의 동작에 영향을 미치는 동적인 값들의 모임</li>
</ul>
<h3 id="4-네트워크">4. 네트워크</h3>
<ul>
<li>IP 주소<ul>
<li>IPv4  : 8x4 = 32비트로 구성, A~E클래스로 네트워크 부분 길이를 구성</li>
<li>IPv6 : 16x8 = 총 128비트로 구성, 인증성, 기밀성, 데이터 무결성 지원해 보안 문제 해결<ul>
<li>유니캐스트(1:1), 멀티캐스트(1:다), 애니캐스트(가장 가까운 사람과 1:1)</li>
</ul>
</li>
</ul>
</li>
<li>서브네팅 : 할당된 네트워크 주소를 다시 여러 개의 작은 네트워크로 나누어 사용<ul>
<li>4바이트의 IP 주소 중 네트워크 주소와 호스트 주소를 구분하기 위한 비트를 <strong>서브넷 마스크</strong>라고 함.</li>
</ul>
</li>
<li>도메인 네임 : 숫자로 된 IP 주소를 사람이 이해하기 쉬운 문자 형태로 표현<ul>
<li>도메인 네임 -&gt; IP 주소로 변환해 주는 시스템을 DNS라고 함</li>
</ul>
</li>
<li>OSI 참조 모델<ul>
<li>물리 : 실제 접속과 절단 등 기계적, 전기적, 기능적, 절차적 특성</li>
<li>데이터링크 : 시스템 간 연결 설정과 유지 및 종료</li>
<li>네트워크 : 개방 시스템들 간의 네트워크 연결을 관리하는 기능과 데이터 교환 및 중계</li>
<li>전송 : End-toEnd 간에 투명한 데이터 전송을 가능하게 함</li>
<li>세션 : 송수신 측 간의 관련성을 유지, 대화 제어</li>
<li>표현 : 서로 다른 데이터 표현 형태를 갖는 시스템 간의 상호 접속을 위해 필요한 계층<ul>
<li>코드 변환, 데이터 암호화, 데이터 압축, 구문 검색 기능 수행</li>
</ul>
</li>
<li>응용 : 사용자가 OSI환경에 접근할 수 있도록 서비스 제공</li>
</ul>
</li>
<li>네트워크 관련 장비<ul>
<li>라우터 : LAN과 LAN 연결+최적 경로 선택. LAN과 WAN을 연결하는 기능도 지원</li>
<li>리피터 : 디지털 신호의 장거리 전송을 위해 수신 신호 재생 or 출력 전압 높여 전송</li>
<li>허브 : 리피터 역할 포함, 가까운 거리의 컴퓨터들을 연결하는 장치</li>
<li>브리지 : Lan과 LAN 연결.<ul>
<li>브리지가 n개일 때 서브넷 구성 시 전송 가능한 회선 수는 n(n-1)/2개</li>
</ul>
</li>
<li>게이트웨이 : OSI 전 계층의 프로토콜 구조가 다른 네트워크를 연결하는 장치<ul>
<li>데이터 출입구 역할을 함</li>
</ul>
</li>
</ul>
</li>
<li>프로토콜 : 데이터 교환을 원활하게 수행할 수 있도록 표준화시켜 놓은 통신 규약<ul>
<li>구문(데이터 형식), 의미(제어 정보), 시간(통신 속도)으로 구성</li>
</ul>
</li>
<li>패킷 교환 방식 : 메시지를 일정한 길이의 패킷으로 잘라서 전송하는 방식<ul>
<li>가상 회선 방식 : 가상 통신 회선을 미리 설정, 정보 전송 전 제어 패킷에 의해 경로가 설정됨. 패킷 송수신 순서가 같음.</li>
<li>데이터그램 방식 : 연결 경로 설정 X, 인접한 노드들의 트래픽을 감안해 독립적으로 운반. 전송 경로와 송수신 순서 매번 다름.</li>
</ul>
</li>
<li>TCP/IP : 서로 다른 기종의 컴퓨터들이 데이터를 주고 받을 수 있도록 하는 표준 프로토콜<ul>
<li>TCP : 전송 계층에 해당. 양방향 연결 서비스 제공. 가상 회선 방식 기반.</li>
<li>IP : 네트워크 계층 해당. 비연결형 서비스 제공. 데이터그램 방식 기반.</li>
</ul>
</li>
<li>UDP : 데이터 전송 전에 연결을 설정하지 않는 비연결형 서비스 제공.<ul>
<li>실시간 전송에 유리</li>
</ul>
</li>
<li>RTCP : RTP(Real-time Transport Protocol) 패킷의 전송 품질을 제어하기 위한 제어 프로토콜<ul>
<li>세션에 참여한 각 참여자들에게 주기적으로 제어 정보를 전송</li>
</ul>
</li>
<li>ICMP(Internet Control Message Protocol) : IP와 조합, 통신 중에 발생하는 오류 처리 및 전송 경로 변경 등을 위한 제어 메시지 관리</li>
<li>ARP/RARP <ul>
<li>ARP : IP -&gt; MAC</li>
<li>RARP : MAC -&gt; IP</li>
</ul>
</li>
<li>네트워크 신기술<ul>
<li>메시 네트워크 : 대규모 디바이스의 네트워크 생성</li>
<li>피코넷 : 여러 개의 독립된 통신장치가 통신망 형성</li>
<li>애드 훅 네트워크 : 재난 현장 같이 고정된 유선망 구축 불가시 모바일 호스트만 이용해 구성한 네트워크</li>
<li>파장 분할 다중화 : 광섬유를 이용한 통신기술. 여러 대의 단말기가 동시에 통신 회선 사용 가능</li>
<li>SDDC(소프트웨어 정의 데이터센터) : 모든 자원을 소프트웨어 조작만으로 관리 및 제어되는 데이터 센터 의미</li>
<li>LOD(개방형 링크드 데이터) : Linked Data와 Open Data의 합성어. 누구나 사용할 수 있도록 웹 상에 공개된 연계 데이터<ul>
<li>개별 URI로 식별하고 각 URI에 링크 정보를 부여해 상호 연결 웹을 지향</li>
</ul>
</li>
<li>IoT : 실세계와 가상 세계의 다양한 사물들을 인터넷으로 서로 연결</li>
<li>클라우드 컴퓨팅 : 언제 어디서나 인터넷을 통해 컴퓨터 작업을 수행할 수 있는 가상화된 환경</li>
<li>USN(유비쿼터스 센서 네트워크) : 각종 센서로 수집한 정보를 무선으로 수집할 수 있도록 구성한 네트워크<ul>
<li>필요한 모든 것에 RFID를 부착</li>
</ul>
</li>
</ul>
</li>
<li>네트워크 구축<ul>
<li>성형(중앙집중형)</li>
<li>링형(루프형)</li>
<li>버스형 : 한 개의 통신 회선에 여러 대의 단말 장치가 연결됨</li>
<li>계층형(Tree)</li>
<li>망형 : 모든 지점의 컴퓨터와 단말장치를 서로 연결. 노드가 n개일 때 n(n-1)/2개의 회선 필요, 노드 당 n-1개 포트 필요</li>
</ul>
</li>
<li>네트워크 분류<ul>
<li>근거리 통신망 LAN</li>
<li>광대역 통신망 WAN</li>
</ul>
</li>
<li>IEEE 802 주요 표준 규격 : 802.3 기억(CSMA/CD 방식 매체 접근 제어 계층 규약)</li>
<li>IEEE 802.11 : 802.11e 기억(QoS 강화를 위해 MAC 지원 기능 채택)</li>
<li>NAT(Network Address Translation) : 네트워크 주소 변환은 한 개의 정식 IP주소에 대량의 가상 사설 IP 주소 할당 및 연결</li>
<li>스위치 : 브리지와 같이 LAN과 LAN을 연결하여 훨씬 더 큰 LAN을 만드는 장치<ul>
<li>L2 스위치 : 일반적으로 부름. MAC 주소를 기반으로 프레임 전송. 2계층</li>
<li>L3 스위치 : L2 + 라우터, IP 주소 기반</li>
<li>L4 스위치 : L3 + 로드밸런서, IP 및 TCP/UDP 기반</li>
<li>L7 스위치 : IP 주소, TCP/UDP 포트 정보, 패킹 내용까지 참조하여 세밀하게 로드 밸런싱</li>
</ul>
</li>
<li>경로 제어(Routing) : 전송 경로 중 최적 패킷 교환 경로를 결정<ul>
<li>IGP : 내부 게이트웨이 프로토콜은 하나의 자율 시스템 내의 라우팅에 사용<ul>
<li>RIP : 거리 벡터 라우팅 프로토콜, 벨먼-포트 알고리즘 사용</li>
<li>OSPF : RIP 단점 해결, 대규모 네트워크, 다익스트라 알고리즘</li>
</ul>
</li>
<li>EGP: 자율 시스템 간의 라우팅</li>
<li>BFP : EGP 단점 보완. BFP 라우터들이 연결 될 때에는 전체 경로 제어표(라우팅 테이블) 교환. 이후 변화된 정보만 교환</li>
</ul>
</li>
<li>흐름 제어 : 송수신 측 사이에 전송되는 패킷의 양이나 속도를 규제<ul>
<li>정지-대기 : 확인 후 다음 패킷을 전송. 한 번에 하나의 패킷만을 전송</li>
<li>슬라이딩 윈도우 : 확인 신호를 이용해 송신 데이터의 양을 조절. 한 번에 여러 개의 패킷 전송 가능.<ul>
<li>패킷의 최대치 = 윈도우 크기</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="5-기타">5. 기타</h3>
<ul>
<li><p>SW 관련 신기술</p>
<ul>
<li>블록체인 : P2P 네트워크, 디지털 장비에 분산 저장</li>
<li>매시업 : 웹에서 제공하는 정보 및 서비스를 이용하여 새로운 SW나 서비스, DB를 만드는 기술</li>
<li>서비스 지향 아키텍처(SOA) : 기업의 SW 인프라인 정보 시스템을 공유와 재사용이 가능한 서비스 단위나 컴포넌트 중심으로 구축하는 정보기술 아키텍처<ul>
<li>SOA 기반 애플리케이션 구성 계층 : 표현, 업무 프로세스, 서비스 중간, 애플리케이션, 데이터 저장</li>
</ul>
</li>
<li>디지털 트윈 : 현실 속의 사물을 소프트웨어로 가상화한 모델</li>
<li>그레이웨어 : 애드웨어나 트랙웨어, 기타 악성 코드나 악성 공유웨어처럼 제공자 입장에선 유용, 사용자 입장에선 아닐 수도</li>
<li>양자 암호 키 분배(QKD) : 양자 통신을 위해 비밀키를 분배하여 관리<ul>
<li>두 시스템이 각자 양자 암호 키 분배 시스템을 설치하여 운용하는 식으로 활용</li>
</ul>
</li>
<li>서비스형 소프트웨어(SaaS) : SW의 여러 기능 중에서 사용자가 필요로 하는 서비스만 이용할 수 있도록 한 SW</li>
<li>리치 인터넷 애플리케이션(RIA) : 신개념 플래시 웹 페이지 제작 기술(플래시 애니메이션 기술 + 웹 서버 애플리케이션 기술)</li>
</ul>
</li>
<li><p>HW 관련 신기술</p>
<ul>
<li>엔 스크린(N-Screen) : N 개의 서로 다른 단말기에서 동일한 콘텐츠를 자유롭게 이용할 수 있는 서비스</li>
<li>신 클라이언트 PC(Thin Client PC) : HDD나 주변장치 없이 기본적인 메모리만 갖추고 서버와 네트워크로 운용되는 PC<ul>
<li>서버 기반 컴퓨팅과 관련 깊음</li>
</ul>
</li>
<li>엠디스크(M-DISC) : 한 번의 기록만으로 자료를 영구 보관할 수 있는 광 저장장치</li>
<li>멤스(MEMS) : 초정밀 반도체 제조 기술을 바탕으로 센서, 액추에이터 등 기계 구조를 다양한 기술로 미세 가공하는 초미세장치</li>
<li>멤리스터 : 메모리+레지스터, 전류의 방향과 양 등 기존의 경험을 모두 기억하는 특별한 소자</li>
<li>트러스트존 기술 : 하나의 프로세서 내 일반 구역과 보안이 필요한 보안 구역으로 분할하여 관리하는 HW 기반 보안 기술</li>
</ul>
</li>
<li><p>RAID : 2개 이상의 하드디스크로 디스크 배열 구성, 데이터 블록을 서로 다른 디스크에 분산 저장하거나 다중화</p>
<ul>
<li>RAID 0 : 스트라이핑, 디스크를 병렬로 연결, 하나의 디스크만 손상되어도 전체 디스크 파손</li>
<li>RAID 1 : 미러링, 같은 데이터를 다른 디스크에 동일하게 복사</li>
<li>RAID 2~4 : 하나의 디스크에 오류 정정 부호를 각각 비트/바이트/워드 단위로 저장<ul>
<li>하나의 디스크가 손상되어도 정상 가동 가능. 최소 3개 디스크 필요</li>
</ul>
</li>
<li>RAID 5 : 오류 정정 부호를 여러 디스크에 분산 저장<ul>
<li>마찬가지로 최소 3개 디스크 필요. 하나 디스크 손상되어도 정상 동작 가능</li>
</ul>
</li>
<li>RAID 6 : 오류 정정 부호 2개를 여러 디스크에 분산 저장<ul>
<li>2개의 디스크가 손상되어도 정상 가동 가능. 최소 4개 디스크 필요.</li>
</ul>
</li>
</ul>
</li>
<li><p>Secure OS : 보안 기능을 갖춘 커널을 이식한 보안형 OS</p>
<ul>
<li>보안 커널 : TCB(Trusted Computing Base)를 기반으로 참조 모니터의 개념을 구현하고 집행</li>
<li>보안 기능 : 식별 및 인증, 임의적/강제적 접근 통제, 객체 재사용 보호, 완전한 조정 등</li>
</ul>
</li>
<li><p>DB 관련 신기술</p>
<ul>
<li>하둡 : 오픈 소스 기반한 분산 컴퓨팅 플랫폼<ul>
<li>구글 맵리듀스 엔진 사용</li>
<li>더그 커팅과 마이크 캐퍼렐라 개발</li>
<li>자바 소프트웨어 프레임워크</li>
</ul>
</li>
<li>맵리듀스 : 대용량 데이터를 분산처리하기 위한 목적으로 개발된 프로그래밍 모델<ul>
<li>흩어져 있는 데이터를 연관성 있는 데이터 분류로 묶는 MAP 작업 수행 후 </li>
<li>중복 데이터 제거 &amp; 원하는 데이터 추출하는 Reduce 수행</li>
</ul>
</li>
<li>데이터 마이닝 : 대량의 데이터를 분석하여 데이터에 내재된 변수 사이의 상호관계를 규명하여 일정한 패턴을 찾아냄</li>
<li>타조 : 아파치 하둡 기반의 분산 데이터 웨어하우스 프로젝트</li>
<li>OLAP : 다차원으로 이루어진 데이터로부터 통계적인 요약 정보를 분석하여 의사결정에 활용하는 방식</li>
<li>브로드 데이터 : 다양한 채널에서 소비자와 상호 작용을 통해 생성된 효율적이고 다양한 데이터</li>
</ul>
</li>
<li><p>회복 : DB가 손상되었을 때 손상되기 이전 상태로 복구하는 작업</p>
<ul>
<li>REDO : 트랜잭션의 시작과 완료에 대한 기록이 있는 작업들을 재작업.</li>
<li>UNDO : 트랜잭션의 완료 기록은 없는 트랜잭션들이 작업한 변경 내용을 모두 취소.</li>
<li>연기 갱신 기법 : 실질적인 갱신을 연기. REDO만 가능.</li>
<li>즉각 갱신 기법 : 트랜잭션이 갱신하면 부분 완료되기 전이라도 즉시 실제 DB에 반영. REDO, UNDO 모두 가능</li>
</ul>
</li>
<li><p>병행제어 : 동시에 실행되는 트랜잭션들이 DB의 일관성을 파괴하지 않도록 트랜잭션 간 상호 작용을 제어하는 것</p>
<ul>
<li><p>로킹 : 액세스 하기 전 Lock(잠금)을 요청해서 Lock이 허락되어야만 그 로킹 단위를 액세스할 수 있도록 하는 기법</p>
<ul>
<li>주요 데이터 액세스를 상호 배타적으로 함</li>
<li>로킹 단위 : 한꺼번에 로킹할 수 있는 객체의 크기<ul>
<li>로킹 단위가 크면 : 로크 수가 작아 관리 쉬움, 병행성 수준 낮음</li>
<li>로킹 단위가 작으면 : 로크 수가 많아 관리 어려움, 병행성 수준 높음</li>
</ul>
</li>
<li>교착 상태(Dead Lock)은 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다림<ul>
<li>상호 배제 : 한 번에 한 개의 프로세스만 공유 자원 사용 가능</li>
<li>점유와 대기 : 하나를 이미 갖고 있으면서 또 하나를 추가로 점유하기 위해 대기하는 프로세스</li>
<li>비선점 : 사용 끝날 때까지 강제로 뺏기 불가</li>
<li>환형 대기 : 대기하는 프로세스들이 원형으로 구성, 점유와 대기 중 앞 혹은 뒤 프로세스 자원을 요구해야 함</li>
<li>이상이 필요충분 조건으로 필요</li>
<li>해결 방법<ul>
<li>예방 기법 : 조건 중 하나를 제거함으로써 수행</li>
<li>회피 기법 : 주로 은행원 알고리즘이 사용</li>
<li>발견 기법 : 교착 상태가 발생했는지 점검</li>
<li>회복 기법 : 비선점을 선점으로 바꿔주거나, 교착 상태를 일으킨 프로세스를 종료</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>타임 스탬프 순서 : 시간표(Time Stamp)를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행</p>
<ul>
<li>순서를 정하는 방법 중 가장 보편적</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS Project 100] 8. Filter]]></title>
            <link>https://velog.io/@jaik_lee/JS-Project-100-8.-Filter</link>
            <guid>https://velog.io/@jaik_lee/JS-Project-100-8.-Filter</guid>
            <pubDate>Fri, 08 Jul 2022 09:19:20 GMT</pubDate>
            <description><![CDATA[<p><a href="https://js-beginners.github.io/filter-project/">Hosted Project</a></p>
<p><a href="https://github.com/JS-Beginners/filter-project">Github Source Files</a></p>
<h4 id="javascript-used">JavaScript Used</h4>
<p>DOM Manipulation
Control Structures
Array.forEach()
JavaScript CSS Manipulation
eventListeners
Immediately Invoked Function Expressions</p>
<h4 id="project-descriptionsummary">Project Description/Summary</h4>
<p>This project involves wiring up two different sections. The first section is the filter buttons, whose purposes are to filter the store items by class. The first section is the search filter, whose purpose is to filter the store items by a search.</p>
<h4 id="new-things-learned-or-refreshed">New Things Learned or Refreshed</h4>
<p>This project involved the use of using the HTML5 dataset property to select items from the project&#39;s store. This was only the second time I used it and I have a better understanding of how I can use JavaScript to retrieve data from HTML elements. “The dataset property on the HTMLElement interface provides read/write access to all the custom data attributes (data-*) set on the element.” In other words, as I understand it, to use JavaScript to retrieve HTML elements with a attribute of data-user = &quot;hello&quot;, you have to use HTMLElement.dataset.user to return the string “hello”. I also learned the event.PreventDefault() method works to prevent the default behavior of in-page links. The default behavior sends the user to the top of the page after a link lower in the page is clicked. Previously, I only used the event.PreventDefault() to prevent the default behavior of form submissions.</p>
<h4 id="time-to-code">Time to Code</h4>
<p>This took about 30 minutes to code. As you&#39;ll see in my GitHub repository, I coded the first section using a bunch of if-else statements. It worked, but I knew there had to be a better way. So, I watched John&#39;s solution and sure enough he simply added an event listener to each store item. Duh.</p>
<h4 id="lines-of-code">Lines of Code</h4>
<p>This took about 40 lines of code.</p>
<h4 id="biggest-take-aways">Biggest Take Away(s)</h4>
<p>Retrieving elements from the DOM using the dataset property is no more complicated than using the querySelector() method.  The difference is only a matter of how they are accessed. In this case, the properties were accessed by targeting the elements who had a given data property.</p>
<h3 id="your-turn">Your Turn!</h3>
<h4 id="what-to-accomplish">What to Accomplish</h4>
<ol>
<li>Download the source code from the github repository above.</li>
<li>Delete the contents of the app.js file.</li>
<li>Implement the JavaScript code in your own app.js file.</li>
<li>If you think you need to see a video solution first, be sure to pick up John&#39;s JavaScript Tutorial and Projects Course.</li>
<li>Add a link to your finished project below!<h4 id="what-you-should-see">What You Should See</h4>
</li>
<li>In the “Our Store” section of the website, when you click on a given button, only the described items should show in the store.</li>
<li>When you use the search function in the “Our Store” section of the website, only the case-insensitive searched items should show by name.<hr>

</li>
</ol>
<pre><code class="language-html">&lt;!-- &lt;head&gt;는 생략. --&gt;
&lt;!-- body도 너무 길어서 생략 --&gt;
 &lt;script&gt;
  const buttons = document.querySelectorAll(&#39;.btn&#39;)
  const storeItems = document.querySelectorAll(&#39;.store-item&#39;)
  const searchBox = document.querySelector(&#39;#search-item&#39;)

  searchBox.addEventListener(&#39;keyup&#39;, (event) =&gt; {
    // 검색창에 입력하면 searchFilter로 잡히게 됨. 모두 소문자 및 앞뒤 공백제거
    const searchFilter = event.target.value.toLowerCase().trim()
    // 만약 searchFilter가 item에 포함되어 있으면 표시함
    storeItems.forEach((item) =&gt; {
           // block일 경우 가려지게 되며, none일 경우 보이게 됨.
        if (item.textContent.includes(searchFilter)){
            item.style.display = &#39;block&#39;
        } else {
            item.style.display = &#39;none&#39;
        }
    })
  })

  buttons.forEach(function(button){
      button.addEventListener(&#39;click&#39;, function(event){
          // 기본 기능 제거
          event.preventDefault()
             // dataset은 요소의 사용자 지정 데이터 특성.
          // filter는 callbackFunction의 조건에 해당하는 모든 요소가 있는 배열을 새로 생성
          const filter = event.target.dataset.filter
          if (filter === &#39;all&#39;){
                //show all items
                storeItems.forEach(function(item){
                    item.style.display = &#39;block&#39;
                })
            } else if (filter === &#39;cakes&#39;){
                storeItems.forEach(function(item){
                    if (item.classList.contains(&#39;cakes&#39;)){
                        item.style.display = &#39;block&#39;
                    } else {
                        item.style.display = &#39;none&#39;
                    }
                })
            } else if (filter === &#39;cupcakes&#39;){
                storeItems.forEach(function(item){
                    if (item.classList.contains(&#39;cupcakes&#39;)){
                        item.style.display = &#39;block&#39;
                    } else {
                        item.style.display = &#39;none&#39;
                    }
                })
            } else if (filter === &#39;sweets&#39;){
                storeItems.forEach(function(item){
                    if (item.classList.contains(&#39;sweets&#39;)){
                        item.style.display = &#39;block&#39;
                    } else {
                        item.style.display = &#39;none&#39;
                    }
                })
            } else if (filter === &#39;doughnuts&#39;){
                storeItems.forEach(function(item){
                    if (item.classList.contains(&#39;doughnuts&#39;)){
                        item.style.display = &#39;block&#39;
                    } else {
                        item.style.display = &#39;none&#39;
                    }
                })
            }
        })
    })
})();

 &lt;/script&gt;
&lt;/body&gt;</code></pre>
<hr>

<h4 id="결과물">결과물</h4>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/aad5fa07-04d0-4b44-ad7e-cc7462750fce/image.PNG" alt=""><img src="https://velog.velcdn.com/images/jaik_lee/post/cf36ccf7-d0dc-45a7-bbda-1d6e91869edd/image.PNG" alt=""><img src="https://velog.velcdn.com/images/jaik_lee/post/b7a433e7-1679-4db7-bd52-c01a96208d66/image.PNG" alt=""></p>
<hr>

<h4 id="배운-점">배운 점</h4>
<blockquote>
<ol>
<li>.dataset, .filter
 dataset = 데이터 사용자 지정 특성
 filter = 배열 새로 생성</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>display (vs visibility)
 display는 아예 공간을 삭제시키지만, visibility는 공간은 남아있음(width랑 height 주면 그만큼 빈칸)
 display : none &lt;&gt; block
 visibility : hidden &lt;&gt; visible</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS Project 100] 7. Background Image Slider]]></title>
            <link>https://velog.io/@jaik_lee/JS-Project-100-7.-Background-Image-Slider</link>
            <guid>https://velog.io/@jaik_lee/JS-Project-100-7.-Background-Image-Slider</guid>
            <pubDate>Wed, 06 Jul 2022 06:43:14 GMT</pubDate>
            <description><![CDATA[<p><a href="https://jsbeginners.com/testimonials-project/">문제 주소</a></p>
<hr>

<h3 id="description">Description</h3>
<p><a href="https://js-beginners.github.io/testimonial-project/">Hosted Project</a></p>
<p><a href="https://github.com/JS-Beginners/testimonial-project">Github Source Files</a></p>
<h4 id="javascript-used">JavaScript Used</h4>
<p>DOM Manipulation
Control Structures
Arrays
Array.forEach()
JavaScript CSS Manipulation
eventListeners
Immediately Invoked Function Expressions
Object Constructors
Event Bubbling</p>
<h4 id="project-descriptionsummary">Project Description/Summary</h4>
<p>This project seems to combines two of the previous completed projects. It involves pieces of the Background Image Slider JavaScript Project and the Random Quotes JavaScript Project.  This project can easily be completed using an array of objects, but John adds a bit of complexity (if you&#39;re a beginner) to the project by using a Constructor function.</p>
<h4 id="new-things-learned-or-refreshed">New Things Learned or Refreshed</h4>
<p>It was nice to see how Object Constructors are used in real projects. This project used a function that made a call to an Object Constructor. On the surface, it made the project a bit more complex than it had to be, but I now see the value of using a function to create a new instance an Object. This project also focused on selecting the parent element from the DOM to register the click element of a child element that contained a specific CSS class as opposed to selecting the button element.</p>
<h4 id="time-to-code">Time to Code</h4>
<p>This took about 20 minutes to code.</p>
<h4 id="lines-of-code">Lines of Code</h4>
<p>This took me 59 lines of code.</p>
<h4 id="biggest-take-aways">Biggest Take Away(s)</h4>
<p>Object Constructors are not bad once you learn how to use them in small projects. I&#39;m glad John switched it up in his solution.</p>
<h3 id="your-turn">Your Turn!</h3>
<h4 id="what-to-accomplish">What to Accomplish</h4>
<ol>
<li>Download the source code from the github repository above.</li>
<li>Delete the contents of the app.js file.</li>
<li>Implement the JavaScript code in your own app.js file.</li>
<li>Add a link to your finished project below!<h4 id="what-you-should-see">What You Should See</h4>
</li>
<li>A default image should be displayed when you load the page.</li>
<li>When you click the “left” button, one of five images should display, all the way until each of the five images display in sequence.</li>
<li>Repeat step 2 for the “right” button.</li>
<li>If the user continues to click the left or right button, the images should reset once it passes the first image in the array.</li>
</ol>
<hr>

<pre><code class="language-html">&lt;!-- &lt;head&gt;는 생략. --&gt;

&lt;body&gt;
 &lt;div class=&quot;container-fluid&quot;&gt;
  &lt;div class=&quot;row max-height align-items-center&quot;&gt;
   &lt;!-- col --&gt;
   &lt;div class=&quot;col-10 mx-auto col-md-6&quot;&gt;
    &lt;div class=&quot;row&quot;&gt;
     &lt;div class=&quot;col text-center my-5&quot;&gt;
      &lt;h4 class=&quot;title-heading text-uppercase&quot;&gt;친구들의&lt;/h4&gt;
      &lt;h1 class=&quot;title-subheading text-uppercase&quot;&gt;한 마디&lt;/h1&gt;
     &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card my-5 text-center customer-card &quot;&gt;
     &lt;img src=&quot;img/customer-0.png&quot; width=&quot;150&quot; id=&quot;customer-img&quot; class=&quot;img-card mx-auto&quot; alt=&quot;&quot;&gt;
     &lt;h4 id=&quot;customer-name&quot; class=&quot;text-uppercase&quot;&gt;눈 감은 찌호&lt;/h4&gt;
     &lt;p id=&quot;customer-text&quot;&gt;배가 고픕니다&lt;/p&gt;
     &lt;span class=&quot;quote-icon&quot;&gt;
      &lt;i class=&quot;fas fa-quote-left&quot;&gt;&lt;/i&gt;
     &lt;/span&gt;
     &lt;a href=&quot;#&quot; class=&quot;btn prevBtn&quot;&gt;&lt;i class=&quot;fas fa-chevron-left&quot;&gt;&lt;/i&gt;&lt;/a&gt;
     &lt;a href=&quot;#&quot; class=&quot;btn nextBtn&quot;&gt;&lt;i class=&quot;fas fa-chevron-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;
    &lt;/div&gt;
   &lt;/div&gt;
   &lt;!-- end of col --&gt;
  &lt;/div&gt;
 &lt;/div&gt;


 &lt;script&gt;
  // 이하 forEach 함수 전까지는 사용자 생성 함수
  const customerImage = document.querySelector(&#39;#customer-img&#39;)
  const customerName = document.querySelector(&#39;#customer-name&#39;)
  const customerText = document.querySelector(&#39;#customer-text&#39;)
  const buttons = document.querySelectorAll(&#39;.btn&#39;)
  let index = 0
  const customers = []

  // this 이용해서 Customer 객체를 정의함(함수 내에서 this는 인자를 가리킴).
  function Customer(img, name, text) {
      this.img = img
      this.name = name
      this.text = text
  }

  // 생성함수를 이용.
  function createCustomer(img, name, text) {

      // &#39;customer-0&#39; 형태의 파일을 갖고 있다면 그것이 사진으로 들어감.
      let fullImg = `./img/customer-${img}.png`
      let customer = new Customer(fullImg, name, text)

      // customers 배열에 customer를 추가함.
      customers.push(customer)
  }


  createCustomer(0, &#39;눈 감은 찌호&#39;, &#39;배가 고픕니다&#39;)
  createCustomer(1, &#39;기분 나쁜 찌호&#39;, &#39;뭘 봐요?&#39;)
  createCustomer(2, &#39;리얼 찌호&#39;, &#39;하아...&#39;)

  // 이하 기능 함수
  buttons.forEach(function(button){
      button.addEventListener(&#39;click&#39;, function(event){
          if (event.target.parentElement.classList.contains(&#39;prevBtn&#39;)){
              if(index === 0){
                  index = customers.length
              }
              index--
              customerImage.src = customers[index].img
              customerName.textContent = customers[index].name
              customerText.textContent = customers[index].text
          }
          if (event.target.parentElement.classList.contains(&#39;nextBtn&#39;)){
              index++
              if(index === customers.length){
                      index = 0
              }
              customerImage.src = customers[index].img
              customerName.textContent = customers[index].name
              customerText.textContent = customers[index].text
              }
      })
  })

 &lt;/script&gt;
&lt;/body&gt;</code></pre>
<hr>

<h4 id="결과물">결과물</h4>
<p><img src="https://velog.velcdn.com/images/jaik_lee/post/75685949-c124-4783-8f48-3383424ac838/image.png" alt=""><img src="https://velog.velcdn.com/images/jaik_lee/post/8bbe6f48-7760-43bd-815f-e0303d057386/image.png" alt=""></p>
<hr>

<h4 id="배운-점">배운 점</h4>
<blockquote>
<ol>
<li>this의 용법<ol>
<li>전역 객체(window) : 아무것도 쓰지 않고 그냥 this 쳤을 때.</li>
<li>어떤 객체를 통해 함수가 호출된다면 그 객체
 -&gt; 이번엔 이 것.</li>
<li>명시적 바인딩(call, apply, bind 등)</li>
<li>new 바인딩</li>
</ol>
</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>객체함수와 생성함수를 이용하고, 동작함수를 따로 구성.</li>
</ol>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>