· 자료구조
Multiway Search Tree (다원 탐색 트리) / m-way Search Tree (m 분기 탐색 트리) 한 노드가 가질 수 있는 key의 값이 최대 m-1개이고 가질 수 있는 Child의 수가 m개인 트리를 Mulituway Search Tree라 합니다. 이진 트리 : 2-way search tree AVL 트리 : 2-way search tree 2-3 트리 : 3-way search tree 정의는 다음과 같습니다. m-way Search Tree는 다음을 만족하는 검색 트리입니다. 1. Leaf Node를 제외한 모든 노드는 m개 이하의 서브 트리를 가집니다. 2. k개의 자식 노드를 갖는 노드는, k-1개의 요소(key)를 가집니다. 3. 각 노드의 key는 오름차순으로 정렬되어 있..
· 자료구조
2-3 Tree 2-3트리는 검색 트리이지만 BST는 아닙니다. 차수가 3인 노드가 존재할 수 있으므로, Binary가 아니기 때문입니다. 2-3 Tree는 트리의 높이가 균형을 이루며 내부노드의 차수가 2 또는 3인 균형 탐색트리입니다. 2-3 Tree 조건 2-3 Tree에는 Internal Node와 External Node의 개념이 존재합니다. Internal Node(내부노드)는 Key가 들어있는 내부 노드이며, External Node(외부노드)는 데이터가 들어있지 않은 노드로써 Internal Node의 Leaf Node의 자식으로 존재하는 가상의 노드입니다. 2-3 Tree에서 각각의 내부 노드는 2-Node 이거나 3-Node 입니다. 중복된 Key는 허용하지 않습니다. 2-Node는 1..
· 자료구조
BST의 문제점 일반적인 BST(이진 검색 트리)는 데이터가 삽입되는 순서에 따라 한쪽으로 편향되는 형태로 트리가 형성될 수 있습니다. 예를 들어 입력열이 50 -> 30 -> 100 -> 20 -> 150 인 경우 다음과 같습니다. 그러나 입력열이 20 -> 30 -> 50 -> 100 -> 150 인 경우 다음과 같습니다. 이렇게 BST는 트리의 높이를 $log(n)$ 으로 보장받지 못할 가능성이 있습니다. 트리에서의 성능은 트리의 높이와 연관되어 있습니다. 즉 트리의 높이가 $log(n)$을 보장받지 못한다면, BST의 삽입과 삭제, 검색의 연산 역시 시간복잡도 $O(log(n))$을 보장받지 못합니다. AVL 트리 AVL 트리는 이진 검색 트리(BST)의 한가지 종류로써 스스로 높이의 균형을 잡는..
· 자료구조
들어가기에 앞서 해시가 어디에 쓰이는지 알아보도록 하겠습니다. 유튜브를 예시로 생각해 보도록 하겠습니다. 제가 어떤 사람의 동영상을 그대로 제 채널에 올리려고 한다면, 그 순간 바로 유튜브에서 중복되는 동영상이라는 에러 메세지를 보내줍니다. 동영상은 크기도 매우 크고, 그 수도 매우 많습니다. 그렇게 많은 동영상 중에서 어떻게 중복되는 동영상인지를 빠르게 판단할 수 있을까요? 앞으로 살펴볼 자료구조인 해시테이블이 바로 이것을 가능하게 만들어줍니다. Hash Function (해시 함수) 해시 함수 (Hash Function) 또는 해시 알고리즘은 임의의 데이터를 배열의 인덱스로 매핑(변환)하는 함수입니다. 해시 테이블은 배열입니다. 따라서 인덱스를 통해 접근할 때에는 O(1)의 시간복잡도로 매우 빠르게 ..
(전 순정 백엔드 개발자기 때문에 React는 못합니다. React 코드는 Chat GPT 시켜서 구현하였고, 대신 백엔드에 온 진심을 담하서 구현하였으니, 프론트 코드는 정말 그냥 테스트용으로만 참고해 주시면 감사하겠습니다.) OAuth의 개념에 대해서는 이미 많은 블로그들에서 다루고 있으므로 저는 이에 대해서는 따로 다루지 않겠습니다. 이 글에서는 (적어도 제가 살펴보았던) 대부분의 블로그에서 애매하게 설명되어있는 프론트엔드와 백엔드의 역할과, 실제로 어떻게 구현하는지를 집중적으로 다뤄보도록 하겠습니다. 또한 이 과정에서 단순히 구현하고 끝내는 것이 아니라 새로운 타사 플랫폼을 추가하는 과정도 간단하게 처리할 수 있도록 유연하고 확장 가능한 구조를 가져가는 코드를 작성해보도록 하겠습니다. 소스 코드는..
· JPA
🧐 N + 1 문제N + 1 문제는 연관관계가 설정된 엔티티 사이에서 한 엔티티를 조회하였을 때,조회된 엔티티의 개수(N 개)만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는 문제를 의미합니다. 즉 N + 1에서, 1은 한 엔티티를 조회하기 위한 쿼리의 개수이며, N은 조회된 엔티티의 개수만큼 연관된 데이터를 조회하기 위한 추가적인 쿼리의 개수를 의미합니다. N + 1보다는, 1 + N이라 부르는 것이 더 이해하기 쉬우며, 정리하면 다음과 같습니다.엔티티 조회 쿼리(1 번) + 조회된 엔티티의 개수(N 개)만큼 연관된 엔티티를 조회하기 위한 추가 쿼리 (N 번) 🧐 발생하는 상황N + 1 문제가 발생하는 상황을 알아보기 위해 게시글과 댓글을 예시로 사용해 보도록 하겠습니다. 하..
🤔 서론 이번 글에서는 Redis를 사용하여 분산락을 구현해 보도록 하겠습니다. Java의 Redis 클라이언트로는 Jedis, Lettuce, Redisson 등이 있으며, 각각의 특징이 서로 다릅니다. 이중에서 Jedis는 제외하고 Lettuce와 Redisson을 사용해서 분산락을 구현해 보도록 하겠습니다. (Jedis와 Lettuce의 비교는 다음 글을 참고해주세요) 🤔 Redis 환경 설정 아래 명령어를 통해 redis를 다운받아줍니다. (반드시 도커를 사용할 필요는 없습니다.) docker pull redis 이후 레디스를 실행시켜줍니다. docker run --name redis -d -p 6379:6379 redis 프로젝트에서는 Redis 관련 의존성을 추가해주도록 하겠습니다. imple..
🤔 서론이전 글에서는 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)을 통해 분산락을 구현하여 단일 서버는 물론 다중 서버에서도 동시성 문제를 해결하였습니다.이번 글에서는 비관적 락과 비슷한 MySQL의 USER-LEVEL Lock(Named Lock)을 통해서 동시성 문제를 해결해 보도록 하겠습니다.(앞으로는 user-level lock이라고 부르도록 하겠습니다.)       🤔 USER-LEVEL Lock (Named Lock)MySQL 공식 문서를 보면 다음과 같은 user level lock을 지원해주는 것을 알 수 있습니다.   🐳 GET_LOCK(str, timeout)주어진 이름(str)에 대한 Lock 획득을 시도합니다. 이때 문자열의 길이는 최대..
🤔 서론 이전 글에서 알아본 synchronized는 단일 서버 환경에서만 동시성 문제를 해결할 수 있었습니다. 이번 글에서는 다중 서버 환경에서 동시성 문제를 해결할 수 있는 방법에 대해 알아보도록 하겠습니다. 여러 대의 서버에서 동일 자원에 접근하는 경우, 동시에 한 개의 프로세스(혹은 쓰레드)만 접근 가능하도록 하기 위해 사용하는 Lock을 분산 락(Distributed Lock)이라 부릅니다. 이제부터 분산 락을 구현하는 여러 방법들에 대해 알아보도록 하겠습니다. 💡 분산 락에 대해서 분산 락에 대해서 이렇다 할 완전한 정의를 찾지는 못해서 다음 두 상황이 혼동될 수 있을 것 같습니다. 1. 웹 애플리케이션 서버가 여러대인 경우, 이들간의 동시성 문제를 해결하기 위해 사용되는 Lock 2. 스케일..
🤔 서론 다중 사용자를 위한 웹 애플리케이션을 만들다 보면 한 번쯤은 동시성 문제에 접하게 됩니다. 동시성 문제는 하나의 자원에 대해서 여러 쓰레드가 동시에 접근하여 수정하는 경우에 발생하는 문제입니다. 동시성 문제가 발생하는 간단한 예시로는 특정 게시물의 조회 수가 올바르게 증가되지 않는 문제가 있을 수 있습니다. 특정 게시물에 100명의 사용자가 동시에 접근하는 경우 조회수는 100이 되어야 옳겠지만, 대부분의 경우 조회수는 100보다 작은 값으로 설정될 것입니다. 조회수 같은 경우에는 대체로 데이터의 정합성이 중요하지 않기 때문에 이러한 부분이 문제가 되지 않을 수 있지만, 상품의 재고 수량과 같은 경우에 이러한 동시성 문제가 발생한다면 치명적일 수 있습니다. 이러한 동시성 문제를 막기 위해서는 다..
· JPA
(제 궁금증 풀 용도로 정리한거라 막 깔끔하게 정리하지는 않았습니다.) 🧐 ManyToOne, OneToOne 연관관계 일반적으로 merge 시 merge되는 특정 엔티티에 대해서만 조회합니다. 그러나 cascade 속성이 MERGE라면 merge 시 연관된 엔티티들도 left join으로 조회해옵니다. merge()가 되어 값이 변경되는 것도 일반적으로는 fk 값의 변경만이 반영되지만, cascade 속성이 merge라면 연관된 엔티티의 변경도 함께 반영됩니다. (DB 관점에서 생각하면 편합니다) @NoArgsConstructor @Accessors(fluent = true) @Getter @Entity public class Member { @Id @GeneratedValue(strategy = Ge..
· 모니터링
🧐 그라파나 (Grafana) 이전 글에서 간단히 언급했지만 다시 한 번 하도록 하겠습니다. 프로메테우스가 DB라고 한다면, 이 DB에 있는 데이터를 불러서 사용자가 보기 편하게 보여주는 대시보드가 필요합니다. 그라파나는 데이터를 그래프로 보여주는 툴입니다. 수 많은 그래프를 제공하고, 프로메테우스를 포함한 다양한 데이터소스를 지원합니다. 🧐 그라파나 설치 그라파나 설치 사이트(https://grafana.com/grafana/download)로 이동합니다. 여기서는 맥 OS 기준으로 설치를 진행하겠습니다. 위의 명령어를 복사합니다. 이후 그라파나를 설치할 (임의의)폴더로 이동한 뒤, 위의 명령어를 그대로 입력합니다. (설치하는데 시간이 좀 걸릴 수 있습니다) 그라파나를 설치할 폴더의 bin 폴더로 이동..
· 계산이론
지난번 글에 이어서 정규 언어에 대한 판별에 사용될 수 있는 펌핑 보조정리에 대해 알아보도록 하겠습니다. 펌핑 보조정리 (Pumping lemma) 펌핑 보조정리는 비둘기집 원리를 다른 형태로 이용한 것입니다. 이에 대한 증명은 다음 관찰에 기반을 두고 있습니다. n개의 정점을 갖는 전이 그래프에서, 길이가 n 이상인 모든 보행은 어떤 정점이 반복, 즉 사이클을 가져야 한다 펌핑 보조정리는 다음과 같습니다. L을 무한 정규 언어(infinite regular lanuage)라 하면, 다음 성질을 만족하는 양의 정수 m이 존재합니다. 다음을 만족하는 모든 문자열 w에 대하여 $$|w| \geq m, \;\;\;\;\;\; w \in L$$ 문자열 w는 아래의 조건을 만족하도록 분할될 수 있습니다. $$w ..
총 74장 분량이고, 전체 코드 한줄한줄 다 상세하게 적어뒀습니다. (화이팅하세요 :))
· 계산이론
유한상태 기계(finite state machine) (유한 오토마타) 유한 인식기는 유한 개수의 상태를 가지며, 그 임시 저장장치가 없기 때문에 유한하다고 하며, 문자열을 처리하면서 이를 승인(accept)하거나 거부(reject)하는 기능을 하기 때문에 인식기(accpter)라 합니다. 따라서 유한 인식기를 간단한 패턴 인식 매커니즘이라 볼 수 있습니다. 결정적 유한 인식기 (Deterministic finite accepter, DFA) 결정적이라는 단어의 의미는 해당 오토마타가 항상 하나의 선택만을 취할 수 있음을 의미합니다. DFA는 정규 언어(regular language)라 불리는 특별한 형태의 언어를 정의하기 위해 사용합니다. 결정적 유한 인식기(Deterministic finite acc..
🧐 피연산자 (Operands) 산술 명령어의 피연산자에는 제약이 있습니다. 레지스터(register)의 주소 혹은 상수만이 해당 위치에 올 수 있습니다. RISC-V 컴퓨터는 32개의 레지스터를 가지고 있으며, 각각의 레지스터는 64비트를 저장할 수 있습니다. (32비트 컴퓨터의 경우 레지스터는 32비트를 저장할 수 있습니다.) 각각의 레지스터는 x0 부터 x31 까지의 주소를 가집니다. 여기서 워드(Word)라는 단어가 등장하는데, 워드는 컴퓨터에서의 접근 단위이며, 레지스터의 크기에 해당합니다. 그러나 본래의 의미와는 다르게 일반적으로 Word라고 하면 32비트를 떠올리며, 64비트 컴퓨터에서는 Word가 64비트이지만 Word는 32비트라는 인식이 강하므로, 64비트를 나타내기 위해 Double ..
말 랑
Shin._.Mallang