'CS > 데이터베이스' 카테고리의 다른 글
B-tree, B+tree (0) | 2025.04.10 |
---|---|
데이터베이스 설계 (0) | 2025.04.07 |
데이터베이스 정의 (0) | 2025.04.07 |
B-tree, B+tree (0) | 2025.04.10 |
---|---|
데이터베이스 설계 (0) | 2025.04.07 |
데이터베이스 정의 (0) | 2025.04.07 |
- 리프 노드들의 레벨 차이가 최대 1레벨까지만 나는 트리, 검색할 때 O(logN) 시간 복잡도 유지(균형이 깨지면 별도 로직을 통해 다시 균형 유지)
- B-tree 처음 생성 당시에는 균형 트리이지만, 테이블 갱신(INSERT, UPDATE, DELETE)의 반복을 통해 서서히 균형이 꺠지고, 성능도 약화된다.
- 어느 정도 자동으로 균형을 회복하는 기능이 있지만, 갱신 빈도가 높은 테이블에 작성되는 인덱스 같은 경우 인덱스 재구성을 해서 트리의 균형을 되찾는 작업이 필요하다.
- AVL 트리, 레드 블랙 트리, B-tree, B+tree 등에서 사용
- 데어베이스 인덱스, 파일 시스템, 파일 시스템 캐시 등에서 널리 사용되는 트리 자료구조
- 이진 트리의 확장, 하나의 노트에 자식 2개 이상
- 내부 노드에 key와 data를 담을 수 있다.
풀 스캔이 테이블 크키에 비례하는 형태로 실행 시간이 늘어가는 데에 비해 인덱스를 사용할 경우 실행 시간의 저하는 보통 원만한 곡선을 그리게 된다.
- B-tree를 개선
- 모든 리프 노드들은 Linked 리스트 형태로 이루어진다.
- 실제 데이터는 리프 노드에만 저장, 내부 노드들은 단지 키만 가지고 있고 올바른 리프 노드로 연결해주는 라우팅 기능을 한다.
- B+tree는 중복 키를 가진다. -> 내부 노드들이 데이터를 가지고 있기 때문에 리프 노드들이 키와 데이터를 모두 가지고 있음.
ex) InnoDB에서 사용된 B+tree
- 같은 레벨의 노드끼리는 Double LinkedList 사용
- 자식 노드로는 Single Linked List로 연결
- key의 범위마다 찾아가야할 페이지 넘버(포인터)가 있는데, 해당 페이지 넘버를 통해 곧바로 다음 노드로 넘어감.
- 리프 노드에서 디스크에 존재하는 데이터의 주소값을 구할 수 있고, Linked List를 통해 탐색도 가능
구분 | B-tree | B+tree |
주요 특징 | 모든 내부, 리프 노드들이 데이터를 가진다. | 단지 리프노드만 데이터를 가진다. |
검색 | 자주 access 되는 노드를 루트 노드 가까이 배치할 수 있고, 루트 노드에서 가까울경우, 브랜치 노드에도 데이터가 존재하기 때문에 빠름. | 리프 노드까지 가야 데이터 존재 |
키 중복 | 없음 | 있음 |
트리의 높이 | 높음 | 낮음(한 노드 당 key를 많이 담을 수 있음) |
풀 스캔시, 검색 속도 | 모든 노드 탐색(상대적으로 느림) | 리프 노드에서 선형 탐색(상대적으로 빠름) |
사용 | 데이터베이스, 검색엔진 | 멀티레벨 인덱스, DB 인덱스 |
참고: https://zorba91.tistory.com/293
[MySQL] B-tree, B+tree란? (인덱스와 연관지어서)
B-tree는 인덱스를 이루고 있는 자료구조의 일종이다. B-tree에서 'B'는 정확히 어떤 의미라고 밝혀진 바는 없다. 아마 'Balanced'를 의미하는 'B'가 아닐까라는 추측만 있다. MySQL의 DB engine인 InnoDB는 B+tr
zorba91.tistory.com
참고: https://github.com/wjdansrl7/2024_CS_STUDY/blob/master/DB/B-tree%2C%20B%2Btree.md
2024_CS_STUDY/DB/B-tree, B+tree.md at master · wjdansrl7/2024_CS_STUDY
SSAFY 11기 CS 스터디. Contribute to wjdansrl7/2024_CS_STUDY development by creating an account on GitHub.
github.com
- 릴레이션은 데이터들을 표(Table)의 형태로 표현한 것으로, 구조를 나타내는 릴레이션 스키마와 실제 값들인 릴레이션 인스턴스로 구성된다.
순수 관계 연산자
- 정규화를 거치지 않은 데이터베이스 내에 데이터들이 불필요하게 중복되어 릴레이션 조작 시 발생하는 예기치 못한 곤란한 현상
- 삽입, 삭제, 갱신 이상
- 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된 가상 테이블
- 저장장치 내에 물리적으로 존재하지 않지만, 사용자에게 있는 것처럼 간주
- 데이터 보정작업, 처리고정 시험 등 임시적인 작업을 위한 용도
- 기본 테이블과 같은 형태의 구조를 가지며, 조작도 기본 테이블과 거의 같다.
- 가상 테이블이기 때문에, 물리적으로 구현되어 있지 않음.
- 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고, 명령문이 간단해진다.
- 조인문의 사용을 최소화, 뷰를 통해서만 데이터에 접근할 수 있기에 뷰에 나타나지 않은 데이터를 안전하게 보호할 수 있음
- 기본 테이블의 기본키를 포함한 속성 집합으로 뷰를 구성해야만 삽입, 삭제, 갱신 연산이 가능하다.
- 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다.
- 하나의 뷰를 삭제하면 그 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.
- 주요 데이터의 액세스를 상호 배타적으로 하는 것
- 트랜잭션들이 어떤 로킹 단위를 액세스하기 전에 Lock을 요청해서 Lock이 허락되어야 만 그 로킹 단위를 액세스할 수 있도록 하는 기법
로킹 단위
- 병행 제어에서 한꺼번에 로킹할 수 있는 데이터 단위
- 데이터베이스, 파일, 레코드, 필드 등은 로킹 단위가 될 수 있다.
- 로킹 단위가 크면 로크 수가 작아 관리하기 쉽지만, 병행성 수준이 낮아지고, 로킹 단위가 작으면 로크의 수가 많아 관리하기 복잡하지만 병행성 수준이 높아진다.
- 논리적으로 하나의 시스템에 속하지만 물리적으로는 네트워크를 통해 연결된 여러 개의 컴퓨터 사이트에 분산되어 있는 데이터베이스를 의미한다.
- 자료의 공유성 향상, 분산 제어가 가능, 시스템 성능 향상, 효용성과 융통성이 높음, 신뢰성 및 가용성이 높음
- DBMS가 수행할 기능이 복잡, 데이터베이스 설계가 어려움, 개발 비용이 증가, 처리 비용 증가, 잠재적 오류 발생 증가
이진 트리의 운행법
주요 정렬 알고리즘의 이해
- 탐색 효율이 좋고, 탐색 시간이 적게 소요된다.
- 전체 파일을 두 개의 서브 파일로 분리해 가면서 Key 레코드를 검색하기 때문에 검색회수를 거듭할 떄마다 검색 대상이 되는 데이터의 수가 절반으로 줄어듦.
- 찾고자 하는 Key 값을 파일의 중간 레코드 Key됴 값과 비교하면서 검색한다.
- 중간 레코드 번호 mid = (low + high) / 2
- Hash Table이라는 기억공간을 할당하고, 해시 함수를 이용하여 레코드 키에 대한 Hash Table 내의 Home Address를 계산한 후 주어진 레코드를 해당 기억장소에 저장하거나 검색 작업을 수행하는 방식
- 검색 속도가 가장 빠르지만, 기억 공간이 많이 요구됨.
- DAM(직접접근방법) 파일을 구성할 때, 해싱이 사용됨
- 삽입, 삭제 작업의 빈도가 많을 때, 유리한 방식
순차 파일 = 순서 파일 -> 자기 테이프(순차 접근)에서 많이 사용
- 입력되는 데이터들을 논리적인 순서에 따라 물리적 연속 공간에 순차적으로 기록
- 급여 관리 등과 같이 변동 사항이 크지 않고 기간별로 일괄 처리를 주로 하는 경우에 적합하다.
- 데이터 검색 시 순차 검색하므로 효율이 낮음.
- 새로운 레코드를 삽입, 삭제, 수정하는 경우 파일 전체를 복사해야 하므로 시간이 많이 소요된다.
색인 순차 파일 (Indexed Sequential File) -> 자기 디스크에서 많이 사용
색인 순차 파일의 구성
동시성 제어 (0) | 2025.04.10 |
---|---|
B-tree, B+tree (0) | 2025.04.10 |
데이터베이스 정의 (0) | 2025.04.07 |
- 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해 해주고, 데이터베이스를 관리해 주는 소프트웨어
- 종속성으로 인한 문제점
- 데이터베이스의 구조와 제약조건에 관한 전반적인 명세를 기술
- 데이터베이스를 구성하는 데이터 객체, 속성, 관계 및 데이터 조작 시 데이터값들이 갖는 제약조건 등에 관해 전반적으로 정의
- 스키마는 데이터 사전에 저장되며, 다른 이름으로 메타 데이터라고도 한다.
외부 스키마 = 서브 스키마 = 사용자 뷰
- 전체 데이터베이스의 한 논리적인 부분으로 볼 수 있으므로 서브 스키마라고도 부른다.
- 하나의 데이터베이스 시스템에는 여러 개의 외부 스키마가 존재할 수 있으며, 하나의 외부 스키마를 여러 개의 응용 프로그램이나 사용자가 공용할 수 있다.
- 일반 사용자는 SQL을 사용하여 DB를 사용한다.
개념 스키마 = 전체적인 뷰
- 데이터베이스의 전체적인 논리적 구조로서, 조직 전체의 데이터베이스로 하나만 존재한다.
- 개체 간의 관계와 제약조건을 나타내고 데이터베이스의 접근 권한, 보안 및 무결성 규칙에 관한 명세를 정의
- 단순한 스키마라고 하면 개념 스키마를 의미
- 데이터베이스 관리자에 의해서 구성
내부 스키마
- 물리적 저장장치의 입장에서 본 데이터베이스 구조
- 실제 데이터베이스에 저장될 레코드의 물리적인 구조를 정의하고, 저장 데이터 항목의 표현 방법, 내부 레코드의 물리적 순서 등을 나타낸다.
- 데이터베이스의 물리적 구조를 정의한다.
데이터베이스 언어(Database Language)
- DB 구조, 데이터 형식, 접근 방식 등 DB를 구축하거나 수정할 목적으로 사용하는 언어
- 데이터 정의 언어의 기능
데이터 조작 언어(DML, Data Manipulation Language) = 서브 언어
데이터 제어 언어(DCL, Data Control Language)
DBA
- 데이터베이스 시스템의 모든 권리와 운영에 대한 책임을 지고 있는 사람이나 그룹
- 개념 스키마와 내부 스키마 정의
- 무결성을 위한 제약조건의 지정
- 보안 및 데이터베이스의 접근 권한 부여 정책 수립
응용 프로그래머
- 일반 호스트 언어로 프로그램을 작성할 때, 데이터 조작어를 삽입해서 일반 사용자가 응용 프로그램을 사용할 숭 ㅣㅆ게, 인터페이스를 제공할 목저긍로 데이터베이스를 접근하는 사람들
- 호스트 언어와 DBMS가 지원하는 데이터 조작어에 능숙한 컴퓨터 전문가
일반 사용자
- 터미널을 이용하여 데이터베이스에 있는 자원을 활용할 목적으로 질의어(SQL)이나 응용 프로그램을 사용하여 데이터베이스에 접근하는 사람들
데이터 모델
- 현실 세계의 정보들을 컴퓨터에 표현하기 위해 단순화, 추상화하여 체계적으로 표현한 개념적 모형
- 데이터, 데이터의 관계, 데이터의 의미 및 일관성, 제약 조건 등을 기술하기 위한 개념적 도구들의 모임.
데이터 모델에 표시할 사항
데이터 모델의 구성 요소
개체-관계(Entity-Relationship) 모델
관계형 데이터 모델 -> 여기부터 논리적 데이터 모델에 관한 설명
- 계층 모델과 망 모델의 복잡한 구조를 단순화시킨 모델
- 표를 이용해서 데이터 상호 관계를 정의하는 DB 구조
- 데이터 간의 관계를 기본키와 이를 참조하는 외래키로 표현
- 대표적인 DBMS: Oracle, MS-SQL, Informix 등
계층형 데이터 모델
- 데이터의 논리적인 구조도가 트리 형태이며, 개체가 트리를 구성하는 노드 역할을 한다.
- 개체를 노드로 표현하고, 개체 집합들 사이의 관계를 링크로 연결
- 개체 타입 간에는 상위와 하위 관계가 존재하며, 1:N 대응 관계만 존재한다.
- 레코드 삭제 시 연쇄 삭제가 된다.
- 개체 타입들 간에는 사이클이 허용되지 않는다.
- 계층형 모델에서는 개체를 세그먼트라 부른다.
- 대표적인 DBMS는 IMS이다.
망(그래프, 네트워크)형 데이터 모델
- 그래프를 이용해서 데이터 논리 구조를 표현한 데이터 모델
- 상위와 하위 레코드 사이에서 N:M 대응 관계를 만족하는 구조
- 상위의 레코드를 Owner, 하위의 레코드를 Member라 하여 Owner-Member 관계라고도 한다.
- 레코드 타입 간의 관계는 1:1, 1:N, N:M이 될 수 있다.
동시성 제어 (0) | 2025.04.10 |
---|---|
B-tree, B+tree (0) | 2025.04.10 |
데이터베이스 설계 (0) | 2025.04.07 |
라이브러리 vs 프레임워크의 차이
라이브러리
- 공통으로 사용될 수 있는 특정한 기능을 모듈화한 것
- 내가 직접 컨트롤할 수 있음.
- 프레임워크에 비해 자유로움.
프레임워크
- 공통으로 사용될 수 있는 특정한 기능을 모듈화한 것.
- 규칙이 엄격함.(폴더 구조, 파일 명 등)
- 제어권이 나한테 없음.(IOC)
디자인 패턴
- 프로그램을 설계할 때, 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 "규약" 형태로 만들어 놓은 것.
싱글톤 패턴
- 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
- 데이터베이스 연결 모듈에 많이 쓰인다.
- 인스턴스를 생성할 때, 드는 비용이 줄어든다.
- 의존성이 높아진다.
중첩 클래스란?
- 클래스 내부에 클래스가 있는 형태
- 자바 기반의 UI 처리를 할 때, 사용자의 입력이나 외부의 이벤트에 대한 처리르 하는 곳에서 많이 사용했으나, 현재는 안드로이드 프로그래밍에서 위젯의 이벤트를 처리하는 핸들러를 구현할 때, 사용한다.
- 다른 클래스와 협력할 일이 적고, 외부 클래스와 밀접한 관련이 있다면 사용된다. -> 두 클래스를 한 번에 관리하기에 적합하고, 불필요한 관계를 감추고 높은 접근성을 얻을 수 있다.
- 외부 클래스와 내부 클래스가 서로의 멤버에 쉽게 접근할 수 있음.
- 소스의 가독성과 유지보수성을 높일 수 있다.
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
- 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.
참고: https://velog.io/@blwasc/Java-%EC%A4%91%EC%B2%A9-%ED%81%B4%EB%9E%98%EC%8A%A4
[Java] 중첩 클래스
중첩 클래스(Nested class)란?, 중첩 클래스를 사용하는 이유, 중첩 클래스의 장점, 중첩 클래스의 종류, 내부 인터페이스(Nested Interface)란?
velog.io
* 중첩 클래스를 이용해서 활용한 예시
class Singleton {
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
public class HelloWorld {
public static void main(String[] args) {
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
System.out.println(a.hashCode());
System.out.println(b.hashCode());
if (a == b) {
System.out.println(true);
}
}
}
싱글톤 패턴의 단점
1. '독립적인' 인스턴스를 만들기가 어려움 -> 단위 테스트는 테스트가 서로 독립적이어야 하는데, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로
단위테스트가 '독립적' -> 테스트를 어떤 순서로든 실행할 수 있어야 한다.
2. 모듈 간의 결합을 강하게 만들 수 있다. => 의존성 주입(DI)를 통해 결합도를 낮출 수 있음.
의존성
- 종속성이라고도 불림.
- A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 한다는 것.
의존성 주입 장점
- 모듈들을 쉽게 교체할 수 있는 구조로 만들 수 있다. -> 메인 모듈이 '직접' 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 '간접적'으로 의존성 주입을 주는 것.
- 테스팅하기 쉽고, 마이그레이션하기도 수월함.
구현할 때, 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 애플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있고, 모듈 간의 관계가 명확해짐.
의존성 주입 단점
- 모듈이 더 많이 분리되므로, 클래스 수가 많아지고 이로 인해, 약간의 런타임 패널티가 발생할 수 있음.
의존성 주입 원칙
"상위 모듈은 하위 모듈에서 어떠한 것도 가져와서는 안된다."
- 상위 모듈과 하위 모듈 모두 "추상화"에 의존해야 한다.
- 추상화는 "세부 사항"에 의존해서는 안된다.
팩토리 패턴
- 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴
- 상속관계가 있는 두 클래스에서 상위 클래스는 크게 뼈대를 결정하고, 하위 클래스는 객체 생성에 관한 구체적인 내용을 결정하는 패턴
- 상위 클래스는 객체 생성 방식에 대해 알 필요가 없고, 느슨한 결합이 가능하다.
- 객체 생성 로직이 따로 분리되어 있기 때문에 수정할 일이 있다면 그 부분만 고치면 되므로 유지보수성이 늘어난다.
- 전달받은 값에 따라 다른 객체를 생성하며 인스턴스의 타입을 정한다.
enum CoffeeType {
LATTE,
ESPRESSO
}
abstract class Coffee {
protected String name;
public String getName() {
return name;
}
}
class Latte extends Coffee {
public Latte() {
name = "Latte";
}
}
class Espresso extends Coffee {
public Espresso() {
name = "Espresso";
}
}
class CoffeeFactory {
public static Coffee createCoffee(CoffeeType type) {
switch (type) {
case LATTE:
return new Latte();
case ESPRESSO:
return new Espresso();
default:
throw new IllegalArgumentException("invalid type");
}
}
}
public class Main {
public static void main(String[] args) {
Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
System.out.println(coffee.getName());
}
}
Enum
- 상수의 집합을 정의할 때, 사용되는 타입
- 상수뿐만 아니라 메서드를 집어 넣어 관리할 수도 있음.
- 본질적으로 thread safe 하기 때문에 싱글톤 패턴을 만들 때 도움이 된다.
전략 패턴
- 객체의 행위를 바꾸고 싶은 경우, "직접" 수정하지 않고 전략이라고 부르는 '캡슐화된 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴
- 우리가 어떤 상품을 구매할 때, 네이버페이, 카카오페이 등 다양한 방법으로 결제하듯이 결제 방식의 '전략'만 바꿔서 두 가지 방식으로 결제하는 것
interface PaymentStrategy {
public void pay(int amount);
}
class KAKAOCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public KAKAOCardStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.dateOfExpiry = dateOfExpiry;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using KAKAOCard.");
}
}
class LUNACardStrategy implements PaymentStrategy {
private String emailId;
private String password;
public LUNACardStrategy(String emailId, String password) {
this.emailId = emailId;
this.password = password;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using LUNACard.");
}
}
class Item {
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
class ShoppingCart {
List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
this.items.add(item);
}
public void removeItem(Item item) {
this.items.remove(item);
}
public int calculateTotal() {
int sum = 0;
for (Item item : items) {
sum += item.getPrice();
}
return sum;
}
public void pay(PaymentStrategy paymentMethod) {
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
public class HelloWorld {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item A = new Item("knudolA", 100);
Item B = new Item("knudolB", 300);
cart.addItem(A);
cart.addItem(B);
// pay by LUNACard
cart.pay(new LUNACardStrategy("ex1@example.com", "pukubababo"));
// pay by KAKAOCard
cart.pay(new KAKAOCardStrategy("ex2", "123456", "123", "12/01"));
/**
* 400 paid using LUNACard.
* 400 paid using KAKAOCard.
*/
}
}
컨텍스트
- 어떠한 작업을 완료하는데 필요한 모든 관련 정보를 말한다.
출처: 면접을 위한 전공 CS노트