Home > Spring > πŸƒ[Spring] μ—°κ΄€κ΄€κ³„μ—μ„œμ˜ "응집성"μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸƒ[Spring] μ—°κ΄€κ΄€κ³„μ—μ„œμ˜ "응집성"μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Spring Framework

πŸƒ[Spring] μ—°κ΄€κ΄€κ³„μ—μ„œμ˜ β€œμ‘μ§‘μ„±β€μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • μ—°κ΄€κ΄€κ³„μ—μ„œμ˜ 응집성은 λ°€μ ‘ν•˜κ²Œ κ΄€λ ¨λœ 데이터와 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λͺ¨μ—¬ μ„œλ‘œ κ°•ν•˜κ²Œ κ²°ν•©λ˜μ–΄ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • JPA 연관관계λ₯Ό 톡해 응집성을 높이면, μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” 엔티티듀이 ν•˜λ‚˜μ˜ μΌκ΄€λœ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  μƒνƒœλ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ΄ ν–₯μƒλ©λ‹ˆλ‹€.

1️⃣ μ—°κ΄€κ΄€κ³„μ—μ„œ 응집성이 높은 μ„€κ³„μ˜ μ˜ˆμ‹œ.

  • 응집성이 높은 μ„€κ³„λŠ” 주둜 μ• κ·Έλ¦¬κ²Œμ΄νŠΈ(Aggregate) κ°œλ…κ³Ό λ°€μ ‘ν•œ 관련이 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, Order와 OrderITem이 μ—°κ΄€λœ 엔티티라고 κ°€μ •ν•˜λ©΄, Order μ—”ν‹°ν‹°κ°€ μ£Όλ¬Έ ν•­λͺ© OrderItem듀을 ν¬ν•¨ν•˜κ³ , 주문의 총 가격 계산, ν•­λͺ© μΆ”κ°€, μ£Όλ¬Έ μ™„λ£Œμ™€ 같은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ±…μž„μ§‘λ‹ˆλ‹€.
      • μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 연관관계가 응집성 있게 κ΅¬μ„±λ˜λ©΄ κ΄€λ ¨ 데이터와 둜직이 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ μΊ‘μŠν™”λ˜λ©°, μΌκ΄€λœ μƒνƒœμ™€ λ‘œμ§μ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@Entity
public class Order {
    @Id
    @GeneratedValue(stratege = GenerationType.IDENTITY)
    private Long id;
    
    private LocalDateTime orderDate;
    private OrderStatus status;
    
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<OrderItem> items = new ArrayList<>();
    
    // λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 톡해 μ—°κ΄€ κ΄€κ³„μ˜ 응집성 μœ μ§€
    public void addItem(OrderItem item) {
        items.add(item);
        item.setOrder(this);
    }
    
    public BigDecimal calculateTotalPrice() {
        return items.stream()
                    .map(OrderItem::getTotalPrice)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    
    public void completeOrder() {
        if (items.isEmpty()) {
            throw new IllegalStateException("μ£Όλ¬Έ ν•­λͺ©μ΄ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.");
        }
        this.status = OrderStatus.COMPLETED;
    }
}

2️⃣ 예제의 응집성 μ„€λͺ….

  • Order와 OrderItem의 λ°€μ ‘ν•œ 관계λ₯Ό λ°˜μ˜ν•˜μ—¬, Order μ—”ν‹°ν‹°λŠ” OrderItem듀을 ν¬ν•¨ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • Order μ—”ν‹°ν‹° λ‚΄λΆ€μ—μ„œ addItem, calculateTotalPrice, completeOrder λ“± μ£Όλ¬Έκ³Ό κ΄€λ ¨λœ μ£Όμš” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•¨μœΌλ‘œμ¨ κ΄€λ ¨λœ 데이터와 둜직이 ν•œ 곳에 λͺ¨μ—¬ μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 Order 객체가 μ£Όλ¬Έκ³Ό κ΄€λ ¨λœ μƒνƒœμ™€ 행동을 μΌκ΄€λ˜κ²Œ 관리할 수 있으며, Order 객체 μ™ΈλΆ€μ—μ„œλŠ” 이 λ‘œμ§μ„ μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

3️⃣ 응집성 높은 μ„€κ³„μ˜ μž₯점.

1️⃣ λ°μ΄ν„°μ˜ 일관성 보μž₯.

  • μ—°κ΄€λœ 엔티티듀이 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ κ²°ν•©λ˜μ–΄ 있기 λ•Œλ¬Έμ—, 잘λͺ»λœ μƒνƒœλ‚˜ 값이 κ°œλ³„μ μœΌλ‘œ λ³€κ²½λ˜λŠ” 상황을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 응집성.

  • κ΄€λ ¨λœ 데이터와 둜직이 ν•˜λ‚˜μ˜ λ‹¨μœ„μ— λ¬Άμ—¬μžˆμ–΄ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 더 λͺ…ν™•ν•˜κ²Œ μ •μ˜λ˜λ©°, μ½”λ“œκ°€ 직관적이고 μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

3️⃣ μœ μ§€λ³΄μˆ˜μ„± ν–₯상.

  • κ΄€λ ¨ 둜직이 μ„œλ‘œ λͺ¨μ—¬ μžˆμœΌλ―€λ‘œ μˆ˜μ • 사항이 λ°œμƒν•  λ•Œ, ν•΄λ‹Ή λ‹¨μœ„ λ‚΄μ—μ„œλ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

3️⃣ μš”μ•½.

  • μ—°κ΄€κ΄€κ³„μ—μ„œμ˜ 응집성은 κ΄€λ ¨λœ 데이터와 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 ν•˜λ‚˜μ˜ λ‹¨μœ„μ— λ°€μ ‘ν•˜κ²Œ κ²°ν•©λ˜μ–΄ μžˆλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 객체가 μžμ‹ μ˜ μƒνƒœμ™€ 행동을 μΌκ΄€λ˜κ²Œ 관리할 수 있으며, 데이터 일관성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.
  • JPAμ—μ„œμ˜ 응집성 높은 μ—°κ΄€κ΄€κ³„λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 효율적으둜 κ΄€λ¦¬ν•˜κ³  μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚€λŠ” 데 도움이 λ©λ‹ˆλ‹€.