전체 글 262

C++ UnitTest 프로젝트 만들기

C++ UnitTest 프로젝트를 만드는 방법을 알아본다. 단위 테스트는 테스트 주도 개발(TDD)에서 가장 기본이 되는 테스트 방법으로 자신이 만든 함수나 클래스를 테스트하고 올바르게 동작하는 지 확인함에 있다. 몇 가지 테스트 케이스를 두고 입력에 따른 올바른 결과가 나오는 지 확인하는 것을 보통 사용한다. 테스트 케이스가 모든 가능한 경우를 테스트한 다고 볼 수는 없지만 기본적으로 자신이 만든 함수에 대해 기본 기능은 보장한다고 할 수 있다. 또한 다른 작업자가 해당 코드를 나중에 수정할 경우에도 동일한 단위 테스트가 성공할 것을 보장하여 개발 신뢰성을 높일 수 있다. 참고 https://docs.microsoft.com/ko-kr/visualstudio/test/writing-unit-tests-..

MySQL 인덱스

Real MySQL의 인덱스 내용을 개인 공부를 위해 정리한 글입니다. 모든 저작권은 Real MySQL 8.0 (위키북스 / 백은빈, 이성욱 저)에 있음을 밝힙니다. 인덱스란 DBMS에서 인덱스는 데이터의 저장(insert, update, delete) 성능을 희생하고 데이터의 읽기 성능을 높이는 기능이다. 인덱스의 종류 프라이머리 키 (Primary Key): 레코드를 대표하는 컬럼의 값으로 만들어진 인덱스를 말한다. 식별자라고도 하며 NULL값을 허용하지 않고 중복을 허용하지 않는 것이 특징이다. 보조 키 혹은 세컨더리 인덱스 (Secondary Index) : 유니크 인덱스는 프라이머리 키와 성격이 비슷하고 프라이머리 키를 대체해여 사용할 수 도 있어 대체 키라고도 한다. 데이터 저장 방식에는 B..

DB/MySQL 2022.01.09

MySQL 트랜잭션과 잠금

잠금 Lock 동시성을 제어하기 위한 기능 트랜잭션 Transaction 데이터의 정합성 Consistency을 보장하기 위한 기능 MySQL 트랜잭션 트랜잭션이란 논리적인 작업 셋 자체가 100% 적용되거나(Commit) 아무것도 적용되지 않아야(Rollback)함을 보장해 주는 것 데이터의 부분 업데이트 문제 CREATE TABLE tab_myisam ( fdpk INT NOT NULL, PRIMARY KEY (fdpk) ) ENGINE=MyISAM; INSERT INTO tabl_myisam ( fdpk ) VALUES (3); CREATE TABLE tabl_innodb ( fdpk INT NOT NULL, PRIMARY KEY (fdpk) ) ENGINE=INNODB; INSERT INTO ta..

DB/MySQL 2022.01.02

MySQL InnoDB 스토리지 엔진 아키텍처

InnoDB 스토리지 엔진 레코드 기반의 잠금을 제공하여 높은 동시성 처리와 안정적이고 뛰어난 성능을 가진다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키를 이용한 범위 스캔은 굉장히 빨리 처리된다. 외래 키 지원 스토리지 엔진 레벨에서 지원하는 기능. 부모 자식 테이블 모두 해당 컬럼에 인덱스가 생성이 필요하며 변경 시에 부모 테이블이나 자식 테이블에 데이터가 있는 지 체크하는 작업이 필요하여 잠금이 여러 테이블로 전파되고 데드락 발생 가능성이 있기 때문에 외래 키 존재 여부에 주의하는 것이 좋다. MVCC (Multi V..

DB/MySQL 2021.12.30

MySQL 아키텍쳐

MySQL 서버 아키텍쳐 구조 스토리지 엔진 API SQL 문장을 분석하고 처리하여 디스크에 데이터를 쓰거나 읽는 등의 중요 역할을 담당한다. 핸들러 API 스토리지 엔진에 읽기 혹은 쓰기를 요청하는 핸들러 요청을 의미한다. MySQL 스레드 구조 MySQL은 스레드를 기반으로 작업을 처리한다. 1. 포그라운드 스레드 (클라이언트 스레드) 서버에 접속한 클라이언트 수만큼 존재하며 사용자가 요청하는 쿼리를 처리한다. 사용자가 연결을 종료하면 해당 포그라운드 스레드는 스레드 캐시로 돌악나다. 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오며 이에 없는 경우 직접 디스크 데이터 혹은 인덱스 파일로 부터 읽어서 작업을 처리한다. MyISAM은 쓰기 작업까지 포그라운드 스레드에서 진행되지..

DB/MySQL 2021.12.29

MySQL 사용자 및 권한

사용자 식별 'id_name'@'127.0.0.1' (IP 주소) 'id_name'@'%' (모든 주소) 시스템 계정과 일반 계정 시스템 계정은 다음 작업이 가능하다. 계정 관리 (새로운 계정 생성, 기존 계정 삭제, 권한 부여 및 제거) 세션 강제 종료 혹은 세션에서 수행되는 쿼리 강제 종료 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정 잠겨있는 시스템 계정 (ACCOUNTLOCKED=Y) 다음 계정들은 시스템 계정으로 로그인이 불가능한 기본 계정이다. 'mysql.sys'@'localhost' : 기본으로 내장된 sys 스키마의 객체들의 DEFINER로 사용되는 계정 'mysql.session'@'localost' : MySQL 플러그인이 서버로 접근할 때 사용하는 계정 'mysql.i..

DB/MySQL 2021.12.23

MySQL 시스템 변수

MySQL 서버가 시작할 때 앞으로 어떻게 기동될 지 정의하는 변수 시스템 변수 확인 SHOW GLOBAL VARIABLES; MySQL 서버 시스템 변수관련 페이지 https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html MySQL :: MySQL 8.0 Reference Manual :: 5.1.5 Server System Variable Reference MySQL 8.0 Reference Manual / ... / MySQL Server Administration / The MySQL Server / Server System Variable Reference PREV HOME UP NEXT dev.mysql.com ..

DB/MySQL 2021.12.20

[More Effective C#] 4장 병렬 처리

아이템 35. PLINQ가 병렬 알고리즘을 구현하는 방법을 이해하라 AsParallel()로 생성되는 병렬 버전의 순회 타입 ParallelEnumerable와 관련된 기능을 알아본다. LINQ to Objects로 실행되는 예제를 위주로 알아본다. PLINQ는 LINQ to SQL이나 EntitiyFramework 알고리즘을 병렬화 하는 데 별로 도움이 안 된다. 어차피 쿼리를 병렬 처리하기 위해 데이터 베이스 엔진의 병렬 처리 기능을 사용하기 때문이다. public static void PLINQ_Ex1() { List data = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 순차 순회 var nums = data.Where(m => m < 150).Select(n..

C#/Advanced C# 2021.12.18

[C# Thread] BackgroundWorker 클래스

System.ComponentModel.BackgroundWorker 클래스 백그라운드에서 동작하는 스레드를 사용하는 스레드 풀을 사용하여 작업을 실행할 수 있는 클래스 내부적으로 System.Threading.Thread.QueueUserWorkItem() 함수를 이용하여 작업을 실행한다. 백그라운드 스레드가 예외를 던지면 전체 어플리케이션이 종료할 수 있다. BackgroundWorker 는 백그라운드에서 실행되는 작업에서 발생하는 취소, 예외나 진행상황을 포그라운드(Foreground) 스레드에 전달할 수 있다. 따라서 스레드간 커뮤니케이션을 가능하게한다. 작업의 실행 DoWork 속성에 실행할 작업의 대리자를 등록한다. RunWorkerAsync()는 등록된 작업을 실행한다. System.Thre..

C#/Advanced C# 2021.12.15

[More Effective C#] 3장 태스크 기반 비동기 프로그래밍

아이템 27. 비동기 작업에는 비동기 메서드를 사용하라 public static async Task SomeMethodAsnyc() { Console.WriteLine("SomeMethod Begins..."); Task assignedTask = AssignedTaskBegin(); var result = await assignedTask; Console.WriteLine("SomeMethod Ends"); } 비동기 메서드는 비동기 작업을 포함하는 메서드를 의미한다. Task assignedTask = AssignedTaskBegin(); 라인에서 비동기 작업이 시작되고 해당 결과를 전달받을 수 있는 Task 객체를 반환한다. 비동기 메서드의 async-await 구문은 기본적으로는 해당 메서드가 동..

C#/Advanced C# 2021.12.13