Backend-RoadMap_About Database

2023. 3. 23. 15:44CS/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를 다루는 큰 작업에도 비교적 적은 리스크와 시간만 소요 가능

 

단점

  • 완벽한 ORM으로만 서비스 구현이 힘듬
    • 프로젝트의 복잡성이 커질 경우 난이도 증가
    • 잘못 구현된 경우 일관성이 무너짐

 

트랜잭션

  • 여러개의 작업을 하나로 묶은 실행 유닛
    • 각 트랜잭션을 하나의 특정 작업으로 시작해서 묶여있는 모든 작업들을 다 완료해야 정상적으로 종료
    • 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단
  • 데이터베이스의 상태를 변환시키능 기능을 수행하기 위한 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위
  • 트랜잭션 상태
    • Active state
      • 트랜잭션은 명령이 수행되는 동안 활성화
    • Partially committed state
      • 변경이 실행되었지만 데이터베이스는 아직 디스크에서 변경 사항을 커밋하지 않음
      • 데이터는 메모리 버퍼에 저장, 버퍼는 아직 디스크에 기록되지 않음
    • Committed state
      • 모든 트랜잭션 업데이트가 데이터베이스에 영구적으로 저장됨
      • 이 시점 이후 트랜잭션을 롤백할 수 없음
    • Failed state
      • 트랜잭션이 실패하거나 active 상태 또는 partially committed 상태에서 중단된 경우 Failed 상태가 됨
    • Terminated 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();
      • QueryBuilder 사용
        • Mybatis, QueryDSL 등 사용

 

정규화

  • 이상현상이 있는 릴레이션을 분해하여 이상현상을 제거하는 과정
  • 장점
    • 이상 현상 제거
    • 데이터베이스와 연동된 응용프로그램에 최소한의 영향만을 미침
    • 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되어 한 테이블의 데이터 용량이 최소화됨
  • 단점
    • 릴레이션 분해로 인해 릴레이션간 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 공격으로 리소스 고갈 및 성능 저하로 이어질 때 발생

 

데이터베이스 성능 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-소개/

https://hanamon.kr/데이터베이스-트랜잭션의-acid-성질/

https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1

'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