๐ฏ ERD(Entity-Relationship Diagram) ์ค๊ณ ์๋ฒฝ ๊ฐ์ด๋
๐ค ์ ์ด ๊ฐ์ด๋๋ฅผ ๋ง๋ค์๋?
Java Spring ๋ฐฑ์๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ERD ์์ฑ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํ๊ณ , ERD ์์ฑ ์์์ ๋ฌด์์ ๊ธฐ์ค ์ผ์์ ์ค๊ณํด์ผ ํ๋์ง ๋ช ํํ ์์น๊ณผ ํจํด์ ์์ง ๋ชปํด ์ ๋ฆฌํ ์ค์ ๊ฐ์ด๋์ ๋๋ค.
๐ฏ ํ์ต ๋ชฉํ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ์ ํต์ฌ์ธ ERD ์์ฑ ๋ฐฉ๋ฒ๊ณผ ์์น, ๊ทธ๋ฆฌ๊ณ ์ฒด๊ณ์ ์ธ ์์ฑ ์์๋ฅผ ์๋ฒฝํ ๋ง์คํฐํ์!
๐ ๋ชฉ์ฐจ
- ERD๋ ๋ฌด์์ธ๊ฐ?
- ERD ์์ฑ ๊ธฐ์ค๊ณผ ์ถ๋ฐ์
- ERD ์์ฑ 4๋จ๊ณ ํ๋ก์ธ์ค
- ERD ์์ฑ ํต์ฌ ์์น
- ์ค์ ERD ์์ฑ ์์
- ERD ๊ฒํ ์ฒดํฌ๋ฆฌ์คํธ
๐จ ERD๋ ๋ฌด์์ธ๊ฐ?
๐ก ์ ์: โ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์๊ฐํํ ์ค๊ณ๋โ
ERD๋ ์์คํ ์์ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ(Entity), ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ ์์ฑ(Attribute), ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ๊ฐ์ ์ฐ๊ด์ฑ(Relationship) ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๋์ ๋๋ค.
๐ฏ ERD์ ํต์ฌ ๋ชฉ์
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ์๊ฐํ: ๋ณต์กํ ๋ฐ์ดํฐ ๊ด๊ณ๋ฅผ ํ๋์ ํ์
- ์ค๊ณ ๊ฒ์ฆ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ถ ์ ๊ตฌ์กฐ์ ๋ฌธ์ ์ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌ
- ํ ์ปค๋ฎค๋์ผ์ด์ : ๊ฐ๋ฐํ๊ณผ ๊ธฐํํ ๊ฐ์ ๋ช ํํ ์ํต ๋๊ตฌ
- ๊ฐ๋ฐ ๊ฐ์ด๋: ์ค์ ํ ์ด๋ธ ์ค๊ณ์ JPA Entity ์์ฑ์ ๊ธฐ์ค์
๐ ERD ์์ฑ ๊ธฐ์ค๊ณผ ์ถ๋ฐ์
๐ ํต์ฌ ๊ธฐ์ค: โ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญโ
ERD๋ ๋ง๋ค๊ณ ์ ํ๋ ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ์๊ตฌ์ฌํญ์ ๊ธฐ์ค์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
๐ญ ๊ธฐ์ค์ ์ฐพ๊ธฐ ์ง๋ฌธ๋ค
- โ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌด์์ ํด์ผ ํ๋๊ฐ?โ
- โ์ฌ์ฉ์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์์ฑ, ์กฐํ, ์์ , ์ญ์ ํ๋๊ฐ?โ
- โ๋น์ฆ๋์ค ๊ท์น์ ๋ฌด์์ธ๊ฐ?โ (์: ํ ๋ช ์ ํ์์ ์ฌ๋ฌ ์ฃผ๋ฌธ ๊ฐ๋ฅ)
- โ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฝ์ฌํญ์ ๋ฌด์์ธ๊ฐ?โ (์: ์ฃผ๋ฌธ์๋ ๋ฐ๋์ ํ์์ด ํ์)
๐ฏ ์๊ตฌ์ฌํญ ๋ถ์ ์์: ์จ๋ผ์ธ ์ผํ๋ชฐ
ํต์ฌ ๊ธฐ๋ฅ:
- ํ์๊ฐ์
/๋ก๊ทธ์ธ
- ์ํ ์กฐํ/๊ฒ์
- ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ
- ์ฃผ๋ฌธ/๊ฒฐ์
- ์ฃผ๋ฌธ๋ด์ญ ์กฐํ
โ ํ์ํ ์ฃผ์ ๋ฐ์ดํฐ: ํ์, ์ํ, ์ฅ๋ฐ๊ตฌ๋, ์ฃผ๋ฌธ, ์ฃผ๋ฌธ์ํ
๐ ERD ์์ฑ 4๋จ๊ณ ํ๋ก์ธ์ค
1๏ธโฃ ์ํฐํฐ(Entity) ๋์ถ - ํต์ฌ ๋ช ์ฌ ์ฐพ๊ธฐ
๐ฏ ์์ ๋ด์ฉ
์์คํ ์ ํต์ฌ โ๋ช ์ฌโ๋ค์ ์ฐพ์๋ด์ด ์ํฐํฐ๋ก ์ ์ํฉ๋๋ค.
๐ก ๋์ถ ๋ฐฉ๋ฒ
- ์๊ตฌ์ฌํญ์์ ๋ช ์ฌ ์ถ์ถ
- ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ ๊ฐ์ฒด์ธ์ง ํ์ธ
- ์ฌ๋ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์ ์๋์ง ํ์ธ
๐ ์์: ์จ๋ผ์ธ ์ผํ๋ชฐ
์ถ์ถ๋ ๋ช
์ฌ: ํ์, ์ํ, ์นดํ
๊ณ ๋ฆฌ, ์ฃผ๋ฌธ, ์ฅ๋ฐ๊ตฌ๋, ๋ฆฌ๋ทฐ, ์ฟ ํฐ
์ํฐํฐ ํ๋ณด:
โ
Member (ํ์)
โ
Product (์ํ)
โ
Category (์นดํ
๊ณ ๋ฆฌ)
โ
Order (์ฃผ๋ฌธ)
โ
Cart (์ฅ๋ฐ๊ตฌ๋)
โ
Review (๋ฆฌ๋ทฐ)
โ
Coupon (์ฟ ํฐ)
2๏ธโฃ ์์ฑ(Attribute) ์ ์ - ๊ฐ ์ํฐํฐ์ ์ ๋ณด ๋์ด
๐ฏ ์์ ๋ด์ฉ
๊ฐ ์ํฐํฐ๊ฐ ๊ฐ์ ธ์ผ ํ ์์ฑ(์ปฌ๋ผ)๋ค์ ์ ์ํ๊ณ ๊ธฐ๋ณธ ํค(PK)๋ฅผ ์ง์ ํฉ๋๋ค.
๐ก ์์ฑ ์ ์ ์์น
- ๊ธฐ๋ณธ ํค(PK): ๊ฐ ๋ ์ฝ๋๋ฅผ ์ ์ผํ๊ฒ ์๋ณ
- ํ์ ์์ฑ: ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋์ ํ์ํ ์ ๋ณด
- ์ ํ ์์ฑ: ์์ผ๋ฉด ์ข์ง๋ง ํ์๊ฐ ์๋ ์ ๋ณด
๐ ์์: ์ฃผ์ ์ํฐํฐ๋ณ ์์ฑ
Member (ํ์)
โโโ memberId (PK) - ํ์ ๊ณ ์ ID
โโโ email - ์ด๋ฉ์ผ (์ ๋ํฌ)
โโโ password - ๋น๋ฐ๋ฒํธ
โโโ memberName - ํ์๋ช
โโโ phoneNumber - ์ ํ๋ฒํธ
โโโ address - ์ฃผ์
โโโ createdAt - ๊ฐ์
์ผ์
โโโ status - ํ์์ํ
Product (์ํ)
โโโ productId (PK) - ์ํ ๊ณ ์ ID
โโโ productName - ์ํ๋ช
โโโ productPrice - ์ํ๊ฐ๊ฒฉ
โโโ stockCount - ์ฌ๊ณ ์๋
โโโ description - ์ํ์ค๋ช
โโโ categoryId (FK) - ์นดํ
๊ณ ๋ฆฌ ID
โโโ createdAt - ๋ฑ๋ก์ผ์
โโโ status - ์ํ์ํ
Order (์ฃผ๋ฌธ)
โโโ orderId (PK) - ์ฃผ๋ฌธ ๊ณ ์ ID
โโโ memberId (FK) - ํ์ ID
โโโ orderDate - ์ฃผ๋ฌธ์ผ์
โโโ totalAmount - ์ด ์ฃผ๋ฌธ๊ธ์ก
โโโ deliveryAddress - ๋ฐฐ์ก์ฃผ์
โโโ orderStatus - ์ฃผ๋ฌธ์ํ
3๏ธโฃ ๊ด๊ณ(Relationship) ์ค์ - ์ํฐํฐ ๊ฐ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์ ์
๐ฏ ์์ ๋ด์ฉ
์ํฐํฐ ๊ฐ์ ๊ด๊ณ(1:1, 1:N, N:M)๋ฅผ ์ ์ํ๊ณ ์ธ๋ ํค(FK)๋ฅผ ์ค์ ํฉ๋๋ค.
๐ ๊ด๊ณ ์ ํ๋ณ ํน์ง
๊ด๊ณ ์ ํ | ์ค๋ช | ์์ | ๊ตฌํ ๋ฐฉ๋ฒ |
---|---|---|---|
1:1 | ์ผ๋์ผ ๊ด๊ณ | ํ์ โ ํ์์์ธ์ ๋ณด | ์ด๋ ์ชฝ์ด๋ FK ๋ณด์ |
1:N | ์ผ๋๋ค ๊ด๊ณ | ํ์ โ ์ฃผ๋ฌธ (ํ ํ์์ด ์ฌ๋ฌ ์ฃผ๋ฌธ) | N์ชฝ์ FK ๋ณด์ |
N:M | ๋ค๋๋ค ๊ด๊ณ | ์ํ โ ์ฃผ๋ฌธ (ํ ์ฃผ๋ฌธ์ ์ฌ๋ฌ ์ํ) | ์ค๊ฐ ํ ์ด๋ธ ์์ฑ |
๐ ์์: ๊ด๊ณ ์ค์
์ฃผ์ ๊ด๊ณ:
1. Member 1:N Order (ํ ํ์์ด ์ฌ๋ฌ ์ฃผ๋ฌธ ๊ฐ๋ฅ)
2. Category 1:N Product (ํ ์นดํ
๊ณ ๋ฆฌ์ ์ฌ๋ฌ ์ํ)
3. Member 1:N Cart (ํ ํ์์ด ์ฌ๋ฌ ์ฅ๋ฐ๊ตฌ๋ ์์ดํ
)
4. Order N:M Product (ํ ์ฃผ๋ฌธ์ ์ฌ๋ฌ ์ํ, ํ ์ํ์ด ์ฌ๋ฌ ์ฃผ๋ฌธ)
โ OrderProduct ์ค๊ฐ ํ
์ด๋ธ ์์ฑ
4๏ธโฃ ๊ฒํ ๋ฐ ์ ๊ทํ - ๊ตฌ์กฐ ์ต์ ํ
๐ฏ ์์ ๋ด์ฉ
๋ฐ์ดํฐ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์ ๊ทํ ๊ณผ์ ์ ํตํด ERD๋ฅผ ์์ฑํฉ๋๋ค.
๐ ์ ๊ทํ ์ฒดํฌํฌ์ธํธ
- ์ค๋ณต ๋ฐ์ดํฐ ์ ๊ฑฐ: ๊ฐ์ ์ ๋ณด๊ฐ ์ฌ๋ฌ ๊ณณ์ ์ ์ฅ๋์ง ์๋๋ก
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ: FK ๊ด๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ: ์ ๋ฐ์ดํธ ์ ๋ชจ์์ด ๋ฐ์ํ์ง ์๋์ง
๐จ ERD ์์ฑ ํต์ฌ ์์น
๐ก 1. ์ ๊ทํ (Normalization)
โ๊ฐ ๋ฐ์ดํฐ๋ ์ ์๋ฆฌ์, ๋จ ํ ๋ฒ๋ง ์ ์ฅํ๋คโ
โ ์๋ชป๋ ์์:
Order ํ
์ด๋ธ์ memberName, memberEmail ์ง์ ์ ์ฅ
โ
์ฌ๋ฐ๋ฅธ ์์:
Order ํ
์ด๋ธ์ memberId(FK)๋ง ์ ์ฅ, ํ์ ์ ๋ณด๋ Member ํ
์ด๋ธ ์ฐธ์กฐ
๐ท๏ธ 2. ๋ช ํํ ์ด๋ฆ ๊ท์น
์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ ์ฉ
์ํฐํฐ๋ช
: ๋จ์ ๋ช
์ฌ (Member, Product, Order)
์์ฑ๋ช
: camelCase (memberId, productName, createdAt)
๊ธฐ๋ณธํค: ์ํฐํฐ๋ช
+ Id (memberId, productId, orderId)
์ธ๋ํค: ์ฐธ์กฐ์ํฐํฐ๋ช
+ Id (memberId, categoryId)
๐ 3. ๊ธฐ๋ณธ ํค(PK) ์ ์
๋ชจ๋ ์ํฐํฐ๋ ์ ์ผํ ์๋ณ์ ํ์
๊ถ์ฅ์ฌํญ:
- ์๋ฏธ ์๋ ๋๋ฆฌํค ์ฌ์ฉ (UUID, Auto Increment)
- ๋ณตํฉํค๋ณด๋ค๋ ๋จ์ผ ์ปฌ๋ผ ๊ธฐ๋ณธํค
- ๋ณํ์ง ์๋ ๊ฐ์ผ๋ก ์ค์
๐ 4. ๊ด๊ณ์ ๋ช ํ์ฑ
๋ค๋๋ค(N:M) ๊ด๊ณ๋ ์ค๊ฐ ํ ์ด๋ธ๋ก ํด๊ฒฐ
N:M ๊ด๊ณ ํด๊ฒฐ ํจํด:
Order โโ Product (๋ค๋๋ค)
โ
Order 1:N OrderProduct N:1 Product (์ผ๋๋ค ร 2)
๐ ์ค์ ERD ์์ฑ ์์
๐ ์จ๋ผ์ธ ์ผํ๋ชฐ ERD ๊ตฌ์กฐ
erDiagram
Member ||--o{ Order : "์ฃผ๋ฌธํ๋ค"
Member ||--o{ Cart : "์ฅ๋ฐ๊ตฌ๋์ ๋ด๋๋ค"
Member ||--o{ Review : "๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ๋ค"
Category ||--o{ Product : "ํฌํจํ๋ค"
Product ||--o{ Cart : "๋ด๊ฒจ์ง๋ค"
Product ||--o{ Review : "๋ฆฌ๋ทฐ๊ฐ ๋ฌ๋ฆฐ๋ค"
Product ||--o{ OrderProduct : "์ฃผ๋ฌธ๋๋ค"
Order ||--o{ OrderProduct : "์ํ์ ํฌํจํ๋ค"
Member {
string memberId PK
string email UK
string password
string memberName
string phoneNumber
string address
datetime createdAt
string status
}
Product {
string productId PK
string categoryId FK
string productName
int productPrice
int stockCount
string description
datetime createdAt
string status
}
Category {
string categoryId PK
string categoryName
string description
}
Order {
string orderId PK
string memberId FK
datetime orderDate
int totalAmount
string deliveryAddress
string orderStatus
}
OrderProduct {
string orderProductId PK
string orderId FK
string productId FK
int quantity
int price
}
Cart {
string cartId PK
string memberId FK
string productId FK
int quantity
datetime addedAt
}
Review {
string reviewId PK
string memberId FK
string productId FK
int rating
string content
datetime createdAt
}
โ ERD ๊ฒํ ์ฒดํฌ๋ฆฌ์คํธ
๐ ์ํฐํฐ ๊ฒํ
- ๋ชจ๋ ์ํฐํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌ ๊ฐ๋ฅํ๊ฐ?
- ์ํฐํฐ๋ช ์ด ๋จ์ ๋ช ์ฌ๋ก ๋ช ํํ๊ฒ ์๋ช ๋์๋๊ฐ?
- ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ชจ๋ ์ถฉ์กฑํ๋๊ฐ?
๐ ์์ฑ ๊ฒํ
- ๋ชจ๋ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค(PK) ๊ฐ ์ ์๋์๋๊ฐ?
- ์์ฑ๋ช ์ด ์๋ฏธ๋ฅผ ๋ช ํํ ์ ๋ฌํ๋๊ฐ?
- ํ์ ์์ฑ๊ณผ ์ ํ ์์ฑ์ด ์ ์ ํ ๊ตฌ๋ถ๋์๋๊ฐ?
- ๋ฐ์ดํฐ ํ์ ์ด ์ ์ ํ ์ ํ๋์๋๊ฐ?
๐ ๊ด๊ณ ๊ฒํ
- ๋ชจ๋ ๊ด๊ณ์ ์นด๋๋๋ฆฌํฐ(1:1, 1:N, N:M)๊ฐ ์ฌ๋ฐ๋ฅธ๊ฐ?
- ์ธ๋ ํค(FK) ๊ฐ ์ ์ ํ ์์น์ ๋ฐฐ์น๋์๋๊ฐ?
- N:M ๊ด๊ณ๊ฐ ์ค๊ฐ ํ ์ด๋ธ๋ก ์ ๊ทํ๋์๋๊ฐ?
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ด ๊ณ ๋ ค๋์๋๊ฐ?
๐ฏ ์ ๊ทํ ๊ฒํ
- ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋์๋๊ฐ?
- ๊ฐฑ์ ์ด์, ์ฝ์ ์ด์, ์ญ์ ์ด์์ด ์๋๊ฐ?
- ๋น์ฆ๋์ค ๊ท์น์ด ERD์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์๋์๋๊ฐ?
๐ท๏ธ ๋ค์ด๋ฐ ๊ฒํ
- ์ ์ฒด์ ์ผ๋ก ์ผ๊ด๋ ๋ค์ด๋ฐ ๊ท์น์ด ์ ์ฉ๋์๋๊ฐ?
- ์ฝ์ด ์ฌ์ฉ์ด ์ต์ํ๋์๋๊ฐ?
- ์์ฝ์ด์ ์ถฉ๋ํ์ง ์๋๊ฐ?
๐ก ํต์ฌ ์ ๋ฆฌ
๐ฏ ERD ์ค๊ณ์ ํต์ฌ
- ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์์ ์ถ๋ฐ: ์๋น์ค๊ฐ ํด์ผ ํ ์ผ์ ๋ช ํํ ํ์
- ์ฒด๊ณ์ ์ธ 4๋จ๊ณ ํ๋ก์ธ์ค: ์ํฐํฐ โ ์์ฑ โ ๊ด๊ณ โ ์ ๊ทํ
- ์ ๊ทํ๋ฅผ ํตํ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ: ์ค๋ณต ์ ๊ฑฐ์ ์ผ๊ด์ฑ ๋ณด์ฅ
- ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ค์ด๋ฐ: ํ ์ ์ฒด๊ฐ ์ดํดํ ์ ์๋ ๋ช ๋ช ๊ท์น
์ด์ Java Spring ๋ฐฑ์๋ ํ๋ก์ ํธ์์ ์ฒด๊ณ์ ์ด๊ณ ํจ์จ์ ์ธ ERD๋ฅผ ์ค๊ณํ ์ ์์ ๊ฑฐ์์! ๐
์ด ๊ฐ์ด๋๊ฐ ๋์์ด ๋์๋ค๋ฉด, ๋ค์์๋ JPA Entity ๋งคํ๊ณผ ์ฐ๊ด๊ด๊ณ ์ค์ ๋ฒ๋ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค! ๐