2차 CS 스터디 _ DB

김지민·2025년 3월 2일
0

회고록

목록 보기
7/11

일시: 2024.12.27
장소: 용산 청년지음
주제:

DB

  1. 트랜잭션
  2. 격리수준 (Isolation Level)
    • SERIALIZABLE
    • REPEATABLE READ
    • READ COMMITTED
    • READ UNCOMMITED
  3. 데이터베이스 락
  4. pk id길이가 길어지면 일어나는일
  5. JPA flush 시점
  6. 데이터베이스 자료형
  7. 정규화
  8. 데이터베이스 특징
  9. 조인
  10. rdbms/nosql
  11. 튜닝
  12. 데이터베이스 인덱스
  13. 클러스터링과 리플리케이션
  14. 관계 / 키

진행방법

  1. 6명이서 각자 해당 주제에 대해 학습한 내용을 매주 2회 온라인으로 발표한 후 질문을 준비해온다.
  2. 한명씩 준비해온 질문을 하나씩 번갈아가며 질문한 후 자유롭게 대답한다.
  3. 대답에 대한 피드백을 서로 주고 받으며 답변을 구체화 시키며 학습한 내용을 복기한다.

질문 및 피드백

  1. 인덱스와 키의 차이점은 무엇인가요

    • 키는 데이터의 고유성과 참조 무결성을 보장 인덱스는 검색 속도를 높이기 위한 자료 구조이다.
  2. 트랜잭션의 커밋과 롤백의 차이에 대해서 설명하세요

    • 커밋: 트랜잭션이 끝나면 데이터베이스에 영구적으로 저장
    • 롤백: 트랜잭션이 취소되고 데이터베이스를 트랜잭션 이전의 상태로 복구
    • 트랜잭션 관리자 트랜잭션의 생명 주기를 관리하는 컴포넌트 격리 수준 관리, 커밋, 롤백 관리…
  3. 영속성 컨텍스트와 그 기능을 말해보세요.

    • 영속성 컨텍스트는 엔티티를 영속화하는 환경입니다.
      트랜잭션이 커밋되면 영속성 컨텍스트에 있는 쓰기 지연 SQL 저장소의 쿼리들이 db로 날라가고, 데이터들이 영구적으로 저장됩니다.
  4. 정규화(Normalization)와 비정규화(Denormalization)의 장단점은 무엇인가요?

    • 정규화 : 중복을 최소화 하도록 설계, 상당수의 일시적 질의문을 처리하기 위해 많은 조인을 사용한다.
    • 비정규화 : 읽는 시간을 최적화 하도록 설계, 조인 연산 비용을 줄인다, 규모 확장성을 실현하고자 자주 사용, 갱신 이나 삽입 비용이 많이 듬, 일관성, 저장공간 이슈
  5. JOIN에 대해서 설명해주세요.

    1. JOIN은 데이터베이스에서 두 개 이상의 테이블을 결합하여 하나의 결과 집합으로 만드는 연산입니다.
      1. inner join : 교집합
      2. outer join
        1. left : 왼쪽 기준
        2. right : 오른쪽 기준
        3. full outer → 누락된 값을 찾기 위해서 사용.
      3. cross join : 모든 조합
    2. union(중복 X) vs union all(중복 O)
  6. PK 길이가 길어질 때의 문제와 해결방안

    문제 유형문제 상황해결 방법
    성능 문제인덱스 크기, 비교 비용int, bigint PK를 사용
    저장 공간 문제테이블, FK 크기 증가숫자형 PK로 교체
    운영 문제파티셔닝, 샤딩 문제해시 키를 기반으로 샤딩
    페이지 스플릿페이지 스플릿 발생숫자형 PK로 교체, 클러스터 인덱스

    클러스터형 인덱스 - PK를 기준으로 테이블을 정렬, 테이블 자체가 인덱스

  7. RDBMS가 수평확장(서버를 늘리는 확장) 에 불리한 이유는 무엇인가요?

    1.관계형 데이터 구조상 테이블의 관계를 외래 키 등으로 유지함으로 여러 서버에 나누어 저장하면 이러한 관계를 유지하기 어렵습니다.

    2.조인이 필요한 경우 데이터가 여러 서버에 분산되어 있으면 각 서버에서 데이터를 가져와 결합하여 하므로 성능 저하가 발생합니다.

  8. 데이터 무결성을 지키기 위한 제약 조건을 설명하세요

    • 개체 무결성: PK는 중복 안되고 null도 안된다
    • 참조 무결성: 외래키는 null 값을 못 가지고, 참조 테이블의 기본키와 동일해야 한다
    • 도메인 무결성: 속성에 지정된 값만 가질 수 있다
  9. 클러스터링의 장단점에 대해 말해주세요.

    • (장) 서버가 두 대 이상으로 이뤄져있기 때문에, 한 서버가 다운돼도 서비스에 지장이 가지 않는다.
    • (단) 데이터 갱신을 하려면 (갱신하려는) 서버 외에 다른 서버들이 요청 수락을 해줘야 하기 때문에 병목현상이 발생할 수 있다.
      1. 1개의 노드에 쓰기 트랜잭션이 수행되고, Commit 실행
      2. 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청
      3. 다른 노드에서 복제 요청을 수락했다는 신호를 보내고, 디스크에 쓰기를 시작
      4. 다른 노드로부터 신호를 받으면 실제 디스크에 데이터를 저장
  10. DB 튜닝이란?

    1. 단순한 퍼포먼스 향상이 아니라 자주 호출하는 SQL이나 프로그램에서 호출되는 SQL 경로등 운영체제, 미들웨어 영역까지 확장해서 자원을 범위로 성능을 향상 시키고 탐색하는 것
  11. Primary Key, Foreign Key에 대해 설명해 보세요.
    Primary Key(기본 키)는 데이터베이스 테이블에서 각 행(row)을 고유하게 식별하는 열(column) 또는 열의 조합을 말합니다. 키가 소속된 테이블에서 중복되지 않아야 하며, 모든 행은 기본 키 값을 가집니다. 주로 이 키가 식별자(identifier)로 사용됩니다. 각 행을 고유하게 식별하기 때문에 검색, 수정, 삭제, 구분 등의 작업에서 유용하게 사용됩니다.

    Foreign Key(외래 키)는 한 테이블의 열(column)이 다른 테이블의 기본 키(primary key)를 참조하는 역할을 합니다. 다른 테이블과의 관계를 형성하여 데이터간의 일관성과 무결성(Integrity)을 유지하는 것에 사용합니다.
    
    외래 키 제약 조건은 데이터베이스 시스템에서 외래 키 값을 검증하고 관리하는 것에 사용합니다. 조건은 부모 테이블(참조 테이블)의 값과 일치하지 않거나 해당 값이 null 상태일 때도 똑같이 적용됩니다.
  12. 데드락에 대해 설명해주세요

    • 두 트랜잭션 모두가 블로킹 상태에 진입하여 서로의 블로킹을 해결할 수 없는 상태입니다.
      트랜잭션 A, B에서 A가 B 트랜잭션에 대해 블로킹 상태로 진입한 경우에, B 트랜잭션이 종료(커밋 or 롤백)되어야 해당 블로킹이 끝나고 트랜잭션 A의 작업이 정상적으로 수행된다. 그러나 해당 상황의 B 트랜잭션에서 A에 대해 블로킹 상태로 진입한다면 마찬가지로 A 트랜잭션이 종료(커밋 or 롤백)되어야 해당 블로킹이 끝나고 트랜잭션 B의 작업이 정상적으로 수행된다. 이때 A와 B가 모두 상대 트랜잭션의 종료를 기다리고 있게 되어 서로의 블로킹을 영원히 해결할 수 없는 상태가 된다.
      이러한 상황을 데드락 (Dead Lock)이라고 한다.
  13. char와 varchar의 차이점을 설명해주세요

주요 비교

특성CHARVARCHAR
길이고정 길이가변 길이
저장 공간항상 지정된 길이 사용실제 데이터 길이 + 1~2바이트
패딩남는 공간은 공백으로 채움패딩 없음
검색 속도빠름느릴 수 있음
공간 효율성낮음높음
적합한 사용 사례짧고 고정된 길이 데이터길이가 가변적인 데이터

varchar vs text

VARCHAR

  • 최대 길이가 (상대적으로) 크지 않은 경우
  • 테이블 데이터를 읽을 때 항상 해당 컬럼이 필요한 경우
  • DBMS 서버의 메모리가 (상대적으로) 충분한 경우

TEXT

  • 최대 길이가 (상대적으로) 큰 경우
  • 테이블에 길이가 긴 문자열 타입 컬럼이 많이 필요한 경우
  • 테이블 데이터를 읽을 때 해당 컬럼이 자주 필요치 않은 경우
  1. 트랜잭션이 병렬로 실행될 때 발생하는 문제점에 대해서 아는대로 설명하세요
    -
    [DB] 트랜잭션 격리수준 (Isolation Level) 에 쉽게 이해하기 :: 영암사는 승경이네
    -

Non Repeatable Read는 레코드의 데이터가 달라지는 것을 의미한다면

Phantom Read는 기존 조회했던 레코드의 데이터는 달라지지 않지만, 새로운 레코드가 나왔다가 사라졌다가 하는 것이다. 마치 유령처럼!! :(

  • dirty read: 아직 커밋되지 않은 트랜잭션의 데이터를 읽는 경우
  • non-repeatable read: 같은 데이터를 조회했는데 다른 값이 나오는 경우 (하나의 튜플에서 변경이 일어나거나 삭제가 될 때)
  • phantom read: 동일한 쿼리를 보냈을 때 조회의 결과가 다른 것 (한 테이블에서 삭제나 변경이 일어날 때 ?)
  1. 데이터베이스 Lock의 종류에 대해 말하고 각각에 대해 설명해주세요.

    • 공유 Lock
      • 데이터를 읽을 때 사용한다.
      • 다른 공유 Lock 과 호환되지만, 배타적 Lock 과는 호환되지 않는다.
      • 즉, 자신이 읽고 있는 리소스를 다른 사용자도 같이 읽을 수 있다는 의미이다. (하지만 변경은 불가능하다는 의미)
    • 배타적 Lock
      • 데이터를 변경할 때 사용한다.
      • 해당 Lock 은 해제될 때까지 다른 트랜잭션이 해당 리소스에 접근할 수 없다. (변경 읽기 모두 불가능하다)
    • 접근하려는 리소스에 배타적 Lock 이 걸려있어 접근하지 못하고(Lock 경합 발생) 작업을 진행하지 못해 멈춰 선 상태를 블로킹(Blocking)이라고 한다.
  2. 락과 격리 수준의 차이점

항목락 (Lock)격리 수준 (Isolation Level)
정의데이터에 대한 접근을 제어하는 메커니즘트랜잭션이 데이터에 접근할 때 다른 트랜잭션과의 상호작용을 제어하는 수준
  1. RDBMS VS NoSQL (특징, 차이점)
  2. flush와 commit차이점

Commit과 Flush의 차이점 요약

항목CommitFlush
목적트랜잭션을 완료하고 모든 변경을 영구적으로 반영영속성 컨텍스트의 변경 사항을 즉시 동기화하여 데이터베이스에 반영
트랜잭션 상태트랜잭션을 완료시킴, 롤백할 수 없음트랜잭션의 중간 상태에서 호출될 수 있음
데이터베이스 반영모든 변경 사항을 영구적으로 저장변경 사항을 즉시 반영하지만 트랜잭션을 종료하지 않음
영속성 컨텍스트 상태완료된 트랜잭션으로 상태가 변경영속성 컨텍스트의 현재 상태를 데이터베이스에 동기화
실행 시점트랜잭션 끝에서 호출트랜잭션 중 언제든지 호출 가능
예시transaction.commit()entityManager.flush()

느낀점

혼자 학습하고 정리할 때 보다 다같이 모여 학습한 내용에 대해 질문하고 답변하는 시간을 가지니, 이해가 안됐던 부분도 서로 도움을 통해 이해할 수 있고 학습 내용을 복기할 수 있는 시간을 가질 수 있어 좋았다.

또한 책을 통해 학습 한 내용들도 있지만, 여러 블로그를 통해 학습한 내용들도 많았는데 같이 이야기 나누다보니 좀 더 정확한 정보들을 얻어낼 수 있었다.

이 다음 주제는 네트워크로 세부 주제들도 다 정해놓은 상태이지만 이 스터디 이후로 KDT에서 다함께 프로젝트를 매일 진행하다보니 현재는 잠시 중단된 상태이지만 빠른시일내로 다시 시작할 예정이다.

profile
백엔드 개발자를 준비하는 삐약이 대학생에서 .. 취준생🐣

0개의 댓글