신입 개발자 인터뷰 대비 : 3. 데이터베이스

데이터베이스

데이터베이스를 사용하는 이유에 대해서 설명하라

  1. 조직화 및 관리 용이성 : 대량의 정보 체계적으로 저장, 관리할 수 있고 데이터를 구조화 저장으로 검색, 갱신, 관리가 쉬워진다.
  2. 데이터 무결성 및 보안 : 데이터베이스는 데이터의 정확성과 일관성을 유지하는 다양한 기능을 제공한다. 권한설정, 파일 자체의 암호화 등을 포함함.
  3. 효율적인 데이터 접근 : 데이터베이스를 사용하면 여러 사용자가 동시에 데이터 접근이 가능하고, 데이터를 빠르고 효율적으로 처리할 수 있게 해주며 대용량의 데이터를 쉽게 핸들링 할수 있다.
  4. 개인적인 생각 정리 : 데이터베이스를 쓰는 실질적인 의미는 결국 분할 처리에 가깝다고 생각한다. 서버 상에서 파일 형태로 데이터를 관리하거나 인메모리 상태로 관리하는 구조는, 확장성, 운용성 면에서 제약이 심하다. 특히나 peer 프로젝트 과정에서 온프레미스 서버를 구축했고, 비록 스펙적으로 부족함이 있는 PC를 기반으로 했지만, 이를 여러대로 묶어서 서버에게 일정 자원, DB에 일정 자원을 제공하고, 연결시키는 구조는 확장성과 안정성 면에서 월등히 좋았다. 뿐만 아니라 자원이 많다면 서버 당 요청하는 입출력에 대해 더 대응하는 구조도 쉽게 구축이 가능하다. 책임이 분할되고, 안정성과 확장성을 갖춘다는 점. 다소 리소스가 분배 과정에서 좀더 리소스를 할애해야 한다는 단점은 있지만 그걸 뛰어 넘는 나름의 의미가 있기에 데이터베이스를 사용해야 한다고 생각한다.

데이터 베이스 언어(DDL, DML, DCL)에 대해 설명하시오

  1. 데이터 정의 언어(DDL, Data Definition Language)
    • DDL은 데이터베이스 스키마 생성, 수정, 삭제를 위한 용도의 언어
    • create, alter, drop 등이 있다.
    • 데이터베이스의 구조적 틀을 설정하는 역할을 한다.
  2. 데이터 조작 언어(DML, Data Manipulation Language)
    • DML은 데이터베이스 내의 데이터 조회, 값의 수정을 위한 용도이다.
    • select, insert, update, delete 등이 주요 명령어이다.
    • 소위 데이터와 상호작용을 하는 기능을 담당한다고 말한다.
  3. 데이터 제어 언어(DCL, Data Control Language)
    • 데이터베이스의 보안, 접근 권한 및 데이터 무결성 관리와 관련된 명령어를 제공한다.
    • grant(권한 부여), revoke(권한 철회) 등이 주요 명령어다
    • 데이터베이스의 보안 및 접근 제어를 중점으로 두고 사용한다.

데이터베이스 INDEX란 무엇인가?

인덱스는 일종의 데이터베이스 내부의 관리 시스템의 특징 중 하나다. 인덱스는 특정 정보를 빠르게 접근할 수 있도록 돕는 데이터 구조로 다음의 목적과 특징을 갖추고 있다.

  1. 검색 속도 향상 : 인덱스는 테이블의 데이터 중 일부에 대한 빠른 검색 경로를 제공하고, 인덱스 정보를 활용해 빠른 정보 탐색을
  2. 데이터 구조 : 일반적으로 인덱스는 B 트리 또는 해시 테이블과 같은 효율적인 데이터 구조를 사용하여 구현된다.
  3. 쿼리 성능 최적화 : 적절한 인덱스 설계는 쿼리 성능 최적화에 당연히 영향을 준다.
  4. 비용과 트레이드오프 : 인덱스는 검색 속도를 높이는 대신 추가적인 메모리, 보조 디스크의 저장 공간을 필요로 한다. 테이블에 데이터가 추가, 삭제, 수정 될 때마다 인덱스도 함께 갱신되어야 하므로, 데이터 변경 작업의 성능이 저하될 수 있다는 양면성을 갖추고 있다.

정규화를 왜 해야 하며, 1~3 정규화부터 BCNF 정규화를 할 수 있다

  • 정규화는 데이터베이스 설계과정에서 데이터의 중복을 줄이고, 구조를 개선하여 무결성을 유지하고 효과적으로 데이터를 관리 가능하게 하는 과정을 의미한다.
  • 이러한 정규화를 하게 되면
    • 데이터 중복 감소 : 데이터의 중복되는 영역을 제거하고, 저장 공간을 절약, 데이터 갱신 시 발생할 수 있는 오류를 방지한다.
    • 데이터 무결성 유지 : 데이터의 일관성과 정확성을 확보하고, 무결성 규칙이 강화되어 데이터베이스 내의 데이터의 신뢰성을 유지시켜준다.
    • 쿼리 성능 향상 : 정규화된 데이터베이스의 설계는 인덱스와 함께하여 더 성능적 최적화를 이룬 검색을 제공해줄 수 있다.
  • 1차 정규화(1NF) : 테이블의 모든 필드가 원자값을 가지도록 구성한다. 즉 각 필드에 반복되는 그룹이나, 다중 값이 없어야 하고, 각 레코드가 유일한 식별자를 가지고 있어야 한다.
  • 2차 정규화(2NF) : 1NF를 만족하고, 모든 비주요속성이 기본 키에 완전 함수적 종속 상태가 되어야 한다. 즉 부분적 종속을 제거하여 각 테이블이 기본키에만 의존하도록 설계한다.
  • 3차 정규화(3NF) : 2NF를 만족하면서, 모든 비주요속성이 기본 키에 이행적으로 종속되지 않은 상태이다. 쉽게 설명하면 비주요속성이 기본키를 통하지 않고 다른 비 주요속성에 종속되지 않도록 하는 것을 말한다.
  • 보이스-코드 정규형(BCNF) : 3NF를 만족하며, 모든 결정자가 후보 키인 상태를 말한다. 기본 키가 아닌 모든 결정자에서의 함수적 종속성도 제거하는 것을 말한다.
  • 예시

최초 테이블 형태

dentID StudentName CourseCodes InstructorNames
1 Alice [Math101, Sci102] [Bob, Carol]
2 Bob [Hist201, Math101] [Alice, Bob]

1NF도 만족시키지 못한 형태

1차 정규형 개선

StudentID StudentName CourseCode InstructorName
1 Alice Math101 Bob
1 Alice Sci102 Carol
2 Bob Hist201 Alice
2 Bob Math101 Bob

1NF를 달성하기 위해 각 필드의 값이 원자화 될 수 있도록 테이블 형태를 수정한다 . 그러나 studentID가 부분적으로 종속된 형태로 2NF 까지 만족하지 않는다.

2차 정규형 개선

StudentID StudentName
1 Alice
2 Bob

“Student Table” 2NF를 달성하고자 부분적 종속을 제거하기 위해 StudentID 가 StudetName을 완전히 결정하도록 별도로 테이블을 분리해 낸다.

StudentID CourseCode InstructorName
1 Math101 Bob
1 Sci102 Carol
2 Hist201 Alice
2 Math101 Bob

“Enrollments Table”

3차 정규형 개선

3차 정규형을 만족하려면 이행적 종속을 제거해야하고 이는 InstructorName 이 CourseCode에 종속적인 관계가 보이므로 이 역시 테이블을 분리해낸다.

CourseCode InstructorName
Math101 Bob
Sci102 Carol
Hist201 Alice

“Courses Table”

StudentID CourseCode
1 Math101
1 Sci102
2 Hist201
2 Math101

“Enrollments Table(ver.2nd)”

보이스-코드 정규형

BCNF는 모든 결정자가 후보 키여야하고, 현재 분리된 모든 테이블은 이미 결정자가 후보키인 상태이다. 따라서 여기까지 정리가 되면 BCNF를 만족하는 구조라고 할 수 있다.

StudentID StudentName
1 Alice
2 Bob
CourseCode InstructorName
Math101 Bob
Sci102 Carol
Hist201 Alice
StudentID CourseCode
1 Math101
1 Sci102
2 Hist201
2 Math101

역정규화란? 왜 하는지를 알고 있는가?

정규화가 성능을 향상시키는 경우도 있지만, 과도한 규칙이 오히려 성능을 저하시킬 수도 있다. 그럴 때 정규화가 아닌 역정규화라는 형태로 성능 개선을 도모할 수 있다. 역정규화는 다음의 목적을 가질 수 있다.

  • 쿼리 성능 향상 : 여러 테이블을 통합시킴으로, 쿼리를 통해 여러 테이블을 조인할 필요를 최소화하고 결과적으로 쿼리 처리 속도를 빠르게 만들 수 있다.
  • 트랜잭션 처리 시간 감소 : 역정규화를 통해 테이블 하나의 크기가 커지면, 데이터 처리 시 필요한 트랜잭션 자체의 수는 줄어든다. 특히 데이터 입력과 수정이 빈번한 시스템에서 트랜잭션 처리 시간이 줄어드는 것은 그만큼 성능 상의 이점을 가진다.
  • 응용 프로그램의 단순화 : 정규화시킨 데이터베이스 구조를 가지고는 서버 프로그램의 비즈니스 로직이 복잡해질 수 있다는 단점을 가진다. 이에 비해 역정규화하여 불필요한 정규화를 줄이면, 하나의 테이블로 서버 프로그램의 데이터 접근성이 용이해지고, 비교적 코드를 적게, 최소화시킬 수 있다.

하지만 말했듯 정규화를 사용하는 이유도 최적화를 위함이고, 비효율성이 있는 부분을 제거하는 것이 아니라면, 역정규화를 통헤 중복 데이터가 증가되고, 데이터 무결성에서 위험할 수 있으므로 성능 상의 이점, 구조상의 이점을 잘 보고 데이터를 정규화 내지는 역정규화 해야 한다.

RDBMS 와 NRDBMS의 차이에 대해 설명할 수 있다.

  • RDBMS(Relational Database Manage System)
    • 구조 :
      • 테이블 형태로 데이터를 저장하고, 각 테이블은 열(속성)과 행(레코드)으로 구성되어 있고, 데이터는 이러한 테이블에 맞춰져서 저장된다.
      • 데이터 간의 관계는 외래 키(Foreign Key)로 테이블 간의 정의 된다.
    • 쿼리 언어 :
      • SQL(Structured Query Language)을 사용하여 데이터를 관리하고 조작한다. SQL은 쿼리 기능, 복잡한 쿼리와 트랜잭션을 지원한다.
    • 데이터 무결성 및 일관성 :
      • RDBMS는 데이터 무결성 기능을 제공하며, 트랜잭션, ACID(Atomicity, Consistency, Isolation, Durability)원칙을 지원하며 데이터의 정확성과 일관성을 보장한다.
    • 확장성 :
      • 주로 수직적 확장(서버의 하드웨어 성능 강화)을 지원하며, 수평적 확장(여러 서버에 데이터 분산)은 제한적이다.
  • NRDBMS(Non-Relational Database Manage System)
    • 구조 :
      • 다양한 데이터모델을 사용할 수 있고, 주로 문서(document), 키-값(key-value), 그래프(graph), 열 기반(Column-family) 등의 구조를 가지고 있다.
    • 쿼리 언어 :
      • 각 데이터베이스 시스템마다 다양한 쿼리 언어를 사용하거나, SQL과 유사한 쿼리 언어를 제공한다.
      • 각 데이터베이스마다 특화된 쿼리 방식이 있다.
    • 데이터 무결성 및 일관성 :
      • 일반적으로 RDBMS 보다 느슨한 일관성 모델을 사용하고, CAP이론에 따라 일관성, 가용성, 분할 허용성 중 두 가지를 선택할 수 있다.
    • 확장성 :
      • 주로 수평적 확장을 지원하여 대용량 데이터 처리에 유리하다. 여러 서버에 데이터를 분산 시켜 처리할 수 있으며, 이는 빅데이터 애플리케이션에 적절하다.
  • 결론적으로 RDBMS는 트랜잭션이 중요하고, 정형화된 데이터 구조가 필요한 시스템일 때 효과적일 수 있으며, NRDBMS는 빅 데이터, 실시간 웹 애플리케이션, 그리고 유연성이 중요한 시스템에서 사용 시 효과적일 수 있다.

테이블 설계를 잘못한 경우 나타날 수 있는 오류들은 무엇이 있는가?

  1. 갱신 이상
  2. 삽입 이상
  3. 삭제 이상
  4. 데이터 무결성 문제 : 적절한 외래키 관계와 제약조건이 설정되지 않아서, 데이터 무결성이 손상되는 경우이다. 예를 들어 존재하지 않는 부서에 속한 직원 데이터가 입력되는 등의 문제가 발생할 수 있다.
  5. 조회 성능 저하 : 필요 이상으로 복잡하거나 중복된 데이터 구조는 조회 성능을 저하시킬 수 있다. 불필요한 조인, 큰 데이터 집합에 대한 처리가 필요한 경우, 시스템의 전반벅인 응답시간이 느려질 수 있다. 특히나 대량의 요청이 들어올 때 쿼리 한 줄 두 줄의 차이가 성능의 차이를 만들어 낼 수 있다.
  6. 비효율적인 공간 사용 : 중복된 데이터, 비효율적인 데이터 형식을 사용하면서 더 많은 공간을 차지 하는 경우. 전에 비해서는 훨씬 문제로 취급되는 수준이 낮아졌으나, 비용적 차원에서 문제를 야기할 수는 있다.

트랜잭션이 무엇이며, 그 특성을 설명하라

트랜잭션은 데이터베이스 시스템에서 완전하고 독립적인 작업 단위이다. 한 번에 하나 이상의 데이터 조작 작업을 수행하는 과정을 말한다. 데이터 베이스의 모든 작업(CRUD)을 통칭한다. 트랜잭션의 주요 특징은 ACID라고 부른다.

  1. 원자성(Atomicity)
    • 트랜잭션이 데이터 베이스에 모든 작업을 완전히 수행하거나, 전혀 수행하지 않는 성질. 트랜잭션의 모든 연산이 성공적으로 완료되면 트랜잭션은 커밋이 되고, 하나라도 실패하면 해당 전체 트랜잭션은 취소(rollback)가 되어야 한다.
  2. 일관성(Consistency)
    • 트랜잭션이 실행을 완료한 후에 데이터베이스가 일관된 상태를 유지해야 한다는 성질. 트랜잭션이 데이터베이스의 무결성 제약 조건을 위반하지 않고, 데이터베이스의 모든 데이터가 규칙을 준수하는 상태를 유지해야한다.
  3. 독립성(Isolation)
    • 여러 트랜잭션이 동시에 실행 될 때, 각 트랜잭션의 연산이 다른 트랜잭션의 연산에 영향을 주거나 받지 않아야 한다. 각각 독립적으로 실행되는 것처럼 보이게 보장되어야 한다.
  4. 지속성(Durability)
    • 지속성은 트랜잭션이 성공적으로 커밋된 후에는 해당 트랜잭션에 의해 만들어진 결과가 영구적으로 데이터베이스에 저장되어야 한다는 특성. 시스템이 고장이 나도, 데이터는 손실되지 않아야 한다.

트랜잭션 격리 수준(Transaction Isolation Levels)에 대해 설명하시오

트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행될 때 하나의 트랜잭션이 다른 트랜잭션의 중간 결과를 어느 정도 볼 수 있는지를 정의하는 설정이다. 격리 수준을 설정함에 따라 성능과 일관성 사이의 균형을 조절할 수 있어서, 더 낮은 격리 수준은 보통 더 높은 성능치를 제공하고, 반대인 경우 성능이 낮아진다. 더불어 낮아질 수록 발생할 수 있는 문제(더티 리드, 논리적 에러 등)가 야기될 수 있다. SQL 표준에서 정의하는 네 가지 주요 격리 수준은 다음과 같다.

  1. READ UNCOMMITTED(읽기 비공개) :
    • 가장 낮은 단계 격리, 다른 트랜잭션의 커밋되지 않은 데이터를 읽을 수 있다. 데이터 정확성보다 성능을 우선시 할 때 사용됨. 더티 리드 발생.
  2. READ COMMITTED(읽기 공개) :
    • 트랜잭션이 커밋 된 데이터만 읽을 수 있고, 더티 리드는 방지하나, 여전히 데이터에 대한 여러 번의 조회 결과가 다를 수 있다.
  3. REPEATABLE READ(반복 읽기 가능) :
    • 트랜잭션 동안 조회한 데이터를 여러번 조회해도 동일한 결과를 보장. 해당 방식은 non-repeatable reads를 방지하지만, 다른 트랜잭션이 새로운 데이터를 삽입하는 경우 팬텀리드라는 문제가 발생될 수 있다.
  4. SERIALIZABLE(직렬화 가능) :
    • 가장 높은 격리 수준, 트랜잭션은 서로 독립 실행되는 것처럼 보장되고, 더티 리드, non-repeatable reads, 팬텀 리드가 모두 방지되나, 트랜잭션 사이의 경합이 많아 성능 저하가 발생한다.

ORM이란?

객체지향프로그래밍 언어를 사용하여 호환되지 않은 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술- 이라고 한다. 쉽게 말하면 데이터베이스의 데이터, 복잡한 SQL 쿼리 대신 객체 형태로 데이터를 관리할 수있게 만들어주는 미들웨어이다. 해당 방식은 몇 가지 특징 및 장단점이 있다.

  1. 개발 효율성
    • SQL 쿼리를 배우고, 작성하는 대신 매핑된 객체의 메서드를 호출하는 방식으로 데이터베이스와 상호작용을 할 수 있다는 점은, 개발 과정을 간소화시킬 수 있다.
  2. 데이터베이스 독립성
    • ORM은 데이터베이스의 구체적인 구현 세부 사항을 추상화하는 레이어를 제공하고, 이러한 특징은 애플리케이션의 코드 변경 없이 드라이버, 옵션만 변경함으로써 다른 종류의 SQL 데이터베이스 간에 전환을 용이하게 만들어준다.
  3. 유지보수의 용이성
    • ORM을 사용하면 데이터 모델을 데이터베이스에서 직접 건드리지 않고도 수정할 수 있고, 이러한 특성상 데이터 관련 코드의 유지보수가 용이하다.
  4. 객체지향 디자인 지원
    • ORM은 객체 지향 디자인 패턴과 잘 호환되서, 개발자는 데이터베이스 설계를 객체지향적 관점으로 진행할 수 있고, 이는 애플리케이션의 전체적인 설계 일관성을 향상 시킬 수 있다.
  5. 트랜잭션 관리와 캐싱
    • 많은 ORM 프레임워크는 자동 트랜잭션 관리와 캐싱 기능으로 데이터 베이스 작업의 효율성과 성능을 높여준다.

하지만 몇 가지 단점도 생각해볼 수있다.

  1. 성능 저하
    • 추상화 레이어를 통해 객체지향적 데이터와 데이터베이스의 데이터를 연결시키는 역할을 하지만, ORM의 이러한 특성은 오히려 성능을 저하시킬 수 있다. 특히나 복잡한 쿼리나 대량의 데이터 처리시 ORM이 생성하는 SQL이 최적화되지 않아 데이터베이스의 성능에 부정적인 영향을 줄 수 있다.
  2. 복잡한 쿼리의 어려움
    • ORM은 일반적인 CRUD 작업에 대해선 간단하게 만들어주고, 그만큼 편리하나 복잡한 쿼리나 특수한 SQL 기능(고급 조인, 하위 쿼리, 특정 데이터베이스 함수)을 필요하다고 생각하면, ORM으로 이를 표현하는데 한계가 있어 직접 SQL을 작성해야 할 수도 있고, 잘 갖춰진 상태라면 ORM보다 직접 SQL을 활용하는게 효과적일 수도 있는 것이다.
  3. 학습 곡선
    • ORM은 효과적으로 사용하기 위해선 ORM 자체의 작동 방식, 객체 지향적 프로그래밍, 데이터베이스 설계에 대한 이해를 모두 가져야 하며, 따라서 초기에 학습 곡선이 높아질 수 있다.
  4. 과도한 추상화
    • ORM은 데이터베이스의 작업을 추상화하고, 단순화 시키는 것은 좋지만 개발자가 데이터베이스의 실제 발생 상황을 완전히 이해하지 못할 수 있고, 이러한 특성은 버그를 비롯, 다양한 문제 속에서 개발자가 처리할 수 있는데 한계가 생기게 만들 수 있다.
  5. 툴에 대한 의존성
    • 프로젝트가 특정 ORM 프레임워크에 의존하게 되면, 해당 툴의 제약과 버그, 성능에 영향을 받게 된다. 또한 프레임워크 자체를 변경하는 경우도 큰 문제가 될 수 있다.

대표적인 ORM 프레임워크로는 Java의 Hibernate, 이에서 파생되는 JPA, Python의 SQLAlchemy, NestJS의 TypeORM 등이 있다.

자주 사용하는 명령어들에 대해 설명할 수 있다.(SELECT, JOIN, WHERE, DELETE, GROUP BY… etc)

  1. SELECT: 데이터베이스에서 특정 데이터를 조회하는 데 사용된다. 특정 열이나 모든 열을 선택할 수 있다.
  2. JOIN: 두 개 이상의 테이블을 연결하여 데이터를 결합할 때 사용된다. 이를 통해 관련된 데이터를 여러 테이블에서 동시에 조회할 수 있다.
  3. WHERE: 특정 조건을 만족하는 데이터만을 선택하고자 할 때 사용된다. 이 명령어는 SELECT, UPDATE, DELETE 등과 함께 사용되어 결과를 필터링한다.
  4. DELETE: 데이터베이스에서 특정 데이터를 제거하는 데 사용된다. WHERE 절과 함께 사용되어, 특정 조건을 만족하는 데이터만을 삭제할 수 있다.
  5. GROUP BY: 집계 함수와 함께 사용되어, 특정 열의 값에 따라 결과 집합을 그룹화한다. 이를 통해 각 그룹에 대한 통계를 쉽게 계산할 수 있다.

이 명령어들은 데이터베이스 관리 및 데이터 조작의 기본적인 구성 요소이며, 백엔드 개발자로서 효율적인 데이터 처리를 위해 필수적으로 숙지해야 한다.

DB 키의 종류와 기능을 설명해보시오.

  1. 기본 키(Primary Key): 테이블 내에서 각 행의 고유 식별자로 사용된다. 중복되거나 NULL 값을 가질 수 없어 테이블의 각 행을 명확히 식별하는 데 중요한 역할을 한다.
  2. 외래 키(Foreign Key): 다른 테이블의 기본 키를 참조하는 키로, 두 테이블 간의 관계를 정의하는 데 사용된다. 데이터의 무결성을 유지하는 데 핵심적인 역할을 한다.
  3. 대체 키(Alternate Key): 기본 키로 사용할 수 있지만 사용되지 않는 키를 말한다. 이 키들은 유일성을 보장하지만, 기본 키로 선택되지 않은 다른 후보 키들이다.
  4. 슈퍼 키(Super Key): 테이블 내의 한 행을 유일하게 식별할 수 있는 하나 이상의 속성(열)의 집합이다. 슈퍼 키는 필요 이상의 속성을 포함할 수 있으며, 기본 키는 슈퍼 키의 최소 집합이다.
  5. 복합 키(Composite Key): 두 개 이상의 열을 결합하여 테이블의 행을 유일하게 식별하는 키를 말한다. 개별적으로는 유일성을 보장하지 못할 수 있지만 조합했을 때 유일성을 보장한다.
  6. 인조 키(Artificial Key): 테이블에 자연적으로 존재하는 데이터로 키를 구성할 수 없을 때 생성하는 인공적인 키다. 주로 일련번호나 특수 생성된 코드가 이에 해당한다.

Redis 에 대해서 간단히 설명해보시오

Redis는 고성능 키-값(key-value) 형태의 인메모리 데이터 구조 저장소이다. 주로 데이터베이스, 캐시, 메시지 브로커로 사용된다. Redis의 주요 특징은 다음과 같다.

  1. 빠른 성능: 모든 데이터가 메모리 내에 저장되므로, 읽기 및 쓰기 작업이 매우 빠르다.
  2. 다양한 데이터 구조 지원: 문자열, 리스트, 세트, 해시, 정렬된 세트, 비트맵 등 다양한 종류의 데이터 구조를 지원한다.
  3. 지속성 옵션: Redis는 메모리 내 데이터를 디스크에 저장하는 두 가지 방식(RDB와 AOF)을 제공하여, 시스템 장애 발생 시 데이터 복구가 가능하다.
  4. 거래 처리: Redis는 명령어들을 원자적으로 실행하는 간단한 트랜잭션을 지원한다.
  5. 레플리케이션 및 확장성: 데이터의 안정성과 가용성을 위해 마스터-슬레이브 레플리케이션을 지원하며, 여러 서버에 데이터를 분산시키는 클러스터 모드도 제공한다.

Redis는 이러한 특성으로 인해 실시간 애플리케이션에서 매우 유용하게 사용되며, 대량의 데이터를 빠르게 처리하고, 접근해야 하는 다양한 시나리오에 적합하다.

Redis와 Memcached의 차이에 대해 설명하시오.

Redis와 Memcached는 모두 인기 있는 인메모리 데이터 스토어로, 주로 캐싱과 같은 고성능 작업에 사용된다. 이 두 시스템의 주요 차이점을 설명하겠다.

  1. 데이터 구조: Redis는 문자열, 해시, 리스트, 세트, 정렬된 세트 등 다양한 데이터 구조를 지원한다. 반면, Memcached는 주로 간단한 키-값 구조만을 지원하여, 사용범위가 비교적 제한적이다.
  2. 지속성: Redis는 데이터를 디스크에 저장할 수 있는 옵션(RDB, AOF)을 제공하여 지속성을 지원한다. Memcached는 주로 순수한 캐시로 사용되며, 기본적으로 데이터 지속성을 제공하지 않는다.
  3. 트랜잭션과 스크립팅: Redis는 간단한 트랜잭션 기능을 지원하며, Lua 스크립팅을 통해 서버 측에서 복잡한 연산을 수행할 수 있다. Memcached는 이러한 기능을 지원하지 않는다.
  4. 복제 및 클러스터링: Redis는 내장된 복제, 센티넬(Sentinel), 클러스터링 기능을 통해 고가용성과 데이터 무결성을 보장한다. Memcached는 멀티코어 아키텍처를 활용한 간단한 복제는 가능하지만, Redis만큼의 고급 기능을 제공하지는 않는다.
  5. 사용 사례: Redis의 다양한 데이터 구조와 기능은 메시징, 세션 관리, 실시간 애플리케이션 등 다양한 사용 사례에 적합하다. Memcached는 주로 간단한 캐싱 목적으로 사용되며, 대규모 웹 사이트에서 데이터베이스 부하를 줄이는 데 효과적이다.

Elastic Search에 대해 간단히 설명하시오.

Elasticsearch는 Apache Lucene(아파치 루)을 기반으로 하는 오픈 소스 검색 및 분석 엔진이다. 텍스트, 숫자, 위치 데이터 등 다양한 유형의 데이터에 대해 빠르고 확장 가능한 검색 기능을 제공한다. Elasticsearch의 주요 특징은 다음과 같다.

  1. 분산 시스템: Elasticsearch는 자동으로 데이터를 여러 노드에 분산시켜 저장하고, 이를 통해 높은 가용성과 확장성을 제공한다.
  2. 실시간 검색: 데이터가 인덱싱되는 즉시 검색이 가능하므로, 거의 실시간으로 데이터를 조회하고 분석할 수 있다.
  3. 다양한 인덱싱 옵션: 복합적인 데이터 구조도 색인화할 수 있으며, 사용자는 필요에 따라 인덱싱 방법을 세부적으로 조정할 수 있다.
  4. RESTful API: 데이터 색인, 검색, 업데이트, 관리 작업을 위해 HTTP와 JSON을 사용하는 RESTful API를 제공한다. 이로 인해 다양한 프로그래밍 언어와 쉽게 통합될 수 있다.
  5. 강력한 분석 기능: Elasticsearch는 집계 기능을 통해 복잡한 데이터 집계 및 분석을 수행할 수 있어, 대규모 데이터에 대한 인사이트를 얻는 데 유용하다.

이러한 특성으로 인해 Elasticsearch는 로그 분석, 전체 텍스트 검색, 보안 인텔리전스, 비즈니스 분석 등 다양한 분야에서 널리 사용된다.

Elastic Search 의 인덱스 구조와 RDBMS의 인덱스 구조의 차이에 대해 설명하시오

Elasticsearch의 인덱스 구조와 전통적인 관계형 데이터베이스(RDBMS)의 인덱스 구조는 데이터 저장, 관리, 검색 방식에서 상당한 차이를 보인다.

  1. 인덱스 구조:
    • Elasticsearch: Elasticsearch에서는 ‘인덱스’가 하나의 데이터베이스처럼 작동하며, 이 안에 여러 ‘타입’이 존재할 수 있다. 하지만 Elasticsearch 7.x 이후부터는 단일 인덱스 내에서 다중 타입을 지원하지 않는다. 각 문서는 JSON 형식으로 저장되며, 인덱스 내에서 자동으로 풀 텍스트 검색을 위한 역색인이 생성된다. 역색인 구조는 검색 속도를 최적화하기 위해 설계되었다.
    • RDBMS: RDBMS에서 인덱스는 데이터베이스 테이블의 열(컬럼)에 대해 생성되며, 주로 B-트리 구조를 사용한다. 이 구조는 CRUD(Create, Read, Update, Delete) 작업의 균형을 맞추어 효율적으로 데이터를 관리하며, 주로 특정 값의 빠른 조회를 목적으로 한다.
  2. 데이터 처리 방식:
    • Elasticsearch: 데이터는 비정형이거나 반정형일 수 있으며, 모든 필드는 인덱싱되어 빠른 검색을 지원한다. 동적 인덱싱을 통해 새로운 데이터 타입과 필드를 쉽게 추가할 수 있다.
    • RDBMS: 엄격한 스키마에 따라 데이터가 저장되며, 인덱스를 생성하지 않은 필드는 검색 성능이 낮다. 데이터는 주로 정형화된 형태이며, 스키마 변경은 상대적으로 복잡할 수 있다.
  3. 검색 및 분석 기능:
    • Elasticsearch: 복잡한 텍스트 검색, 데이터 집계 및 분석이 강점이다. 다양한 검색 쿼리와 실시간 분석을 지원하며, 대규모 데이터셋에 대한 빠른 응답을 제공한다.
    • RDBMS: 주로 정확한 값의 조회에 최적화되어 있으며, 전체 텍스트 검색이나 복잡한 분석은 별도의 솔루션을 필요로 할 수 있다. 또한, 대량의 데이터에 대한 집계 및 분석 쿼리는 성능 저하를 일으킬 수 있다.

이러한 차이는 각 시스템의 설계 목적과 사용 케이스에 기인한다. Elasticsearch는 대량의 데이터를 신속하게 검색하고 분석하는 데 적합하며, RDBMS는 데이터의 무결성과 정확한 트랜잭션 처리에 강점을 가진다.

Elastic Search의 키워드 검색과 RDBMS의 LIKE의 차이점에 대해 설명하시오.

Elasticsearch의 키워드 검색과 RDBMS의 LIKE 연산자 사용은 두 시스템이 데이터를 어떻게 색인화하고 검색하는지의 차이에서 기인한다.

  1. 색인화와 검색 속도:
    • Elasticsearch: 데이터가 저장될 때, Elasticsearch는 데이터를 자동으로 색인화하며 특히 풀 텍스트 검색에 최적화된 역색인을 생성한다. 이러한 색인 구조 덕분에 매우 빠른 검색 성능을 제공한다. 키워드 검색은 정확한 일치 뿐만 아니라, 부분 일치, 유사어 검색, 스펠링 오류를 용인하는 검색 등 복잡한 쿼리에도 빠르게 대응할 수 있다.
    • RDBMS: LIKE 연산자는 보통 전체 테이블 스캔을 필요로 하므로, 대량의 데이터에 대해서는 성능이 상대적으로 떨어진다. 인덱스를 사용하지 않는 경우가 많으며, 특히 문자열의 일부를 검색하는 %keyword% 형식의 쿼리는 매우 느릴 수 있다. 인덱스를 사용할 수 있는 경우는 keyword%와 같이 접두사 검색일 때이다.
  2. 기능성:
    • Elasticsearch: 다양한 검색 옵션을 제공하여, 텍스트 분석기를 활용한 복잡한 검색이 가능하다. 예를 들어, 동의어 처리, 토크나이저 설정, 텍스트 필터링 등을 통해 검색 엔진처럼 다양한 요구 사항에 맞춰 검색할 수 있다.
    • RDBMS: LIKE 연산은 기본적인 패턴 매칭 기능을 제공하지만, 대소문자 구분, 정확한 문자 일치 등의 제한된 기능을 가진다. 복잡한 텍스트 처리나 분석 기능은 제공하지 않는다.
  3. 사용 사례:
    • Elasticsearch: 대규모 로그 데이터, 소셜 미디어 데이터, 웹 콘텐츠 등 비정형 데이터에 대한 풍부한 텍스트 검색 요구에 적합하다.
    • RDBMS: 트랜잭션 데이터, 고객 정보, 재고 정보 등 정형 데이터의 구조적 조회에 강점을 가진다. LIKE 연산자는 주로 간단한 문자열 검색에 사용된다.

종합적으로, Elasticsearch는 풍부한 텍스트 기반 검색 기능과 빠른 성능으로 복잡한 검색 요구를 충족시키는 반면, RDBMS는 전통적인 데이터 관리에 더 적합하며, LIKE 연산자를 사용한 검색은 상대적으로 단순하고 제한적이다.

MongDB 의 개념과 그 특징을 설명하시오

  1. 문서 지향적 저장 구조:
    • MongoDB는 데이터를 JSON과 유사한 BSON(Binary JSON) 형식의 ‘문서’로 저장한다. 이 문서들은 유연한 스키마를 가지며, 각 문서는 다양한 필드를 포함할 수 있다. 필드 값으로는 배열이나 다른 문서도 올 수 있어 복잡한 데이터 구조를 자연스럽게 표현할 수 있다.
  2. 스키마리스(schema-less):
    • MongoDB 문서는 고정된 스키마를 요구하지 않는다. 즉, 동일한 컬렉션(관계형 데이터베이스의 테이블에 해당) 내의 문서들이 서로 다른 구조를 가질 수 있다. 이로 인해 개발 과정이 유연해지고, 다양한 형태의 데이터를 쉽게 저장하고 관리할 수 있다.
  3. 확장성:
    • MongoDB는 수평적 확장성을 지원한다. 샤딩을 통해 데이터를 여러 서버에 분산시키며, 이를 통해 데이터베이스의 부하를 분산시키고, 대용량 데이터를 효과적으로 처리할 수 있다.
  4. 고가용성:
    • 자동 복제 및 장애 조치 기능을 제공하는 복제 세트를 지원한다. 이는 데이터의 안전성을 보장하고, 서버가 다운되더라도 데이터 접근성을 유지하게 해 준다.
  5. 강력한 쿼리 언어:
    • MongoDB는 강력한 쿼리 언어를 지원하여, 복잡한 검색, 데이터 집계 및 분석이 가능하다. SQL과 유사한 쿼리를 사용할 수 있으며, 인덱스를 활용한 빠른 데이터 검색을 지원한다.

MongoDB는 이러한 특징들로 인해 대규모, 고성능, 유연한 데이터 저장 요구가 있는 애플리케이션 개발에 적합하다. 주로 실시간 분석, 사물 인터넷(IoT), 모바일 애플리케이션 등 다양한 분야에서 활용된다.

CAP 이론과 Eventual Consistency 에 대해서 설명하시오

CAP 이론과 Eventual Consistency는 분산 시스템 설계의 핵심 개념이다.

CAP 이론은 2000년 Eric Brewer가 제안한 이론으로, 분산 컴퓨팅 시스템이 일관성(Consistency), 가용성(Availability), 분할 내구성(Partition Tolerance) 이 세 가지 특성 중 최대 두 가지만을 동시에 보장할 수 있다고 설명한다.

  • 일관성(Consistency) 은 모든 노드가 최신 상태의 데이터를 가지고 있어야 함을 의미한다.
  • 가용성(Availability) 은 모든 요청에 대해 항상 응답을 해야 함을 의미한다.
  • 분할 내구성(Partition Tolerance) 은 네트워크 분할이 발생해도 시스템이 정상적으로 동작해야 함을 의미한다.

Eventual Consistency는 일관성과 가용성을 모두 추구하면서 발생하는 문제를 해결하기 위한 접근법이다. 모든 업데이트가 결국에는 모든 노드에 전파되어 시스템이 일관된 상태가 되지만, 업데이트가 전파되는 동안 일시적으로 데이터 불일치가 발생할 수 있다. 이는 분산 시스템에서 네트워크 지연과 파티션 문제를 다룰 때 특히 유용하다.

이 두 개념은 분산 데이터베이스 설계에 중요한 영향을 미치며, 시스템의 필요에 따라 적절한 일관성 모델을 선택하는 데 도움을 준다.