/
JPA를 통한 데이터베이스 상호작용을 위한 Port와 Adapter라면, 비즈니스 로직 외의 기능을 포함하는 것은 부적절
JPA를 통한 데이터베이스 상호작용을 위한 Port와 Adapter라면, 비즈니스 로직 외의 기능을 포함하는 것은 부적절
왜 JPA를 통한 DB 상호작용 외의 기능을 포함하면 부적절한가?
SRP(단일 책임 원칙) 위반:
NotificationConfigService
의 역할은 데이터 저장소와의 상호작용을 추상화하는 것입니다.JPA로 DB 작업을 수행하는 Repository와 Port-Adapter 계층은 영속성 로직에만 집중하고, 다른 비즈니스 로직은 응용 계층(Application Service)에서 처리하는 것이 원칙입니다.
추가적인 로직이 포함되면 SRP(단일 책임 원칙)를 위반하게 됩니다.
비즈니스 로직은 응용 서비스에서 처리해야 함:
비즈니스 로직은 Core Domain이나 응용 서비스에서 처리하고, Port는 외부 시스템(DB, API 등)에 대한 의존성을 추상화하는 역할을 해야 합니다.
따라서
NotificationConfigImplService
는 단순히 DB와의 상호작용을 위한 Adapter로 남아야 합니다.
의존성 관리:
헥사고날 아키텍처에서는 DB와의 상호작용은 Outbound Port에서 담당하며, 비즈니스 로직이 포함되면 Port의 의존성이 복잡해집니다.
Port-Adapter 패턴의 구현체(
NotificationConfigImplService
)에 복잡한 로직을 포함하면 Adapter와 Domain의 의존 관계가 서로 얽히게 됩니다.
올바른 책임 분리 예시
1. 비즈니스 로직을 응용 계층에서 처리:
@Service
public class NotificationService {
private final NotificationConfigService configService;
public NotificationService(NotificationConfigService configService) {
this.configService = configService;
}
public void handleNewConfig(NotificationConfig config) {
// 비즈니스 로직 처리
if (config.isValid()) {
configService.saveConfig(config); // DB와의 상호작용은 Port에서 처리
} else {
throw new IllegalArgumentException("Invalid config");
}
}
}
2. Port와 Adapter는 DB와의 상호작용만 수행:
// Port 인터페이스
public interface NotificationConfigService {
NotificationConfig getConfigById(Long id);
NotificationConfig saveConfig(NotificationConfig config);
}
// Adapter(구현체)
@Service
public class NotificationConfigImplService implements NotificationConfigService {
private final NotificationConfigRepository repository;
public NotificationConfigImplService(NotificationConfigRepository repository) {
this.repository = repository;
}
@Override
public NotificationConfig getConfigById(Long id) {
return repository.findById(id)
.orElseThrow(() -> new RuntimeException("Config not found"));
}
@Override
public NotificationConfig saveConfig(NotificationConfig config) {
return repository.save(config);
}
}
결론
DB와의 상호작용 외의 로직은
NotificationConfigService
에 포함되지 않도록 해야 합니다.비즈니스 로직은 응용 계층(Service)에서 처리하고, DB와의 상호작용은 Port-Adapter로 위임해야 합니다
, multiple selections available,