[백엔드 기초] 데이터베이스 기초

2025. 11. 13. 20:52·Spring/백엔드 기초

💡 오늘의 학습목표

  • 데이터베이스 기초 중 세가지에 대해서 정리해 나아갈 예정이다.
    • RDBMS
    • 스키마 설계
    • 트랜잭션과 락

RDBMS란?

: RDB(Relational Database - 관계형 데티어베이스)는 데이터를 테이블 형태로 저장하고, 이 테이블들 간의 관계를 기반으로 데이터를 관리할 수 있는 저장공간

 

→ RDBMS(Relational Database Management System - 관계형 데이터베이스 관리 시스템)을 통해 데이터베이스를 관리하고 구조화된 쿼리 언어(Structured Query Language, SQL)를 사용하여 데이터를 CRUD 작업 등을 수행할 수 있다.

 

1. RDB의 기능 

기능 설명
데이터 정의
(Data Definition)
데이터의 논리적, 물리적 구조를 정의하고 데이터간 관계와 연산을 명세할 수 있는 기능
- 엔티티, 관계 등 
데이터 조작
(Data Manipulation)
사용자가 자연 언어(인간이 사용하는 언어)에 가까운 수준으로 데이터를 검색, 변경, 삭제 가능
- SQL
데이터 제어
(Data Control)
동시성 제어 기능 : 사용자가 동시에 데이터를 사용하고자 할 때 감시, 감독하는 기능
보안 권한 기능 : 데이터를 외부로부터 보호해야 하며 데이터의 사용 권한을 구분하여 사용
무결성 및 제약조건 유지 기능 : 데이터가 변경, 수정되는 과정에서 데이터의 정확성과 일관성이 유지

 

2. RDBMS의 특징

특징 설명
무결성 중복된 데이터가 저장되는 것을 허용하지 않는 성질
일관성 서로 다른 정보가 구성한 데이터 형태로 일관되게 저장되는 성질
회복성 장애가 발생하였을 시 원래 상태로 복구되어야 하는 성질
보안성 불법적인 노출, 변경, 손실로부터 보호되어야 하는 성질
효율성 응답 시간, 저장 공간 활용 등이 최적화되어 사용자, 소프트웨어, 요구 조건 등을 만족시켜야 하는 성질

 

3. 관계형 데이터베이스 종류

데이터베이스 상용/요픈소스 개발사 특징
MySQL 오픈소스 오픈소스 커뮤니티 - 빠른 읽기 성능과 확장성으로 대규모 웹 서비스에서 자주 사용
- 다양한 스토리지 엔진을 지원
Oracle 상용 오라클(Oracle) - 고급 보안 기능, 고성능, 데이터 백업, 복구와 같은 고급 기능을 제공
- 데이터 안정성과 대용량 데이터 처리에 강점을 가지며, 대규모 시스템에서 주로 사용
PostgreSQL 오픈소스 버클리 대학교 - JSON, 배열과 같은 고급 데이터 타입 지원
- 복잡한 쿼리 처리와 데이터 무결성 보장
SQLite 오픈소스 오픈소스 커뮤니티 - 메모리에 저장되는 데이터베이스
- 서버가 필요 없는 경량형 구조

 

4. 스키마(Schema) - 도식, 개념

: 스키마는 데이터베이스의 구성하는 요소(entity, 속성, 제약조건, 인덱스, 파일 위치 등)를 명세해서 어떻게 데이터베이스를 설계할지 도식화한 것

스키마 종류 설명 특징 예시
외부 스키마 사용자가 보는 데이터의 논리적 뷰를 정의하는 스키마 - 개별 사용자나 응용 프로그램이 필요로 하는 데이터만 볼 수 있게 정의
- 여러 사용자 그룹이 서로 다른 뷰를 가질 수 있음
고객 A가 볼 수 있는 주문 내역 화면, 직원 B가 볼수 있는 직원 데이터 뷰
개념(논리) 스키마 데이터베이스 전체의 논리적 구조를 정의하는 스키마 - 모든 데이터를 통합하여 전체적인 데이터 구조를 나타냄
- Entity, 관계, 제약 조건을 포함
고객 테이블과 주문 테이블 간의 관계 정의, 데이터 무결성 규칙
내부(물리) 스키마 데이터가 실제로 저장되는 방식과 물리적 구조를 정의하는 스키마 - 데이터 저장 위치, 인덱스 구조, 파일 구성 등의 물리적 저장 방식 결정
- 데이터베이스의 성능 및 효율성을 고려한 저장 방식과 접근 경로 최적화
인덱스가 지정된 고객 데이터, 주문 테이블의 실제 저장 파일

 

스키마 설계

구분 객체지향 데이터 모델링
구성 요소 클래스, 객체, 상속, 다형성 엔티티, 속성, 관계, 키, 정규화
데이터와 기능 속성과 메서드로 수행 가능 데이터만 가능하나 Procedure를 통해 부분적으로 가능
재사용성과 확장성 상속과 다형성 제공 -
데이터 무결성 보장 클래스의 속성 타입과 메서드 제약을 통해 객체 내 무결성 관리
+. 시스템적으로 무결성을 보장하지 않음으로 직접 중복을 확인해야 함
데이터베이스의 무결성 제약 조건 (기본키, 외래키, 제약조건 등)으로 테이블 간 데이터 일관성 유지
+. 시스템적으로 무결성을 보장
상속과 관계 표현 클래스 상속을 통해 상속 구조와 다형성 지원 데이터 모델링에서는 상속 개념이 없고, 관계를 외래키, 조인 등으로 표현
데이터 접근 방식 메서드를 통해 객체의 속성에 접근 (캡슐화) Join을 통해 테이블의 데이터를 직접 조회 및 조작
변경에 대한 유연성 객체지향에서는 클래스와 객체 관계를 쉽게 변경 가능 데이터베이스의 테이블 구조나 관계를 변경하는 것은 더 복잡하고 많은 비용이 소요될 수 있음

분류 설명
개념 데이터 모델링 - 구현하고자 하는 도메인 개체를 Entity로 추상화하는 단계
- Entity와 속성, 관계를 도출
논리 데이터 모델링 - 개념 모델을 상세화하는 단계
- Entity의 속성과 관계를 확정하고 논리 ERD를 작성
- 엔티티의 속성, 도메인(데이터 타입), 길이, 제약 조건 등을 설계에 포함
물리 데이터 모델링 - 논리 모델을 바탕으로 실제 데이터베이스의 물리 스키마를 생성하는 단계
- 논리 ERD를 실제화시켜 테이블, 뷰, 시퀀스 등 물리개체를 생성
-index(인덱스), 저장 위치, 파일 구성 등을 포함

 

테이블의 구성 요소

1. 컬럼(Column/Field)

  • 테이블의 구성 속성으로 데이터를 구분하고 저장하는 의미 단위

 

2. 도메인(Domain/Data Type)

  • 필드에 저장될 데이터의 유형을 지정
유형 타입 Java 타입 설명
숫자형 TINYINT byte 1바이트의 정수 (-128 ~ 127)
SMALLINT short 2바이트의 정수 (-32768~32767)
MEDIUMINT int 3바이트의 정수 (-8388608~8388607)
INT int 4바이트의 정수 (-2147483648 ~ 2147483647)
BIGINT long 8바이트의 정수 (9223372036854775808 ~ 9223372036854775807)
FLOAT float 4바이트 부동 소수점 실수
DOUBLE double 8바이트 부동 소수점 실수
DECIMAL java.math.BigDecimal DECIMAL(전체 자릿수, 소수점 자릿수) 형식의 고정 소수점 실수
문자형 CHAR String 고정 길이 문자열 (최대 255자)
VARCHAR String 가변 길이의 문자열 (최대 65535자)
BLOB byte[] 이미지, 파일과 같은 대량 바이너리 데이터(최대 65,535byte)
TEXT String 대량 가변 길이 문자열 (최대 65,535자)
날짜
시간형
DATE java.sql.Date YYYY-MM-DD 형식의 날짜
TIME java.sql.Time HH:MM형식의 시간
DATETIME java.sql.Timestamp YYYY-MM-DD HH:MM형식의 날짜와 시간
TIMESTAMP java.sql.Timestamp YYYY-MM-DD HH:MM형식의 날짜와 시간
기타 ENUM enum 정해진 값 중 하나
GEOMETRY Object 지리 정보, 특정 라이브러리로 매핑 가능
XML java.sql.SQLXML XML 데이터
JSON String JSON 데이터

 

3. 크기 또는 길이 (Size/Length)

  • 데이터 타입에 따라 저장할 수 있는 최대 길이 또는 크기를 설정 - 데이터베이스 용량 관리 측면

 

4. 식별자-키 (Identifier-Key)

  • 데이터의 무결성을 유지하고 레코드를 찾거나 순서대로 정렬할 때 다른 레코드들과 구별하기 위한 속성
용어 설명
후보키 데이터베이스에서 각 레코드를 유일하게 식별할 수 있는 속성 집합
기본키 후보키 중에서 유일하게 선택된 속성으로, 각 레코드를 고유하게 식별
외래키 다른 테이블의 기본키를 참조하는 속성. 관계를 형성하는 데 사용됨
복합키 두 개 이상의 속성을 결합하여 유일성을 제공하는 키
대체키 기본키 대신 사용도리 수 있는 후보키로, 기본키가 아닌 다른 유일 키

위의 ERD를 SQL로 구성하면 아래와 같다.

-- 기본키 설정
ALTER TABLE 학생
ADD CONSTRAINT PK_학생 PRIMARY KEY (학생ID);
-- 외래키 설정
ALTER TABLE 수업
ADD CONSTRAINT FK_수업_교수 FOREIGN KEY (교수ID)
REFERENCES 교수 (교수ID)
ON DELETE CASCADE
ON UPDATE CASCADE;
-- 유니크키 설정
ALTER TABLE 학생
ADD CONSTRAINT UQ_학생_이메일 UNIQUE (이메일);
-- 복합키 설정
ALTER TABLE 수업
ADD CONSTRAINT PK_수업 PRIMARY KEY (학기, 과목코드);

 

5. 제약 조건 (Constraints)

  • 필드의 데이터 무결성을 유지하기 위한 규칙을 설정
제약조건 설명
기본키(Primary Key) 테이블에서 각 레코드를 고유하게 식별하는 속성으로, 중복값과 NULL 값을 허용하지 않음.
외래키(Foreign Key) 다른 테이블의 기본키를 참조하여 관계를 형성하며, 참조 무결성을 유지
유니크(Unique) 특정 컬럼의 값이 테이블 내에서 유일해야 함을 보장하며, 중복된 값을 허용하지 않음
널 (Not Null) 특정 컬럼에 NULL 값을 허용하지 않도록 설정하여, 반드시 값을 입력해야 함
체크 제약조건(Check) 컬럼의 값이 특정 조건을 만족해야 함을 정의하여, 데이터 입력 시 유효성을 검증
기본값 제약조건(Default) 특정 컬럼에 값을 입력하지 않을 경우, 기본값으로 지정된 값을 자동으로 할당
복합 제약조건(Composite) 두 개 이상의 컬럼에 동시에 적용되는 제약조건으로, 주로 복합키를 정의하는데 사용됨

 

해당 제약조건을 SQL 예시로 확인하면 아래와 같다.

-- PK
CREATE TABLE 사용자 (
    사용자ID INT PRIMARY KEY,
    이메일 VARCHAR(100) UNIQUE
);
-- FK
CREATE TABLE 수업 (
    수업ID INT PRIMARY KEY,
    교수ID INT,
    FOREIGN KEY (교수ID) REFERENCES 교수(교수ID)
);
-- Unique
CREATE TABLE 사용자 (
    사용자ID INT PRIMARY KEY,
    이메일 VARCHAR(100) UNIQUE
);
-- Not Null
CREATE TABLE 직원 (
    직원ID INT PRIMARY KEY,
    이름 VARCHAR(50) NOT NULL
);
-- Check
CREATE TABLE 제품 (
    제품ID INT PRIMARY KEY,
    가격 DECIMAL(10, 2),
    할인율 INT CHECK (할인율 BETWEEN 0 AND 100)
);
-- Default
CREATE TABLE 주문 (
    주문ID INT PRIMARY KEY,
    상태 VARCHAR(20) DEFAULT '대기 중'
);
-- Composite
CREATE TABLE 학생_수업 (
    학생ID INT,
    수업ID INT,
    PRIMARY KEY (학생ID, 수업ID),
    FOREIGN KEY (학생ID) REFERENCES 학생(학생ID),
    FOREIGN KEY (수업ID) REFERENCES 수업(수업ID)
);

 

5.1 외래키 제약조건

  • 외래키 제약조건은 부모 테이블과 자식 테이블 간의 관계를 정의하며, 참조 무결성을 유지하기 위해 다양한 동작 옵션을 설정
  • 해당 내용은 ORM에서도 설정으로 일부 가능
옵션 설명
CASCADE 부모 레코드가 삭제되거나 수정될 때, 관련된 자식 레코드도 함께 삭제되거나 수정
RESTIRCT 부모 레코드가 삭제되거나 수정될 때, 자식 레코드가 존재하면 삭제나 수정이 제한
SET NULL 부모 레코드가 삭제되거나 수정될 때, 자식 레코드의 외래키 컬럼 값을 NULL로 설정
SET DEFAULT 부모 레코드가 삭제되거나 수정될 때, 자식 레코드의 외래키 컬럼 값을 기본값으로 설정
NO ACTION 부모 레코드가 삭제되거나 수정될 때, 자식 레코드가 존재하면 아무런 동작도 수행하지 않음

 

SQL문으로 확인하면 아래와 같다. (기본적인 틀은 같음)

-- CASCADE
ALTER TABLE 수업
ADD CONSTRAINT FK_수업_교수_CASCADE
FOREIGN KEY (교수ID)
REFERENCES 교수(교수ID)
ON DELETE CASCADE
ON UPDATE CASCADE

-- RESTRICT
ALTER TABLE 수업_RESTRICT
ADD CONSTRAINT FK_수업_교수_RESTRICT
FOREIGN KEY (교수ID)
REFERENCES 교수(교수ID)
ON DELETE RESTRICT
ON UPDATE RESTRICT;

-- SET NULL
ALTER TABLE 수업
ADD CONSTRAINT FK_수업_교수
FOREIGN KEY (교수ID)
REFERENCES 교수(교수ID)
ON DELETE SET NULL
ON UPDATE SET NULL;

-- SET DEFAULT
ALTER TABLE 수업
ADD CONSTRAINT FK_수업_교수
FOREIGN KEY (교수ID)
REFERENCES 교수(교수ID)
ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT;

-- NO ACTION
ALTER TABLE 수업
ADD CONSTRAINT FK_수업_교수
FOREIGN KEY (교수ID)
REFERENCES 교수(교수ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

 

6. 기본값 (Default Value)

  • 필드의 값이 입력되지 않았을 때 자동으로 젖아될 기본 값을 지정 - 대부분 애플리케이션에서 수행

 

설계 방법

1. Entity를 추상화한다.

분류 기준 Entity 타입 특징
유형 분류 유형 Entity 물리적 형태가 있고 안정적이며 지속적으로 활용됨
개념 Entity 물리적 형태는 없지만 관리해야 할 개념적 정보
사건 Entity 업무 수행에 따라 발생하며, 발생량이 많고 통계 자료로 활용됨
발생 시점 분류 기본 Entity 업무에 원래 존재하는 정보로, 독립적이며 다른 Entity 타입의 부모 역할
중심 Entity 기본 Entity로부터 발생하며 업무의 중심적 역할을 함
행위 Entity 두 개 이상의 부모 Entity 타입에서 발생하고 내용이 자주 변경되거나 데이터 양이 증가함

 

2. Entity를 배치한다.

3. Entity간 관계를 설정한다.

4. Entity 관계명을 기술한다.

5. Entity 관계 차수를 표시한다. 

 

관계

1. 관계 일반

식별 관계
비식별 관계

구분 정의(Identifying Relationship) 비식별 관계 (Non-Identifying Relationship)
정의 부모 식별자가 자식 식별자에 포함되어 복합 식별자로 사용 부모 주 식별자가 자식의 비식별자(일반 속성)으로 포함되어 사용
+. 갭라 관점에서 엔티티 간 관계를 느슨하게 하여 의존성을 떨어뜨리기 위한 방법
장점 데이터의 정합성 유지를 DB에서 검증(데이터의 일관성을 유지하는 것을 의미) 구조 변경이 자유로움, 부모 데이터로부터 독립함
단점 구조 변경이 어려움 데이터 정합성을 위한 검수 필요, 데이터 무결성을 보장하지 못함
삭제 시 영향  부모가 삭제되면 자식도 삭제될 가능성 (CASCADE 설정) 부모가 삭제되어도 자식에는 직접 영향 없음
ERD 표기법 굵은 실선 점선 또는 얇은 실선

 

재귀 관계

관계 유형 설명
1:1 (일대일) 한 엔티티가 다른 엔티티에 하나의 인스턴스와 연결되는 관계

→ 한 고객은 하나의 고객 정보를 가진다.
1:N (일대다) 한 엔티티가 다른 엔티티에 여러 인스턴스와 연결되는 관계

→ 한 고객은 여러 주문을 한다.
N:M (다대다) 여러 엔티티가 서로 여러 인스턴스와 연결되는 관계
🔥 중간 테이블(교차 테이블)을 통해 1:N + N:1 로 관계를 맺어 해소

→ 한 주문에는 여러 상품이 포함될 수 있으며, 한 상품은 여러 주문에 포함될 수 있다.
Recursive (재귀 관계) 하나의 엔티티가 스스로와 관계를 맺는 경우

→ 상위 부서는 하위 부서를 포함한다.

 

정규화(Normal Form)

 

'Spring > 백엔드 기초' 카테고리의 다른 글

[백엔드 기초] Redis 기초 개념 정리  (0) 2025.12.08
[개념정리] WebSocket 과 STOMP  (0) 2025.12.02
[백엔드 기초] CI / CD  (0) 2025.11.12
[백엔드 기초] 클라우드 개념 이해하기 (보충작성 필요)  (1) 2025.11.11
[백엔드 기초] Validation 개념 정리  (0) 2025.10.30
'Spring/백엔드 기초' 카테고리의 다른 글
  • [백엔드 기초] Redis 기초 개념 정리
  • [개념정리] WebSocket 과 STOMP
  • [백엔드 기초] CI / CD
  • [백엔드 기초] 클라우드 개념 이해하기 (보충작성 필요)
stark77
stark77
하마의 IT 자기개발 이모저모, 백엔드 개발자로 거듭나기
  • stark77
    하마의 개발자 성장일기
    stark77
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 컴퓨터구조와 운영체제
        • 컴퓨터구조
        • 운영체제
      • SQL 기초
      • Spring
        • 백엔드 기초
        • Spring 실습
      • JAVA
        • Java 실습
      • HTML&CSS
        • HTML&CSS 실습
      • Git&GitHub
        • Git&GitHub 실습
      • 내배캠 끄적끄적
        • Today I Learned
      • 유용한 툴 및 사이트 정리
      • 취미
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    RestTemplate
    git
    JPA
    경합조건과 교착상태
    SpringSecurity
    객체지향
    MVC
    다형성
    WebSocket
    java
    백엔드 기초다지기
    객체지향프로그래밍
    HTML&CSS
    Java 문법기초
    Spring
    algorithm
    백엔드 기초
    실시간 데이터 처리
    BEAN
    jsp
    Github
    Stomp
    프로세스와 쓰레드
    네트워크 기초
    for문
    thymleaf
    Spriingboot
    웹소켓
    Til
    String.format
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
stark77
[백엔드 기초] 데이터베이스 기초
상단으로

티스토리툴바