💡 오늘의 학습목표
- 데이터베이스 기초 중 세가지에 대해서 정리해 나아갈 예정이다.
- 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 |