DBMS/SQL, RDBMS

    SQL Transaction(트랜잭션): 데이터의 정합성을 보장하기 위한 방법

    SQL Transaction(트랜잭션): 데이터의 정합성을 보장하기 위한 방법

    트랜잭션: Transaction 트랜잭션은 DB에서 일련의 작업을 논리적으로 묶은 것입니다. 즉 여러 SQL 쿼리문을 하나의 처리로 묶는 것입니다. 유명한 예를 들어보겠습니다. 예제) 고객 A와 B가 있습니다. 고객 A가 고객 B에게 1,000원을 이체하려는 상황입니다. 문제 1. 고객 A가 고객 B에게 1,000원을 이체하게 된다면 고객 A의 잔고는 -1,000원 연산이 이루어져야 하고, 고객 B의 잔고는 +1,000원 연산이 이루어져야 합니다. 하지만 고객 A의 잔고가 줄어드는 연산은 이루어지고, 그 후 오류가 발생하여 B의 잔고가 오르는 연산이 이루어지지 않으면 고객 A의 돈은 감소하고 고객 B의 돈은 증가하지 않게 됩니다. 우리가 바라는 것은 오류가 발생하게 되어 B의 잔고가 오르지 않는다면, 당..

    SQL 조회 성능을 위한 인덱스(Index)

    SQL 조회 성능을 위한 인덱스(Index)

    인덱스 인덱스(Index)는 DB에서 조회, 정렬, 그룹화 등의 연산을 빠르게 수행하기 위해 사용되는 정렬된 자료구조입니다. 특정 열 또는 열의 조합에 대한 정렬된 키와, 해당 키가 대응한 실제 데이터 레코드의 위치로 이루어져 있습니다. (key-value) 형태 예를 들어 위와 같이 주어진 `user` 테이블에서 나이가 20세 미만인 사용자를 찾는 쿼리(`select * from user where age < 20`)를 실행한다고 가정해봅시다. 해당 쿼리는 모든 데이터를 순차적으로 조회하여 조건을 만족하는 결과를 찾아낼 것입니다. 위 테이블은 데이터가 적게 담겨져 있어서 조회 시간에 큰 문제가 없지만, 만약 테이블에 데이터가 매우 많이 담기게 된다면 조회 기능의 성능은 매우 저하될 것입니다. 우리는 조..

    MySQL 데이터베이스(DB)에 배열 넣기 (feat. JSON)

    MySQL 데이터베이스(DB)에 배열 넣기 (feat. JSON)

    일반적으로 배열의 값을 데이터베이스(DB)에 넣기 보다는, 별도의 테이블에 저장하고, 해당 테이블과 원래 테이블 간의 관계를 생성합니다. 즉 정규화를 하는 것인데 이를 통해 배열 요소의 개별 검색, 수정, 추가가 용이해지는 장점이 있지만, 배열의 크기가 크거나 굳이 정규화를 하지 않아도 될 경우에도 정규화를 하게 되면 성능 문제가 발생할 수 있습니다. 때문에 배열 그대로 테이블에 집어넣는 방법에 대해서 알아보도록 하겠습니다. 문자열로 저장하는 방법 `배열 자료형`을 `문자열`로 변환하고, 그대로 테이블에 문자열 컬럼으로 저장해버리는 방법입니다. 배열을 넣을 때는 문자열로 변환하여 저장하고, 가져올 때는 문자열을 불러와 파싱하여 배열 자료형으로 만들어 사용하면 됩니다. 1) org.json 라이브러리 의존..

    [MySQL] port 변경하기

    [MySQL] port 변경하기

    MariaDB의 포트를 3306으로 설정해줌으로 MySQL의 포트를 따로 설정해주어야 했다. 포트(port)를 변경하기 위해선 다음과 같은 과정을 거치면 된다. 1. my.ini 수정 기본 설정으로 MySQL을 다운로드 하였다면 my.ini의 경로는 다음과 같을 것이다. 경로: C:\ProgramData\MySQL\MySQL Server 8.0 my.ini 파일에서 두 군데 port 번호를 변경해주어야 한다. 2. 서비스에서 MySQL 재구동 my.ini에서 설정한 포트로 정상적으로 구동된다.

    Maria DB 설치

    Maria DB 설치

    1. Maria DB 설치 홈페이지로 이동 https://mariadb.org/ MariaDB Foundation - MariaDB.org … Continue reading "MariaDB Foundation" mariadb.org 2. Download Mirror에 Korea가 없어서 Taipei로 Download 하였다. 3. 다운받은 파일 실행 UTF-8을 체크해주어야 한글이 정상적으로 출력된다. 4. 설치 진행 만약 [Next]를 눌렀을 때 TCP port가 이미 사용중이라고 나오면 아마 대부분은 MySQL을 사용하다가 MaraiDB를 설치하려는 경우일 것이다. 이때는 당황하지 말고 [리소스 모니터]에 들어가 3306 port 사용처를 본다. [명령 프롬프트] > [관리자 실행] > taskkil..

    [MyBatis + MySQL] INSERT 시 PK값 가져오기

    [MyBatis + MySQL] INSERT 시 PK값 가져오기

    코딩을 하던 중 PK 값이자 자동 증가하는 id 값을 가져와야 할 일이 생겼다. MySQL 자체 문법으로도 가능한 방법이 있지만 MyBatis에서도 기능이 있다 해서 포스팅해보겠다. Oracle 같은 경우 아래와 같은 방법으로 안되기 때문에 다른 방법(selectKey 태그 사용)으로 구현해야 하기 때문에 따로 찾아보길 바란다. INSERT INTO board( title, content, writer, views ) values( #{title}, #{content}, #{writer}, 0 ) useGeneratedKeys insert나 update됨가 동시에 자동생성된 키를 가져올 수 있는 속성으로 true로 설정 (default: false) keyProperty 리턴 될 key property ..

    MySQL Column(열) 추가, 삭제, 위치, 컬럼명, 자료형 변경

    MySQL Column(열) 추가, 삭제, 위치, 컬럼명, 자료형 변경

    Column 추가 맨 뒤에 추가 ALTER TABLE 테이블명 ADD 컬러명 자료형; 맨 앞에 추가 ALTER TABLE 테이블명 ADD 컬럼명 자료형 FIRST; 지정(원하는) 위치에 추가 ALTER TABLE 테이블명 ADD 새컬럼명 자료형 AFTER 앞컬럼명; Column 삭제 ALTER TABLE 테이블명 DROP COLUMN 컬럼명; 이때 COLUMN은 생략 가능 Column 위치 변경 맨 앞으로 이동 ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 자료형 FIRST; 지정(원하는) 위치로 이동 ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 자료형 AFTER 앞컬럼명 Column 컬럼명, 자료형 변경 컬럼명 변경 ALTER TABLE 테이블명 CHANGE 기존컬럼명..

    MySQL 페이징 처리 및 개수 제한하여 출력: LIMIT, OFFSET

    MySQL 페이징 처리 및 개수 제한하여 출력: LIMIT, OFFSET

    SELECT * FROM member; member 테이블의 레코드 수가 몇 천 개 있다고 가정해보자. 이 때,위 쿼리를 실행하면 member 테이블에서 모든 레코드가 SELECT될 것이다. 만약 우리가 모든 레코드가 아닌 50개 정도만 출력을 하고 싶을 땐 어떻게 하면 될까? 바로 이때 쓰는 것이 limit 이다. SELECT * FROM 테이블명 WEHERE 조건 LIMIT 행개수 OFFSET 시작행 LIMIT 사용법 // LIMIT 갯수 --- 글번호 1~10 SELECT * FROM 테이블명 LIMIT 10 OFFSET 0; //OFFSET 생략 가능 SELECT * FROM 테이블명 LIMIT 10; // LIMIT 갯수 OFFSET 시작행 --- 글번호 21~30 SELECT * FROM 테이..