들어가며 이번에 SSAFY에서 프로젝트를 진행하면서 처음으로 웹 기반의 게임을 만들게 되었습니다. 게임을 만들다 보니 클라이언트에서 실시간으로 서버의 데이터 변경을 감지하는 로직을 구현해야 했는데 이 부분을 해결하기 위해 Websocket을 사용했습니다. 당연히 Websocket도 처음 써보았습니다. 뭔가 쉬우면서도 어려운 것 같은 느낌..? 개발하느라 이론을 충분히 공부하지 못한 채로 기술을 사용했던게 아쉬워서 기술에 대한 이해와 의문을 해결하고 실시간 데이터 통신과 그 방법인 Websocket에 대한 이런저런 내용들을 정리하기 위해 글을 씁니다. 가볍게 읽어주시면 좋을듯 합니다. 실시간 데이터 변경 감지 실시간으로 데이터를 통신한다는 것은 어쩌면 개발자에게 당연하게 느껴지는 기술입니다. 실제로 대부분..
힙(Heap) 힙(Heap)은 우선 순위 큐를 구현하기 위해 사용되는 자료구조이다. 기반은 트리 형태이며 삽입, 삭제 모두 O(logN)의 시간복잡도를 가진다. 우선순위 큐(Priority Queue) 우선순위 큐는 큐의 구조에서 요소별 가중치를 두어 우선순위를 정하여 pop()을 실행하는 자료구조이다. 예전에 queue를 정리해놓은 포스팅에서 언급한 적이 있듯이 어떤 작업을 수행할 때 단순 FIFO 방식을 따르는 것은 때론 비효율적으로 동작할 수 있다. 예를 들어, 운영체제의 프로세스 작업 스케쥴링에서 여러 방법들 중 우선순위 큐를 사용하여 스케쥴링 하는 방법이 있다. 힙의 특징 위에서 언급했듯 힙은 트리의 형태를 취하고 있으며 많은 트리의 종류들 중에서도 완전 이진 트리의 구조를 가진다..힙은 결국 ..
B Tree & B+ Tree 이진 트리는 하나의 부모가 두 개의 자식밖에 가지질 못하고, 균형이 맞지 않으면 검색 효율이 선형검색 급으로 떨어진다. 하지만 이진 트리 구조의 간결함과 균형만 맞다면 검색, 삽입, 삭제 모두 O(logN)의 성능을 보이는 장점이 있기 때문에 계속 개선시키기 위한 노력이 이루어지고 있다. B Tree 데이터베이스, 파일 시스템에서 널리 사용되는 트리 자료구조의 일종이다. 이진 트리를 확장해서, 더 많은 수의 자식을 가질 수 있게 일반화 시킨 것이 B-Tree 자식 수에 대한 일반화를 진행하면서, 하나의 레벨에 더 저장되는 것 뿐만 아니라 트리의 균형을 자동으로 맞춰주는 로직까지 갖추었다. 단순하고 효율적이며, 레벨로만 따지면 완전히 균형을 맞춘 트리다. 대량의 데이터를 처리..
이진 탐색 트리 BST(Binary Search Tree) 이진 탐색 트리란? -> 이진 탐색 + 연결 리스트 이진 탐색 탐색에 소요되는 시간 복잡도는 O(logN) 하지만 삽입, 삭제가 불가능. 연결 리스트 삽입, 삭제의 시간 복잡도는 O(1) 하지만 탐색하는 시간 복잡도는 O(N) 이 두 가지를 합하여 장점을 모두 얻기 위해 고안된 것이 이진 탐색 트리 즉, 효율적인 탐색 능력을 가지고 자료의 삽입, 삭제도 가능하게 만드는 것이다. 특징 이진 트리의 일종으로 이진 탐색 트리에는 데이터를 저장하는 규칙이 있다. 이진 탐색 트리의 노드에 저장된 키는 유일하다. 루트 노드의 키가 왼쪽 서브 트리를 구성하는 어떠한 노드의 키보다 크다. 루트 노드의 키가 오른쪽 서브 트리를 구성하는 어떠한 노드의 키보다 작다..
Tree 트리의 개념. 트리의 구성 요소. 트리의 종류. 트리(Tree)란? 트리라는 이름이 나온 이유는 실제 나무를 거꾸로 세워놓은 듯한 모양이라서 트리라고 부른다. 선형 자료구조에서 배열이나 리스트 등도 존재하지만, 트리가 나온 이유는 뭘까? 일반 배열에서 삽입이나 삭제를 하는데 O(N)의 시간이 걸린다. 배열의 첫번째 원소에 삽입하는 경우 나머지 모든 요소들을 한 칸씩 뒤로 미뤄야 하므로 최악의 시간 복잡도 O(N)이 나온다. 하지만, 트리는 편향 트리가 아닌 이상 일반적인 트리에서는 O(log N) 정도의 시간으로 줄여진다. 또한 트리는 계층 구조를 이루는 경우에 굉장히 좋다. 회사의 조직도를 생각해보면, 맨 위에 회장님, 사장님이 있고, 부서별, 팀별로 각각 트리가 생길 것이다. 이런 경우, 원..
1. HTTP의 특징과 쿠키와 세션을 사용하는 이유 서버가 클라이언트와 통신을 할 때, 서버는 클라이언트가 누구인지 계속 인증해야 합니다. 그 이유는 HTTP 프로토콜이 connectionless, stateless한 특성이 있기 때문입니다. Connectionless - 연결을 유지하지 않음 Stateless - 상태를 유지하지 않음 이러한 특징들 때문에 쿠키나 세션을 사용하여 클라이언트의 접근성을 높일 필요가 있습니다. 쿠키와 세션을 사용했을 경우에는 최초 로그인을 하면 어떠한 방식에 의해서 서버가 그 사용자에 대한 인증을 유지하게 됩니다. 즉, 쿠키와 세션을 통해 서버는 클라이언트를 기억하고 있는것이죠. 이제 방금 말한 그 방식이 무엇인지 알아보도록 하겠습니다. 2. 쿠키 ( Cookie ) 쿠키란..
연결리스트(Linked List) 연결리스트란 ? 연결리스트(Linked List)는 링크드리스트라고도 부릅니다. (사실 저는 링크드리스트라고 더 자주 말합니다.) 어쨌던, 링크드리스트는 데이터와 포인터를 갖고 있는 노드들이 포인터로 연결되어있는 자료구조입니다. 그림으로 보면 쉽게 이해할 수 있으니 이미지를 첨부하겠습니다. head라는 글자가 가르키고 있는 노드가 있고, 이 노드에서 화살표가 나와 다음 노드를 가르킵니다. tail의 노드는 null을 가르키고 있습니다. 구조가 이해되시나요? 링크드리스트는 노드로 이루어져 있으며 이 노드들은 Data부와 Pointer부로 구별되어 있습니다. Data부에는 노드의 데이터가, Pointer부에는 다음 노드를 가르키는 포인터만이 적재될 수 있습니다. 또한 hea..
해시(Hash) 해시란 ? 해시를 정리해둔 글을 살펴보면 "해시는 임의의 길이를 갖는 임의의 데이터를 고정된 길이의 데이터로 매핑하는 함수를 말합니다. 쉽게 말해, 아무리 큰 숫자를 넣더라도 정해진 크기의 숫자가 나오는 함수입니다. " 라고 말합니다. 해시를 많이 사용해본 저도 한 번에 이해하기 어려운 문장입니다. 제가 이해하고 있는 개념으로 해시의 사용을 설명해보자면 다음과 같습니다. (개인적인 견해이므로 맹신하지는 말아주세요) 1. 어떠한 값(데이터)을 해시화하여 만들어진 결괏값 그 자체. 대표적으로 정보의 암호화를 예시로 들겠습니다.회원가입시에 사용자의 민감정보인 비밀번호화 같은 데이터들은 날 것 그대로 데이터베이스에 저장할 수 없습니다. 당연히 보안에 취약하기 때문이죠. 이를 해결하기 위해 해시 ..
스택(Stack) 스택이란 ? 스택(Stack)은 순서대로 쌓여진 데이터를 의미힙나다. 스택은 한 쪽으로만 데이터의 입·출력이 동작하는 자료구조입니다. 기본적으로 FILO(First In Last Out)의 동작방식을 가지며 이는 말 그대로 먼저 들어간 요소가 가장 마지막에 꺼내진다는 것입니다. 메모리에서 함수 호출 시 변수, 리턴값 등의 데이터를 저장하는 공간입니다. 데이터를 넣는 것은 push(), 빼는 것은 pop()이라고 합니다. 스택의 구조 스택에 먼저 저장하는 데이터는 스택의 가장 아래쪽(높은 주솟값)부터 쌓이고 나중에 저장되는 데이터는 그 위로 쌓입니다. 스택의 동작방식을 그림으로 나타내보겠습니다. 기본적으로 스택의 구조는 이런식으로 생겼습니다. 다음은 스택에 A, B, C를 넣고 다시 빼는..