- [ 학습기록/CS 공부 ][DB] 트랜잭션 (ACID/격리 수준)2024-02-05 03:09:44트랜잭션이란? 트랜잭션은 작업의 단위를 의미한다. 트랜잭션은 일관적이어야 하며 다른 트랜잭션에 고립적이어야 한다. 시스템 장애가 발생해도 올바르게 복구하여 데이터베이스의 일관성을 유지해야 한다. 데이터베이스에 동시에 접근하는 프로그램들을 격리시켜야 한다. 트랜잭션은 논리적인 작업의 단위로, 다수의 연산(쿼리)으로 구성될 수 있다. ACID 트랜잭션은 완전히 반영되거나 아예 반영되지 않아야 하고 (원자성) 기존 제약조건을 변경하지 않아야 하며 (일관성) 다른 트랜잭션에 영향을 미치지 않아야 한다. (고립성) 그리고 한 번 변경된 사항은 영구적으로 유지되어야 한다. (지속성) ACID 속성을 보장하기 위해서는 강력한 로깅 시스템이 트랜잭션을 적절하게 처리할 수 있어야 한다. atomicity 트랜잭션 내의 ..
- [ backend/데이터베이스 ][mysql] InnoDB 체인지 버퍼2024-02-04 21:28:54체인지 버퍼 체인지 버퍼는 버퍼 풀에 존재하지 않는, 보조 인덱스 페이지*의 변경 내용을 캐시하는 데이터 구조다. DML 작업으로 인한 변경사항을 일시적으로 저장하고, 이후 다른 읽기 작업으로 인해 해당 페이지를 버퍼 풀에 가져올 때 변경 내용을 병합한다. *보조 인덱스 페이지 : 인덱스 순서와 레코드의 순서가 일치하지 않으므로 레코드의 위치를 나타내는 포인터를 저장한다. 데이터가 변경되면 정렬된 상태를 유지하기 위해 인덱스 페이지가 수정된다. 변경사항을 데이터베이스에 반영하면 보조 인덱스가 수정된다. 하지만 인덱스들은 디스크에 위치하므로 레코드가 변경될 때마다 보조 인덱스를 수정하는 I/O 작업이 발생한다. 이를 방지하기 위해 체인지 버퍼에 보조 인덱스 페이지의 변경 내용을 캐싱하여 불필요한 I/O 작..
- [ backend/데이터베이스 ][mysql] InnoDB 버퍼 풀2024-02-04 14:55:09프로젝트 진행 중에 DB 과부하를 완화하기 위해 자주 액세스되는 데이터를 Redis에 캐싱한 적이 있다. 하지만 `htop`* 명령을 사용하여 DB가 설치된 서버를 모니터링한 결과, 캐싱을 적용하기 전과 후의 CPU 사용량 차이가 거의 나타나지 않았다. 어째서 아무런 효과가 없었던 걸까?*htop : 리눅스 환경에서 사용되는 프로세스 모니터링 도구 버퍼 풀버퍼 풀은 InnoDB에서 사용되는 캐싱 영역으로, 자주 사용되는 데이터를 메모리에 캐시하여 처리 속도를 향상시킨다. 이는 페이지로 나누어져 다수의 레코드를 저장할 수 있으며 연결 리스트 형태의 페이지들로 구현되어 있다. 버퍼 풀은 LRU 알고리즘을 사용하여 드물게 사용되는 데이터를 캐시에서 제거한다. 자주 사용되는 데이터를 메모리에 유지하여 mysql..
- [ 학습기록/CS 공부 ][DB] 인덱스 (clustered/secondary)2024-02-04 03:14:49clustered Index (primary)클러스터형 인덱스는 데이터베이스를 정렬하여 인덱스의 순서와 일치하도록 만든다. 물리적인 저장 순서를 변경하기 때문에 하나의 테이블에는 하나의 클러스터형 인덱스만 존재할 수 있다.⭐ 클러스터형 인덱스는 물리적인 레코드 순서를 정렬한다!InnoDB에서 클러스터형 인덱스는 기본키를 의미한다. InnoDB는 기본키를 기준으로 테이블을 정렬하여 쿼리 속도를 향상시키는데, 이는 클러스터형 인덱스를 변경하는 데 비용이 많이 들기 때문이다.🚨 클러스터형 인덱스는 테이블을 정렬하기 때문에 자주 수정되는 값을 클러스터형 인덱스로 설정하면 테이블이 계속 정렬된다. secondary Index (non-clustered)보조 인덱스는 비클러스터형 인덱스다. 클러스터형 인덱스와 달리..
- [ 학습기록/CS 공부 ][DB] 인덱스 (B 트리)2024-02-04 00:39:39인덱스란? 인덱스는 책의 목차와 유사하다. 책을 읽을 때 목차를 이용하면 원하는 내용을 빠르게 찾아 읽을 수 있다. 마찬가지로 테이블도 인덱스를 이용하여 원하는 데이터를 빠르게 조회할 수 있다. 데이터베이스에서 인덱스는 테이블에 대한 검색 속도를 높여주는 자료 구조를 의미한다. 특정 컬럼에 인덱스를 생성하면 전체 테이블을 스캔 (full scan) 하는 대신 인덱스를 참조하여 원하는 결과를 빠르게 조회할 수 있다. B 트리 인덱스는 데이터를 미리 정렬하여 검색 연산의 성능을 향상시킨다. 트리 알고리즘은 검색 및 정렬 연산에서 효과적인 자료 구조이므로 인덱스는 트리를 사용하여 구현된다. 💡 균형 잡힌 이진 트리의 경우 O(log n)의 시간 복잡도를 갖는다. 인덱스는 주로 B 트리로 구현되는데, B 트리는..
- [ backend/데이터베이스 ][mysql] InnoDB 살펴보기 (장점/ACID/MVCC)2024-02-03 21:00:45InnoDB란? InnoDB는 mysql에서 사용되는 기본 스토리지 엔진으로, 데이터베이스 테이블을 관리하는 데 사용된다. InnoDB의 장점 어떤 장점이 있길래 InnoDB를 스토리지 엔진으로 사용하는 걸까? InnoDB Recovery - 하드웨어나 소프트웨어 이슈로 서버가 예기치 못하게 종료되어도 InnoDB의 crash recovery가 자동으로 수정을 마무리한다. Buffer Pool - 버퍼 풀*에 테이블과 인덱스를 캐시하여 자주 사용하는 데이터는 메모리에서 처리한다. Index - 레코드에 키를 설정하면 해당 컬럼을 활용한 연산들을 자동으로 최적화한다. Change Buffer - 체인지 버퍼*를 이용하여 삽입, 수정, 삭제 작업을 최적화한다. 위의 장점 외에도 정말 많은 장점들이 있다. 자..
- [ backend/테스트 ][jest] jest 시작하기 (matcher/setup/teardown/mock)2024-02-03 12:59:28jest 란? jest는 단순함에 초점을 둔 자바스크립트 테스트 프레임워크다. 따라서 대부분의 자바스크립트 프로젝트에서 별도의 설정없이 동작할 수 있도록 설계되었다. jest는 병렬 실행 기능을 제공하는데, 이를 통해 여러 테스트 파일을 동시에 실행하여 테스트 수행 속도를 향상시킨다. 뿐만 아니라 이전에 실패한 테스트를 먼저 실행하여 개발자가 변경된 부분에 대한 결과를 빠르게 감지하고 수정할 수 있도록 돕는다. jest의 특징 별도의 설정없이 동작하도록 설계되었다. 여러 테스트 파일을 동시에 실행하여 성능을 향상시킨다. 이전에 실패한 테스트를 먼저 실행하여 빠른 피드백을 제공한다. 테스트 파일의 소요시간에 따라 실행 순서를 재조정한다. matcher matcher는 결과값을 예상된 결과와 비교하는 데 사..
- [ backend/테스트 ][node] jest와 supertest로 단위/유닛 테스트 하기2024-02-03 00:18:21한 줄만 고쳤는데요 😥개발에 제대로(?) 입문한지 얼마 되지 않았지만 테스트가 중요하다는 말을 정말 많이 들었다. 새로운 기능을 개발하느라 항상 테스트를 미루기 바빴는데 이번 포스팅에서 테스트를 진행해야 하는 이유와 테스트를 작성하는 방법을 알아볼 것이다.테스트를 작성해야 하는 이유버그 픽스, 리팩토링 등 좋은 의도에서 코드를 수정했을지 몰라도 개발자의 실수로 잘 돌아가던 코드가 에러를 발생시킬 가능성이 항상 도사리고 있다. 그렇다면 코드가 변경되었을 때 의도한 대로 동작하는지 확인할 수 있는 방법은 없을까?테스트를 이용하면 코드의 신뢰성을 확인할 수 있다. 코드를 수정한 후 기존에 작성해놓았던 테스트 코드가 실패한다면 이는 코드가 제대로 동작하지 않는다는 걸 의미한다. 즉, 테스트는 새로운 기능을 추..