thdwoqor / stable-coin-checker

0 stars 0 forks source link

도메인 서비스를 활용한 검증 로직 개선 #8

Closed thdwoqor closed 4 months ago

thdwoqor commented 4 months ago

문제

@Service
@Transactional
@RequiredArgsConstructor
public class CryptoSymbolService {

  private final CryptoSymbolRepository cryptoSymbolRepository;
  private final DuplicateCryptoSymbolValidator validator;

  public void save(final CryptoSymbolRequest request) {
        if (cryptoSymbolRepository.findByName(request.name()).isPresent()) {
            throw new IllegalArgumentException("중복된 심볼은 저장할 수 없습니다.");
        }

        CryptoSymbol cryptoSymbol = new CryptoSymbol(
                request.name(),
                request.imgUrl()
        );
        cryptoSymbolRepository.save(cryptoSymbol);
    }
}

변경 사항

@Component
@RequiredArgsConstructor
public class DuplicateCryptoSymbolValidator {

    private final CryptoSymbolRepository cryptoSymbolRepository;

    public void validate(final String name) {
        if (cryptoSymbolRepository.findByName(name).isPresent()) {
            throw new IllegalArgumentException("중복된 심볼은 저장할 수 없습니다.");
        }
    }
}

---

@Service
@Transactional
@RequiredArgsConstructor
public class CryptoSymbolService {

  private final CryptoSymbolRepository cryptoSymbolRepository;
  private final DuplicateCryptoSymbolValidator validator;

  public void save(final CryptoSymbolRequest request) {
      cryptoSymbol.update(
              request.name(),
              request.imgUrl(),
              validator
      );
      cryptoSymbolRepository.save(cryptoSymbol);
  }
}

외부 시스템이나 의존적인 중복 이름 검사를 도메인 서비스로 이동하고, 검증이 필요한 로직에서는 validator를 주입받아 실행하는 방식으로 변경하였습니다. 이 방식을 사용할 경우, 객체를 생성 및 변경할 때 도메인 내부에서 검증을 진행하므로 도메인 내부 값이 항상 검증된 값임을 보장할 수 있습니다. 또한, 도메인만 봐도 해당 도메인이 가지고 있는 규칙을 한눈에 파악할 수 있습니다.

thdwoqor commented 4 months ago

의존성 사이클 발생

image
classDiagram
    CryptoSymbol ..> DuplicateCryptoSymbolValidator
    DuplicateCryptoSymbolValidator --> CryptoSymbolRepository
    CryptoSymbolRepository ..> CryptoSymbol

해결

classDiagram
        DuplicateCryptoSymbolValidator ..|> CryptoSymbolValidator
    CryptoSymbol ..> CryptoSymbolValidator
    CryptoSymbolRepository ..> CryptoSymbol

도메인 서비스는 인터페이스로 추상화하여 도메인 서비스가 특정 구현에 종속되는 것을 방지하고, 의존성 사이클이 생기는 문제를 해결했습니다.