brunch

You can make anything
by writing

C.S.Lewis

by florent Jul 08. 2024

데이터베이스, SQL, PostgreSQL

florent의 개발 적응기



이 글의 주요 내용

[데이터베이스(Database)]

[SQL vs NoSQL]

[PostgreSQL]

[SQL CRUD]

[SQL의 데이터 제약 조건]

[SQL 연산자]

[데이터베이스 관계]

[별칭 (Alias)]

[PostgreSQL을 활용한 JavaScript 웹]




[데이터베이스(Database)]


[데이터베이스(Database)란?]

데이터베이스는 구조화된 정보 또는 데이터의 조직화된 집합을 의미

현대적인 의미에서 데이터베이스는 일반적으로 전자적 형태로 컴퓨터 시스템에 저장되고 관리



[데이터베이스 관리 시스템 (DBMS, Database Management System)]

데이터베이스 관리 시스템(DBMS)은 데이터베이스를 생성, 유지보수, 사용할 수 있게 해주는 소프트웨어 시스템 e. MySQL, Oracle, Microsoft SQL Server 등



[데이터베이스의 주요 특징]

(1) 데이터 구조화: 데이터베이스는 정보를 체계적으로 구조화하여 저장 → 데이터의 효율적인 검색, 갱신, 관리

(2) 지속성 (Persistence): 데이터베이스에 저장된 정보는 일시적이지 않고 지속적으로 유지, 시스템이 종료되어도 데이터는 보존

(3) 동시 접근 (Concurrent Access): 여러 사용자나 프로그램이 동시에 데이터베이스에 접근하여 데이터를 조회하거나 수정 가능

(4) 데이터 무결성 (Data Integrity): 데이터베이스는 저장된 데이터의 정확성과 일관성을 보장하기 위한 메커니즘을 제공

(5) 보안 (Security): 데이터베이스는 중요한 정보를 보호하기 위한 보안 기능을 포함 ⇒ 사용자 인증, 권한 관리 등

(6) 확장성 (Scalability): 데이터의 양이 증가하더라도 성능을 유지할 수 있도록 설계됨



[데이터베이스의 중요성]

(1) 데이터 중앙화: 정보를 한 곳에 모아 관리함으로써 데이터의 일관성을 유지하고 중복을 방지

(2) 데이터 공유: 여러 사용자나 애플리케이션이 동일한 데이터를 공유

(3) 데이터 분석: 대량의 데이터를 효율적으로 분석하여 의사결정에 활용

(4) 데이터 보안: 중요한 정보를 안전하게 보관하고 관리

⇒ 데이터베이스는 현대 정보 시스템의 핵심 구성 요소로, 효율적인 데이터 관리와 활용을 위한 필수적인 도구



[데이터베이스의 종류]

관계형 데이터베이스 (Relational Database): SQL(Structured Query Language)을 사용 ex. MySQL, PostgreSQL, Oracle, Microsoft SQL Server

비관계형 데이터베이스 (Non-Relational Database): 흔히 NoSQL(Not Only SQL)로 불림, ex. MongoDB, Cassandra, Redis, DynamoDB



[SQL vs NoSQL]


[SQL - 관계형 데이터베이스]

SQL = 구조화된 질의 언어 (Structured Query Language)

SQL은 테이블 간 관계를 정의하고 연결하며 데이터가 구조화된 테이블에 저장되는 관계형 데이터베이스 (Relational Database)에서 사용됨

스키마(Schema)가 미리 정의되어야 하며, 복잡한 조인(Join) 연산과 트랜잭션(Transaction, 하나의 작업 단위)을 지원

ACID (Atomicity, Consistency, Isolation, Durability) 특성을 보장

(1) 원자성 (Atomicity): 트랜잭션의 모든 연산은 전부 성공하거나 전부 실패해야 함 → 중간 상태는 없는 "모 아니면 도"의 개념 ex.예: 은행 송금에서 출금과 입금이 모두 성공하거나, 둘 다 실패

(2) 일관성 (Consistency): 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지 → 데이터베이스의 무결성 제약조건이 항상 만족 ex. 은행 계좌의 잔고는 항상 0 이상이어야 한다는 규칙이 있다면, 이 규칙은 항상 지켜져야 함

(3) 격리성 (Isolation): 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리 → 동시에 수행되는 트랜잭션들이 서로 독립적으로 수행되는 것처럼 보여야 함 ex. 두 사용자가 동시에 같은 데이터를 수정할 때, 서로의 작업이 간섭받지 않아야 함

(4) 지속성 (Durability): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영 → 시스템 장애가 발생하더라도 완료된 트랜잭션의 결과는 보존 ex. 은행 송금이 완료된 후 시스템이 다운되어도, 재시작 후에도 송금 내역이 보존



[NoSQL - 비관계형 데이터베이스]

JSON 또는 JavaScript 객체 형태의 키-값 쌍을 사용하여 유연성을 가짐 ex. DynamoDB, Redis, MongoDB, Cassandra, Couchbase

스키마리스(Schemaless) 또는 동적 스키마를 지원 ⇒ 수평적 확장성 (Horizontal Scalability)이 뛰어남

대량의 비정형 데이터 처리에 적합

일반적으로 ACID 특성을 완전히 보장하지 않음 (일부 NoSQL DB는 제한적으로 지원)





[PostgreSQL]



[PostgreSQL이란]

PostgreSQL은 강력한 오픈 소스 객체-관계형 데이터베이스 시스템(ORDBMS: Object-Relational Database Management System)

30년 이상의 활발한 개발로 신뢰성, 기능의 견고성, 성능면에서 높은 평가를 받고 있음



[PostgreSQL의 특징]

ACID 준수: 트랜잭션의 원자성, 일관성, 격리성, 지속성을 보장

복잡한 쿼리 지원: 복잡한 SQL 쿼리, 서브쿼리, 조인을 효율적으로 처리

트리거와 저장 프로시저: 데이터베이스 로직을 서버 측에서 실행 가능

확장성: 사용자 정의 데이터 타입, 함수, 연산자 등을 만들 수 있음



[PostgreSQL 데이터 타입]



[SQL CRUD]


[SQL CRUD란?]

SQL CRUD는 데이터베이스의 기본적인 데이터 처리 기능을 나타냄

Create (생성): 새로운 데이터 삽입

Read (읽기): 데이터 조회

Update (갱신): 기존 데이터 수정

Delete (삭제): 데이터 삭제



[Create - 테이블 생성 밎 데이터 삽입]


(1) 테이블 생성 - CREATE TABLE

테이블_이름: 생성할 테이블의 이름

열_이름: 각 열(column)의 이름

데이터_타입: INTEGER, VARCHAR, DATE 등의 데이터 타입

제약조건: NOT NULL, UNIQUE, PRIMARY KEY 등



(2) 데이터 삽입 - INSERT




[Read - 데이터 조회]

(1) 조회 - SELECT

DISTINCT: 중복 제거 (선택사항)

열1, 열2, ...: 조회할 열 이름들 (* 사용 시 모든 열 선택)

테이블_이름: 데이터를 조회할 테이블 이름

WHERE: 조건절 (선택사항)

GROUP BY: 그룹화할 열 지정 (선택사항)

HAVING: 그룹화 후 조건 지정 (선택사항)

ORDER BY: 정렬 기준 열 지정 (선택사항)



[Update - 데이터 수정]


(1) UPDATE

테이블_이름: 업데이트할 테이블 이름

열1, 열2, ...: 업데이트할 열 이름들

값1, 값2, ...: 새로 설정할 값들

WHERE: 업데이트할 행을 지정하는 조건 (생략 시 모든 행 업데이트)



(2) ALTER TALBE

테이블_이름: 변경할 테이블 이름

ADD: 새 열 추가

DROP COLUMN: 기존 열 삭제

ALTER COLUMN: 열의 데이터 타입 변경

ADD 제약조건: 새 제약조건 추가

DROP 제약조건: 기존 제약조건 삭제



[Delete - 데이터 삭제]

테이블_이름: 데이터를 삭제할 테이블 이름

WHERE: 삭제할 행을 지정하는 조건 (생략 시 모든 행 삭제)




[SQL 주요 명령어]




[SQL의 데이터 제약 조건]


[PRIMARY KEY (기본 키)]

기본 키는 테이블의 각 행을 고유하게 식별하는 열 또는 열의 조합

고유성: 중복된 값을 가질 수 없음

NOT NULL: NULL 값을 가질 수 없음

테이블당 하나만 존재 가능



[FOREIGN KEY (외래 키)]

외래 키는 다른 테이블의 기본 키를 참조하는 열으로,테이블 간의 관계를 설정

참조 무결성: 참조하는 테이블의 데이터가 존재해야 함

NULL 값 허용 (설정에 따라 다름)



[UNIQUE]

UNIQUE 제약 조건은 열이 고유한 값만을 포함하도록 보장함

중복된 값을 가질 수 없음

NULL 값 허용 (대부분의 데이터베이스 시스템에서)



[NOT NULL]

NOT NULL 제약 조건은 열이 NULL 값을 포함할 수 없도록 함

항상 값이 있어야 함

데이터 무결성 보장에 도움



[CHECK]

CHECK 제약 조건은 열에 입력되는 값이 특정 조건을 만족하는지 확인

사용자 정의 조건 설정 가능

데이터 무결성 강화



[DEFAULT]

DEFAULT 제약 조건은 새 레코드가 삽입될 때 열의 기본값을 지정

값이 명시되지 않았을 때 사용될 기본값 설정




[SERIAL (PostgreSQL 기준)]

자동으로 증가하는 고유한 숫자를 생성, 주로 기본 키에 사용

자동으로 증가하는 고유 식별자 생성




[SQL 연산자]




[데이터베이스 관계 (Database Relationships)]


[데이터베이스 관계]

데이터베이스 관계는 테이블 간의 논리적 연결을 의미하며, 일대일 관계, 일대다 관계, 다대다 관계가 존재



[일대일 관계 (One-to-One Relationship)]

일대일 관계는 한 테이블의 레코드가 다른 테이블의 레코드와 정확히 하나씩 대응되는 관계


[일대다 관계 (One-to-Many Relationship)]

일대다 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연관될 수 있는 관계



[다대다 관계 (Many-to-Many Relationship)]

다대다 관계는 양쪽 테이블의 레코드가 서로 여러 개와 연관될 수 있는 관계 → 이를 구현하기 위해 중간 테이블(연결 테이블)을 사용


[JOIN]

INNER JOIN은 두 테이블에서 조인 조건을 만족하는 행만 반환

LEFT (OUTER) JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 조인 조건을 만족하는 행을 반환 ⇒ 조건을 만족하는 행이 오른쪽 테이블에 없으면 NULL 값으로 채워짐

RIGHT (OUTER) JOIN: RIGHT JOIN은 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 조인 조건을 만족하는 행을 반환 ⇒ 조건을 만족하는 행이 왼쪽 테이블에 없으면 NULL 값으로 채워짐

FULL (OUTER) JOIN은 양쪽 테이블의 모든 행을 반환 ⇒ 조인 조건을 만족하지 않는 경우 해당 측의 열은 NULL 값으로 채워짐




[별칭 (Alias)]

별칭은 SQL 쿼리에서 테이블이나 열에 임시 이름을 부여하는 기능으로, 주로 가독성 향상과 코드 간소화를 위해 사용됨

열 별칭 (Column Alias)

테이블 별칭 (Table Alias)

AS 키워드는 선택적이며 생략 가능

공백이 포함된 별칭은 따옴표로 묶어야 함 (예: "Full Name")

별칭은 ORDER BY, GROUP BY 절에서 사용할 수 있지만, WHERE 절에서는 사용할 수 없음



[PostgreSQL을 활용한 JavaScript 웹]


(1) 프로젝트 설정


(2) 데이터베이스 연결 설정 (db.js)



(3) 메인 애플리케이션 파일 (app.js)


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari