์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |
- ์ด๋๋ฆฌ์
- ๋ถ๋์ฐ
- ์๋ฆฌ์ดํธํ๋
- ํ์ด์ฌ
- ์ฃผ์
- ๋ง์ง
- ํ์จ
- cpp
- ํด์ธ์ฌํ
- ์งํ
- Python
- ์ฌํ
- C++
- ๋ฏธ๊ตญ์ฌํ
- ํธ๋ ์ด๋ฉ
- ๊ฒฝ์ ์งํ
- ์ํธํํ
- ๊ธ๋ฆฌ
- ํธ๋ ์ด๋
- ๋ฐ์ด๋ธ์ค
- ๊ตญ๋ด์ฌํ
- ๋ฐ์ดํฐ๋ถ์
- ํฌ์
- ์ผ์
- ์ธ๊ณ๊ฒฝ์
- ์ฐจํธ๋ถ์
- ๋นํธ์ฝ์ธ
- ๊ฒฝ์
- ํ๋ก๊ทธ๋๋ฐ
- ๋งค๋งค์ ๋ต
- Today
- Total
์ถ์ ๊ณต์
[Spring] ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์๋ฒฝ ๊ฐ์ด๋ ๋ณธ๋ฌธ
๐ Spring ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์๋ฒฝ ๊ฐ์ด๋: ์ค๋ฌด ์ค์ฌ ์ ๋ฆฌ
Spring ๊ฐ๋ฐ์๋ก์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง(Data Modeling)์ ๋จ์ํ DB ์ค๊ณ ์ด์์
๋๋ค.
๋๋ฉ์ธ ๊ฐ์ฒด(Entity), ๋ ํฌ์งํ ๋ฆฌ ์ค๊ณ, ์๋น์ค ๊ณ์ธต๊น์ง ์ฐ๊ฒฐ๋๋ ํต์ฌ ๊ธฐ๋ฐ์ด์ฃ .
์ด๋ฒ ๊ธ์์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ ์๋ถํฐ ERD ๊ตฌ์ฑ ์์, PK/FK ๊ฐ๋
, ๋ชจ๋ธ๋ง ์ ์ฐจ๊น์ง ์ค๋ฌด ๊ด์ ์์ ์ ๋ฌธ์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค.
1. ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ ์: ํ์ค์ ๋ฐ์ดํฐ๋ก ๋ฒ์ญํ๋ค
- ๋ชจ๋ธ๋ง(Modeling): ๋ณต์กํ ํ์ค ์ธ๊ณ์ ๋์์ ํต์ฌ์ ์ธ ํน์ง๋ง ์ถ์ถํ์ฌ ์ถ์ํํ๊ณ ๋จ์ํํ์ฌ ํํํ๋ ๊ณผ์ ์ ๋๋ค. ์ง๋๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ฑด์ถ ์ค๊ณ๋๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์๊ฐํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง(Data Modeling): ์ ๋ณด ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํด, ์ค์ ์ ๋ฌด ํ๋ก์ธ์ค์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ, ํน์ฑ, ๊ด๊ณ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ์ํ๊ณ ํํํ๋ ์์ ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๊ณ , ์ ๊ทผํ๊ณ , ๊ด๋ฆฌํ ์ง์ ๋ํ ์ฒญ์ฌ์ง ์ญํ ์ ํฉ๋๋ค.
- ER ๋ชจ๋ธ (Entity-Relationship Model): ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ๋ก ์ค ํ๋๋ก, ํ์ค ์ธ๊ณ์ ๊ฐ๋ ์ด๋ ๊ฐ์ฒด์ธ ๊ฐ์ฒด(Entity) ์ ์ด๋ค ๊ฐ์ ๊ด๊ณ(Relationship) ๋ฅผ ์ค์ฌ์ผ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํํํฉ๋๋ค.
- ERD (Entity-Relationship Diagram): ER ๋ชจ๋ธ์ ์๊ฐ์ ์ผ๋ก ํํํ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค. ์ํฐํฐ, ์์ฑ, ๊ด๊ณ ๋ฑ์ด ํ์คํ๋ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ ค์ง๋ฏ๋ก, ๊ฐ๋ฐ์, ์ค๊ณ์, ํ์ ์ฌ์ฉ์ ๊ฐ์ ์์ฌ์ํต ๋๊ตฌ๋ก ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
2. ๋ฐ์ดํฐ ๊ด๊ณ์ ํต์ฌ: ๊ธฐ๋ณธ ํค(PK)์ ์ธ๋ ํค(FK)
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง์์ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํค(Key)๋ ํ์์ ์ ๋๋ค.
- ๊ธฐ๋ณธ ํค (Primary Key, PK): ํ
์ด๋ธ ๋ด์ ๊ฐ ํ(Row)์ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ ํ๋ ์ด์์ ์ปฌ๋ผ(Column)์
๋๋ค.
- ํน์ง:
- ์ ์ผ์ฑ(Uniqueness): ํ ์ด๋ธ ๋ด์์ ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. (Not Null + Unique)
- ์ต์์ฑ(Minimality): ์๋ณ๋ ฅ์ ๊ฐ๋ ์ต์ํ์ ์ปฌ๋ผ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
- ์์ ์ฑ(Stability): ๊ฐ์ด ์์ฃผ ๋ณ๊ฒฝ๋์ง ์์์ผ ํฉ๋๋ค. (์์ฃผ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.)
- Spring/JPA: ์ํฐํฐ ํด๋์ค ๋ด์์ @Id ์ด๋ ธํ ์ด์ ์ผ๋ก ํ๋๋ฅผ ์ง์ ํฉ๋๋ค. ํ์์ ๋ฐ๋ผ @GeneratedValue๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ์์ฑ ์ ๋ต์ ์ ์ํ ์ ์์ต๋๋ค.
- ํน์ง:
- ์ธ๋ ํค (Foreign Key, FK): ํ ํ
์ด๋ธ์ ์ปฌ๋ผ์ด ๋ค๋ฅธ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐํ์ฌ ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ(Relationship) ๋ฅผ ๋งบ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ(Referential Integrity)์ ๋ณด์ฅํ๋ ์ญํ ์ ํฉ๋๋ค. (์: ์ฃผ๋ฌธ ํ
์ด๋ธ์ ๊ณ ๊ฐ ID๋ ๊ณ ๊ฐ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐ)
- Spring/JPA: ์ฃผ๋ก ๊ด๊ณ ๋งคํ ์ด๋ ธํ ์ด์ (@ManyToOne, @OneToOne ๋ฑ)๊ณผ ํจ๊ป @JoinColumn ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ธ๋ ํค ์ปฌ๋ผ์ ๋ช ์์ ์ผ๋ก ๋งคํํฉ๋๋ค.
์์: ๊ณ ๊ฐ(Users)๊ณผ ์ฃผ๋ฌธ(Orders) ํ ์ด๋ธ
SQL DDL:
CREATE TABLE Users (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT, -- ๊ธฐ๋ณธ ํค (PK)
username VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255) UNIQUE
);
CREATE TABLE Orders (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT, -- ๊ธฐ๋ณธ ํค (PK)
order_date DATETIME,
user_id BIGINT, -- ์ธ๋ ํค (FK)
FOREIGN KEY (user_id) REFERENCES Users(user_id) -- Users ํ
์ด๋ธ์ PK ์ฐธ์กฐ
);
Spring Data JPA Entities:
import jakarta.persistence.*; // ๋๋ javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId; // PK ๋งคํ
@Column(nullable = false, unique = true)
private String username;
@Column(unique = true)
private String email;
@OneToMany(mappedBy = "user") // Order ์ํฐํฐ์ 'user' ํ๋์ ์ํด ๋งคํ๋จ
private List<Order> orders;
// Getters and Setters
}
@Entity
@Table(name = "Orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId; // PK ๋งคํ
private LocalDateTime orderDate;
@ManyToOne(fetch = FetchType.LAZY) // ์ง์ฐ ๋ก๋ฉ ๊ถ์ฅ
@JoinColumn(name = "user_id") // FK ์ปฌ๋ผ๋ช
์ง์ (nullable=true ๊ธฐ๋ณธ)
private User user; // FK ๊ด๊ณ ๋งคํ
// Getters and Setters
}
3. ER ๋ชจ๋ธ์ ๊ตฌ์ฑ ์์ ์์ธ
- ์ํฐํฐ (Entity): ์ ์ฅ๋์ด์ผ ํ ๋ฐ์ดํฐ์ ๋์์ด ๋๋ ์ค์กดํ๋ ๊ฐ์ฒด ๋๋ ๊ฐ๋
์ ๋์์
๋๋ค. (์: ๊ณ ๊ฐ, ์ ํ, ์ฃผ๋ฌธ, ๊ฒ์๊ธ). ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ๋ก ๋งคํ๋ฉ๋๋ค.
- Spring/JPA: @Entity ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค์ ํด๋นํฉ๋๋ค.
- ์์ฑ (Attribute): ์ํฐํฐ๊ฐ ๊ฐ์ง๋ ๊ตฌ์ฒด์ ์ธ ํน์ฑ์ด๋ ์ค๋ช
์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๊ฐ์ฅ ์์ ๋
ผ๋ฆฌ์ ๋จ์์
๋๋ค. (์: ๊ณ ๊ฐ ์ํฐํฐ์ ์ด๋ฆ, ์ด๋ฉ์ผ, ์ฃผ์). ํ
์ด๋ธ์ ์ปฌ๋ผ์ผ๋ก ๋งคํ๋ฉ๋๋ค.
- Spring/JPA: ์ํฐํฐ ํด๋์ค ๋ด์ ํ๋(๋ฉค๋ฒ ๋ณ์) ์ ํด๋นํ๋ฉฐ, @Column, @Enumerated, @Temporal ๋ฑ์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ธ๋ถ ์์ฑ์ ์ ์ํฉ๋๋ค.
- ๊ด๊ณ (Relationship): ์ํฐํฐ(๋๋ ์ธ์คํด์ค) ๊ฐ์ ์๋ฏธ ์๋ ์ฐ๊ด์ฑ์ด๋ ๊ท์น์ ํํํฉ๋๋ค. (์: ๊ณ ๊ฐ์ ์ฌ๋ฌ ์ฃผ๋ฌธ์ ํ ์ ์๋ค). ์ฃผ๋ก ์ธ๋ ํค(FK) ๋ฅผ ํตํด ๊ตฌํ๋ฉ๋๋ค.
- Spring/JPA: @OneToOne, @ManyToOne, @OneToMany, @ManyToMany ๋ฑ์ ๊ด๊ณ ๋งคํ ์ด๋ ธํ ์ด์ ์ผ๋ก ํํ๋ฉ๋๋ค.
- ์๋ณ์ (Identifier): ํ๋์ ์ํฐํฐ ๋ด์์ ๊ฐ ์ธ์คํด์ค(ํ)๋ฅผ ๊ณ ์ ํ๊ฒ ๊ตฌ๋ณํ ์ ์๋ ์์ฑ ๋๋ ์์ฑ๋ค์ ์งํฉ์
๋๋ค. ๊ธฐ๋ณธ ํค(PK) ๊ฐ ๋ํ์ ์ธ ์๋ณ์์
๋๋ค.
- Spring/JPA: @Id ์ด๋ ธํ ์ด์ ์ผ๋ก ์ง์ ๋ ํ๋(๋ค)์ ํด๋นํฉ๋๋ค.
4. ์ํฐํฐ ๊ด๊ณ(Entity Relationship)์ ์ข ๋ฅ์ ํํ
์ํฐํฐ ๊ฐ์ ๊ด๊ณ๋ ํฌ๊ฒ ๊ด๊ณ์(Cardinality)์ ์ ํ์ฑ(Optionality)์ผ๋ก ์ ์๋ฉ๋๋ค.
- ๊ด๊ณ์ (Cardinality): ๋ ์ํฐํฐ ํ์
๊ฐ์ ์ฐธ์ฌํ ์ ์๋ ์ธ์คํด์ค(ํ)์ ์๋ฅผ ๋ํ๋
๋๋ค.
- ์ผ๋์ผ (1:1): ๊ฐ ์ํฐํฐ์ ์ธ์คํด์ค๊ฐ ์๋ ์ํฐํฐ์ ์ธ์คํด์ค ํ๋์ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. (์: User์ UserProfile)
- JPA: @OneToOne
- ์ผ๋๋ค (1:N): ํ ์ํฐํฐ์ ์ธ์คํด์ค๊ฐ ์๋ ์ํฐํฐ์ ์ฌ๋ฌ ์ธ์คํด์ค์ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. (์: User์ Orders)
- JPA: @OneToMany (1 ์ชฝ์์) ์ @ManyToOne (N ์ชฝ์์)
- ๋ค๋๋ค (M:N): ์์ชฝ ์ํฐํฐ์ ์ธ์คํด์ค๊ฐ ์๋ก ์ฌ๋ฌ ์ธ์คํด์ค์ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. (์: Student์ Course)
- ๊ด๊ณํ DB: ์ง์ ํํ์ด ์ด๋ ค์ ์ค๊ฐ์ ๊ต์ฐจ ํ ์ด๋ธ(Intersection/Junction Table) ์ ๋์ด ๋ ๊ฐ์ 1:N ๊ด๊ณ๋ก ๋ถํดํฉ๋๋ค. ๋ฐ์ดํฐ ์ค๋ณต์ ๋ฐฉ์งํ๊ณ ๊ด๊ณ ์์ฑ์ ์ ์ฅํ๊ธฐ ์ํจ์ ๋๋ค.
- JPA: @ManyToMany ์ด๋ ธํ ์ด์ ์ผ๋ก ํํ ๊ฐ๋ฅ (JPA๊ฐ ์๋ฌต์ ์ผ๋ก ์กฐ์ธ ํ ์ด๋ธ ์์ฑ/๊ด๋ฆฌ)ํ๊ฑฐ๋, ์กฐ์ธ ํ ์ด๋ธ ์์ฒด๋ฅผ ๋ณ๋์ @Entity๋ก ๋ช ์์ ์ผ๋ก ๋งคํํ์ฌ @OneToMany + @ManyToOne ๊ด๊ณ๋ก ํ์ด๋ผ ์๋ ์์ต๋๋ค (๊ถ์ฅ๋๋ ๋ฐฉ์).
- ์ผ๋์ผ (1:1): ๊ฐ ์ํฐํฐ์ ์ธ์คํด์ค๊ฐ ์๋ ์ํฐํฐ์ ์ธ์คํด์ค ํ๋์ ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค. (์: User์ UserProfile)
- ์ ํ์ฑ (Optionality): ๊ด๊ณ๋ฅผ ๋งบ๋ ์๋ ์ํฐํฐ์ ์ธ์คํด์ค๊ฐ ํ์์ (Mandatory)์ธ์ง ์ ํ์ (Optional)์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค.
- ํ์ ์ฐธ์ฌ (Mandatory, ์ค์ ๋๋ ํน์ ๊ธฐํธ): ๊ด๊ณ๋ฅผ ๋งบ๋ ์๋ ์ธ์คํด์ค๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํฉ๋๋ค. (์: ์ฃผ๋ฌธ(Order)์ ๋ฐ๋์ ํน์ ๊ณ ๊ฐ(User)๊ณผ ์ฐ๊ฒฐ๋์ด์ผ ํจ)
- DB: FK ์ปฌ๋ผ์ NOT NULL ์ ์ฝ์กฐ๊ฑด์ ์ค์ ํฉ๋๋ค.
- JPA: @ManyToOne(optional = false), @OneToOne(optional = false), @JoinColumn(nullable = false) ๋ฑ์ผ๋ก ํํํฉ๋๋ค.
- ์ ํ ์ฐธ์ฌ (Optional, ์ ์ ๋๋ ํน์ ๊ธฐํธ): ๊ด๊ณ๋ฅผ ๋งบ๋ ์๋ ์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์์ ์๋ ์์ต๋๋ค. (์: ์ฌ์ฉ์๋ ํ๋กํ ์ฌ์ง์ ๊ฐ์ง ์๋, ์ ๊ฐ์ง ์๋ ์์)
- DB: FK ์ปฌ๋ผ์ด NULL ๊ฐ์ ํ์ฉํฉ๋๋ค.
- JPA: optional = true(๊ธฐ๋ณธ๊ฐ), nullable = true(๊ธฐ๋ณธ๊ฐ)์ผ๋ก ํํ๋ฉ๋๋ค.
- ํ์ ์ฐธ์ฌ (Mandatory, ์ค์ ๋๋ ํน์ ๊ธฐํธ): ๊ด๊ณ๋ฅผ ๋งบ๋ ์๋ ์ธ์คํด์ค๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํฉ๋๋ค. (์: ์ฃผ๋ฌธ(Order)์ ๋ฐ๋์ ํน์ ๊ณ ๊ฐ(User)๊ณผ ์ฐ๊ฒฐ๋์ด์ผ ํจ)
- ์๋ณ ๊ด๊ณ vs ๋น์๋ณ ๊ด๊ณ:
- ์๋ณ ๊ด๊ณ: ๋ถ๋ชจ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค(์๋ณ์)๊ฐ ์์ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค์ ์ผ๋ถ๊ฐ ๋๋ ๊ด๊ณ์
๋๋ค. (์์ ์ํฐํฐ๋ ๋ถ๋ชจ ์์ด๋ ์๋ณ๋ ์ ์์).
- JPA: @MapsId ๋๋ @IdClass, @EmbeddedId ๋ฑ์ ์ฌ์ฉํ์ฌ ๋ณตํฉ ํค๋ฅผ ๋งคํํ ๋ ๋ํ๋ฉ๋๋ค.
- ๋น์๋ณ ๊ด๊ณ (์ผ๋ฐ์ ): ๋ถ๋ชจ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค๊ฐ ์์ ์ํฐํฐ์ ์ผ๋ฐ ์์ฑ(FK)์ผ๋ก ์ฐธ์กฐ๋๋ ๊ด๊ณ์ ๋๋ค. (์์ User-Order ์์)
- ์๋ณ ๊ด๊ณ: ๋ถ๋ชจ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค(์๋ณ์)๊ฐ ์์ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค์ ์ผ๋ถ๊ฐ ๋๋ ๊ด๊ณ์
๋๋ค. (์์ ์ํฐํฐ๋ ๋ถ๋ชจ ์์ด๋ ์๋ณ๋ ์ ์์).
5. ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์ ์ฐจ: ์ฒด๊ณ์ ์ธ ์ ๊ทผ
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ๋ถ์ ๋จ๊ณ:
- ์ ๋ฌด ๋ถ์: ๋์ ์ ๋ฌด์ ํ๋ก์ธ์ค, ๊ท์น, ์๊ตฌ์ฌํญ์ ๋ช ํํ ์ดํดํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ถ์: ์ ๋ฌด์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ, ํ๋ฆ, ์ ์ฝ ์กฐ๊ฑด์ ํ์ ํฉ๋๋ค.
- ์๊ตฌ์ฌํญ ์ ์: ์ฌ์ฉ์ ๋ฐ ์์คํ ์๊ตฌ์ฌํญ์ ๊ตฌ์ฒดํํฉ๋๋ค.
- ๋ฐฉํฅ ์๋ฆฝ: ๋ชจ๋ธ๋ง์ ๋ฒ์์ ๋ชฉํ, ๊ณ ๋ ค์ฌํญ์ ๊ฒฐ์ ํฉ๋๋ค. (๊ธฐ์กด ์์คํ ๋ฒค์น๋งํน, ํ๋ฉด ์ ์์ ์์ฑ ๋ฑ์ด ํฌํจ๋ ์ ์์)
- ์ค๊ณ ๋จ๊ณ:
- ๊ฐ๋
์ ๋ชจ๋ธ๋ง (Conceptual Modeling): ์
๋ฌด ์์ญ์ ํต์ฌ ์ํฐํฐ์ ๊ทธ๋ค ๊ฐ์ ์ฃผ์ ๊ด๊ณ๋ฅผ ์ถ์์ ์ธ ์์ค์์ ์ ์ํฉ๋๋ค. (ERD ์ด์ ์์ฑ)
- ์ฃผ์ ์์ญ ์ ์: ๋ชจ๋ธ๋ง ๋์๊ณผ ๋ฒ์ ํ์ .
- ํต์ฌ ์ํฐํฐ ๋์ถ: ์ฃผ์ ์ ๋ฌด ์ฃผ์ฒด, ๋์, ๊ฐ๋ ์๋ณ.
- ๋
ผ๋ฆฌ์ ๋ชจ๋ธ๋ง (Logical Modeling): ๊ฐ๋
๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํฉ๋๋ค. ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ ๊ณผ๋ ๋
๋ฆฝ์ ์ผ๋ก, ์ ๊ทํ ๋ฑ์ ํตํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ํจ์จ์ฑ์ ํ๋ณดํฉ๋๋ค.
- ๋ชจ๋ ์ํฐํฐ ์์ธ ์ ์ (์์ฑ ํฌํจ).
- ์ํฐํฐ ๊ฐ ๊ด๊ณ ์์ธ ์ ์ (๊ด๊ณ์, ์ ํ์ฑ, ์๋ณ ์ฌ๋ถ ๋ฑ).
- ์์ฑ ์ ์ (๋ฐ์ดํฐ ํ์ , ์ ์ฝ ์กฐ๊ฑด ๋ฑ).
- ์ ๊ทํ ์ํ.
- ๋ฌผ๋ฆฌ์ ๋ชจ๋ธ๋ง (Physical Modeling): ๋
ผ๋ฆฌ ๋ชจ๋ธ์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
(MySQL, Oracle ๋ฑ)์ ๋ง๊ฒ ๋ณํํ๋ ๊ณผ์ ์
๋๋ค. ์ฑ๋ฅ, ๋ณด์, ์ ์ฅ ๊ณต๊ฐ ๋ฑ์ ๊ณ ๋ คํ์ฌ ํ
์ด๋ธ, ์ปฌ๋ผ, ์ธ๋ฑ์ค ๋ฑ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๊ณํฉ๋๋ค.
- ํ ์ด๋ธ/์ปฌ๋ผ ๋ณํ: ์ํฐํฐ -> ํ ์ด๋ธ, ์์ฑ -> ์ปฌ๋ผ (DB ํ์ ๋งคํ, ์ด๋ฆ ๊ท์น ์ ์ฉ).
- ๋ฌด๊ฒฐ์ฑ ์ค๊ณ: PK, FK, Not Null, Unique, Check ์ ์ฝ์กฐ๊ฑด, Default ๊ฐ ์ค์ . (JPA์์๋ @Id, @Column(nullable=false, unique=true), @Check ๋ฑ์ผ๋ก ๋ฐ์)
- ์ฑ๋ฅ ํฅ์: ์ญ์ ๊ทํ(ํ์์), ์ค๋ณต ์ปฌ๋ผ ์ถ๊ฐ, ์ธ๋ฑ์ค ์ค๊ณ(@Index), ํํฐ์ ๋(DB ๊ธฐ๋ฅ) ๋ฑ์ ๊ณ ๋ คํฉ๋๋ค.
- ๊ฐ๋
์ ๋ชจ๋ธ๋ง (Conceptual Modeling): ์
๋ฌด ์์ญ์ ํต์ฌ ์ํฐํฐ์ ๊ทธ๋ค ๊ฐ์ ์ฃผ์ ๊ด๊ณ๋ฅผ ์ถ์์ ์ธ ์์ค์์ ์ ์ํฉ๋๋ค. (ERD ์ด์ ์์ฑ)
6. ์ถ๊ฐ์ ์ธ ๋ชจ๋ธ๋ง ๊ณ ๋ ค์ฌํญ: ๋ถ๋ฅ ํ ์ด๋ธ๊ณผ ์ฝ๋ ํ ์ด๋ธ
- ๋ถ๋ฅ ํ
์ด๋ธ (Classification Table): ๋ฐ์ดํฐ์ ๋ถ๋ฅ ์ฒด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ
์ด๋ธ์
๋๋ค. ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ๊ณ ์ ์ ์ธ ๊ฒฝ์ฐ(๋/์ค/์ ๋ถ๋ฅ) ๋๋ ๋์ ์ธ ๊ฒฝ์ฐ(์์/ํ์ ๊ด๊ณ)์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- Spring/JPA: ๊ณ์ธต ๊ตฌ์กฐ๋ @ManyToOne (self-referencing) ๋ฑ์ผ๋ก ํํํ๊ฑฐ๋, ๊ณ ์ ๋ถ๋ฅ๋ Enum ํ์ ์ผ๋ก ๋งคํํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ฝ๋ ํ
์ด๋ธ (Code Table): ์์คํ
์ ๋ฐ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ฝ๋(์ํ ์ฝ๋, ์ ํ ์ฝ๋ ๋ฑ)์ ๊ทธ ์๋ฏธ๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์
๋๋ค. ์ฝ๋ ๊ฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๊ด๋ฆฌ ์ฉ์ด์ฑ์ ๋์
๋๋ค.
- Spring/JPA: ์ฝ๋ ํ ์ด๋ธ์ ์ํฐํฐ๋ก ๋งคํํ๊ฑฐ๋, ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ์ฝ๋๋ Java Enum ํ์ ์ผ๋ก ์ ์ํ์ฌ @Enumerated ์ด๋ ธํ ์ด์ ์ผ๋ก ๋งคํํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค.
๐ง๐ป Spring์์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋ฉ๋๋ค
ER ๋ชจ๋ธ ์์ | Spring ํํ ๋ฐฉ์ |
์ํฐํฐ(Entity) | @Entity, Java ํด๋์ค |
์์ฑ(Attribute) | @Column, ํ๋ |
๊ธฐ๋ณธํค(PK) | @Id |
์ฐธ์กฐํค(FK) | @ManyToOne, @JoinColumn |
๊ด๊ณ | @OneToMany, @ManyToOne |
๊ฒฐ๋ก : ๊ฒฌ๊ณ ํ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ์์
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ๋จ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๊ทธ๋ฆฌ๋ ์์ ์ด ์๋๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ์ ๋ฌด ์๊ตฌ์ฌํญ์ ์ ํํ ๋ฐ์ํ๊ณ , ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ํฅํ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ๊น์ง ๊ณ ๋ คํ ๋ชจ๋ธ๋ง์ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง์ ๊ฒฐ์ ์ง๋ ํต์ฌ ์์์ ๋๋ค.