본문 바로가기
컴퓨터 지식/IT 기술면접 대비

[IT 면접대비] 개발자 기술면접 대비 🖥️/ 4️⃣ - 데이터베이스 (1)

by 서상혁 2021. 3. 2.

왜 데이터베이스인가요? (데이터베이스 VS 파일 시스템)

우선 가장 큰 이유는 Data를 관리하는 게 매우매우 중요하기 때문에 데이터베이스라는 시스템을 통해 관리하는게 좋습니다. 자세히 설명드리자면, 데이터베이스를 이용하게 되면 파일 시스템과 달리 응용프로그램과의 dependancy가 줄어들고, 데이터 무결성 구현도 쉬워집니다. 그리고 데이터베이스 자체적으로 보안이라던가, 일관성, 중복 문제들을 관리할 수 있게 됩니다.

 

  • 독립성
  • 무결성
  • 일관성
  • 보안성
  • 중복 최소화

 

 

인덱스란 무엇인가요?

데이터베이스에서 데이터를 읽을 때 빠르게 탐색할 수 있기 위해 설정해두는 색인같은 것 입니다. 비트리 인덱스나 해쉬 인덱스 알고리즘등이 주로 사용됩니다.

 

 

인덱스를 사용해야 하는 경우 

  • 데이터 양이 많고 검색이 변경보다 빈번한 경우
  • 인덱스를 걸고자 하는 필드의 값이 다양한 값을 가지는 경우 

 

 

정규화란 무엇인가요?

데이터베이스의 불필요한 중복을 줄이고 설계를 더 탄탄하게 재구성하는 테크닉입니다.

 

  • 제 1 정규화 : 도메인은 모두 원자값을 가지고 있어야 한다. 헌데 위키를 살펴보면 이 정의가 학자들끼리에서도 살짝 애매한 것 같다.
  • 제 2 정규화 : 부분함수 종속을 제거한다.
  • 제 3 정규화 : 이행함수 종속을 제거한다.

 

 

정규화의 장점은?

  1. 데이터베이스 변경 시 이상 현상(Anomaly) 제거 위에서 언급했던 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.

  2. 데이터베이스 구조 확장 시 재 디자인 최소화 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.

  3. 사용자에게 데이터 모델을 더욱 의미있게 제공 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.

 

 

 

정규화의 단점은?

테이블의 수가 많아져서 JOIN 연산등으로 인해 질의에 대한 응답시간이 늦어질 수도 있다. (성능저하의 가능성)

 

 

 

트랜잭션이란?

일련의 과정을 묶어서 작업의 완전성을 보장해주는 것을 의미합니다. 어떤 작업을 수행하다가 그 작업이 취소되거나 실패했을 때, 원 상태로 복구할 수 있게끔 해주고, 하나의 큰 작업의 논리적인 단위로서 역할을 수행합니다.

 

트랜잭션의 특성

  • 일관성 (consistency) : 트랜잭션이 일어나기 전과 후의 상황이 일관성을 보여야한다.
  • 원자성 (atomicity) : 일련의 과정이 하나의 원자 처럼 이루어져야 하며, 중간에 실패하거나 오류가 생겨도 다 실패하거나 다 성공한 것처럼 작동해야 한다.
  • 고립성 (isolation) : 외부 영향과 관계없이 수행되어야 한다.
  • 지속성 (Durability) : 트랜잭션의 결과는 DB 결과에 영구적으로 반영되어야 한다.

 

주요 키워드

  • Lock
  • DeadLock

 

 

NOSQL 이란?

우리가 가장 흔히 쓰는 데이터베이스 종류가 RDB, 즉 relational database 이기 때문에, 그 형태를 띄지 않는 데이터베이스들을 NOSQL 이라고 부릅니다(SQL = structure query language). NoSQL은 종류나 형태가 다양하며, 흔히 redis, 몽고DB, hbase 등이 있습니다.

 

 

저장 방식에 따른 NoSQL 분류

Key-Value Model, Document Model, Column Model, Graph Model로 분류할 수 있다.

 

1. Key-Value Model

가장 기본적인 형태의 NoSQL 이며 키 하나로 데이터 하나를 저장하고 조회할 수 있는 단일 키-값 구조를 갖는다. 단순한 저장구조로 인하여 복잡한 조회 연산을 지원하지 않는다. 또한 고속 읽기와 쓰기에 최적화된 경우가 많다. 사용자의 프로필 정보, 웹 서버 클러스터를 위한 세션 정보, 장바구니 정보, URL 단축 정보 저장 등에 사용한다. 하나의 서비스 요청에 다수의 데이터 조회 및 수정 연산이 발생하면 트랜잭션 처리가 불가능하여 데이터 정합성을 보장할 수 없다. ex) Redis

 

2. Document Model

키-값 모델을 개념적으로 확장한 구조로 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다. 논리적인 데이터 저장과 조회 방법이 관계형 데이터베이스와 유사하다. 키는 문서에 대한 ID 로 표현된다. 또한 저장된 문서를 컬렉션으로 관리하며 문서 저장과 동시에 문서 ID 에 대한 인덱스를 생성한다. 문서 ID 에 대한 인덱스를 사용하여 O(1) 시간 안에 문서를 조회할 수 있다.

대부분의 문서 모델 NoSQL 은 B 트리 인덱스를 사용하여 2 차 인덱스를 생성한다. B 트리는 크기가 커지면 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능이 떨어지게 된다. 그렇기 때문에 읽기와 쓰기의 비율이 7:3 정도일 때 가장 좋은 성능을 보인다. 중앙 집중식 로그 저장, 타임라인 저장, 통계 정보 저장 등에 사용된다. ex) MongoDB

 

3. Column Model

하나의 키에 여러 개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다. 모든 컬럼은 항상 타임 스탬프 값과 함께 저장된다.

구글의 빅테이블이 대표적인 예로 차후 컬럼형 NoSQL 은 빅테이블의 영향을 받았다. 이러한 이유로 Row key, Column Key, Column Family 같은 빅테이블 개념이 공통적으로 사용된다. 저장의 기본 단위는 컬럼으로 컬럼은 컬럼 이름과 컬럼 값, 타임스탬프로 구성된다. 이러한 컬럼들의 집합이 로우(Row)이며, 로우키(Row key)는 각 로우를 유일하게 식별하는 값이다. 이러한 로우들의 집합은 키 스페이스(Key Space)가 된다.

대부분의 컬럼 모델 NoSQL 은 쓰기와 읽기 중에 쓰기에 더 특화되어 있다. 데이터를 먼저 커밋로그와 메모리에 저장한 후 응답하기 때문에 빠른 응답속도를 제공한다. 그렇기 때문에 읽기 연산 대비 쓰기 연산이 많은 서비스나 빠른 시간 안에 대량의 데이터를 입력하고 조회하는 서비스를 구현할 때 가장 좋은 성능을 보인다. 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소 등의 서비스 구현에 적합하다.

 

 

 

참고

- 정규화

   - 3months.tistory.com/193

   - nirsa.tistory.com/107

- db 인덱스 : itholic.github.io/database-index/

 

 

 

728x90

댓글