Home interview - database
Post
Cancel

interview - database

DBMS란 무엇인지, DB를 사용하는 이유
  • 여러 사용자가 DB에 접근해 사용할 수 있도록 하는 소프트웨어를 의미
  • 파일의 데이터 중복, 비일관성, 검색 등의 문제를 해결할 수 있다.
DB 특징에 대해 설명
  • 실시간 접근성(Real-Time Accessibility): 비정형적인 조회에 대해 실시간 응답이 가능해야 한다.
  • 지속적인 변화(Continuous Evolution): DB 상태는 동적이다. 즉, 새로운 데이터의 CUD 요청으로 항상 최신의 데이터를 유지해야한다.
  • 동시 공용(Concurrent Sharing): DB는 다수 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야한다.
  • 내용에 의한 참조(Content Reference): DB는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터 내용으로 찾는다.
DDL, DML, DCL 차이
  • DDL(정의어: Data Definition Language) : DB 구조를 정의, 수정, 삭제하는 언어 (ALTER, CREATE, DROP)
  • DML(조작어: Data Manipulation Language) : DB 내의 자료 검색,삽입,갱신,삭제를 위한 언어 (SELECT, INSERT, UPDATE, DELETE)
  • DCL(제어어: Data Control Language) : 데이터에 대해 무결성 유지, 병행, 수행 제어, 보호와 관리를 위한 언어 (COMMIT, ROLLBACK, GRANT, REVOKE)
SELECT 쿼리 수행 순서

query-execute-seq.png

  • FROM, JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT

FROM, JOIN

  • 테이블을 지정하고 JOIN을 실행하여 하나의 가상 테이블로 결합

WHERE

  • 조건에 맞는 데이터를 필터링

GROUP BY

  • 선택한 칼럼을 기준으로 조회한 레코드 목록을 그룹핑

HAVING

  • 그룹핑 후에 각 그룹에 사용되는 조건절

SELECT

  • 조건들을 처리한 후 남은 데이터에서 어떤 열을 출력해줄지 선택

ORDER BY

  • 행의 순서를 어떻게 보여줄지 정렬

LIMIT

  • 결과를 몇개를 보여줄지 선택
Index에 대해 설명
  • 테이블에서 특정 컬럼을 기준으로 자료를 정렬하는 것
  • 인덱스는 항상 정렬된 상태를 유지하기 때문에, INSERT, UPDATE, DELETE시 실행 속도가 저하된다.
  • 저장용량이 증가한다. (약 DB 크기의 10 %)
DB의 Index 관리 방식

B+Tree

  • 자식 노드가 2개 이상인
트랜잭션 이란?
  • 트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있으며, 트랜잭션에는 여러개의 연산이 수행될 수 있습니다.
  • 트랜잭션은 수행중에 한 작업이라도 실패하면 전부 실패하고, 모두 성공해야 성공이라고 할 수 있습니다.
트랜잭션 특징 (ACID)
  • Atomicity(원자성): 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 한다.
  • Consistency(일관성): 트랜잭션 이전과 이후, 일관성 있는 DB 상태로 유지한다.
  • Isolation(고립성): 두 개 이상의 트랜잭션이 동시에 실행될 때 서로의 연산에 영향을 주면 안된다.
  • Durability(영구성): 커밋된 트랜잭션은 영구히 반영되어야 한다.
트랜잭션 격리수준
  • READ UNCOMMITTED: 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다.
  • READ COMMITTED: 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
  • REPEATABLE READ: 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
  • SERIALIZABLE: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.(성능 매우 떨어짐).
DB Lock

DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법으로, 데이터에 접근하기 전에 Lock을 요청해서 Lock이 허락되면 해당 데이터에 접근할 수 있도록 하는 기법입니다.
DB Lock의 종류는 크게 두 가지로, 비관적 락과 낙관적 락이 있습니다.

  • 비관적 락 (Pessimistic Lock) : 데이터 갱신 시 충돌이 발생할 것으로 예상해 락을 거는 방식
    • 공유락(Shared Lock) : 사용 중인 데이터를 다른 트랜잭션이 읽기 허용, 쓰기 비허용
    • 베타락(Exclusive Lock) : 사용 중인 데이터를 다른 트랜잭션이 읽기, 쓰기 모두 비허용
    • 데이터 수정 즉시 트랜잭션 충돌을 감지할 수 있습니다.
    • 롤백을 개발자가 일일히 하기 힘든 경우, 충돌이 일어났을 때 롤백 비용이 많이 드는 경우, 주문 시에 쿠폰 사용, 알림 제공, 주문서 작성 등 여러 기능이 한 트랜잭션에 묶여있는 경우에 적합합니다.
  • 낙관적 락 (Optimistic Lock) : 데이터 갱신 시 충돌이 발생하지 않을 것이라 가정해 락을 걸지 않고, 버전 관리 기능을 통해서 트랜잭션 격리성을 관리하는 방식.
    • Version 컬럼을 별도로 추가해서 충돌을 방지합니다. Version 정보를 사용하면 최초 커밋만 인정이 되고, Bulk Insert는 버전을 무시하기 떄문에 Bulk Insert에서 버전을 증가시키려면 버전 필드를 강제로 증가시켜야 합니다.
    • DB가 제공하는 락 기능을 사용하지 않고, JPA가 제공하는 버전 관리 기능(Application Level의 Lock)을 사용합니다.
    • 커밋 전까지는 충돌을 알 수 없습니다.
    • 충돌이 나면 롤백 처리는 개발자의 몫입니다.

비관적 락과 낙관적 락의 사용 기준은 ‘읽기와 수정 비율이 어디에 가까운지’입니다. 수정의 비율이 높다면 비관적 락을, 읽기의 비중이 높다면 Optimistic을 사용합니다.

Why?

데이터 수정 즉시 트랜잭션 충돌을 감지하고 롤백이 가능하므로 수정이 많은 경우 비관적 락을 사용하는 것이 좋습니다.

읽기 작업이 많다면 JPA의 버전관리 기능을 활용해 개발하는 것이 더욱 편리하기 때문에 낙관적 락을 사용하는 것이 좋습니다.

정규화란?
MVCC란?
  • Multi-Version Concurrency Control의 약자로 데이터베이스에서 동시성 제어를 위해 사용되는 방법
  • 트랜잭션의 시작 시점에 데이터의 스냅샷을 만들어서 트랜잭션이 완료될 때까지 해당 스냅샷을 유지하는 방식
  • 크게 언두로그와 레도로그가 있습니다.
  • 언두로그는 변경 전 데이터를 기록하는 로그파일
  • 레도로그는 변경 후 데이터를 기록하는 로그파일
MySQL vs Oracle 차이
  • MySQL
    • 오픈소스이면서 무료이다.
    • innoDb같은 특정 엔진을 선택할 수 있다.
  • Oracle
    • 유료서비스이다.
    • 속도가 매우 빠르다.
    • hint를 사용하여 쿼리를 최적화할 수 있다. (custom 가능)
    • 모니터링 등 더 많은 고급 기능을 제공한다.
RDBMS vs NoSQL 차이
  • RDBMS
    • 정형 데이터를 다루는데 적합하다.
    • 데이터의 일관성을 유지하기 위해 트랜잭션을 사용한다.
    • 데이터의 관계를 정의하고, 관계를 유지하기 위해 JOIN을 사용한다.
    • 데이터의 스키마를 미리 정의해야 한다.
  • NoSQL
    • 비정형 데이터를 다루는데 적합하다.
    • 트랜잭션을 사용하지 않는다.
    • 데이터 분산이 용이하며, 자유로운 데이터 구조를 가질 수 있다.

즉, RDBMS는 데이터 구조가 명확하며 변경 될 여지가 없는경우 사용하는것이 좋고, NoSQL은 데이터 구조가 자주 변경되거나, 정합성이 중요하지 않은경우 사용하면 좋습니다.

Redis란?
  • 오픈소스 기반의 인메모리 데이터 저장소
  • 데이터를 메모리에 저장하므로 빠른 속도로 데이터를 처리할 수 있다.
  • 주로 캐시 서버로 사용되며, 세션 정보, 채팅 메시지, 게임 랭킹 등에 사용된다.
  • 데이터를 키-값 형태로 저장하며, 데이터를 조회할 때 빠른 속도로 데이터를 찾을 수 있다.

참고

This post is written by PRO.