---
description: 4.1 데이터베이스 기본
---

# 4.1 Database Basic

**4.1.1 엔터티 (Entity)**

엔터티(Entity)는 데이터베이스 설계에서 매우 중요한 개념으로, 현실 세계의 객체나 개념을 표현합니다. 예를 들어, 학생 정보 관리 시스템에서는 '학생', '강의', '교수' 등이 각각의 엔터티가 될 수 있습니다. 각 엔터티는 고유한 특성을 가지며, 이 특성들을 통해 다른 엔터티와 구별됩니다.

*   **예시:**\
    자바 스프링부트 애플리케이션에서 Lombok을 사용해 학생 엔터티를 정의하는 예시

    ```java
    java코드 복사import lombok.Data;
    import javax.persistence.Entity;
    import javax.persistence.Id;

    @Entity
    @Data
    public class Student {
        @Id
        private Long id;
        private String name;
        private String email;
    }
    ```

    이 코드에서 `Student` 클래스는 '학생' 엔터티를 나타내며, `id`, `name`, `email`은 해당 엔터티의 속성입니다.



**4.1.2 릴레이션 (Relation)**

릴레이션(Relation)은 데이터베이스에서 엔터티 간의 관계를 표현하는 구조입니다. 흔히 테이블(Table)이라는 용어로도 불리며, 테이블은 행과 열로 구성된 2차원 구조를 가집니다. 각 행은 개별 레코드를 나타내고, 각 열은 속성을 나타냅니다.

*   **예시:**\
    '학생' 엔터티와 '강의' 엔터티 간의 릴레이션을 나타내는 테이블:

    | StudentID | Name | Email            |
    | --------- | ---- | ---------------- |
    | 1         | 홍길동  | hong@example.com |
    | 2         | 이순신  | lee@example.com  |

    이 릴레이션은 '학생' 엔터티의 속성들로 구성된 테이블을 나타냅니다.



**4.1.3 속성 (Attribute)**

속성(Attribute)은 엔터티의 특성을 나타내는 개별적인 데이터 항목입니다. 각각의 엔터티는 여러 개의 속성을 가질 수 있으며, 이 속성들은 엔터티를 설명하는 중요한 요소입니다.

* **예시:**\
  앞서 소개한 `Student` 엔터티에서 `name`, `email`은 속성입니다. 이 속성들은 학생의 이름과 이메일 주소를 나타냅니다.



**4.1.4 도메인 (Domain)**

도메인(Domain)은 특정 속성이 가질 수 있는 값의 범위를 정의합니다. 즉, 데이터베이스에서 각 속성에 입력될 수 있는 값의 유형과 범위를 제한하는 역할을 합니다. 도메인을 정의함으로써 데이터의 일관성을 유지하고 데이터 입력 시 발생할 수 있는 오류를 방지할 수 있습니다.

* **예시:**\
  '학생' 엔터티에서 `email` 속성의 도메인은 유효한 이메일 주소의 형식으로 제한될 수 있습니다. 이를 통해 데이터베이스에 올바르지 않은 이메일 주소가 입력되는 것을 방지할 수 있습니다.



**4.1.5 필드와 레코드 (Field and Record)**

필드(Field)와 레코드(Record)는 데이터베이스의 테이블에서 사용되는 기본 단위입니다. 필드는 테이블의 열을, 레코드는 행을 나타냅니다.

* **필드(Field):** 테이블에서 각 열이 하나의 필드를 나타내며, 특정 속성을 의미합니다. 예를 들어, '학생' 테이블에서 `name` 열은 '이름' 필드입니다.
* **레코드(Record):** 테이블에서 각 행이 하나의 레코드를 나타내며, 각 레코드는 엔터티의 인스턴스(즉, 객체)를 의미합니다. 예를 들어, '학생' 테이블에서 한 행은 특정 학생의 데이터를 나타내는 하나의 레코드입니다.



**4.1.6 관계 (Relationship)**

관계(Relationship)는 데이터베이스에서 서로 다른 엔터티 간의 연결을 표현하는 개념입니다. 관계는 엔터티 간의 상호작용을 모델링하는 데 사용되며, 크게 세 가지 유형이 있습니다: 일대일(1:1), 일대다(1), 다대다(N).

* **일대일 관계 (1:1):** 하나의 엔터티가 다른 하나의 엔터티와만 관계를 맺는 경우입니다. 예를 들어, '학생'과 '학생증' 사이의 관계가 이에 해당할 수 있습니다.
* **일대다 관계 (1):** 하나의 엔터티가 여러 개의 다른 엔터티와 관계를 맺는 경우입니다. 예를 들어, '교수'와 '강의' 사이의 관계가 이에 해당할 수 있습니다. 한 명의 교수가 여러 강의를 가르칠 수 있습니다.
* **다대다 관계 (N):** 여러 엔터티가 여러 개의 다른 엔터티와 관계를 맺는 경우입니다. 예를 들어, '학생'과 '강의' 사이의 관계가 이에 해당할 수 있습니다. 여러 학생이 여러 강의를 들을 수 있습니다.



**4.1.7 키 (Key)**

키(Key)는 데이터베이스에서 특정 레코드를 고유하게 식별하는 데 사용되는 속성 또는 속성들의 집합입니다. 키는 데이터의 무결성을 유지하고 검색 작업을 효율적으로 수행하는 데 필수적입니다.

* **기본 키 (Primary Key):** 각 레코드를 고유하게 식별하는 키입니다. 기본 키는 중복 값을 가질 수 없으며, NULL 값을 허용하지 않습니다.
* **외래 키 (Foreign Key):** 다른 테이블의 기본 키를 참조하는 키입니다. 외래 키는 두 테이블 간의 관계를 정의하는 데 사용됩니다.
* **후보 키 (Candidate Key):** 기본 키로 선택될 수 있는 후보 중 하나입니다. 기본 키와 마찬가지로 중복 값을 가질 수 없으며, NULL 값을 허용하지 않습니다.
* **대체 키 (Alternate Key):** 후보 키 중 기본 키로 선택되지 않은 키입니다.
* **슈퍼 키 (Super Key):** 하나 이상의 속성으로 구성되어 테이블의 각 레코드를 고유하게 식별할 수 있는 키입니다. 슈퍼 키는 기본 키를 포함할 수 있습니다.
*   **예시:**\
    스프링부트와 Lombok을 활용해 기본 키와 외래 키를 사용하는 예시:

    ```java
    import lombok.Data;
    import javax.persistence.*;

    @Entity
    @Data
    public class Student {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private String email;
    }

    @Entity
    @Data
    public class Enrollment {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        @ManyToOne
        @JoinColumn(name = "student_id")
        private Student student;

        @ManyToOne
        @JoinColumn(name = "lecture_id")
        private Lecture lecture;
    }
    ```

    이 코드에서 `Student` 클래스의 `id` 속성은 기본 키로 정의되었으며, `Enrollment` 클래스에서는 `student_id`와 `lecture_id`가 외래 키로 사용되어 `Student`와 `Lecture` 테이블 간의 관계를 나타냅니다.
