Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

전술적 설계 - 복잡한 비즈니스 로직 다루기 #6

Open
nooose opened this issue Aug 12, 2024 · 2 comments
Open

전술적 설계 - 복잡한 비즈니스 로직 다루기 #6

nooose opened this issue Aug 12, 2024 · 2 comments
Labels
documentation Improvements or additions to documentation

Comments

@nooose
Copy link
Owner

nooose commented Aug 12, 2024

📅 2024.08.13 - 복잡한 비즈니스 로직 다루기

📝 학습 내용 요약

  • 주요 주제: 도메인 모델 패턴

🧠 이해한 내용

  • 핵심 개념: 도메인 모델의 구성 요소는 애그리게이트, 값 객체, 레포지토리이다.
    도메인 모델은 행동과 데이터 모두를 표현하는 모델이다.

  • 값 객체(Value Object): 예를들어 금액(Money), 기간(Period), 사람 이름(Name)을 값 객체로 만들어 볼 수 있다.

  • 엔티티(Entity): 값 객체와 다르게 식별할 수 있는 객체이다. 식별 필드가 존재해야 한다.

  • 애그리게이트(Aggregate): 여러 엔티티의 일관성, 불변식을 지킬 수 있게해주는 엔티티이다.

    • 엔티티 계층 구조를 대표하는 엔티티이기 때문에 애그리게이트 만으로 상태를 변경해야 한다.
    • 상태 변경시 일관성을 지킬 수 있게 해주며, 트랜잭션의 경계 역할을 한다.
    • 일관성이 필요한 정보만 애그리게이트에 포함돼야 한다.
    • 애그리게이트의 변화가 다른 애그리게이트에 영향을 미친다면 도메인 이벤트를 사용한다.
// Pseudocode
@Entity
class Ticket(
    val customer: Long, // 애그리게이트 경계가 다른 ID 간접 참조
    val assignedAgent: Long, // 애그리게이트 경계가 다른 ID 간접 참조
    @OneToMany
    val messages: List<Message>,
    @Id
    val id: Long = 0L
) {
   
    // 상태를 변경하는 함수
    fun xxx() {
        // messages 검증
        // 상태 변경
    }
}
  • 레포지토리(Repository): 애그리게이트 모델을 영속화할 때 사용한다.
    예를들어,주문(Order:1)-주문아이템(OrderItem:N)인 애그리게이트가 있다고 가정하자. 애그리게이트 루트는 Order이므로 OrderRepository만을 이용해서 주문과 주문아이템을 영속화 시켜야한다.

❓ 궁금한 점 및 논의할 주제

  • 질문 1: 도메인 서비스는 언제 사용하는지 수도코드 또는 글로 작성해 주세요. (chat-gpt 퍼오기 금지)

🔍 추가 참고 자료

🗒 기타 메모

@nooose nooose added the documentation Improvements or additions to documentation label Aug 12, 2024
@nonoro
Copy link
Collaborator

nonoro commented Aug 21, 2024

📅 2024.08.21 - 복잡한 비즈니스 로직 다루기

📝 학습 내용 요약

  • 주요 주제: 도메인 모델이란?

🧠 이해한 내용

  • 도메인 모델이란?
    • 복잡한 비즈니스 로직을 다루기 위한 모델: 도메인 모델은 행동과 데이터를 모두 포함하는 객체 모델로, 복잡한 비즈니스 로직을 다루기 위해 사용된다.
  • 구성요소
    • 애그리게이트 (Aggregate)
    • 밸류 오브젝트 (Value Object)
    • 도메인 이벤트 (Domain Event)
    • 도메인 서비스 (Domain Service)

  • 밸류 오브젝트: 값만으로 식별되며 불변의 객체로, 데이터와 행동을 모두 모델링한다..
  • 애그리게이트: 트랜잭션 경계를 공유하는 엔티티 계층으로, 비즈니스 로직의 일관성을 유지한다.
  • 도메인 서비스: 애그리게이트와 밸류 오브젝트에 속하지 않는 비즈니스 로직을 담은 상태가 없는 객체이다.

❓ 궁금한 점 및 논의할 주제

질문1: 엔티티는 가변 / 밸류 오브젝트는 불변이라고 하는데 어떤 기준에서 불변이고 가변인거지?

🔍 추가 참고 자료

🗒 기타 메모

@dltkqnr
Copy link

dltkqnr commented Aug 22, 2024

📅 2024.08.20 - 복잡한 비즈니스 로직 구현

📝 학습 내용 요약

  • 복잡한 비즈니스 로직을 다루는데 쓰이는 도메인 모델 패턴
    • 구성요소: 애그리게이트, 밸류 오브젝트, 도메인 서비스

🧠 이해한 내용

  • 밸류 오브젝트
    • 값만으로 식별되는 비즈니스 도메인 (명료성)
    • 필드 중에 하나가 변경되면 새로운 값을 생성하므로 밸류 오브젝트는 불변이다.
    • 엔티티와 정반대
      • 엔티티는 다른 인스턴스와 구별하기 위해 명시적인 식별 필드가 필요하다.
      • 엔티티는 불변이 아니고 변할 것으로 예상된다.
      • 벨류 오브젝트는 엔티티의 속성을 설명한다.
  • 애그리게이트
    • 애그리게이트는 엔티티다.
    • 인터페이스로 노출된 상태 변경 메서드는 ‘커맨드’ 라고 부른다.
    • 애그리게이트의 상태는 자신의 비즈니스 로직을 통해서만 수정될 수 있기 때문에 트랜잭션 경계의 역할을 한다.
  • 도메인 서비스
    • 비즈니스 로직에서 사용되는 상태가 없는 객체이다.

❓ 궁금한 점 및 논의할 주제

  • 질문 1 : 도메인 서비스는 언제 사용하는지 수도코드 또는 글로 작성해주세요.
    → 티켓 애그리게이트는 다른 애그리케이트(할인, 정산 등..)의 정보들이 필요할 수 있는 경우가 있다. 그 때 도메인 서비스를 이용하여 정보를 얻을 수 있다.

🔍 추가 참고 자료

🗒 기타 메모

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

3 participants