3주차 - 1) 데이터베이스

변현섭·2023년 6월 8일
2

Ⅰ. 핵심 키워드

1. 데이터베이스

1) 개념

데이터베이스란, 여러 사람들이 공유하고 사용할 목적으로 통합 관리되는 데이터들의 모임으로, 파일로 데이터를 저장하는 파일시스템의 단점을 보완하기 위해 생겨난 개념이다. 쉽게 말하자면 데이터의 저장소인 것이다.

2) 종류

데이터베이스는 계층형(Hierarchical), 망형(Network), 관계형(Relational), 객체지향형 (Object-Oriented), 객체관계형(Object-Relational) 등으로 분류된다. 그 중에서 계층형, 망형, 관계형에 대해서 알아보자.

① 계층형 DB

  • 처음으로 등장한 DB의 개념으로 tree의 형태를 띄고 있다. 처음 구성을 완료한 이후 변경하기가 어렵고, 아래 예시처럼 재무2팀에서 회계팀으로 연결되는 루트가 매우 비효율적이다. 이러한 이유로 지금은 잘 사용되지 않는 구조이다.

② 망형 DB

  • 계층형 DB의 단점을 보완하기 위해 등장한 개념으로 하위 구성원 간의 연결이 단순해졌다. 다만 프로그래머가 구조를 이해하기 복잡하여 프로그램 작성이 어려워진다는 단점이 있다. 이 역시 잘 사용되지 않는 구조이다.

③ 관계형 DB

  • 현재 대부분의 DB는 관계형 DB 형태로 사용되고 있다. 데이터베이스를 table이라는 최소 단위로 구성하고, table은 하나 이상의 열과 행으로 이루어져 있다. 우리가 자주 사용하는 워드나 엑셀파일의 표를 떠올리면 된다.

2. DBMS

1) 개념

DBMS(DataBase Mangement System)는 데이터베이스를 관리하여 응용 프로그램들이 데이터베이스를 공유하고 사용할 수 있도록 만들어주는 소프트웨어이다. 특징은 다음과 같다.

  • 데이터와 응용 프로그램 간의 상호 의존관계가 없다. 즉, 데이터베이스에 변화가 생기더라도 응용프로그램을 수정할 필요가 없고 응용프로그램의 변화가 생기더라도 데이터베이스를 수정할 필요가 없다.
  • 입력 조건에 맞지 않는 입력 값을 방지하는 유효성 검사 과정을 통해 데이터의 무결성을 유지한다.
  • 허가된 사용자만이 자원에 접근할 수 있도록 설정함으로써 데이터 보안 구현이 가능하다.
  • 연관된 정보를 논리적인 구조로 관리함으로써 중복데이터나 불일치 데이터의 발생을 예방한다.

그 외에도 데이터베이스 구축에 필요한 틀, 장애복구 기능, DB접근을 위한 인터페이스, 데이터 검색 및 저장 기능 등을 제공한다.

2) 종류

현재 우리가 사용하는 대부분의 DBMS는 RDBMS(Relational DataBase Management System)라 하는 관계형 DBMS형태로 사용되고 있다. 대표적인 RDBMS의 예로는 오라클(Oracle), MySQL, MSSQL, MariaDB 등이 있고, 이들은 아래와 같은 특징이 있다. 참고만 하자.

추가로 DBMS에서 사용하는 언어를 SQL(Structured Query Language)이라고 하는데, 주로 관계형 데이터베이스에서 데이터베이스를 조작하는 언어로 사용된다. SQL이 사용되는 DBMS를 만드는 회사가 여럿이기 때문에 각 회사의 제품은 공통적인 표준 SQL과 각 회사마다의 개별적 특성이 혼재한다. 대표적으로 오라클, SQL 서버, MySQL은 각자 PL/SQL, T-SQL, SQL을 자신만의 기능으로 가지고 있으면서, 표준 SQL을 공유한다.

3. 관계형 데이터베이스 주요 용어

① 테이블

  • 데이터베이스에서 단일 주제에 대해 행과 열로 구성되는 정보 모음을 의미한다.

② 열

  • attribute, field라고도 부른다. 개체를 표현하거나 특정 짓는 항목이다.

③ 행

  • record, tuple이라고도 부른다. 각 행은 특정 entity의 속성 값의 모임이 된다.

④ 기본키(Primary Key)

  • 먼저 키란, 데이터베이스에서 조건에 만족하는 행을 찾거나 순서대로 정렬할 때 행들을 서로 구분할 수 있는 기준이 되는 속성(열)을 의미한다. 키의 종류로는 기본키, 후보키, 대체키, 슈퍼키, 외래키가 있다.
  • 그 중에서 기본키는 주 키 또는 프라이머리 키라고 하며, 후보키 중에서도 특별히 선정된 키이다. 중복된 값을 가질 수 없으며, 테이블 당 하나만 선정할 수 있다. 다시 말해 유일성과 최소성을 만족한다. 이는 튜플(행)을 식별하기 위해 반드시 필요하다.
  • 기본키는 NULL값을 가질 수 없기 때문에 튜플에서 기본 키로 설정된 속성에는 NULL값이 입력될 수 없다. 기본키를 선정할 때에는 속성 값이 변경될 가능성이 높은 경우는 되도록 피하고, 가능하면 정수 값이나 짧은 문자열을 가진 경우를 선택하도록 한다.
  • 기본키는 필수로 지정해야 하는 것은 아니지만, 데이터의 일관성을 높여 데이터 추출 등의 처리 속도를 향상시킬 수 있기 때문에 선정할 것을 권장한다.

⑤ 외래키(Foreign Key)

  • 외래키는 하나의 테이블을 이용해 데이터를 분석할 때에는 큰 의미가 없다. 하지만 여러 개의 테이블을 조합해서 데이터를 분석할 때에 매우 유용하다.
  • 고객의 주문을 받아 상품을 배송해주는 온라인 서비스의 경우를 생각해보자. 이 때 필요한 정보는 두가지로, 고객에 대한 정보와 주문에 대한 정보이다. 아래는 순서대로 고객에 대한 정보와 주문에 대한 정보이다.

  • 위의 모든 속성을 이용하여 하나의 테이블을 구성한다면 어떠한 문제가 있을까? 가장 큰 문제는 데이터의 중복이 자주 발생하게 된다는 것이다. 예를 들어 marco117이라는 고객이 한번에 4개의 주문을 요청한다면 그 결과는 아래와 같을 것이다.
  • 중복데이터가 많아지면 데이터를 찾기 어려워질 뿐만 아니라 저장공간도 낭비된다. 이를 해결하기 위해 고객정보 테이블과 주문정보 테이블을 각각 따로 관리하고, 주문정보 테이블에서 주문 고객의 기본 키를 입력받기로 하자.
  • 위 주문테이블에서의 user_id(고객 정보 테이블의 기본 키)가 바로 외래키에 해당한다. 외래키는 두 개의 테이블을 연결해주는 역할을 수행한다. 외래키는 새롭게 추가되는 행에서 외래키에 해당하는 값이 외래키가 참조하는 테이블에 존재하는 지를 검사한다. 즉, 기본키가 데이터의 중복 삽입을 방지하는 역할을 수행하듯이, 외래키는 테이블 내에 저장된 데이터가 항상 참조하는 값이 있음을 보장하는 역할을 한다.

⑥ 그 외의 키

  • 슈퍼키: 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성(열)들의 집합이다. 유일성은 만족하되 최소성은 만족하지 않아도 된다. 테이블 내에서의 구별만 가능하면 되기 때문에 주민번호나 학번처럼 실제로 유일하지 않더라도, 테이블에 따라 이름이나 나이(또는 둘을 묶어서 생각해도 됨)도 슈퍼키가 될 수 있다.
  • 후보키: 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합이다. 기본키가 될 수 있는 후보들을 뜻하며, 유일성과 최소성을 만족해야한다. 아래의 예시에서 알 수 있듯 행을 구분지음에 있어 2가지의 속성이 관여하는 경우는 최소성을 만족하지 않으므로 후보키가 될 수 없다.
  • 대체키: 후보키가 두 개 이상이고, 그 중 하나를 기본키로 지정했을 때 남는 후보키들을 대체키라 한다. 위의 예시에서 학번을 기본키로 지정한다면 주민번호는 대체키가 될 것이다.

⑦ 인덱스

  • 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상기키는 일종의 자료구조이다.
  • 인덱스의 가장 큰 장점은 데이터들이 정렬된다는 것이다. 이는 곧 WHERE(조건 검색), ORDER BY(정렬), MIN, MAX의 처리효율 상승으로 이어진다.
  • 인덱스의 가장 큰 장점은 정렬인데, 때로는 항상 정렬 상태를 유지 해야한다는 것이 단점이 될 수 있다. 예를 들어 INSERT, UPDATE, DELETE를 통해 데이터가 추가되는 등 값의 변경이 생긴다면, 인덱스 테이블 내에 있는 값들을 다시 정렬해야 한다. 즉 DML(Data Manipulation Language로 select, insert, update, delete를 의미)이 빈번한 경우에는 사용이 부적합하다.
  • 만약 데이터의 개수가 적은 경우, 인덱스 스캔이나 풀스캔이나 큰 차이가 없기 때문에 굳이 인덱스를 사용할 필요가 없다. 인덱스에는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하기 때문에 속도향상과 그에 따른 단점들의 비용을 잘 비교하여 사용할지 말지 판단해야 한다.

⑧ 뷰

  • 뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된 이름을 가지는 가상 테이블이다.
  • 뷰는 저장장치 내에 물리적으로 존재하진 않지만, 사용자에게 있는 것처럼 간주된다.
  • 또한 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용되기도 한다.
  • 기본 테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용하며 조작도 기본 테이블과 유사하다.
  • 데이터의 논리적 독립성을 제공할 수 있다.
  • 필요한 데이터만 뷰로 정의하여 처리가능하기 때문에 관리가 용이하고 명령문이 간단해진다.
  • 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다.
  • 기본키를 포함한 속성 집합으로 뷰를 구성해야 삽입, 삭제, 갱신, 연산이 가능하다.

4. 정규화

정규화(Normalization)의 기본 목표는 테이블 간의 중복된 데이터를 허용하지 않는다는 것이다. 중복을 불허함으로써 무결성을 유지할 수 있으며 DB의 저장 용량 역시 줄일 수 있다. 테이블을 어떻게 분해하는지 따라 정규화 단계가 달라진다.

1) 제1 정규화

제1 정규화는 테이블의 column이 원자값을 갖도록 테이블을 분해하는 것이다. 여기서 원자값이란, 속성값이 더 이상 논리적으로 분해될 수 없는 경우를 의미한다. 아래의 예시를 보자.

여러 취미를 가진 좌측의 테이블을 제1 정규화로 분해하면 우측의 테이블과 같은 모습이 된다.

2) 제2 정규화

제2 정규화는 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이란, 기본키의 부분집합이 결정자(한 속성의 값을 고유하게 결정하는 속성)가 되어선 안됨을 의미한다. 아래의 예시를 보자.

위 테이블에서 기본키는 {학생번호, 강좌이름}으로 복합키이다. 그리고 {학생번호, 강좌이름}인 기본키는 성적을 결정하고 있으며, 강의실 column은 기본키의 부분집합인 강좌 이름에 의해 결정될 수 있다. 즉, 기본키의 부분집합인 강좌 이름이 결정자이기 때문에 강의실을 분리하여 별도의 테이블에서 관리함으로써 아래의 제2 정규형을 만들 수 있다.

3) 제3 정규화

제3 정규화는 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이란 A → B, B → C가 성립할 때 A → C가 성립되는 것을 의미한다. 아래와 같은 예시가 이에 해당한다.

위 테이블은 학생번호 → 강좌이름 테이블과 강좌이름 → 수강료 테이블로 나눌 수 있다. 이는 학생의 강좌가 변경될 경우 수강료까지 변경해야 하는 수고를 덜어줄 수 있다.

5. ACID

ACID(Atomicity, Consistency, Isolation, Durability)는 트랜잭션을 정의하는 4가지 중대한 속성을 가리키는 약어이다.

※ 트랜잭션
쪼갤 수 없는 업무처리의 최소 단위로, 데이터베이스의 상태를 변화시키기 위해 수행되는 작업의 단위를 의미한다. 넓은 의미로 데이터베이스와 데이터 스토리지 시스템에서 한 단위의 작업으로 취급되는 모든 작업을 의미하기도 한다. ACID를 번역하면 원자성, 일관성, 신뢰성, 고립성(격리) 그리고 영속성이다. ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질이다.

데이터베이스 작업에 ACID 속성이 있으면, 이를 ACID 트랜잭션이라 부르고 이 작업을 적용하는 데이터 스토리지 시스템을 트랜잭션 시스템이라 한다. ACID 트랜잭션은 한 테이블의 읽기, 쓰기, 또는 수정 작업이 각각 다음과 같음을 보장해준다.

1) 원자성(Atomicity)

트랜잭션에 속한 각각의 읽기, 쓰기, 업데이트, 삭제문을 하나의 단위로 취급한다. 즉, 위 명령의 실행이 성공하거나 실패하거나 둘 중 하나일 뿐 그 중간 어딘가의 상태는 존재하지 않는다는 것이다. 쉽게 말해, 특정 쿼리를 실행했는데 부분적인 실패가 있다면 전부 실패하도록 구현한다는 것이다.

예를 들어 A계좌에서 돈을 출금하여 B계좌에 입금한다고 하자. A계좌에서의 출금은 정상적으로 진행되었는데, B계좌에 입금되지 않았다면 상황이 복잡해질 것이다. 만약 이러한 사례에 원자성을 적용한다면, 출금에 성공하더라도 입금에 실패하였으므로 출금작업을 포함한 모든 작업이 다 실패로 처리된다.

2) 일관성(Consistency)

일관성이란 말그대로 데이터베이스의 상태가 일관되어야 하는 성질이다. 트랜잭션의 이전과 이후, 데이터베이스의 상태는 여전히 유효해야 한다. 즉, 데이터베이스의 제약이나 규칙을 그대로 유지하고 있어야 한다.

예를 들어 모든 고객은 반드시 이름을 가지고 있어야 한다는 데이터베이스 제약사항이 있다고 가정하자. 따라서 이름 없는 새로운 고객을 추가하는 쿼리 또는 기존 고객의 이름을 삭제하는 쿼리는 일관성을 위반하는 트랜잭션이다.

3) 고립성(Isolation)

고립성은 모든 트랜잭션이 다른 트랜잭션으로부터 독립되어야 한다는 뜻이다. 실제로 여러 개의 트랜잭션들이 동시에 수행될 때, 각 트랜잭션은 격리되어 있으므로, 마치 연속적으로 실행되는 것 같은 결과를 보인다(동시에 실행된 결과는 연속적으로 실행된 결과와 같아야 한다).

예를 들어 계좌에 만원이 있다고 하자. 이 계좌에서 계좌 A로 6천원을, 계좌 B로 6천원을 동시에 이체하는 경우와 계좌 A에 먼저 이체한 후 연속적으로 B에 이체한 것의 결과가 동일해야 한다. 동시에 트랜잭션을 실행한다고 해서 각 6천원씩 보내게 되면, 마이너스 통장이 되어버릴 것이다.

4) 영속성(Durablility)

영속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 하는 성질을 의미한다. 런타임 오류나 시스템 오류가 발생하더라도 해당 기록은 영구적이어야 한다.

예를 들어 계좌이체를 성공적으로 실행한 후에 해당 은행 데이터베이스에 문제가 발생해 강제 종료되었다고 하자. 그렇다 하더라도 계좌이체 내역은 기록으로 남아있어야 할 것이다. 반대로 계좌이체를 실행하는 도중에 데이터베이스에 오류가 생긴다면, 해당 이체를 실패시키고 출금계좌와 입금계좌는 이전 상태를 유지하거나 이전 상태로 돌아가야 한다.

6. SQL

1) SQL

SQL(Structured Query Language)은 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어이다. 관계형 데이터베이스는 정보를 표 형식으로 저장하는데, SQL문을 사용하여 데이터베이스에서 정보를 저장, 업데이트, 제거, 검색할 수 있다.

또한 데이터베이스 성능을 유지 및 관리하고 최적화하는 데에도 SQL이 사용된다. SQL명령은 아래와 같이 분류된다.

  • 데이터 정의 언어(DDL): 데이터베이스 구조를 설계하는 SQL명령
  • 데이터 쿼리 언어(DQL): 관계형 데이터베이스에 저장된 데이터를 검색하기 위한 명령
  • 데이터 조작 언어(DML): 새 정보를 쓰거나 관계형 데이터베이스의 기존 레코드를 수정
  • 데이터 제어 언어(DCL): 다른 사용자의 데이터베이스 액세스를 관리하거나 권한을 부여
  • 트랜잭션 제어 언어(TCL): 데이터베이스를 자동으로 변경

2) MySQL

MySQL은 Oracle에서 제공하는 오픈소스 관계형 데이터베이스 관리 시스템이다. 개발자는 라이선스 비용 지불 없이 MySQL을 다운로드하여 사용 가능하다.

MySQL은 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템으로, 다중 사용자와 다중 스레드를 지원한다. C언어, C++, Java, PHP 등 여러 프로그래밍 언어를 위한 다양한 API 또한 제공하고 있다. MySQL은 다양한 운영체제에서 사용할 수 있으며, 특히 PHP와 함께 웹 개발에 자주 사용된다.

참고로 SQL과 MySQL의 관계에 대해 알아보면 MySQL은 SQL 쿼리를 사용하는 DBMS로, SQL 명령은 국제 표준에 의해 정의된 반면, MySQL은 소프트웨어의 지속적인 업그레이드 및 개선을 거치고 있다.

[이미지 출처]

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글