<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yg-kim-korean.log</title>
        <link>https://velog.io/</link>
        <description>발전하고 싶은 사람</description>
        <lastBuildDate>Mon, 13 Nov 2023 08:15:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yg-kim-korean.log</title>
            <url>https://images.velog.io/images/yg-kim-korean/profile/d2e8ee80-41f5-4c22-a424-f79dda4d6d7b/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yg-kim-korean.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yg-kim-korean" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[상품을 구매한 회원 비율 구하기
(Oracle) - programmers]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%83%81%ED%92%88%EC%9D%84-%EA%B5%AC%EB%A7%A4%ED%95%9C-%ED%9A%8C%EC%9B%90-%EB%B9%84%EC%9C%A8-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%83%81%ED%92%88%EC%9D%84-%EA%B5%AC%EB%A7%A4%ED%95%9C-%ED%9A%8C%EC%9B%90-%EB%B9%84%EC%9C%A8-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</guid>
            <pubDate>Mon, 13 Nov 2023 08:15:30 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131534">https://school.programmers.co.kr/learn/courses/30/lessons/131534</a></p>
<h3 id="테이블은-한번씩만-쓰기">테이블은 한번씩만 쓰기</h3>
<pre><code>SELECT c.year ,c.month
       ,count(c.user_id) PUCHASED_USERS
       ,round(count(user_id)/max(c.joined_users),1) PUCHASED_RATIO 
       -- 그냥 joined_users만 쓰면 group by 룰 때문에 사용하지 못해 max로 감싸줌
from (
      select a.user_id, year, month, joined_users
         from (
             select user_id, 
                    count(*) over(partition by to_char(joined, &#39;yyyy&#39;)) joined_users
                    -- 2021년 전체 인원수 가져오려고 사용
             from USER_INFO 
             where to_char(joined, &#39;yyyy&#39;) = &#39;2021&#39; 
         ) a, 
         (
            select user_id, 
                   EXTRACT(YEAR from sales_date) year, 
                   EXTRACT(month from sales_date) month 
                   -- to_char말고 처음 써봄.. 결과가 같은데 안되길래 찾아보니 이거써야함..
             from ONLINE_SALE
             group by user_id, EXTRACT(YEAR from sales_date), EXTRACT(month from sales_date)
         ) b
         where a.user_id = b.user_id
     ) c
group by c.year ,c.month
order by 1 asc, 2 asc</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
(Oracle) - programmers]]></title>
            <link>https://velog.io/@yg-kim-korean/%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</link>
            <guid>https://velog.io/@yg-kim-korean/%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</guid>
            <pubDate>Thu, 09 Nov 2023 07:00:10 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/157339">https://school.programmers.co.kr/learn/courses/30/lessons/157339</a></p>
<pre><code>select car_id, car_type, fee
from (select b.car_id, a.car_type, (100-a.discount_rate)/ 100 * 30 * DAILY_FEE  as fee -- 총 금액이 50이상 200이하인거만 가져오기
     from (select car_type, discount_rate -- 30일짜리만 필요하므로 차타입마다 먼저 가져오기
           from CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
           where REGEXP_REPLACE(DURATION_TYPE, &#39;[^0-9]&#39;) = 30) a,
           CAR_RENTAL_COMPANY_CAR b
     where a.car_type = b.car_type
     and (100-discount_rate)/ 100 * 30 * DAILY_FEE between 500000 and 1999999
     ) x
where car_id not in (select car_id -- 11월 1일 부터 11월 30일 사이에 예약된거 빼기
                   from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
                   where to_char(start_date,&#39;yyyy-mm-dd&#39;) &lt;= &#39;2022-11-30&#39;
                   and to_char(end_date,&#39;yyyy-mm-dd&#39;) &gt;= &#39;2022-11-01&#39;)
order by 3 desc, 2 asc ,1 desc</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[자동차 대여 기록 별 대여 금액 구하기(Oracle)
- programmers]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D-%EB%B3%84-%EB%8C%80%EC%97%AC-%EA%B8%88%EC%95%A1-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D-%EB%B3%84-%EB%8C%80%EC%97%AC-%EA%B8%88%EC%95%A1-%EA%B5%AC%ED%95%98%EA%B8%B0Oracle-programmers</guid>
            <pubDate>Wed, 08 Nov 2023 10:02:47 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/151141">https://school.programmers.co.kr/learn/courses/30/lessons/151141</a></p>
<p>문제를 잘읽자..!</p>
<pre><code>select history_id, (100-
                   (select discount_rate
                    from(   
                        select nvl(max(discount_rate),0) discount_rate --dates가 7미만일 경우
                        from CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
                        where car_type = &#39;트럭&#39;
                        and REGEXP_REPLACE(DURATION_TYPE, &#39;[^0-9]&#39;) &lt;= x.dates --REGEXP_REPLACE 숫자만 빼기
                        order by 1
                        )
                    where rownum = 1)
                   ) * x.dates * x.daily_fee/100 FEE
from (
    select HISTORY_ID, a.car_id, (a.end_date-a.start_date)+1 dates, b.daily_fee --그냥 빼면 0인날이 되므로 하루만썼어도 하루되기위해 +1
     from CAR_RENTAL_COMPANY_RENTAL_HISTORY a, 
            (SELECT car_id,daily_fee
            from CAR_RENTAL_COMPANY_CAR 
            where car_type = &#39;트럭&#39;) b
    where a.car_id = b.car_id
    ) x
order by 2 desc, 1 desc                   </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Data Warehouse]]></title>
            <link>https://velog.io/@yg-kim-korean/Data-Warehouse</link>
            <guid>https://velog.io/@yg-kim-korean/Data-Warehouse</guid>
            <pubDate>Tue, 07 Nov 2023 18:10:02 GMT</pubDate>
            <description><![CDATA[<h3 id="정의">정의</h3>
<ul>
<li>의사결정에 도움을 주기위해 데이터베이스에 축적된 데이터를 공통의 형식으로 변환하여 관리하는 데이터베이스</li>
<li>특정 기간의 무수한 데이터를 select와 join으로 가져온다면 그 데이터베이스의 부하는 엄청나기 때문에 가공하여 운영DB로 추출하여 데이터 조회 및 분석을 위해 만든것 -&gt; <strong>데이터 웨어하우스</strong></li>
</ul>
<h3 id="이점">이점</h3>
<ul>
<li>정보 기반 의사결정을 도움</li>
<li>여러 소스의 데이터를 통합해서 분석 가능</li>
<li>과거 데이터 분석</li>
<li>데이터 품질, 일관성 및 정확성</li>
<li>트랜잭션 데이터 베이스와 분석 처리를 분리하여 두시스템의 모두의 성능을 향상</li>
</ul>
<h3 id="아키텍쳐">아키텍쳐</h3>
<ul>
<li>ETL(Extract, Transform, Load)<ul>
<li>데이터 웨어하우스 구축하는 과정에서 데이터를 추출하여 가공한후 데이터 웨어하우스에 적재하는 과정</li>
<li>필터링, 정렬, 집계, 데이터 조인, 데이터 정리, 중복제거 및 유효성 검사등의 작업</li>
</ul>
</li>
<li>Data Lake<ul>
<li>정형, 반정형 및 비정형 데이터를 비롯한 모든 가공되지 않은 다양한 종류의 데이터를 한곳에 모아둔 중앙 리포지토리</li>
<li>빅데이터를 위해 다양한 영역의 데이터를 한곳에 모아 관리하고자 하는 것이 목적</li>
</ul>
</li>
<li>Data Mart<ul>
<li>특정 팀 또는 사업단위의 요구를 충족시키기 위한 데이터 웨어하우스</li>
<li>규모가 작고, 집중적이며 사용자 커뮤니티에 가장 잘 맞는 데이터를 포함한다.</li>
<li>데이터 마트는 데이터 웨어하우스의 일부 일 수 있다.<h3 id="특성">특성</h3>
</li>
</ul>
</li>
<li>절차 지향적</li>
<li>통합</li>
<li>비 휘발성</li>
<li>시간 변이적</li>
</ul>
<p>더 공부하기 - &gt; <a href="http://www.jidum.com/jidums/view.do?jidumId=680">http://www.jidum.com/jidums/view.do?jidumId=680</a>
출처
<a href="https://aws.amazon.com/ko/what-is/data-warehouse/">https://aws.amazon.com/ko/what-is/data-warehouse/</a>
<a href="https://bomwo.cc/posts/Datawarehouse/">https://bomwo.cc/posts/Datawarehouse/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스]]></title>
            <link>https://velog.io/@yg-kim-korean/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@yg-kim-korean/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Sat, 14 Oct 2023 18:51:16 GMT</pubDate>
            <description><![CDATA[<h2 id="정규화">정규화</h2>
<ul>
<li><p>정규화 과정은 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정</p>
</li>
<li><p>제1정규형</p>
<ul>
<li>모든 도메인이 더 이상 분해될 수 없는 원자값 만으로 구성되어야함</li>
</ul>
</li>
<li><p>제2정규형</p>
<ul>
<li>부분 함수의 종속성을 제거(기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인것)한 형태</li>
</ul>
</li>
<li><p>제3정규형</p>
<ul>
<li>기본키가 아닌 모든 속성이 이행적 함수 종속(A-&gt;B-&gt;C, A-&gt;C)을 만족하지 않는 상태</li>
</ul>
</li>
<li><p>BCNF형</p>
<ul>
<li>결정자가 후보키가 아닌 함수 종속 관계 제거</li>
</ul>
</li>
</ul>
<h2 id="트랜잭션">트랜잭션</h2>
<ul>
<li>트랜잭션 - DB에서 하나의 논리적 기능을 수행하기 위한 최소한의 작업 단위</li>
<li>트랜잭션의 시작<ul>
<li>DML, DDL, DCL 수행시</li>
</ul>
</li>
<li>트랜잭션의 종료<ul>
<li>COMMIT, ROLLBACK 수행시</li>
<li>DDL, DCL 수행시</li>
<li>기기 장애 또는 충돌</li>
<li>deadlock 발생시</li>
<li>강제 종료시</li>
</ul>
</li>
</ul>
<h4 id="트랜잭션의-특징">트랜잭션의 특징</h4>
<ul>
<li>원자성<ul>
<li>트랜잭션과 관련된 일은 모두 수행되거나 모두 수행되지 않아야 함</li>
<li>update, delete, insert 후 commit 하지 않으면 rollback으로 실행 전으로 돌아갈 수 있음</li>
</ul>
</li>
<li>일관성<ul>
<li>조건에 맞는 방식으로만 데이터를 변경해야함</li>
</ul>
</li>
<li>격리성<ul>
<li>트랜잭션 수행시 다른 사용자가 끼어들 수 없음</li>
<li>격리 수준( 격리성이 높은 수준부터 순서)<ul>
<li>SERIALIZABLE - 다른 트랜잭션이 동시에 같은 행에 접근할 수 없음<ul>
<li>REPEATABLE_READ - 한 행에 같이 접근할 수는 없지만 새로운 행 추가를 막지않음</li>
</ul>
</li>
<li>READ_COMMITED - 기본값 / 커밋이 완료된 데이터만 조회할 수 있음</li>
<li>READ_UNCOMMITED - 커밋되기 전에도 다른 트랜잭션의 데이터를 조회할 수 있음</li>
</ul>
</li>
<li>격리 수준에 따른 발생 현상<ul>
<li>팬텀리드(Phantom Read) - 한 트랜잭션에서 동일한 쿼리를 보냈을때 다른 결과가 나오는 경우</li>
<li>반복가능하지 않은 조회 - 같은 쿼리문을 수행했을 때, 다른 결과가 나오는 경우</li>
<li>더티 리드 - 트랜잭션 수행 중 다른 트랜잭션에 의해 변경된 데이터를 읽을수 있는 경우</li>
</ul>
</li>
</ul>
</li>
<li>지속성<ul>
<li>성공적으로 수행된 트랜잭션은 영원히 반영되어야 함</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료 구조]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 13 Oct 2023 13:59:41 GMT</pubDate>
            <description><![CDATA[<h2 id="복잡도">복잡도</h2>
<h4 id="시간-복잡도">시간 복잡도</h4>
<ul>
<li>빅오 표기법 (&#39;O()&#39;)</li>
</ul>
<h4 id="공간-복잡도">공간 복잡도</h4>
<ul>
<li>자원 공간의 양 (ex. a= [3] )</li>
</ul>
<h2 id="선형-자료-구조">선형 자료 구조</h2>
<h4 id="연결리스트">연결리스트</h4>
<ul>
<li>데이터를 감싼 노드를 포인터로 연결하여 공간적인 효율성을 극대화 시킨 자료구조</li>
<li>삽입, 삭제 O(1) , 탐색 O(n)</li>
</ul>
<h4 id="배열">배열</h4>
<ul>
<li>같은 타입의 변수로 이루어짐</li>
<li>크기가 정해져 있고, 인접한 메모리 위치에 있는 데이터를 모아놓은 집합</li>
<li>삽입, 삭제 O(n) , 탐색 O(1)</li>
<li>랜덤 접근, 순차 접근</li>
<li>배열, 연결리스트 비교<ul>
<li>배열 - 상자를 순서대로 나열한 데이터 구조기 때문에 몇번째 상자인지만 알면 바로 요소를 가져올 수있음</li>
<li>연결리스트 - 상자를 선으로 연결한 형태의 데이터 구조기 때문에 요소를 알기 위해서는 하나씩 찾아봐야함.</li>
</ul>
</li>
</ul>
<h4 id="벡터">벡터</h4>
<ul>
<li>동적으로 요소를 할당할 수 있는 동적 배열</li>
<li>컴파일 시점에 개수를 모를경우 사용</li>
<li>중복 허용, 순서가 있으며 랜덤 접근이 가능</li>
<li>탐색과 맨 뒤의 요소를 삭제하거나 삽입할 경우 O(1)</li>
<li>맨 뒤나 맨앞이 아닌 요소를 삭제하고 삽입할 경우 O(n)</li>
</ul>
<h4 id="스택">스택</h4>
<ul>
<li>LIFO(Last In First Out)</li>
<li>재귀 함수</li>
<li>웹 브라우저 방문 기록 등에 쓰임</li>
<li>삽입 삭제 O(1), 탐색 O(n)</li>
</ul>
<h4 id="큐">큐</h4>
<ul>
<li>FIFO(First In First Out)</li>
<li>CPU 작업을 기다리는 프로세스, 스레드 행렬 또는 네트워크 접속을 기다리는 행렬, 너비우선탐색, 캐시 등 사용</li>
<li>삽입 삭제 O(1), 탐색 O(n)</li>
</ul>
<h2 id="비선형-자료구조">비선형 자료구조</h2>
<h4 id="그래프">그래프</h4>
<ul>
<li>정점과 간선으로 이루어진 자료구조</li>
<li>가중치 - 간선과 정점 사이에 드는 비용</li>
</ul>
<h4 id="트리">트리</h4>
<ul>
<li>그래프의 일종이며 부모와 자식 계층 구조</li>
<li>간선 수 = 노드수 - 1</li>
<li>루트노드 - 가장 위에 있는 노드</li>
<li>내부 노드 - 루트 노드와 리프노드 사이에 있는 노드</li>
<li>리프 노드 - 맨 마지막에 위치한 노드</li>
<li>이진트리 <ul>
<li>자식노드의 수가 2개이하인 트리</li>
<li>정이진 트리 - 자식노드가 0 또는 두개인 이진트리</li>
<li>완전 이진 트리 - 마지막 레벨을 제외한 레벨이 모두 채워져 있고 마지막 레벨에서 왼쪽부터 채워져야 함</li>
<li>변질 이진 트리 - 자식노드가 하나씩만 있는 트리</li>
<li>포화 이진 트리 - 모든 노드가 꽉 차 있는 트리</li>
<li>균형 이진 트리 - 왼쪽노드와 오른쪽 노드의 높이 차이가 1 이하인 이진트리</li>
</ul>
</li>
<li>이진 탐색 트리<ul>
<li>노드의 왼쪽은 노드의 값보다 작고, 노드의 오른쪽은 노드의 값보다 높은 값이 들어있는 트리</li>
<li>탐색시 O(logn) 이지만 최악의 경우(선형적 - 한쪽으로 쏠리는 경우) O(n) 걸림</li>
</ul>
</li>
<li>AVL 트리<ul>
<li>왼쪽과 오른쪽의 균형을 맞추기 위한 이진 트리</li>
<li>탐색, 삽입, 삭제 O(logn)</li>
</ul>
</li>
<li>레드 블랙 트리<ul>
<li>각 노드에 빨간색 또는 검은색의 색상을 나타내는 추가 비트를 저장하여 삽입, 삭제에도 트리가 균형을 이루도록 만듦</li>
<li>탐색, 삽입, 삭제 O(logn)<h4 id="힙">힙</h4>
</li>
</ul>
</li>
<li>완전 이진트리 기반 자료구조</li>
<li>최소 힙 - 루트 노드에 있는 키는 모든 자식에 있는 키중에서 가장 큰 값, 각 노드와 자식노드 간에도 같은 규칙이 이루어져야함</li>
<li>최대 힙 - 루트 노드에 있는 키는 모든 자식에 있는 키중에서 가장 작은 값, 각 노드와 자식노드 간에도 같은 규칙이 이루어져야함</li>
<li>최대 힙 삽입시 마지막 노드에 삽입후 부모 노드들과 크기를 비교하며 자기 자리를 찾아감</li>
<li>최대 힙 삭제시에는 루트노드를 삭제하고 마지막 노드가 최대 값이기 때문에 루트 노드 자리에 마지막 노드 값을 넣음</li>
</ul>
<h4 id="우선순위-큐">우선순위 큐</h4>
<ul>
<li>대기열에서 우선순위가 높은 요소가 먼저 제공되는 힙 기반 자료 구조(Dequeue())</li>
</ul>
<h4 id="맵">맵</h4>
<ul>
<li>특정 순서에 따라 키와 매핑된 값의 조합으로 형성된 래드 블랙트리 기반으로 형성된 자료구조</li>
<li>해시테이블 구현시 사용(정렬 X)</li>
</ul>
<h4 id="set">set</h4>
<ul>
<li>중복된 값 없이 저장하는 자료구조</li>
</ul>
<h4 id="해시테이블">해시테이블</h4>
<ul>
<li>무한에 가까운 데이터들을 유한한 개수의 해시 값으로 매핑한 테이블</li>
<li>삽입, 삭제, 탐색 O(1)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C</guid>
            <pubDate>Thu, 12 Oct 2023 16:43:06 GMT</pubDate>
            <description><![CDATA[<h2 id="운영체제">운영체제</h2>
<h4 id="운영체제-구조-4가지">운영체제 구조 (4가지)</h4>
<ul>
<li>GUI / CUI <ul>
<li>GUI - 사용자가 전자 장치와 상호 작용하기 위한 사용자 인터페이스의 형태</li>
<li>CUI - 그래픽이 아닌 명령어로 처리하는 인터페이스(리눅스)<ul>
<li>커널</li>
</ul>
</li>
<li>운영체제의 핵심 부분이자 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추 역할</li>
</ul>
</li>
<li>드라이버 - 하드웨어를 제어하기 위한 소프트웨어</li>
<li>시스템 콜 ( 추상화 계층)운영체제가 커널에 접근하기 위한 인터페이스<ul>
<li>운영체제가 커널에 접근하기 위한 인터페이스</li>
<li>유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할때 사용<ul>
<li>프로세스나 스레드에서 운영체제로 요청을 할 때 시스템 콜로 인터페이스와 커널을 거쳐 운영체제에 전달 함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="컴퓨터의-요소">컴퓨터의 요소</h4>
<ul>
<li><p>CPU</p>
<ul>
<li>산술 논리 장치, 제어장치, 레지스터로 구성</li>
<li>운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 처리</li>
<li>제어장치 (CU, Control Unit)<ul>
<li>프로세스 조작을 지시하는 CPU의 부품<ul>
<li>입출력장치간 통신을 제어</li>
</ul>
</li>
</ul>
</li>
<li>레지스터<ul>
<li>CPU 안에 잇는 매우 빠른 임시기억장치<ul>
<li>처리 속도가 메모리보다 훨씬 빠름</li>
</ul>
</li>
</ul>
</li>
<li>산술논리연산장치 (ALU, Arithmetic Logic Unit)<ul>
<li>산술연산 및 논리연산을 계산하는 디지털 회로</li>
</ul>
</li>
<li>CPU의 연산처리<ul>
<li>제어장치가 메모리에 계산할 값 로드 및 레지스터에 로드<ul>
<li>제어장치가 레지스터에 있는 값을 계산하라고 산술논리연산장치에 명령</li>
<li>제어장치가 계산된 값을 다시 &#39;레지스터에서 메모리로&#39; 계산한 값을 저장</li>
<li>인터럽트</li>
<li>어떤 신호가 들어왔을때 CPU를 잠깐 정지 시키는 것</li>
</ul>
</li>
<li>I/O 디바이스 인터럽트</li>
<li>0으로 숫자를 나누는 산술 연산 인터럽트</li>
<li>프로세스 오류 등</li>
</ul>
</li>
</ul>
</li>
<li><p>DMA 컨트롤러</p>
<ul>
<li>I/O 디바이스가 메모리에 직접 접근 할 수 있도록 하는 하드웨어 장치</li>
<li>CPU의 보조 일꾼</li>
</ul>
</li>
<li><p>메모리 (RAM, Random Access Memory)</p>
<ul>
<li>전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치</li>
</ul>
</li>
<li><p>타이머</p>
</li>
<li><p>디바이스 컨트롤러</p>
<ul>
<li>컴퓨터에 연결되어 있는 IO 디바이스들의 작은 CPU를 말함</li>
</ul>
</li>
</ul>
<h2 id="메모리">메모리</h2>
<h4 id="메모리-계층">메모리 계층</h4>
<ul>
<li>레지스터<ul>
<li>CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억용량이 가장 적음</li>
</ul>
</li>
<li>캐시 (L1, L2 캐시)<ul>
<li>데이터를 미리 복사해 놓는 임지 저장소이자 속도가 빠른곳과 느린곳의 차이를 줄여 병목현상을 줄이기 위한 메모리</li>
<li>지역성의 원리<ul>
<li>시간 지역성 - 최근 사용한 데이터에 다시 접근하려는 특성<ul>
<li>공간 지역성 - 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성</li>
</ul>
</li>
</ul>
</li>
<li>캐시히트 / 캐시미스<ul>
<li>캐시 히트 - 캐시에서 원하는 데이터를 찾는 것</li>
<li>캐시 미스 - 찾으려는 데이터가 캐시에 없어 메모리에서 데이터를 찾아오는 경우</li>
</ul>
</li>
<li>캐시 매핑<ul>
<li>캐시가 히트되기 위해 매핑하는 방법(CPU의 레지스터와 메모리간의 데이터를 주고받을 떄를 기반)</li>
</ul>
</li>
<li>웹브라우저 캐시<ul>
<li>쿠키 - 만료기한이 있는 키-값 저장소</li>
<li>로컬 스토리지 - 만료기한이 없는 키-값 저장소 / 브라우저를 닫아도 유지되며 도메인 단위로 저장, 생성됨 (HTML5)</li>
<li>세션 스토리지 - 만료기한이 없는 키-값 저장소 / 탭 단위로 세션 스토리지 생성되며 탭을 닫을 때 데이터 삭제(HTML5)</li>
</ul>
</li>
<li>데이터 베이스 캐싱 계층<ul>
<li>메인 데이터베이스 위에 redis 데이터 베이스 계층을 &#39;캐싱 계층&#39;으로 둬서 성능을 향상시키기도 함.</li>
</ul>
</li>
</ul>
</li>
<li>주기억장치 / 메모리 (RAM)</li>
<li>저장장치(HDD, SSD) / 보조기억장치</li>
</ul>
<h4 id="메모리-관리">메모리 관리</h4>
<ul>
<li>가상 메모리<ul>
<li>페이지 - 가상 메모리를 사용하는 최소 크기 단위</li>
<li>프레임 - 실제 메모리를 사용하는 최소 크기 단위</li>
<li>컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것</li>
<li>가상주소 -&gt; MNU -&gt; 실제주소 (프로세스 주소 정보가 들어있는 &#39;페이지 테이블&#39;로 관리)</li>
<li>속도 향상을 위해 TLB(메모리와 CPU사이에 있는 주소변환을 위한 캐시) 사용</li>
<li>스와핑<ul>
<li>가상메모리에 존재하지만 RAM에 데이터가 없을 때 페이지 폴트가 발생함 -&gt; 이때 메모리에서 당장 사용하지않는 영역을 하드디스크로 옮기고 하드디스크에서 데이터가 있는 부분을 메모리처럼 불러와서 페이지 폴트가 일어나지 않은것 처럼 보이게 하는것</li>
</ul>
</li>
<li>페이지 폴트<ul>
<li>프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터를 접근하는 경우 발생</li>
</ul>
</li>
</ul>
</li>
<li>스레싱(thrashing)<ul>
<li>메모리의 페이지 폴트율이 높은것을 의미 -&gt; 컴퓨터 성능저하를 초래</li>
<li>메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 발생하여 생기는 현상</li>
<li>운영체제에서 스레싱을 발지하는 방법<ul>
<li>작업 세트 - 프로세스의 과거 사용 이령인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드</li>
<li>PFF(Page Fault Frequency) - 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 지정하는 방법</li>
</ul>
</li>
</ul>
</li>
<li>메모리 할당<ul>
<li>연속 할당<ul>
<li>메모리에 연속적으로 공간을 할당하는 것<ul>
<li>고정 분할 방식 - 메모리를 미리 나누어 관리하는 방식</li>
<li>가변 분할 방식 - 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용 -&gt; 최초 적합/ 최적 적합/ 최악 적합</li>
</ul>
</li>
</ul>
</li>
<li>불연속 할당<ul>
<li>페이징 기법 - 메모리를 동일한 크기의 페이지(보통4KB)로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당 -&gt; 홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해짐<ul>
<li>세그멘테이션 - 페이지가 아닌 세그먼트로 나누는 방식 -&gt; 보안과 공유에 좋지만 홀의 크기가 균일하지 않음</li>
</ul>
</li>
<li>페이지드 세그멘테이션 - 세그먼트로 나누고 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나눔</li>
</ul>
</li>
<li>페이지 교체 알고리즘<ul>
<li>스와핑 발생이 적게 일어나도록 설계 해야함</li>
<li>오프라인 알고리즘</li>
<li>FIFO (First In First Out)</li>
<li>LRU (Least Recentle Used) - 각 페이지 마다 계수기, 스택을 둬서 가장 참조가 오래된 페이지를 확인.</li>
<li>NUR (Not Used Recently) - Clock 알고리즘이라고도 불림(최근 참조된 프로세스를 1로 변경하고 참조되지 않은 0인 프로세스를 찾아다니며 변경)</li>
<li>LFU (Least Frequently Used) - 가장 참조 횟수가 적은 페이지</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="프로세스와-스레드">프로세스와 스레드</h2>
<ul>
<li>프로세스 - 컴퓨터에서 실행되고 있는 프로그램</li>
<li>스레드 - 프로세스 내 작업의 흐름<h4 id="프로세스와-컴파일-과정">프로세스와 컴파일 과정</h4>
<img src="https://velog.velcdn.com/images/yg-kim-korean/post/d083c7d3-8b9b-4703-add8-3a22307b661d/image.png" alt=""></li>
<li>컴파일 과정<ul>
<li>전처리 - 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 매크로를 치환</li>
<li>컴파일러 - 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환</li>
<li>어셈블러 - 어셈블리어는 목적 코드로 변환</li>
<li>링커<ul>
<li>프로그램 내의 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행파일 생성<ul>
<li>정적 라이브러리 - 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식</li>
<li>동적 라이브러리 - 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브 러리를 쓰는 방법</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="프로세스의-상태">프로세스의 상태</h4>
<ul>
<li>생성 상태 - fork() / exec() 함수로 생성, PCB 할당</li>
<li>대기 상태 - 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있다가 CPU 스케줄러로 부터 CPU 소유권이 넘어오길 기다리는 상태</li>
<li>대기 중단 상태 - 메모리 부족으로 일시 중단된 상태</li>
<li>실행 상태 - CPU 소유권과 메로리를 할당받고 지시 수행중인 상태</li>
<li>중단 상태 - 이벤트 발생 후 기다리며 프로세스가 차단된 상태(ex. I/O 디바이스 인터럽트 -&gt; 프린트 할때?)</li>
<li>일시 중단 상태 -&gt; 대기 중단가 비슷</li>
<li>종료 상태 -&gt; 메모리와 CPU 소유권 모두 놓는 것 / 자연스럽게 될 때도 있지만 부모가 자식 프로세스를 강제로 비자발적 종료(abort)도 있음</li>
</ul>
<h4 id="프로세스의-메모리-구조">프로세스의 메모리 구조</h4>
<ul>
<li>동적 영역(스택/ 힙)<ul>
<li>동적할당은 런타임 단계에서 메모리를 할당 받는 것</li>
</ul>
</li>
<li>정적 영역(데이터 영역(BSS Segment, Data Segment/ 코드 영역)<ul>
<li>정적 할당은 컴파일 단계에서 메모리를 할당하는 것</li>
</ul>
</li>
</ul>
<h4 id="pcb-process-control-block">PCB (Process Control Block)</h4>
<ul>
<li>프로세스에 대한 메타데이터를 저장한 데이터</li>
<li>컨텍스트 스위칭<ul>
<li>PCB 교환 과정</li>
<li>한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생</li>
</ul>
</li>
</ul>
<h4 id="멀티-프로세싱">멀티 프로세싱</h4>
<ul>
<li>여러개의 프로세스</li>
<li>동시에 두가지 이상의 일을 수행할 수 있는 것 -&gt; 병렬로 일처리 가능해짐</li>
<li>웹 브라우저</li>
<li>IPC(Inter Process Communiation)<ul>
<li>프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 매커니즘</li>
<li>ex. 클라이언트와 서버가 데이터를 요청하고 응답하는 것</li>
<li>공유 메모리<ul>
<li>여러 프로세스에 동일한 메모리 블록에 대한 접근 권한을 부여하여 통신함<ul>
<li>데이터 자체를 공유하도록 지원</li>
<li>한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있음(동기화)</li>
<li>공유 메모리는 커널에서 관리</li>
</ul>
</li>
</ul>
</li>
<li>파일<ul>
<li>디스크에 저장된 데이터 도는 파일 서버에서 제공한 데이터</li>
</ul>
</li>
<li>소켓<ul>
<li>동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터 (TCP, UDP)</li>
</ul>
</li>
<li>익명 파이프 (unamed pipe)<ul>
<li>프로세스 간 읽히는 임시 공간인 파이프를 기반으로 데이터를 통신(단방향)<ul>
<li>부모 자식 프로세스 간에만 사용 가능</li>
</ul>
</li>
</ul>
</li>
<li>명명된 파이프 (named pipe)<ul>
<li>파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 단방향 또는 양방향 파이프<ul>
<li>상호 관련 없는 프로세스 간에도 사용 가능</li>
</ul>
</li>
</ul>
</li>
<li>메시지 큐<ul>
<li>메시지를 큐 데이터 구조 형태로 관리하는 것</li>
<li>큐는 커널에서 관리</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="스레드와-멀티스레딩">스레드와 멀티스레딩</h4>
<ul>
<li>스레드<ul>
<li>프로세스의 실행 가능한 가장 작은 단위</li>
<li>프로세스는 여러 스레드를 가짐</li>
<li>스레드는 각 프로세스마다 생성하는 프로세스와 달리 스택을 제외한 코드, 데이터, 힙은 스레드 끼리 공유 함</li>
</ul>
</li>
<li>멀티스레딩<ul>
<li>프로세스내 작업을 여러개의 스레드로 처리</li>
<li>한 스레드가 중단 되어도 다른 스레드는 실행 상태 일수 있기 때문에 중단되지 않는 빠른 처리 가능(동시성 상승)</li>
<li>한 스레드에 문제가 생길 경우 다른 스레드도 문제가 발생 할 수 있음</li>
</ul>
</li>
</ul>
<h4 id="공유-자원--임계-영역">공유 자원 / 임계 영역</h4>
<ul>
<li>공유 자원 - 시스템 안에서 각 프로세스, 스레드가 함께 접근 할 수 있는 자원이나 변수 등을 의미</li>
<li>임계 영역 - 둘 이상의 프로세, 스레드가 공유 자원에 접근 할 때 순서등의 이유로 결과가 달라지는 코드 영역</li>
<li>임계 영역  해결 방법<ul>
<li>뮤텍스(Mutex)<ul>
<li>프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠근 해제하는 객체</li>
</ul>
</li>
<li>세마포어(Semaphore)<ul>
<li>일반화된 뮤텍스<ul>
<li>간단한 정수 값, wait() 및 signal()로 공유 자원에 대한 접근 처리</li>
<li>바이너리 세마포어, 카운팅 세마포어</li>
</ul>
</li>
</ul>
</li>
<li>모니터<ul>
<li>둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공<ul>
<li>모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="교착상태deadlock">교착상태(Deadlock)</h4>
<ul>
<li>두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태</li>
<li>원인<ul>
<li>상호배제 - 한 프로세스가 자원을 독점하여 다른 프로세스들이 접근 못함</li>
<li>점유 대기 - 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태</li>
<li>비선점 - 다른 프로세스가 보유한 자원을 강제적으로 가져올 수 없음</li>
<li>환형 대기 - 프로세스가 서로의 자원을 요구하는 상황</li>
</ul>
</li>
<li>해결 방법<ul>
<li><ol>
<li>자원 할당 시 조건에 성립되지 않도록 설계</li>
</ol>
</li>
<li><ol start="2">
<li>교착 가능성이 없을때만 자원 할당, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘 사용<ul>
<li>은행원 알고리즘 - 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안</li>
</ul>
</li>
</ol>
</li>
<li><ol start="3">
<li>교착상태 발생시 사이클을 확인하고 관련된 프로세스 하나씩 삭제</li>
</ol>
</li>
<li><ol start="4">
<li>교착상태는 처리하는 비용이 크기 때문에 사용자가 직접 처리하는 방식</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="cpu-스케줄링-알고리즘">CPU 스케줄링 알고리즘</h2>
<h4 id="비선점-방식">비선점 방식</h4>
<ul>
<li>FCFS</li>
<li>SJF(Shortest Job First)<ul>
<li>수행시간이 가장 짧은 프로세스 먼저</li>
<li>긴 시간을 가진 프로세스가 실행되지 않는 Starvation이 일어날 수 있음</li>
</ul>
</li>
<li>우선순위<ul>
<li>오래된 작업에 우선순위를 높이는 방법을 줘서 단점 보완</li>
</ul>
</li>
</ul>
<h4 id="선점-방식">선점 방식</h4>
<ul>
<li>RR (Round Robin)<ul>
<li>우선순위 스케줄링 </li>
<li>각 프로세스는 동일한 할당 시간을 주고 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로가는 알고리즘</li>
<li>로드밸런서에서 트래픽 분산 알고리즘으로 활용</li>
</ul>
</li>
<li>SRF(Shortest Remaining Time First)<ul>
<li>중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘</li>
</ul>
</li>
<li>다단계 큐<ul>
<li>우선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케쥴링 알고리즘을 적용한 것</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TCP/IP 4계층 모델]]></title>
            <link>https://velog.io/@yg-kim-korean/TCPIP-4%EA%B3%84%EC%B8%B5-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@yg-kim-korean/TCPIP-4%EA%B3%84%EC%B8%B5-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Wed, 11 Oct 2023 15:22:50 GMT</pubDate>
            <description><![CDATA[<p align="center"><img src="https://velog.velcdn.com/images/yg-kim-korean/post/c6c393e2-92ad-4232-8842-356634e6851d/image.png" width="70%" height="50%"></p>

<h3 id="각-계층은-특정-계층이-변경되었을-때-다른-계층이-영향받지-않도록-설계됨">각 계층은 특정 계층이 변경되었을 때 다른 계층이 영향받지 않도록 설계됨</h3>
<p>ex. TCP -&gt; UDP 변경되더라도 인터넷 웹 브라우저를 다시 설치하는 것은 아님</p>
<h3 id="애플리케이션-계층">애플리케이션 계층</h3>
<ul>
<li>FTP, SMTP, HTTP, SSH, DNS 등의 응용 프로그램이 사용되는 프로토콜 계층</li>
<li>웹서비스, 이메일등 서비스를 실질적으로 사람들에게 제공하는 층<h3 id="전송계층">전송계층</h3>
</li>
<li>송신자와 수신자를 연결하는 통신 서비스를 제공</li>
<li>연결자와 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공</li>
<li>애플리케이션과 인터넷 계층 사이의 데이터 전달시 중계 역할</li>
<li>TCP, UDP, QUIC<ul>
<li>TCP <ul>
<li>패킷사이 순서 보장 / 연결 지향 프로토콜을 사용하여 신뢰성 구축 -&gt; 가상회선 패킷 교환 방식 사용 </li>
<li>연결과정 (3웨이 핸드쉐이크 -&gt; SYN단계, SYN+ACK단계, ACK단계)</li>
<li>연결 해제 과정(4웨이 핸드쉐이크 -&gt; FIN보내고 ACK, FIN 보내고 ACK 다시 받으면 해제 완료)</li>
<li><blockquote>
<p>두번째 FIN 이후 TIME_WAIT 하는 이유? -&gt; 지연 패킷 발생 대비, 두 장치가 연결이 닫혔는지 확인하기 위함</p>
</blockquote>
</li>
<li>UDP - 순서 보장 X / 단순히 데이터만 넘겨줌.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="인터넷-계층">인터넷 계층</h3>
<ul>
<li>장치로부터 받은 네트워크 패킷을 IP주소로 지정된 목적지로 전송하기위해 사용되는 계층</li>
<li>IP, ARP, ICMP</li>
<li>패킷을 수신해야 할 상대의 주소를 지정하여 데이터를 전달 ( 비연결형 )</li>
</ul>
<h3 id="링크계층네트워크-접근-계층">링크계층(네트워크 접근 계층)</h3>
<ul>
<li>실질적으로 데이터를 전달하며 장치간에 신호를 주고받는 &#39;규칙&#39;을 정하는 계층</li>
<li>유선 LAN(IEEE802.3)<ul>
<li>유선 LAN을 이루는 이더넷은 IEEE802.3 프로토콜을 따르며 전이중화 통신(양쪽 장치가 동시에 송수신할 수 있는 방식)을 사용</li>
</ul>
</li>
<li>CSMA/CD<ul>
<li>반이중화 통신</li>
<li>데이터를 보낸이후 충돌이 발생하면 일정 시간 이후 다시 보내는 방식</li>
</ul>
</li>
<li>무선 LAN(IEEE802.11)<ul>
<li>반이중화 통신 -&gt; 한 방향으로만 통신할 수 있는 방식( 데이터를 보낸 후 수신 완료 전 까지 다시 보내지 못함)</li>
</ul>
</li>
<li>CSMA/CA<ul>
<li>반이중화 통신중 하나로 장치에서 데이터를 보내기 전까지 캐리어 감지 등으로 사전에 충돌을 방지하는 방식</li>
</ul>
</li>
<li>와이파이</li>
<li>BSS( Basic Service Set )<ul>
<li>기본 서비스 집합을 의미</li>
<li>단순 공유기로 접속하는게 아닌 동일 BSS 내에 있는 AP들과 장치들이 서로 통신이 가능한 구조를 말함</li>
<li>하나의 AP로만 구축되어 있기때문에 이동하며 네트워크 사용 불가</li>
</ul>
</li>
<li>ESS( Extended Service Set )<ul>
<li>하나 이상의 연결된 BSS 그룹</li>
<li>여러 BSS가 모여 있는 것이기 때문에 다른 장소로 이동하면서도 네트워크 사용 가능</li>
</ul>
</li>
</ul>
<h4 id="계층간-송수신-과정">계층간 송수신 과정</h4>
<ul>
<li>애플리케이션 -&gt; 전송 -&gt; 인터넷 -&gt; 링크 -&gt; 링크(다른 네트워크) -&gt; 인터넷 -&gt; 전송 -&gt; 애플리케이션</li>
</ul>
<h4 id="캡슐화-과정">캡슐화 과정</h4>
<ul>
<li><p>계층을 거치며 캡슐화하여 전송</p>
<ul>
<li>⬇ [ 데이터 ]  - 애플리케이션 계층</li>
<li>⬇ [ TCP(L4) 헤더 | 데이터 ] - 전송 계층</li>
<li>⬇ [ IP(L3) 헤더 | TCP(L4) 헤더 | 데이터 ] - 인터넷 계층</li>
<li>⬇ [ 프레임 헤더 | IP(L3) 헤더 | TCP(L4) 헤더 | 데이터 | 프레임 헤더] - 링크 계층</li>
</ul>
</li>
</ul>
<h4 id="비캡슐화-과정">비캡슐화 과정</h4>
<ul>
<li><p>계층에 따라 비캡슐화 과정을 통해 데이터 받음</p>
<ul>
<li>⬆ [ 데이터 ]  - 애플리케이션 계층</li>
<li>⬆ [ TCP(L4) 헤더 | 데이터 ] - 전송 계층</li>
<li>⬆ [ IP(L3) 헤더 | TCP(L4) 헤더 | 데이터 ] - 인터넷 계층</li>
<li>⬆ [ 프레임 헤더 | IP(L3) 헤더 | TCP(L4) 헤더 | 데이터 | 프레임 헤더] - 링크 계층</li>
</ul>
</li>
</ul>
<h3 id="pdu--protocol-data-unit-">PDU ( Protocol Data Unit )</h3>
<ul>
<li>네트워크 한 계층에서 다른 계층으로 데이터가 전달될 때 한 덩어리의 단위를 PDU라고 함</li>
<li>제어 관련 정보들이 포함된&#39;헤더&#39;, 데이터를 의미하는 &#39;페이로드&#39;로 구성되어 각 계층마다 부르는 명칭이 다름<ul>
<li>애플리케이션 계층 - 메시지</li>
<li>전송 계층 - 세그먼트(TCP), 데이터그램(UDP)</li>
<li>인터넷 계층 - 패킷</li>
<li>링크 계층 - 프레임(데이터링크 계층), 비트(물리 계층)</li>
</ul>
</li>
</ul>
<h2 id="네트워크-기기">네트워크 기기</h2>
<h4 id="애플리케이션-계층-처리-기기">애플리케이션 계층 처리 기기</h4>
<ul>
<li><p>L7 스위치 (로드 밸런서) - 서버의 부하를 분산하는 기기</p>
<ul>
<li><p>IP, URL, 서버, 캐시, HTTP 헤더, 쿠키들을 기반으로 트래픽 분산</p>
</li>
<li><p>바이러스 등 필터링 기능</p>
</li>
<li><p>전송 계층을 처리하는 L4 스위치는 스트리밍에서 사용하지 못하며 메시지를 기반으로 인식하지못해 IP와 포트를 기반으로 트래픽을 분산함.</p>
</li>
<li><p>클라우드 서비스(AWS 등)에서 L7 스위치를 이용한 로드밸런싱을 ALB(Application Load Balancer) 컴포넌트로 하며, L4 스위치를 이용한 로드 밸런싱은 NLB( Network Load Balancer) 컴포넌트로 함.</p>
</li>
<li><p>헬스 체크</p>
<ul>
<li>정상적인 서버 또는 비정상적인 서버를 판별하는데, 전송주기와 재전송 횟수등을 설정한 이후 반복적으로 서버에 요청을 보내는 것</li>
</ul>
</li>
<li><p>로드 밸런서를 이용한 서버 이중화 - 2대 이상의 서버를 기반으로 가상 IP를 제공하여 안정적인 서비스를 제공</p>
</li>
</ul>
</li>
</ul>
<h4 id="인터넷-계층-처리-기기">인터넷 계층 처리 기기</h4>
<ul>
<li>라우터<ul>
<li>여러개의 네트워크를 연결, 분할, 구분 시키는 역할</li>
</ul>
</li>
<li>L3 스위치<ul>
<li>L2 스위치와 라우팅 기능을 갖춘 장비</li>
</ul>
</li>
</ul>
<h4 id="데이터-링크-계층-처리-기기">데이터 링크 계층 처리 기기</h4>
<ul>
<li><p>L2 스위치</p>
<ul>
<li>장치들의 MAC 주소를 MAC 주소 테이블을 통해 관리하며, 연결된 장치로부터 패킷이 왔을때 패킷 전송을 담당</li>
</ul>
</li>
<li><p>브리지</p>
<ul>
<li>두개의 근거리 통신망(LAN) 을 상호 접속할 수 있도록 하는 통신망 연결 장치</li>
<li>포트와 포트 사이의 다리 역할을 하고, 장치에서 받아온 MAC 주소를 MAC 주소 테이블로 관리</li>
<li>통신망 범위 확장</li>
<li>서로 다른 LAN 등으로 이루어진 &#39;하나의&#39; 통신망을 구축할 때 쓰임<h4 id="물리-계층-처리-기기">물리 계층 처리 기기</h4>
</li>
</ul>
</li>
<li><p>NIC (Network Interface Card , LAN 카드)</p>
</li>
<li><p>리피터 - 들어오는 약해진 신호 정도를 증폭하여 다른 쪽으로 전달하는 장치</p>
</li>
<li><p>AP(Access Point) - 패킷을 복사하는 기기</p>
</li>
</ul>
<h2 id="ip-주소">IP 주소</h2>
<h4 id="arp-address-resolution-protocol">ARP (Address Resolution Protocol)</h4>
<ul>
<li>IP 주소로부터 MAC 주소를 구하는 IP와 MAC 주소의 다리 역할을 하는 프로토콜</li>
<li>ARP를 통해 가상 주소인 IP 주소를 실제 주소인 MAC 주소로 변환 &lt;-&gt; RARP로 MAC-&gt;IP</li>
</ul>
<h4 id="홉바이홉-통신">홉바이홉 통신</h4>
<ul>
<li>IP 주소를 통해 통신하는 과정을 홉바이홉 통신이라고 함</li>
<li>라우팅 테이블<ul>
<li>송신지에서 수신지 까지 도달하기 위해 사용됨</li>
<li>라우터에 들어가 있는 목적지 정보들과 그 목적지로 가기 위한 방법이 들어 있는 리스트</li>
</ul>
</li>
<li>게이트 웨이<ul>
<li>서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 하는 관문 역할을 하는 컴퓨터나 소프트웨어</li>
</ul>
</li>
</ul>
<h4 id="ip-주소-체계">IP 주소 체계</h4>
<ul>
<li>IPv4<ul>
<li>32비트를 8비트 단위로 점을 찍어 표기 (ex. 192.6.6.8)</li>
</ul>
</li>
<li>IPv6<ul>
<li>64비트를 16비트 단위로 점을 찍어 표기(ex. fe80::672:c638:c45:24a2%20)</li>
</ul>
</li>
<li>DHCP ( Dynamic Host Configuration Protocol )<ul>
<li>IP 주소 및 기타 토인 매개변수를 자동으로 할당하기 위한 네트워크 관리 프로토콜</li>
</ul>
</li>
<li>NAT ( Network Address Translation )<ul>
<li>패킷이 라우팅 장치를 통해 전송되는 동안 패킷의 IP 주소 정보를 수정해 IP 주소를 다른 주소로 매핑하는 방법</li>
<li>IPv4 주소 만으로는 수를 감당하지 못했는데, NAT로 공인 IP와 사설 IP로 나눠서 많은 주소를 처리 (외부 인터넷으로 나갈때는 공인 IP로 변경함)</li>
<li>보안성 상승</li>
<li>여러명이 동시에 인터넷에 접속하므로, 사용하는 호스트 숫자에 따라 접속 속도가 느려짐</li>
</ul>
</li>
</ul>
<h2 id="http">HTTP</h2>
<h4 id="http2">HTTP/2</h4>
<ul>
<li>HTTP/2는 SPDY 프로토콜에서 파생된 HTTP/1.x 보다 지연 시간을 줄이고 응답시간을 더 빠르게 할 수 있으며 멀티플렉싱, 헤어 압축, 서버 푸시, 요청의 우선순위 처리를 지원하는 프로토콜</li>
<li>멀티 플렉싱 - 여러 개의 스트림을 사용하 송수신 함 -&gt; 특정 스트림이 손실되었어도 다른 스트림에는 영향을 미치지 않음</li>
<li>헤더 압축 - 허프만 코딩으로 압축</li>
<li>서버 푸시 - HTTP/1.x 와 달리 요청이 없어도 서버에서 바로 리소스를 푸시할 수 있음(html 요청시 서버에서 html만 보내는게 아니라 요청을 받지 않아도 css 같이 보냄)</li>
</ul>
<h4 id="https">HTTPS</h4>
<ul>
<li>애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은 신뢰 할 수있는 HTTP 요청</li>
<li>통신 암호화</li>
<li>SSL/TLS<ul>
<li>전송 계층에서 보안을 제공하는 프로토콜</li>
<li>제 3자가 메시지를 도청하거나 변조하지 못하도록 함</li>
<li>인증 메커니즘 - CA에서 발급한 인증서를 기반으로 이루어짐</li>
</ul>
</li>
<li>암호화 알고리즘<ul>
<li>해싱 알고리즘 - SHA-256, SHA-384</li>
<li>SHA-256<ul>
<li>해시 함수의 결괏값이 256비트인 알고리즘이며 비트 코인을 비롯한 많은 블록체인 시스템에서도 사용</li>
</ul>
</li>
</ul>
</li>
<li>SEO(Search Engine Optimization) - 검색엔진 최적화</li>
<li>SEO가 높으면 검색 사이트에서 상단에 올라올 수 있다 -&gt; HTTPS를 사용하면 순위가 높아짐</li>
<li>SEO 관리<ul>
<li>캐노니컬 설정 -&gt; 사이트 링크에 canonical을 설정 (ex. &lt;link rel=&quot;canonical&quot; .../&gt;</li>
<li>메타 설정 -&gt; html 파일의 가장 윗부분인 메타를 잘 설정 해야함</li>
<li>페이지 속도 개선</li>
<li>사이트맵 관리</li>
</ul>
</li>
<li>HTTPS 구축 방법<ul>
<li>직접 CA에서 구매한 인증서를 기반으로 HTTPS 서비스 구축</li>
<li>서버 앞단의 HTTPS를 제공하는 로드 밸런서두기</li>
<li>서버 앞단에 HTTPS를 제공하는 CDN을 둬서 구축</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네트워크 기초]]></title>
            <link>https://velog.io/@yg-kim-korean/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@yg-kim-korean/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Wed, 11 Oct 2023 07:47:33 GMT</pubDate>
            <description><![CDATA[<ul>
<li><strong>네트워크</strong> - 노드와 링크가 서로 연결되어 있으며 리소스를 공유하는 집합을 의미</li>
<li><strong>처리량</strong> - 링크 내에서 성공적으로 전달된 데이터의 양을 말하며 보통 얼만큼의 트래픽을 처리했는지를 나타냄(단위-bps(bits per second))</li>
<li><strong>트래픽</strong> - 특정 시점에 링크내에 &#39;흐르는&#39; 데이터의 양</li>
<li><strong>지연시간</strong> - 요청이 처리되는 시간</li>
</ul>
<h2 id="네트워크-토플로지">네트워크 토플로지</h2>
<ul>
<li>노드와 링크가 어떻게 배치되어 있는지에 대한 방식이자 연결형태</li>
<li>트리 토플로지 - 계층형 토플로지라고도 하며 트리 형태로 네트워크 구성-&gt;노드 추가,삭제가 쉽지만, 트래픽이 집중될 때 하위 노드에 영향을 끼칠 수 있음</li>
<li>버스 토플로지 - 중앙회선 하나에 여러개의 노드가 연결되어 있는 형태(ex. 근거리 통신망(LAN)) -&gt; 서리 비용이 적고 신뢰성이 우수하고 노드 추가 삭제가 쉽지만 <strong>*스푸핑</strong>이 가능한 문제점</li>
<li><strong>스푸핑</strong> - LAN상에서 송신부의 패킷을 송신과 관련없는 다른 호스트에 가지 않도록 스위칭 기능을 마비시키거나 속여 특정 노드에 해당패킷이 오도록 처리하는것</li>
<li>스타 토플로지 - 중앙에 있는 노드에 모두 연결된 네트워크 구성 -&gt; 노드 추가 및 에러 감지가 쉽고 패킷 충돌 가능석이 적지만 중앙 노드에 에러가 발생하면 전체 네트워크를 사용할수 없으며 초기 설치 비용이 많이 듦</li>
<li>링형 토플로지 - 각 노드가 양 옆의 노드와 연결되어 전체적으로 고리처럼 연결된 구성 -&gt; 노드가 증가되어도 네트워크상 손실이 없지만, 구성 변경이 쉽지 않으며 회선에 장애가 있을시 전체 네트워크에 영향을 크게 끼침</li>
<li>메시 토플로지 - 그물망처럼 연결되어 있는 구조-&gt; 한쪽에 장애가 발생해도 다른 경로가 존재하기 때문에 계속 사용할 수 있고 트래픽 분산 처리가 가능하지만 노드의 추가가 어렵고 구축비용과 운영비용이 고가인 단점이 있음</li>
</ul>
<h2 id="병목현상">병목현상</h2>
<ul>
<li>전체 시스템의 선응이나 용령이 하나의 구성요소로 인해 제한 받는 현상</li>
<li><strong>토플로지가 중요한 이유는 병목현상을 찾을때 중요한 기준이 되기 때문</strong></li>
<li>주된 원인<ul>
<li>네트워크 대역폭</li>
<li>네트워크 토폴로지</li>
<li>서버 CPU, 메모리 사용량</li>
<li>비효율적인 네트워크 구성</li>
</ul>
</li>
</ul>
<h4 id="네트워크-분류">네트워크 분류</h4>
<ul>
<li>LAN(Local Area Network)<ul>
<li>근거리 통신망을 의미하며 같은 건물이나 캠퍼스 같은 좁은 공간에서 운영</li>
<li>전송속도가 빠르며 혼잡하지 않음</li>
</ul>
</li>
<li>MAN(Metropolitan Area Network) - 서울시 규모</li>
<li>WAN(Wide Area Network) - 세계 구모</li>
</ul>
<h3 id="네트워크-성능-분석-명령어">네트워크 성능 분석 명령어</h3>
<ul>
<li>ping(Packet Internet Groper) - 네트워크 상태를 확인하려는 대상 노드를 향행 일정 크기의 패킷을 전송하는 명령어(TCP/IP 프로토콜중 ICMP를 사용하기 때문에 ICMP 프로토콜을 지원하지 않는 기기를 대상으로는 사용을 불가함) (ex. ping <a href="http://www.google">www.google</a>. -n 12)</li>
<li>netstat - 접속되어 있는 서비스들의 네트워크 상태 표시 주로 서비스 포트가 열려 있는지 확인할 때 사용</li>
<li>nslookup - DNS에 관련된 내용을 확인하기위해 쓰는 명령어-&gt; 특정 도메인에 매핑된 IP를 확인하기 위해 사용</li>
<li>tracert / traceroute - 목적지 노드까지 네트워크 경로를 확인할 때 사용하는 명령어</li>
</ul>
<h3 id="네트워크-프로토콜-표준화">네트워크 프로토콜 표준화</h3>
<ul>
<li>IEEE, IETF에서 표준화함</li>
<li>HTTP 프로토콜로 노드들은 웹서비스를 기반으로 데이터를 주고 받음.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[디자인 패턴]]></title>
            <link>https://velog.io/@yg-kim-korean/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@yg-kim-korean/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Tue, 10 Oct 2023 17:35:07 GMT</pubDate>
            <description><![CDATA[<h3 id="싱글톤-패턴">싱글톤 패턴</h3>
<ul>
<li>하나의 클래스로 하나의 인스턴스를 만듦(ex. DB 연결 모듈)</li>
<li>장점 : 하나의 인스턴스를 만들어 놓고 다른 모듈들이 공유하기때문에 인스턴스 생성시 발생하는 비용 감소</li>
<li>단점 <ul>
<li>TDD(Test Driven Development)를 수행할 때 단위 테스트를 하지만, 싱글톤은 미리 생성된 하나의 인스턴스를 기반으로 구현하므로 테스트 마다 독립적인 인스턴스를 만들기가 어려움</li>
<li>모듈간의 결합을 강하게 만듦(의존적 종속성) -&gt; 의존성 주입(DI, Dependency Injection)으로 해결할 수 있음 <ul>
<li>의존성 주입 장점 : 의존성 주입을 통해 모듈들을 쉽게 교체할 수 있는 고조가 되어 테스트 및 마이그레이션을 수행할 때 수월해짐 / </li>
<li>의존성 주입 단점: 모듈들이 분리되기 때문에 클래스 수가 늘어나 복잡성이 증가되며 약간의 런타임 패널티가 발생함.<ul>
<li>의존성 주입의 원칙 - 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 말아야하며, 둘다 추상화에 의존하고, 추상화는 세부사항에 의존하지 말아야함.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="팩토리-패턴">팩토리 패턴</h3>
<ul>
<li><strong>결합도</strong>( <em>한 클래스에 변경점이 얼마나 다른 클래스에 영향을 주는가를 의미</em> )를 줄이기 위해 생김</li>
<li>객체를 생성하기위해 인터페이스를 정의할 때 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정-&gt; 클래스의 인스턴스를 만드는 일을 서브클래스에 맡김.</li>
<li>장점<ul>
<li>객체간의 결합도를 낮춤</li>
<li>단일 책임의 원칙을 따름. 프로그램의 코드에서 생성자 코드를 분리</li>
</ul>
</li>
<li>단점<ul>
<li>패턴을 구현할 많은 서브 클래스를 도입함으로써 코드가 복잡해짐</li>
</ul>
</li>
</ul>
<h3 id="전략-패턴--정책패턴">전략 패턴 / 정책패턴</h3>
<ul>
<li>객체의 행위를 바꾸고 싶은 경우 캡슐화한 알고리즘을 컨텍스트안에서 바꿔주면서 상호교체 가능하게 만드는 패턴</li>
<li>ex. node.js에서 passport 인증모듈 라이브러리 -&gt; 아이디 비밀번호로 인증하는 LocalStrategy 혹은 다른 서비스를 기반으로 인증하는 OAuth 전략으로 인증</li>
</ul>
<h3 id="옵저버-패턴">옵저버 패턴</h3>
<ul>
<li>주체(객체의 상태변화를 보고잇는 관찰자)가 객체의 상태 변화를 관찰하다가 변화가 있을 경우에만 메서드 등을 통해 옵저버 목록에 있는 옵저버(객체의 변화에 따라 추가 변화 사항이 있는 객체들)들에게 변화를 알려주는 디자인 패턴</li>
<li>ex. 인스타그램에 글을 올리면 팔로잉 하는 사람들에게 알림이 감 / MVC패턴에도 모델에서 변경이 생겨 update() 메서드로 옵저버인 뷰에 알려주고, 컨트롤러등이 작동하는 방식</li>
</ul>
<h3 id="프록시-패턴과-프록시-서버">프록시 패턴과 프록시 서버</h3>
<ul>
<li>대상 객체에 접근하기 전 그접근에 대한 흐름을 가초래 대상 객체 앞단의 인터페이스 역할을 하는 디자인패턴</li>
<li>ex. 객체의 속성, 변환등을 보완하여 보안, 데이터 검증, 캐싱, 로깅에 사용</li>
<li><strong>프록시 서버</strong>는 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킴 -&gt; ex. nginx는 비동기 이벤트 기반의 구조와 다수의 연결을 효과적으로 처리 가능한 웹서버</li>
<li>cors 에러 해결을 위해서도 프록시 서버를 구성해서 프론트엔드-&gt; 백엔드로 넘어갈때 포트번호를 맞춰주어 cors 에러를 해결</li>
</ul>
<h3 id="이터레이터-패턴">이터레이터 패턴</h3>
<ul>
<li>이터레이터를 사용해 컬렉션의 요소들에 접근하는 디자인 패턴</li>
<li>집합체 내에서 어떤 식으로 일이 처리되는지 몰라도 그 안에 들어있는 항목들에 대해서 반복작업을 수행</li>
</ul>
<h3 id="노출모듈-패턴">노출모듈 패턴</h3>
<ul>
<li>즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SPA (단일 페이지 애플리케이션)]]></title>
            <link>https://velog.io/@yg-kim-korean/SPA-%EB%8B%A8%EC%9D%BC-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@yg-kim-korean/SPA-%EB%8B%A8%EC%9D%BC-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98</guid>
            <pubDate>Tue, 10 Oct 2023 06:41:10 GMT</pubDate>
            <description><![CDATA[<h3 id="--사용자-경험을-향상시키기-위해-웹-페이지를-동적으로-로딩하고-업데이트하는-방식">- 사용자 경험을 향상시키기 위해 웹 페이지를 동적으로 로딩하고 업데이트하는 방식</h3>
<h3 id="--다중-페이지-웹-애플리케이션과-달리-처음-html-css-및-javascript-리소스를-로드한-후-서버로부터-요청에-대한-데이터만-비동기적으로-가져와서-페이지-업데이트">- 다중 페이지 웹 애플리케이션과 달리, 처음 HTML, CSS 및 JavaScript 리소스를 로드한 후, 서버로부터 요청에 대한 데이터만 비동기적으로 가져와서 페이지 업데이트</h3>
<h2 id="---특징">** - 특징**</h2>
<ul>
<li>단일페이지</li>
<li>클라이언트 사이드 렌더링 -&gt; 클라이언트 측에서 페이지를 렌더링하고 동적으로 업데이트</li>
<li>AJAX와 비동기 통신</li>
<li></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[좋은 아키텍처]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%A2%8B%EC%9D%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%A2%8B%EC%9D%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98</guid>
            <pubDate>Tue, 19 Sep 2023 09:25:49 GMT</pubDate>
            <description><![CDATA[<h1 id="좋은-아키텍처-클린-아키텍처">좋은 아키텍처 (클린 아키텍처)</h1>
<p>(출처 - <a href="https://www.youtube.com/watch?v=g6Tg6_qpIVc">https://www.youtube.com/watch?v=g6Tg6_qpIVc</a>)
페러다임 / 설계원칙(SOLID) / 컴포넌트 응집성 원칙 / 컴포넌트 결합 원칙
더 쉽게</p>
<h3 id="--아키텍처-패턴">-&gt; 아키텍처 패턴</h3>
<ul>
<li>계층형 아키텍처 / 클린 아키텍처 / 헥사고날 아키텍처
레시피(패턴) 사용법</li>
</ul>
<ol>
<li>그냥 따라해보기</li>
<li>원칙 학습 후 이해하고 다시 따라해보기</li>
<li>각자의 프로젝트에 적용해보기</li>
<li>고민이 되는 지점들은 원칙에 맞게, 크게 벗어나지 않는 선에서 타협하며 적용해보기</li>
</ol>
<h4 id="클린-아키텍처">클린 아키텍처</h4>
<ul>
<li>웹 -&gt; 도메인 &lt;- 영속성 처럼 도메인이 중심이다(의존성 역전을 이용)</li>
<li>장점 -&gt; 규칙 단순 / 도메인이 세부사항에 의존 X( DDD 적용 용이/ 비즈니스 규칙에 집중이 쉬움) </li>
<li>*DDD-&gt; 도메인 주도 설계 *</li>
<li>단점 -&gt; 패키지 구조가 계층형보가 복잡 / 익숙하지않아서 버벅일 수 있음 / 레퍼런스가 적음</li>
</ul>
<h3 id="클린-아키텍처란---여러-아키텍처를-하나로-통합-시도--관심사의-분리">클린 아키텍처란? -&gt; 여러 아키텍처를 하나로 통합 시도 ( 관심사의 분리)</h3>
<center><img src="https://velog.velcdn.com/images/yg-kim-korean/post/c2f1337b-0676-4d57-8be9-99acefd71f21/image.png" width="50%" height="50%"></center>

<ul>
<li>핵심 -&gt; 중요도에 따라 계층을 나눔 / 의존성의 방향은 항상 안쪽, 고수준을 향함 -&gt; 다형성을 이용해 의존성은 어디든지 역전 가능</li>
</ul>
<h4 id="헥사고날-아키텍쳐">헥사고날 아키텍쳐?</h4>
<ul>
<li>클린 아키텍처 기본 다이어그램과 가장 비슷함</li>
<li>따라할 수 있는 쿡북이나 레퍼런스가 가장 많음.</li>
</ul>
<center><img src="https://velog.velcdn.com/images/yg-kim-korean/post/68cbe8d0-625a-4032-80cd-12fa7187099b/image.png" width="50%" height="50%"></center>

<ul>
<li>포트와 어댑터(헥사고날) 사용
특징 -&gt; 수직, 수평으로 나눔 / DB계층에 대한 의존성 역전
장점 -&gt; 도메인이 다른 세부 사항에 의존하지 않음 / 수직, 수평 계층구조의 장점을 가짐
단점 -&gt; 클래스와 패키지 구조가 더 많아짐.</li>
</ul>
<center><img src="https://velog.velcdn.com/images/yg-kim-korean/post/ffa90324-98c8-45d4-ab7b-5f80c677d53f/image.PNG" width="40%" height="30%"></center>


<p>클린 아키텍처 적용 X -&gt; 소규모 프로젝트 진행/ 프로젝트를 진행하는 개발자가 이해하고 있지 않을때!</p>
<p><strong><em>헥사고날 아키텍처 적용시 라인, 파일, 패키지가 상당히 증가함</em></strong></p>
<center><img src="https://velog.velcdn.com/images/yg-kim-korean/post/8d6dbaf3-54e9-4991-b783-951569c960fd/image.PNG" width="70%" height="50%"></center>

<p>JPA 사용시</p>
<center><img src="https://velog.velcdn.com/images/yg-kim-korean/post/ac74ab22-dcc0-4cef-8688-6df0d1f217ff/image.PNG" width="70%" height="50%"></center>


<p>소프트웨어에서 아키텍처의 중요성
-&gt; 좋은 아키텍처를 구성하는 방법 클린 아키텍처 -&gt; 하지만 클릭아키텍처는 애매-&gt; 규칙이 단순하기 때문 -&gt; 그렇기 때문에 기준을 잡아야된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Pororo 설치 오류]]></title>
            <link>https://velog.io/@yg-kim-korean/Pororo-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@yg-kim-korean/Pororo-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Wed, 30 Aug 2023 14:44:58 GMT</pubDate>
            <description><![CDATA[<p>참조사이트 - <a href="https://kwanghori.tistory.com/52">https://kwanghori.tistory.com/52</a></p>
<ol>
<li>WSL2 설치 / 우분투 설치
<a href="https://gaesae.com/161">https://gaesae.com/161</a></li>
<li>아나콘다 WSL2에 설치
<a href="https://kwanghori.tistory.com/46">https://kwanghori.tistory.com/46</a></li>
<li>아나콘다 설치 후 python 3.7 버전 설치</li>
</ol>
<p>-&gt; <code>conda create -n pororo python=3.7</code>
-&gt; 이후 가상환경으로 설정 하지 않고 참조사이트 대로만 따라서
<code>conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.1 -c pytorch</code>
명령어로 설치 하려다보니 계속 pytorch 1.6 버전이 설치가 되지 않아 진행되지 못하고 있었음.</p>
<p>-&gt; 그렇기 때문에
<code>conda create -n pororo python=3.7</code> 로 가상환경 pororo로 설치 후에
<code>conda activate pororo</code> 로 꼭 활성화 시켜줘야함..
아래 사진 그림 처럼 base -&gt; pororo로 변경
<img src="https://velog.velcdn.com/images/yg-kim-korean/post/a9f05cc1-45d4-4381-bf33-7bc18cfa623c/image.PNG" alt=""></p>
<p>4.<code>git clone https://github.com/kakaobrain/pororo.git</code>
<code>cd pororo</code>
<code>pip install -e .</code>
하는데..</p>
<ol start="5">
<li>권한 관련 에러 메세지는 뜨지도 않았는데...
<img src="https://velog.velcdn.com/images/yg-kim-korean/post/1caa543d-433f-46e5-a48a-b554cf42977f/image.PNG" alt="">
pip 유저 옵션 - 권한 문제 해결
<code>python -m pip install -U pip --user</code>
위에 명령어 입력후 거짓말 처럼 설치가 시작됨..
하지만..
참고 -&gt; &quot;<a href="https://kangaroo-dev.tistory.com/1&quot;">https://kangaroo-dev.tistory.com/1&quot;</a></li>
</ol>
<p>fairseq 관련 에러가 뜨고..
참고 - &quot;<a href="https://velog.io/@ldc/Pororo-ASRAuto-Speech-Recognition-%EC%84%A4%EC%B9%98%EB%A5%BC-%EC%9C%84%ED%95%9C-%EA%B3%A0%EA%B5%B0%EB%B6%84%ED%88%AC%EA%B8%B0&quot;">https://velog.io/@ldc/Pororo-ASRAuto-Speech-Recognition-%EC%84%A4%EC%B9%98%EB%A5%BC-%EC%9C%84%ED%95%9C-%EA%B3%A0%EA%B5%B0%EB%B6%84%ED%88%AC%EA%B8%B0&quot;</a>
에서 보고 안되는거 그냥 따로 pip install 진행
<img src="https://velog.velcdn.com/images/yg-kim-korean/post/2bce73a6-b663-499a-b118-4e6f35361110/image.PNG" alt=""></p>
<p>정상작동 확인..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Jpa import 실패]]></title>
            <link>https://velog.io/@yg-kim-korean/Jpa-import-%EC%8B%A4%ED%8C%A8</link>
            <guid>https://velog.io/@yg-kim-korean/Jpa-import-%EC%8B%A4%ED%8C%A8</guid>
            <pubDate>Tue, 15 Aug 2023 08:18:02 GMT</pubDate>
            <description><![CDATA[<p>새로 생성한 프로젝트에서 기존 클래스를 가져와서 재사용 하려 했지만
jpa import가 되지않음..
import javax.persistence.PrePersist; 등등</p>
<p>gradle에 jpa는 정상적으로 로드되었는데 import 되지않음..
찾아보니</p>
<p>import jakarta.persistence.PreUpdate; 로 변경됨
자세한건 구글링..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컨테이너 / 도커]]></title>
            <link>https://velog.io/@yg-kim-korean/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%8F%84%EC%BB%A4</link>
            <guid>https://velog.io/@yg-kim-korean/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%8F%84%EC%BB%A4</guid>
            <pubDate>Thu, 30 Mar 2023 06:29:03 GMT</pubDate>
            <description><![CDATA[<h3 id="1-컨테이너-기술이란">1. 컨테이너 기술이란</h3>
<ul>
<li>컨테이너<ul>
<li>모듈화되고 격리된 컴퓨팅 공간 또는 컴퓨팅 환경 -&gt; 어플리케이션을 구동하는 환경을 격리한 공간을 의미</li>
<li>하나의 OS 환경안에서 가상OS 환경을 &#39;프로세스&#39; 단위로 분리 할 수 있기 때문에 멀티 OS 환경을 제공</li>
</ul>
</li>
</ul>
<h3 id="2-도커란">2. 도커란</h3>
<ul>
<li>도커<ul>
<li>리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트</li>
</ul>
</li>
<li>구성요소 <ul>
<li>도커 데몬, 도커 클라이언트, 도커 레지스트리, 도커 허브, 도커 객체, 도커 이미지, 도커 컨테이너</li>
</ul>
</li>
</ul>
<h3 id="3-도커-파일-도커-이미지-도커-컨테이너의-개념">3. 도커 파일, 도커 이미지, 도커 컨테이너의 개념</h3>
<ul>
<li>도커 파일<ul>
<li>코드 형태의 텍스트 문서로 도커 이미지를 생성할 때 사용함</li>
</ul>
</li>
<li>도커 이미지<ul>
<li>도커 파일로 생성됨</li>
<li>ex) 가상머신 생성시 사용하는 iso 파일</li>
<li>컨테이너를 생성하고 실행할 때 읽기 전용으로 사용되며 여러 계층으로 된 바이너리 파일로 존재</li>
</ul>
</li>
<li>도커 컨테이너<ul>
<li>도커 이미지로 생성됨</li>
<li>목적에 따른 도커 이미지를 사용하여 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간(프로세스)이 생성</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring 암호화 추가]]></title>
            <link>https://velog.io/@yg-kim-korean/Spring-%EC%95%94%ED%98%B8%ED%99%94-%EC%B6%94%EA%B0%80</link>
            <guid>https://velog.io/@yg-kim-korean/Spring-%EC%95%94%ED%98%B8%ED%99%94-%EC%B6%94%EA%B0%80</guid>
            <pubDate>Thu, 05 Jan 2023 05:11:25 GMT</pubDate>
            <description><![CDATA[<pre><code>package com.server.RoadToInerview.security;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.security.MessageDigest;

public class SHA512PasswordEncoder implements PasswordEncoder {
    private final Log logger = LogFactory.getLog(getClass()); // 로그생성하기
    @Override 
    public String encode(CharSequence rawPassword) {//인코딩하기
        if (rawPassword == null){
            throw new IllegalArgumentException(&quot;빈칸은 넣으면 안됨&quot;);
        }
        return this.getSHA512Pw(rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) { 
    //인코딩하여 저장한 것과 비교하기
        if (rawPassword == null) {
            throw new IllegalArgumentException(&quot;빈칸 X&quot;);
        }
        if (encodedPassword == null || encodedPassword.length() == 0) {
            this.logger.warn(&quot;빈칸 X&quot;);
            return false;
        }
        String encodedRawPw = this.getSHA512Pw(rawPassword);
        if (encodedPassword.length() != encodedRawPw.length()) { //길이 다르면 탈락
            return false;
        }
        for (int i = 0; i &lt; encodedPassword.length(); i++) {
            if(encodedPassword.charAt(i) != encodedRawPw.charAt(i)) return false;
        }
        return true;
    }


}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[@JsonIgnore]]></title>
            <link>https://velog.io/@yg-kim-korean/JsonIgnore</link>
            <guid>https://velog.io/@yg-kim-korean/JsonIgnore</guid>
            <pubDate>Tue, 13 Dec 2022 06:46:19 GMT</pubDate>
            <description><![CDATA[<h3 id="spring-jpa에서">Spring JPA에서</h3>
<h3 id="양방향-다대일-관계-설정-후">양방향 다대일 관계 설정 후</h3>
<h3 id="서로에-대한-엔티티를-가져와-보여주려고-하기때문에-무한-루프를-발생시켜">서로에 대한 엔티티를 가져와 보여주려고 하기때문에 무한 루프를 발생시켜</h3>
<h2 id="cannot-call-senderror-after-the-response-has-been-committed"><em><strong>Cannot call sendError() after the response has been committed</strong></em></h2>
<h3 id="에러가-발생함">에러가 발생함.</h3>
<h3 id="이때-manytoone에">이때 @ManyToOne에</h3>
<h3 id="jsonignore-추가">@JsonIgnore 추가</h3>
<pre><code>    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JsonIgnore
    @JoinColumn(name = &quot;interviews_id&quot;)
    private Interviews interviews_id;</code></pre><h3 id="해결됨">해결됨.</h3>
<h3 id="출처">출처</h3>
<p><a href="https://thalals.tistory.com/227">https://thalals.tistory.com/227</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VSC 가상환경 실행 오류]]></title>
            <link>https://velog.io/@yg-kim-korean/VSC-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@yg-kim-korean/VSC-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Sun, 30 Oct 2022 09:20:54 GMT</pubDate>
            <description><![CDATA[<h3 id="가상환경으로-실행하기위해-path를-등록하였는데-오류가-뜨면">가상환경으로 실행하기위해 path를 등록하였는데 오류가 뜨면</h3>
<p><img src="https://velog.velcdn.com/images/yg-kim-korean/post/ce6cb5d4-ff71-4c01-8404-c0278f53bd7b/image.PNG" alt=""></p>
<h1 id="windows-power-shell"><strong>windows power shell</strong></h1>
<h3 id="을-관리자-권한으로-실행하여">을 관리자 권한으로 실행하여</h3>
<h1 id="set-executionpolicy-unrestricted-입력">Set-ExecutionPolicy Unrestricted 입력</h1>
<p><img src="https://velog.velcdn.com/images/yg-kim-korean/post/64d2cbfe-cb0a-4e52-be8b-12f3a16a0a55/image.PNG" alt=""></p>
<h3 id="정상작동-함">정상작동 함</h3>
<p><img src="https://velog.velcdn.com/images/yg-kim-korean/post/a8703175-5842-45af-bcc4-84ffbf2a4c17/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA - CASCADE]]></title>
            <link>https://velog.io/@yg-kim-korean/JPA-CASCADE</link>
            <guid>https://velog.io/@yg-kim-korean/JPA-CASCADE</guid>
            <pubDate>Mon, 17 Jan 2022 15:50:43 GMT</pubDate>
            <description><![CDATA[<h1 id="type">Type</h1>
<h2 id="사용방법">사용방법</h2>
<ul>
<li>OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})</li>
<li>ManyToOne(cascade = {CascadeType.ALL})</li>
<li>...<h2 id="--all">- ALL</h2>
</li>
</ul>
<h2 id="--persist">- PERSIST</h2>
<p> Cascade insert</p>
<h2 id="--merge">- MERGE</h2>
<p> Cascade update</p>
<h2 id="--remove">- REMOVE</h2>
<p> Cascade delete 그냥 Remove 옵션만 사용하면 다른 엔티티에 연결되어 있는 엔티티도 연결이 끊어져 버림
 -&gt; OneToMany(orphanRemoval = true)
 다른값이 여전히 연결되어 있다면 orphanRemoval로 관계를 유지시킬 수  있음.</p>
<h2 id="--refresh">- REFRESH</h2>
<p> 엔티티와 연관되어 있는 다른 엔티티들도 연결함.</p>
<h2 id="--detach">- DETACH</h2>
<p> 영속성 분리 시킴.</p>
<h1 id="soft-delete">Soft Delete</h1>
<p>각 엔티티에 deleted 속성을 넣어서 실제로 데이터를 삭제하는 것이 아닌 컬럼을 생성하여 데이터가 보이지 않도록만 만듦.</p>
<p>각 객체에 @Entity 선언시에 annotation으로 @Where(clause = &quot;deleted = false&quot;) 를 추가하여 데이터를 검색할때 무조건 where절에 해당 문구가 들어가도록 설정함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA - Persistence( Transaction )]]></title>
            <link>https://velog.io/@yg-kim-korean/JPA-Persistence</link>
            <guid>https://velog.io/@yg-kim-korean/JPA-Persistence</guid>
            <pubDate>Sat, 15 Jan 2022 04:43:00 GMT</pubDate>
            <description><![CDATA[<h1 id="persistence">Persistence</h1>
<ul>
<li>영속성 (지속 접근 가능) = DB &lt;&gt; 메모리</li>
<li>JPA (EntityManager)</li>
</ul>
<h3 id="applicationyml">application.yml</h3>
<ul>
<li><p>spring.jpa.generate-ddl : true
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbspfalse</p>
</li>
<li><p>spring.jpa.hibernate.ddl-auto : create : 생성
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbspcreate-drop : 생성 후 삭제</p>
<pre><code>                     &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbspnone
                     &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbspupdate : db 업데이트</code></pre></li>
<li><p>jpa.hibernate.ddl-auto 이 설정되어 있으면 jpa.generate-ddl 무시.</p>
</li>
</ul>
<h2 id="transactional">@Transactional</h2>
<ul>
<li><p>@Transactional 사용시 각각의 메소드에서 영속성을 지님.</p>
</li>
<li><p>영속성 cache가 db에 반영되는 시점</p>
<ul>
<li>.flush() 사용시</li>
<li>.save() 사용시 클래스에 @Transactional사용하지 않으면 save에 각각의 @Transactional을 사용하고 있기때문에 바로바로</li>
<li>Transaction 종료시 (auto commit == auto flush)</li>
<li>@Transactional을 사용하면서 데이터 변경 후 모든 save후에 마지막에 findAll()을 수행할 경우 auto flush가 되어 db에 적용후에 데이터를 다시 가져옴</li>
</ul>
</li>
<li><p><strong>isolation</strong> </p>
<ul>
<li>READ_UNCOMMITTED ==&gt; 중간에 데이터가 들어오면 그것도 바뀌기 때문에 사용 x. (데이터 정합성이 발생하기 때문에 사용 하지 않음)</li>
<li>READ_COMMITTED</li>
<li>REPEATABLE_READ --&gt; 한 트랜잭션에서 다른데서 commit을 해도 트랜잭션 초기 값만 보여줌.</li>
<li>SERIALIZABLE --&gt; 최고 등급 isolation 커밋이 일어나지 않은 트랜잭션 존재시 lock을 걸고 웨이팅이 생김. (웨이팅이 생기므로 성능상 잘 사용하지 않음)</li>
</ul>
</li>
<li><p><strong>propagation -&gt; 하나의 메소드와 다른 메소드가 각각의 트랜잭션을 갖고 있기 때문에 그것을 잇기 위해 사용</strong></p>
<ul>
<li><strong>REQUIRED</strong> --&gt; 기존 사용되던 트랜잭션 사용 없을때만 새로운 트랜잭션( @Transactional 을 사용하지 않은 메소드에서 save 를 할 경우에는 save 하나 하나가 transaction이 되는것)</li>
<li>REQUIRES_NEW --&gt; 각 트랜잭션이 독립적으로 진행됨. save 처럼</li>
<li>NESTED --&gt; 하나의 트랜잭션이지만 분리되어 실행 시킬 수 있음 ex) a 트랜잭션 안에 b트랜잭션을 nested로 놓을 경우 b 가 에러가 나면 a는 정상적으로 커밋됨. 하지만 a가 에러가 나면 a,b 모두 커밋되지 않음.</li>
<li>SUPPORT --&gt; Required랑 비슷하지만 없을때는 새롭게 트랜잭션을 생성하지는 않음</li>
<li>NOT_SUPPORTED --&gt; 해당 영역은 트랜잭션 없이 실행 되도록 설정.</li>
<li>MANDATORY --&gt; 필수 적으로 트랜잭션이 존재해야함. 없으면 오류</li>
<li>NEVER --&gt; 트랜잭션이 없어야함. 있으면 오류</li>
<li>REQUIRED 을 제외한 것은 지양하여 사용함.</li>
</ul>
</li>
</ul>
<h2 id="persistence-entity-lifecycle">Persistence Entity LifeCycle</h2>
<ul>
<li>Entity Manager 객체<ul>
<li>Entity와 DB를 어떻게 연결해 주는지</li>
<li>entityManger.persist(객체명)</li>
<li>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp.detach</li>
<li>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp.merge</li>
<li>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp.flush</li>
<li>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp.clear</li>
<li>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp.remove </li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>