์์กด์ฑ์ ์ด์ฉํด ์ค๊ณ ์งํ์ํค๊ธฐ
by JiwonDevhttps://www.youtube.com/watch?v=dJ5C4qRqAgA
๐ญ ์ค๊ณ๋ ๋ฌด์์ธ๊ฐ์?
์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์นํ ๊ฒ์ธ๊ฐ. ์ด๋ค ํจํค์ง์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ๋ฃ์ ๊ฒ์ธ๊ฐ.
์ ๊ทธ๋ฐ๊ฑธ ๊ณ ๋ฏผํ ๊น? ๊ฒฐ๊ตญ ์ค๊ณ๋ฅผ ํ๋ ๋ณธ์ง์ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋ค.
๋ณ๊ฒฝ์ ์ ํ๋ ์์กด์ฑ์ ์๋ฏธํ๋ค. ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์ฝ๋๋ฅผ ํจ๊ป ๋ฃ์ด๋ผ ์์กด์ฑ์ ๋ฐํ์ผ๋ก ์ค๊ณํ๋ผ.
๐ ์์กด์ฑ์ ์ข ๋ฅ
- ์ฐ๊ด๊ด๊ณ Association (์๊ตฌ์ )
- ์์กด๊ด๊ณ Dependency (์ผ์์ )
- ์์์ ์ด์ฉํ ํ์ฅ Inheritance ( ์์, ์์ )
- ์ธํฐํ์ด์ค๋ฅผ ํตํ ํ์ฅ Realization ( ์ค์ฒดํ )
๐ ์ข์ ์์กด์ฑ1 - ๊ผญ ํ์ํ๊ฒ ์๋๋ผ๋ฉด ์์กด์ฑ์ ์์ ๋ฒ๋ ค๋ผ
๐ ์ข์ ์์กด์ฑ2 - ์๋ฐฉํฅ ์์กด์ฑ์ ํผํ๋ผ
์๋ฐฉํฅ์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง๋ค๋ ๊ฒ
= ํญ์ A, B ์์ชฝ์ ์๋ก ๋๊ธฐํ ํด์ฃผ์ด์ผํจ. (์ฑ๋ฅ์ด์, ๋ฒ๊ทธ ๋ฐ์ ์ฌ์)
= ๊ฐ์ ํด๋์ค๋ฅผ ์ต์ง๋ก ์ฐข์ด์ ์ฌ์ฉํ๋ค๋ ๋ง. AโกB, BโกA ๋ญ๊ฐ ๋ฐ๋๋ ์์ชฝ์ ๋ณ๊ฒฝ์ด ์ ํ๋จ.
ํนํ ํจํค์ง ์ฌ์ด์์๋ ์๋ฐฉํฅ ์์กด์ฑ์ด ์์ผ๋ฉด ์๋๋ค.
์ฌ์ดํด์ด ์๊ธด๋ค๋ ๊ฒ = ํจํค์ง๋ก ์ชผ๊ฐค ํ์๊ฐ ์ ํ ์๋ค๋ ๋ง์ด๋ค. ํ๋์ ํจํค์ง๋ก ํฉ์ณ๋ผ
๐ ์ข์ ์์กด์ฑ3 - ๋ค์ค์ฑ์ด ์ ์ ๋ฐฉํฅ์ ์ ํํ๋ผ.
์๋ฅผ ๋ค์ด ๊ฐ์ฒด์ ๋ฆฌ์คํธ๊ฐ ์์ ๋ [๊ฐ์ฒด]๋ฅผ ์์กด์ฑ์ ์ฃผ์ธ์ผ๋ก ์ค์ ํด์ผํ๋ค.
๋ฆฌ์คํธ์ ์์กด์ฑ์ด ์์ผ๋ฉด ๋ฆฌ์คํธ ์์ ์๋ ๋ชจ๋ ๊ฐ์ฒด์ ์์กด์ฑ์ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ. ๋ค์ค์ฑ์ด ๋๋ฌด ํฌ๋ค.
๐ญ ์ง์ ๋ง๋ค์ด๋ณด๋ฉฐ ์์กด์ฑ ํํค์น๊ธฐ
๐ ์์ ํ๋ก์ฐ
๐ Domain Concept - ๊ฐ๊ฒ & ๋ฉ๋ด
๊ฐ๊ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฉ๋ด๋ค์ด ์๋ค.
๋ฉ๋ด๋ ์ต์ ๊ทธ๋ฃน์ ๊ฐ์ง ์ ์๋ค. (ํฌ๊ธฐ ์ ํ, ์ฌ์ด๋ ์ถ๊ฐ, ์๋ฃ ์ถ๊ฐ)
๐ Domain Concept - ์ฃผ๋ฌธ
์ฃผ๋ฌธ์ ์ฃผ๋ฌธ ์์ดํ (ํญ๋ชฉ)๋ค์ ๊ฐ์ง๋ค.
์ฃผ๋ฌธ ์์ดํ ์ ์ต์ ๊ทธ๋ฃน์ ๊ฐ์ง ์ ์๋ค.
๐ Domain Object - ๊ฐ์ฒด๋ค์ ๊ด๊ณ
๐ ํด๋น ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ฌธ์ ์
์ฃผ๋ฌธ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด๋ค.
์ฅ๋ฐ๊ตฌ๋๋ ์๋ฒ๊ฐ ์๋, ํด๋ผ์ด์ธํธ(์ฑ)์ ์ ์ฅ๋๋ค.
๋ง์ฝ ์ฌ์ฅ๋์ด ๋ฉ๋ด๋ฅผ ๋ฐ๊พธ์ ๋ค๋ฉด? ์ฌ๊ณ ๊ฐ ๋จ์ด์ ธ ํ๋งค์ค์ง๋ฅผ ํด๋ฒ๋ฆฐ๋ค๋ฉด? ์ฅ๋ฐ๊ตฌ๋์๋ ๊ทธ๊ฒ ๋ฐ์ ๋์ง ์๋๋ค.
๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๋ ๊ฒ๊ณผ ํจ๊ป ๋น์ฆ๋์ค ๋ก์ง๋ ๊ฒ์ฆํด์ผํ๋ค.
๊ฐ๊ฒ๊ฐ ์์ ์ ์ข ๋ฃํ๊ฑฐ๋, ์ต์์ฃผ๋ฌธ๊ธ์ก๊ฐ์ ๋น์ฆ๋์ค ๊ท์น๋ค๋ ๊ฒ์ฆํด์ผํ๋ค.
๐ ํ๋ ฅ ์ค๊ณํ๊ธฐ
(1) ์ฃผ๋ฌธ์ ์์ฒญํ๋ฉด [์ฃผ๋ฌธ]์ด ์์ฑ๋๋ค.
(2) [์ฃผ๋ฌธ]์ ๊ฐ๊ฒ์ ์์ ์ฌ๋ถ์ ์ต์์ฃผ๋ฌธ๊ธ์ก์ ํ์ธํ๋ค.
(3) [์ฃผ๋ฌธ ํญ๋ชฉ]์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ [๋ฉ๋ด]์ ๊ฐ์์ง ๊ฒ์ฆ์ ํ๋ค.
(4) [๋ฉ๋ด]์์ [์ฃผ๋ฌธ ์ต์ ๊ทธ๋ฃน] ๊ณผ [์ต์ ๊ทธ๋ฃน]์ด ๊ฐ์์ง ๊ฒ์ฆํ๋ค.
(5) [์ฃผ๋ฌธ ์ต์ ]๊ณผ [์ต์ ]์ด ๊ฐ์์ง ๊ฒ์ฆํ๋ค.
๐ ํด๋์ค ์ค๊ณํ๊ธฐ (Class Diagram)
๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ๋ ์ ์๋ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์, ์ ์ ์ธ ์ฝ๋๋ก ์ค๊ณํด์ผํ๋ค.
ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ํ๋ ฅ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ผํ๋ค. ์ฆ ์์กด์ฑ์ ๋ฐฉํฅ์ ์ ํด์ผํ๋ค.
๋ฐ์ดํฐ์ ์ํฅ์ ๋ฐ์ง๋ง, ํ์์ด ํ์ํ๋ค๋ฉด ์ฐ๊ด๊ด๊ณ๋ก ์ค์ ํ๋ค. (ํ์์๋ค๋ฉด ๋์ค์ ๋์ ์ ์์)
์ธ์ ๋ ์ฐธ์กฐ์๋ ์ด์ ๊ฐ ์์ด์ผ ํ๋ค. ๋ฐํ์์ ๊ฐ์ฒด๋ค์ด ์ด๋ป๊ฒ ํ๋ ฅํ๋๊ฐ?
์ฐ๊ด๊ด๊ณ๋ ํ์๊ฐ๋ฅ์ฑ (navigablilty)๋ฅผ ์๋ฏธํ๋ค.
์) Order๋ฅผ ์๋ฉด, OrderLineItem์ ์ฐพ์ ์ ์์ด์.
๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ด ํ์ํ๊ณ , ๋ ๊ฐ์ฒด์ ๊ด๊ณ๊ฐ ์๊ตฌ์ ์ด๋ผ๋ฉด ์ฐ๊ด(Association)์ ์ฌ์ฉํ๋ค.
๐ ๊ตฌํ ์์
์ฝ๋๋ฅผ ์์ฑํ ๋, ๊ตฌํ ๋ฉ์๋๋ฅผ ๋จผ์ ์์ฑํ์ง ๋ง๋ผ.
์๋์ ๊ฐ์ด ๊ณ ์์ค์ ๋ฉ์์ง๋ฅผ ์ ํ๊ณ , ๊ทธ ์ดํ ๋ฉ์๋๋ฅผ ์์ฑํ๋ผ.
@Entity
@Table(name="ORDERS")
public class Order {
// .. Order ๊ด๋ จ ์ฝ๋ ์๋ต .. //
public void place() {
validate();
ordered();
}
private void validate() {
}
private void ordered() {
}
}
์ดํ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๊ณ , ๋ฉ์๋๋ฅผ ์์ฑํ๋ค. (validate)
@Entity
@Table(name="ORDERS")
@Getter
public class Order {
// .. Order ๊ด๋ จ ์ฝ๋ ์๋ต .. //
@ManyToOne
@JoinColumn(name="SHOP_ID")
private Shop shop;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="ORDER_ID")
private List<OrderLineItem> orderLineItems = new ArrayList<>();
}
์ง๊ธ์ ๋๋ฉ์ธ ๋ ์ด์ด๋ฅผ ์ค๊ณ์ค์์ ์์ง๋ง์.
๋๋ฉ์ธ์ ๊ฐ๋ ์ด ์๋ DB๋ Web ์๋ต/์์ฒญ๋ ํ์ํ๋ค. ํ์ง๋ง Domain ๋ ์ด์ด๋ฅผ ์ค๊ณํ ๋๋ ํ์์๋ค.
Order ๋๋ฉ์ธ์ ์ ์ฒด ์ฝ๋
package org.eternity.food.domain.order;
import lombok.Builder;
import lombok.Getter;
import org.eternity.food.domain.generic.money.Money;
import org.eternity.food.domain.shop.Shop;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="ORDERS")
@Getter
public class Order {
public enum OrderStatus { ORDERED, PAYED, DELIVERED }
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ORDER_ID")
private Long id;
@Column(name="USER_ID")
private Long userId;
@ManyToOne
@JoinColumn(name="SHOP_ID")
private Shop shop;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="ORDER_ID")
private List<OrderLineItem> orderLineItems = new ArrayList<>();
@Column(name="ORDERED_TIME")
private LocalDateTime orderedTime;
@Enumerated(EnumType.STRING)
@Column(name="STATUS")
private OrderStatus orderStatus;
public Order(Long userId, Shop shop, List<OrderLineItem> items) {
this(userId, shop, items, LocalDateTime.now(), null);
}
@Builder
public Order(Long userId, Shop shop, List<OrderLineItem> items, LocalDateTime orderedTime, OrderStatus status) {
this.userId = userId;
this.shop = shop;
this.orderedTime = orderedTime;
this.orderStatus = status;
this.orderLineItems.addAll(items);
}
Order() {
}
public void place() {
validate();
ordered();
}
private void validate() {
if (orderLineItems.isEmpty()) {
throw new IllegalStateException("์ฃผ๋ฌธ ํญ๋ชฉ์ด ๋น์ด ์์ต๋๋ค.");
}
if (!shop.isOpen()) {
throw new IllegalArgumentException("๊ฐ๊ฒ๊ฐ ์์
์ค์ด ์๋๋๋ค.");
}
if (!shop.isValidOrderAmount(calculateTotalPrice())) {
throw new IllegalStateException(String.format("์ต์ ์ฃผ๋ฌธ ๊ธ์ก %s ์ด์์ ์ฃผ๋ฌธํด์ฃผ์ธ์.", shop.getMinOrderAmount()));
}
for (OrderLineItem orderLineItem : orderLineItems) {
orderLineItem.validate();
}
}
private void ordered() {
this.orderStatus = OrderStatus.ORDERED;
}
public void payed() {
this.orderStatus = OrderStatus.PAYED;
}
public void delivered() {
this.orderStatus = OrderStatus.DELIVERED;
this.shop.billCommissionFee(calculateTotalPrice());
}
private Money calculateTotalPrice() {
return Money.sum(orderLineItems, OrderLineItem::calculatePrice);
}
}
๐ญ ์ค๊ณ ๊ฐ์ ํ๊ธฐ
์๊ฐ์ด ์๋๋ฉด ์ด์ฉ ์ ์์ด ์ ์ฐจ์ (ํธ๋์ญ์ ์คํฌ๋ฆฝํธ)๋ก ์งค ์ ๋ฐ์ ์๋ค.
๊ทธ๋ ๋ณํ์ ๋ฐฉํฅ. ์์กด์ฑ์ ๊ทธ๋ ค๋ณด์. ํจํค์ง ์ฌ์ด์ ์ฌ์ดํด์ด ๋๋๊ฐ? ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ๊ฒฐํฉ๋๋ฅผ ์์น์ํค๋?
ํ๋์ฉ ํด๊ฒฐํด๋๊ฐ๋ฉฐ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ฐ์ ํด๋ณด์.
๋ฌด์จ ๋ฌธ์ ๊ฐ ์์๊น? ์์ธํ ๋ณด๋ฉด, ์ฌ์ดํด์ด ๋๊ณ ์๋ค.
์ฐ๊ด๊ด๊ณ๋ผ๊ณ ํ๋ ๊ฒ์, ํ์ ๊ฐ๋ฅํจ์ ์๋ฏธํ๋ค.
์ด๋ฅผ ์ฐ๋ฆฐ ๊ฐ์ฒด ์ฐธ์กฐ๋ก ๊ตฌํํ์๋ค. ์ฐ๊ด๊ด๊ณ๋ฅผ ์ค์ ํ๋ค.
๋ฌด์๋ณด๋ค ํธ๋์ญ์ ๊ฒฝ๊ณ๊ฐ ๋ชจํธํด์ง๋ค.
์ด๋ค ํ ์ด๋ธ ๊น์ง Lock์ ๊ฑธ์ด์ผ ํ๋๊ฐ?
์๋ฅผ ๋ค์ด ๋ฐฐ๋ฌ์๋ฃ์ ํธ๋์ญ์ ๋ฒ์๋ฅผ ์๊ฐํด๋ณด์.
ํ์ง๋ง ์ ์๊ฐํด๋ณด๋ฉด, ๊ฐ๊ฐ์ ๋๋ฉ์ธ์ ๋ณ๊ฒฝ์ ์์ ๊ณผ ๋น๋๊ฐ ๋ค๋ฅด๋ค.
Long Transaction์ผ๋ก ๋ฌถ์ด๋ฒ๋ฆฌ๋ฉด ์ ์ฒด์ Lock์ด ๊ฑธ๋ ค๋ฒ๋ฆฐ๋ค. ๋ชจ๋ ์๋น์ค๊ฐ ์ค๋จ๋๋ค.
๐ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ๊ผญ ํ์ํ ๊น?
๊ฐ์ฒด ์ฐธ์กฐ๋ ๋ชจ๋ ๊ฒ์ ์ฐ๊ฒฐ์์ผ๋ฒ๋ฆฐ๋ค.
์ด๋ ๊ธด ํธ๋์ญ์ ์ ๋ง๋ค๊ณ , ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋๊ฒ ๋ง๋ ๋ค.
์ ์ ๋ ์ฌ์ฌ์ฉ๊ณผ ์์ ์ด ์ด๋ ค์์ง๋ค.
ํ์ํ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋์ ํ์๊ฐ ์๋ค.
์ฐ๋ฆฐ ํ์ํ๊ธฐ ์ํด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ง๋ค์๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ฒด์ฐธ์กฐ๋ก ๊ตฌํํ๋ค.
์ด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด Repository๋ผ๋ ์ธํฐํ์ด์ค(์ค๊ฐ ๊ฐ์ฒด)๋ฅผ ์ฌ์ฉํ๋ค.
ํจ๊ป ์์ฑ๋๊ณ , ํจ๊ป ์ญ์ ๋๋ค๋ฉด ๊ฐ์ ํธ๋์ญ์ ๋จ์๋ก ๋ฌถ์ด์ผํ๋ค. (๋๋ถ๋ถ)
๋๋ฉ์ธ ์ ์ฝ์ฌํญ์ ๊ณต์ ํ๋ ๊ฐ์ฒด๋ค์ ํจ๊ป ๋ฌถ์ด๋ผ.
๊ทผ๋ฐ ์ ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ๊ฒ ๋น์ฐํ์ง ์๋ค. ๋น์ฆ๋์ค ๊ท์น์ ๋ฐ๋ผ๋ค๋ฅด๋ค.
์ผ๋ฐ์ ์ธ ์ด์ปค๋จธ์ค๋ ์ฅ๋ฐ๊ตฌ๋์ ์ฅ๋ฐ๊ตฌ๋ ํญ๋ชฉ์ฌ์ด ๊ณต์ ๋๋ ์ ์ฝ์ฌํญ์ด ์๋ค.
[์ฌ์ฉ์๊ฐ ๋ง๋ ์ฅ๋ฐ๊ตฌ๋]์ [์ ํ ๊ฐ๋ฅํ ์ฅ๋ฐ๊ตฌ๋ ํญ๋ชฉ]์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์์ ํ ๋ค๋ฅด๋ค.
๋ฐฐ๋ฌ์ ๋ฏผ์กฑ์ฒ๋ผ, '์ฅ๋ฐ๊ตฌ๋์๋ ํด๋น ๊ฐ๊ฒ์ ๋ฌผ๊ฑด๋ง ๋ฃ์ ์ ์๋ค'๋ผ๋ ๋๋ฉ์ธ ์ ์ฝ์ฌํญ์ด ์๊ธฐ์ ๋ฌถ์๊ฑฐ์ง
๋ง์ฝ ๊ทธ๋ฐ ๊ท์น์ด ์๋ค๋ฉด? ์ด ๋ ๊ฐ์ฒด๋ ํจ๊ป ๋ฌถ์ผ๋ฉด ์๋๋ค.
๊ฐ์ด ์์ฑ๋๊ณ , ๊ฐ์ด ์ญ์ ๋๋๊ฑด ์ฐ๊ด๊ด๊ณ๋ก ๋ฌถ๋๊ฒ ํธํ๊ธด ํ๋ค. ํฌ๊ฒ ๋ฌธ์ ๋ ์ผ๋ ์๋ค.
์ด๋ฐ ๊ด๊ณ๊ฐ ์๋๋ผ๋ฉด ์ฐ๊ด๊ด๊ณ๋ก (๊ฐ์ฒด์ฐธ์กฐ๋ก) ์ฌ์ฉํ์ง ๋ง๊ณ ID๋ฅผ ํตํ ์กฐํ๋ก ๊ตฌํํด์, ์ฐ๊ด๊ด๊ณ๋ฅผ ๋์ด๋ฒ๋ฆฌ์.
์ด๋ DB ์ฑ๋ฅ ํ๋์๋ ๋์์ด ๋ง์ด ๋๋ค.
์ด๋๊น์ง๋ฅผ ์ฝ์ด์ผํ ์ง์ ๋ํ ๊ฒฝ๊ณ๊ฐ ํ์คํ๊ธฐ ๋๋ฌธ์ด๋ค. (order๋ฅผ ์ฝ๋๋ฐ Shop์ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์๋ค)
์ด๋ ๊ฒ ๋จ์๋ฅผ ๋๋๋ฉด, ๊ทธ๋ฃน๋จ์๋ก ์ ์ฅ์(์์์ฑ ์ ์ฅ์)๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๋ค.
๐งจ ๋ฌธ์ ์ 1 - ์ปดํ์ผ์ด ์๋์
์? ์ฐ๋ฆฌ๋ ๊ฐ์ฒด์ฐธ์กฐ๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์งฐ์ผ๋๊น.
ํด๊ฒฐ์ฑ : ํ๊ตฐ๋ฐ๋ก ๋ชจ์ผ์
๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฉํ๋ก ๋๊ฒจ์ ์ฒ๋ฆฌํ๋๋ก ๋ง๋ค์.
๊ธฐ์กด ์์ ์์๋ validate ๋ก์ง์ ํ์ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ ๋ค.
๊ฐ์ฒด์งํฅ์ด ์๋ ๊ทธ๋ ๋ค. ํ๋ ฅ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ์ฒด์ ๋ก์ง์ด ์ฐข์ด์ ธ์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒํ๋ฉด?
๊ฐ์ฒด์ ๊ฒฐํฉ๋๋ ๋์ด์ง๋ง, ์์ง๋๋ ํจ๊ป ๋์ผ ์ ์๋ค. ์ด๊ฒ๋ ํธ๋ ์ด๋ ์คํ์ด๋ค.
๐งจ ๋ฌธ์ ์ 2 - ์์ง๋ ์ปดํ์ผ์ด ์๋์
๊ฐ์ฒด์ ๋ณ๊ฒฝ์ฌํญ์ ์ ๋ฌํด์ผํ๋๋ฐ.. Id๋ก๋ง ๊ฐ์ง๊ณ ์๋ค.
๋๋ฉ์ธ ๋ก์ง์ ์์ฐจ์ ์ผ๋ก ๊ผญ ์คํํด์ผํ ๊น?
'์ด๊ฑฐ ํ์๋ง์, ์ด๊ฑธ ํด์ฃผ์ธ์' โก ๊ณผ์ฐ ์ด๊ฒ ์ฆ์์ผ๊น? ์๋งค ์ทจ์ํ, ๋ฐ๋ก 0.1์ด์์ ํ๊ธ์ ํด์ผํ ๊น?
๋ฌผ๋ก ๊ธฐ์กด ๋ฐฉ๋ฒ์ฒ๋ผ ์ ์ฐจ์งํฅ์ผ๋ก ํด๊ฒฐํด๋ ๋๊ธดํ๋ค.
๊ทผ๋ฐ ์ด ๊ฒฝ์ฐ์๋ ๋ค๋ฅด๋ค. ๋ณ๊ฒฝ์ ํ๋๊ฑฐ๋ผ์ ์์กด์ฑ์ ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ดํด์ด ์๊ธด๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ์์กด์ฑ์ ์ญ์ (DIP)๊ฐ ํ์ํ๋ค
์ฌ๊ธฐ์ ํ๋ฒ ์ ๋ฆฌํ๊ณ ๊ฐ์.
ํจํค์ง ์์กด์ฑ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ 1. ์ค๊ฐ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฑฐ๋. 2. ์์กด์ฑ์ ์ญ์ ์ํค๋ ๊ฒ์ด๋ค.
๐ ๋ค์ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ก
์ด์ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
์ฌ์ดํด์ ๋ ํด๊ฒฐ์ ํด์ผํ๋ค. ์ค๊ฐ ๊ฐ์ฒด๋ DIP๋ฅผ ํตํด์ (์ธํฐํ์ด์ค์ Impl ๋ถ๋ฆฌ)
๊ทผ๋ฐ Event์์๋ 3๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์๋ค. EventHandler๋ฅผ ๋ค๋ฅธ ํจํค์ง๋ก ๋ถ๋ฆฌํด๋ฒ๋ฆฌ๋ ๊ฒ.
ํจํค์ง๋ฅผ ์ฐข์ ๋์๋, ๋๋ฉ์ธ์ ์ผ๋ก ์๋ก์ด ๊ฐ๋ ์ด ํ์ํ๋ค. (์ ์ฐ์ด๋ผ๋ ๊ฐ๋ ์ ์ถ๊ฐ)
๐ญ ์ต์ข ์ ๋ฆฌ. ํจํค์ง ์์กด์ฑ์ ๋๋ ๋ฐฉ๋ฒ
๊ฒฐ๊ตญ ์ค์ํ๊ฑด ๋ณ๊ฒฝ์ ์ ์ฐํ ์๋น์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
๋ณ๊ฒฝ์ ์ ์ฐํ๋ ค๋ฉด ๋ณ๊ฒฝ์ ์ ํ๋ฅผ ๋ง์์ผํ๋ค. ์์กด์ฑ์ ๊ด๋ฆฌํด์ผํ๋ค.
์ฆ ๋๋ฉ์ธ(ํจํค์ง)๊ฐ์ ์์กด์ฑ์ ์ต๋ํ ๋์ด์ผ ํ๋ค. ์ฌ์ดํด์ ์ ๊ฑฐํด์ผํ๋ค.
์ด๋ฅผ ์ด๋ ๊ฒ ๋ง๋๋ ๊ฒ. ์์คํ ์ ๋ถ๋ฆฌํ๊ธฐ ํธํ๊ฒ
๋ฐฉ๋ฒ์ ์ ํ๊ธฐ ๋๋ฆ์ด๊ณ , ๊ฐ๊ฐ ํธ๋ ์ด๋ ์คํ๊ฐ ์กด์ฌํ๋ค. ๋ง์ด ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ด 3๊ฐ์ง์ด๋ค.
1. ์ค๊ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์์กด์ฑ ์ ๊ฑฐ
2. DIP๋ฅผ ์ด์ฉํด์, ์ธํฐํ์ด์ค(๋๋ ์ถ์ํด๋์ค)๋ฅผ ์์กดํ๋๋ก ๋ณ๊ฒฝํ๋ค.
3. ๋๋ฉ์ธ ๊ฐ๋ ์ ์ถ๊ฐํด์ ํจํค์ง๋ฅผ ์ฐข์ด๋ฒ๋ฆฐ๋ค.
----------
๊ฒฐ๊ตญ ์ต์ข ์ ์ผ๋ก๋, ๋ด๋ถ ์ด๋ฒคํธ -> ์ธ๋ถ์ด๋ฒคํธ์ ์ ๋ฌ์ ํตํ System Event ๊ฐ๋ ์ ๋ง๋ค์ด์ MSA๋ฅผ ๊ตฌํํจ.
์์คํ ์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ชผ๊ฐ๊ณ ๋ถํ๋ฅผ ์ค์ธ๋ค.
'๐์ผ์ > ๋ฉํ ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DDD-Lite@Spring (0) | 2021.11.15 |
---|---|
์ฐ์ํ ๋ชจ๋ ธ๋ฆฌ์ค (0) | 2021.11.13 |
์ก์๋ฆฌ3 (0) | 2021.11.12 |
์ก์๋ฆฌ2 (0) | 2021.11.12 |
์ก์๋ฆฌ1 (0) | 2021.11.12 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev