지나공 : 지식을 나누는 공간

[직무인터뷰] 데이터베이스 이야기 본문

Tech Interview

[직무인터뷰] 데이터베이스 이야기

해리리_ 2021. 6. 7. 15:06

DBMS란?

데이터베이스 관리 시스템. MySQL, Oracle 등등

RDBMS란?

관계형 데이터베이스 시스템으로 key와 value들의 간단한 관계를 테이블화 시킨 데이터베이스다. 각각의 테이블끼리 서로 관계를 맺을 수 있다.

정규화와 반정규화가 뭔가?

  • 정규화 : 불필요한 데이터를 제거하고 중복을 최소화해서 각종 이상 현상을 방지하는 것.
  • 반정규화 : 시스템 성능을 향상시키기 위해 데이터 모델을 통합하는 과정.

정규화를 하면 정합성과 데이터 무결성이 보장되지만 테이블이 복잡해지고 성능이 떨어질 수 있다. 반정규화는 테이블이 단순해지고 성능이 향상되는 반면 정합성과 데이터 무결성이 보장되지 않을 수 있다.

 

*데이터 무결성

대표적으로 참조 무결성이 있는데 두 테이블의 데이터가 항상 일관된 값을 갖도록 유지하는 것이다. 어디선가 참조하고 있는 값을 함부로 지워버리면 무결성이 깨진다.

 

*정합성

데이터가 모순 없이 일관되게 일치해야 한다.

DML DDL DCL 차이

  • DML : Manipulation. insert, select, udate, delete 데이터를 조작함
  • DDL : Definition. crete, drop, alter 테이블을 정의
  • DCL : Control. commit, rollback 데이터를 컨트롤해서 실제로 저장할지 말지를 정할 수 있음.

인덱스란?

DB 검색 속도를 빠르게 도와주는 역할로 B-Tree 구조이다. 

 

*Binary Tree와 B-Tree

이진 트리는 좌우 균형이 맞지 않으면 비효율적이고 보통 O(logN)이지만 O(N)까지 갈 수도 있다.

반면 Balanced Tree는 삽입과 삭제 시 필요하면 스스로 균형을 유지하고 AVL Tree, Red-Black Tree, B-Tree가 있다.

자세한 내용은 자료구조 파트에서 다룰 것이다.

 

하튼 B-Tree는 하나의 노드에 여러 자료가 배치되는 자료구조로, 한 노드에 M개의 자료가 배치되면 M차 B-Tree가 된다.

노드의 자료 수가 N이면 자식의 수가 N+1이어야 하고, 각 노드의 자료는 정렬된 상태다. 0과 1로만 탐색하기 때문에 속도가 빠르고 이런 이유로 select 문의 where, join에서 좋은 성능을 발휘한다. 대신 insert, update, delete에서는 성능이 떨어진다.

 

인덱스를 왜 B-Tree로 할까?

1. 일반적으로 보조기억장치에서의 탐색은 시간적 부하가 많이 걸리기 때문에 탐색을 쉽게하기 위해 파일이랑은 별도로 인덱스를 만들어서 사용한다.

2. 인덱스가 커지면 인덱스 또한 보조기억장치에 저장하는데 보조기억장치는 상대적으로 느리기 때문에 보조기억장치에 접근하는 횟수를 최대한 줄여야 한다.

3. 인덱스로의 접근 횟수를 줄이려면 최대 탐색 길이, 즉 트리의 높이를 줄여야 한다.

4. 높이를 낮추려면 하나의 노드로부터 뻗은 가지의 개수를 늘려야 하고 이게 바로 B-Tree를 데이터베이스 인덱스의 자료구조로 사용하는 이유다.

 

인덱스를 사용하면 성능이 좋아지는데 왜 모든 컬럼에 인덱스를 사용하지는 않는건가?

인덱스 필드를 지정하게 되면 인덱스 값들을 저장할 수 있는 별도의 저장공간을 확보해야 하고 거기에 들어가는 연산도 비용이 들기 때문에 인덱스는 실제로 검색이 많이 되는 필드에 대해서만 설정하는 것이 좋다.

 

인덱스는 이진 트리로 구현하는데 그럼 O(logN)이고, 해시 테이블을 사용하면 O(1)인데 왜 후자를 안 쓰고 전자로 구현한건지 아는가?

둘의 속도차이는 해시가 O(1)이고 이진 트리가 O(logN)이니 엄청난 차이이긴 하지만, 해시 테이블은 equal에 적합한 자료구조다. 한 번에 정확하게 일치하는 것을 검색하는 것에 최적화된. 만약 우리가 DB에서 연산하는 것처럼 20이라는 숫자로 시작하는 모든 데이터를 찾는다고 하면, 해시 테이블은 정확하게 같은 애를 찾는 것에만 최적화되어 있는 반면 이진트리는 자기보다 큰 애, 작은 애를 다 가지고 있으니까 이동하면서 빠르게 찾을 수 있다. 그래서 해시테이블보다 이진 트리로 구현하는 것이 효율적이다.

트랜잭션이란?

하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들을 모은 것으로, 데이터베이스에서 논리적인 작업의 단위를 일컫는 말이다.

A라는 사람이 B한테 자기 돈을 송금하려 할 때 필요한 연산은 [A의 계좌에서 돈을 빼기 & B의 계좌로 보낸 뒤 입금 확인]인데 앞에 것만 된 상태에서 컴퓨터가 꺼지면 큰일난다. 연산을 모았으면 All or Nothin을 지켜야 한다.

트랜잭션의 네 가지 특성은?

ACID

  • Atomicity(원자성)
    트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아님 전혀 반영아 안되든지 둘 중 하나다.
  • Consistency(일관성)
    트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환된다.
  • Isolation(격리성)
    둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수는 없다.
  • Durability(지속성)
    성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영된다.

트랜잭션 Isolation Level이란?

트랜잭션에서 일관성이 없는 데이터를 허용하는 수준. 예를 들어 한 사용자가 어떤 데이터를 수정하고 있는 경우 다른 사용자들이 그 데이터에 접근하는 것을 차단함으로써 완전한 데이터만을 사용자에게 제공하게 된다. 또한 많은 사용자들의 수정 작업이 진행되는 중에 통계 자료를 작성할 수 없는 사용자들은 수정은 못하더라도 읽기라도 할 수 있게 isolation level을 변경할 수도 있다.

 

여러가지 종류가 있다.

  • Read Uncommitted
    다른 트랜잭션이 변경을 가하는 중이고 commit이나 rollback을 했든지와 상관 없이 다른 트랜잭션에서 데이터가 보여진다. 문제가 많아서 표준으로 쓰이진 않음.

    A 트랜잭션에서 10번 사원의 나이를 27 -> 28로 변경 중이고 커밋을 하지는 않은 상태라면 B 트랜잭션에서 10번 사원의 나이를 조회했을 때 변경 예정의 데이터인 28살로 조회된다. Dirty Read라고 한다. A트랜잭션에서 문제가 발생해 rollback이 됐더라도 B 트랜잭션은 여전히 28살로 생각하고 작업한다.
  • Read Committed
    다른 트랜잭션에서 변경하려는 내용이 commit되어야만 다른 트랜잭션에서 조회할 수 있다.
    기본적으로 사용되는 격리수준이다. 하지만 이것도 문제가 있음.

    B 트랜잭션에서 10번 사원의 나이를 조사하면 아직 A가 커밋하지 않았으니 27살로 조회된다. 그러다가 A가 최종 커밋을 하면 그제서야 B에서 28살로 조회할 수 있다. 그런데 B가 조회를 하고 있는 도중에 A가 최종커밋을 한다면 같은 B 트랜잭션 내에서 다시 조회했을 때 값이 변경된다. 이는 하나의 트랜잭션에서 같은 SELECT를 수행했을 때 항상 같은 결과를 반환해야 한다는 원칙에 어긋난다.
  • Repetable Read
    트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수있다. MySQL에서는 이걸 기본으로 사용한다.

비관계형 DB란?

key-value로 구성되어 있어서 json 형시고가 비슷하고, 대용량 데이터 처리에 효과적이다. RDB에 비해 read, write이 빠르고 복잡한 데이터 구조를 표현하기 좋다. 스키마가 없어서 확장성이 좋다.

*스키마란?

데이터베이스 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합으로, 데이터 Entity, Attribute, Relationship 및 데이터 조작 시 데이터 값이 갖는 제약 조건 등에 대해 정의한다.

MariaDB를 썼던데 MySQL 대신 사용한 이유는?

MySQL보다 가볍고 빠르다.

JDBC란?

Java Database Connectivity. 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고받을 수 있게 하는 프로그래밍 인스턴스.

JDBC와 JPA가 어느 부분에서 쓰이는 지 확인하자.

JDBC의 동작 순서는 아래와 같다.

Connection은 DB연결 객체를 말한다. 

 

Connection Pool이란?

커넥션 풀이란 일정량의 커넥션 객체를 미리 만들어서 pool에 저장하는 기법이다. 프로그램 요청이 들어오면 커넥션 객체를 빌려주고, 해당 객체의 임무가 완료되면 다시 반납 받아서 Pool에 저장한다.

 

불필요하게 커넥션을 생성하고 삭제하는 일이 사라져서 이와 관련된 비용을 줄여 성능 향상에 도움이 된다.

728x90
Comments