데이터베이스 13

트랜잭션 격리 수준에 따른 문제점

평소 트랜잭션을 사용하면서 ACID 특징 정도만 알고 있었는데 격리도 수준에 따라 나누어지고 수준에 따라 발생할 수 있는 문제점들이 있다니 서버 개발자는 공부할 게 정말 많은 거 같다. 데이터베이스는 공부를 하면 할수록 매우 생소한 개념들이 나온다. 하지만 몇 번 읽어보면 이해가 가서 재밌다 트랜잭션 격리 수준은 트랜잭션 격리가 성공하는 정도의 측정값을 의미한다. 다른 말로 트랜잭션들의 고립의 정도를 나타내며 서로 다른 트랜잭션끼리 변경된 데이터를 볼 수 있도록 허용 여부를 결정해야 한다. ACID 특성 중 격리성(Isolation)이 완벽히 보장되려면 거의 순차적으로 실행되어야 하는데 이렇게 되면 성능이 매우 저하된다. 격리성은 격리 수준을 4단계로 나누어 격리성을 보장한다. 격리 수준 커밋 되지 않은..

데이터베이스 2022.11.14

MySQL 옵티마이저

MySQL 옵티마이저 Real MySQL 서적에 나오는 일부분으로 조만간 알라딘으로 달려간다!!!! 데이터베이스의 두뇌와 같은 역할로 쿼리의 실행 계획을 생성하는 관계형 데이터베이스 내부 핵심 엔진이다. 쿼리의 결과는 같지만 우리가 모르게 내부적으로 결과를 만들어내는 방법은 매우 다양하다. 옵티마이저는 이러한 다양한 방법 중 어떤 방법이 최적이고 최소한의 비용으로 실행될지 결정한다. 쿼리가 최적으로 실행되기 위해 테이블별로 어떤 데이터가 어떠한 형태로 저장돼있는지를 참조하고 참조한 데이터를 기반으로 최적의 실행 계획을 수립한다. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 3단계로 구분된다. SQL 파싱(파스 트리) SQL 쿼리문을 쪼개어 MySQL Server가 이해할 수 있는 수준..

데이터베이스 2022.11.01

Prisma Relation

Prisma Relation 최근 진행한 프로젝트에서 ORM을 도입하지 않아 엄청난 생산성의 저하를 경험하였다. ORM의 여러 가지 강점 중 개인적으로 테이블 간의 참조 관계 설정이 간단하고 관계에 따라 생성되는 메서드를 사용할 수 있다는 부분이 제일 편리하고 생산성이 높아지는 거 같다. 이를 통해 데이터베이스 모델 설계에 집중할 수 있어 여러모로 사용하지 않을 이유가 없다. 1:1(일대일) 양쪽에서 최대 하나의 레코드에 연결 가능하다. 한 명의 사용자는 하나의 프로필을 갖는다. User(사용자) 사용자는 프로필을 항상 갖지 않아도 되므로 ? 옵셔널로 설정한다. Profile(프로필) 참조 관계는 @relation 메서드로 설정한다. fields는 외래키(Foreign Key)를 가리키며 referenc..

데이터베이스 2022.10.17

Prisma

Prisma ORM(Object Relational Mapping)이다. 자바스크립트에 Sequelize가 있다면 타입스크립트에 Prisma와 TypeORM이 존재한다. 타입스크립트와 친화적이며 여러 DBMS를 지원한다. 다른 ORM 과는 근본적으로 다르다고 공식 문서에 나와있다. 기존 ORM은 객체 지향 방식으로 테이블을 매핑한다고 하지만 Prisma는 선언적인 모델을 정의해 복잡한 모델 인스턴스를 효율적으로 관리할 수 있다. 사용 이유 Sequelize를 사용해 봐서 그런지 러닝 커브가 높지 않았다. 로우 쿼리 사용으로 인해 발생하는 단점을 커버해 줄뿐더러 모델 간 관계 설정 시 Sequelize보다 훨씬 직관적이었으며 마이그레션이 매우 편하고 코드의 양 또한 더 적은 거 같다. 이로 인해 왜 생산성..

데이터베이스 2022.10.13

DBMS

DBMS 데이터베이스 내 데이터에 접근하도록 도와주는 시스템을 의미한다. 사용자가 질의(Query)를 요청하면 DBMS는 받은 질의를 질의처리기(Query Processor)와 저장 시스템(Storage System)을 통해 데이터에 접근할 수 있도록 해준다. DBMS 언어 데이터베이스에 접근하기 위해 데이터 관리 시스템을 사용해야 한다. 데이터 언어(Data Language)는 DBMS를 사용하기 위한 언어이며 데이터 언어는 SQL을 생각하면 된다. SQL 언어는 각자 역할이 다른 3가지의 언어로 구성되어 있다. 1. DDL 데이터 정의어(Data Definition Language) 스키마(데이터베이스 테이블)를 정의하거나 삭제 또는 수정하기 위해 사용하는 언어이다. Create Alter Drop ..

데이터베이스 2022.10.03

MySQL 자료형 옵션

MySQL 자료형 옵션 관계형 데이터베이스로 RDBMS의 한 종류이다. - 속도 안정성 확장 가능성을 추구한다. - 대용량 데이터 처리와 보안에도 뛰어나다. - 상업적으로 사용 시 비용이 발생하나 Oracle에 비해 저렴하고 기본적으로 무료이다. 자료형 정수 자료형 바이트 SIGNED UNSIGNED TINYINT 1 -128 ~ 127 0 ~ 255 SMALLINT 2 -32,768 ~ 32,767 0 ~ 65,535 MEDIUMINT 3 -8,388,608 ~ 8,388,607 0 ~ 16,777,215 INIT 4 -2,147,483,648 ~ 2,147,483,647 0 ~ 4,294,967,295 BIGINT 8 -2^63 ~ 2^63-1 0 ~ 2^64 - 1 고정 소수점 수 좁은 범위의 수 ..

데이터베이스 2022.05.08

DBMS RDBMS Transaction

DBMS(Database Mangement System) 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 데이터를 생성해 주고 디비를 관리해 주는 소프트웨어이다. - 데이터들을 소프트웨어가 안정적으로 사용하려면 각 정보들마다 일정한 형태가 있어야 한다. - 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보의 저장소이다. - 데이터를 계층 또는 탐색 형식으로 저장한다. - 파일 시스템을 사용해 저장하며 각 테이블 간에는 관계가 없다. - 데이터에 대한 많은 보안을 제공하지 않으며 정규화를 수행할 수 없어 데이터는 높은 중복성을 가질 수도 있다. RDBMS(Relational Database Management) 관계형 모델을 기반으로 하는 구조화된 DBMS 한 유형이다. - 각 테이블은 서로 연관..

데이터베이스 2022.05.08

Sequelize N:M associate

Sequelize N:M associate JOIN 기능을 구현하기 위해 시퀄라이즈 모델 간의 관계를 설정하기 위한 메서드이다. N:M 게시글 모델과 게시글에 속해있는 해시태그 모델 간의 다대다 관계 - 게시글 하나의 여러 개의 해시태그가 속할 수 있다. - 해시태그 하나가 여러 개의 게시글의 속할 수 있다. - belongsToMany 메서드로 표현한다. - 다대다 관계 특성상 중간 테이블이 생성된다. const Sequelize = require("sequelize"); module.exports = class Post extends Sequelize.Model { static init(sequelize) { return super.init({ title: { type: Sequelize.STRING..

데이터베이스 2022.05.05

Sequelize 1:N associate

Sequelize 1:N associate JOIN 기능을 구현하기 위해 시퀄라이즈 모델 간의 관계를 설정하기 위한 메서드이다. 1:N 유저 모델과 유저가 작성한 게시글 모델 간의 일대다 관계 - 유저 한 명은 게시글을 여러 개 작성할 수 있다. - 게시글 하나는 한 명의 사용자만 갖는다. - 유저 모델 hasMany/sourceKey 게시글 모델 belongsTo/targetKey - belongsTo를 사용하는 모델에 UserId 컬럼이 추가된다. const Sequelize = require("sequelize"); module.exports = class User extends Sequelize.Model { static init(sequelize) { return super.init({ emai..

데이터베이스 2022.05.05

Sequelize 1:1 associate

Sequelize 1:1 associate JOIN 기능을 구현하기 위해 시퀄라이즈 모델 간의 관계를 설정하기 위한 메서드이다. 1:1 유저 모델의 정보를 담고 있는 세부 정보 모델 간의 일대일 관계 - 사용자 모델과 사용자의 세부 정보를 담고 있는 모델 간의 관계는 1:1이다. - 사용자 한 명은 자신의 정보를 담고 있는 테이블과만 관계가 있다. - 세부 정보 테이블도 한 사람만을 가리킨다. - 유저 모델 hasOne/sourceKey 세부 정보 모델 belongsTo/targetKey - belongsTo를 사용하는 모델에 UserId 컬럼이 추가된다. const Sequelize = require("sequelize"); module.exports = class User extends Sequeli..

데이터베이스 2022.05.05