데이터베이스 격리 수준이란?동시에 여러 트랜잭션이 데이터를 변경하거나 조회할 때 한 트랜젝션의 작업 내용이 다른 트랜젝션에 어떻게 보일지를 결정하는 기준. MySQL MVCC와 Undo logMySQL MVCCMySQL에서는 락을 사용하지 않고 일관된 읽기를 지원하기 위해 Multi-Version Concurrency Control(MVCC)을 사용한다. MVCC란 원본 데이터와 변경 데이터를 동시에 유지하는 방식으로 MySQL에서는 Undo log를 통해 이를 구현한다.Undo LogUndo log는 트랜잭션 실행 이후 Rollback할 경우 기존 값을 복구하기 위해 만들어놓은 로그 영역이다.위와 같이 Update 문을 실행하면 Commit 여부와는 관계 없이 Undo log에 먼저 기록이 남게 된다...
레디스란?레디스는 Remote Dictionary Server의 약자로 모든 데이터를 디스크가 아닌 메모리에 저장하는 in-memory 데이터베이스이자, key-value 구조의 저장소이다.(이미지 출처: ByteByteGo) 위의 이미지처럼 메모리 상에서 운영되는 NoSQL 데이터베이스이기 때문에 빠른 입출력이 가능하지만 장애가 발생하면 모든 데이터를 잃을 위험이 있다. 레디스의 저장소 구현 코드레디스의 핵심 구조는 다음과 같이 계층적으로 구성되어 있으며, 오픈소스이기 때문에 코드를 보면서 실제 구현을 확인할 수 있다.dictdict는 dictType과 dictEntity를 포함하고 있는 해시 테이블이다.// redis/deps/hiredis/dict.h typedef struct dict { dict..
개요 MongoDB의 마이그레이션을 진행하면서 이미 배열인 aggregate 값을 toArray() 함수로 다시 배열 값으로 바꾸는 스니펫이 있어 그 이유를 찾아보았다. var ids = db.someSchema.aggregate([ { $group: { _id: "$enterpriseId" } } ]).toArray().map(function(doc) { return doc._id; }); Cursor 커서는 MongoDB에서 find 메서드를 실행하면 반환되는 문서의 집합으로, 기본적으로 자동으로 loop 되지만 명시적으로 특정 인덱스 문서를 가져올 수도 있다. Cursor는 특정 인덱스 값을 값는 포인터와 유사하다. 출처: https://www.softwaretestinghelp.com/mongod..
Isolation과 연관된 이상 현상의 종류 데이터베이스는 고립성과 관련되어 다양한 오류가 발생한다. (예시 SALES 테이블) NAME QNT PRICE PR1 10 1000 PR2 20 9000 Dirty reads 하나의 트랜잭션이 다른 트랜잭션에 의해 커밋 되지 않은 데이터를 읽는 것. TR1 - SELECT QNT*PRICE FROM SALES // 10000, 18000 TR2 - UPDATE SALES SET QNT = QNT + 5 WHERE NAME = PR1 TR1 - SELECT QNT*PRICE FROM SALES // 15000, 18000 TR2 Rollback Commit조차 되지 않은 데이터를 읽어 오기 때문에 Inconsistance한 정보를 얻는 문제가 발생한다. Non-..
ACID 원칙이란? Atomicity, Consistency, Isolation, Durability의 약자로 데이터베이스 관리 시스템(DBMS)에서 트랜잭션을 안전하게 수행하기 위한 속성이다. Transaction 트랜젝션은 하나의 단위로 수행되는 쿼리의 집합이다. 작업이 하나라도 실패하면 트랜젝션도 실패가 되며, 모든 작업이 성공해야 트랜젝션이 성공한다. 데이터베이스 트랜젝션은 ACID라는 특성을 가지고 있다. Atomicity (원자성) 트랜잭션 내의 모든 연산은 전부 성공하거나 전부 실패해야 하며 부분적으로 실행 되어서는 안된다. 트랜잭션이 중간에 실패하면 변경 사항은 모두 롤백 되어야 한다. 사용자 A가 사용자 B에게 1000원을 입금할 때 1. A 계좌에서 1000원을 삭제 2. B의 계좌에 ..
의존성 역전의 원칙이란? 의존성 역전의 원칙(Dependency Inversion Principle, DIP)은 객체 지향 설계 원칙 중 하나로, 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라 둘 다 추상화에 의존하도록 해야 한다는 원칙이다. 1. 고수준 모듈과 저수준 모듈이란? 고수준 모듈이란: 모듈의 본질적 기능과 책임을 말하며, 구체적 동작은 포함되지 않는다. (무엇을?) 저수준 모듈이란: 모듈 시스템의 구체적인 세부 사항과 기능을 나타낸다. (어떻게?) 그림에서는 HL1은 ML1보다 고수준의 모듈이다. 이때 일반적인 제어의 흐름으로는 고수준의 모듈이 저수준의 모듈에 의존하게 된다. 2. 의존이란? 의존이란 어떠한 모듈, 클래스 또는 컴포넌트가 다른 모듈, 클래스 또는 컴포넌트의 기능이나 행위에..
https://github.com/ChangSuLee00/CS-study/blob/main/data_structure/graph.md GitHub - ChangSuLee00/CS-study Contribute to ChangSuLee00/CS-study development by creating an account on GitHub. github.com Graph 현실 세계의 사물이나 개념 간의 연결 관계를 수학적 모델로 단순화하여 표현한 것. 그래프는 정점(vertex)의 집합 V(G)와 간선(edge)의 집합 E(G)로 정의된다. G(V,E) Graph의 용어 정점(vertex, node): 데이터를 표현한 것. 간선(edge, link): 정점들을 연결하는데 사용되는 선. underected edg..
CORS란? Cross-Origin Resouce Sharing의 약어로, 브라우저의 SOP를 우회하기 위한 방법이다. CORS는 추가 HTTP 헤더(Origin)를 사용해서 한 '출처'에서 실행중인 웹 어플리케이션이 다른 출처의 자원에 접근할 수 있는 권한을 부여하도록 '브라우저'에 알려주는 체제이다. Origin(출처) Origin이란 Protocol, Host, Port를 합친 것이다. https://www.naver.com/user?id=1@sort=asc Protocol = 서로 다른 컴퓨터간에 통신을 하기 위한 규약으로 HTTP,FTP,Telnet 등이 있다. (http://) Host = 네트워크에 연결된 장치 또는 서버들에 부여되는 고유한 이름 (www.naver.com) Port = 네트..
쿠키, 세션, 토큰의 등장 이유 HTTP 통신은 서버가 클라이언트 요청에 응답을 완료하면 연결을 끊어버린다(Connectionless). 또한 연결을 끊은 뒤에는 클라이언트의 상태를 저장하지 않는다(Stateless). 이러한 HTTP의 특징 때문에 로그인 등을 했을때 상태를 기억하기 위해 사용한다. Conection Oriented vs Connectionless Connection Oriented: 상대와 고정된 connection을 확립한 뒤 통신하는 프로토콜 ex) 전화, TCP 전송되는 데이터 패킷은 순서대로 전달된다. 데이터가 모두 전송되고 나면 접속은 끊어진다. connection을 확립하지 않고 통신하는 프로토콜 ex) 편지, UDP 데이터 그램은 순서에 상관 없이 일단 전송한다. Stat..
DP란? 동적 계획법(dynamic programming)이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법이다. 이것은 부분 문제 반복과 최적 부분 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용한다. 부분 문제 반복 부분 문제 반복이란 어떤 문제가 여러개의 부분 문제로 쪼개질 수 있는 경우를 말한다. 계속해서 같은 부분 문제가 여러번 재사용 되거나 재귀 알고리즘을 통해 해결되는 문제이다. ex) 피보나치 수열에서 fib(n)문제는 fib(n-1)구하기와 fib(n-2)구하기의 부분문제로 쪼개질 수 있다. 최적 부분 구조 작은 부분 문제에서 구한 최적의 답으로 합쳐진 큰 문제의 최적의 답을 구할 수 있어야 한다. ex) 피보나치 수열에서 fib(n)문제의..