<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>suran-kim.log</title>
        <link>https://velog.io/</link>
        <description>개발 공부를 해라</description>
        <lastBuildDate>Sun, 06 Nov 2022 14:48:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>suran-kim.log</title>
            <url>https://velog.velcdn.com/images/suran-kim/profile/25ca846b-548c-4eeb-9c24-c57aacc00208/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. suran-kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/suran-kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[데이터베이스] 데이터베이스와 관계형 데이터베이스]]></title>
            <link>https://velog.io/@suran-kim/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@suran-kim/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Sun, 06 Nov 2022 14:48:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>패스트 캠퍼스의 데이터베이스와 SQLD 합격패스 Online를 수강하며 정리한 내용.</p>
</blockquote>
<h1 id="데이터베이스">데이터베이스</h1>
<hr>
<h2 id="데이터베이스란">데이터베이스란?</h2>
<ul>
<li><p>데이터베이스란?</p>
<ul>
<li>데이터는 모두  IT시스템 내부의 데이터베이스에 저장이 된다. 이 데이터베이스를 관리해주는 것이 데이터베이스 관리시스템이다.</li>
<li>컴퓨터 과학이 발전하면서 점점 더 <strong>대용량 데이터를 저장하고 조회하는 요구사항</strong>이 증대됐다.</li>
<li>데이터베이스 발명 이전 데이터는 텍스트 파일 형태로 저장 및 관리 되었다. 파일 형태는 여러 사용자가 동시에 공유하기가 어렵다. 파일을 서로 주고받으면서 데이터의 유실 등의 가능성이 항상 존재했다. 누가 수정, 삭제, 입력을 하든 다 같이 활용할 수 있도록 하자는 것이 데이터베이스이다.</li>
</ul>
</li>
<li><p>지금은 <strong>모든 것이 데이터베이스</strong>로 관리되는 시대이다. 주소록, 직원관리, 매출관리, 쇼핑몰, 대학, 병원, 공공 등등… 그 중 의미있는 데이터를 분석하는 것이 빅데이터인 것이다.</p>
</li>
</ul>
<h2 id="데이터베이스-관리-시스템이란">데이터베이스 관리 시스템이란?</h2>
<ul>
<li>데이터베이스 관리 시스템(database management system, DBMS)은 <strong>다수의 사용자들이 데이터베이스 내의 데이터를 접근</strong>할 수 있도록 해주는 소프트웨어 도구의 집합이다.</li>
<li>DBMS는 사용자 또는 <strong>다른 프로그램의 요구를 처리</strong>하고 <strong>적절히 응답</strong>하여 데이터를 사용할 수 있도록 해준다.</li>
<li>대표적인 DBMS는 오라클. 수많은 기능과 안정성 때문에 많이 사용한다. 접속해서 활용하자.</li>
</ul>
<h2 id="데이터베이스-시스템의-특징">데이터베이스 시스템의 특징</h2>
<ul>
<li>실시간 접근성 (real time accessibility)<ul>
<li>데이터베이스는 실시간으로 서비스된다 . 사용자가 데이터를 요청하면 몇 시간이나 몇 일 뒤에 결과를 전송하는 것이 아니라 <strong>수 초 내에 결과를 서비스</strong> 한다.</li>
<li>데이터가 변화된 것을 실시간으로 볼 수 있다. 예를 들어 예매한 영화의 예매가 잘 됐는지 예매내역을 확인하고싶다면 바로 확인할 수 있다. <strong>수 초 내에 결과를 서비스한다</strong>는 게 중요함. 그래서 데이터베이스 관리 시 성능이 중요하다.</li>
</ul>
</li>
<li>계속적인 변화 (continuous change)<ul>
<li>데이터베이스에 저장된 내용은 계속 바뀐다.</li>
<li>데이터베이스에 저장된 내용은 어느 한 순간의 상태를 나타내지만, <strong>데이터 값은 시간에 따라 항상 바뀐다</strong></li>
<li>데이터베이스는 삽입, 삭제, 수정 등의 작업을 통하여 바뀐 데이터 값을 저장한다</li>
</ul>
</li>
<li>⭐<strong>동시 공유 (concurrent sharing)</strong><ul>
<li>데이터베이스는 서로 다른 업무 또는 <strong>여러 사용자에게 동시에 공유</strong>된다.</li>
<li>동시는 (병행)이라고도 하며, 데이터베이스에 접근하는 프로그램이 여러 개 있다는 의미다</li>
<li>파일 시스템 시대에는 서로 바뀐 것에 대해 데이터를 주고받아야 했다. 그러나 데이터베이스에서는 한 곳에 데이터를 모아두고 그 데이터를 동시에 관리하는 것이다.</li>
</ul>
</li>
<li>내용에 따른 참조 (reference by content)<ul>
<li>데이터베이스에 저장된 데이터는 데이터의 물리적인 위치가 아니라 데이터 값에 따라 참조 된다.</li>
<li>즉, 구축이 된 데이터베이스(IDC)의 물리적 위치는 중요하지 않다. 내용에 따른 참조로 데이터를 조회하고 가져오는 게 중요한 거지 물리적 위치는 중요하지 않다는 것.</li>
</ul>
</li>
</ul>
<h2 id="데이터베이스의-기본-기능">데이터베이스의 기본 기능</h2>
<ul>
<li><p>데이터 삽입, 삭제, 수정, 조회 기능</p>
<ul>
<li>조회 : 원하는 데이터를 조회하는 기능 (ex. 영화 시간표 조회)</li>
<li>갱신 :<ul>
<li>삽입 : 원하는 데이터를 저장하는 기능 (ex. 영화 예매)</li>
<li>삭제 : 삭제하는 기능 (ex. 영화 예매 취소)</li>
<li>수정 : 수정하는 기능 (ex. 영화 좌석 변경)</li>
</ul>
</li>
<li>영화 예매 시스템은 데이터의 삽입, 삭제, 수정, 조회 기능을 모두 구현해야 운영이 가능함</li>
</ul>
</li>
<li><p><strong>동시성 제어</strong></p>
<ul>
<li>여러 명의 사용자가 들어와서 작업할 때 <strong>정합성</strong>에 대한 문제가 발생하지 않도록 동시성을 제어해주는 것이 동시성 제어. (이건 트랜잭션이랑 관련있을까?)</li>
</ul>
</li>
<li><p>동시성 제어의 중요성</p>
<ul>
<li>데이터베이스의 동시성 제어가 보장되지 않는다면 영화관의 경우에 동일 좌석에 대한 결제가 동시에 이루어질 수 있다. 만약 영화관에서 두 관객이 모두 같은 영화관, 같은 시간, 같은 영화, 같은 좌석을 예매한다면 해당 좌석은 두 사람 중 그 누구의 좌석도 아닌 좌석이 되고 영화관은 대혼란을 맞이하게 것이다.</li>
<li>데이터베이스의 동시성은 한 기업의 비즈니스 성패를 좌우할 수 있을 정도로 중요하다.</li>
</ul>
</li>
<li><p>장애 대응기능</p>
<ul>
<li>데이터베이스는 데이터가 손실됐다고 해도 어떤 기능을 통해 데이터 복원이 가능해야 함.</li>
<li>즉, 데이터의 보호와 장애에 대한 방안이 있어야 한다.</li>
</ul>
</li>
<li><p>보안 기능</p>
<ul>
<li>어디에서 데이터베이스 서버에 접속하든 보안에 위배되지 않는 데이터 조회가 이루어져야 한다. 즉, 데이터베이스의 보안기능은 <strong>사용자에게 보여줄 데이터만 보여주는 것</strong>. <strong>보안에 위배되는 데이터는 데이터 서버 내에서 관리</strong>한다. 사용자는 데이터베이스 내부를 알 필요가 없고 <strong>자신이 원하는 정보처리만</strong>을 수행한다.</li>
<li><code>정리</code><ul>
<li>데이터베이스의 보안 기능은 <strong>사용자에게 보여줄 데이터만 보여주는 것</strong></li>
<li>보안에 위배되는 데이터는 <strong>데이터베이스 서버 내에서 관리</strong></li>
<li>사용자는 데이터베이스 내부를 알 필요가 없고 <strong>자신이 원하는 정보처리만을 수행</strong></li>
<li>개인 정보의 유출 등은 매우 심각한 사회문제가 되므로 데이터의 보안이 중요함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="데이터베이스dbms의-종류">데이터베이스(DBMS)의 종류</h2>
<ul>
<li><p>데이터 저장 방식에 따른 데이터베이스 종류</p>
<ul>
<li>계층형 데이터베이스</li>
<li><strong>관계형 데이터베이스 :</strong> 2차원 표 형식으로 데이터 관리 , 가장 널리 사용됨</li>
<li>객체지향형 데이터베이스</li>
<li>NOSQL데이터베이스 : 최근 각광받는다. 관계형 데이터베이스 기능 일부 삭제</li>
</ul>
</li>
<li><p>관계형 데이터베이스의 제품 종류</p>
<ul>
<li>오라클</li>
<li>DB2(IBM)</li>
<li>SQL server</li>
<li>PostgreSQL</li>
<li>Tibero</li>
<li>CUBRID</li>
</ul>
</li>
</ul>
<h1 id="관계형-데이터베이스">관계형 데이터베이스</h1>
<hr>
<h2 id="관계형-데이터베이스-1">관계형 데이터베이스</h2>
<ul>
<li>관계형 데이터베이스<ul>
<li>관계형 데이터베이스는 키(key)-값(value)의 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스.</li>
<li>실세계를 그대로 반영하여 직관적인 이해가 가능하게 함</li>
<li>실생활에서 사용하는 모든 정보를 관계형 데이터베이스로 관리할 수 있다.</li>
<li><code>직관적인 예</code>: 엑셀 파일에 고객 정보를 저장한다고 해보자. 엑셀 파일의 특징은 2차원 표를 이용해서 데이터 목록화 관리를 하는 것이다.</li>
</ul>
</li>
</ul>
<h2 id="관계형-모델">관계형 모델</h2>
<ul>
<li>관계형 모델<ul>
<li>관계형 모델은 집합론에 기반을 둔 일종의 데이터베이스 모델이다.</li>
<li>컬럼과 로우를 이루는 <strong>하나 이상의 테이블</strong>이 존재하고 <strong>테이블에 데이터</strong>가 저장된다.</li>
<li>각각 테이블에는 각각의 로우를 식별하는 <strong>기본 키(Primary Key)</strong>가 있다.</li>
<li>컬럼과 로우를 부르는 여러 이름을 숙지하자.</li>
</ul>
</li>
</ul>
<pre><code>    | 열 | 필드 | 컬럼 | 속성 |
    | --- | --- | --- | --- |
    | 행 | 튜플 | 로우 | 레코드 |</code></pre><h2 id="관계형-데이터베이스의-혁신성">관계형 데이터베이스의 혁신성</h2>
<ul>
<li>처음 나왔을 때 어마어마한 혁신이었다. 최초로 2차원 표를 이용한 데이터베이스 소프트웨어.</li>
<li>데이터베이스가 이해할 수 있는 언어인 SQL을 이용하면 <strong>간단하게 데이터를 핸들링</strong>할 수 있다.</li>
</ul>
<pre><code>| 특징 | 설명 |
| --- | --- |
| 역사적 혁신성 | 최초로 2차원 표를 이용한 데이터베이스 소프트웨어 |
| 기능적 혁신성 | 직관적인 방법으로 데이터를 추출할 수 있음 &lt;br&gt;    • SQL 언어를 이용한 간편한 데이터 추출&lt;br&gt;   • 데이터베이스 사용자 층의 빠른 증가에 기여&lt;br&gt; • 개발 및 업무 생산성 확대 |</code></pre><ul>
<li>기능적 혁신성<ul>
<li><code>Ex)</code> 고객 연락처 중 가운데 고객 명 중 “경” 자가 들어가는 고객의 이메일 주소는 무엇인가?</li>
<li>SQL을 이용한 데이터 처리는 매우 직관적이고 사용자 편의성이 높다.</li>
</ul>
</li>
</ul>
<h2 id="sql-기본-지식">SQL 기본 지식</h2>
<ul>
<li><p>SQL이란?</p>
<ul>
<li><strong>RDBMS의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어</strong>이다. 전세계 표준이라 RDBMS는 다 SQL언어를 공통적으로 사용할 수 있다.</li>
<li><strong>RDBMS에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안</strong>되었다.</li>
<li>많은 수의 데이터베이스 관련 프로그램들이 <strong>SQL을 표준으로 채택</strong> 중이다.</li>
</ul>
</li>
<li><p>SQL의 용도</p>
<ul>
<li>관계형 데이터베이스에서 <strong>데이터를 조회 및 갱신</strong>하기 위한 언어</li>
</ul>
</li>
</ul>
<ul>
<li><p>SQL의 장점</p>
<ul>
<li>일반 프로그래밍 언어에 비해 <strong>간결</strong>하다</li>
<li>모국어 말하는 것처럼 데이터 조회 및 갱신이 가능하다. 즉, <strong>간단한 영어문장</strong>을 사용한다.</li>
<li>간단한 <strong>기본조작 명령어 (SELECT, INSERT, UPDATE, DELETE)</strong></li>
</ul>
</li>
<li><p>테이블, 행, 열</p>
<ul>
<li>관계용 데이터베이스와 SQL의 용어로 SQL의 기초를 학습하는데 있어서 반드시 이해하고 넘어가야 한다.</li>
<li>행과 열이 교차하는 부분은 셀이다.</li>
</ul>
</li>
</ul>
<pre><code>    | 항목 | 설명 |
    | --- | --- |
    | 테이블 | 관계형 데이터베이스의 2차원 표&lt;br&gt;        데이터 관리하는 유일단위  &lt;br&gt;      테이블 설계는 데이터베이스 설계의 중요부분 |
    | 행 | 테이블 가로축 &lt;br&gt; 텍스트 파일로 치면 한 개의 라인 |
    | 열 | 테이블의 세로축 |</code></pre><ul>
<li>SELECT, INSERT, UPDATE 예제</li>
</ul>
<h2 id="관계형-데이터베이스를-다루기-위한-사전-지식">관계형 데이터베이스를 다루기 위한 사전 지식</h2>
<ul>
<li><p>관계형 데이터베이스 소프트웨어 (=DBMS)</p>
<ul>
<li>관계형 데이터베이스를 사용하기 위해서는 <strong>DBMS</strong>를 설치해야 한다.</li>
</ul>
</li>
<li><p>데이터베이스와 DBMS의 차이</p>
</li>
</ul>
<pre><code>| 항목 | 설명 |
| --- | --- |
| 데이터베이스 | 추상적 개념 |
| DBMS | 실제적 개념
기능 및 구조 실현을 위한 구체적 소프트웨어 |
- oracle은 DBMS고 데이터베이스 자체는 아니다. 데이터베이스를 구체화한 게 DBMS인 거임</code></pre><ul>
<li><p>일반적인  IT 시스템이 탄생하는 과정</p>
<ul>
<li>DBMS와 여러 소프트웨어의 연동으로  <strong>IT시스템</strong>이 구축된다. 보통 이런 과정을 SI(System Integration)과정이라고 부른다.</li>
</ul>
</li>
<li><p>DBMS와 운영체제</p>
<ul>
<li>DBMS는 다양한 운영체제와의 조합으로 구축이 가능하다. DBMS도 소프트웨어이기 때문에 OS위에 올라간다.</li>
<li>IT예산, 제품의 기능 및 용도, 개발자와 엔지니어의 기술 스펙 등 고려해야할 요소가 많다.</li>
<li>AIX는 IBM에서 만든 OS임</li>
</ul>
</li>
</ul>
<ul>
<li>DBMS의 마이그레이션<ul>
<li>구축한 데이터베이스를 교체해야할 때 데이터베이스를 마이그레이션(이주)해야 한다.</li>
<li>마이그레이션이란 물리적인 서버는 바뀌더라도 기존의 데이터베이스는 그대로 유지되어야 한다는 것이다. 데이터베이스 분야에서 마이그레이션은 굉장히 자주 발생하는 작업이다.</li>
<li>마이그레이션의 3가지 예시<ul>
<li>OS만 바뀌는 경우</li>
<li>DBMS만 바뀌는 경우</li>
<li>OS 및 DBMS가 모두 바뀌는 경우</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>애플리케이션</p>
<ul>
<li>비즈니스 처리기능을 가진 소프트웨어</li>
<li>보통의 경우 <strong>WAS 서버</strong>에서 동작한다.</li>
<li>일반적으로 <strong>JAVA, C 등의 프로그래밍 언어</strong>를 이용해서 구현한다.</li>
<li>필연적으로 <strong>DBMS에 연동</strong>해서 각종 프로그램을 구축한다.</li>
</ul>
</li>
<li><p>애플리케이션 구현방식</p>
</li>
</ul>
<pre><code>| 방식 | 특징 |
| --- | --- |
| 직접 개발 | • JAVA, C 등의 프로그래밍 언어로 직접 프로그래밍 구현
• 개발비용 매우 높음
• 고객(사용자)의 디테일한 요구사항 수용가능 |
| 솔루션 구매 | • 솔루션 등 소프트웨어 자체를 구매한다.
• 개발비용 절감, 소프트웨어 구매비용 증가
• 고객(사용자)의 디테일한 요구사항 수용불가
• 커스터마이징을 위해서는 추가비용 필요 : 
  (바뀐 비즈니스를 위한 커스터마이징이 필요할 때 추가 비용 필요) |</code></pre><h2 id="연습문제">연습문제</h2>
<ul>
<li>관계형 데이터베이스의 혁신성과 거리가 <strong>먼</strong> 것은?
① 시스템 개발 시 개발 생산성에 도움을 준다 .
② 직관적인 개발이 가능하다 .
③ SQL 언어를 이용하여 간편한 데이터 추출이 가능하다 .
④ JAVA 언어를 이용할 수 있어 시스템의 성능이 좋아진다</li>
<li>관계형 데이터베이스는 개발 편의성이 높은 언어인 SQL을 사용하기 때문에 시스템 개발 시 개발 생산성에 도움을 준다.  (정답: ④ )</li>
</ul>
<h1 id="더-알아볼-것">더 알아볼 것</h1>
<hr>
<ul>
<li><input disabled="" type="checkbox"> 객체 접근 조정 관리란?</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 10월 4주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/10%EC%9B%94-4%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/10%EC%9B%94-4%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Mon, 31 Oct 2022 12:40:55 GMT</pubDate>
            <description><![CDATA[<p>2022-10-27
15 : 00 ~ 18 : 00 cnu 모각코 모임(17회)</p>
<h2 id="목표">목표</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> 이력서 작성</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<h2 id="회고">회고</h2>
<p>오늘 배운 것
👉 이력서 작성은 쉽지 않구나! 😅</p>
<p>모각코 대표블로그
👉 CNU 모각코 1조 대표 블로그</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 10월 3주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/10%EC%9B%94-3%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/10%EC%9B%94-3%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Mon, 31 Oct 2022 12:40:42 GMT</pubDate>
            <description><![CDATA[<p>2022-10-20
15 : 00 ~ 18 : 00 cnu 모각코 모임(16회)</p>
<h2 id="목표">목표</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 기업 프로젝트]클라우드에 스프링부트 3-tier 프로젝트 띄우기</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<h2 id="회고">회고</h2>
<p>오늘 배운 것
👉 <a href="https://suran-kim.notion.site/3tier-cf1eab1b0ffd4cca811dc578a827a3cc">[아이티센 기업 프로젝트]클라우드에 스프링부트 3-tier 프로젝트 띄우기</a>
모각코 대표블로그
👉 CNU 모각코 1조 대표 블로그</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 10월 2주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/10%EC%9B%94-2%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/10%EC%9B%94-2%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Sun, 16 Oct 2022 14:49:10 GMT</pubDate>
            <description><![CDATA[<p>2022-10-13
15 : 00 ~ 18 : 00 cnu 모각코 모임(15회)</p>
<h2 id="목표">목표</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 기업 프로젝트]ZABBIX를 이용한 모니터링 구축</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<h2 id="회고">회고</h2>
<p>👉 오늘 배운 것
<a href="https://suran-kim.notion.site/ZABBIX-482bd831b9da4c8990dfd05831d0cb4d">[아이티센 기업 프로젝트]ZABBIX를 이용한 모니터링 구축</a></p>
<p>모각코 대표블로그
👉 CNU 모각코 1조 대표 블로그</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 10월 1주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/10%EC%9B%94-1%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/10%EC%9B%94-1%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Mon, 10 Oct 2022 13:20:39 GMT</pubDate>
            <description><![CDATA[<p>2022-10-6
15 : 00 ~ 18 : 00 cnu 모각코 모임(14회)</p>
<h2 id="목표">목표</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 멘토링] web/was/db 표준 구성</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<h2 id="회고">회고</h2>
<p>👉 오늘 배운 것
<a href="https://mud-bedbug-5f4.notion.site/web-was-db-d2ce0d4c5b02470c91b2d057f563592f">[아이티센 멘토링] web/was/db 표준 구성</a></p>
<p>모각코 대표블로그
👉 CNU 모각코 1조 대표 블로그</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 9월 5주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/9%EC%9B%94-5%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/9%EC%9B%94-5%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Sun, 02 Oct 2022 11:36:22 GMT</pubDate>
            <description><![CDATA[<p><strong>2022-09-29
15 : 00 ~ 18 : 00 cnu 모각코 모임(13회)</strong></p>
<h3 id="목표">목표</h3>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 멘토링] 타임 서버 개념, NTP 서버 구축</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<hr>
<h3 id="회고">회고</h3>
<p>👉 <strong><em>오늘 배운 것</em></strong></p>
<ul>
<li><a href="https://mud-bedbug-5f4.notion.site/NTP-7b3dec02162142d0b238ab435624ed7d">[아이티센 멘토링] 타임 서버 개념, NTP 서버 구축</a></li>
</ul>
<BR/>
<BR/>

<hr>
<h3 id="모각코-대표블로그">모각코 대표블로그</h3>
<p>👉 <a href="https://power-up2022.blogspot.com/">CNU 모각코 1조 대표 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 9월 4주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/9%EC%9B%94-4%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/9%EC%9B%94-4%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Sun, 25 Sep 2022 12:13:02 GMT</pubDate>
            <description><![CDATA[<p><strong>2022-09-22
15 : 00 ~ 18 : 00 cnu 모각코 모임(12회)</strong></p>
<h3 id="목표">목표</h3>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 기술교육] 클라우드 컴퓨팅 -  Storage, Database, NAS</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<hr>
<h3 id="회고">회고</h3>
<p>👉 <strong><em>오늘 배운 것</em></strong></p>
<ul>
<li><a href="https://mud-bedbug-5f4.notion.site/Storage-Database-NAS-771633d25ac449cc94ed0f07acb09599">[아이티센 기술교육] 클라우드 컴퓨팅 -  Storage, Database, NAS</a></li>
</ul>
<BR/>
<BR/>

<hr>
<h3 id="모각코-대표블로그">모각코 대표블로그</h3>
<p>👉 <a href="https://power-up2022.blogspot.com/">CNU 모각코 1조 대표 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 9월 3주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/9%EC%9B%94-3%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/9%EC%9B%94-3%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Mon, 19 Sep 2022 14:15:38 GMT</pubDate>
            <description><![CDATA[<p><strong>2022-09-15
15 : 00 ~ 18 : 00 cnu 모각코 모임(9회)</strong></p>
<h3 id="목표">목표</h3>
<ul>
<li><input checked="" disabled="" type="checkbox"> [아이티센 기술교육] 클라우드 컴퓨팅 - Compute</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<hr>
<h3 id="회고">회고</h3>
<p>👉 <strong><em>오늘 배운 것</em></strong></p>
<ul>
<li><a href="https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EA%B8%B0%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85-%EA%B8%B0%EC%88%A0%EA%B5%90%EC%9C%A1">[아이티센 기술교육] 클라우드 컴퓨팅 - Compute</a></li>
</ul>
<BR/>
<BR/>

<hr>
<h3 id="모각코-대표블로그">모각코 대표블로그</h3>
<p>👉 <a href="https://power-up2022.blogspot.com/">CNU 모각코 1조 대표 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[클론 코딩] 커피 주문 관리 (6)]]></title>
            <link>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-6</link>
            <guid>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-6</guid>
            <pubDate>Fri, 16 Sep 2022 12:09:41 GMT</pubDate>
            <description><![CDATA[<h2 id="feat-add-api-to-manage-orders">Feat: Add API to manage orders</h2>
<p>레포지토리를 만들어 DB에 저장</p>
<h3 id="orders-order_items-테이블-생성">orders, order_items 테이블 생성</h3>
<ul>
<li>테이블 스키마 추가<ul>
<li>마스터 - 디테일 관계</li>
<li><code>orders</code>테이블에 <code>order_items</code>테이블을 JSON형태로 집어넣는 방법도 있다.</li>
<li><code>order_items</code>는 <code>orders</code>의 하위 테이블이므로 따로 PRIMARY KEY를 갖지 않고 자동 증가하는 시퀀스로 선언 <br/> <code>seq        bigint      NOT NULL PRIMARY KEY AUTO_INCREMENT</code></li>
<li><code>order_id</code>로 검색이 잦기 때문에 인덱스 설정</li>
</ul>
</li>
</ul>
<h3 id="orderjdbcrepository-생성">OrderJdbcRepository 생성</h3>
<p>기능 : Order를 추가하고 Order의 order_items만큼 insert를 해야한다.</p>
<ul>
<li>OrderJdbcRepository<ul>
<li><code>paraMap.put(&quot;email&quot;, order.getEmail().getAddress()); // VO에서 address를 가져와야 한다.</code> -&gt; 무슨 의미?</li>
</ul>
</li>
</ul>
<ul>
<li><p>orders와 order_items의 created_at, updated_at 는 같은 값을 가진다고 봐야한다.</p>
</li>
<li><p>insert 메소드</p>
<ul>
<li>@Transactional : 한 번에 묶어 처리<ul>
<li><code>의문</code> 왜 ProductJdbcRepository의 insert에서는 @Transactional처리를 하지 않았을까?</li>
<li>Product는 여러 개의 상품을 한 번에 insert하지 않기 때문에? Product는 관리자가 추가하는 것이라서?</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="defaultorderservice-와-orderrestcontroller">DefaultOrderService 와 OrderRestController</h3>
<p>기능 : OrderJdbcRepository를 사용하여 주문 추가 비즈니스 로직을 처리하는 서비스 생성. 그 서비스를 조작하는 컨트롤러도 생성한다.</p>
<ul>
<li>CreateProductRequest<ul>
<li>Order Post 시 넘겨줄 DTO를 record 타입으로 생성</li>
</ul>
</li>
</ul>
<hr>
<p><em><strong>DAO, DTO, VO</strong></em></p>
<ul>
<li>DAO<ul>
<li>DAO(Data Access Object)는 데이터베이스의 data에 접근하기 위한 객체. DataBase에 접근 하기 위한 로직 &amp; 비지니스 로직을 분리하기 위해 사용한다.</li>
</ul>
</li>
<li>DTO<ul>
<li>DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter &amp; setter 만 가진 클래스) </li>
<li>유저가 입력한 데이터를 DB에 넣는 과정을 예로 살펴보자. 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송한다. 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣는다.</li>
</ul>
</li>
<li>VO<ul>
<li>VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다. <strong>read-Only 특징</strong>(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)</li>
<li>DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다</li>
</ul>
</li>
</ul>
<ul>
<li>흐름<ul>
<li>서비스는 서비스 자체의 고유한 메소드를 가진다. </li>
<li>컨트롤러는 DTO를 서비스가 필요한 <strong>VO</strong>나 파라미터의 <strong>매개변수</strong>로 변환한다.  </li>
</ul>
</li>
</ul>
<p>출처 : <a href="https://melonicedlatte.com/2021/07/24/231500.html">https://melonicedlatte.com/2021/07/24/231500.html</a></p>
<hr>
<ul>
<li><p><code>오류 발생</code></p>
<ul>
<li><code>java.lang.IllegalArgumentException: address should not be null</code></li>
<li>email 생성 도중 오류 발생</li>
<li>오류 원인 : OrderRestController의 <code>reateOrder</code> 메소드의 인자에 <code>@RequestBody</code> 어노테이션을 붙이지 않음</li>
</ul>
</li>
<li><p><code>오류 발생</code></p>
<ul>
<li><code>OrderJdbcRepository</code>에서 
`INSERT INTO 테이블(테이블 필드명1, 필드명2 ...)&quot; +<pre><code>        &quot;VALUES (model 클래스의 필드명1, 필드명2 ...)` 코드작성 시 실수를 함. model 클래스의 필드명을 snake case로 작성함.</code></pre></li>
</ul>
</li>
<li><p><code>오류 발생</code></p>
<ul>
<li><code>java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#39;&#39; at line 1</code> 에러가 지속적으로 발생</li>
<li><code>원인</code>: <code>(UNHEX(REPLACE(:orderId, &#39;-&#39;, &#39;&#39;)))</code>문법의 괄호를 제대로 닫지 않음</li>
</ul>
</li>
</ul>
<ul>
<li><code>오류 발생</code> <ul>
<li><code>SQLSyntaxErrorException</code>이 지속적으로 발생하여 SQL 문법을 5.7ver -&gt; 8.0 이후 버전의 문법으로 변경함. 그러나 변경 이후 <code>NullPointException</code> 발생</li>
<li>해결 포스팅: <a href="https://velog.io/@suran-kim/%EC%98%A4%EB%A5%98-POST%EC%9A%94%EC%B2%AD-500%EC%97%90%EB%9F%AC%EC%99%80-nullpointerexception">[Spring] POST요청 500에러와 nullpointerexception</a> </li>
</ul>
</li>
</ul>
<h2 id="feat-add-controlled-component-that-records-orderer-information">Feat: Add controlled component that records orderer information</h2>
<p>리액트 화면에서 입력하고 결제하기 버튼 클릭 -&gt; 주문정보가 제출되어 주문관리 API를 통해 DB에 저장된다.</p>
<ul>
<li><code>오류발생</code><ul>
<li>리액트 DOM렌더링이 제대로 진행되지 않음</li>
<li>원인 : 서버를 띄우지 않았다.</li>
</ul>
</li>
</ul>
<ul>
<li>결제하기 버튼은 Summary에 있음<ul>
<li>Summary도 상태를 가지고 있어야 한다.</li>
</ul>
</li>
</ul>
<ul>
<li><p><code>오류발생</code></p>
<ul>
<li>리액트 화면에서 <code>react-jsx-dev-runtime.development.js:87 Warning: Each child in a list should have a unique &quot;key&quot; prop.</code> 오류 발생</li>
<li><img src="https://velog.velcdn.com/images/suran-kim/post/c24c5d79-1512-4ea2-a1f8-443d9c989113/image.png" alt=""></li>
<li>원인은 잘못된 키 설정! key를 <code>id</code> -&gt; <code>productId</code>로 변경해주었다.</li>
<li>다른 코드도 전부 <code>id</code> -&gt; <code>productId</code>로 변경</li>
</ul>
</li>
<li><p>Summary에서 입력받는 것은 주문정보. 따라서 이용자가 입력하는 타이핑에 대한 <strong>상태 관리</strong>가 필요하다.</p>
<ul>
<li>필드로 정의한 뒤 각 input태그와 연결</li>
<li><code>onChange={}</code> 필드 변경 시 이벤트를 잡아내서 order에 연결해야 함</li>
<li>흐름 : input에 onchange가 발생하면 <code>changeInput</code>이 호출된다.</li>
<li>타이핑 시마다 input이 바뀌면 해당 target(요소)의 value를 가져와서 setOrder로 상태 업데이트</li>
</ul>
</li>
<li><p><code>오류발생</code> </p>
<ul>
<li><code>Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component.</code></li>
<li>state 상태의 초기값 정의로 해결</li>
</ul>
</li>
</ul>
<p>이제 input이 state와 연결이 되고, 각 이벤트 발생 시마다 값을 변경한 뒤 value속성에 바인딩.</p>
<p><em><strong>react controller component</strong></em></p>
<ul>
<li>controlled component : <code>요소</code>가 리액트 <code>상태</code>와 연결된 것</li>
<li>uncontrolled component : <code>요소</code>가 리액트 <code>상태</code>와 연결되지 않은 것</li>
</ul>
<h2 id="feat-add-order-result-printing-function-when-client-press-the-payment-button">Feat: Add order result printing function when client press the payment button</h2>
<p>결제하기 버튼을 누르면 주문결과 출력</p>
<p>입력값에 대한 검증 skip -&gt; 다음 개인 프로젝트에는 진행시켜보자</p>
<p>실제 form처리에서는 <code>검증</code>할 것이 많은데 프론트엔드 과정이라면 다른 라이브러리를 이용해 검증 처리 했을 것</p>
<p>그리고 폼을 보낸 이후 clear 작업도 진행해야 하지만 프론트엔드 과정이기 때문에 생략</p>
<ul>
<li><p>Summary에 추가된 값은 부모(App)에 있다.</p>
</li>
<li><p>흐름 : 결제 버튼을 누르면 <code>주문 정보</code>가 합쳐져서 <code>http POST</code> -&gt; 서버요청</p>
<ul>
<li>위 플로우는 <code>props</code>를 통해 처리한다. (props는 객체 데이터를 Argument로 전달할 수 있게 해준다.)
부모가 전달해주는 콜백 function에 의해 호출해줘야 함</li>
</ul>
</li>
<li><p><code>onOrderSubmit</code> 메소드를 호출하면 order를 전달해준다.</p>
</li>
<li><p>App.js에서 Summary를 사용하고 있는 부분 -&gt; <code>onOrderSubmit={{handleOrderSubmit}</code> 추가</p>
</li>
<li><p>axios.post(<code>url</code>, {<code>json형태로 데이터 정의</code>}) </p>
<ul>
<li>axios는 HTTP 비동기 통신 라이브러리</li>
</ul>
</li>
<li><p>매핑 처리 - UI에서의 변수명과 서버단의 변수명이 다를 수 있으니 매핑 처리 중요 </p>
</li>
<li><p><code>오류 발생</code></p>
<ul>
<li><code>Access to XMLHttpRequest at &#39;http://localhost:8080/api/v1/products&#39; from origin &#39;http://localhost:3000&#39; has been blocked by CORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.</code> </li>
<li>처음에는 CORS 에러인줄 알았지만 결국 코드 실수였다. </li>
<li><img src="https://velog.velcdn.com/images/suran-kim/post/6350acf1-ff21-4ced-a01b-3de462585bc3/image.png" alt=""></li>
<li>axios.post() 내부에 url을 <code>products</code> api의 url로 잘못 작성한 것. CORS는 죄가 없다.</li>
</ul>
</li>
</ul>
<ul>
<li><code>리덕스</code>와 <code>몹엑스</code><ul>
<li>상태 관리 라이브러리</li>
<li>상태 관리 툴을 사용하지 않으면 콜백을 부모자식으로 전달해주고, 상태 관리를 하는 등의 작업이 필요하기 때문에 매우 불편해진다.</li>
<li>리덕스, 몹엑스를 통해 현재까지 사용한 코드를 깔끔하게 리팩토링 가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아이티센 기술교육] 클라우드 컴퓨팅  -  Compute]]></title>
            <link>https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EA%B8%B0%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85-%EA%B8%B0%EC%88%A0%EA%B5%90%EC%9C%A1</link>
            <guid>https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EA%B8%B0%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85-%EA%B8%B0%EC%88%A0%EA%B5%90%EC%9C%A1</guid>
            <pubDate>Thu, 15 Sep 2022 12:46:46 GMT</pubDate>
            <description><![CDATA[<p>실습 위주로 진행된다.
클라우드에서도 NCP 회사의 서비스, 상품들 이용 예정
이론보다는 실습 위주의 진행이 될 것이다.</p>
<p>클라우드에는 많은 상품들이 존재한다. 그 중 가장 핵심적이고 잘 알아야할 서비스 위주로 공부 예정이다.</p>
<h1 id="compute">Compute</h1>
<p>다른 말로 서버. 클라우드에서 서버를 어떻게 구축하는가?
AWS와는 다른 부분이 분명히 있다. 실습 내용이 모든 클라우드에 적용된다고 생각하기보단 <code>네이버클라우드</code>에서의 진행방법임을 유의하며 학습하도록 하자.</p>
<h2 id="컴퓨터-service-서버-종류">컴퓨터 Service 서버 종류</h2>
<p>서버를 어떻게 더 잘 사용할 수 있는가?</p>
<ul>
<li><p>서버 </p>
<ul>
<li>클라우드 상에서 서버를 생성하고 확장할 수 있는 서비스</li>
</ul>
</li>
<li><p>SSD 서버</p>
<ul>
<li>빠른 입출력 처리가 가능한 SSD가 장착된 서버를 제공하는 서비스</li>
<li><code>SSD</code>란? HDD와는 기술적으로 다르다. SSD는 HDD에 비해 굉장히 빠르다. </li>
<li><code>SSD</code>는 <code>디스크 처리</code>를 빠르게 한다.</li>
</ul>
</li>
<li><p>GPU 서버</p>
<ul>
<li>그래픽카드 내부에는 GPU라는 칩셋이 있다. GPU는 CPU보다 더 빠른 속도로 연산을 처리한다. </li>
<li>딥러닝, 머신 러닝 등을 GPU 서버에서 처리한다. </li>
<li><code>GPU</code>는 <code>연산처리</code>를 빠르게 한다. </li>
</ul>
</li>
<li><p>BareMetal Server</p>
<ul>
<li>클라우드의 핵심기술 중 하나는 <code>가상화</code>라는 기술이다. <code>가상화</code>는 물리적인 CPU나 RAM을 <code>가상화</code>하여 사용하는 것이다. <code>가상화</code>를 통해 물리적인 장치 하나에서 여러 OS를 사용할 수 있다. 클라우드에서 서버는 주로 가상화 방식으로 구현된 가상머신(Virtual Machine, VM), 즉 가상서버 형태로 제공된다. 그러나 <code>가상화</code>는 장치 하나의 성능을 여러 OS들이 분산해서 쓰기 때문에 하드웨어 하나를 온전히 사용하는 것에 비해 성능이 떨어질 수 밖에 없는 구조가 된다. </li>
<li><code>BareMetal Server</code>는 그런 <code>가상화</code> 없이 온전히 <strong>물리적</strong>으로 제공해주는 서버를 의미한다. <code>BareMetal Server</code>는 물리적인 서버임에도 클라우드 서비스들을 연계해서 사용할 수 있고, <code>가상화</code>를 사용하지 않기 때문에 장치 하나의 성능을 온전히 유지할 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="스펙의-종류">스펙의 종류</h2>
<p>네이버 클라우드에서는 서버 생성 시 <code>스펙</code>을 정할 수 있다.<br>모든 상황에서 높은 스펙이 좋은 것은 아니다. 
좋은 스펙은 곧 큰 비용으로 이어지기 때문에 개발환경을 고려해서 <code>스펙</code>을 결정하는 것이 중요하다.</p>
<ul>
<li><p>Micro</p>
<ul>
<li>1년 동안 무료 체험 가능</li>
<li>개인 계정 발급 시 추천</li>
<li>가상 CPU가 1코어<ul>
<li>따라서 OS 설치는 리눅스만 가능하고 윈도우는 불가하다.</li>
</ul>
</li>
</ul>
</li>
<li><p>Compact</p>
<ul>
<li>간단한 개발 및 테스트에 적합. </li>
<li>가격 부담을 줄인 것이 특징</li>
</ul>
</li>
<li><p>Standard</p>
<ul>
<li>가장 보편적인 스펙</li>
</ul>
</li>
<li><p>High Memory</p>
</li>
<li><p>GPU</p>
<ul>
<li>머신러닝, 이미지 프로세스 러닝 등 <strong>빠른 연산</strong>이 필요한 경우 적합</li>
</ul>
</li>
<li><p>CPU Intensive</p>
</li>
<li><p>Standard-g2</p>
</li>
<li><p>High Memory-g2</p>
</li>
</ul>
<br/>

<h2 id="클라우드의-특징">클라우드의 특징</h2>
<p>클라우드에서 제공하는 상품을 필요한 만큼만 사용하고, 사용한 만큼 비용을 지불한다.
AS-IS보다 구축 시간이 훨씬 짧다</p>
<br/>

<h2 id="네이버-클라우드-특징">네이버 클라우드 특징</h2>
<h3 id="classic-과-vpc">Classic 과 VPC</h3>
<p>네이버 클라우드 플랫폼의 환경은 두 가지(<code>Classic</code> / <code>VPC</code>)이다. 
둘은 <code>네크워크</code>적인 부분에서, <code>스펙</code>에서 다르다.
<code>Classic</code>은 AS-IS, <code>VPC</code>은 TO-BE</p>
<p>AWS에도 예전에는 <code>Classic</code> 환경을 제공했다.
네이버의 <code>Classic</code>환경 또한 AWS와 매우 비슷하기 때문에 
네이버의 <code>Classic</code>환경도 사라질 가능성이 높다.</p>
<p>현재 실습 환경은<code>Classic</code>이지만 실제로는 <code>VPC</code>환경에서 진행하게 될 것</p>
<ul>
<li>Classic의 단점과 네이버 클라우드의 대안<ul>
<li>공유 </li>
<li><code>avg설정</code>에서 <code>0.0.0.0/0</code>(모든 IP 주소를 수락) 으로 설정해두었다면 모든 사람이 <code>22번 포트</code>로 <code>비공인 IP</code>를 이용해 접근할 수 있다.</li>
<li>네이버에서는 이를 해결하기 위해 <code>Secure Zone</code> 상품을 만들었다. <code>Secure Zone</code>에서 서버를 생성하면 개인정보 등 중요 자원을 보안이 강화된 별도 Zone에서 관리하게 된다.</li>
</ul>
</li>
</ul>
<h3 id="제약사항">제약사항</h3>
<ul>
<li><code>부팅 디스크</code><ul>
<li>윈도우 서버는 무조건 100GB로 고정된다</li>
<li>리눅스 서버는 50GB로 고정된다.</li>
</ul>
</li>
</ul>
<ul>
<li><code>커널</code><ul>
<li>리눅스의 커널을 인위적으로 <strong>업데이트</strong> 시 향후 커널로 인한 문제 발생 시에도 네이버 클라우드에서 책임지지 않는다.</li>
</ul>
</li>
</ul>
<ul>
<li><p><code>CPU</code>와 <code>Memory</code>개수가 정해져 있다.</p>
</li>
<li><p><code>추가 디스크</code>는 디스크 당 최대 2000GB크기, 15개까지 생성 가능</p>
</li>
</ul>
<br/>



<h2 id="실습-1-서버생성">실습 1. 서버생성</h2>
<p>네이버 클라우드는 서비스는 공공기관용 / 개인기업용 등으로 나뉘어져있다. 
공공기관용 / 개인기업용 서비스에는 약간의 차이가 존재한다.</p>
<p>네이버 클라우드 콘솔과 포털 차이</p>
<ul>
<li><code>콘솔</code>과 <code>포털</code><ul>
<li>서버에 접속하기 위해서는 <code>콘솔</code>로 접속해야 한다.</li>
</ul>
</li>
</ul>
<p><em><strong>1. 콘솔 접속</strong></em></p>
<p><em><strong>2.서버 이미지 설정</strong></em></p>
<ul>
<li><code>부팅 디스크 크기</code> : 리눅스 50GB, 윈도우 100GB 고정. <strong><em>확장/축소 불가</em></strong> </li>
<li><code>이미지 타입</code> : 서버 OS의 종류</li>
<li><code>서버 타입</code> : 서버의 <code>스펙</code> 결정</li>
</ul>
<p><em><strong>3. 서버 설정</strong></em></p>
<ul>
<li><code>zone 선택</code> : 데이터 센터 위치</li>
<li><code>부팅 디스크 종류(SSD/HDD)</code> 설정</li>
<li><code>서버 세대</code> : g1</li>
<li><code>서버 타입</code> : </li>
<li><code>요금제 선택</code> : 시간 요금제가 더 저렴하다. </li>
<li><code>서버 개수</code> : 서버의 개수 선택</li>
<li><code>서버 이름</code> : <em>예) user01-lab1</em></li>
<li><code>반납 보호</code> : 반납은 클라우드를 삭제하는 것을 의미한다. 중요한 클라우드를 실수로 반납하는 것을 방지하기 위해 설정한다.</li>
</ul>
<p><em><strong>4. 인증키 설정</strong></em></p>
<ul>
<li><code>새로운 인증키 생성</code> : 예) user01-key</li>
<li>다운 받은 key파일을 절대 잃어버려서는 안된다.</li>
</ul>
<p><em><strong>5. ACG (방화벽)</strong></em></p>
<ul>
<li><code>ACG</code>는 IP 주소 포트 기반 필터링 기능으로 서버로의 네트워크 접근을 관리한다.</li>
<li>권한있는 트래픽만 허용하고 그 외의 트래픽은 차단한다.</li>
</ul>
<ul>
<li><code>신규 ACG 생성</code> : <em>Ex) user01-acg</em></li>
<li><code>접근 소스</code> -  myIp (사용자 컴퓨터의 ip)</li>
<li><code>허용 포트</code> - 22</li>
</ul>
<p>이는 서버 생성 후 <code>SSH</code>로 접근할 수 있도록 22번 포트를 허용한다는 뜻이다.</p>
<br/>



<h2 id="실습-2-서버접속">실습 2. 서버접속</h2>
<p>서버란 무엇일까? 
서버를 생성하는 것은 <code>특정 목적</code>으로 <code>서비스(상품)</code>를 제공할 수 있는 컴퓨터를 만드는 것과 같다.  </p>
<p>클래식 환경의 접속 방식(<code>포트포워딩</code>/<code>공인IP</code>)을 실습해보자.</p>
<p>putty는 원격으로 접속할 수 있도록 도와주는 프로그램으로, 
putty 접속 시 설정하는 <code>SSH</code>는 접속방법 중 하나이다.
<code>SSH</code>는 클라이언트 프로그램이다.</p>
<p> <code>acg</code> 설정 시 <code>myIp</code>를 입력하는 이유는? 
 나의 집인 서버에는 나만 들어갈 수 있도록 설정한 것이다. </p>
<p><em>*<em>공인 IP 실습 *</em></em></p>
<ul>
<li>생성한 서버의 <code>공인 IP</code> 에서 할당된 <code>IP 번호</code>를 확인할 수 있다. </li>
<li>putty에 세션 정보를 입력하여 접속한다. </li>
</ul>
<p><em><strong>포트포워딩 과정에서 리눅스 서버에 어떻게 접속했는가?</strong></em></p>
<ul>
<li>우리는 서버에 <code>IP</code>를 입력하고 접속했다. </li>
<li><code>sshd</code>라는 서비스에 들어오기 위해서는 <code>22</code>번 문이 필요하다.</li>
<li><img src="https://velog.velcdn.com/images/suran-kim/post/1dd0435e-1dd2-4ec0-b20e-4a2034f832cc/image.png" alt=""></li>
<li><code>sshd</code>서비스를 <code>OS</code>에 설치해놨기 때문에 서비스를 이용할 수 있게끔 <code>22</code>번 포트가 열려있는 것이다.</li>
<li><code>22</code>포트로 접속하면 보안에 신경쓰는 사람들은 <code>22</code>번 포트를 일부러 다른 번호로 설정해둔다. </li>
</ul>
<p><em><strong>SSH와 sshd</strong></em></p>
<p> <code>SSH</code></p>
<ul>
<li><code>SSH(Secure Shell)</code>는 네트워크 상의 다른 컴퓨터에 로그인할 수 있게 해주거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 <code>응용 프로그램</code> 또는 그 <code>프로토콜</code>을 가리킨다.</li>
<li><code>SSH</code>는 나가는 요청(outbound)이다.</li>
</ul>
<br/>

<p> <code>sshd</code></p>
<ul>
<li><code>sshd</code>란 <code>OpenSSH</code>의 SSH Daemon (==서버 프로세스) 이다. <code>데몬</code>은 백그라운드 상에서 요청을 기다리는 프로그램을 의미하며 일반적으로 프로세스이다.</li>
<li><code>SSH</code> 연결을 받아주기(inbound) 위해 대기하는 프로세스.</li>
<li><code>SSH 프로토콜</code>을 사용하여 들어오는 연결을 수신하고 프로토콜의 <code>서버</code> 역할을 한다.</li>
</ul>
<p><em><strong>Putty 접속 오류</strong></em></p>
<ul>
<li>ACG 설정 관련 오류 <ul>
<li><code>ACG의 접근 규칙</code>에 포트번호 <code>22</code>인 규칙이 생성되지 않음</li>
<li>포트번호 <code>22</code>인 규칙을 추가한다.</li>
</ul>
</li>
</ul>
<br/>


<h2 id="실습-3-명령어를-사용한-웹-설치">실습 3. 명령어를 사용한 웹 설치</h2>
<p>권한있는 명령어들을 사용하기 위해 <code>sudo -i</code>명령어를 이용해 루트 유저로 변환한다.</p>
<pre><code>sudo -i // 루트 유저로 변환

yum -y install httpd
systemctl start httpd // 실행되는 명령어

cat &lt;&lt; EOF &gt; /var/www/html/index.html
&lt;p style=&quot;font-size:34px; color:red;&quot; &gt;`hostname`&lt;/p&gt;
&lt;p style=&quot;font-size:20px; color:darkviolet&quot;&gt;`hostname -I`&lt;/p&gt;
EOF </code></pre><p><code>공인 IP</code>를 브라우저에 붙여넣으면 결과가 보여진다.
<code>httpd</code>는 웹서비스를 제공한다.</p>
<p><code>ACG</code> 설정 시 <code>접근소스</code> 설정에 <code>0.0.0.0/0</code>(모든 IP에서 접근 가능) 을 넣어준다.</p>
<p> <img src="https://velog.velcdn.com/images/suran-kim/post/3405e22b-8977-466a-a6c1-9ce76d10bb05/image.png" alt=""></p>
<p>클라이언트 프로그램(Ex: 브라우저)는 포트번호가 
무조건 <code>80</code>으로 디폴트 설정되어있기 때문에 포트번호는 생략할 수 있다. </p>
<br/>

<p><em><strong>acg 접근 소스 설정에 공인 IP를 넣어도 될까?</strong></em></p>
<p>클라이언트 입장에서 <code>공인IP</code>는 도착지이다. 
따라서 acg설정 시 <code>접근소스</code>를 <code>공인IP</code>로 설정한다면 내 자신이 나에게 들어오는 것이다.
홈페이지를 <code>서버</code> 혼자서만 볼 수 있는 것이므로 홈페이지를 아무에게도 보여주지 않고 꽁꽁 숨겨둘 예정이라면 그렇게 해도 된다.</p>
<h2 id="실습-4-초기화-스크립트-lamp">실습 4. 초기화 스크립트 (LAMP)</h2>
<p>네이버에서는 <code>초기화 스크립트</code>를 생성하여 서버 생성 시 사용할 수 있다.
Classic &gt; server &gt; Init Script</p>
<p>네이버와 같은 대외적인 서비스를 이용한다면 모든 <code>아이피</code> 에서 접근할 수 있어야 한다는 규칙이 있다. 따라서 <code>acg</code>설정에서 <code>접근소스</code>에 <code>0.0.0.0/0:80</code>를 저장해주어야 한다.</p>
<p><em><strong>Init Script</strong></em></p>
<ul>
<li>서버 생성 시 최초 1회 root유저 권한으로 명령어를 한 번에 실행해주는 스크립트</li>
<li>시간 절약, 더 빠른 실행 가능</li>
</ul>
<pre><code class="language-php">#!/bin/bash

yum -y install httpd php php-mysql mariadb-server // 언어 설치
systemctl enable httpd
systemctl enable mariadb
systemctl start httpd
systemctl start mariadb

mysql -u root &lt;&lt; EOF
create database wpdb; // DB 생성
grant all privileges on wpdb.* TO wpadmin@localhost identified by &#39;passw0rd&#39;; // 사용자와 패스워드
flush privileges;
exit
EOF

cd ~
wget https://wordpress.org/wordpress-5.1.tar.gz     // 블로그 소스 다운로드
tar zxvf *.tar.gz
chmod 707 -R wordpress  
cp -rp wordpress/* /var/www/html/      //
chown -R apache.apache /var/www/html
#sed -i &#39;s/index.html/index.php/g&#39; /etc/httpd/conf/httpd.conf
systemctl restart httpd

echo &quot;rew:x:0:0::/home:/bin/bash&quot; &gt;&gt; /etc/passwd
echo &quot;rewrewrewrew&quot; | passwd rew --stdin</code></pre>
<br/>




<p><em><strong>LAMP</strong></em>
Linux Apache(httpd) Mysql(mariadb) PHP를 의미한다.</p>
<p><em><strong>비공인 IP 설정</strong></em></p>
<ul>
<li><code>비공인 IP</code>는 클라우드 외부의 사람들은 사용할 수 없는 IP이다.</li>
</ul>
<p><em><strong>wordpress 설치</strong></em></p>
<ul>
<li>초기화 스크립트, 클라우드 컴퓨팅을 통해 15분 만에 블로그 완성 </li>
<li>(네트워크 문제로 실습 실패 -&gt; 다음 실습 시 다시 도전)</li>
</ul>
<br/>

<h3 id="클라우드의-이미지">클라우드의 이미지</h3>
<p>클라우드에는 여러가지 <code>이미지</code>가 존재한다. (이미지 : 환경)
application 이미지 타입 중 <code>LAMP</code>가 있다.</p>
<p>이말인즉슨, 이미 <code>Linux Apache(httpd) Mysql(mariadb) PHP</code>가 이미지로 존재하고 있기 때문에 환경 설정에 필요한 시간을 훨씬 단축할 수 있다는 뜻이 된다.</p>
<p>그래서 클라우드를 사용하면 시간을 단축하고, 초기비용을 줄일 수 있는 것이다.</p>
<h3 id="3-tier">3-Tier</h3>
<p>3-Tier의 개념은 WEB, WAS(미들웨어), DB를 분리하는 것에서 시작된다
한 개의 서버에서 셋을 구동한다면 성능, 보안 측면에서 단점이 생긴다.</p>
<p>최소한 2-Tier가 있어야 하는 것.</p>
<blockquote>
<p><em><strong>rf</strong></em></p>
</blockquote>
<ul>
<li><a href="https://library.gabia.com/contents/infrahosting/9300/">베어메탈 서버(Bare Metal Server)란?</a></li>
<li><a href="https://velog.io/@beneficial/%EC%9D%B8%ED%84%B4%EA%B8%B0%EB%A1%9D-ssh%EC%99%80-sshd">[인턴기록] ssh와 sshd</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] POST요청 500에러와 nullpointerexception]]></title>
            <link>https://velog.io/@suran-kim/%EC%98%A4%EB%A5%98-POST%EC%9A%94%EC%B2%AD-500%EC%97%90%EB%9F%AC%EC%99%80-nullpointerexception</link>
            <guid>https://velog.io/@suran-kim/%EC%98%A4%EB%A5%98-POST%EC%9A%94%EC%B2%AD-500%EC%97%90%EB%9F%AC%EC%99%80-nullpointerexception</guid>
            <pubDate>Thu, 15 Sep 2022 01:36:09 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p>개인 클론 프로젝트 진행 중 POST 요청이 제대로 적용되지 않아 500 에러가 지속적으로 발생했다.
코드 중 OrderItems()의 객체들을 반복해서 update 추가하는 부분이 있었는데, 터미널에서는 OrderItems()가 null이기 때문에 nullpointerexception가 발생한다는 문장이 출력됐다. </p>
<p>하지만 아무리 찾아봐도 코드에서 문제점을 찾을 수 없었다. 
그렇게 코드에서 잘못된 부분을 찾기 시작한지 두 시간 하고도 하루가 흘렀다...</p>
<ul>
<li>POST요청 실패 
<img src="https://velog.velcdn.com/images/suran-kim/post/8f841622-de26-4ea9-b49a-2a71a99306c3/image.png" alt="">
<img src="https://velog.velcdn.com/images/suran-kim/post/132dbe83-e9c0-4eb9-8f5c-df23cc521452/image.png" alt=""></li>
</ul>
<h2 id="해결">해결</h2>
<ul>
<li>POST 메소드<img src="https://velog.velcdn.com/images/suran-kim/post/e977ea65-06f4-4be8-a624-325a3ed4c2b0/image.png" alt=""></li>
<li>DTO 클래스
<img src="https://velog.velcdn.com/images/suran-kim/post/eba93e70-7b5e-43af-a462-c607ce9119b2/image.png" alt=""><img src="https://velog.velcdn.com/images/suran-kim/post/6ed91b4f-072a-4124-8296-cf007ad17cc9/image.png" alt=""></li>
</ul>
<p>그러나 이 오류는 황당무계한 실수로 인해 벌어진 오류였다! POST 요청 과정에 사용되는 DTO 클래스에 오타가 있었던 것이다. </p>
<p>POST 메소드에서는 변수의 이름을 <code>orderItems</code>로 가져오고 있었는데 DTO 클래스에서는 해당 변수를 <code>OrderItems</code>로 정의하고 있었던 것이다. 사실 인텔리제이에서는 변수명이 다르다는 오류표시가 되지 않았기 때문에 이게 어찌된 일인가 싶기도 했지만 DTO 클래스의 변수명을 <code>orderItems</code>로 리팩터링하니 POST요청 실패 문제가 해결됐기 때문에 변수명의 불일치가 원인이었던 것은 맞는 것 같다.</p>
<ul>
<li>POST요청 성공
<img src="https://velog.velcdn.com/images/suran-kim/post/a90b4790-ccbc-452c-8c84-1c67ab8d726c/image.png" alt="">
<img src="https://velog.velcdn.com/images/suran-kim/post/bcf0a7df-184e-46c6-8f1d-ac892e05267b/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[클론 코딩] 커피 주문 관리 (5)]]></title>
            <link>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-5</link>
            <guid>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-5</guid>
            <pubDate>Tue, 13 Sep 2022 12:11:57 GMT</pubDate>
            <description><![CDATA[<h3 id="refactor-split-into-components">Refactor: Split into components</h3>
<ul>
<li>컴포넌트 패키지 생성<ul>
<li>각 컴포넌트를 파일로 분리</li>
</ul>
</li>
</ul>
<ul>
<li>App <ul>
<li>전체 구조, 골격, 레이아웃, 각각의 컴포넌트 사용처 표현</li>
</ul>
</li>
</ul>
<h3 id="feat-add-product-quantity-add-function">Feat: Add product quantity add function</h3>
<ul>
<li><p>product.js</p>
<ul>
<li>추가 버튼이 있는 컴포넌트 </li>
<li>이벤트 바인딩: 버튼 -&gt; 액션을 위해 필요</li>
<li></li>
</ul>
</li>
<li><p>상품에 접근하기 위한 코드</p>
<ul>
<li>productList.js<ul>
<li><code>Product {...v}</code>: ...는 자바스크립트 연산자. v의 내용이 나열되면서 product 아규먼트에 매핑된다.</li>
<li><img src="https://velog.velcdn.com/images/suran-kim/post/db6e6047-2b8e-415b-9a11-6b31a6bcf2cd/image.png" alt="컴포넌트 구조"> 컴포넌트 구조는 다음과 같은데, 버튼을 누르는 로직 처리는 product가 하지만 추가한 숫자를 전달받아서 처리하는 로직 처리를 하는 Summary는 다른 컴포넌트에 위치한다. </li>
<li>product는 부모인 productList에 접근할 수 없으므로 id 전달 시 onAddClicked 사용</li>
<li>productList도 App에게 onAddClicked으로 전달</li>
<li>App에서는 state 이용해서 해당 정보를 가져올 수 있다.</li>
</ul>
</li>
</ul>
</li>
<li><p>App.js</p>
<ul>
<li>map을 이용하면 새로운 배열이 생성된다.</li>
<li>handleAddClicked으로 기존의 상태를 계속 변경시키게 된다.</li>
</ul>
</li>
</ul>
<p>자바스크립트는 표현식(distructure 기능 ?)이 좋기 때문에 배열을 쉽게 조작할 수 있다.</p>
<h3 id="feat-add-product-list-from-server">Feat: Add product list from server</h3>
<ul>
<li><p>알아두자!</p>
<ul>
<li>노드 서버는 리액트 애플리케이션을 호스트 한다.</li>
<li>그러나 실제 실행환경은 노드 환경이 아닌 브라우저이다.</li>
</ul>
</li>
<li><p>axios 설치 </p>
<ul>
<li>오류 발생 : <code>npm WARN config global --global, --local are deprecated. Use --location=global instead.</code> <a href="https://velog.io/@do_ng_iill/npm-WARN-config-global-global-local-are-deprecated.-Use-locationglobal-instead.-%ED%95%B4%EA%B2%B0">해결법</a></li>
<li><code>npm install axios</code> 명령어로 설치</li>
</ul>
</li>
</ul>
<ul>
<li>useEffect()<ul>
<li>DOM을 그리는 시간과 엘리먼트 제작시간 사이에 갭 존재</li>
<li>렌더링 이후 원하는 로직을 동작시킬 필요가 생길 수 있다.</li>
<li>Hook 사용 : useEffect() <ul>
<li>두 번째 인자로 빈 배열[]을 주면 딱 한 번만 실행된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>이제 Bean의 정보를 가져올 수 있다.</p>
<br/>


<p> 지금까지의 flow </p>
<ul>
<li>관리자용 뷰 컨트롤러에서 Products 추가</li>
<li>리액트에서 useEffect로 해당 추가된 Bean의 정보를 가져옴</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] Load Balancer, IP, 서브넷, 방화벽, 가상화]]></title>
            <link>https://velog.io/@suran-kim/cloud</link>
            <guid>https://velog.io/@suran-kim/cloud</guid>
            <pubDate>Tue, 13 Sep 2022 11:12:38 GMT</pubDate>
            <description><![CDATA[<h2 id="load-balancer-용어">Load Balancer 용어</h2>
<ul>
<li>VPC (Virtual Private Cloud)
Public Cloud 상에서 논리적으로 완전히 분리된 <strong>고객 전용 네트워크</strong>를 제공하는 서비스로, 최대 /16의 IP 네트워크 공간 사용 가능 (IP 대역: RFC 1918)</li>
</ul>
<ul>
<li>VPC 제공 여부에 따른 플랫폼 용어(Classic / VPC)<ul>
<li>Classic 환경
퍼블릭 클라우드에서 고객 전용 사설 네트워크인 VPC(Virtual Private Cloud)를 제공하지 않는 플랫폼</li>
<li>VPC 환경
퍼블릭 클라우드에서 고객 전용 사설 네트워크인 VPC(Virtual Private Cloud)를 제공하는 플랫폼</li>
</ul>
</li>
</ul>
<ul>
<li>Load Balancer (LB)
서버의 성능과 부하량을 고려해 네트워크 트래픽을 <strong>다수의 서버로 분산</strong>시켜 주는 서비스</li>
</ul>
<ul>
<li><p>Load Balancing
병렬로 운영되는 기기 사이에서 부하가 균등하게 되도록 하는 행위</p>
</li>
<li><p>Target Group</p>
</li>
<li><p><em>요청을 처리할 대상*</em>에 대한 집합</p>
</li>
</ul>
<ul>
<li>Subnet
어떤 기관에 소속된 네트워크이지만 따로 분리되어 있는 한 부분으로 인식될 수 있는 네트워크</li>
</ul>
<ul>
<li><p>Health Check</p>
<ul>
<li><p>Health Check
Auto Scaling Group의 가상 서버에 주기적인 상태 확인을 수행하여 <strong>상태가 비정상</strong>인 가상 서버를 식별하도록 체크하는 행위</p>
</li>
<li><p>Health Check Type
Health Check의 유형으로 <strong>서버</strong>와 <strong>Load Balancer</strong> 가운데 선택 가능. Auto Scaling Group 설정에서 Load Balancer 이름을 지정한 경우에는 Health Check 유형도 Load Balancer로 설정하며, 이런 경우 Auto Scaling은 Load Balancer Health Check 방식과 기준에 따라 서버의 상태를 판단</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>서버 부하 분산 방식</p>
<ul>
<li>Least Connection</li>
</ul>
</li>
<li><p><em>가장 적은 수의 연결*</em>이 이루어진 서버로 요청을 할당하는 서버 부하 분산 방식</p>
<ul>
<li><p>Round Robin
지정된 서버들에 대해 <strong>공평하게 순차적</strong>으로 요청을 전달하는 서버 부하 분산 방식</p>
</li>
<li><p>Source Internet Protocol Hash (Source IP Hash)</p>
</li>
</ul>
</li>
<li><p><em>클라이언트의 Source IP 정보를 해시한 결과*</em>로 로드밸런싱을 실행하는 서버 부하 분산 방식</p>
</li>
<li><p>HyperText Transfer Protocol (HTTP)</p>
</li>
<li><p><em>웹 서버*</em>와 사용자의 <strong>인터넷 브라우저</strong> 사이에 문서를 전송하기 위해 사용되는 <strong>통신 규약</strong></p>
</li>
</ul>
<ul>
<li>Secure Socket Layer (SSL)
전자 상거래에서 신용 카드 번호 전송과 같이 <strong>보안 관련 트랜잭션</strong> 제공 시 사용되는 <strong>웹용 암호화</strong> 기술</li>
</ul>
<ul>
<li><p>Transmission Control Protocol (TCP)
인터넷상의 컴퓨터들 사이에서 <strong>데이터를 메시지 형태</strong>로 보내기 위해 <strong>IP</strong>와 함께 사용되는 <strong>프로토콜</strong>로, IP 데이터를 전달하는 동안 <strong>데이터 패킷을 추적 관리</strong>하는 기능 수행</p>
</li>
<li><p>Transport Layer Security (TLS)
인터넷상에서 통신 시 주고받는 데이터를 보호하기 위한 표준화된 <strong>암호화 프로토콜</strong></p>
</li>
<li><p>User Datagram Protocol (UDP)
인터넷 프로토콜 스위트의 주요 프로토콜 중 하나로 IETF의 RFC 768로 표준으로 정의되어 있으며, TCP와 함께 <strong>데이터그램</strong>으로 알려진 단문 메시지를 교환하는 용도로 사용</p>
</li>
<li><p>Public IP Service
Public IP가 필요한 경우, 고객이 지정한 서버에 Public IP를 할당해 주는 서비스</p>
</li>
<li><p>Private Internet Protocol Address (Private IP Address)
Private Subnet의 사설 IP 주소 영역에 포함되도록 할당하는 IP 주소로, 네트워크 주소를 포함하여 초기 10개의 IP는 관리용으로 예약되며, 네트워크 주소와 CIDR 형식의 서브넷 bit를 입력</p>
</li>
<li><p>Sub Account
대표 계정(메인 계정) 하위에 생성하여 업무 역할별로 권한 관리를 하도록 지정할 수 있는 서브 계정</p>
</li>
<li><p>User Created
클라우드 플랫폼의 Sub Account에서 계정 사용자가 임의로 생성한 정책</p>
</li>
</ul>
<h2 id="ip">IP</h2>
<ul>
<li><code>IP(Internet Protocol)</code> 란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소이다.</li>
</ul>
<h3 id="ipv4-ipv6">IPv4, IPv6</h3>
<p>IP주소는 <code>IPv4</code>, <code>IPv6</code> 2가지 종류가 있으며, 일반적으로 말하는 IP 주소는 <code>IPv4</code> 주소를 의미한다. </p>
<ul>
<li><p>IPv4</p>
<ul>
<li>IPv4는 IP version 4의 약자로 전 세계적으로 사용된 첫 번째 인터넷 프로토콜</li>
<li>주소는 32비트 방식으로, 8비트씩 4자리로 되어 있음. 각 자리는 온점으로 구분</li>
<li>IPv4는 0 ~ 2^32 (약 42억 9천)개의 주소를 가질 수 있는데, 전 세계적으로 인터넷 사용자 수가 급증하면서 IPv4 주소가 고갈될 위기 발생</li>
</ul>
</li>
<li><p>IPv6</p>
<ul>
<li><code>IPv6</code>는 IP version 6의 약자로, <code>IPv4</code>의 주소체계를 128비트 크기로 확장한 차세대 인터넷 프로토콜 주소</li>
<li>주소는 128비트 방식으로, 16비트씩 8자리로 되어 있음. 각 자리는 콜론으로 구분</li>
</ul>
</li>
</ul>
<h3 id="고정-ip-유동-ip">고정 IP, 유동 IP</h3>
<ul>
<li><p>고정 IP</p>
<ul>
<li><code>고정 IP</code>는 변하지 않고 컴퓨터에 <strong>고정</strong>적으로 부여된 IP</li>
<li>한번 부여되면 IP 반납을 하기 전까지는 다른 장비에 부여할 수 없는 고유의 IP</li>
<li>보안성이 우수하기 때문에 보안이 필요한 업체나 기관에서 사용</li>
</ul>
</li>
<li><p>유동 IP </p>
<ul>
<li><code>유동 IP</code>는 변하는 IP</li>
<li>인터넷 사용자 모두에게 고정 IP를 부여해 주기는 힘들다</li>
<li>일정한 주기 또는 사용자들이 인터넷에 접속하는 매 순간마다 사용하고 있지 않은 IP 주소를 임시로 발급해 주는 IP</li>
<li>대부분의 사용자는 유동 IP를 사용함</li>
</ul>
</li>
</ul>
<h3 id="공인-ip-사설-ip">공인 IP, 사설 IP</h3>
<ul>
<li><p>공인 IP</p>
<ul>
<li>IP 주소는 임의로 부여할 수 없고 ICANN이라는 기관이 국가별로 사용할 IP 대역을 관리한다.
우리나라는 한국인터넷진흥원(KISA)에서 국내 IP 주소들을 관리한다. </li>
<li>이것을 ISP(Internet Service Provider의 약자로 KT, LG, SKT와 같이 인터넷을 제공하는 통신업체)가 부여받는다.</li>
<li>이용자들은 ISP에 가입해 IP를 제공받아 인터넷을 사용하게 된다.
이렇게 발급받은 IP를 <code>공인 IP</code>라고 한다.</li>
</ul>
</li>
<li><p>사설 IP</p>
<ul>
<li>공유기를 사용한 인터넷 접속 환경일 경우 공유기까지는 <code>공인 IP</code>를 할당한다.</li>
<li>공유기에 연결되어 있는 가정이나 회사의 각 네트워크 기기에는 <code>사설 IP</code>를 할당한다.</li>
<li>사설 IP는 어떤 네트워크 안에서 내부적으로 사용되는 고유한 주소</li>
</ul>
</li>
<li><p>공인 IP와 사설 IP 비교</p>
<ul>
<li><code>공인 IP</code>는 전 세계에서 유일하지만, <code>사설 IP</code>는 하나의 네트워크 안에서 유일하다.</li>
<li><code>공인 IP</code>는 외부, 내부 상관없이 해당 IP에 접속할 수 있지만 <code>사설 IP</code>는 내부에서만 접근이 가능하다.</li>
</ul>
</li>
</ul>
<h2 id="서브넷">서브넷</h2>
<ul>
<li>서브넷 등장배경 
흔히 사용되는 IPv4 주소 체계는 클래스를 나누어 IP를 할당한다. 어떤 기관에 A클래스를 할당하면 16,777,214개의 호스트를 할당할 수 있다. 이 기관이 100개의 호스트만 할당한다고 해도 나머지 호스트는 사용되지 않고 낭비된다. <strong>서브넷(subnet)</strong>은 이처럼 호스트가 낭비되는 일을 방지하기 위해 등장하게 되었다.</li>
</ul>
<ul>
<li><p>서브넷</p>
<ul>
<li>IP 주소에서 네트워크 영역을 부분적으로 나눈 부분 네트워크</li>
<li>간단히 설명하자면 IP주소를 잘게 쪼개서 사용하는 것.</li>
<li>일반 인터넷과 같은 기능을 수행하는 것은 맞지만 IP주소를 나눠서 쓰는 것과 같다.</li>
<li>네트워크 장치들의 수에 따라 효율적으로 사용할 수 있다.</li>
</ul>
</li>
<li><p>서브넷 마스크</p>
<ul>
<li>서브넷을 만들 때 사용된다</li>
<li>IP 주소 체계의 Network ID와 Host ID를 분리하는 역할</li>
</ul>
</li>
<li><p>서브넷팅(subnetting)</p>
<ul>
<li>서브넷팅은 IP 주소 낭비를 방지하기 위해 원본 네트워크를 여러개의 서브넷으로 분리하는 과정을 뜻한다</li>
<li>서브넷팅은 서브넷 마스크의 bit 수를 증가시키는 것이라고 생각하면 이해가 편함 </li>
<li>서브넷마스크의 bit수를 1씩 증가시키면 할당할 수 있는 네트워크가 2배수로 증가하고 호스트 수는 2배수로 감소한다</li>
</ul>
</li>
</ul>
<h2 id="방화벽">방화벽</h2>
<ul>
<li><p>수신/발신 네트워크 트래픽을 모니터링하고 제어하는 네트워크 보안 시스템. 관리자가 설정해 놓은 보안 규칙(ACL, Access Control List)에 따라 허가되지 않은 외부 접속 시도를 차단하여 내부 정보 자산을 보호한다.</p>
</li>
<li><p>외부 네트워크와 내부 네트워크의 경계선에 위치한다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/suran-kim/post/fa46aed8-84e1-4de0-96ba-86baa8fd67d3/image.png" alt=""></p>
<ul>
<li><p>방화벽 주요 기능</p>
<ol>
<li><p>접근제어(Access Control)</p>
<ul>
<li>들어오고 나가는 패킷에 대해 허용/차단</li>
<li>구현 방법에 따라 &#39;패킷 필터링 방식&#39;과 &#39;프록시 방식&#39;으로 나뉨</li>
</ul>
<ol start="2">
<li>감사 및 로깅(Auditing/Logging)</li>
</ol>
<ul>
<li>트래픽에 대한 접속 정보 기록</li>
</ul>
</li>
</ol>
<ol start="3">
<li>인증(Authentication)<ul>
<li>여러 인증방법(메시지 인증, 사용자 인증, 클라이언트 인증)을 사용하여 접속하는 호스트에 대한 정당성 여부 검사</li>
</ul>
</li>
<li>데이터 암호화(Data Encryption)<ul>
<li>방화벽에서 다른 방화벽까지 전송되는 데이터를 암호화해서 보냄</li>
</ul>
</li>
<li>네트워크 주소 변환(NAT, Network Address Translation)<ul>
<li>IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받음</li>
</ul>
</li>
</ol>
</li>
</ul>
<h2 id="가상화">가상화</h2>
<ul>
<li><p>가상화</p>
<ul>
<li>가상화란 가상화를 관리하는 소프트웨어(주로 Hypervisor)를 사용하여 하나의 물리적 머신에서 가상 머신(VM)을 만드는 프로세스</li>
<li>Hypervisor는 가상화 층을 구현하여 물리적 머신의 컴퓨팅 리소스로부터 가상 환경을 분리하고 가상 머신(VM)을 생성</li>
<li>Hypervisor는 필요에 따라 각 VM에 cpu와 메모리 및 스토리지와 같은 컴퓨팅 리소스를 할당</li>
</ul>
</li>
<li><p>가상화 장점</p>
<ul>
<li>Server Consolidation: 물리적인 서버의 개수를 줄여 1개의 서버로 통합함으로써 서버의 전력 및 냉각 비용, 하드웨어 공간 비용 등을 줄일 수 있다.</li>
<li>Isolation: 기능에 맞게 여러 개의 머신으로 분리하여 Failures나 Security Leaks 등에 더욱 잘 대처할 수 있다.</li>
<li>Efficiency: 컴퓨팅 자원의 사용을 최대화하고 보다 쉽게 관리 할 수 있다.</li>
<li>Flexibility: 한 서버의 데이터를 마이그레이션하기에 용이해진다. <br/><br/>  </li>
<li>(+)그 외에도 가상화를 통해 동일한 머신에서 다양한 유형의 앱, 데스크탑 및 운영체제 실행이 가능하거나 새로운 어플리케이션을 프로비저닝 하는데 걸리는 시간을 줄일 수 있다</li>
</ul>
</li>
</ul>
<ul>
<li>클라우드 컴퓨팅<ul>
<li>클라우드 컴퓨팅은 인터넷을 통해 공유 컴퓨팅 리소스, 소프트웨어 또는 데이터를 제공하는 방식</li>
</ul>
</li>
</ul>
<blockquote>
<p><em><strong>출처</strong></em>  </p>
</blockquote>
<ul>
<li><a href="https://guide.ncloud-docs.com/docs/loadbalancer-glossary">네이버 클라우드 Load Balancer 용어사전</a></li>
<li><a href="https://study-recording.tistory.com/7">매일의 공부 기록</a></li>
<li><a href="https://code-lab1.tistory.com/34">[네트워크] 서브넷,  서브넷마스크, 서브넷팅이란? | 서브넷팅 예제</a></li>
<li><a href="https://dany-it.tistory.com/102">서브넷과 서브넷 마스크에 대한 설명</a></li>
<li><a href="https://change1212.tistory.com/m/22">[네트워크] 방화벽(Firewall)</a></li>
<li><a href="https://mangkyu.tistory.com/86">[Server] 가상화(Virtualization)란? (1/2)
출처: https://mangkyu.tistory.com/86 [MangKyu&#39;s Diary:티스토리]</a></li>
<li>이미지 출처 : <a href="https://ko.wikipedia.org/wiki/%EB%B0%A9%ED%99%94%EB%B2%BD_%28%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9%29">위키백과</a></li>
</ul>
<blockquote>
<p><em><strong>이전에 공부했던 관련 내용</strong></em></p>
</blockquote>
<ul>
<li><a href="https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EB%A9%98%ED%86%A0%EB%A7%81-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A9%98%ED%86%A0%EB%A7%81-%EC%84%A4%EB%AA%85%ED%9A%8C">아이티센 클라우드 basic</a></li>
<li><a href="https://velog.io/@suran-kim/springBoot-%EC%9B%B9-%EA%B8%B0%EC%88%A0-Servlet#http">[springBoot] 웹 기술, Servlet</a></li>
</ul>
<blockquote>
<p><em><strong>더 공부할 내용</strong></em></p>
</blockquote>
<ul>
<li><a href="https://kim-dragon.tistory.com/154">[네트워크] CIDR 범위 쉽게 계산하는 방법</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[sw 아카데미] 5. POJO와 DI (2)]]></title>
            <link>https://velog.io/@suran-kim/sw-%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-5.-POJO%EC%99%80-DI-2</link>
            <guid>https://velog.io/@suran-kim/sw-%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-5.-POJO%EC%99%80-DI-2</guid>
            <pubDate>Mon, 12 Sep 2022 08:18:27 GMT</pubDate>
            <description><![CDATA[<h3 id="의존성-주입iocdi">의존성 주입(Ioc/DI)</h3>
<ul>
<li>의존성 주입(DI)을 지향하는 코드란?<ul>
<li>어떤 의존성이 붙더라도 돌아가는 코드를 작성하자는 것.</li>
<li>쉽게 <strong>확장</strong>이 가능한 구조 필요</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li>의존성이란?<ul>
<li>어떤 프로그램이나 서비스가 수행되기 위해 필요한 것<ul>
<li>보통 리소스(자원)에 의존</li>
</ul>
</li>
<li>의존성의 종류<ul>
<li>대부분 &quot;사용(use)&quot;</li>
<li>Ex) 사람은 돈에 의존한다.</li>
</ul>
</li>
<li>의존성에는 <strong>방향</strong>이 있다. <ul>
<li>DI에서 ⭐전체는 부분에게 의존한다⭐</li>
<li>회사 -&gt; 직원 : 회사는 직원에게 의존한다.</li>
<li>프로그램 -&gt; 오라클 : 프로그램은 오라클에 의존한다. <br/><br/></li>
<li><em>UML에서의 표현 -  갈고리에 점선 (의존관계)</em></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h3 id="di-실습">DI 실습</h3>
<ul>
<li>DI (Dependency Injection)<ul>
<li>DI는 어떤 인터페이스를 하나 정의 -&gt; 인터페이스를 상속 받아 구현클래스를 만들고 인터페이스에 의존하도록 만드는 것이다. 즉, DI는 <strong>인터페이스 기반 패턴</strong>이다.</li>
</ul>
</li>
</ul>
<br/>


<ul>
<li>실습 코드 예제
<img src="https://velog.velcdn.com/images/suran-kim/post/3269d4f0-fc51-4450-823e-310b51bd735d/image.png" alt=""><ul>
<li>결합도를 낮춘다: order를 거쳐서 sell 호출</li>
<li>생성자를 통한 주입: new로 인터페이스의 구현체 클래스 주입</li>
<li>왜 이 코드는 OCP를 만족하는가?<ul>
<li>기능추가에 열림, 수정에 닫힘 </li>
<li>뭐든지 판매하는 기능이라면 seller를 추가하면 된다.</li>
<li>new로 어떤 기능(구현체)이든 Main클래스에 추가할 수 있다.</li>
<li>Order와 Sell을 분리 -&gt; 인터페이스의 구현체인 클래스에서 구현된 메소드 호출 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>


<h3 id="상속의-문제점">상속의 문제점</h3>
<ul>
<li>자바 자체가 단일 상속이기 때문에 부모를 상속받는 구조를 선호하지 않는다.    <ul>
<li>상속의 장점: 코드 재사용</li>
<li>상속의 문제점: <ul>
<li>클래스를 상속받았을 때 재활용이 안되는 코드가 존재<ul>
<li>전체를 다 상속받았지만 사용되지 않는 코드 존재 -&gt; 메모리를 차지</li>
<li>객체지향은 부분 상속이 불가능하다. </li>
<li>다중 상속은 활용되지 않는 코드가 늘어날 가능성 높음</li>
</ul>
</li>
<li>따라서 <strong>단일 상속</strong>만 허용  </li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>인터페이스는 오버헤드 없는 상속 가능<ul>
<li>코드가 없는데 무슨 상속이야? 재활용이 아닌데? -&gt; DI 패턴 등장</li>
<li><strong>기능 추가에 유연한 구조</strong>가 된다. 특히 OCP를 잘지키는 코드가 된다.</li>
<li><strong>코드 통일성 유지</strong></li>
<li><code>코드 재사용 &lt; 기능추가</code> 에 방점을 두는 것으로 변화</li>
</ul>
</li>
</ul>
<h3 id="스프링-psa">스프링 PSA</h3>
<ul>
<li>DI 적용되지 않은 코드도 DI스럽게 포장</li>
<li>POJO스럽지 않은 코드도 POJO스럽게 포장</li>
</ul>
<h3 id="정리">정리</h3>
<ul>
<li>스프링이 지향하는 바는 모든 코드를 POJO스럽게 만드는 것이다.</li>
<li>DI가 중심 역할 </li>
<li>DI가 적용되지 않는 부분은 PSA를 통해 포장</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 9월 2주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/9%EC%9B%94-2%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/9%EC%9B%94-2%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Thu, 08 Sep 2022 09:58:58 GMT</pubDate>
            <description><![CDATA[<p><strong>2022-09-01
15 : 00 ~ 18 : 00 cnu 모각코 모임(9회)</strong></p>
<h3 id="목표">목표</h3>
<ul>
<li><input checked="" disabled="" type="checkbox"> 상품관리 REST API 클론 프로젝트 3일 차(2/3)</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<hr>
<h3 id="회고">회고</h3>
<p>👉 <strong><em>오늘 배운 것</em></strong></p>
<ul>
<li><a href="https://github.com/suran-kim/react-springboot-rest-api">REST API 클론프로젝트 레포지토리</a><ul>
<li><a href="https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-4">[클론 코딩] 커피 주문 관리 (4)</a></li>
</ul>
</li>
</ul>
<BR/>
<BR/>

<hr>
<h3 id="모각코-대표블로그">모각코 대표블로그</h3>
<p>👉 <a href="https://power-up2022.blogspot.com/">CNU 모각코 1조 대표 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[클론 코딩] 커피 주문 관리 (4)]]></title>
            <link>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-4</link>
            <guid>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-4</guid>
            <pubDate>Thu, 08 Sep 2022 07:41:56 GMT</pubDate>
            <description><![CDATA[<h3 id="feat-add-react-config-and-rest-api-controller">Feat: Add react config and REST API controller</h3>
<ul>
<li><p>REST API</p>
<ul>
<li>rest api구현</li>
<li>api가 다른 도메인(리액트 서버)에서 호출될 수 있도록 CORS 설정</li>
</ul>
</li>
<li><h2 id="람다식">람다식</h2>
<ul>
<li>생략 조건  <ol>
<li>반환값이 있는 메서드의 경우, return문 대신 &#39;식&#39;으로 대신 할 수 있습니다.
식의 연산결과가 자동으로 반환값이 됩니다.
문장이 아닌 &#39;식&#39;이므로 끝에 &#39;;&#39;를 붙이지 않습니다.</li>
<li>매개변수의 타입은 추론이 가능한 경우 생략할 수 있습니다.</li>
<li>선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략할 수 있습니다.
출처 : <a href="https://ksabs.tistory.com/207">https://ksabs.tistory.com/207</a></li>
</ol>
</li>
</ul>
</li>
<li><p>메소드 참조  </p>
<ul>
<li><code>Function&lt;Integer, MyClass&gt; f = (i) -&gt; new MyClass(i);</code> // 람다식
<code>Function&lt;Integer, MyClass&gt; f = MyClass::new;</code>  // 메서드 참조  <br/><br/></li>
<li>메소드 참조 사용 조건<ol>
<li>static 메서드 참조</li>
<li>인스턴스메서드 참조</li>
<li>특정 객체 인스턴스메서드 참조 <br/><br/></li>
</ol>
</li>
</ul>
</li>
</ul>
<ul>
<li>@RequestParam
메소드의 인자값으로 @RequestParam() 어노테이션을 넣어서 값을 받아온다.
<code>@RequestParam(&quot;가져올 데이터의 이름&quot;) [데이터타입] [가져온데이터를 담을 변수]</code>
위와 같은 형식으로 사용한다.
출처: <a href="https://hongku.tistory.com/119">https://hongku.tistory.com/119</a> [IT에 취.하.개.:티스토리]</li>
</ul>
<ul>
<li><p>REST API controller 의 productList 코드 설명 </p>
<pre><code class="language-java">  // 1. getProductsByCategory 메소드 : 매개 변수 있음
  return category.map((e) -&gt; productService.getProductsByCategory(e)).orElse(productService.getAllProducts());

  // 메소드 참조식으로 변환
  return category.map(productService::getProductsByCategory).orElse(productService.getAllProducts()); 

</code></pre>
</li>
</ul>
<pre><code>// 2. getProductsByCategory 메소드 : 매개 변수 없음
return productService.getAllProducts();</code></pre><pre><code>
- CORS지원 방식 : 서버단 config 에서 처리

- npx
  - node 패키지 실행 가능
  - Create React App 실행 가능
  - $ npx create-react-app kdt-react-order-ui


- package.json
  - node 프로젝트에서 node 패키지를 알려주는 명세서
  - start 명령어 사용가능 (npm에 명령어 날릴 수 있는 명령어 -&gt; react 어플리케이션 실행)

- flow
  - 대부분 HTML과 CSS는 퍼블리셔에게 전달받게 되어있다. 퍼블리셔는 대체로 디자이너에게서 이미지를 전달받고, HTML과 CSS를 작성한다. 프론트엔드 엔지니어가 HTML과 CSS (정적컨텐츠)를 react 어플리케이션으로 전환하는 작업을 진행한다. 
  - 스타트업에서는 프론트엔드에서 이미지를 받아서 HTML과 CSS생성하는 경우도 있지만 큰 회사에서는 분업화가 되어있다.

- react 
  - 사용자 인터페이스르 만들기 위한 JavaScript라이브러리
  - React Native - 리액트 어플리케이션을 이용해 모바일 앱처럼 만들 수도 있다?
  - 컴포넌트를 정의하고 그것으로 어플리케이션 구성
  - 컴포넌트 
    - 엘리먼트의 묶음
    - 클래스 or 함수로 정의 가능 
    - **상태**를 가지고 있다.
   - 엘리먼트
       - div태그
       - 인자들로 파라미터, 컨텐츠, 속성 전달 가능
  - 엘리먼트에 컴포넌트를 전달하면 또 다른 엘리먼트 생성 가능 -&gt; 결국 모든 것은 엘리먼트   
  - JSX 
    - 자바 스크립트 내부에 HTML 문법이 있는 형태
    - 바벨을 이용한 transcomplie가능 -&gt; 변경된 코드는 순수 자바스크립트 코드


### Feat : Add product list page

- HTML / CSS 코드
  - sample.html 적용

- flow
  - 시작점은 index.js
  - DOM으로 App을 root에 그린다
    - 그래서 실질적으로 index.gtml 의 body - div에 리액트 어플리케이션이 그려지게 된다.
  - App.js 에서 개발 진행

- App.js
  - 샘플코드 body부 적용하기
  - 인텔리제이가 class -&gt; className으로 자동 변환
  - 닫히지 않은 이미지 태그 닫아주기

- App.css 
  - 샘플코드의 style부 적용

- 부트스트랩 추가
  - $ npm install bootstrap 
  - 부트 스트랩의 CSS를 import가능

- node 서버 재시작


### Refactoring :  

- 함수로 product list 리액트 컴포넌트 생성 
  - 상품목록 코드 복사 - &gt; 붙여넣기
  - 리액트 컴포넌트는 무조건 하나의 엘리먼트가 반환되어야 한다.
  - 상품목록 컴포넌트의 &lt;React.Fragment&gt; 내부에 상품 목록 코드 옮기기
  - 원래 상품목록이 있었던 App 내부에는 컴포넌트 이름(&lt;ProductList/&gt;) 넣어주기

- Summary 컴포넌트 생성
  - `&lt;React.Fragment&gt;&lt;React.Fragment/&gt;`는  `&lt;&gt;&lt;/&gt;`으로도 표현 가능

- Product 컴포넌트 생성
  - ProductList 컴포넌트에서 상품 코드 가져오기



- props
  - App.js 내부의 상품이름, 가격 등의 정보가 데이터베이스 속 데이터에 의해 이루어져야 함. 
  - props는 객체 데이터를 Argument로 전달할 수 있게 해준다.
  - Product 컴포넌트를 사용하는 부모가 전달한 내용이 -&gt; 자식에게 파라미터로 전달
  - 자바스크립트 표현식 `{productName} ` 
  - 사용 예
```js
        function Product(props) {
            const productName = props.porductName;
            const category = props.category;
            const price = props.price;
            return (
                &lt;&gt;
                    &lt;div className=&#39;col-2&#39;&gt;&lt;img className=&#39;img-fluid&#39; src=&#39;https://i.imgur.com/HKOFQYa.jpeg&#39; alt=&#39;&#39;/&gt;
                    &lt;/div&gt;
                    &lt;div className=&#39;col&#39;&gt;
                        &lt;div className=&#39;row text-muted&#39;&gt;{productName}&lt;/div&gt;
                        &lt;div className=&#39;row&#39;&gt;{category}&lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div className=&#39;col text-center price&#39;&gt;{price}원&lt;/div&gt;
                    &lt;div className=&#39;col text-end action&#39;&gt;
                        &lt;button className=&#39;btn btn-small btn-outline-dark&#39;&gt;추가&lt;/button&gt;
                    &lt;/div&gt;
                &lt;/&gt;
            )
        }</code></pre><pre><code class="language-js">        function ProductList() {
            return (
                &lt;React.Fragment&gt;
                    &lt;h5 className=&#39;flex-grow-0&#39;&gt;&lt;b&gt;상품 목록&lt;/b&gt;&lt;/h5&gt;
                    &lt;ul className=&#39;list-group products&#39;&gt;
                        &lt;li className=&#39;list-group-item d-flex mt-3&#39;&gt;
                            {/*product 컴포넌트에 전달*/}
                            &lt;Product productName={&#39;Columbia 커피&#39;} category={&#39;커피콩&#39;} price={300}/&gt;
                        &lt;/li&gt;
                        ...
                            {/*반복 -&gt; 이 부분도 부모의 props로 만들 수 있다.*/}                       </code></pre>
<ul>
<li><p>ProductList 리팩토링</p>
<ul>
<li>ProductList 를 사용하는 부모(App)로부터 props를 가져오게 바꾼다.</li>
<li>prodicts = [] (디폴트값 제공)</li>
<li>루프를 돌 때 꼭 key를 만들어줘야 함</li>
</ul>
</li>
<li><p>App 리팩토링</p>
<ul>
<li>클래스형 컴포넌트에서는 <code>this.state</code>로 상태에 접근 가능</li>
<li>함수형 컴포넌트에서는 <code>useState</code>라는 hook을 이용해야 한다.</li>
<li><code>const [상태에 접근가능한 변수명, 상태값을 바꾸는 함수] = useState();</code></li>
</ul>
</li>
</ul>
<h3 id="fix-fix-totalprice">Fix: Fix totalPrice</h3>
<ul>
<li>NaN 오류 발생 <ul>
<li>첫번째 문제 : 변수에 할당된 데이터 값을 숫자형으로 인식하지 않고 문자열로 인식할 때 이런 문제가 발생하는 경우가 있다.
출처: <a href="https://sasada.tistory.com/93">https://sasada.tistory.com/93</a> [살다살다:티스토리]</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아이티센 멘토링 프로젝트] 멘토링 설명회]]></title>
            <link>https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EB%A9%98%ED%86%A0%EB%A7%81-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A9%98%ED%86%A0%EB%A7%81-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
            <guid>https://velog.io/@suran-kim/%EC%95%84%EC%9D%B4%ED%8B%B0%EC%84%BC-%EB%A9%98%ED%86%A0%EB%A7%81-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A9%98%ED%86%A0%EB%A7%81-%EC%84%A4%EB%AA%85%ED%9A%8C</guid>
            <pubDate>Mon, 05 Sep 2022 04:42:31 GMT</pubDate>
            <description><![CDATA[<ul>
<li>IT 인프라 기초지식 셀프 스터디 진행</li>
</ul>
<ul>
<li>네이버 클라우드 선정 이유 <ul>
<li>국내 클라우드 플랫폼 다수 존재. 국내에서는 네이버 클라우드가 AI, 빅데이터 등 기능을 포함하고 있어 유용하다. 최소한 클라우드 플랫폼에서 인프라를 구축하고 개발하는 것에 도움이 될 거라고 생각했다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>3-Tier</p>
<ul>
<li>IT기업에 들어가게 되면 대부분 DB를 구축하고 만들어보는 지식을 실제 경험해보게 될 것이다. </li>
</ul>
</li>
<li><p>클라우드 모니터링</p>
<ul>
<li>클라우드 환경에서 제공하는 모니터링 기능은 완벽하지 않다.
자비스 오픈소스 툴 등을 활용해 관제 모니터링 구축</li>
</ul>
</li>
<li><p>진행 형태</p>
<ul>
<li>과제 제시 -&gt; 발표 (피드백과 코칭) </li>
<li>강의 4시간 - 4시간 -&gt; 과제 수행   </li>
</ul>
</li>
</ul>
<ul>
<li><p>배경지식 </p>
<ul>
<li>컴퓨팅, 네트워크, 스토리지</li>
</ul>
<p>용어에 대한 사전 공부 필요</p>
<ul>
<li>가상화 </li>
<li>서버의 대부분은 리눅스 베이스 (서버 운영을 위해 리눅스 기본지식 필요)</li>
<li>로드 밸런서, 방화벽(네트워크 구축하는 수준이 아니기 때문에 어떤 역할, 어떤 동작을 하는지만 알면 된다. 네이버클라우드에서 로드밸랜서를 만들어서 설정하고, 동작하게 된다 : 기능적인 측면에서 접근하자. 사용자 가이드 -&gt; 용어 사전)</li>
<li><strong>서브넷</strong>, *<em>아이피 *</em> -&gt; 용어를 통해서 자료를 찾아보는 게 좋을 듯</li>
</ul>
</li>
<li><p>실습환경에 대한 지원</p>
<ul>
<li>비용은 학교에서 지원받는다</li>
<li>일단 네이버 클라우드 계정 만들어놓기</li>
</ul>
</li>
<li><p>생각해볼 것</p>
<ul>
<li>어떤 WAS를 사용할 것인지?(톰캣, 아파치 등등)</li>
</ul>
</li>
<li><p>일정</p>
<ul>
<li>기본 수강 기술교육 -&gt; 8일 / 15일 (목) 으로 변경 </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[👽 9월 1주 차 모각코 결과]]></title>
            <link>https://velog.io/@suran-kim/9%EC%9B%94-1%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</link>
            <guid>https://velog.io/@suran-kim/9%EC%9B%94-1%EC%A3%BC-%EC%B0%A8-%EB%AA%A8%EA%B0%81%EC%BD%94-%EA%B2%B0%EA%B3%BC</guid>
            <pubDate>Sun, 04 Sep 2022 14:17:30 GMT</pubDate>
            <description><![CDATA[<p><strong>2022-09-01
15 : 00 ~ 18 : 00 cnu 모각코 모임(9회)</strong></p>
<h3 id="목표">목표</h3>
<ul>
<li><input checked="" disabled="" type="checkbox"> 상품관리 REST API 클론 프로젝트 3일 차(2/3)</li>
<li><input checked="" disabled="" type="checkbox"> 벨로그 글쓰기</li>
</ul>
<hr>
<h3 id="회고">회고</h3>
<p>👉 <strong><em>오늘 배운 것</em></strong></p>
<ul>
<li><a href="https://github.com/suran-kim/react-springboot-rest-api">REST API 클론프로젝트 레포지토리</a></li>
</ul>
<BR/>
<BR/>

<hr>
<h3 id="모각코-대표블로그">모각코 대표블로그</h3>
<p>👉 <a href="https://power-up2022.blogspot.com/">CNU 모각코 1조 대표 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[클론 코딩] 커피 주문 관리 (3)]]></title>
            <link>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-3</link>
            <guid>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-3</guid>
            <pubDate>Thu, 01 Sep 2022 08:11:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<ul>
<li><p><em><strong>Service</strong></em>
Service의 역할은 Dao가 DB에서 받아온 데이터를 전달받아 가공하는 것이다. Service가 알맞은 정보를 가공하는 과정을 &#39;비즈니스 로직을 수행한다.&#39; 라고 합니다. Service가 비즈니스 로직을 수행하고 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아 옵니다.</p>
</li>
<li><p><em><strong>Dao</strong></em>
DB의 data에 접근하기 위한 객체
DAO 는 쉽게 말해서 Mysql 서버에 접근하여 SQL문을 실행할 수 있는 객체입니다.</p>
</li>
<li><p><em><strong>Optional.ofNullable()</strong></em>
null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성한다.
출처 : <a href="https://www.daleseo.com/java8-optional-after/">https://www.daleseo.com/java8-optional-after/</a></p>
</li>
<li><p>@TestInstance
테스트 인스턴스의 생성 단위를 변경하기 위해 사용하는 어노테이션
JUnit은 설정된 테스트 단위로 테스트 객체(테스트 인스턴스)를 만든다.
테스트 인스턴스는 기본적으로 메소드 단위 생명주기이다.
@TestIntance는 메소드끼리 영향을 주는 테스트 케이스를 테스트할 때 사용한다.
@TestInstance(Lifecycle.PER_CLASS) 를 선언한 클래스는 클래스 단위 생명주기를 가진다.
<a href="https://velog.io/@suran-kim/springBoot">https://velog.io/@suran-kim/springBoot</a></p>
</li>
<li><p>컨트롤러의 필요성
많은 종류의 서비스를 한 클래스를 만들어서 꽉꽉 몰아 처리할 게 아니라 Controller라는 중간 제어자를 만들어서 A서비스에 대한것은 A-Controller가 맡고 B서비스는 B-Controller 이런식으로 역할에 따라 설계를 하고 코딩을하면 개발비용이나 유지보수비용이 대폭 줄어들기 때문에 Controller를 사용
스프링에서의 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.</p>
</li>
<li><p>@GetMapping
HTTP GET 요청을 특정 핸들러 <strong>메소드</strong>에 맵핑하기위한 annotation.</p>
</li>
<li><p>Repository의 구현체를 영구저장소 API를 이용해 구현
Repository의 Interface는 도메인 레이어,  Repository의 구현체는 영속성 레이어에 속한다 </p>
</li>
<li><p><em><strong>repository와 DAO</strong></em></p>
<ul>
<li>“repository는 객체의 Collection을 저장, 검색 하는 등의 동작을 캡슐화 한다” 고 한다. 여기서 Collection은 java의 Collection class를 말한다기보다 객체의 모임(저장 검색 등이 가능한)이라고 생각하면 될 것 같다.</li>
<li>DAO는 storage system에 더 가까운 개념이고 상대적으로 low level concept, Repository는 Domain객체에 가까운 개념이며 상대적으로 high level concept</li>
<li>DAO는 Repository를 사용하여 구현할 수 없지만, Repository는 DAO를 사용해 구현할 수 있다.
<a href="https://isaac56.github.io/etc/2021/08/29/difference_DAO_Repository/">https://isaac56.github.io/etc/2021/08/29/difference_DAO_Repository/</a></li>
</ul>
</li>
<li><p>update()
JdbcTemplate는 DAO객체에서 DB와 연동하기 위해 SQL 연산들을 수행 할 수 있도록 도와주는 기술인데,
update()는 SQL 연산을 통해 데이터베이스를 갱신시켜줄 때(INSERT, DELETE, UPDATE) 사용하는 메소드
<a href="https://withseungryu.tistory.com/92">https://withseungryu.tistory.com/92</a></p>
</li>
<li><p><em><strong>테스트 시마다 테스트용 인스턴스의 id가 달라지는 문제</strong></em></p>
<ol>
<li>테스트용 객체 생성 코드를 static 으로 선언 </li>
<li><em>@TestInstance(TestInstance.Lifecycle.PER_CLASS)</em> 사용</li>
</ol>
</li>
<li><p>git :</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[클론 코딩] 커피 주문 관리 (2)]]></title>
            <link>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-2</link>
            <guid>https://velog.io/@suran-kim/%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-%EC%A3%BC%EB%AC%B8-%EA%B4%80%EB%A6%AC-2</guid>
            <pubDate>Wed, 31 Aug 2022 12:15:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><em><strong>개념</strong></em></p>
</blockquote>
<ul>
<li><strong>Repository</strong> 
Entity에 의해 생성된 <strong>DB에 접근하는 메서드</strong>들을 사용하기 위한 인터페이스. 
CRUD를 어떻게 할 것인지 정의하는 계층 
<a href="https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C">출처 : Controller, Service, Repository 가 무엇일까?</a> <br/></li>
<li><em><strong>RowMapper<T> 인터페이스</strong></em>
ResultSet으로 가져온 쿼리 결과값을 원하는 형태( <T> )의 객체로 변환
출처: <a href="https://montoo.tistory.com/entry/Spring-JdbcTemplate-query-update-RowMapperT">https://montoo.tistory.com/entry/Spring-JdbcTemplate-query-update-RowMapperT</a> [Keon.:티스토리]</li>
<li><em><strong>JAVA 이중 중괄호를 이용한 초기화</strong></em>
일반적인 경우 사용하지 말 것. 웬만하면 JAVA 8 컬렉션에서 추가된 Map.of()를 사용하는 게 좋다.
단, Map.of()에는 null값이 들어오면 안 됨.</li>
<li>@Autowire<br>DI(의존성 종속, Dependency Injection)란, 클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것
팩토리 메소드 패턴에서 부모 모르게 구현한 자식 클래스의 의존성 주입을 @Autowire 어노테이션으로 스프링 컨테이너가 주입해주는 거임
<a href="https://life-with-coding.tistory.com/433">https://life-with-coding.tistory.com/433</a>
<a href="https://zorba91.tistory.com/306">https://zorba91.tistory.com/306</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>