TIL | 면접 카타 1, 28번

bubblegum·2024년 4월 8일
0

Today I learn(TIL)

목록 보기
60/84
post-thumbnail

NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.

NoSQL과 RDBMS는 데이터를 저장, 조회, 관리하는 방식에 있어 서로 다른 접근 방식을 제공합니다. 이들 각각의 특징, 장단점, 그리고 차이점을 아래에서 상세히 설명하겠습니다.

RDBMS (관계형 데이터베이스 관리 시스템)

특징

  • 구조화된 데이터: RDBMS는 테이블 형태로 데이터를 저장하며, 각 테이블은 고유한 스키마(구조)를 가집니다.
  • SQL 사용: 데이터 조작과 관리를 위해 SQL(Structured Query Language)을 사용합니다.
  • ACID 속성: Atomicity(원자성), Consistency(일관성), Isolation(독립성), Durability(지속성)을 보장합니다.

장점

  • 데이터 무결성과 일관성: 엄격한 스키마와 ACID 속성 덕분에 데이터의 무결성과 일관성을 유지하기 쉽습니다.
  • 복잡한 쿼리 처리: SQL을 사용하여 복잡한 쿼리와 트랜잭션을 효과적으로 처리할 수 있습니다.
  • 관계 설정: 데이터 간의 관계를 통해 조인 등의 연산을 수행할 수 있으며, 이를 통해 복잡한 데이터 분석과 처리가 가능합니다.

단점

  • 규모 확장성: 수직적 확장(서버의 성능 향상)은 가능하지만, 수평적 확장(서버의 수 증가)이 어렵습니다.
  • 고정된 스키마: 데이터 스키마를 미리 정의해야 하며, 변경이 필요한 경우 비용이 많이 들 수 있습니다.

NoSQL (비관계형 데이터베이스)

특징

  • 비구조화된 데이터: 다양한 데이터 형태(JSON, key-value, 그래프 등)를 저장할 수 있으며, 고정된 스키마가 없습니다.
  • 스키마리스: 데이터를 자유롭게 저장할 수 있어, 빠르게 변화하는 데이터 구조에 적합합니다.
  • 수평적 확장성: 데이터를 여러 서버에 분산시켜 저장할 수 있어 대규모 데이터를 효율적으로 처리할 수 있습니다.

장점

  • 유연성: 스키마가 없어 데이터 구조의 변경이 용이합니다.
  • 확장성: 데이터를 여러 노드에 분산시켜 저장할 수 있어 대규모 데이터를 효율적으로 처리할 수 있습니다.
  • 다양한 데이터 모델: 다양한 데이터 모델(Key-Value, Document, Column Family, Graph 등)을 지원하여 여러 유형의 애플리케이션에 적합합니다.

단점

  • 표준화 부족: NoSQL 데이터베이스마다 사용 방법이 다르며, 표준화된 쿼리 언어가 없습니다.
  • 데이터 무결성과 일관성: 대부분의 NoSQL 데이터베이스는 ACID 속성 대신 BASE(Basically Available, Soft state, Eventually consistent) 모델을 따릅니다. 즉시 일관성을 보장하지 않고, 시간이 지남에 따라 일관성이 유지됩니다.

[1] WhaTap - RDBMS와 NoSQL의 차이 | 와탭 블로그 (https://www.whatap.io/ko/blog/173/)
[2] TISTORY - [Database] RDBMS와 NoSQL의 차이점 (https://khj93.tistory.com/entry/Database-RDBMS%EC%99%80-NOSQL-%EC%B0%A8%EC%9D%B4%EC%A0%90)
[3] velog - NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 ... (https://velog.io/@coco_116/NoSQL%EA%B3%BC-RDBMS%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%9E%A5-%EB%8B%A8%EC%A0%90%EC%9D%84-%EB%93%A4%EC%96%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94)
[4] < Hyun / Log > - RDBMS와 NoSQL의 차이점 및 개념 완벽 정리 (https://hstory0208.tistory.com/entry/RDBMS%EC%99%80-NoSQL%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EB%B0%8F-%EA%B0%9C%EB%85%90-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC)

Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.

Array (배열)

설명

배열은 데이터를 연속적인 메모리 공간에 순서대로 저장하는 데이터 구조입니다. 각 데이터 항목은 인덱스를 통해 접근할 수 있으며, 이 인덱스를 사용하여 빠르게 특정 요소를 검색할 수 있습니다. 배열은 고정된 크기를 가지거나, 동적으로 크기가 조정될 수 있는 동적 배열(variant)도 있습니다.

사용 방법

  • 접근: 인덱스를 통해 O(1) 시간에 접근할 수 있습니다.
  • 삽입/삭제: 배열 중간에 요소를 삽입하거나 삭제하는 경우, 해당 요소 이후의 모든 요소를 이동시켜야 하므로 평균적으로 O(n) 시간이 소요됩니다.
  • 예시 (JavaScript):
    let arr = [1, 2, 3];
    arr.push(4); // 배열 끝에 요소 추가
    console.log(arr); // [1, 2, 3, 4]
    arr.pop(); // 배열 끝의 요소 제거
    console.log(arr); // [1, 2, 3]

LinkedList (연결 리스트)

설명

연결 리스트는 데이터 항목들이 포인터를 이용해 연결된 구조를 가지는 데이터 구조입니다. 각 요소(노드)는 데이터와 다음 노드를 가리키는 포인터(또는 이전 노드를 가리키는 포인터를 추가로 가지는 양방향 연결 리스트의 경우도 있음)를 포함합니다. 연결 리스트는 동적으로 크기가 변할 수 있으며, 삽입과 삭제가 배열에 비해 상대적으로 간단합니다.

사용 방법

  • 접근: 첫 번째 노드부터 시작하여 원하는 노드까지 순차적으로 이동해야 하므로 평균적으로 O(n) 시간이 소요됩니다.

  • 삽입/삭제: 특정 위치에 노드를 삽입하거나 삭제할 때, 해당 노드의 이전 노드와 다음 노드를 연결만 시켜주면 되므로 O(1) 시간이 소요됩니다(단, 삽입/삭제 위치를 찾는 데에는 O(n) 시간이 소요될 수 있습니다).

  • 예시 (JavaScript):

    class Node {
        constructor(data) {
            this.data = data;
            this.next = null;
        }
    }
    
    class LinkedList {
        constructor() {
            this.head = null;
        }
    
        // 연결 리스트 끝에 새 노드 추가
        append(data) {
            let newNode = new Node(data);
            if (this.head === null) {
                this.head = newNode;
            } else {
                let current = this.head;
                while (current.next) {
                    current = current.next;
                }
                current.next = newNode;
            }
        }
    }
    
    let list = new LinkedList();
    list.append(1);
    list.append(2);

결론

배열은 인덱스를 통한 빠른 접근이 필요할 때 유리하고, 메모리가 연속적으로 할당되므로 캐시 효율성이 높습니다. 반면, 삽입과 삭제가 빈번히 발생하는 경우나 동적으로 크기를 변화시켜야 할 때는 연결 리스트가 더 효율적일 수 있습니다. 각각의 특성을 이해하고 상황에 맞게 적절히 선택하여 사용하는 것이 중요합니다.

이런 자료를 참고했어요.
[1] velog - Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용 ... (https://velog.io/@theon2/Array-LinkedList%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EC%A3%BC%EC%8B%9C%EA%B3%A0-%EA%B0%81%EA%B0%81-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EC%A7%80-%EB%A7%90%EC%94%80%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94)
[2] TISTORY - 간략 설명! 배열(Array)과 연결 리스트(Linked List)에 대해서 ... (https://blacklobster.tistory.com/8)
[3] velog - [자료구조] 연결 리스트 vs 배열 / JavaScript로 ... (https://velog.io/@sunohvoiin/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8-vs-%EB%B0%B0%EC%97%B4-JavaScript%EB%A1%9C-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-Linked-List-Array)
[4] 티스토리 - [면접 꿀팁] 배열(Array)과 링크드 리스트(Linked list)의 특징 (https://thecho7.tistory.com/entry/%EB%A9%B4%EC%A0%91-%EA%BF%80%ED%8C%81-%EB%B0%B0%EC%97%B4Array%EA%B3%BC-%EB%A7%81%ED%81%AC%EB%93%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8Linked-list%EC%9D%98-%ED%8A%B9%EC%A7%95)

profile
황세민

0개의 댓글