블록체인은 블록(개인과 거인의 거래(P2P)의 데이터)를 시간 순차적으로 체인 형태로 연결해서 수많은 컴퓨터에 데이터를 복제해 저장하는 분산형 데이터 저장 기술입니다.
중앙에서 데이터를 처리하는 것이 없어 중앙에서 데이터를 변경하는 것이 불가능하며 이것을 `탈중앙화`라고 합니다.
실제로 이걸 조작하려면 51% 공격이라 하는 과반수 이상의 정보가 조작되어야하는데 현실적으로는 불가능하다고 평가받기에 블록체인의 보안성은 높다고 평가받습니다
그럼 PoW 코인은 스테이킹이 안되냐? 원칙적으로는 불가능하지만 가상자산 거래소 같은 업체에서 PoW 코인을 예치할 때 리워드를 주는 서비스를 제공하기도 합니다
스테이킹은 PoW로 블록 검증에 대한 보상이라면 이자 농사는 탈중앙화 거래소(DEX)나 코인 대출 플랫폼같은 디파이(DeFi)시장에 유동성을 제공한 대가로 코인을 받습니다
데이터를 담아 체인 형태로 연결해 여러개에 컴퓨터에 복제해 저장하는 `분산형 데이터 저장 기술`
= `여러개의 트랜잭션을 블록으로 묶어서 해시를 이용해 시간 순으로 연결한 것`을 블록체인이라 한다
여러대의 컴퓨터에 파일을 복제해 저장하게 됨으로 누군가 임의로 파일 수정하기 어려우며 중앙의 컴퓨터를 소유한 사람이 없어 데이터를 임의로 변경할 수 없기 때문에 `탈중앙화`라 불림
효율적인 데이터 처리 기술 방식 중 하나이며 분산형 저장 기술이기에 중앙에서 통제할 수 없고 데이터는 변경될 수 없이 영구 기록되어 누구나 볼 수 있다
각 `블록(= 거래내역(트랜잭션)의 묶음)`은 일정한 크기의 용량을 가지고 있으며 `거래나 계약과 같은 활동(트랜잭션)`이 이루어질 때마다 네트워크에 새로운 블록이 기록됨
거래 하나가 이루어질때마다 참여자들끼리 정보를 공유하기에 이를 대조하면서 데이터의 위조나 변조가 불가능하며 거래에 참여하는 사람들에게 `해시(키로 변환된 값)`값을 대조하게 만들며 검증 작업에 참여하는 사람들에게 일정 수준의 가상화폐를 보상으로 지급하고 이 보상을 얻는것을 `채굴`이라함
이러한 블록을 다음 블록과 이어주기 위해 해시를 이용해 체인 형태를 만들수가 있다
즉 블록을 생성하는 대가로 암호화폐를 주는 것을 채굴이라고 함 이 채굴은 임의의 논스값을 대입해서 얻은 값이 타겟(해시)보다 작은 값이 나올때까지 무한 반복된다
모두가 블록 전체를 소유할 수 있는 구조이고 참여자가 늘어나면 검증까지 걸리는 시간이 길어져 채굴 난이도는 점점 올라감
- 51% 공격
거래내역 해킹 또한 이론적으로 검증 작업(전체 노드)의 51% 이상을 해킹할 수 있는 해시 파워가 있어야 하기에 현실적으로 불가능
만약 51% 이상의 해시 레이트를 가지고 있다고 가정하면 변조가 가능하지만 51% 이상을 변조하는 데 필요한 비용이 막대하고 그 코인에 가치도 떨어지게되므로 현실적으로는 불가하여 신뢰성이 높다고 평가받는다
- 분산원장
새로 기록되는 블록은 앞에 기록된 블록과 체인으로 연결되며 `이전에 있던 모든 블록에 해당 기록이 동일하게 기록`되며 내용을 되돌릴수 없는 처리방식
그렇기에 한 곳의 데이터가 변조되더라도 `수많은 다른 노드(참여자)를 참고해서 그 데이터의 진위여부를 확인`할 수 있음
블록체인은 이러한 방식으로 거래를 승인하기에 중앙 은행이 필요치않음
- 해시파워
블록체인 네트워크에서 채굴자들이 가지고 있는 `채굴 역량`
얼마나 빠른 시간안에 문제를 풀어낼 수 있는가를 알 수 있는 기준
해시 파워가 높으면 초당 계산할수 있는 역량이 높다는 뜻
- `흐름`
1. a가 b에게 거래 요청
2. 거래 정보가 블록에 담겨 생성
3. 블록이 모든 참여자가에게 유효성 확인
4. 확인된 블록은 체인에 연결
5. 거래 완료
- 해킹 위조 방지
블록체인 특성상 모든 참여자(노드)가 위조를 감시하기에 사실 현실적으로 해킹이 불가능한 기술이라고 하며 51% 공격처럼 `과반수가 위조를 할 수 있는 문제`가 있지만 현실적으로는 노드가 있기에 불가능하다
- 탈중앙화
블록체인은 분산원장 방식으로 관리하기에 중앙 체계가 없어 공격으로부터 피해가 적으며 제 3자없이 거래가 가능하고 P2P(peer to peer, 중간책없이 참여자끼리 소통)방식으로 거래가 이루어지기에(제 3자가 없기에) 수수료 문제도 사라진다
또한 모든 사용자가 데이터(블록)를 볼 수 있기에 투명성도 좋다
### 종류
- 퍼블릭 블록체인
탈중앙화로 제한 없이 불특정 다수가 운영과 참여 가능
누구나 데이터를 읽을 수 있다는 투명성이 있지만 참여자가 많아 네트워크의 확장이나 수정, 업그레이드가 어려우며 거래 속도가 느림
블록체인 네트워크 51% 이상의 동의를 얻어야만 프로토콜 변경 가능
- 프라이빗 블록체인
퍼블릭 블록체인과 반대로 특정 네트워크 상의 인증 방식을 통해 검증된 사람만이 참여 가능
폐쇠적이며 투명성이 낮으나 참여자의 제한으로 처리 속도가 빠르고 보안 측면에서 우위에 있음
### 암호화폐
위와 같은 특성을 활용한 `암호화폐`가 사용되며 해킹과 위조 위험 및 암호화폐의 매매, 교환 기록을 블록체인 방식으로 여러대의 컴퓨터에 분산 저장함으로써 해킹에 위험에서 안전할 수 있음
### 사용이유
`탈중앙화`로 인해 중앙기관의 독점적인 영향력에서 벗어날 수 있고 모든 거래기록이 분산보관되어 기록의 영구 보관 및 블록체인끼리의 연결성으로 인해 독점에 대해 저항할 수 있음
또한 암호화된 데이터와 키 값으로만 거래가 이루어지기 때문에 보안성이 높음
## 지갑
---
### Metamask
암호화폐 개인 지갑으로써 이더리움을 보유하고 송금 및 관리할 수 있음
사용자의 자금은 블록체인에 보관되어 있으며 추가적인 보안을 통해 개인 키를 암호화 할 수 있다
핵심적인 기능은 키 관리이며 개인키를 생성해주며 사용자가 필요할 때 꺼내쓸 수 있게 한다
### ethers.js
이더리움 블록체인과 상호작용하기위한 라이브러리
요청할때 특정한 형식으로 요청해야하기 때문에 그 형식으로 변경시켜주는 역할을 함
### web3
탈중앙화된 블록체인 네트워크를 통해 서버가 없는 분산형 웹, 사용자끼리 p2p가 가능해짐
기존에 공개된 코드를 사용할 수도 있고 오픈소스에 기여할 수 있어 기존 중앙화된 구조보다 개발이 빠르다
자바스크립트 기반으로 디앱이나 서비스를 구현할 때 유용
## 비대칭키
---
대칭키 암호(암복호화 할 때 사용되는 키가 동일함)가 가지고 있던 키 배송 문제를 해결한 것이 비대칭키 암호화이다
기존 대칭키 암호는 먼저 비밀키를 공유해야 하는데 이걸 뺏기면 암호는 아무런 소용이 없어지기에 문제가 생긴다
즉 암호화할 때와 복호화할 때의 키가 서로 다른 것을 의미함 (공개키와 개인키는 기능이 완전히 같음)
예시로 `서로 상대의 공개키로 암호화하여 데이터를 교환`하면 상대는 자신의 개인키로 복호화를 해서 데이터를 볼 수 있고 만약 중간에 탈취당한다해도 개인키가 없으면 복호화할 수 없음
아래는 암호화하는 두가지 방법입니다
- 공개키로 암호화하는 방법
개인키로 밖에 복호화 할 수 없으므로 암호의 성질을 가지고 있음
즉 `데이터 보안`에 중점을 두고 있음
- 개인키로 암호화하는 방법
암호화는 개인키를 가진 본인만 가능하지만 복호화는 공개키를 가지고 있다면 누구나 가능해서 서명의 성질을 가지고 있음
`인증`에 중점을 두고 있음
- 과정
1. a가 자기 공개키를 b에게 알려줌 (공개키는 모든 사람이 접근 가능함)
2. b는 a에게 받은 공개키를 통해 암호화하고 그걸 a에게 전달
3. 암호화된 것은 a의 개인키로만 복호화할 수 있어서 a만 해석할 수 있음
그렇기에 다른 사람이 그 문서를 봐도 복호화할 수 없음
- 대칭키와 비대칭키 혼합 활용
HTTPS에 적용되어 있는 SSL 프로토콜이 바로 혼합 활용된 대표적인 프로토콜이다
대칭키 암호화는 속도가 빠르기에 여기에 사용할 비밀키를 생성 후 이 비밀키를 비대칭키를 통해 안전하게 교환하는 방식
비밀키 교환이 완료되면 => 빠른 속도를 가진 대칭키 암호화를 통해 주고받음
즉, 비공개 공개키로 안전한 채널을 만들고 그 이후부턴 대칭키를 통해 데이터를 암호화하여 주고 받음
또한 브라우저는 인증된 공인 CA들을 알고 있는데 만약 서버에서 공인인증서가 아닌 사설인증서를 보내준다면 "이 사이트를 신뢰하시겠습니까?"라는 문구가 나오면서 인증서 발급 CA 확인을 함
암호화 방식으로는 아래 ECDSA, RSA가 존재하며 각각 암호화 방식이 다름
### ECDSA
이산대수 문제의 난해성을 이용한 암호화
정당한 소유주만이 자금을 쓸 수 있도록 하기 위해 사용됨
발신자에 의한 서명시 사용되는 개인키와 수신자가 발신자의 서명을 사용하는 공개키 한 쌍을 가짐
RSA에 비해 `짧은 키 길이와 빠른 연산속도를 가지고 있으면서 동일한 수준의 보안 강도`를 제공함
### RSA
대표적인 공개키 암호화 알고리즘
인수분해 문제 해결의 높은 난이도를 이용한 비대칭키 암호 알고리즘으로 암호화뿐만 아니라 전자서명의 용도로도 사용됨
공개키는 모든 사용자에게 공개되며 메시지를 암호화할 때 사용, 개인키는 암호화된 메시지를 복호화할 때 사용됨 그래서 타인에게 노출되어서는 안됨
개인키로만 해독이 가능하기 때문에 안전하게 공유될 수 있음
- 이슈
양자 컴퓨터가 등장함으로써 컴퓨터의 연산 능력이 높아져 안전성이 위험하다고 알려져있음
암호 알고리즘이 쉽게 풀릴 수 있기에 양자 컴퓨터 이후의 암호 시스템에 대해 연구 중에 있음
- RSA 암호화 적용 예시
RSA 방식으로 암호화해서 서버에서 복호화 로직
RSA는 공개키/개인키를 일회성으로 생성하고 사용한뒤 폐기하는 방식을 가지고 있다 <= ????
1. 서버에서 RSA 키 생성
2. 공개키/개인키 생성해서 개인키는 세션에 저장, 공개키는 클라이언트에 전송
3. 클라이언트는 자바스크립트 모듈을 통해 공개키 값으로 암호화
4. 서버에서 개인키로 복호화
## Hash
---
데이터를 다루는 기법 중에 하나로 검색과 저장이 빠르게 진행되며 `데이터를 고정된 길이를 가진 데이터`로 매핑한 값
데이터의 위 변조 유무 확인을 Hash 함수로 확인할 수 있음
또한 해시는 `단방향 암호화 기술`이므로 PoW는 해시함수에서 나온 출력값을 토대로 입력값을 찾아내는 것이며 그 보상으로 암호화폐를 주는 것
- 해시 함수
임의에 데이터를 입력받아서 일정한 길이의 데이터로 바꿔주는 함수를 말하며 그 일정한 길이의 값을 `해쉬`라고 한다
해시 함수에 종류는 아래와 같다
### SHA256
SHA-2라고도 불리며 256비트로 구성되며 64자리 문자열을 반환함
현재 블록체인에서 가장 많이 채택되는 암호 방식이며 출력 속도가 빠르고 단방향성의 성질을 띄고있어 복호화가 불가능함 (정보의 무결성)
### SHA-1
160비트 해시값을 만드는 암호화 해시 함수
인터넷 보안 프로토콜과 공개키 인증서에도 적용되는 중요한 암호 알고리즘
선택 접두어 공격(무차별 대입 공격으로 동일한 해시를 만들 수 있음)을 이유로 sha-1대신 sha-2, sha-3 사용할 것이 권고된다
### Keccak
sha-1, sha-2에 내재하는 보안 취약점을 개선하고자 개발된 암호화 해시 알고리즘
SHA-3의 해시 알고리즘으로 선정되었음
## 합의 알고리즘
---
다수의 참여자들이 통일된 의사결정을 하기 위해 사용하는 알고리즘 = 신뢰가 없는 사용자들간에 합의할 수 있는 방법
코인을 채굴할때 컴퓨터가 해야 하는 일
이를 통해 분산된 네트워크의 무결성을 지키는 역할을 함
### PoW (작업증명)
하드웨어 장비를 사용해 코인을 채굴하는 것이며 마이닝 과정에서 필수적인 부분이며 `목표값 이하의 해시를 찾는 과정을 무수히 반복함`으로써 해당 작업에 참여했음을 증명하는 방식의 알고리즘
높은 해시 레이트를 가질 수록 블록을 찾을 가능성이 더 높으며 새로운 블록의 트랜잭션을 검증하고 이를 블록체인에 추가해서 증명하도록 함
`해시 파워`(해쉬 과정을 얼마나 빨리 수행할 수 있는지에 대한 수치 정보)를 이용해 특정 난이도의 해시값을 역함수로 해시화하여 Nonce 값을 계산해냄
- Nonce 값
이 트랜잭션이 트랜잭션을 생성하는 어카운트 내에서 몇 번째로 발생하는 트랜잭션인지를 나타내는 16진수 값
즉, 블록체인에서 목표값 이하의 블록 해시를 찾기 위해 임시로 사용하는 숫자
### PoS (지분증명)
PoW와는 다르게 신규 코인을 발행할 때 이미 기존에 가진 코인 소지량의 일정 비율만큼 지급하는 방식
해당 암호화폐를 보유하고 있는 지분율에 비례하여 의사결정 권한을 주는 방식
의사결정 권한을 `코인 보유량에 비례해 지급하는 방식`이기 때문에 코인을 많이 보유하고 있는 노드가 블록 생성에 참여할 수 있는 기회가 더 많아 보상도 커진다
작업증명에 비해 더 쉬운 방식으로 많은 참여가 발생할 수 있으며 더 많은 사람이 의사결정에 참여할 수 있다
## Smart Contract
---
블록체인 기반으로 금융거래 등 다양한 형태의 계약을 체결하고 이행하는 것을 뜻하며 블록체인에 등록되어 작동하는 프로그램 (블록체인 2.0)
즉 블록체인에서 스마트 컨트랙트는 기존 서면계약을 코드로 구현해서 `조건이 충족됬을때 해당 계약이 이행되도록`하는 스크립트에 가까움 (일정 조건이 충족되면 자동으로 계약이 이행됨)
탈중앙화처럼 `특정 조건이 충족되지 않으면 계약이 실행되지 않기` 때문에
계약 당사자끼리 서로 신뢰하지 않아도 계약을 이행할 수 있다는 것이 특징 (제 3자도 필요하지 않음)
블록체인 방식으로 모든 참여자가 거래를 확인하고 검증할 수 있으며 그렇기에 위변조가 어렵다
투명하게 거래 내역이 공유된다는 특징 때문에 그 거래 내역을 신뢰할 수 있음
기존 복잡한 계약에 비해 `비교적 적은 비용과 신뢰성을 바탕으로 안전하게 계약`할 수 있음
이더리움에서는 solidity라는 프로그래밍 언어를 통해 스마트 컨트랙트를 작성함
- 단점
`거래 이후에 내용을 수정할 수 없음`
이러한 특성 때문에 신뢰성이 있지만 반대로 취약점이기도 하는 한계점이 존재함
만약에 취약점이 남아있다면 내용을 수정할 수 없기에 취약점이 그대로 남아 있는 것이 되기 때문
### peri: staking
스테이킹을 통해 USD => Pynth pUSD를 발행할 수 있음
플랫폼에 유동성을 제공해서 수수료의 일부를 이자로 지급받음
1 : 4 = pUSD : USD 형태로 발행되며 peri가 값이 변동됨에 따라 담보비율(C-ratio)도 변경되게 되며 청산 비율에 도달하게 되면 자동으로 청산되게됨
또한 사용자는 담보비율이 400%일 때만 스테이킹 보상을 청구할 수 있음
### 합성자산
특정 금융 자산을 보유한 것과 같은 결과가 발생하도록 구성한 자산의 집합체 = `금융과 똑같은 결과가 나오도록 구성`한 것
암호화폐 기반의 합성자산의 경우 기초자산을 직접 소유할 필요가 없이 그것을 소유한 것과 동일한 결과를 가져올 수 있도록 만들어진다
접근성 또한 암호화폐 지갑을 연결하여 쉽게 금융자산에 접근할 수 있기에 접근성이 좋습니다
- 단점
실제 자산이 아니기 때문에 기초 자산의 권리를 행사할 수 없으며 가치 하락에 위험이 존재함
???
## Frontend
---
### React
자바스크립트 라이브러리로써 컴포넌트 기반의 구조를 가지고 있음
클라이언트 사이드 렌더링을 하고 있다
- 컴포넌트 기반 구조
컴포넌트 단위로 구성되어 있어서 UI 변경이 편하다
props로 데이터나 상태를 넘겨 전달받으면서 사용할 수 있다
- 단방향 데이터 흐름
flux 패턴으로 데이터를 단방향으로 사용한다
- 가상 DOM, SPA
변경되는 부분만 실제 DOM과 비교해서 최소한 부분적으로 변경함
- 상태
redux와 useState를 통해 상태를 전역적으로 관리할 수 있다
불변성에 초점을 두고 있어 기존 상태를 직접적으로 변경하면 안된다
부모 컴포넌트의 상태가 변경되면 그 부모 안 자식들의 컴포넌트가 모두 재렌더링 되는 특징을 가지고 있으며
리액트는 단방향 데이터 흐름을 가지고 있기에 부모의 상태를 자식이 변경하고 싶다면 변경 핸들러를 props로 내려서 사용해야한다
- 커뮤니티, 라이브러리
커뮤니티가 잘 활성화 되있어 정보를 찾기 쉬우며 다양한 라이브러리들을 사용할 수 있어 확장성이 높다
타입스크립트나 Next.js, Node.js를 추가해서 사용할 수 있다
- Hook
리액트에는 훅이라는 기술들을 사용할 수 있다
상태관리에 사용되는 useState, 렌더링 생명주기에 사용되는 useEffect가 있으며 개발자가 직접 훅을 커스텀해서 원하는 대로 훅을 제작해서 사용할 수도 있다
- styled components
scss 문법을 가져다가 쓸 수 있으며 컴포넌트 단위로 css를 구성할 수 있고 props를 받아서 동적으로 스타일을 변경할 수 있다
Next.js와 같은 리액트 기반 프레임워크를 사용할 수 있어서 CSR로 구성된 리액트에서 SSR을 사용하는 Next.js를 사용할 수 있는 것처럼 자바스크립트라는 언어 하나를 통해 여러개의 프레임워크를 사용할 수 있다 RN을 사용해서 앱 개발도 가능하다
### custom Hook
개발자가 만들어서 사용할 수 있는 Hook으로써 앞에 use를 붙혀서 사용한다
코드량을 줄여주고 일반 컴포넌트를 생성하는 것과 크게 다르지 않기에 주로 사용되며
자주 사용되는 로직이나 기능을 구현할때 custom Hook을 사용하여 재활용성을 높일 수 있다
다른 기준 훅들을 커스텀 훅 안에서 사용할 수 있음
- 단점
호출된 커스텀 훅은 useEffect 안에서 사용할 수 없음
### Recoil
Context API 기반으로 구현된 함수형 컴포넌트에서 사용가능한 리액트 상태관리툴
- redux와 차이점
- 런닝커브가 적음
- redux보다 프로젝트 번들이 가벼워짐
- selector를 통해 비동기 데이터를 가져올 수 있음
- 사용이 간단함
- redux는 flux 기반 recoil은 atomic 기반
- devTools와 같은 부족한 부분이 존재함
- RecoilRoot
리덕스의 Provider와 비슷한 역할을 하며 여러개의 RecoilRoot가 존재할 수 있다
```jsx
import {RecoilRoot} from 'recoil';
function App() {
return (
<RecoilRoot>
<Components>
</RecoilRoot>
)
}
```
- atom
recoil에서 상태를 정의하는 방법
atom이 업데이트 되면 그 atom을 참조하고 있는 컴포넌트를 리렌더링 시킨다
```jsx
// 상태 정의
// 다른 파일에 있는 atom을 읽어올 수 있다
const sampleState = atom({
key: 'sampleState',
default: [],
})
// useState와 동일한 문법
const [sample, setSample] = useRecoilState(sampleState);
// useRecoilValue = useSelect와 동일한 문법
const sample = useRecoilValue(sampleState);
// useSetRecoilState = useDispatch와 동일한 문법
const setSample = useSetRecoilState(sampleState)
// 상태 업데이트 예시
setSample(값) || setSample(현재값 => [값, ...현재값])
```
- selector
recoil에서 관리하는 특정 부분만 선택(파생)해서 상태를 사용한다
atom에서 `파생`된 데이터 조각이며 데이터를 반환하는 순수 함수
atom만으로는 비동기 처리를 할 수 없기에 비동기 상태 처리가 가능한 selector를 사용해서 비동기처리를 할 수 있음
또한 캐싱 기능을 가지고 있어서 들어왔었던적이 있는 값을 기억하기에 불필요한 요청을 하지 않기에 성능적으로 유리합니다
selector안에서 사용되는 atom에는 자동으로 의존성이 걸려서 atom이 변경될때마다 파생된 selector가 변경된다
그렇게 의존성 걸린 값이 같다면 메모이즈된 캐싱 값을 반환한다
- `key`는 내부 atom을 식별하는데 사용됨
- `get` 함수는 읽기만 가능한 객체를 반환
get 인자를 통해 atoms와 다른 selectors에 접근할 수 있음, 파라미터로 key를 넣을 수 있다
getter에 인자에는 상태값을 결정하는 객체가 전달됨
- `set` 함수는 쓰기 가능한 객체를 반환한다
한개 이상의 atom 정보를 업데이트 할 수 있음
두번째 인자로 reset을 받아 `useResetRecoilState()`를 통해 초기화를 걸 수도 있다 (resetter 함수)
```jsx
// 상태 정의
const sampleState = atom({
key: 'sampleState',
default: [],
})
// selector 비동기 함수 예시
const sampleSelectState = selector({
key: 'sampleSelectState',
get: async ({get}) => {
let response;
axios.get(url).then(res => response = res)
return response;
},
set: ({ set, reset }, 추가로받을인자 => set(추가로받을인자)),
})
// app
function App() {
return (
<React.Suspense fallback={<div>loading...</div>}>
<></>
</React.Suspense>
)
}
```
- selectFamily
외부에서 값을 받아와서 select에 적용해야할 경우에는 `selectFamily`를 통해 해결할 수 있음
```jsx
// selectFamily를 통해 get 값을 받아오는 함수 예시
export const sample = selectorFamily({
key: 'sample',
get: (받아올값) => async () => {
await axios.get(받아올값)
}
})
```
- loadable
atom이나 selector의 현재 상태를 나타내는 객체
```jsx
const sample = useRecoilValueLoadable(key값);
```
프로퍼티 종류
- state
hasValue, hasError, loading 세가지로 구성되어 있고 atom이나 selector의 상태를 뜻함
- contents
atom이나 selector의 값을 나타내며 각각 value, error, promise의 형태를 가지고 있다
suspense를 처리할 때 try catch를 통해 에러를 관리해야하지만 Recoil은 자체 예외를 발생시키지 않는다
### CI/CD
- CI란
새로운 변경 사항이 자동으로 빌드 및 테스트되어서 레포지토리에 합쳐지는 것을 의미
문제가 발생한다면 발생하는 문제를 보여줌에 따라 버그를 미리 발견할 수 있다
- CD란
새로운 변경 사항이 레포지토리(CI)는 물론 배포 환경까지 릴리즈 되는 것을 의미
변경사항에 문제가 없으면 자동으로 배포되는 것을 의미
이 두가지를 합쳐서 자동화 배포 파이프라인이라하고 개발할때 자동화 및 자동 모니터링이 되는 것을 뜻합니다
## AWS
---
- EC2
용량 조정이 가능한 컴퓨팅 클라우드에서 제공하는 서비스
즉 가상의 컴퓨터를 빌려주는 서비스로써 인스턴스 = 1대의 컴퓨터를 의미(운영체제 선택)
- S3
데이터를 저장하는 `온라인 웹 스토리지`(파일 서버)
`객체 단위로 데이터가 저장`됨, 용량도 조절해서 가능함 최대 5TB까지 가능
버킷이라는 최상위 디렉토리가 존재하며 버킷의 모든 이름은 S3 Region(지역)에서 유일해야하며 계정별로 100개까지 생성 가능