Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

The Office Lover

PostgreSQL - RDBMS 본문

DataBase

PostgreSQL - RDBMS

Michael Gary Scott 2023. 7. 24. 11:20

postgresql rdbms

PostgreSQL의 주요 특징

- RDMBS : Relational Database Management System

 

1. 오픈소스 

 

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

 : PostgreSQL은 기본적으로 관계형 데이터베이스 시스템이지만, 확장 기능으로 객체-관계형 데이터베이스의 특징을 지원합니다. 이런 특징을 토대로 복잡한 데이터 구조를 모델링하고 관리하는 데 용이합니다.

 

3. ACID 준수

 : ACID(원자성, 일관성, 고립성, 지속성) 원칙을 준수하여 데이터의 안정성과 무결성을 보장합니다. 이로 인해 데이터베이스 트랜잭션의 신뢰성이 높습니다.

 

4. 확정성

 : 대규모 데이터베이스 시스템을 지원하도록 설계되었습니다. 복제, 파티셔닝, 로드 밸런싱과 같은 기능을 통해 성능과 가용성을 개선할 수 있습니다.

 

5. 다양한 데이터 타입 

 : 정수, 문자열, 날짜 및 시간, 배열, Json, UUID 등 다양한 데이터 타입을 지원합니다. 

 

6. 이 밖에 다양한 기능과 확장 모듈을 지원하며, 표준 SQL 문법을 따르고, 대부분의 SQL 호환 데이터베이스와 쉽게 호환됩니다. 마지막으로 데이터 보안을 중요시하며, 접근 제어, 암호화, SSL 연결 등 다양한 보안 기능을 제공하여 데이터의 안전성을 유지합니다.

 

위에서 언급한 객체-관계형 데이터베이스에 대해 좀 더 알아보겠습니다.

 

 

 


객체-관계형 데이터베이스의 주요 특징

객체-관계형 데이터베이스(OODBMS, Object-Oriented Database Management System)는 전통적인 관계형 데이터베이스 모델에 객체 지향 프로그래밍의 개념과 기능을 결합하여 데이터를 모델링하고 다룰 수 있게 한 것을 의미합니다.

 

2-1. 객체 지향 데이터 모델링

 객체 지향 프로그래밍과 유사한 방식으로 데이터를 모델링합니다. 데이터베이스 내의 데이터 요소들(테이블, 행 등)을 객체로 취급, 이들 사이의 관계를 객체 간의 관계로 표현합니다. 

 

2-2. 상속

 테이블 간에 상속 관계를 지원합니다. 이는 하나의 테이블이 다른 테이블의 속성과 기능을 상속받을 수 있음을 의미합니다. 이를 통해 데이터 모델을 계층적으로 구성할 수 있으며, 데이터베이스 스키마의 유연성과 재사용성을 높여줍니다.

CREATE TABLE person (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INT
);

CREATE TABLE employee (
    employee_id SERIAL PRIMARY KEY,
    department VARCHAR(100),
    salary DECIMAL(10, 2),
    position VARCHAR(50)
) INHERITS (person);

위 예시에서 employee 테이블은 person 테이블을 상속받도록 생성했습니다. 이로 인해 employee 테이블은 person 테이블의 모든 속성을 가지면서 추가로 department, salary, position 속성을 가지게 됩니다. 이를 통해 직원 데이터를 따로 관리하면서 공통된 속성을 효과적으로 활용할 수 있습니다.

 

2-3. 사용자 정의 데이터 타입 

 PostgreSQL은 사용자가 직접 새로운 데이터 타입을 정의하고 사용할 수 있는 기능을 제공합니다. 이로 인해 데이터를 더 효율적으로 표현하고, 비즈니스 도메인에 특화된 데이터 타입을 만들 수 있습니다. 

CREATE TYPE address AS (
    street VARCHAR(200),
    city VARCHAR(100),
    zip_code VARCHAR(10),
    country VARCHAR(100)
);

CREATE TABLE customer (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    customer_address address
);

위 예시에서 사용자 정의 데이터 타입 address를 생성하고, 이를 customer 테이블의 customer_address 필드에 사용합니다. 이로써 주소 정보를 하나의 필드로 묶어서 사용할 수 있으며, 코드의 가독성을 높이고 데이터 구조를 단순화할 수 있습니다. 

 

2-4. 객체 지향 쿼리 언어

 PostgreSQL은 객체 지향 쿼리 언어를 지원하여 객체 간의 관계를 효율적으로 조회하고 조작할 수 있습니다. 객체 지향적인 방식으로 쿼리를 작성하여 데이터를 더 직관적으로 다룰 수 있습니다. PostgreSQL에서는 객체 지향 쿼리 언어인 "Object-Relational SQL(ORSQL)"을 사용하여 객체 지향적인 쿼리를 작성할 수 있습니다.

 

-- user_table

id | name       | age | email
---|------------|-----|-----------------------
1  | John Smith | 30  | john.smith@example.com
2  | Alice Lee  | 25  | alice.lee@example.com
3  | Bob Johnson| 35  | bob.johnson@example.com

Java에서 주로 사용되는 ORM(Object-Relational Mapping) 라이브러리인 Hibernate를 활용하여 PostgreSQL 데이터베이스와 상호 작용하는 아래 예시를 참고 바랍니다.

import javax.persistence.*;

@Entity
@Table(name = "user_table")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int age;
    private String email;

    // Getters and Setters
    // ...

    // Constructors
    // ...
}

위 예시는 JPA(Java Persistence API) 어노테이션을 사용하여 데이터베이스 테이블과 매핑됩니다. '@Entity' 어노테이션은 해당 클래스가 JPA 엔티티임을 나타내며, '@Table' 어노테이션은 해당 엔티티가 어떤 데이터베이스 테이블과 매핑되는지 지정합니다. '@Id', '@GeneratedValue' 어노테이션은 기본 키(primary key) 필드와 자동 생성되는 값임을 나타냅니다.

 

아래는 Hibernate를 사용하여 객체 지향 쿼리입니다.

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Main {

    public static void main(String[] args) {
        // Hibernate SessionFactory 초기화
        SessionFactory sessionFactory = new Configuration()
                .configure("hibernate.cfg.xml")
                .addAnnotatedClass(User.class)
                .buildSessionFactory();

        // Hibernate Session 얻기
        try (Session session = sessionFactory.getCurrentSession()) {
            session.beginTransaction();

            // 모든 사용자를 조회하는 쿼리
            List<User> users = session.createQuery("from User", User.class).getResultList();

            // 특정 사용자 이름으로 조회하는 쿼리
            Query<User> query = session.createQuery("from User where name = :name", User.class);
            query.setParameter("name", "John Smith");
            User user = query.getSingleResult();

            // 특정 나이 이상의 사용자들을 조회하는 쿼리
            Query<User> ageQuery = session.createQuery("from User where age >= :age", User.class);
            ageQuery.setParameter("age", 30);
            List<User> usersAboveAge = ageQuery.getResultList();

            session.getTransaction().commit();

            // 사용자 객체를 활용하여 데이터 조작
            // ...
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            sessionFactory.close();
        }
    }
}

Hibernate는 JPA의 구현제로서, 'session.createQuery()' 메서드를 사용하여 객체 지향 쿼리를 작성하고 실행할 수 있습니다. 또한, Hibernate는 데이터베이스와 객체 사이의 매핑을 자동으로 처리해 주므로 데이터베이스의 데이터를 자바 객체로 매핑하는 작업을 간소화해 줍니다. 

 

위 예시를  JPA Repository를 사용하면 Hibernate를 직접 사용하는 대신 Spring Data JPA를 활용하여 더 간단하게 객체 지향 쿼리를 작성할 수 있습니다. JPA Repository로 변경한 예시는 다음과 같습니다.

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 사용자 이름으로 조회하는 메서드
    List<User> findByName(String name);

    // 특정 나이 이상의 사용자들을 조회하는 메서드
    List<User> findByAgeGreaterThanEqual(int age);
}

위 예시처럼 JPA Repository를 정의합니다. 'UserRepository' 인터페이스는 'JpaRepository'를 상속받고 있습니다. 이를 통해 사용자(User) 엔티티와 기본 키(primary key) 타입(Long)을 지정합니다. 그리고 해당 인터페이스 내에는 사용자 이름으로 조회하는 'findByName' 메서드와 특정 나이 이상의 사용자들을 조회하는 'findByAgeGreaterThanEqual' 메서드를 선언하였습니다. 이러한 메서드 선언만으로 Spring Data JPA가 해당 쿼리를 자동으로 생성해 줍니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
        UserRepository userRepository = context.getBean(UserRepository.class);

        // 모든 사용자를 조회하는 쿼리
        List<User> users = userRepository.findAll();

        // 특정 사용자 이름으로 조회하는 쿼리
        List<User> usersWithName = userRepository.findByName("John Smith");

        // 특정 나이 이상의 사용자들을 조회하는 쿼리
        List<User> usersAboveAge = userRepository.findByAgeGreaterThanEqual(30);

        // 사용자 객체를 활용하여 데이터 조작
        // ...
    }
}

Spring Boot 애플리케이션으로 선언하고, 'UserRepository'를 주입받아 객체 지향 쿼리를 실행하고 있습니다. 

 

 

 

 


객체-관계형 데이터베이스와 관계형 데이터베이스의 주요 차이점

1. 데이터 모델링 방식

  • RDBMS : 관계형 데이터베이스는 데이터를 테이블의 형태로 모델링합니다. 테이블은 행(row)과 열(column)의 집합으로 구성되며, 각 행은 고유한 기본키(primary key)로 식별됩니다. 테이블 간의 관계는 외래키(foreign key)를 사용하여 표현됩니다.
  • OODBMS : 객체-관계형 데이터베이스는 객체 지향 프로그래밍과 유사한 방식으로 데이터를 모델링합니다. 데이터베이스 내의 데이터 요소들은 객체로 표현되며, 객체는 속성(attribute)과 메서드(method)를 가질 수 있습니다. 상속, 다형성과 같은 객체 지향의 특징이 데이터베이스에도 적용될 수 있습니다.

2. 데이터 쿼리와 조작

  • RDMBS : SQL(Structured Query Language)을 사용하여 데이터를 조회하고 조작합니다. SQL은 표준화된 쿼리 언어로, 데이터베이스에 접근하고 조작하는데 사용됩니다.
  • OODBMS : 객체-관계형 데이터베이스는 객체 지향 쿼리 언어를 사용하여 데이터를 다룹니다. 객체의 속성과 메서드를 활용하여 데이터를 쿼리하고 조작할 수 있습니다.

3. 무결성 제약 조건 

  • RDMBS : 테이블 간의 관계를 외래키를 사용하여 정의하고, 무결성 제약 조건을 통해 데이터의 일관성과 무결성을 유지합니다.
  • OODBMS : 객체 간의 관계를 객체 참조(reference)를 통해 정의하고, 객체 식별자(identifier)를 사용하여 무결성을 유지합니다.

4. 상속과 다형성

  • RDMBS : 테이블 간의 상속을 직접적으로 지원하지 않습니다. 다형성 구현을 위해 JOIN과 같은 방법을 사용할 수 있으나, 직접적인 상속 개념은 없습니다.
  • OODBMS : 테이블 간의 상속 관계를 지원합니다. 객체의 다형성을 지원하여, 여러 객체가 하나의 인터페이스를 구현하거나 상속 관계를 가질 수 있습니다.

5. 사용자 장의 데이터 타입

  • RDMBS : 기본적으로 정해진 데이터 타입을 제공합니다. 사용자가 직접 데이터 타입을 정의하는 것은 어려운 경우가 많습니다.
  • OODBMS : 사용자가 직접 데이터 타입을 정의할 수 있습니다. 이는 데이터를 더 효율적으로 표현하고, 비즈니스 도메인에 특화된 데이터 타입을 만들 수 있게합니다.

 

 

 

'DataBase' 카테고리의 다른 글

Commit과 Rollback  (0) 2023.07.31
PostgreSQL Joins  (0) 2023.07.31