1. 서론아침에 회사 DB가 두 번이나 터졌다. 종종 발생하던 문제임을 감안했을 때, 데이터를 인위적으로 서비스 도중에 밀어넣을 때 발생했다는 생각이 들었다. 서버에서는 비즈니스 로직 수행을 위해 DB에 Query, Mutation 요청을 한다. 이 경우 DB에서는 비즈니스 로직에서 필요로 하는 테이블로부터 요청한 데이터를 찾기 위한 동작을 진행한다. 내 상황의 경우 서비스 되고 있던 서버이기 때문에 비즈니스 로직 상 다량의 조회가 발생하는 테이블에 값을 밀어넣었을 때 문제가 생겼다고 생각했다. 여기서 한가지 의문이 생겼다. 시스템이 서비스 중인 상황을 감안하여 사용이 덜 될 것 같은 데이터를 입력했는데, 그럼에도 불구하고 DB부하가 걸리는 이유가 궁금했다. 이에 찾던 중 얻은 실마리가 Explain ..
1. 상황(or 요구사항)엑셀 데이터를 배치 처리하여 DB에 업로드하는 과정에서, 엑셀 파일 내에 이미 DB에 있는 데이터가 있을 경우, 중복해서 데이터를 입력하지 않기 위한 방법이 필요했다. 시도해 본 방법 중 주어진 상황에 가장 효율적으로 보이는 것이 Upsert 기법이었다. 이제부터 소개해보도록 하자.2. 접근법1) DB 제약사항 설정첫번째 방법은 필요한 데이터베이스에 Unique 제약사항을 추가하는 것이다.(Upsert에서도 필요한 기법이라고 생각한다.)장점DB 정합성이 보장된다.단점여러 데이터를 한번에 올리는 쿼리를 수행할 수 없다.(데이터 중 중복값이 있을 경우 예외를 던지기 때문에)2) 서버 체크 - 레코드 단위첫번째 방법은 서버에 예외를 던지기 때문에 Row Data를 개별 업로드를 해서..
*쓰는 것들부터 차근차근 정리해 놓자. MariaDB에서 제공하는 데이터는 크게 4가지 타입으로 구분된다. Data Types Description Numeric Data Types 숫자형 데이터 타입의 카테고리. 정수형/실수형 타입이 범위에 따라 정의되어 있는 것 같다. String Data Types 문자형 데이터 타입의 카테고리. 기본 문자형, 문자열부터 미디어 데이터, Json, UUID등의 타입이 이 카테고리에 속하는 것 같다. Date and Time Data Types 시간과 관련된 데이터 타입의 카테고리. Other Data Types Articles 이외 기타 타입 및 설명에 대한 카테고리. Auto increment, Null Values들이 여기 속하는 것이 신기했다. 카테고리를 분류..
들어가며 모 기업 면접에서 대규모 트랜잭션 관리하는 코드를 짜보고 싶다고 이야기했다. 그랬더니 "Isolation"에 대해 아냐는 물음이 들어왔고, 아무말도 할 수 없었다. 나중에 찾아보니 ACID 이야기가 나와 대충 아는 내용이 기억은 났지만, 트랜잭션을 하고 싶다는 사람이 바로 답이 나오지 않은 것은 부끄러웠다. 그래서 공부하는 내용을 정리해보려고 한다. 1. 정의 트랜잭션이란 하나 또는 그 이상의 명령을 통해 데이터베이스의 상태를 변화시키는 단일 논리 단위를 말한다. 실제 비즈니스 로직에서 어떤 요구사항이 수행될 때는 한 번 이상 데이터베이스를 접근하게 되는데, 이 모든 접근을 하나로 묶어 트랜잭션이라 한다. 가령, 인터넷으로 사과를 주문하는 상황을 가정했을 때 수행할 수 있는 접근은 다음과 같다...
정의 Knapsack Problem은 일정 무게를 담을 수 있는 배낭 안에 담을 수 있는 물건의 총량을 최적화 하는 문제이다. 배낭의 크기, 물건의 개수, 각 물건의 무게와 가치가 주어질 때, 배낭에 넣을 수 있는 물건들의 가치가 최대가 되게 하는 조합을 찾는 문제이다. Knapsack Problem은 크게 0-1 Knapsack Problem과 Fractional Knapsack Problem으로 나뉜다. Knapsack Problem의 예제는 백준 문제 12865번. 평범한 배낭 문제를 풀었다. 0-1 Knapsack Problem 물건을 쪼개 배낭에 넣을 수 없을 때, 각 물건을 배낭에 넣을 지 말지 결정하는 문제. Dynamic Programming으로 문제를 해결할 수 있다. 접근 방식 Data..
개인의 짧은 식견으로 작성했으니, 많은 조언 부탁드립니다. 설명 이분탐색은 기본적으로 Array와 같은 자료 구조에서 특정 값을 찾아낼 때 쓰인다. 찾고자 하는 값과, 현재 보고 있는 값을 비교하여 왼쪽과 오른쪽으로 탐색 범위를 쪼개 다시 탐색하는 과정을 거친다. 보고 있는 값과 찾고자 하는 값의 대소관계가 분명해야 하기 때문에, 이분 탐색을 사용하기 위해서는 배열이 정렬되어 있어야 한다. 한번 탐색마다 탐색 범위를 반으로 축소하기 때문에(left or right), O(nlogn)의 TC를 갖는다. 사용처 배열 속의 특정 값을 찾고자 할 때. 배열의 값들을 활용하여 찾아야 할 값에 특정 범위 내의 최적해를 찾을 때. Code 가장 기본적인 이분탐색 코드는 다음과 같다. ```cpp #include #i..
1. Preview 하나의 테이블에 같은 성격의 컬럼이 들어가는 경우가 있다. 예를 들어, 팀원 구성 테이블이 있을 수 있겠다. 팀 테이블을 팀장, 팀원으로 구성할 경우에, 다른 팀의 팀원으로 속해있지 않은 팀장을 모두 찾는 쿼리를 구성해보고자 한다. 2. Preset MEMBER_ID MEMBER_NAME 1 홍길동 2 김길동 3 이길동 4 박길동 5 고길동 LEADER_ID MEMBER_ID 1 2 1 3 4 1 4 3 4 5 3. Query 위의 테이블 구조에서 다른 팀의 팀원으로 일하지 않는 사람을 찾는 쿼리를 작성해보자. select * from team where team.LEADER_ID not in (select MEMBER_ID from team); 4. Wrap-up 모르는 것을 인지했..