DataScience

[PostgreSQL] PostgreSQL 기본

Grace 2023. 5. 8. 12:47

데이터베이스는 무엇인가

데이터베이스

데이터베이스의 정의

데이터는 현실에 존재하는 사실적인 자료들의 집합이라고 볼 수 있습니다. 예를 들어 온도, IQ, 가격 등과 같이 그 자체로는 단순한 사실만을 나타내는 것을 데이터라고 합니다. 이러한 데이터들이 가치를 가지려면, 이들 사이에 논리적인 연관성이 있어야 합니다. 논리적으로 연관된 데이터들을 체계화해서 여러 사람이 공유하여 사용할 목적으로 통합한 것을 데이터베이스라고 합니다.

  • 통합 데이터: 데이터들이 모여있으면 중복되는 데이터들이 있을 수 밖에 없습니다. 그러한 데이터들을 통합하여 중복되는 데이터를 줄이하는 것
  • 저장 데이터: 종이에 쓰인 문서나 책 등이 아니라 컴퓨터 내부에 저장되어 있는 데이터
  • 운영 데이터: 조직을 운영하는 데 도움이 되는 데이터들이 저장되는 데이터
  • 공유 데이터: 개개인의 필요에 의해 모인 데이터가 아니라, 공동의 필요에 의해 저장되는 데이터

데이터베이스의 특징

  • 실시간 접근성: 비정형적인 조회에 대하여 실시간 처리에 의한 응답이 가능해야 합니다.
  • 지속적인 변화: 데이터베이스는 동적인 특징을 지닙니다. 그러므로 데이터의 삽입, 삭제, 갱신으로 항상 최신 데이터를 유지해야 합니다.
  • 동시 공유: 데이터베이스는 서로 다른 목적을 가진 여러 사용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다.
  • 내용에 따른 참조: 데이터베이스에 있는 데이터를 참조할 때, 데이터의 주소나 위치에 의해서가 아닌 사용자가 요구하는 데이터 내용을 찾습니다.

데이터베이스 관리 시스템

PostgresQL은 데이터베이스 관리 시스템 중 하나입니다. 수 많은 데이터들과 데이터베이스들을 관리하기에는 시간과 비용이 많이 드는데, 이를 최소화하기 위해서 데이터베이스를 관리할 시스템이 필요합니다.

데이터베이스 관리 시스템은 데이터베이스를 효율적으로 관리하기 위해 만들어진 시스템입니다. DBMS는 사용자와 데이터베이스의 중간 다리 역할을 하며 데이터의 통합적인 관리를 할 수 있는 소프트웨어입니다. DBMS가 등장하기 전에는 데이터를 하나하나 읽어가며 처리를 반복하는 파일시스템으로 데이터를 관리했습니다. 그러나 파일시스템은 시간이 많이 걸리고 데이터가 중복되는 문제점이 있었습니다. DBMS는 이러한 파일시스템의 문제점을 해결하여 효율적인 데이터베이스 관리를 이루어냈습니다.

DBMS의 세 가지 기능

  • 정의: 응용 프로그램이 요구하는 데이터베이스 구조를 지원하고 생성, 변경, 제거할 수 있습니다. 여기서 구조를 조작한다는 것은 테이블을 조작한다는 의미입니다.
  • 조작: 데이터베이스에 접근하여 사용자가 요구하는 데이터를 삽입, 갱신, 삭제할 수 있습니다. 여기서 데이터를 조작한다는 것은 테이블 내의 데이터를 조작한다는 의미입니다.
  • 제어: 데이터베이스의 접근할 수 있는 사용자를 제한하고 성능을 관리할 수 있습니다. 또한 동시에 접근하는 사용자들에 의해 데이터가 부정확해지는 문제가 발생하지 않도록 제한하는 기능을 합니다.

데이터베이스 모델

데이터베이스는 데이터를 보전하는 형식에 따라 계층형, 네트워크형, 관계형, 객체-관계형, NoSQL 데이터베이스로 구분됩니다.

계층형 데이터베이스

계층형 데이터베이스는 데이터를 계층에 따라 조직화한 데이터베이스입니다. 계층형 정보 자료형으로 우리 주변에서 흔히 볼 수 있는 것이 바로 폴더 구조입니다. 폴더 안에 또 다른 폴더를 넣어 원하는 파일을 정리할 수 있듯이 계층형 데이터베이스는 부모-자식의 계층 관계를 이용해 정보를 표현합니다.

계층 구조를 따르는 검색은 매우 빠르지만, 계층 구조를 가지지 않는 관계를 표현하지는 못합니다. 예를 들어, 계층 구조에서 부모 데이터 하나에 자식 데이터가 여럿을 표현하는 건 가능하지만 자식 데이터 하나에 부모 데이터 여럿은 표현이 불가능합니다. 이러한 계층형 데이터베이스는 초창기 컴퓨터에서 널리 사용되던 것이므로 현재 데이터베이스로는 거의 쓰지지 않습니다. 대신 정보를 기록하는 기법으로 윈도우 레지스트리나 파일 시스템, XML 등에서 쓰입니다.

네트워크형 데이터베이스

네트워크형 데이터베이스는 부모 여럿과 자식 여럿이 열결되는 다대다 관계를 표현하여 계층형 데이터베이스의 단점을 보완한 데이터베이스입니다. 네트워크형 데이터베이스는 통합 데이터 저장이라고도 불리는 IDS나 통합 데이터베이스 관리 시스템인 IDMS에서 쓰입니다.

관계형 데이터베이스

관계형 데이터베이스는 현재 가장 주류를 이루고 있는 데이터베이스로, 데이터를 행과 열로 구분하는 2차원 테이블 형태로 구성하여 관리합니다. 데이터 간의 관련성을 중시하며, 각각의 테이블을 관계라는 개념을 통해 연결할 수 있습니다. 테이블의 행과 열을 활용하여 테이블을 재구성하지 않고도 데이터에 다양한 방식으로 접근할 수 있습니다. 즉, 관계형 데이터베이스는 엑셀의 기반이 되는 개념이라고 생각하면 이해가 쉽습니다. 또한, 관계형 데이터베이스는 SQL을 사용하여 데이터를 처리합니다. 관계형 데이터베이스를 이용하는 제품으로는 오라클,MSSQL, MYSQL, PostgreSQL 등 여러 가지가 있습니다.

객체-관계형 데이터베이스

객체-관계형 데이터베이스는 관계형 데이터베이스 시스템에 객체지향 개념의 장점들만을 추가한 데이터베이스입니다. 다른 데이터베이스들처럼 데이터 자체를 처리하는 것과는 달리, 객체라는 개념을 도입하여 데이터를 처리하는 방식을 추가한 것입니다. 대표적으로 우리가 사용할 PostgreSQL에서도 쓰이고, Informix Dynamic Server, IBM DB2, 오라클, 티베로 등에서도 쓰입니다.

NoSQL 데이터베이스

NoSQL은 기존의 관계형 데이터베이스의 특징뿐만 아니라 다른 특성들도 부가적으로 지원한다는 뜻입니다. 기존의 관계형 데이터베이스의 단점을 보완하여 성능을 높이는 특징을 지니고 있습니다. 다시 말해, 생산성이 필요하고 데이터의 규모가 큰 곳에서 쓰기 위한 데이터베이스라고 생각하면 됩니다. 그러나 오랫동안 쓰인 관계형 데이터베이스들에 비해서 안정성이 떨어지는 등 단점들도 있습니다. 페이스북이나 넷플릭스, 인스타그램, 클라우드 서비스 등을 이용한다면 NoSQL 데이터베이스 환경에 노출되어 있다고 생각하면 됩니다. 대표적으로 MongoDB, Dynamo, HBase, Neo4J 등이 있습니다.

데이터베이스 객체

데이터베이스에서 데이터를 저장하려면 논리적인 저장구조가 필요합니다. 이를 위해서 ‘데이터베이스 객체’라는 개념이 필요합니다. 데이터베이스 객체에는 테이블, 뷰, 인덱스, 시노님(synonym), 시퀀스, 함수, 프로시저, 패키지 등 다양한 종류가 있습니다.

PostgreSQL의 특징

장점

기능과 성능

PostgreSQL이 개발자들 사이에서 인기가 있는 이유는 기능과 성능면에서 매우 훌륭한 DBMS이기 때문입니다.

  • 트랜잭션: PostgreSQL은 관계형 DBMS 작업의 단위인 트랜잭션의 안전한 수행을 위한 MVCC와 ACID(Atomicity, Consistency, Isolation, Durability)라는 속성을 지원합니다. 쉽게 말하자면, 대용량의 복잡한 연산 처리를 안전하게 할 수 있는 DBMS라고 이해하면 쉽습니다.
  • 다양한 플랫폼: PostgreSQL은 다양한 플랫폼에서 실행이 가능합니다.
  • 확장성: PostgreSQL은 사용자 정의 함수, 연산자 등 다양한 사용자 정의 객체를 지원합니다.

오픈소스 라이선스

PostgreSQL은 PostgreSQL 라이선스를 사용하고, 이는 오픈소스 라이선스인 BSD나 MIT 라이선스와 비슷합니다. 즉 복사와 사용, 연구, 수정 배포 등의 제한이 없습니다. 이는 소스를 수정해서 새로운 상용 데이터베이스를 만들어내면 변경한 내용과 전체 DBMS 코드를 의무적으로 공개해야하는 GPL 라이선스와는 달리, 소스를 의무적으로 공개할 필요가 없다는 것을 의미합니다. PostgreSQL은 오픈소스 라이선스이므로, 비용을 지불할 필요가 없습니다. 또한 PostgreSQL은 사용자들에 의해 자유롭게 확장될 수 있습니다. 예를 들어, 데이터 타입이나 함수 그리고 연산자 등을 사용자가 임의로 만들 수도 있습니다. PostgreSQL은 오픈소스입에도 여타 엩너프라이즈급 DBMS들과 많이 비교가되는데, 라이선스 비용이 부담스러운 사용자들은 기능과 안정성면에서 뒤지지 않는 오픈소스인 PostgreSQL을 사용하는 추세입니다.

언제, 어떻게 써야 할까?

결국 개발자들이 PostgreSQL을 선호하는 이유는 다양하겠지만, 가장 큰 이유는 라이센스 문제 때문입니다. MySQL의 경우, 2가지 라이센스를 사용하지만 그 중 하나는 유료입니다.

기존 데이터베이스를 교체하는 데에도 부담이 되기 때문에 쉽게 바꾸지 못하는 경우도 많지만 새롭게 데이터베이스를 구축해야 하는 개발자나 회사에서는 라이센스로부터 비교적 자유로운 PostgreSQL을 사용하는 빈도가 늘어나고 있습니다. 복잡하고 대규모의 데이터베이스 작업을 실행해야하는 환경에서 고성능을 보여주기 때문에 복잡한 상황에서 효율성을 중시하는 사용자들이 선호합니다.

개발 환경 구축하기

https://www.postgresql.org/download/macosx/

PostgreSQL의 구조

PostgreSQL의 프로세스 구조

 

postgreSQL의 프로세스 구조는 클라이언트-서버 모델을 기반으로 하고 있습니다. 프로세스 구조는 실행되고 있는 프로그램이 작동하는 방식을 말합니다. 클라이언트-서버 모델은 수요자와 공급자의 관계를 갖고 있다고 생각하면 됩니다. 클라이언트는 수요자이고, 서버는 공급자입니다. 여기서 수요자는 자신이 요청한 대로 데이터베이스를 조작한 결과 값을 받아내는 것을 원하고, 공급자는 수요자의 요청에 따라 데이터베이스를 조작한 값을 내보내는 역할을 합니다. 수요자의 요구대로 데이터베이스를 조작하기 위해서는 공급자와 연결이 되어야 합니다.

인터페이스는 서로 간의 연결을 원하는 대상들을 이어주는 매개체라고 생각하면 이해하기 쉽습니다. 인터페이스는 클라이언트와 서버 간의 통신을 위한 수단입니다. 이러한 인터페이스들의 집합을 인터페이스 라이브러리라고 합니다. 클라이언트가 다양한 인터페이스 라이브러리들을 통해 서버와 연결을 요청하면, 서버는 그 요청을 받아들이고, 클라리언트와 서버가 연결됩니다. 그리고 클라이언트가 요청한 대로 서버는 데이터베이스를 조작하여 사용자가 원하는 결과를 내보내게 됩니다.

PostgreSQL 데이터베이스 계층 구조

PostgreSQL의 계층 구조 최상단에는 클러스터가 있습니다. 그리고 데이터베이스, 스키마, 테이블 순으로 계층 구조를 이룹니다.

클러스터

클러스터는 데이터베이스들의 집합입니다. 따라서 PostgreSQL 계층 구조의 최상단에는 클러스터가 있습니다. 데이터베이스, 스키마, 테이블들이 각각의 개체들을 식별하는 이름이 있던 것과는 다르게, 클러스터는 PostgreSQL 서버 내에서 이름으로 식별할 수 없습니다. 그러므로 데이터베이스의 상위 개념이 클러스터라는 것 정도로만 알고 있으면 되겠습니다.

스키마

스키마는 개체들의 논리적인 집합입니다. 스키마를 구성하는 개체들로는 대표적으로 테이블, 뷰, 함수, 인덱스, 데이터 타입, 연산자 등이 있습니다. 스키마는 각각의 이름으로 식별할 수 있기 때문에, 하나의 데이터베이스 내에서는 같은 이름의 스키마가 있어서는 안됩니다. 데이터베이스를 생성하면 자동으로 기본 스키마인 public 스키마가 만들어집니다. public 스키마는 디폴트 스키마이며, 사용자가 PostgreSQL에 로그인하게 되면 public 스키마에 대한 사용 권한을 부여받습니다. PostgreSQL에 로그인하게 되면 public 스키마에 대한 사용 권한을 부여받습니다. PostgreSQL에서는 테이블의 집합을 스키마의 개념으로 사용합니다. 여기서 스키마들의 집합이 데이터베이스가 됩니다. 이 부분에서 다른 DBMS아 차이점이 있는데, MySQL에서는 테이블의 집합이 데이터베이스가 됩니다.

테이블

엑셀 시트에서 쓰는 2차원의 표를 테이블이라 부릅니다. 테이블은 row와 column으로 이루어져 잇습니다. 행은 로우, 레코드, 튜플이라고도 부르고, 특정한 한 개체의 데이터들이 저장됩니다. 열은 컬럼, 속성, 필드라고도 부릅니다. 컬럼의 최상단에는 컬럼의 이름인 컬럼명이 있습니다. 각각의 컬럼은 컬럼명의 특성을 가지는 데이터 값들이 저장됩니다. 데이터베이스에서는 각각의 객체를 구분하는 것이 매우 중요합니다. 각각의 로우를 명확하게 구분하는 것을 또 다른 말로 각각의 로우를 식별 가능하다고 합니다. 수 많은 데이터 값 중에 우리가 원하는 데이터를 정확하고 빠르게 찾기 위해서는 각각의 개체가 지닌 고유한 값을 가지고 있다면 객체를 식별하기 용이할 것입니다. 그래서 로우에는 개체를 식별할 수 있는 개념인 키가 있습니다.

어떤 경우에는 테이블을 릴레이션이라고도 합니다. 릴레이션이라는 단어에서도 알 수 있듯이, 테이블과 릴레이션은 데이터간 관계를 통해 데이터를 관리할 수 있게 합니다. 테이블과 릴레이션은 동일한 개념이라고 착각하기 쉽습니다. 모든 릴레이션이 테이블이 될 수는 있지만, 모든 테이블이 릴레이션인 것은 아닙니다.

SQL이란?

데이터베이스에 접근하여 데이터를 다루기 위한 전용 언어를 구조화된 질의 언어(SQL, Structured Query Language)라고 합니다. 데이터베이스 관리 시스템 중 가장 많이 쓰이는 것은 관계형 데이터베이스 관리 시스템(RDBMS)입니다. RDBMS는 우리가 필요로 하는 데이터들을 가지고 있는 데이터베이스를 관리하고 있습니다. RDBMS의 데이터베이스와 소통할 수 있는 대부분의 수단은 SQL입니다. 우리는 SQL을 RDBMS에 보내고, RDBMS는 우리가 보낸 SQL을 해석하여 데이터베이스에서 데이터를 가져오거나 조작합니다.

SQL의 특징

DBMS 전용 언어

SQL은 데이터베이스에서 원하는 대답을 얻기 위한 질문을 하는 언어이며, RDBMS와 소통할 수 있는 언어입니다. 그런데 단순히 정보를 얻기 위한 것 뿐 아니라, 데이터베이스의 데이터를 정의하고, 조작하고, 제어하는 RDBMS의 기능도 합니다.

타 프로그래밍 언어와의 차이점

호스트 프로그래밍 언어들은 사용자들이 데이터가 어떤 방식으로 연산 되고 처리되어 결과값이 나와야 하는지에 대해서 일일이 다 설정해줘야 합니다. 이를 데이터 처리 절차에 따라 코드를 작성한다 하여 ‘절차적 언어’라고 합니다. 그런데 SQL은 일반적인 호스트 프로그래밍 언어와는 다르게 원하는 결과만 입력하면 RDBMS가 알아서 처리하여 결과값을 내주므로, 절차를 사용자가 신경 쓸 필요가 없는 편리함이 있습니다. 이러한 특징을 가진 SQL을 ‘비절차적 언어’라고 부르기도 합니다.

또한 호스트 언어는 테이블 속 레코드를 기준으로 데이터를 처리하는 데 반해, SQL은 테이블 전체를 기준으로 데이터를 처리하는 특성이 있습니다.

표준SQL

같은 SQL을 서로 다른 DBMS에서 작성하더라도 똑같은 결과가 나올 때가 있습니다. ‘표준 SQL’이 정해져 있어서 많은 DBMS가 표준을 따르기 때문입니다. 이렇게 표준 SQL이 존재하면서 갖는 이점은 RDBMS별로 다른 SQL을 써서 발생하는 비효율성을 줄이고 생산성과 이식성을 향상시킨다는 것입니다. 그러나 상황에 따라 특정 RDBMS에서 확장된 기능을 SQL에 담아 사용할 필요성이 생길 수도 있습니다. 따라서 각 DBMS는 표준 SQL을 기본으로 하고, DBMS 특성별로 확장된 SQL을 가지고 있습니다.

SQL의 유형

SQL이 RDBMS를 조작할 수 있는 언어라고 배웠습니다. RDBMS의 데이터 정의, 조작, 제어 기능은 SQL을 통해 이루어집니다. 따라서 데이터 정의, 조작, 제어의 기능을 수행함에 따라 SQL의 특성을 분류할 수도 있습니다.

  • 데이터 정의어: 앞서 설명한 데이터베이스 객체 중 하나인 테이블뿐만 아니라 뷰, 인덱스, 함수 등 다른 데이터베이스 객체들을 정의, 변경 제거 등 객체 관리에 사용하는 SQL을 DDL이라고 합니다.
  • 데이터 조작어: 테이블 내의 데이터를 갱신, 삭제하거나, 새로운 데이터를 추가, 저장하는 등 데이터를 조작하는 SQL입니다.
  • 데이터 제어어: 데이터베이스에 접근하거나 권한을 부여하는 역할을 하는 SQL입니다. 제어하는 역할이 필요한 이유는 데이터베이스의 데이터를 안전하게 보호하기 위해서입니다.

'DataScience' 카테고리의 다른 글

[PostgreSQL] 보안과 백업  (0) 2023.05.31
[PostgreSQL] 트랜잭션  (0) 2023.05.31
[PostgreSQL] 데이터모델링과 인덱싱  (1) 2023.05.30
[Algorithm Study] 문자 찾기  (0) 2022.11.16
[Algorithm Study] A를 #으로  (0) 2022.11.14