최근 수행 중인 프로젝트에서 QnaService와 CourseService 간의 순환 참조를 해결한 사례를 남겨봄.
QnaService에서 CourseService를 통해 Course 엔티티를 쿼리하고, 이 코스가 종료된 코스인지를 검토하는 로직이 있었음.
CourseService에서도 QnaService를 통해 등록된 Qna를 제거해야 했는데, 이 때문에 서로 상대방의 빈을 주입받으려해 생성 시점이 엉키는 문제가 발생함.
Query용 서비스와 Management용 서비스를 분할하여 해결함.
Query 서비스에서는 오직 쿼리만 담당하고, Management 서비스에서 삽입, 삭제, 갱신 등 업데이트 연산을 제공하여 책임을 나눔.
이를 통해 조작 과정 중 조회 기능이 필요해도 다른 도메인의 서비스를 부담없이 주입받을 수 있었음.
물론 궁극적인 해결책은 아니나 괜찮은 패턴 같아서 적어둠.