T_era

Service계층에서 서로 다른 Repository를 가져오는건 SRP를 위배한 방법일까? 본문

이론/백엔드 개념정리

Service계층에서 서로 다른 Repository를 가져오는건 SRP를 위배한 방법일까?

블스뜸 2025. 5. 23. 17:37

댓글 기능을 구현을 하다가 해당 게시글을 가져와야하는 상황이 발생해서 PostRepository를 가져와 조회를 하려했는데 이건 단일책임을 위배하지 않나라는 생각이 들어 조사해봤다

결론부터 정하면 일반적으로는 단일 책임 원칙을 위배한다고 보지 않는 것이 일반적이며, 오히려 자연스러운 객체 지향 설계로 간주한다.

단일 책임 원칙(SRP)이란?

SRP는 "클래스는 오직 하나의 변경의 이유(reason to change)만을 가져야 한다"는 원칙이다. 즉, 클래스는 하나의 기능만 수행해야 하며, 해당 기능이 변경될 때만 클래스도 변경되어야 한다는 의미이다.

관점 1: 위배라고 볼 수 있다는 관점 (엄격한 해석)

매우 엄격하게 해석한다면, CommentService는 "댓글"과 관련된 비즈니스 로직만을 담당해야 한다. Post를 조회하는 것은 "게시글"과 관련된 책임이므로, CommentService가 PostRepository에 의존하는 것은 두 가지 책임(댓글 생성/관리, 게시글 조회)을 가지는 것이라고 볼 수 있다. 이 관점에서는 CommentService가 PostRepository를 주입받아 사용하는 것을 "단일 책임 위배"로 볼 수 있다.

관점 2: 위배가 아니라고 보는 일반적인 관점 (현실적인 해석 및 권장)

대부분의 현대적인 객체 지향 설계에서는 이 경우를 SRP 위배로 보지 않는다. 그 이유는 다음과 같다.

  1. 댓글 생성의 필수적인 부분: 댓글을 생성하는 로직은 단순히 댓글 내용을 저장하는 것만이 아니다. 어떤 게시글에 대한 댓글인지를 명확히 하고, 해당 게시글이 유효한지 확인하는 것은 "댓글 생성"이라는 책임의 필수적인 전제 조건이다. 댓글 서비스가 자신이 관리할 댓글의 대상인 게시글의 유효성을 확인하는 것은 자연스러운 비즈니스 로직의 일부로 간주된다.
    • CommentService의 주된 책임은 Comment 엔티티의 생성, 수정, 삭제 등이다. 이 과정에서 Post 엔티티와의 연관 관계를 맺는 것은 Comment의 유효성을 보장하고 Comment를 올바르게 저장하기 위한 내부적인 작업이다.
    • CommentService가 Post 엔티티를 수정하는 책임을 가지는 것이 아니라, 단지 Post 엔티티의 존재 여부 또는 참조를 확인하는 책임만을 가지므로, Post 관련 책임을 침범한다고 보기 어렵다.
  2. 협력하는 객체: 시스템의 모든 클래스가 완전히 독립적으로 존재할 수는 없다. 객체 지향 시스템은 여러 객체들이 서로 협력하여 하나의 큰 기능을 완성한다. CommentService와 PostRepository는 Post에 대한 Comment를 생성하기 위해 협력하는 관계이다. CommentService가 Post에 대한 CRUD 작업을 전반적으로 수행하는 것이 아니라, Comment 생성에 필요한 Post의 정보를 얻기 위해 PostRepository를 사용하는 것은 합리적인 협력 관계이다.
  3. 응집도와 결합도: 만약 게시글 조회를 별도의 PostLookupService와 같은 곳으로 옮긴다면, CommentService는 PostLookupService에 의존하고, PostLookupService는 PostRepository에 의존하게 된다. 이는 간접적인 의존성만 증가시킬 뿐, 실제 SRP 위반의 문제를 크게 해소하지 못한다. 오히려 CommentService가 Post의 유효성 검사 없이는 Comment를 생성할 수 없다는 점에서 응집도를 높이는 설계로 볼 수 있다.
  4. 실용성: 마이크로 서비스 아키텍처처럼 서비스 간 엄격한 분리가 필요한 경우가 아니라면, 하나의 서비스가 다른 도메인의 Repository를 참조하는 것은 일반적인 설계 패턴이다. 이는 불필요한 레이어를 만들지 않아 코드를 더 간결하고 이해하기 쉽게 만든다.

결론

댓글 서비스가 게시글 레포지토리를 사용하여 게시글의 존재 여부를 확인하고, 댓글과의 연관 관계를 맺는 것은 단일 책임 원칙을 위배한다고 보지 않는 것이 일반적이다. CommentService의 핵심 책임은 "댓글 관리"이고, Post 조회는 그 책임을 완수하기 위한 보조적인 수단일 뿐이다.

만약 CommentService가 Post의 제목을 변경하거나 Post를 삭제하는 등 Post 도메인의 핵심 비즈니스 로직을 직접 수행한다면 그때는 SRP 위반으로 볼 수 있다. 하지만 단순히 Post의 ID를 통해 존재 여부를 확인하고 연관 관계를 맺는 것은 CommentService의 범주에 속하는 합리적인 책임으로 간주된다.