Backend-RoadMap_About Database
2023. 3. 23. 15:44ㆍCS/Backend-RoadMap
728x90
Database
- 컴퓨터 시스템에 전자적으로 저장되는 구조화된 정보 또는 데이터의 조직화된 모음
- 데이터베이스 관리 시스템(DBMS)에 의해 제어
유형
- 관계형 데이터 베이스
- 행과 열이 있는 테이블 집합으로 구성
- 구조화된 정보에 엑세스하는 가장 효율적이고 유연한 방법 제공
- 객체 지향 데이터 베이스
- 객체 지향 프로그래밍과 같이 객체의 형태로 표현
- 분산 데이터 베이스
- 서로 다른 사이트에 있는 둘 이상의 파일로 구성
- 데이터베이스는 동일한 물리적 위치에 있는 여러 컴퓨터에 저장되거나 서로 다른 네트워크에 분산되어 있을 수 있음
- 데이터 웨어하우스
- 데이터의 중앙 리포지토리
- 빠른 쿼리 및 분석을 위해 설계된 데이터베이스 유형
- NoSQL 데이터 베이스
- 구조화되지 않은 데이터와 반 구조화된 데이터를 저장하고 조작 가능
- 그래프 데이터 베이스
- 엔터티 및 엔턴티 간의 관계 측면에서 데이터를 저장
- 오픈 소스 데이터베이스
- 소스코드가 오픈소스인 시스템
- 클라우드 데이터베이스
- private, public, 하이브리드 클라우드 컴퓨팅 플랫폼에 상주하는 정형 또는 비정형 데이터 모음
- 다중 모델 데이터베이스
- 서로 다른 유형의 데이터베이스 모델을 단일 통합 백엔드로 결합
- 다양한 데이터 유형을 수용 가능
- 문서/JSON 데이터베이스
- 문서 중심 정보를 저장 및 관리하도록 설계된 문서 데이터베이스
- JSON 형식으로 데이터를 저장
- 자율 구동 데이터베이스
- 클라우드 기반
- 기계 학습을 사용하여 데이터베이스 조정, 보안, 백업, 업데이트및 전통적으로 DBMS가 수행하는 기타 일상적인 관리 작업을 자동화
DBMS
- 데이터베이스 관리 시스템
- 데이터베이스와 최종 사용자 또는 프로그램 간의 인터페이스 역할
- 사용자가 정보를 구성하고 최적화하는 방법을 검색, 업데이트 및 관리 할 수 있도록 함
- 데이터베이스의 감독 및 제어를 용이하게 하여 성능 모니터링, 튜닝, 백업 및 복구와 같은 관리 작업을 가능하게 함
- 예시
- MySQL, Microsoft SQL Server, Oracle Database 등
ORM
- 객체 관계형 매핑 (Object Relational Mapping)
- 객체와 데이터베이스의 관계를 매핑해주는 도구
- 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도구
사용 이유
- 객체 지향 프로그래밍은 클래스를 이용, 관계형 데이터베이스는 테이블을 이용
- → 객체 모델과 관계형 모델 간의 불일치가 존재
- ORM을 사용하여 데이터베이스 접근을 프로그래밍 언어의 관점에서 맞출 수 있음
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치 해결
- SQL문을 직접 작성하지 않고 엔티티를 객체로 표현 가능
- 객체를 통해 간접적으로 데이터베이스를 다름
- 느슨하게 연결된, 테스트에 용이한 애플리케이션을 만들 수 있음
장점
- 가독성 및 생산성
- SQL Query가 아닌 메서드로 데이터 조작 가능
- 프로그래머가 객체 모델로 프로그래밍 하는 것에 더 집중 가능
- 객체에 대한 코드를 별도로 작성하기 때문에 코드 가독성 향상
- SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 생산성이 증가
- 재사용 및 유지보수 편리성 증가
- 디자인 패턴을 견고하게 만드는데 유리
- 독립적으로 작성되었고, 해당 객체들을 재활용 가능
- DBMS에 대한 종속성 저하
- 객체 간 관계를 바탕으로 SQL을 자동 생성
- RDBMS의 데이터 구조와 프로그래밍 언어의 객체 모델 사이의 간격을 좁힘
- DB에 종속적이지 않음
- 프로그래머는 Object에 집중하여 DBMS를 다루는 큰 작업에도 비교적 적은 리스크와 시간만 소요 가능
- 객체 간 관계를 바탕으로 SQL을 자동 생성
단점
- 완벽한 ORM으로만 서비스 구현이 힘듬
- 프로젝트의 복잡성이 커질 경우 난이도 증가
- 잘못 구현된 경우 일관성이 무너짐
트랜잭션
- 여러개의 작업을 하나로 묶은 실행 유닛
- 각 트랜잭션을 하나의 특정 작업으로 시작해서 묶여있는 모든 작업들을 다 완료해야 정상적으로 종료
- 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단
- 데이터베이스의 상태를 변환시키능 기능을 수행하기 위한 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위
- 트랜잭션 상태
- Active state
- 트랜잭션은 명령이 수행되는 동안 활성화
- Partially committed state
- 변경이 실행되었지만 데이터베이스는 아직 디스크에서 변경 사항을 커밋하지 않음
- 데이터는 메모리 버퍼에 저장, 버퍼는 아직 디스크에 기록되지 않음
- Committed state
- 모든 트랜잭션 업데이트가 데이터베이스에 영구적으로 저장됨
- 이 시점 이후 트랜잭션을 롤백할 수 없음
- Failed state
- 트랜잭션이 실패하거나 active 상태 또는 partially committed 상태에서 중단된 경우 Failed 상태가 됨
- Terminated state
- 커밋이 되거나, 중단된 상태 이후의 마지막이자 마지막 트랜잭션 상태
- Active state
ACID
- Atomicity, Consistency, Isolation, and Durability
- 원자성, 일관성, 고립성, 지속성
- 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질
- 원자성
- 전한 트랜잭션의 연산들이 모두 성공하거나, 반대로 모두 실패되는 성질
- 안전성 보장
- 일관성
- 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야함
- 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야함
- 데이터베이스의 상태가 일관되어야 한다는 성질
- 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야함
- 고립성(격리성)
- 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야함
- 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜잭션은 고립되어 연속으로 실행된 것과 동일 한 결과를 나타냄
- 지속성
- 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성질
- 런타임 오류나 시스템 오류가 발생하여도 해당 기록은 영구적이여야함
N+1 쿼리
- 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생
- 발생 이유
- jpa Repository에 정의한 인터페이스 메서드를 실행하면 JPA는 메서드 이름을 분석해서 JPQL을 생성하여 실행
- JPQL은 SQL을 추상화한 객체지향 쿼리 언어로서 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 한다.
- 그렇기 때문에 JPQL은 findAll()이란 메소드를 수행하였을 때 해당 엔티티를 조회하는
select * from Owner
쿼리만 실행 - JPQL 입장에서는 연관관계 데이터를 무시하고 해당 엔티티 기준으로 쿼리를 조회
- 그렇기 때문에 연관된 엔티티 데이터가 필요한 경우, FetchType으로 지정한 시점에 조회를 별도로 호출
- 해결 방안
- Fetch join (JPQL로 작성)
- 단점
- Fetch Type을 사용할 수 없음 (연관관계 설정한 Lazy 등)
- 페이징 쿼리 사용 불가
- 단점
-
@Query("select o from Owner o join fetch o.cats") List<Owner> findAllJoinFetch();
- EntityGraph
- @EntityGraph 의 attributePath에 쿼리 수행시 가져올 필드명 지정
- Lazy가 아닌 Eager 조회로 가져옴
- Lazy: 지연 로딩
- Eager: 즉시 로딩
@EntityGraph(attributePaths = "cats") @Query("select o from Owner o") List findAllEntityGraph();
- Lazy가 아닌 Eager 조회로 가져옴
- @EntityGraph 의 attributePath에 쿼리 수행시 가져올 필드명 지정
- QueryBuilder 사용
- Mybatis, QueryDSL 등 사용
- EntityGraph
- Fetch join (JPQL로 작성)
정규화
- 이상현상이 있는 릴레이션을 분해하여 이상현상을 제거하는 과정
- 장점
- 이상 현상 제거
- 데이터베이스와 연동된 응용프로그램에 최소한의 영향만을 미침
- 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되어 한 테이블의 데이터 용량이 최소화됨
- 단점
- 릴레이션 분해로 인해 릴레이션간 JOIN연산이 많아짐
- 응답 시간이 느려질 수 있음
- 성능 저하 발생시 반정규화 적용 가능
종류
- 제 1 정규형
- 규칙
- 각 컬럼이 하나의 속성만을 가져야함
- 하나의 컬럼은 같은 종류나 타입의 값을 가져야함
- 각 컬럼이 유일한 이름을 가져야함
- 컬럼의 순서가 상관 없어야함
- 규칙
- 제 2 정규형
- 제 1 정규형을 만족해야함
- 모든 컬럼이 부분적 종속이 없어야함
- == 완전 함수 종속을 만족해야함
- 제 3 정규형
- 제 2 정규형을 만족해야함
- 기본키를 제외한 속성들 간의 이행 종속성이 없어야함
- BCNF(Boyce-Codd Normal Form)
- 제 3 정규형을 만족해야함
- 모든 결정자가 후보키 집합에 속해야함
- 제 4 정규형
- BCNF를 만족
- 다치 종속이 없어야함
- 제 5 정규형
- 제 4 정규형을 만족해야함
- 조인 종속이 없어야함
- 조인 연산을 했을 때 손실이 없어야함
Failure Modes
- 데이터베이스에서 발생할 수 있는 실패
- 종류
- Read contention
- 여러 클라이언트 및 프로세스가 동시에 데이터베이스의 동일한 위치에서 데이터를 읽을 때 발생
- Write contention
- 여러 클라이언트 및 프로세스가 동시에 데이터베이스의 동일한 위치에서 데이터를 쓸 때 발생
- Thundering herd
- 많은 수의 클라이언트 또는 프로세스가 동일한 리소스에 동시에 액세스 시도하는 경우 리소스 고갈 및 성능 저하를 초래 할 수 있는 경우 발생
- Cascade
- 데이터베이스 시스템의 한 부분에 장애가 발생하여 시스템의 다른 부분에 장애가 발생하는 연쇄 반응이 발생할 때 발생
- Deadlock
- 두 개 이상의 트랜잭션이 리소스에 대한 잠금을 해제하기 위해 서로 대기하여 정지상태가 될 때 발생
- Corruption
- 데이터베이스의 데이터가 손상되어 데이터베이스를 읽거나 쓸 때 오류 또는 예기치 않은 결과가 발생
- Hardware failure
- 디스크 드라이브, 메모리 등 하드웨어에 오류가 발생하여 데이터 손실 및 손상 발생
- Software failure
- DBMS, 애플리케이션 등 소프트웨어가 실패할 때 발생
- Network failure
- 데이터베이스와 클라이언트 간의 네트워크 연결이 끊어졌을 때 발생
- Denial of service (DoS) attack
- DoS 공격으로 리소스 고갈 및 성능 저하로 이어질 때 발생
- Read contention
데이터베이스 성능 profiling
- Monitor system performance
- window 작업 관리자 등 툴을 이용하여 데이터베이스 서버의 성능 모니터링
- 리소스 병목 현상 식별에 도움이 될 수 있는 CPU, 메모리 등 확인 가능
- Use database-specific tools
- DBMS의 자체 성능 모니터링 도구 사용
- Use third-party tools
- SolarWinds Database Performance Analyzer 등 도구 사용
- Analyze slow queries
- 느리게 실행되는 특정 쿼리가 있는 경우 툴을 사용하여 문제 식별
- Monitor application performance
- 특정 어플리게이션에서 성능 문제 발생하는 경우 툴을 사용하여 모니터링하고 문제 식별
참고자료
https://www.oracle.com/database/what-is-database/
https://hanamon.kr/orm이란-nodejs-lib-sequelize-소개/
'CS > Backend-RoadMap' 카테고리의 다른 글
Backend-RoadMap_Web Security Knowlege (0) | 2023.04.11 |
---|---|
Backend-RoadMap_APIs (0) | 2023.03.27 |
Backend-RoadMap_Scaling Databases (0) | 2023.03.23 |
Backend_Roadmap_OS(+파일시스템) (0) | 2023.03.22 |
Backend-RoadMap_인터넷 개념 정리 (0) | 2023.03.21 |