SQL
[SPRING] spring boot에서 mysql 연동하기
백엔드 어플리케이션의 기초중 하나 MySQL과 연동하는 법을 살펴보겠습니다. 버전정보 id 'java' version '17' id 'org.springframework.boot' version '3.0.3' id 'io.spring.dependency-management' version '1.1.0' gradle 7.6 1. dependencies에 mysql-connector 추가 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' runtimeOnly 'mysql:mysql-conn..
[Database] 트랜잭션 격리수준(Transaction Isolation Level)
트랜잭션 ACID 중 I(Isolation)에 해당하는 격리성에 관한 격리 수준을 의미합니다. 병렬처리되는 트랜잭션을 완전한 격리가 아닌 격리의 수준을 지정해서 작동을 하게됩니다. DIRTY READ, NON-REPEATABLE READ, PHANTOM READ와같이 각각 격리 단계에서 발생할 수 있는 부정합이 있습니다. SERIALIZABLE(직렬화) 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드 제공합니다. 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없습니다. 교착상태가 많이 발생하여 DB성능이 떨어집니다. REPEATABLE READ 한 트랜잭션이 접근하는 데이터에대해 다른 트랜잭션이 수정하지 못하는 격리수준을 의미합니다. 하지만 새로운 데이터를 추가하는 INSER..
[fake-trip]TypeORM 1:1관계 조회 쿼리 한번으로 줄이기(findOne)
프로젝트 진행중 TypeORM의 orm 을 사용하여 유저데이터를 조회할때 불필요하게 쿼리가 두번날라가는 현상을 발견하였습니다. users 테이블 users 와 social_platform은 1:1 관계를 형성합니다. 원본 코드 return await this.findOne({ where: { userSocialPlatform: { pk:'카카오서버의 pk값', type:'kakao_talk' } }, relations: ['userSocialPlatform'], }); 카카오 소셜로그인시 받아온 카카오측DB의 id(pk)값과 type을 기반으로 유저데이터를 조회합니다. 이때 발견한 문제는 쿼리가 불필요하게 두번나간다. 입니다. 조회시 사용된 쿼리문 console.log query: SELECT DISTI..
[fake-trip]Database 모델링 리펙토링하기
node.js를 학습하면서 간단한 CRUD만을 구현해온 것 같아 아직 학습중인 nest.js를 사용하며 부트캠프의 프로젝트중 하나를 리펙토링 하기로 했습니다. Database부터 리펙토링을 시작하려고 합니다. 기존 ERD 리펙토링 ERD 변화점 1. product -> accommodation 으로 테이블명 변경 기존 ERD에서 사용한 product는 숙박업소를 의미하였습니다. 원래 커머스 사이트 데이터베이스를 구성할때는 product라는 테이블명을 주로 이용합니다. 이유는 좀 더 상품 중심적인 사고를 할 수 있게 해주기 때문입니다. 하지만 엄밀히 따지면 숙박업소를 예약하는곳에서 판매하는 상품은 숙박업소가 아닌 숙박업소의 방 입니다. (좀더 디테일하게 따지자면 숙박업소의 방의 일정한 날짜의 티켓이라고 ..
[Database]MySQL 인덱스
INDEX란? 색인 (검색을 위해)임의의 규칙대로 부여된, 임의의 대상을 가리키는 무언가 기능으로써는 무언가를 빠르게 찾기위해 존재하는것이라고 생각하면 될 것 같습니다. 흔히들 개발자들이 알고 있는 Index는 배열,리스트의 인덱스입니다. 배열에서 인덱스의 역할은 실제 메모리상의 주소를 추론할 수 있어 O(1) 시간에 데이터에 접근 가능하게 합니다. Index가 없다면 배열에서는 처음부터 끝까지 뒤져보며 O(n)시간을 소요하지만 O(1)로 접근할 수 있게 해주는 엄청난 효과를 주죠 Database에서 INDEX란? 데이터베이스의 인덱스도 똑같은 역할을 합니다. Full Scan하는 대신 더욱 효과적으로 조회(Select)를 하기위해 만들어진 것이죠. 인덱스는 지정한 컬럼들을 기준으로 메모리 영역에 일종의..
[Database] 트랜잭션(Transaction) 과 ACID
트랜잭션이란? 하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합, 작업단위 트랜잭션의 4가지 특징 ACID 원자성(Atomicity) - 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 합니다. - Commit & Rollback을 활용합니다. 일관성(Consistency) - 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 합니다. - 허용된방식으로만 데이터를 변경하는것을 의미합니다. - 데이터베이스에 기록된 모든 조건, 제약들을 적용하며 수행하는것을 의미합니다. 독립성(Isolation) - 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을때, 어떤 트랜잭션도 다른 태랜잭션 연산에 끼어들 수 없습니다. 지속성(Durability - 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의..