Skip to content

요구사항이 복잡해지면서 나타나는 도메인 강한 결합에 대하여 #4

@YehyeokBang

Description

@YehyeokBang

상황

방탈출 예약 애플리케이션이 있다고 가정하자.
사용자는 예약할 수 있고, 이미 예약된 경우 대기를 요청할 수 있다.

예를 들어,
A 사용자가 예약을 하고, B 사용자가 해당 예약에 대기를 요청했다.
이후 A 사용자가 예약을 취소하면, B 사용자의 대기를 자동으로 승인하여 예약으로 전환해야 하는 시나리오가 발생할 수 있다.

기능 추가로 인한 도메인 결합

방탈출 예약 애플리케이션에서 대기 자동 승인 기능을 추가하려 했을 때, 예상보다 큰 변경이 필요했다.

기존 예약 서비스는 단순한 예약 취소 기능만 담당하고 있었다.

// ReservationService
public void cancel(Long reservationId) {
    reservationRepository.deleteById(reservationId);
}

하지만 자동 승인을 위해 대기 도메인의 존재를 알아야 한다. (의존성과 다른 도메인과 관련된 기능 추가)

public void cancel(Long reservationId) {
    reservationRepository.deleteById(reservationId);
    if (waitingRepository.exists()) {
        // 가장 먼저 등록된 대기자를 예약으로 전환
    }
}

결제가 도입된다면 또 다른 의존성이 추가될 수밖에 없다.

public void cancel(Long reservationId) {
    reservationRepository.deleteById(reservationId);
    if (waitingRepository.exists()) {
        // 대기 자동 승인
    }
    payment.cancel(); // 결제 취소 처리
}

문제 요약

  • 예약 도메인이 다른 도메인(대기, 결제 등)과 강하게 결합되며, 단일 책임 원칙이 약해진다.
  • 하나의 기능(예약 취소)을 위해 다양한 도메인을 직접 알아야 한다. (높은 결합도)
  • 새로운 도메인 기능이 추가될 때마다 기존 예약 서비스의 변경이 불가피하다. (OCP 위반 가능성)
  • 결과적으로 서비스가 비대해지고, 유지보수와 확장이 어렵다.

현재 구조는 결국 도메인의 강한 결합으로 이어지고, 하나의 서비스가 다양한 책임을 갖게 되는 구조가 된다.

해결 방향 (고민 중)

아직 명확한 해결책은 찾지 못했지만, GPT를 통해
이벤트 기반 처리(event publisher/subscriber)중재자 패턴 같은 간접 의존 구조를 도입하면 문제를 완화할 수 있다는 내용을 알게 되었다.

예약 취소 시 예약 취소됨이라는 이벤트를 발행하고,
대기 도메인은 이 이벤트를 수신해 별도로 자동 승인을 처리하는 구조?

이 부분에 대해 더 학습해보면 좋을 것 같다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions