일시: 2024.12.27
장소: 용산 청년지음
주제:
DB
- 트랜잭션
- 격리수준 (Isolation Level)
- SERIALIZABLE
- REPEATABLE READ
- READ COMMITTED
- READ UNCOMMITED
- 데이터베이스 락
- pk id길이가 길어지면 일어나는일
- JPA flush 시점
- 데이터베이스 자료형
- 정규화
- 데이터베이스 특징
- 조인
- rdbms/nosql
- 튜닝
- 데이터베이스 인덱스
- 클러스터링과 리플리케이션
- 관계 / 키
진행방법
- 6명이서 각자 해당 주제에 대해 학습한 내용을 매주 2회 온라인으로 발표한 후 질문을 준비해온다.
- 한명씩 준비해온 질문을 하나씩 번갈아가며 질문한 후 자유롭게 대답한다.
- 대답에 대한 피드백을 서로 주고 받으며 답변을 구체화 시키며 학습한 내용을 복기한다.
질문 및 피드백
-
인덱스와 키의 차이점은 무엇인가요
- 키는 데이터의 고유성과 참조 무결성을 보장 인덱스는 검색 속도를 높이기 위한 자료 구조이다.
-
트랜잭션의 커밋과 롤백의 차이에 대해서 설명하세요
- 커밋: 트랜잭션이 끝나면 데이터베이스에 영구적으로 저장
- 롤백: 트랜잭션이 취소되고 데이터베이스를 트랜잭션 이전의 상태로 복구
- 트랜잭션 관리자 트랜잭션의 생명 주기를 관리하는 컴포넌트 격리 수준 관리, 커밋, 롤백 관리…
-
영속성 컨텍스트와 그 기능을 말해보세요.
- 영속성 컨텍스트는 엔티티를 영속화하는 환경입니다.
트랜잭션이 커밋되면 영속성 컨텍스트에 있는 쓰기 지연 SQL 저장소의 쿼리들이 db로 날라가고, 데이터들이 영구적으로 저장됩니다.
-
정규화(Normalization)와 비정규화(Denormalization)의 장단점은 무엇인가요?
- 정규화 : 중복을 최소화 하도록 설계, 상당수의 일시적 질의문을 처리하기 위해 많은 조인을 사용한다.
- 비정규화 : 읽는 시간을 최적화 하도록 설계, 조인 연산 비용을 줄인다, 규모 확장성을 실현하고자 자주 사용, 갱신 이나 삽입 비용이 많이 듬, 일관성, 저장공간 이슈
-
JOIN에 대해서 설명해주세요.
- JOIN은 데이터베이스에서 두 개 이상의 테이블을 결합하여 하나의 결과 집합으로 만드는 연산입니다.
- inner join : 교집합
- outer join
- left : 왼쪽 기준
- right : 오른쪽 기준
- full outer → 누락된 값을 찾기 위해서 사용.
- cross join : 모든 조합
- union(중복 X) vs union all(중복 O)
-
PK 길이가 길어질 때의 문제와 해결방안
문제 유형 | 문제 상황 | 해결 방법 |
---|
성능 문제 | 인덱스 크기, 비교 비용 | int, bigint PK를 사용 |
저장 공간 문제 | 테이블, FK 크기 증가 | 숫자형 PK로 교체 |
운영 문제 | 파티셔닝, 샤딩 문제 | 해시 키를 기반으로 샤딩 |
페이지 스플릿 | 페이지 스플릿 발생 | 숫자형 PK로 교체, 클러스터 인덱스 |
클러스터형 인덱스 - PK를 기준으로 테이블을 정렬, 테이블 자체가 인덱스
-
RDBMS가 수평확장(서버를 늘리는 확장) 에 불리한 이유는 무엇인가요?
1.관계형 데이터 구조상 테이블의 관계를 외래 키 등으로 유지함으로 여러 서버에 나누어 저장하면 이러한 관계를 유지하기 어렵습니다.
2.조인이 필요한 경우 데이터가 여러 서버에 분산되어 있으면 각 서버에서 데이터를 가져와 결합하여 하므로 성능 저하가 발생합니다.
-
데이터 무결성을 지키기 위한 제약 조건을 설명하세요
- 개체 무결성: PK는 중복 안되고 null도 안된다
- 참조 무결성: 외래키는 null 값을 못 가지고, 참조 테이블의 기본키와 동일해야 한다
- 도메인 무결성: 속성에 지정된 값만 가질 수 있다
-
클러스터링의 장단점에 대해 말해주세요.
- (장) 서버가 두 대 이상으로 이뤄져있기 때문에, 한 서버가 다운돼도 서비스에 지장이 가지 않는다.
- (단) 데이터 갱신을 하려면 (갱신하려는) 서버 외에 다른 서버들이 요청 수락을 해줘야 하기 때문에 병목현상이 발생할 수 있다.
- 1개의 노드에 쓰기 트랜잭션이 수행되고, Commit 실행
- 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청
- 다른 노드에서 복제 요청을 수락했다는 신호를 보내고, 디스크에 쓰기를 시작
- 다른 노드로부터 신호를 받으면 실제 디스크에 데이터를 저장
-
DB 튜닝이란?
- 단순한 퍼포먼스 향상이 아니라 자주 호출하는 SQL이나 프로그램에서 호출되는 SQL 경로등 운영체제, 미들웨어 영역까지 확장해서 자원을 범위로 성능을 향상 시키고 탐색하는 것
-
Primary Key, Foreign Key에 대해 설명해 보세요.
Primary Key(기본 키)는 데이터베이스 테이블에서 각 행(row)을 고유하게 식별하는 열(column) 또는 열의 조합을 말합니다. 키가 소속된 테이블에서 중복되지 않아야 하며, 모든 행은 기본 키 값을 가집니다. 주로 이 키가 식별자(identifier)로 사용됩니다. 각 행을 고유하게 식별하기 때문에 검색, 수정, 삭제, 구분 등의 작업에서 유용하게 사용됩니다.
Foreign Key(외래 키)는 한 테이블의 열(column)이 다른 테이블의 기본 키(primary key)를 참조하는 역할을 합니다. 다른 테이블과의 관계를 형성하여 데이터간의 일관성과 무결성(Integrity)을 유지하는 것에 사용합니다.
외래 키 제약 조건은 데이터베이스 시스템에서 외래 키 값을 검증하고 관리하는 것에 사용합니다. 조건은 부모 테이블(참조 테이블)의 값과 일치하지 않거나 해당 값이 null 상태일 때도 똑같이 적용됩니다.
-
데드락에 대해 설명해주세요
- 두 트랜잭션 모두가 블로킹 상태에 진입하여 서로의 블로킹을 해결할 수 없는 상태입니다.
트랜잭션 A, B에서 A가 B 트랜잭션에 대해 블로킹 상태로 진입한 경우에, B 트랜잭션이 종료(커밋 or 롤백)되어야 해당 블로킹이 끝나고 트랜잭션 A의 작업이 정상적으로 수행된다. 그러나 해당 상황의 B 트랜잭션에서 A에 대해 블로킹 상태로 진입한다면 마찬가지로 A 트랜잭션이 종료(커밋 or 롤백)되어야 해당 블로킹이 끝나고 트랜잭션 B의 작업이 정상적으로 수행된다. 이때 A와 B가 모두 상대 트랜잭션의 종료를 기다리고 있게 되어 서로의 블로킹을 영원히 해결할 수 없는 상태가 된다.
이러한 상황을 데드락 (Dead Lock)이라고 한다.
-
char와 varchar의 차이점을 설명해주세요
주요 비교
특성 | CHAR | VARCHAR |
---|
길이 | 고정 길이 | 가변 길이 |
저장 공간 | 항상 지정된 길이 사용 | 실제 데이터 길이 + 1~2바이트 |
패딩 | 남는 공간은 공백으로 채움 | 패딩 없음 |
검색 속도 | 빠름 | 느릴 수 있음 |
공간 효율성 | 낮음 | 높음 |
적합한 사용 사례 | 짧고 고정된 길이 데이터 | 길이가 가변적인 데이터 |
varchar vs text
VARCHAR
- 최대 길이가 (상대적으로) 크지 않은 경우
- 테이블 데이터를 읽을 때 항상 해당 컬럼이 필요한 경우
- DBMS 서버의 메모리가 (상대적으로) 충분한 경우
TEXT
- 최대 길이가 (상대적으로) 큰 경우
- 테이블에 길이가 긴 문자열 타입 컬럼이 많이 필요한 경우
- 테이블 데이터를 읽을 때 해당 컬럼이 자주 필요치 않은 경우
- 트랜잭션이 병렬로 실행될 때 발생하는 문제점에 대해서 아는대로 설명하세요
- 
[DB] 트랜잭션 격리수준 (Isolation Level) 에 쉽게 이해하기 :: 영암사는 승경이네
- 
Non Repeatable Read는 레코드의 데이터가 달라지는 것을 의미한다면
Phantom Read는 기존 조회했던 레코드의 데이터는 달라지지 않지만, 새로운 레코드가 나왔다가 사라졌다가 하는 것이다. 마치 유령처럼!! :(
- dirty read: 아직 커밋되지 않은 트랜잭션의 데이터를 읽는 경우
- non-repeatable read: 같은 데이터를 조회했는데 다른 값이 나오는 경우 (하나의 튜플에서 변경이 일어나거나 삭제가 될 때)
- phantom read: 동일한 쿼리를 보냈을 때 조회의 결과가 다른 것 (한 테이블에서 삭제나 변경이 일어날 때 ?)
-
데이터베이스 Lock의 종류에 대해 말하고 각각에 대해 설명해주세요.
- 공유 Lock
- 데이터를 읽을 때 사용한다.
- 다른 공유 Lock 과 호환되지만, 배타적 Lock 과는 호환되지 않는다.
- 즉, 자신이 읽고 있는 리소스를 다른 사용자도 같이 읽을 수 있다는 의미이다. (하지만 변경은 불가능하다는 의미)
- 배타적 Lock
- 데이터를 변경할 때 사용한다.
- 해당 Lock 은 해제될 때까지 다른 트랜잭션이 해당 리소스에 접근할 수 없다. (변경 읽기 모두 불가능하다)
- 접근하려는 리소스에 배타적 Lock 이 걸려있어 접근하지 못하고(Lock 경합 발생) 작업을 진행하지 못해 멈춰 선 상태를 블로킹(Blocking)이라고 한다.
-
락과 격리 수준의 차이점
항목 | 락 (Lock) | 격리 수준 (Isolation Level) |
---|
정의 | 데이터에 대한 접근을 제어하는 메커니즘 | 트랜잭션이 데이터에 접근할 때 다른 트랜잭션과의 상호작용을 제어하는 수준 |
- RDBMS VS NoSQL (특징, 차이점)
- flush와 commit차이점
Commit과 Flush의 차이점 요약
항목 | Commit | Flush |
---|
목적 | 트랜잭션을 완료하고 모든 변경을 영구적으로 반영 | 영속성 컨텍스트의 변경 사항을 즉시 동기화하여 데이터베이스에 반영 |
트랜잭션 상태 | 트랜잭션을 완료시킴, 롤백할 수 없음 | 트랜잭션의 중간 상태에서 호출될 수 있음 |
데이터베이스 반영 | 모든 변경 사항을 영구적으로 저장 | 변경 사항을 즉시 반영하지만 트랜잭션을 종료하지 않음 |
영속성 컨텍스트 상태 | 완료된 트랜잭션으로 상태가 변경 | 영속성 컨텍스트의 현재 상태를 데이터베이스에 동기화 |
실행 시점 | 트랜잭션 끝에서 호출 | 트랜잭션 중 언제든지 호출 가능 |
예시 | transaction.commit() | entityManager.flush() |
느낀점
혼자 학습하고 정리할 때 보다 다같이 모여 학습한 내용에 대해 질문하고 답변하는 시간을 가지니, 이해가 안됐던 부분도 서로 도움을 통해 이해할 수 있고 학습 내용을 복기할 수 있는 시간을 가질 수 있어 좋았다.
또한 책을 통해 학습 한 내용들도 있지만, 여러 블로그를 통해 학습한 내용들도 많았는데 같이 이야기 나누다보니 좀 더 정확한 정보들을 얻어낼 수 있었다.
이 다음 주제는 네트워크로 세부 주제들도 다 정해놓은 상태이지만 이 스터디 이후로 KDT에서 다함께 프로젝트를 매일 진행하다보니 현재는 잠시 중단된 상태이지만 빠른시일내로 다시 시작할 예정이다.