[기술면접] 데이터베이스

고지훈·2021년 12월 14일
1

LearningRecord

목록 보기
11/17
post-thumbnail

데이터베이스

[Key]

  • Key: 검색, 정렬 시 튜플을 구분할 수 있는 기준이 되는 Attribute
  1. Candidate Key (후보키)
    • 정의: 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합(기본키로 사용할 수 있는 속성)
    • 유일성: Key로 하나의 튜플을 유일하게 식별할 수 있음
    • 최소성: 꼭 필요한 속성으로만 구성
  2. Primary Key (기본키)
    • 정의: 후보키 중 선택한 메인 키
    • Null 값을 가질 수 없음
    • 동일한 값이 중복될 수 없음
  3. Alternate Key (대체키)
    • 후보키 중 기본키를 제외한 나머지 키
    • 보조키
  4. Super Key (슈퍼키)
    • 유일성은 만족하지만, 최소성은 만족하지 못하는 키
  5. Foreign Key (외래키)
    • 다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합

[JOIN]

  • 두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법
  • 테이블을 연결하려면 적어도 하나의 컬럼을 서로 공유하고 있어야 하므로 이를 이용하여 데이터 검색에 활용한다.
  1. INNER JOIN
    • 교집합으로, 기준 테이블과 조인을 할 테이블의 중복된 값을 보여준다.
    • SELECT 컬럼 FROM A INNER JOIN B ON A.컬럼=B.컬럼
  2. LEFT OUTER JOIN
    • 기준 테이블의 값과 조인 테이블의 중복된 값을 보여준다.
    • 왼쪽 테이블을 기준으로 JOIN을 수행한다.
    • SELECT 컬럼 FROM A LEFT OUTER JOIN B ON A.컬럼=B.컬럼
  3. RIGHT OUTER JOIN
    • 기준 테이블의 값과 조인 테이블의 중복된 값을 보여준다.
    • 오른쪽 테이블을 기준으로 JOIN을 수행한다.
    • SELECT 컬럼 FROM A RIGHT OUTER JOIN B ON A.컬럼=B.컬럼
  4. FULL OUTER JOIN
    • 합집합을 의미한다.
    • 기준 테이블과 조인 테이블의 모든 값을 보여준다.
    • SELECT 컬럼 FROM A FULL OUTER JOIN B ON A.컬럼=B.컬럼
  5. CROSS JOIN
    • 모든 경우의 수를 전부 표현해주는 방식
    • SELECT 컬럼 FROM A CROSS JOIN B
  6. SELF JOIN
    • 자기자신과 자기자신을 조인하는 것
    • 하나의 테이블을 여러번 복사해서 조인한다.
    • SELECT 컬럼 FROM A, B

[SQL Injection]

  • 해커에 의해 조작된 SQL쿼리문이 데이터베이스에 전달되어 비정상적 명령을 실행시키는 공격 기법
  1. 인증 우회
    • SQL Injection으로 공격을 할 때, 원래 보내려던 쿼리문 이외에 다른 쿼리문을 함께 전송하여 데이터베이스에 영향을 주는 것을 말한다.
    • WHERE절에 OR을 적용하여 1 = 1 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작할 수 있다.
  2. 데이터 노출
    • 시스템에서 발생하는 에러 메세지를 이용하여 공격하는 방법
    • 보통 에러는 개발자들이 버그를 수정하는 면에서 도움을 받을 수 있지만, 해커들은 이를 역 이용하여 악의적인 구문을 삽입하여 에러를 유발시킨다.

[데이터베이스에서 인덱스를 사용하는 이유]
데이터베이스에서 인덱스를 사용하는 이유는 검색성능을 향상시키기 위함이다. 하지만, 실질적으로 검색성능을 향상시키기 위해서는 해당 쿼리가 INDEX를 사용하는지 카디널리티, Selectivity같은 요소들이 고려된 인덱스가 생성되어야 한다.

일반적인 경우 장점으로는 빠른 검색 성능을 들 수 있다.
일반적인 경우 단점으로는 인덱스를 구성하는 비용 즉, 추가, 수정, 삭제 연산시에 인덱스를 형성하기 위한 추가적인 연산이 수행된다.

따라서, 인덱스를 생성할 때 트레이드 오프 관계에 놓여있는 요소들을 종합적으로 고려하여 생성해야한다.

[트랜잭션]
트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위이다. 트랜잭션에는 여러 개의 연산이 수행될 수 있다.

트랜잭션은 수행 중 한 작업이라도 실패하면 전부 실패하고 모두 성공해야 성공이라고 할 수 있다.

[ACID]

  • Atomicity: 트랜잭션의 연산은 모든 연산이 완벽히 수행되어야하며, 한 연산이라도 실패하면 트랜잭션은 실패해야한다.
  • Consistency: 트랜잭션은 유효한 상태로만 변경될 수 있다.
  • Isolation: 트랜잭션은 동시에 실행될 경우 다른 트랜잭션에 의해 영향을 받지 않고 독립적으로 실행되어야 한다.
  • Durability: 트랜잭션이 커밋된 이후에는 시스템 오류가 발생하더라도 커밋된 상태로 유지되는 것을 보장해야한다.

[트랜잭션 격리 수준]
트랜잭션 격리수준은 고립도와 성능의 트레이드 오프를 조절한다.

  • READ UNCOMMITTED: 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다.
  • READ COMMITTED: 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
  • REPEATABLE READ: 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
  • SERIALIZABLE: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.

[정규화]
정규화는 데이터의 중복방지, 무결성을 충족시키기위해 데이터베이스를 설계하는 것을 의미한다.

[RDBMS vs NOSQL]
RDBMS는 데이터베이스를 이루는 객체들의 릴레이션을 통해서 데이터를 저장하는 데이터베이스이다. SQL을 사용해 데이터의 저장, 질의, 수정, 삭제를 할 수 있으며 데이터를 효율적으로 보관하는 것을 목적으로 하고 구조화가 굉장히 중요하다.

장점은 명확한 데이터 구조를 보장하고, 중복을 피할 수 있다.

NOSQL은 RDBMS에 비해 자유로운 형태로 데이터를 저장한다. 또한 수평확장을 할 수 있고 분산처리를 지원한다. 다양한 형태의 NOSQL 데이터베이스가 있고, 대표적으로 key-value store, bigtable등이 있다.

둘은 대체될 수 있는 것이 아닌, 각각 필요한 시점에 적절히 선택해서 사용해야한다.

[Redis]
Redis는 key-value store NOSQL DB이다. 싱글스레드로 동작하며 자료구조를 지원한다. 스프링에서는 세션을 관리하거나, 캐싱을 하는데 사용된다.

[Redis와 Memcached의 차이]
Redis는 싱글 스레드 기반으로 동작하고, Memcached는 멀티 스레드를 지원해서 멀티 프로세싱이 가능하다.

Redis는 다양한 자료구조를 지원하고 Memcached는 문자열 형태로만 저장한다.

Redis는 여러 용도로 사용할 수 있도록 다양한 기능을 지원한다. 스냅샷, AOF로그를 통해 데이터 복구가 가능하다.

[Elastic Search]
Elastic Search는 자바로 개발된 오픈소스 검색엔진이다. 보통 단독으로 사용하기보다는 ELK스택이라고 불리는 Logstash, Kibana, Beats를 추가적으로 사용한다.

Inverted Index구조로 데이터를 저장해서, 전문 검색시에 RDBMS에 비해 뛰어난 성능을 보장한다.

데이터 저장, 문서 검색, 위치 검색 등 다양한 용도로 사용할 수 있다.

[CAP이론]
CAP이론은 분산 환경에서 모두를 만족하는 시스템은 없다는 이론이다.

  • Consitenty(일관성): ACID의 일관성과는 약간 다르다. 모든 노드가 같은 시간에 같은 데이터를 보여줘야한다.
  • Availability(가용성): 모든 동작에 대한 응답이 리턴되어야 한다.
  • Partition Tolerance(분할 내성): 시스템 일부가 네트워크에서 연결이 끊기더라도 동작해야한다.
profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글