제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
접은 글을 통해 먼저 답변을 해보시고 제가 정리한 답을 확인해보시기 바라겠습니다!!

면접을 위한 CS 전공지식 노트(주홍철 저)을 통해 정리한 포스팅입니다.

면접 리스트

데이터베이스는 무엇인가요?

더보기

데이터베이스는 일정한 규칙, 규약을 통해 구조화되어 저장되어 있는 데이터의 모음입니다. 이를 관리하는 시스템DBMS라고 하며 각 DBMS마다 쿼리 언어를 통해 삽입, 삭제, 수정, 조회를 수행할 수 있습니다.

중첩 루프 조인이 무엇인가요?

더보기

중첩 루프 조인은 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이며 랜덤 접근에 대한 비용이 많이 증가하므로 대용량의 테이블에서는 사용하지 않습니다.

인덱스는 매 필드마다 설정하는 것이 좋나요?

더보기

인덱스두번의 탐색이 이루어집니다. 인덱스 리스트와 컬렉션으로 탐색이 진행되기 때문에 읽기 관련 비용이 더 들게 됩니다. 또 데이터 삽입 시나 수정 시에 인덱스가 수정되어야하기 때문에 모든 필드에 대해서 인덱스를 지정하는 것은 오히려 성능 저하를 야기합니다. 따라서 인덱스는 카디널리티가 높은 값으로 인덱스를 설정해야합니다.

정리

더보기

데이터베이스 기본


데이터베이스일정한 규칙, 혹은 규약을 통해 구조화되어 저장되어 있는 데이터 모음.

데이터베이스를 제어 및 관리하는 통합 시스템DBMS라고 하며데이터베이스 안에 있는 데이터들은 특정 DBMS마다 특정 쿼리 언어를 통해 CRUD 가능.

실시간 접근과 동시 공유가 가능.

엔티티

  • 여러개의 속성을 가진 명사를 의미.
  • 서비스의 요구사항에 맞춰 속성이 정해짐.

약한 엔티티와 강한 엔티티

  • 혼자서 존재하지 못하면 약한 엔티티 그 반대면 강한 엔티티

릴레이션

  • 데이터베이스에서 정보를 구분하여 저장하는 기본 단위.
  • 엔티티에 관한 데이터를 릴레이션 하나에 담아서 관리.
  • 관계형 데이터베이스에서는 테이블이라고 하며 NoSQL에서는 컬렉션이라고 함.

테이블과 컬렉션

  • RDBMS의 구조: 레코드 - 테이블 - 데이터베이스로 이루어져있음
  • NoSQL의 구조: 도큐먼트 - 컬렉션 - 데이터베이스로 이루어져있음.

속성

  • 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보.
  • 서비스의 요구사항을 기반으로 관리해야할 필요가 있는 속성들만 엔티티의 속성

도메인

  • 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합.(속성들의 집합)
  • 성별이라는 속성에 [남, 여]라는 집합이 도메인

필드와 레코드

  • 필드속성을 표현한 값.
  • 레코드테이블에서의 하나의 행. 튜플이라고 하기도 함.

필드 타입

  • 타입은 DBMS마다 다름. 여기서는 MySQL 기준
  • 숫자 타입
    • TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 가 존재
  • 날짜 타입
    • DATE
      • 날짜 부분만 존재
      • 3바이트용량
    • DATETIME
      • 날짜 + 시간
      • 8바이트 용량
    • TIMESTAMP
      • DATETIME보다 조금 더 큰 범위 지원
      • 4바이트 용량
  • 문자 타입
    • CAHR + VARCHAR
      • 그 안에 수를 입력해서 몇자까지 입력할 것인지 지정. CHAR(30)
      • CHAR
        • 고정 길이 문자열. 0 ~ 255 값.
        • CHAR(100)이라고 하고 10글자 지정하면 100글자 저장
      • VARCHAR
        • 가변 길이 문자열. 0 ~ 65,535 사이 값으로 지정
        • 입력된 데이터에 따라 용량을 가변시켜 저장.
        • 길이 저장용 1바이트가 필요.
    • TEXT + BLOB
      • TEXT
        • 큰 문자열 저장에 쓰이며 게시판의 본문을 저장할 때 쓰임
      • BLOB
        • 이미지, 동영상 등 큰 데이터 저장에 사용.
        • 보통 이미지나 동영상의 경로로 사용함.
    • ENUM과 SET
      • ENUM
        • ENUM 형태로 쓰이며, 하나만 선택하는 단일 선택만 가능하고 잘못된 값을 삽입하면 빈 문자열이 대신 삽입.
        • 0, 1등으로 매핑되어 메모리를 적게 사용하는 이점이 있음.
      • SET
        • ENUM과 비슷하지만 여러개의 데이터를 선택할 수 있고 비트 단위의 연산을 할 수 있으며 최대 64개의 요소를 집어넣을 수 있다는 점.

관계

여러개의 테이블이 존재하고 각 테이블 간의 연관 관계가 정의 되어 있음.

1:1 관계

  • 두개의 테이블로 나누어 테이블의 구조를 이해하기 쉽게 만들어 줌.

1:N 관계

  • 한 유저당 여러개의 상품을 장바구니에 넣을 때

N:M 관계

  • 여러명의 학생이 여러개의 강의를 들을 때
  • 중간에 테이블을 두어 1:N, 1:M으로 분리함.

테이블 자체의 인덱스를 위해 설정된 장치.

기본키

  • 유일성과 최소성을 만족하는 키
  • 자연키 또는 인조키중에 골라 설정
  • 자연키
    • 속성의 값으로 들어가 있는 값.
  • 인조키
    • 인공적으로 키를 만드는 것.

외래키

  • 다른 테이블의 기본키를 그대로 참조하는 값.
  • 개체와의 관계를 식별하는데 사용
  • 중복 가능

후보키

  • 기본키가 될 수 있는 후보들
  • 유일성과 최소성을 동시에 만족하는 키

슈퍼키

  • 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키

대체키

  • 후보키가 두개 이상일 경우 기본키를 지정하고 나머지 키를 의미

ERD와 정규화 과정


릴레이션을 정의하고 릴레이션 간의 관계를 정의한 것.

ERD 중요성

  • 시스템의 요구사항을 기반으로 작성되며 ERD를 기반으로 데이터베이스 구축.
  • 구축한 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우 설계도 역할들 담당.

정규화 과정

  • 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나 이를 해결하거나 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정
  • 이상현상이란 데이터베이스의 무결성 등과 같은 현상

정규형 원칙

  • 자료의 중복성은 감소해야하며, 독립적인 관계는 별개의 릴레이션으로 표현해야함.

제 1 정규형

  • 릴레이션의 모든 도메인은 더이상 분해될 수 없는 원자 값으로만 구성되어 있어야 함.
  • 한개의 기본키에 두개 이상의 값을 가지는 반복 집합이 있으면 안됨.

제 2 정규형

  • 제 1정규형을 포함하며 부분함수 종속성을 제거한 형태
  • 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것을 의미.
  • 릴레이션 분해. 무손실 분해 필요

제 3정규형

  • 제 2정규형이며 기본키가 아닌 모든 속성은 이행적 함수 종속을 만족하지 않는 상태
  • 이행적 함수 종속: A → B이고 B → C이면 A → C인 것.

보이스/코드 정규형

  • 제 3정규형이며 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 모든 결정자가 후보키인 상태.

정규화 과정은 테이블 조인이 필수적이므로 더 느려지기도 함. 비정규화 과정을 거치기도 함.

트랜잭션과 무결성


트랜잭션

  • 하나의 논리적인 기능을 수행하기 위한 작업의 단위.
  • 데이터베이스에 접근하는 방법 ⇒ 쿼리
  • 여러개의 쿼리를 하나로 묶는 단위 ⇒ 트랜잭션

원자성

  • all or nothing
  • 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징.
  • 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것.
  • 트랜잭션 단위로 여러 로직을 묶을 때 외부 API를 호출하는 것이 있으면 안됨. ⇒ 롤백이 일어났을 때 어떻게 대처해야할지 해결방법이 필요함
💡

커밋과 롤백

커밋은 여러 쿼리가 썽공적으로 처리되었다고 확정하는 명령어. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것.

에러나 이슈때문에 트랜잭션 이전으로 돌리기 위해서는 롤백. 롤백이란 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일.


데이터의 무결성이 보장. 데이터 변경 전에 변경사항을 쉽게 확인할 수 있고 해당 작업을 그룹화 할 수 있음.

💡
트랜잭션 전파
트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 함. 여러 트랜잭션 관련 메소드 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 함.

 

일관성

  • 허용된 방식으로만 데이터를 변경해야하는 것을 의미.
  • 조건과 규칙에 따라 유효함을 가져야함.

격리성

  • 트랜잭션 수행 시 다른 트랜잭션이 서로 끼어들지 못하는 것을 의미.
  • 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동해야하고
    데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 함.
  • 여러개의 격리 수준으로 나누어 격리성을 보장
    • 위로 갈수록 동시성은 강해지고 격리성은 약해짐.
💡 부작용
팬텀 리드
한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우 ⇒ 조회 갯수가 다른 경우

반복 가능하지 않은 조회
같은 행에 두번 이상 조회가 발생했는데 그 값이 다른 경우 ⇒ 값이 다른 경우

더티 리드
반복가능하지 않은 조회와 유사하며 한 트랜잭션이 실행중 일 때 다른 트랜잭션이 수정되었지만 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 때 발생
  • SERIALIZABLE
    • 트랜잭션을 순차적으로 진행 시키는 것.
    • 여러 트랜잭션이 동시에 같은 행에 접근할 수 없음.
    • 해당 행에 대해 격리 시키고 다른 트랜잭션이 이 행에 작업을 하기 위해서는 기다려야함 ⇒ 데드락의 가능성
    • 가장 성능이 떨어짐
  • REPEATABLE_READ
    • 팬텀 리드 발생 가능
    • 하나의 트랜잭션이 수정한 해을 다른 트랜잭션이 수정할 수 없도록 막아주지만 추가하는 것은 막지 않는 것.
    • MySQL8.0의 innoDB의 기본 값.
  • READ_COMMITTED
    • 팬텀 리드, 반복 가능하지 않은 조회 발생가능
    • 가장 많이 사용되는 격리 수준, 오라클의 기본값.
    • 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없음.
    • 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있음.
  • READ_UNCOMMITTED
    • 팬텀 리드, 반복 가능하지 않은 조회 발생, 더티 리드 발생 가능
    • 하나의 트랜잭션이 커밋되기 전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠름
    • 데이터 무결성을 위해 되도록 사용하지 않는 것이 좋음.

지속성

  • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미.
  • 회복 기능이 필요함.
  • 데이터베이스는 이를 위해서 체크섬, 저널링, 롤백등의 기능을 제공

무결성

  • 데이터의 정확성, 일관성, 유효성을 유지하는 것.
  • 개체 무결성
    • 기본 키로 선택된 필드는 빈 값을 허용하지 않습니다
  • 참조 무결성
    • 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야합니다.
  • 고유 무결성
    • 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 해당 값은 항상 고유한 값을 가져야합니다.
  • NULL 무결성
    • 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건

데이터베이스의 종류


관계형 데이터베이스

  • 행과 열을 가지는 표 형식의 데이터를 저장하는 데이터베이스
  • SQL 언어 사용.
  • MySQL
    • 대부분의 운영체제와 호환되며 가장 많이 사용
    • C, C++ 기반
    • 인덱스 압축 기술, B-트리 기반, 스레드 기반의 메모리 할당, 빠른 조인, 64개의 인덱스 제공
    • 롤백, 커밋, 이중 암호 지원 보안 등의 기능 제공
    • 스토리지 엔진
      • 모듈식 아키텍처로 쉽게 스토리지 엔진을 바꿀 수 있으며 데이터 웨어 하우징, 트랜잭션 처리, 고가용성 처리에 강점.
      • 스토리지 엔진 위에는 커넥터 API 및 서비스 계층을 통해 MySQL 데이터베이스와 상호 작용
    • 쿼리 캐시
      • 입력된 쿼리 문에 대해 전체 결과 집합을 저장
      • 동일한 쿼리 시 캐시의 출력만 표시 ⇒ 구문 분석 최적화 건너 뜀
  • PostgreSQL
    • 디스크 조각이 차지하는 영역을 회수할 수 있는 장치.
    • JSON을 이용하여 데이터에 접근 가능
    • 복구 기능, 로깅, 접근 제어, 중첩된 트랜잭션, 백업 가능.

NoSQL 데이터베이스

  • MongoDB
    • JSON을 통해 데이터에 접근하고 BinayJSON 형태로 데이터가 저장되어 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스
    • 확장성이 뛰어나며 빅데이터를 저장할 때 성능이 좋고 고 가용성과 샤딩, 레플리카셋을 지원.
    • 스키마를 정해놓지 않고 데이터를 삽입할 수 있기 때문에 다양한 도메인의 데이터베이스를 기반으로 분석하거나 로깅등을 구현할 때 강점.
    • 도뮤먼트를 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값인 ObjectID 생성
      • 유닉스 기반 타임스탬프(4byte) 랜덤 값(5 바이트), 카운터(3바이트)로 이루어져있음
  • Redis
    • 인메모리 데이터베이스이자 키-값 데이터 모델 기반의 데이터베이스
    • 기본 데이터 타입은 문자열. 512MB까지 저장 가능. set, hash 지원
    • pub/sub 기능을 통한 채팅 시스템, 캐싱 계층, 정렬 셋을 시용해 순위표 서비스에 사용 가능.

인덱스


인덱스의 필요성

  • 데이터를 빠르게 찾을 수 있는 하나의 장치.

B-트리

  • 인덱스는 보통 B-트리 기반
  • 루트 노드, 리프 노드, 리프노드와 루트 노드 사이의 브랜치 노드
  • 트리의 깊이가 리프 노드 수에 비해 느리게 성장.

인덱스 만드는 방법

MySQL

  • 클러스터형 인덱스
    • 테이블당 하나.
    • primary key 옵션으로 만들면 기본적으로 생성되고 기본키를 만들지 않고 unique not null 옵션을 통해서도 생성 가능.
  • 세컨더리 인덱스
    • create index 명령어로 세컨더리 인덱스 생성 가능.
    • 하나의 인덱스가 필요할 때는 클러스터형 인덱스만 있는 것이 좋음

MongoDB

  • 도큐먼트를 생성하면 자동적으로 ObjectID 형성.
  • 해당 키가 기본키로 설정.
  • 복합 인덱스로 설정 가능

인덱스 최적화 기법

인덱스는 비용

  • 인덱스는 두번 탐색해야 함.
    • 인덱스 리스트 + 컬렉션 수능로 탐색.
    • 관련 읽기 비용
  • 컬렉션이 수정되었을 때 인덱스도 수정되어야 함.

항상 테스팅해라

  • 인덱스 최적화는 서비스마다 다름.
  • explain() 함수를 통해 테스팅하며 걸리는 시간 최소화.

복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순

  • 어떠한 값과 같음을 비교하는 ==나 equal이 있다면 제일 먼저 인덱스로 설정
  • 정렬에 쓰는 필드라면 다음 인덱스
  • 다중 값을 출력해야 하는 필드면 나중 인덱스
  • 유니크한 값의 정도 = 카디널리티. 카디널리티가 높은 순으로 인덱스를 생성.

조인의 종류


하나의 테이블이 아닌 두개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것

내부 조인

  • 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만을 표기

왼쪽 조인

  • 왼쪽 테이블모든 행이 결과 테이블에 표기

오른쪽 조인

  • 오른쪽 테이블모든 행이 결과 테이블에 표기

합집합 조인

  • 두개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기

조인 원리


중첩 루프 조인

  • Nested Loop Join중첩 for문과 같은 원리로 조건에 맞는 조인
  • 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음

정렬 병합 조인

  • 각 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인.
  • 적절한 인덱스가 없고 대용량의 테이블을 조인하고 조인 조건으로 < , >등 범위 비교 연산자가 있을 때 사용

해시 조인

  • 해시 테이블을 기반으로 조인하는 방법.
  • 동등 조인에서만 사용 가능.
  • MySQL 방법

 

 

참조

더보기
  • 면접을 위한 CS 전공지식 노트(주홍철 저) -길벗

+ Recent posts