22.02.28 ~ 22.03.08 공부한 내용

Lumi·2022년 3월 8일
0
post-thumbnail

🔥 개요

잠시 스스로 공부를 하던 부분을 내려 놓고 한번 뒤돌아 보았을떄 어떤 부분을 공부하였는지에 대한 기록 입니다.

별거 없지만 이론적인 내용도 있었고 면접준비를 하는데에 시간을 소모했던것 같습니다.

개인적으로 정리했던 내용이기도 하고 이전에 알고 있던 내용도 있지만 틀릴수도 있으며 하나하나 파고 들어가기 보다는 시간이 많지는 않아서 어떤 것인지만 간략하게 다루어본 내용입니다.

  • 틀릴수도 있는 내용입니다.!!

🔨 네트워크

  • 네트크에 대해 간략하게 작성을 하였고 제 언어로 작성을 하였습니다.

🚀 OSI 7계층(의미)

OSI7계층은 단순히 인터넷에 검색을 해 보아도 쉽게 알수 있습니다.

저는 이런 계층에서 몇계층에 뭐가 있다 이런식의 접근보다는 이런 계층이 왜 존재하는지에 대해서 간략하게 머리속으로 정리하였습니다.

쉽게 말해서 특정 문제점이 발생하거나, 어떤 부분에 있어서 해결방안이 필요할떄 명시적으로 어디가 문제구나, 어디가 잘못 되었구나 이러한 부분을 확인하기 위해서 존재한다고 생각을 합니다.

예를들면 통신쪽 파일 전송에 문제면 아 7계층 FTP쪽이 문제구나 이렇게 단순하게 문제점을 해결하는데에 있어 명시적으로 확인하기 위한 일종의 표 라고 생각합니다.

🚀 TCP, UDP

일단 4전송 계층에 존재하는 프로토콜 입니다.

TCP의 경우에는 양방향 통신을 지원하기 떄문에 보안적으로 우수한 전송 프로토콜 입니다.

하지만 양방향이라는 단점으로 속도가 느리다는 단점이 있고 주로 파일을 전송하는데에 사용이 됩니다.

UDP의 경우에는 단방향 통신에 사용이 되는 프로토콜 입니다.

보안적으로 우수한 형태는 아니지만 전송을 목표로 하기 떄문에 빠르고 스트리밍 서비스에 주로 사용이 됩니다.

UDP가 자체적으로 보안성을 보여주지 않는 것이지 개발 과정을 통해서 보안성을 부여할 수 있는 것으로 알고 있습니다.

🚀 http, https

7계층에 있는 통신 프로토콜 입니다.

주로 웹 통신에 사용이 되는 프로토콜로 둘의 차이점은 단순하게 보안성에 있습니다.

http는 보안적으로 문제가 많아서 현재에는 사용하지 않고 있으며 https가 거의 90%이상 사용이 되고 있습니다.

https는 http에 비해서 비대치키, SSL을 통해서 보안성을 확보하고 있고 SSL은 속히 말해 인증서라고 하며 이러한 인증서는 인증된 기관으로부터 나오게 됩니다.

비대칭키는 굉장히 간단하면서 어렵습니다.

A라는 사용자가 B와 통신을 할떄에 A에서 요청을 하고 응답을 하게 됩니다.

그러면 A라는 사용자는 요청데이터, 응답 데이터를 모두 가지게 되고 이 데이터를 합쳐서 하나의 공동 키를 생성하게 됩니다.

이후 이 공동키를 비대칭키로 전송을 하는데 비밀키로 암호화를 한뒤에 B에게 전송을해 B는 A의 공개키로 복호화해 이후 통신을 하게 됩니다.

이후 통신을 할때 사용되는 키는 아까 만든 공동키를 통해서 통신을 하고 이를 대칭키 통신이라고도 합니다.
  • 보안적으로는 비대칭키가 더 우수하지만 대칭키를 사용하는 이유는 이미 신뢰되어 있는 사용자 이기도 하고 대칭키가 비대칭키에 비해 메모리를 덜 잡아먹기 떄문으로 알고 있습니다.

🚀 도메인

쉽게 말해 IP주소를 사용자가 알아보기 쉽게 변환시킨 주소 입니다.

저희가 집앞에 있는 스타벅스를 지칭할떄는 두가지 방법이 있습니다.

  1. 주소
  2. 문앞에 있는 스타벅스

이와 같이 인터넷에서도 IP주소, 도메인 주소로 두가지가 존재 하게 됩니다.

도메인 주소 같은 경우에는 DNS라는 일종의 DM에 ip주소에 맵핑 되어서 존재하게 됩니다.

쉽게 말해 사용자 친화적인 주소 입니다.

🚀 프록시

클라이언트가 다른 네트워크 서비스에 접근을 할떄에 중간 다리 역할을 해주는 시스템을 말합니다.

쉽게 말하면 조율자 라고 할수 있고 요청된 정보들을 캐시에 저장을 해두고 후에 중복되어 들어오는 요청이나 응답은 클라이언트를 거치지 않고 바로 프록시에서 처리를 해주는 것으로 작동한다 정도로 알고 있습니다.

  • ⚠️이 부분은 확실한 내용은 아니라고 생각합니다.⚠️

🚀 CORS

아마 한번쯤은 다 들어봤을법한 용어 입니다.

기본적으로 보안성을 위해 존재하는 용어이며 Accsss-control-origin이라는 용어도 자주 같이 등장하게 됩니다.

쉽게 말하면 그냥 나랑 출신이 다른 출처는 허용하지 않는다는 말 입니다.

  • 이런... 꽉꽉 막혀 있는 것 같으니라고;;

이런 cors를 처리하는 방법은 개인적으로는 두가지가 있습니다.

  1. cors라이브러리 사용

간단합니다. Node.js기준 cors라이브러리를 설치해서 그냥 적용시키면 됩니다.

  • app.use(cors())
  1. Access-control-origin

이런 경우에는 모든 요청에 적용을 해주어야 합니다.

router에 들어오는 모든 요청마다 해당 조건을 *로 설정해 줌으로써 동작 시킬수 있습니다.

  • 이 부분은 하드코딩이라서;; 그냥 cors사용을 하면 됩니다.

🚀 세션, 쿠키

음 간단하게만 알고 있어서.. 간단하게 말을 하자면 인증정보를 어디에 보관을 하냐에 대한 내용인 것 같습니다.

세션의 경우에는 서버에 인증 정보를 저장을 하게 됩니다.

그러다 보니 서버 측에서 메모리 소모가 발생을 하게 된다는 단점이 있습니다.

이와 반대로 쿠키는 클라이언트 측에 보관을 하게 됩니다.

그러면 이 부분은 클라이언트에서 메모리적인 소모가 발생을 하겠죠

어떤 방식이 좋은지는 모르겠지만 상황에 따라서 사용자의 인증정보를 보관하고 그 해당 인증정보를 통해서 통신에 사용을 한다 정도로 알고 있습니다.

🚀 JWT

토큰 기반의 인증에 사용이 되는 전자서명된 JSON데이터를 말합니다.

그냥 쉽게 말하면 토큰 인증에 사용되는 JSON데이터 입니다.

인증 방식에는 작게보면 3가지가 있습니다.

  • 세션, 쿠키, 세션

세션과 쿠키의 경우에는 간단하게 서버 or 클라이언트에 보관을 하지만

토큰의 경우에는 OAuth2.0과 같이 다방면으로 사용이 가능합니다.

이중 JWT는 OAuth와 같이 다른 플랫폼을 통해 인증하는 방식이 아닌 체크썸이라고도 할수 있는 하나의 구문을 통해서 암호화하는 방식이라고 보면 될 것 같습니다.

예를들면

회원가입을 하고 로그인을 하게 될떄 사용자 정보를 jwt를 사용하여 암호화 한다.
- 이떄 비밀번호는 중요한 정보이기 떄문에 하지 않는다.

이후 해당 jwt토큰을 통해서 통신을 한다.

jwt토큰의 경우에는 클라이언트에 보관을 하든지, 서버에 보관을 하던지 자유지만 사용가능한 시간에 유의하여 사용을 해야 합니다.

  • 만료 시간이라고도 하고 이러한 시간을 넘어서면 토큰을 다시 발급해 주던가 아니면 로그아웃을 해주던가로 작동을 시켜야 한다고 합니다.
  • 저 같은 경우에는 만료시간이 되었을떄를 처리하지 못했던;;;

🚀 RESTful API

API라고 하면 속히 말하는 것처럼 GET, POST, PUT, DELETE 등이 있습니다.

이떄 RESTful API라고 하면 그냥 단순하게 API를 잘 짯냐라는 뜻 같습니다.

예를들면 POST요청을 할때에는 반드시 새로운 데이터를 만드는데 요청을 해야 한다.

PUT요청의 경우에는 반드시 어떤 값을 수정하는 형태이어야 한다.

일종의 규칙 같은 것이고 굳이 지킬 필요는 없지만 상호간에 협업하는데에 있어 API를 좀더 용이하게 수월하게 확인하기 위해서 사용하는 것 같습니다.

🔨 서버 통신을 예시를 들어서 간단하게 설명

  • 누군가에세 서버가 어떻게 통신이 되냐에대해서 설명을 한다면 어떻게 설명할 것인지에 대한 내용을 담았습니다.

🚀 일반인에게 설명 할 떄

A라는 사람이 B라는 음식점에 갑니다.

B라는 음식점에는 홀직원, 주방장으로 구성이 되어 있습니다.

A라는 사용자는 홀직원에게 음식을 주문을 합니다. 그후 홀직원은 주방장에게 음식을 전달하고 주방장은 냉장고에서 음식에 맞는 재료를 가져와서 요리를 한뒤에

홀직원에서 음식을 전달해 주고 홀직원은 음식을 사용자에게 전달해 줍니다.

이것이 DB까지 포함한 설명의 전부 입니다.

이것을 다시 웹통신으로 설명을 하면

A(클라이언트)는 B(서버)에 요청을 합니다. 이후 B(서버)는 주방장(Back_end)에게 요청을 전달해 줍니다.

주방장(Back_end)는 요청을 전달받으면 냉장고(DB)에 가서 재료를 꺼내고 조리를 해준뒤 B(서버)에게 응답을 합니다.

이후 B(서버)는 A(클라이언트)에게 응답을 전송해 줌으로써 마무리가 됩니다.

🚀 개발자에게 설명 할 떄

A(사용자, 클라이언트), B(홀직원,가게, 서버), C(커피 제조자, Back_end), D(냉장고, DB) 이렇게 구성이 되어있다고 하겠습니다.

일단 A는 B에게 가기위해서는 두가지 방법이 있습니다.

1. 우리집앞 커피집
2. 특정 주소를 통한 커피집

둘 모두 같은 커피집을 의미할떄 이것을 Domain, Ip라고 합니다.
- 이것을 이제 DNS에서 처리를 해주게 되죠

또한 A가 B라는 가게에 들어가는 방법은 여러가지가 있습니다.
- 드라이블 스루, 정문, 후문

이와 같이 클라이언트가 서버에 접근하는 방식을 PORT라고 하며 원하는 접근 방식에 따라 알맞은 PORT로 접근을 하게 됩니다.

A가 어떤 경로로 일단 B에 들어왔다고 생각을 하겠습니다.

그럼 이떄 A가 기존에 회원인지를 확인합니다.
- 이것을 이제 CORS처리라고 하겠습니다.

자 이제 인증까지 다 되었고 이제 A가 주문을 하게 됩니다.
- 이떄 사용이 되는 것이 프로토콜 또는 RESTfulAPI라고 합니다.

B가 주문을 받게 되면 이제 C에게 주문을 전송을 하고 C는 D에서 재료를 꺼내오기 시작합니다.
- D같은 경우에는 DB로 RDBMS, NoSQL등이 있겠습니다.

C가 재료를 꺼내오고 조리를 한뒤에 이제 B에게 전송을 하고 B는 A에게 전송을 해주게 됩니다.

이때 어떤 손님이 주문을 했는지를 확인해야 하기 떄문에 이떄 사용되는 것이 쿠키, 세션, 토큰의 개념이라고 하면 될 것 같습니다.

🔨 Node.js

  • Node.js에 대한 이론적인 내용이 주를 이루며 이 부분에서는 틀린 부분이 많이 존재할수 있습니다.

🚀 Node.js는 무엇이고 어디에 사용이 되고 왜 사용하는가

딱딱하고 뭐 이론적인 내용보다는 진짜 왜 사용되는지에 대해서 적어보자면

일단 Node.js라고 하면 프론트에서 JS를 사용하듯이 백엔드에서도 JS를 사용하게 해주는 일종의 플랫폼입니다.

비동시성으로 작동을 하기 떄문에 실시간 채팅, 스트리밍 서비스, 웹 서버, 협업 도구 등에 주로 사용이 됩니다.

Node.js를 사용하는 이유는 굉장히 간단합니다.

뭐 이벤트 드리븐, 빠른 속도 이런거는 다른 언어에서도 지원을 하기 떄문에 다 제쳐두고 그냥 쉽게 배우고 동시성이 뛰어나기 때문입니다.

일단 언어 자체가 굉장히 약언어라서 타입적인 부분에서 에러를 잘 발생 시키지 않고 배우기 굉장히 쉬운 언어 입니다.

또한 프론트 에서 JS를 사용하듯이 백엔드에서도 JS를 사용이 가능하기 떄문에 동시성이 뛰어나 굉장히 포용성이 뛰어난 언어라고 생각을 합니다.

하지만 반대로 연산작업이나, 무거운 작업을 할때에는 타 언어에 비해서 부족한 부분이 있는 것으로 알고 있습니다.

🚀 Node.js의 작동 원리, 멀티 쓰레드

  • 이 부분은 특히나 틀릴수 있습니다.

일단 요청이 들어오면 이벤트 풀에 담기게 됩니다.

이후 해당 요청을 이벤트 루프를 통해서 처리가 되게 되는데

간단한 I/O요청인 경우에는 바로바로 처리가 되지만

단일 쓰레드를 지원하는 Node.js에서 외부 리소스에 접근을 해야 하는 경우에는 따로 쓰레드 풀에 담겨 처리를 해주어야 합니다.

  • 외부 리소스는 DB같은 것을 말 합니다.

이렇게 쓰레드 풀을 활용 가능한 이유는 외부 런타임 환경에서 멀티 쓰레드를 지원해 주기 떄문 정도로 알고 있습니다.

  • Node.js는 V8엔진을 사용하기 떄문에 기본적으로 단일 스레드 입니다.
  • 또한 컴파일 언어가 아니라 스크립트 언어고 Node.js의 타입적인 부분을 체크하기 위해 등장한 TypeScript는 컴파일 언어 입니다.

🚀 콜백에 대해서

함수에서 특정 인자를 받아서 자유롭게 사용이 가능한 기법중의 하나입니다.

보통 특정 함수가 실행이 된 이후의 결과값을 받아서 사용이 되며 강제되는 기법은 아니고 자유롭게 사용을 하면 되는 기법 입니다.

굉장히 편리하고 코드적으로 간편하게 작성이 가능하지만 속히 알고 있는 콜백 지옥에 빠질수도 있고 이러한 문제점을 해결하기 위해 Promise가 등장하게 되었습니다.

Promise는 에러부분까지 잡아주며 콜백 처리도 할수 있지만 이 또한 Promise지옥에 빠질수 있기 떄문에 await/async까지도 함께 사용 하는 것으로 알고 있습니다.

🚀 ajax/webSocket

React에서 컴포넌트를 생각하면 됩니다.

특저 행위가 일어나 웹 페이지의 상태가 바뀌게 되면 웹 페이지를 새로고침 하는것이 아니고 변화가 생긴 부분에만 새로고침이 일어나는 것을 말합니다.

이떄 ajax는 응답에 대한 헤더 데이터도 가져오게 됩니다.

그러면 단순히 1~100까지 숫자를 카운트 하는 상황이 있다면

ajax를 사용하게 되면 모든 숫자마다 헤더 데이터를 가지고 들어오게 되고 이러한 헤더 데이터는 불필요한 데이터가 되기 때문에 더미 데이터가 됩니다.

이는 비효율적이기 떄문에 webSocket를 사용합니다.

하지만 webSocket는 최신기술이라서 최근 브라우저 인프라에서는 지원을 잘 하지 않는다는 단점이 존재 합니다.

🚀 TDZ

호이스팅에 사용이 되는 용어 입니다.

Node.js에서는 호이스팅이라는 작업을 통해서 모든 변수를 최 상단에 올려놓고 필요할떄 사용을 하게 됩니다.

var로 선언한 변수 같은 경우에는 TDZ라는 용어가 적용이 되지 않지만 let의 경우에는 적용이 가능합니다.

console.log(v)  // 1
var v = 3;
console.log(v)  // 2
- 이런 경우에는 1번에서는 undefined가 나옵니다.

console.log(a) // 1
let a = 3;
console.log(a) // 2
- 이런경우에는 에러를 발생 시킵니다.

왜냐하면 let의 경우에는 TDZ라는 용어가 적용이 되어 선언되기 전에는 해당 변수에 접근이 불가능 한 조건이 붙기 때문 입니다.
  • 쉽게 말해 let과 var의 차이점을 두기 위해서 사용이 되며 직접적인 선언 전에는 사용을 하지 못하게 막는 영역을 TDZ라고 합니다.

🚀 스코프

  • 이 부분은 그냥 검색을 하면 알기도 하고 아마 대부분 알고 계실테니 넘어가도록 하겠습니다.
  • 전역변수 vs 지역변수를 의미

🚀 클로저

함수가 함수를 리턴하는 형태를 말합니다.

function a() {
let n = 1
	return function b(){
    	console.log(n)
    }
}

이런 구조를 의미하며

이후 사용을 할떄에는 let test = a(), console.log(test())

를 통해서 사용이 가능합니다.

즉 클로저는 이전 함수에 있는 변수, 상태 값을 담고 있는 함수를 의미 합니다.

🔨 하이퍼 레저

  • 이 부분은 새롭게 공부한 내용이기도 하고 아는 부분이 적어서 틀린 부분이 있을수 있습니다.

기본적으로 프라이빗 블록체인을 말하며 허가용 블록체인이라고도 합니다.

  • 사실 블록체인이라는 것은 탈중앙화가 되어있다는 점에서 큰 매력을 느꼈는데 프라이빗 블록체인에 대해서는 그렇게 많은 매력을 느끼지는 못하고 있습니다.

어느정도 기본적인 부분에 대해서 적어보자면

일단 일반적으로 알고 있는 스마트 컨트랙트라는 용어는 하이퍼레저에서는 체인코드라는 용어로 사용이 됩니다.

둘다 같은 의미를 가지고 있지만 용어만 다른것으로 알고 있고 체인코드에서는 따로 가스비가 존재하지 않지만 중앙화 되어 있다는 점에서 높은 성능을 보장하기도 합니다.

가스비가 존재하지 않아도 문제가 없는 이유는 간단합니다.

허가용 블록체인 이기 때문에 이미 참여자 = 노드 는 신뢰할수 있는 서버가 될 것이고 하이퍼레저에서는 체인코드를 피어=노드를 지정하여 실행시키기 떄문에 문제가 발생하지 않습니다.

  • 또한 만약 공격을 당해도 해당 피어만 마비되는 것이지 전체 시스템은 마비가 되지 않습니다.

하이퍼 레저에 대한 구조를 잠시 설명을 하면 좀더 이해가 될것 같습니다.

일단 하이퍼 레저라는 네트워크가 있다고 하겠습니다.

해당 네트워크에는 허가된 사용자는 A,B,C가 있습니다.

만약 A-B사이에만 공유된 원장을 만들고 싶다면 A-B사이에 Oreder노드와 채널을 만들게 되며 이후 A,B에 있는 리더 피어들을 해당 채널에 참여 시키게 됩니다.

이후 서로간에 통신하기 위해서 체인코드를 설치하면서 하나의 채널이 구성이 됩니다.
  • 좀더 현실적으로 말하면 그냥 한 반에 친한 애들끼리 그룹을 만드는 것과 굉장히 유사하다고 생각합니다.
  • A,B,C라는 그룹이 있지만 A-B그룹만 친할수도 있고, A그룹에 있는 학생이 C그룹 일부랑 친할수도 있고?? 이런식으로 구성이 되어 있다고 생각하면 될것 같습니다.

이렇게 따로따로 채널을 구성하는 이유는 프라이빗 블록체인 이기 떄문입니다.

기업에서 주로 사용하는 블록체인 특성상 숨기고 싶은 정보가 있을 것이고 이러한 정보를 따로 채널을 만들어서 구성을 하는 것으로 이해를 하였습니다.

블록 생성을 하는 과정에 대해서 간단하게 적어보자면

일단 사용자가 트랜잭션을 요청하고 Dapp이 이를 피어에게 전달을 해 줍니다.

  • 이떄 피어는 체인코드를 담고 있는 피어가 됩니다.

트랜잭션을 받은 피어는 한번 테스트 용으로 해당 트랜잭션을 실행시켜보고 결과값이 예상값과 동일하다면 자신의 서명과 결과값을 Orderer에게 전송을 합니다.

이후 Orderer에서는 해당 데이터를 받고 블록을 생성한 후에 자신과 연결된 Leader피어들에게 다시 전송을 해주게 됩니다.

Leader피어들은 해당 블록을 받고 자신의 채널에 속한 피어들에게 다시 블록을 전송을 해줌으로써 하나의 블록 생성이 완료가 됩니다.

  • 이떄 Order피어는 네트워크에 존재하는 피어라고 생각하면 되고, Leader피어는 채널에 속해있는 중계자 피어라고 생각하면 될 것 같습니다.

🔨 운영 체제

🚀 프로세스

프로세스와 프로그램의 차이점에 대해서 다루는게 맞다고 생각하여 이 부분에 대해서 다루어 보겠습니다.

프로그램은 그냥 단순히 코드의 집합 입니다.

어떠한 것도 아니고 그냥 코드들을 모아둔 것 을 프로그램이라고 합니다.

이 프로그램을 실행시키셔 메모리를 할당 시키는 것이 이제 프로세스 입니다.

  • 즉 프로그램을 실행시켜서 메모리가 할당된 프로그램을 프로세스 라고 합니다.

🚀 쓰레드

쓰레드는 프로세스에서 하는 일련의 모든 과정을 말합니다.

계산기를 예로 들었을떄 버튼 누르는것, 계산하는것 이러한 과정이 모두 쓰레드 입니다.

이렇게 단일 쓰레드도 있지만 추가적으로 한번에 여러개의 작업이 가능한 멀티 쓰레드도 존재하게 됩니다.

🚀 Context Switching

코어와 프로세스에 관한 내용입니다.

기본적으로 코어는 한개의 프로세스만을 담당하게 됩니다.

즉 코어와 프로세스는 1:1의 관계가 있지만 저희는 브라우저를 100개를 틀어놔도 문제 없이 작동을 하는 것은 누구나 다 알고 있습니다.

이런 경우에는 코어가 프로세스를 사용자가 인지하지 못할정도로 빠르게 프로세스를 갈아 끼우면서 동작시키게 됩니다.

이때 프로세스를 교체할떄 발생하는 메모리 손해를 Context Switching이라고 합니다.

🚀 메모리 단편화

메모리가 낭비되는 것을 말 합니다.

  1. 내부 메모리 단편화
메모장을 실행시켜서 4의 메모리를 할당했지만 실질적으로 1의 메모리만 사용이 될떄 이떄 3의 메모리가 단편화 되었다고 한다.
  1. 외부 메모리 단편화
8의 메모리를 할당하고 연속으로 16의 메모리를 할당한뒤 8의 메모리 즉 프로세스를 종료시키게 되면 8이라는 메모리 빈 공간이 생성이 되게 되는데

이것을 이제 외부 메모리 단편화 라고 합니다.

🚀 가상 메모리

가지고 있는 메모리보다 더 큰 메모리를 사용할때 사용을 합니다.

예를 들어서 200의 메모리만을 가지고 있지만 400의 프로세스를 실행시키려 할때 사용이 되고 동작이 되는 원래는 내부 메모리 단편화와 비슷하게 동작이 됩니다.

400의 프로세스를 실행시킨다고 실제로 400의 메모리를 사용하는 것이 아니기 떄문에 사용되는 메모리에만 메모리를 사용하여서 프로세스를 동작 시킵니다.

  • 쉽게 말해 최적화!!

🚀 메모리 구조

    1. 코드 영역

실행할 코드가 저장이 되는 영역이며 이후 하나씩 꺼내오면서 동작을 하는 영역 입니다.

    1. 데이터 영역

전역, 정적 변수가 저장이 되는 영역이며 프로그램이 종료될떄 비워지게 됩니다.

    1. 스택 영역

지역, 함수가 저장이 되는 영역으로 함수 호출과 함께 할당이 되어 사용이 됩니다.

    1. 힙 영역

사용자가 동적으로 관리를 하는 영역이 되며 메모리가 동적으로 할당되기 떄문에 가비지 컬렉터가 동작이 되는 영역입니다.

굉장히 간단하게 알아보았고 사실 굉장히 많은 내용이 있지만 너무 심화스러워서 이정도만 알아 보았습니다.

🔨 컨센 서스

🚀 Safety & Liveness

Safety은 그냥 이론적으로 말하면 같은 합의 결과를 도출해야 한다 라고 할 수가 있습니다.

대표적으로 여러번 브로드캐스팅 하여 확인하는 PBFT계열에서 사용이 되고 합의에 참여하는 노드는 반드시 같은 합의 결과를 도출해야만 블록이 생성이 됩니다.

그러기 때문에 즉각적인 완결성이 보장이 됩니다.

이에 반해 Liveness는 무조건 합의가 이루어 지는 것을 말합니다.

PBFT계열이 아닌 알고리즘에서 사용이 되며 특정 노드가 문제가 있어도, 합의 결과가 달라도 합의는 무조건적으로 일어나게 됩니다.

그러기 때문에 분기가 발생을 할 수가 있고 이러한 이유로 확률적 완결성이 보장이 됩니다.

🚀 CFT와 BFT의 차이

CFT는 일단 비정상적인 충돌로 인해 특정 노드가 일을 못해도 서비스가 종료되지 않는 것을 말하고 BFT는 CFT에 추가하여 공격자의 공격이 발생을 하여도 서비스가 종료되지 않는 것을 말합니다.

주로 BFT는 비트코인에서 적용이 되고 CFT같은 경우에는 DPOS, PBFT에서 적용이 되게 됩니다.

🚀 PBFT알고리즘

여러번의 검증, 브로드캐스팅을 통해서 블록이 생성이 되는 것을 말합니다.

주로 DPOS와 혼용되어 사용이 되거나 Klaytn, ComsMos에서도 사용이 되고 있습니다.

브로드 캐스팅을 통해서 여러번 검증을 하고 모두 같은 합의 결과를 도출해야만 블록이 생성이 되게 되기 떄문에 즉각적인 완결성이 부여가 되지만

합의에 참여하는 노드가 많을수록 더 많은 노드를 거쳐야 하기 떄문에 속도가 느려질수 있다는 단점이 있습니다.

🚀 DPOS알고리즘

민주주의 알고리즘이라고도 하며 합의에 참여하는 노드를 몇몇개 골라서 선출하여 합의에 참여시키는 것을 말합니다.

대표적으로 이더리움 킬러라고 불리는 이오스에서 사용이 되고 있고 각각 노드는 신뢰있는 기업, 거대 기업인 경우가 많아서 현실적으로 모든 합의 노드를 해킹하는 것을 어렵습니다.

하지만 특정 노드만이 합의에 참여를 하기 떄문에 탈중앙화를 보장하지 못했다는 평가도 있습니다.

🔨 이더리움

🚀 크립토 이코노미, 토큰 디자인

  1. 크립토 이코노미
암호화폐를 통해서 구성이 되어 있는 경제 시스템을 말합니다.

어렵게 말하면 이와 같고 쉽게 말하면 그냥 토큰, 코인을 사용하는 일종의 서비스를 말합니다.
  1. 토큰 디자인
디자인 패턴과 똑같은 의미를 가지고 있습니다.

디자인 패턴이라고 하면 특정 코드 작성 방식이나, 구조를 의미하며 토큰 디자인 패턴이라고 하면 토큰이 어떻게 사용되는지, 어떻게 지급이 되는지에 대한 패턴 입니다.

대표적으로 Payment패턴, Burn&Mint패턴 등이 있습니다.

🚀 DEX

블록체인 거래소를 의미합니다.

제 3자 없이 토큰 거래가 가능한 시스템을 의미하며 이전과 다르게 오더북이 없는 형태로 구현이 됩니다.

오더북이 없는 이유는 오더북에 등록, 취소하는 일련의 과정이 모두 가스비 지출이 일어나게 되고 이러한 부분은 굉장히 비 효율적이기 떄문에 오더북을 지원하지 않습니다.

🚀 블룸필터 사용하는 이유

SPV노드 즉 라이트 노드가 풀노드에게 필요한 데이터를 요청할 때 사용이 됩니다.

익명성을 위해서 블룸필터를 사용하기도 하고, 원하는 데이터만을 가져오기 위해서, 필터링 하기 위해서 사용을 하기도 합니다.

주로 이벤트 데이터를 가져올떄 블룸필터가 사용이 되는 것으로 알고 있습니다.

🚀 머클패트리샤 트리

블록에 포한된 트랜잭션을 트리 형태로 요약한 것을 말합니다.

블록에 포한된 거래내역을 머클트리와 같이 쪼개어 보관을 하게 되고 이후 검증에 필요한 데이터만을 가져와서 검증을 하는데에 사용을 하게 됩니다.

  • 이 부분에서 Prunning을 사용하게 됩니다.

🚀 이더리움 RLP, Protocolbuffer와의 차이

둘다 직렬화 기법이고 사실 이런 차이점까지 알아야 하나라는 생각을 하지만 다루어 보았습니다.

직렬화라고 하면 특정 데이터를 JSON으로 변환시키는 것으로 이해를 하면 됩니다.

이떄 RLP같은 경우에는 변환 타입 내부에 따로 타입정보가 존재하지 않아서 단순히 바이트 어레이로 저장을 하게 되지만

ProtocolBuffer같은 경우에는 내부 타입이 존재를 하기 떄문에 바이트 어레이에 공간을 이용해서 타입 정보를 넣는 방식으로 동작합니다.

직렬화 하는 이유는 데이터를 저장하거나 전송할떄 용이함을 위해서 사용이 됩니다.

🚀 이더리움 플라즈마

라이트닝 네트워크와 같이 오프체인에서 트랜잭션을 검증 및 처리를 한뒤에 오프체인에 올리는 형태를 말합니다.

무수한 차일드 체인을 트리형태로 만들어서 오프체인에서 처리후 온체인에 올리는 방식으로 동작하는 레이어 2솔루션 이며

오프체인에서 검증을 하기 떄문에 차일드 체인에 문제가 발생을 하여도 온체인에는 영향을 가지 않습니다.

🚀 이더리움 노드 디스커버리

노드 디스커버리는 네트워크에서 노드를 찾는 방식을 말합니다.

이 부분에 대해서는 상세하게 알지는 못하지만 카뎀리아라고 하는 분산 해시테이블을 변형시켜서 사용하는 것 정도로만 알고 있습니다.

🚀 Receipt의 정보와 용도

Receipt는 말 그대로 영수증의 의미를 가지고 있습니다.

트랜잭션에 대한 정보가 요약되어 있는 데이터를 의미를 하며 이 부분에 이벤트에 대한 로그도 담겨 있게 됩니다.

이곳을 통해서 블록에 기록된 트랜잭션 데이터 확인이 가능한 것으로 알고 있습니다.

🚀 prunning

기본적으로 검색할 가지수를 줄이는 것을 말합니다.

이더리움에서는 트랜잭션을 요약하여 머클 패트리샤 트리에 보관을 하게 되는데 이후 데이터를 가져올때에는 원하는 데이터만을 가져와야 합니다.

그러기 떄문에 Prunning을 사용하여 원하는 데이터만을 가져 옴으로써 동작을 하게 됩니다.

🔨 알고리즘

🚀 Sort

  1. 버블 정렬
  • 시간복잡도는 n^2를 가지며 자주 사용이 되지는 않지만 가장 일반적인 정렬 입니다.
  • 특정 값의 왼쪽과 오른쪽을 계속 비교해가며 정렬이 이루어 지며 JS의 sort가 버블정렬로 작동이 됩니다.
  1. 선택정렬
  • 시간복잡도는 n^2이며 배열을 계속해서 돌면서 작은값을 앞으로 뺴오는 방식으로 작동을 합니다.
  1. 삽입정렬
  • 시간복잡도는 평균적으로 n^2이지만 이미 정렬되어 있는 배열에 값을 추가하는 경우에는 n의 값을 가지게 됩니다.
  • 특정 값을 왼쪽에 정렬되어 있는 값과 비교를 하여 위치를 찾아서 변경시켜주는 방식으로 동작 합니다.
  1. 병합정렬
  • 시간복잡도는 nlogn이며 재귀를 통해 배열을 쪼개고 다시 병합을 시키면서 정렬을 하는 방식으로 동작을 합니다.
  1. 퀵정렬
  • 시간복잡도는 nlogn이며 특정 값보다 큰값, 작은값을 따로따로 배열에 담은뒤에 해당 배열을 다시 재귀를 돌림으로써 동작을 하는 정렬 입니다.

🚀 DP

어려운 문제를 해결하는데에 앞서 문제를 쪼개어서 쉽게 쉽게 해결을 하는 것을 말 합니다.

특정 부분에서 문제가 해결이되면 이 방식을 계속해서 계산하여 최종적으로 문제를 해결하는 방법 입니다.

🚀 Greedy

최선의 선택지만을 선택하여 문제를 해결하는 것을 말합니다.

쉽게 말하면 급한불부터 꺼가면서 큰불을 끄는 방식으로 해결을 합니다.

🚀 DFS, BFS

DFS는 끝까지 한곳을 먼저 탐색을 하면서 해결법을 찾는 알고리즘이며 BFS는 근처에 있는 값부터 전체적으로 확인하면서 해결법을 찾는 알고리즘 입니다.

주로 DFS는 최단경로를 탐색할떄에 사용이 되고, BFS는 미로게임등에서 경로가 존재하는지 확인할떄 사용이 됩니다.

또한 DFS는 주로 재귀를 통해서 구현이 되며, BFS는 while, 스택을 통해서 구현이 됩니다.

🔨 자료구조

🚀 배열

일반적으로 알고 있는 배열 입니다

연관된 데이터를 보관할때에 사용이 되고 주로 index를 통해서 관리가 됩니다.

index가 존재하기 떄문에 특정 값에 접근하는것은 굉장히 용이하지만 반대로 특정값을 추가하고, 삭제하는 작업에서는 불리한 자료구조 입니다.

🚀 리스트

블록체인과 굉장히 동일한 구조를 가지고 있는 자료 구조입니다.

index가 따로 존재하지 않고 이전의 값이 다음값을 가르키고 있는 형태로 구현이 되어 있습니다.

  • 이 부분은 단방향일떄 적용이 되고 링, 양방향 등 다양하게 존재 합니다.

주로 배열을 추가하고, 삭제하는데에는 용이하지만 index가 존재하지 않기 떄문에 특정 값에 접근을 하는 것은 굉장히 불리합니다.

배열과 유사하기 떄문에 이 두 자료구조를 섞어서 사용을 하는데 사실 대용량 처리를 하는것이 아닌 이상은 큰 차이가 발생하지 않는다고 합니다.

🚀 스택

항아리에 물을 붓는 형태와 같은 자료 구조 입니다.

먼저 들어간 데이터는 가장 마지막에 나올수 있는 구조로 작동이 되며 EVM에서도 이러한 스택 구조를 사용하여 데이터를 처리하는 것으로 알고 있습니다.

🚀 큐

밑바진 독에 물을 붓는 것과 같습니다.

먼저 들어간 데이터가 먼저 나오는 구조로 작동이 되며 스택과 반대되는 개념을 가지고 있습니다.

🚀 디큐

스택과 큐가 모두 적용이 되는 자료 구조 입니다.

맨앞 데이터, 맨 뒤 데이터 둘다 가져올수 있는 데이터로 구현이 되어 있습니다.

🚀 트리

나무를 생각하면 될것 같습니다.

특정 값 아래로 줄줄히 나머지 값들이 이어져 구성되어 있고 주로 컴퓨터 디렉토리가 이러한 구조로 구성이 되어 있습니다.

효율적인 탐색에서도 사용이 됩니다.

  • DFS, BFS등등

이외에도, 노드, 루트, 부모&자식 노드, 리프 등 다양한 용어를 사용해다 특정 노드와 상태를 가르키기도 합니다.

🔨 DB

🚀 인덱스의 장/단점

테이블의 검색속도를 향상시키기 위한 자료구조 입니다.

주로 RDBMS에서 사용이 되고 있고 index를 통해서 특정 값에 접근을 합니다.

하지만 반대로 데이터를 추가하고, 삭제하는데에는 어려움이 있습니다.

책을 하나의 DB라고 하면

책 페이지가 index를 의미하고 페이지에 해당하는 내용이 데이터를 의미합니다.

저희가 200페이지 내용이 뭐야 라는 질문에 쉽게 답을 할 수는 있지만

반대로 200페이지에 한페이지 더 추가해줘 라는 요청은 굉장히 어렵습니다.
- 왜냐하면 201페이지가 이미 존재하는데 한페이지를 추가하려면 200 페이지 이후의 페이지의 index값을 모두 1씩 상승시켜야 하기 때문에

🚀 정규화

쉽게 말을 하면 DB구성을 깔끔하게 하기 위한 작업입니다.

총 3가지 정도로 나뉘어 집니다.

  1. 테이블의 한 컬럼에는 하나의 값만 매칭이 되어야 한다.

  2. 데이터는 기본키에 종속되어야 하지 기본키의 부분집합에 종속이 되면 안된다.

  • primary key에 종속이 되어야 한다는 의미 입니다.
  1. 이행적 함수 종속을 허용하지 않는다.
  • A = B, B = C일떄 A=C가 되는 것을 이행적 함수 종속 이라고 합니다.

🚀 트랜잭션 ACID

트랜잭션은 일종의 네트워크에서 발생하는 모든 활동의 기본 단위 입니다.

그리고 ACID는 이러한 트랜잭션의 기본 소양??, 조건?? 입니다.

1. A : 원자성

  • 트랜잭션은 한개라도 실패를 하면 모두 실패한 것으로 본다.

2. C : 일관성

  • int타입으로 전송했다면 int타입으로 데이터가 들어와야 한다.

3. I : 고립성

  • 트랜잭션 간에는 서로 영향을 주지 않는다.

4. D : 내구성

  • 트랜잭션이 한번 커밋되면 DB의 상태는 커밋된 상태를 유지한다.

🚀 RDBMS vs NoSQL

바른생활 아이와 야생에서 자란 아이 정도로 재미있게 비유가 가능합니다.

바른생활 아이는 어떠한 행동을 하는데에 있어서 굉장히 계획적이고 딱딱 떨어지게 행동을 할 것입니다.

이런것이 바로 RDBMS입니다.

구조화되어있는 데이터이고 특정 틀이 있는 DB를 의미합니다.

구조화 되어있어서 데이터를 정렬, 탐색 하는데에는 용이하지만 데이터를 수정, 처리하는데에 있어서 느리고 scale-out(수평적 확장)에는 어려움이 있다는 단점이 있습니다.

이에 반해 NoSQL 야생에서 자란 아이 입니다.

자유롭지만 문제점도 많습니다.

대표적으로는 MongooseDB가 있고 Key-Value형태로 데이터를 저장하게 됩니다.

빠르고 개발환경을 구성하는데에 어려움이 없지만 규격화가 되어 있지 않고 중복된 데이터가 발생할수 있다는 단점이 있습니다.

🚀 대표적인 NoSQL

mongooseDB가 있습니다.

mongooseDB는 JSON,BSON의 형태로 데이터를 다루고 있고 BSON형태는 사람이 읽을수 없는 대신 데이터 저장 및 변경이 JSON에 비해서 빠릅니다.

그러기 떄문에 BSON형태로 주로 저장을 하고 데이터를 꺼내어 줄떄에는 JSON형태로 꺼내어 주게 됩니다.

mongooseDB에는 클러스트, 아틀라스 등등 다양한 용어도 있는데 이러한 부분은 추가적으로 알아보면 좋을꺼 같습니다.

  • 이런 부분까지 알아야 하나?? 라는 생각이 들기도 하여서;;

🔥 후기

오전 시간 내내 작성을 했던것 같습니다.

어느정도 이런 이론적인 부분에 대해서 공부를 해보았고 면접 준비를 하다보니 이렇게 공부를 했던것 같습니다.

하지만 역시 코딩적으로 이러한 부분을 어떻게 고려하고 작성을 하는지가 중요하다보니 내일이 휴일인 만큼 간단한 toy프로젝트를 해볼까 합니다.

감사합니다!

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글