작성
·
9
1
안녕하세요. 코드에서 궁금한 점 질문드립니다.
댓글 생성, 삭제 시에 게시글의 댓글 수 증감 로직이 아래 예시 코드처럼 CommentService에서 이루어지고 있는데 과한 책임이 아닌가 싶어서요. 실무에서는 어떻게 나누게 되는지 궁금합니다.
public CommentResponse createComment(Long postId, CommentRequest request) {
Post post = postRepository.findById(postId)
.orElseThrow(() -> new IllegalArgumentException("게시글을 찾을 수 없습니다."));
Comment comment = Comment.builder()
.content(request.content())
.postId(postId)
.createdAt(LocalDateTime.now())
.updatedAt(LocalDateTime.now())
.build();
Comment newComment = commentRepository.save(comment);
post.increaseCommentCount();
postRepository.save(post);
return CommentResponse.from(newComment);
}
답변 1
0
안녕하세요, 당황한 너구리님
현재 CommentService
에서 댓글 뿐만 아니라 게시글에 관한 책임이 함께 있는 상황인데요.
서비스가 커져감에 따라 발생할 수 있는 유지보수성 문제를 잘 지적해주셨네요.
실무에서 책임을 분리하는 방법으로는
1) 가장 간단하게는 PostService
에 댓글수를 증가하는 메소드를 만든 뒤, CommentService
에서 이를 호출하는 방법이 있습니다.
이렇게 되면 CommentService
가 PostService
를 의존하게 되는데, 그 반대로도 의존하여 순환참조 되지 않도록 개발 내부 규칙을 두어 한 방향으로만 의존할 수 있게 강제하면 좋습니다.
2) 반대로, PostService
에 댓글 생성 메소드를 만든뒤, CommentService
의 댓글 생성 메소드만 호출하도록 만들어도 됩니다.
PostService
createComment()
Post 조회 및 검증
CommentService.createComment() 호출
Post의 댓글 수 증가 및 저장
PostService
를 비즈니스 플로우 진입점으로 정해놓고, CommentService
는 간단하게 댓글을 저장하는 식입니다. 즉, 게시글, 댓글이 동시에 사용된다면 진입점은 항상 PostService
로 규칙을 정하는 겁니다. 이를 통해 비즈니스 로직에 통일성을 부여하고, 위에서 언급한 순환참조 문제도 없게 됩니다.
3) PostService
, CommentService
위의 상위 계층을 만들어 이곳에서 두 로직을 조합합니다.
가령, CommentCreationUseCase
를 두어 추상화된 게시글, 댓글 통합 처리를 담당하게 하면 됩니다.
이를 통해 각 서비스는 자신이 맡은 도메인 로직에만 집중할 수 있고, 복잡한 트랜잭션이나 비즈니스 규칙은 CommentCreationUseCase
에서 일관성 있게 처리할 수 있습니다.
제가 선택지를 여러개 드렸는데, 이 외에도 도메인 이벤트 발행 등 다양한 방법이 있을 수 있습니다.
강의에서는 간단한 로직을 다루고 있다보니 CommentService
에서 모든 작업을 처리하고 있습니다.
개인적으로는 현재 서비스 수준에서 과하지 않게 필요한 정도로 책임을 분리해주면 좋다고 생각합니다.
감사합니다.