JiwonDev

์˜์กด์„ฑ์„ ์ด์šฉํ•ด ์„ค๊ณ„ ์ง„ํ™”์‹œํ‚ค๊ธฐ

by JiwonDev

https://www.youtube.com/watch?v=dJ5C4qRqAgA 

 

 

๐Ÿ’ญ ์„ค๊ณ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•  ๊ฒƒ์ธ๊ฐ€. ์–ด๋–ค ํŒจํ‚ค์ง€์— ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๋„ฃ์„ ๊ฒƒ์ธ๊ฐ€.

์™œ ๊ทธ๋Ÿฐ๊ฑธ ๊ณ ๋ฏผํ• ๊นŒ? ๊ฒฐ๊ตญ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๋ณธ์งˆ์€ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์— ์žˆ๋‹ค. 

 

๋ณ€๊ฒฝ์˜ ์ „ํŒŒ๋Š” ์˜์กด์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด๋ผ ์˜์กด์„ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๊ณ„ํ•˜๋ผ.

B๊ฐ€ ๋ณ€๊ฒฝ๋ฌ์„ ๋•Œ, A๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์˜์กด์„ฑ(Dependency)์ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“‘ ์˜์กด์„ฑ์˜ ์ข…๋ฅ˜

  • ์—ฐ๊ด€๊ด€๊ณ„ Association (์˜๊ตฌ์ )
  • ์˜์กด๊ด€๊ณ„ Dependency (์ผ์‹œ์ )
  • ์ƒ์†์„ ์ด์šฉํ•œ ํ™•์žฅ Inheritance ( ์ƒ์†, ์ž์‹ )
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ํ™•์žฅ Realization ( ์‹ค์ฒดํ™” )

๊ฐ„๋‹จํ•˜๊ฒŒ, ๋‚ด Import ๋ฌธ์— ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฒƒ.

 

๐Ÿ“‘ ์ข‹์€ ์˜์กด์„ฑ1 - ๊ผญ ํ•„์š”ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์˜์กด์„ฑ์„ ์—†์• ๋ฒ„๋ ค๋ผ

 

๐Ÿ“‘ ์ข‹์€ ์˜์กด์„ฑ2 - ์–‘๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ํ”ผํ•˜๋ผ

์–‘๋ฐฉํ–ฅ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ

= ํ•ญ์ƒ A, B ์–‘์ชฝ์„ ์„œ๋กœ ๋™๊ธฐํ™” ํ•ด์ฃผ์–ด์•ผํ•จ. (์„ฑ๋Šฅ์ด์Šˆ, ๋ฒ„๊ทธ ๋ฐœ์ƒ ์‰ฌ์›€)

= ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์–ต์ง€๋กœ ์ฐข์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ง. AโžกB, BโžกA ๋ญ๊ฐ€ ๋ฐ”๋€Œ๋“  ์–‘์ชฝ์— ๋ณ€๊ฒฝ์ด ์ „ํŒŒ๋จ.

ํŠนํžˆ ํŒจํ‚ค์ง€ ์‚ฌ์ด์—์„œ๋Š” ์–‘๋ฐฉํ–ฅ ์˜์กด์„ฑ์ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ = ํŒจํ‚ค์ง€๋กœ ์ชผ๊ฐค ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋‹ค๋Š” ๋ง์ด๋‹ค. ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋กœ ํ•ฉ์ณ๋ผ

 

๐Ÿ“‘ ์ข‹์€ ์˜์กด์„ฑ3 - ๋‹ค์ค‘์„ฑ์ด ์ ์€ ๋ฐฉํ–ฅ์„ ์„ ํƒํ•˜๋ผ.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด์™€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์„ ๋•Œ [๊ฐ์ฒด]๋ฅผ ์˜์กด์„ฑ์˜ ์ฃผ์ธ์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ์— ์˜์กด์„ฑ์ด ์žˆ์œผ๋ฉด ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ. ๋‹ค์ค‘์„ฑ์ด ๋„ˆ๋ฌด ํฌ๋‹ค. 

 

 

๐Ÿ’ญ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ์˜์กด์„ฑ ํŒŒํ—ค์น˜๊ธฐ

๐Ÿ“‘ ์˜ˆ์ œ ํ”Œ๋กœ์šฐ

 

๐Ÿ“‘ Domain Concept - ๊ฐ€๊ฒŒ & ๋ฉ”๋‰ด

๊ฐ€๊ฒŒ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฉ”๋‰ด๋“ค์ด ์žˆ๋‹ค.

๋ฉ”๋‰ด๋Š” ์˜ต์…˜ ๊ทธ๋ฃน์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. (ํฌ๊ธฐ ์„ ํƒ, ์‚ฌ์ด๋“œ ์ถ”๊ฐ€, ์Œ๋ฃŒ ์ถ”๊ฐ€)

๋ฉ”๋‰ด์—๋Š” ์˜ต์…˜ ๊ทธ๋ฃน ์žˆ๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜๊ณ  ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“‘ Domain Concept - ์ฃผ๋ฌธ

์ฃผ๋ฌธ์€ ์ฃผ๋ฌธ ์•„์ดํ…œ(ํ•ญ๋ชฉ)๋“ค์„ ๊ฐ€์ง„๋‹ค.

์ฃผ๋ฌธ ์•„์ดํ…œ์€ ์˜ต์…˜ ๊ทธ๋ฃน์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“‘ Domain Object - ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„

 

๐Ÿ“‘ ํ•ด๋‹น ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ๋ฌธ์ œ์ 

์ฃผ๋ฌธ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด๋‹ค.

์žฅ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ, ํด๋ผ์ด์–ธํŠธ(์•ฑ)์— ์ €์žฅ๋œ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์žฅ๋‹˜์ด ๋ฉ”๋‰ด๋ฅผ ๋ฐ”๊พธ์‹ ๋‹ค๋ฉด? ์žฌ๊ณ ๊ฐ€ ๋–จ์–ด์ ธ ํŒ๋งค์ค‘์ง€๋ฅผ ํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด? ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—๋Š” ๊ทธ๊ฒŒ ๋ฐ˜์˜ ๋˜์ง€ ์•Š๋Š”๋‹ค.

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ฃผ๋ฌธ๊ณผ ํ˜„์žฌ ๋ฉ”๋‰ด๊ฐ€ ๊ฐ™์€ ๊ฐ’์ธ์ง€ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.

 

๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋„ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.

๊ฐ€๊ฒŒ๊ฐ€ ์˜์—…์„ ์ข…๋ฃŒํ–ˆ๊ฑฐ๋‚˜, ์ตœ์†Œ์ฃผ๋ฌธ๊ธˆ์•ก๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™๋“ค๋„ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.

 

 

๐Ÿ“‘ ํ˜‘๋ ฅ ์„ค๊ณ„ํ•˜๊ธฐ

(1) ์ฃผ๋ฌธ์„ ์š”์ฒญํ•˜๋ฉด [์ฃผ๋ฌธ]์ด ์ƒ์„ฑ๋œ๋‹ค.

(2) [์ฃผ๋ฌธ]์€ ๊ฐ€๊ฒŒ์— ์˜์—…์—ฌ๋ถ€์™€ ์ตœ์†Œ์ฃผ๋ฌธ๊ธˆ์•ก์„ ํ™•์ธํ•œ๋‹ค.

(3) [์ฃผ๋ฌธ ํ•ญ๋ชฉ]์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์„œ [๋ฉ”๋‰ด]์™€ ๊ฐ™์€์ง€ ๊ฒ€์ฆ์„ ํ•œ๋‹ค.

(4) [๋ฉ”๋‰ด]์—์„œ [์ฃผ๋ฌธ ์˜ต์…˜๊ทธ๋ฃน] ๊ณผ [์˜ต์…˜๊ทธ๋ฃน]์ด ๊ฐ™์€์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

(5) [์ฃผ๋ฌธ ์˜ต์…˜]๊ณผ [์˜ต์…˜]์ด ๊ฐ™์€์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

 

๐Ÿ“‘ ํด๋ž˜์Šค ์„ค๊ณ„ํ•˜๊ธฐ (Class Diagram)

๊ฐœ๋ฐœ์ž๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„, ์ •์ ์ธ ์ฝ”๋“œ๋กœ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ํ˜‘๋ ฅ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ์ฆ‰ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ์ •ํ•ด์•ผํ•œ๋‹ค.

DB๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋‹ค. ์™ธ๋ž˜ํ‚ค๋กœ ์ด๋™๊ฐ€๋Šฅํ•˜๋‹ค / ๊ฐ์ฒด๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ, ํƒ์ƒ‰์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฐ๊ด€๊ด€๊ณ„๋กœ ์„ค์ •ํ•œ๋‹ค. (ํ•„์š”์—†๋‹ค๋ฉด ๋‚˜์ค‘์— ๋Š์„ ์ˆ˜ ์žˆ์Œ)

์–ธ์ œ๋‚˜ ์ฐธ์กฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด๋“ค์ด ์–ด๋–ป๊ฒŒ ํ˜‘๋ ฅํ•˜๋Š”๊ฐ€?

Association

์—ฐ๊ด€๊ด€๊ณ„๋Š” ํƒ์ƒ‰๊ฐ€๋Šฅ์„ฑ (navigablilty)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์˜ˆ) Order๋ฅผ ์•Œ๋ฉด, OrderLineItem์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์š”.

๋‘ ๊ฐ์ฒด ์‚ฌ์ด์— ํ˜‘๋ ฅ์ด ํ•„์š”ํ•˜๊ณ , ๋‘ ๊ฐ์ฒด์˜ ๊ด€๊ณ„๊ฐ€ ์˜๊ตฌ์ ์ด๋ผ๋ฉด ์—ฐ๊ด€(Association)์„ ์‚ฌ์šฉํ•œ๋‹ค.

์—ฐ๊ด€๊ด€๊ณ„๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋…๊ณผ ๊ตฌํ˜„์„ 1:1๋กœ ๋งค์นญํ•˜์ง€ ๋ง์ž.

 

๐Ÿ“‘ ๊ตฌํ˜„ ์‹œ์ž‘

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๊ตฌํ˜„ ๋ฉ”์„œ๋“œ๋ฅผ ๋จผ์ € ์™„์„ฑํ•˜์ง€ ๋งˆ๋ผ.

์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ ์ˆ˜์ค€์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ •ํ•˜๊ณ , ๊ทธ ์ดํ›„ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

@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);
    }
}

 

๐Ÿ’ญ ์„ค๊ณ„ ๊ฐœ์„ ํ•˜๊ธฐ

์ƒ๊ฐ์ด ์•ˆ๋‚˜๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†์ด ์ ˆ์ฐจ์ (ํŠธ๋žœ์žญ์…˜ ์Šคํฌ๋ฆฝํŠธ)๋กœ ์งค ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๊ทธ๋• ๋ณ€ํ™”์˜ ๋ฐฉํ–ฅ. ์˜์กด์„ฑ์„ ๊ทธ๋ ค๋ณด์ž. ํŒจํ‚ค์ง€ ์‚ฌ์ด์— ์‚ฌ์ดํด์ด ๋„๋Š”๊ฐ€? ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๊ฒฐํ•ฉ๋„๋ฅผ ์ƒ์Šน์‹œํ‚ค๋‚˜?

ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋ฉฐ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ์„ ํ•ด๋ณด์ž.

๋ฌผ๋ก  ์ด๊ฒƒ ๋ง๊ณ ๋„ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋‚˜, ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž.

๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ? ์ž์„ธํžˆ ๋ณด๋ฉด, ์‚ฌ์ดํด์ด ๋Œ๊ณ  ์žˆ๋‹ค.

 

์—ฐ๊ด€๊ด€๊ณ„๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์€, ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋ฅผ ์šฐ๋ฆฐ ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. DB์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. LazyLoading์„ ์–ด๋””๊นŒ์ง€ ํ•  ๊ฒƒ์ธ๊ฐ€?
์–ด๋””๊นŒ์ง€ ๋ฏธ๋ฆฌ ์ฝ์–ด์•ผํ•ด์š”? ๊ฐ์ฒด๊ฐ€ ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”๋ฐ

๋ฌด์—‡๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•ด์ง„๋‹ค.

์–ด๋–ค ํ…Œ์ด๋ธ” ๊นŒ์ง€ Lock์„ ๊ฑธ์–ด์•ผ ํ•˜๋Š”๊ฐ€?

์—ฐ๊ฒฐ ๋˜์–ด์žˆ๋Š”๋ฐ.. ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•œ๊ฒŒ ๋‹ค๋ฅธ ๊ณณ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€์•Š๋Š”๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ์„๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ๋‹ฌ์™„๋ฃŒ์— ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

ํ•˜์ง€๋งŒ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์˜ ๋ณ€๊ฒฝ์˜ ์‹œ์ ๊ณผ ๋นˆ๋„๊ฐ€ ๋‹ค๋ฅด๋‹ค.

Long Transaction์œผ๋กœ ๋ฌถ์–ด๋ฒ„๋ฆฌ๋ฉด ์ „์ฒด์— Lock์ด ๊ฑธ๋ ค๋ฒ„๋ฆฐ๋‹ค. ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค.

 

๐Ÿ“‘ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๊ผญ ํ•„์š”ํ• ๊นŒ?

๊ฐ์ฒด ์ฐธ์กฐ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์—ฐ๊ฒฐ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค.

์ด๋Š” ๊ธด ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ค๊ณ , ๊ฐ์ฒด๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ ์  ๋” ์žฌ์‚ฌ์šฉ๊ณผ ์ˆ˜์ •์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

 

ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋Š์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์šฐ๋ฆฐ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด์ฐธ์กฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. 

์ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด Repository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค(์ค‘๊ฐ„ ๊ฐ์ฒด)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋ฌผ๋ก  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์•„๋‹Œ ์กฐํšŒ์„ฑ๋Šฅ์„ ๋”ฐ์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด.. ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด๋‹ค.

ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๊ณ , ํ•จ๊ป˜ ์‚ญ์ œ๋œ๋‹ค๋ฉด ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์•ผํ•œ๋‹ค. (๋Œ€๋ถ€๋ถ„)

๋„๋ฉ”์ธ ์ œ์•ฝ์‚ฌํ•ญ์„ ๊ณต์œ ํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ํ•จ๊ป˜ ๋ฌถ์–ด๋ผ.

 

๊ทผ๋ฐ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ๊ฒŒ ๋‹น์—ฐํ•˜์ง€ ์•Š๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์— ๋”ฐ๋ผ๋‹ค๋ฅด๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ด์ปค๋จธ์Šค๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์™€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ•ญ๋ชฉ์‚ฌ์ด ๊ณต์œ ๋˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ์ด ์—†๋‹ค.

[์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์žฅ๋ฐ”๊ตฌ๋‹ˆ]์™€ [์„ ํƒ ๊ฐ€๋Šฅํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ•ญ๋ชฉ]์€ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค.

 

๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ์ฒ˜๋Ÿผ, '์žฅ๋ฐ”๊ตฌ๋‹ˆ์—๋Š” ํ•ด๋‹น ๊ฐ€๊ฒŒ์˜ ๋ฌผ๊ฑด๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค'๋ผ๋Š” ๋„๋ฉ”์ธ ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๊ธฐ์— ๋ฌถ์€๊ฑฐ์ง€

๋งŒ์•ฝ ๊ทธ๋Ÿฐ ๊ทœ์น™์ด ์—†๋‹ค๋ฉด? ์ด ๋‘ ๊ฐ์ฒด๋Š” ํ•จ๊ป˜ ๋ฌถ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

 

๊ฐ™์ด ์ƒ์„ฑ๋˜๊ณ , ๊ฐ™์ด ์‚ญ์ œ๋˜๋Š”๊ฑด ์—ฐ๊ด€๊ด€๊ณ„๋กœ ๋ฌถ๋Š”๊ฒŒ ํŽธํ•˜๊ธด ํ•˜๋‹ค. ํฌ๊ฒŒ ๋ฌธ์ œ๋  ์ผ๋„ ์—†๋‹ค.

์ด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์—ฐ๊ด€๊ด€๊ณ„๋กœ (๊ฐ์ฒด์ฐธ์กฐ๋กœ) ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ID๋ฅผ ํ†ตํ•œ ์กฐํšŒ๋กœ ๊ตฌํ˜„ํ•ด์„œ, ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋Š์–ด๋ฒ„๋ฆฌ์ž.

์ด๋ฅผ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค. ์กฐํšŒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€. ํ•œ๋ฒˆ์— ๊ฐ™์ด or Lazy๋กœ๋”ฉ

์ด๋Š” DB ์„ฑ๋Šฅ ํŠœ๋‹์—๋„ ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค.

์–ด๋””๊นŒ์ง€๋ฅผ ์ฝ์–ด์•ผํ• ์ง€์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๊ฐ€ ํ™•์‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (order๋ฅผ ์ฝ๋Š”๋ฐ Shop์„ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค)

 

์ด๋ ‡๊ฒŒ ๋‹จ์œ„๋ฅผ ๋‚˜๋ˆ„๋ฉด, ๊ทธ๋ฃน๋‹จ์œ„๋กœ ์ €์žฅ์†Œ(์˜์†์„ฑ ์ €์žฅ์†Œ)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฐ์ฒด๋ฅผ ํ•œ๋ฐฉ์— ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. = ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„ = ์กฐํšŒ์˜ ๋‹จ์œ„ (๋งˆ์น˜ DB์˜ ํ•œ๋ฐฉ์ฟผ๋ฆฌ์ฒ˜๋Ÿผ)

 

๐Ÿงจ ๋ฌธ์ œ์ 1 - ์ปดํŒŒ์ผ์ด ์•ˆ๋˜์š”

์™œ? ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด์ฐธ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งฐ์œผ๋‹ˆ๊นŒ.

์ฐธ์กฐ๊ฐ’์ด ์—†์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

 

ํ•ด๊ฒฐ์ฑ… : ํ•œ๊ตฐ๋ฐ๋กœ ๋ชจ์œผ์ž

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฉ”ํƒ€๋กœ ๋„˜๊ฒจ์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค์ž.

 

 

๊ธฐ์กด ์˜ˆ์ œ์—์„œ๋Š” validate ๋กœ์ง์„ ํƒ์ƒ‰ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์› ๋‹ค. 

๊ฐ์ฒด์ง€ํ–ฅ์ด ์›๋ž˜ ๊ทธ๋ ‡๋‹ค. ํ˜‘๋ ฅ์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐ์ฒด์— ๋กœ์ง์ด ์ฐข์–ด์ ธ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒํ•˜๋ฉด?

์‘์ง‘๋„ : ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ์นœ๊ตฌ๋“ค์ด ํ•œ ๊ณณ์— ๋ชจ์—ฌ์žˆ๋Š”๊ฐ€? (์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ณ€๊ฒฝ์ฃผ๊ธฐ๊ฐ€ ์„ž์—ฌ์žˆ๋‹ค๋ฉด ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์Œ)
๋•Œ๋กœ๋Š” ์ ˆ์ฐจ์ง€ํ–ฅ์ด ๊ฐ์ฒด์ง€ํ–ฅ๋ณด๋‹ค ์ข‹์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ”Œ๋กœ์šฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ.

๊ฐ์ฒด์˜ ๊ฒฐํ•ฉ๋„๋Š” ๋†’์ด์ง€๋งŒ, ์‘์ง‘๋„๋„ ํ•จ๊ป˜ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ๋„ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ด๋‹ค.

 

๐Ÿงจ ๋ฌธ์ œ์ 2 - ์•„์ง๋„ ์ปดํŒŒ์ผ์ด ์•ˆ๋˜์š”

๊ฐ์ฒด์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š”๋ฐ.. Id๋กœ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋„๋ฉ”์ธ์˜ ์ œ์•ฝ์‚ฌํ•ญ ํŠน์„ฑ์ƒ, Id๋กœ๋Š” ๋งŒ๋“ค๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ „ํŒŒ๋˜์•ผํ•˜๋‹ˆ

๋„๋ฉ”์ธ ๋กœ์ง์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ผญ ์‹คํ–‰ํ•ด์•ผํ• ๊นŒ?

'์ด๊ฑฐ ํ•˜์ž๋ง์ž, ์ด๊ฑธ ํ•ด์ฃผ์„ธ์š”' โžก ๊ณผ์—ฐ ์ด๊ฒŒ ์ฆ‰์‹œ์ผ๊นŒ? ์˜ˆ๋งค ์ทจ์†Œํ›„, ๋ฐ”๋กœ 0.1์ดˆ์•ˆ์— ํ™˜๊ธ‰์„ ํ•ด์•ผํ• ๊นŒ?

๋ฌผ๋ก  ๊ธฐ์กด ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์ ˆ์ฐจ์ง€ํ–ฅ์œผ๋กœ ํ•ด๊ฒฐํ•ด๋„ ๋˜๊ธดํ•˜๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ํ”Œ๋กœ์šฐ๊ฐ€ ํ•œ ๋ˆˆ์— ๋ณด์ธ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฃผ์ž

 

๊ทผ๋ฐ ์ด ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅด๋‹ค. ๋ณ€๊ฒฝ์„ ํ•˜๋Š”๊ฑฐ๋ผ์„œ ์˜์กด์„ฑ์„ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜์กด์„ฑ์˜ ์—ญ์ „ (DIP)๊ฐ€ ํ•„์š”ํ•˜๋‹ค

์‹ค์ œ ์‹คํ–‰ํ•˜๋Š” ์ชฝ์„ Delivery๋กœ ๋ฐ”๊พธ์ž. ์˜์กด์„ฑ์„ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊พธ์ž.

 

์—ฌ๊ธฐ์„œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜๊ณ  ๊ฐ€์ž.

ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 1. ์ค‘๊ฐ„๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜. 2. ์˜์กด์„ฑ์„ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“‘ ๋‹ค์‹œ ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ๋กœ

์ด์ œ ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

์ˆœ์„œ๋ฅผ ๋Š์Šจํ•˜๊ฒŒ ๋งŒ๋“ค์ž. ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์„ ์ด๋ฒคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜์ž. (๋ฉ”์‹œ์ง€์™€๋Š” ์ƒ๊ด€X, ๋ฉ”๋ชจ๋ฆฌ์ƒ)
๋™๊ธฐ, ๋น„๋™๊ธฐ, ๊ฐ™์€ํŠธ๋žœ์žญ์…˜, ๋‹ค๋ฅธํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ๊ตฌํ˜„๊ฐ€๋Šฅ

 

SpringAbstractAggregate๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ผ ๋ฟ, ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. (DB ์ปค๋ฐ‹ํ•  ๋•Œ ์ด๋ฒคํŠธ ๋ฐœํ–‰์ฒ˜๋ฆฌ)

 

 

๋‹˜!! ํŒจํ‚ค์ง€์— ์˜์กด์„ฑ ์‹ธ์ดํด์ด ๋„๋Š”๋ฐ์š”!!

์‚ฌ์ดํด์„ ๋˜ ํ•ด๊ฒฐ์„ ํ•ด์•ผํ•œ๋‹ค. ์ค‘๊ฐ„ ๊ฐ์ฒด๋‚˜ DIP๋ฅผ ํ†ตํ•ด์„œ (์ธํ„ฐํŽ˜์ด์Šค์™€ Impl ๋ถ„๋ฆฌ)

๊ทผ๋ฐ Event์—์„œ๋Š” 3๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. EventHandler๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ.

 

ํŒจํ‚ค์ง€๋ฅผ ์ฐข์„ ๋•Œ์—๋Š”, ๋„๋ฉ”์ธ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ํ•„์š”ํ•˜๋‹ค. (์ •์‚ฐ์ด๋ผ๋Š” ๊ฐœ๋…์˜ ์ถ”๊ฐ€)

 

๐Ÿ’ญ ์ตœ์ข… ์ •๋ฆฌ. ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์„ ๋Š๋Š” ๋ฐฉ๋ฒ•

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ๊ฑด ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ์˜ ์ „ํŒŒ๋ฅผ ๋ง‰์•„์•ผํ•œ๋‹ค. ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.

์ฆ‰ ๋„๋ฉ”์ธ(ํŒจํ‚ค์ง€)๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ตœ๋Œ€ํ•œ ๋Š์–ด์•ผ ํ•œ๋‹ค. ์‚ฌ์ดํด์„ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ๋ ˆ์ด์–ด ๋‹จ์œ„(Service Domain..)๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

์ด๋ฅผ ์ด๋ ‡๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ. ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ

ํ”„๋กœ์ ํŠธ๋ฅผ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. (๊ทธ ์•ˆ์— ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑ)

 

 

๋ฐฉ๋ฒ•์€ ์ •ํ•˜๊ธฐ ๋‚˜๋ฆ„์ด๊ณ , ๊ฐ๊ฐ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋งŽ์ด ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด 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

ํ™œ๋™ํ•˜๊ธฐ