작성
·
4
0
안녕하세요! 토비님.
헷갈리는 개념이 하나 있어서 여쭤보고 싶습니다.
바로 헥사고날 아키텍처에서 UseCase의 책임 범위인데요.
우선 정답은 없다는 것은 알고 있습니다. 다만 Best Practice나 권장되는 방법이 있는지, 그리고 토비님의 고견이 궁금하여 질문드리게 되었습니다.
기능 단위로 UseCase 인터페이스 분리하기 vs 연관된 기능은 UseCase 인터페이스에 묶음으로 제공하기(메서드별로)
입니다.
전자는 SRP가 매우 엄격하게 준수되고, 테스트 용이성, 개별 인터페이스별로 정책을 다르게 적용할 수 있다는 장점들이 있지만 과도하게 인터페이스화를 하다 보니 관리할 포인트가 많아져 복잡해진다는 게 단점인 것 같습니다.
후자는 SRP가 엄격하게 준수되지 않더라도, 관련된 기능을 응집도 있게 관리하기 때문에 테스트 용이성이 조금 떨어지고, 일관된 정책을 관리하거나 인터페이스가 비대해질 수도 있다는 단점이 있지만, 응집도 있게 관리하여 유지보수에는 편한 장점이 있는 것 같습니다.
코드를 예시로 보면 아래처럼 콘서트를 조회한다고 했을 때, 일반적으로 PK를 기반으로 조회하지만,
아래와 같이 콘서트명도 unique하고, 가수도 1개의 진행 중인 콘서트만 가지고 있을 수 있을 때 조회 조건이 Id, Name, ArtistName으로 분류될 수 있다고 예시를 들어보겠습니다.
public interface GetConcertUseCase {
ConcertResult findById(Long concertId);
ConcertResult findByName(String name);
ConcertResult findByArtistName(String ArtistName);
ConcertResult findByIdWithSchedules(Long concertId); // Aggregate Member인 ConcertSchedule 목록 정보도 포함하여 조회
}
위에처럼 구성하는 게 후자 방식이고 응집도가 높다고 생각합니다.
그런데 해당 방식은 유스케이스가 비대해질 수 있고, 단일 책임 원칙에서 벗어날 수 있다는 의견 때문에 조회 목적별로 유스케이스 분리하는 것을 권장하는 의견도 있습니다. (전자 방식)
public class GetConcertByIdUseCase { ... }
public class GetConcertByNameUseCase { ... }
public class GetConcertByArtistUseCase { ... }
public class GetConcertByIdWithSchedulesUseCase { ... }
정답은 없어서 프로젝트 규모나, 각자의 스타일, 기능 분석에 의해 정해지겠다만, 보편적으로 이런 경우 어떻게 접근하는 게 Best Practice인지 감이 잡히질 않아 질문드리게 되었습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. roovies님께서 헥사고날 아키텍처에서 UseCase 인터페이스의 설계 방법에 대해 고민하고 계시군요. 여기서는 어떤 선택이 더 나은지, 각각의 장단점을 구체적으로 살펴보겠습니다.
기능별로 UseCase를 분리하는 방식 (전자 방식):
관련된 기능을 하나의 UseCase 인터페이스에 묶는 방식 (후자 방식):
토비님과 같은 전문가들은 특정한 Best Practice를 강력하게 추천하기보다는, 도메인의 특성을 고려해 설계하는 것을 강조합니다. 간단한 구조에서 시작하여 점차적으로 복잡도가 증가할 때, 애플리케이션의 필요성에 맞게 구조를 조정하는 것이 권장됩니다.
관련 유사 질문을 참고하시면 도움이 될 수 있습니다:
- UseCase와 SRP에 대한 오해
- 헥사고날 아키텍처의 UseCase 작성법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.