강의

멘토링

커뮤니티

Inflearn コミュニティ Q&A

sn054367871 のプロフィール画像
sn054367871

投稿した質問数

Spring BootとAWSでバックエンドサービスを一通り完成させる

セクション7クイズ

댓글 생성, 삭제 시 게시글의 댓글 수 증감 로직 질문

解決済みの質問

作成

·

65

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);
}
awsmysqldockerspring-bootjpa

回答 1

1

apiece님의 프로필 이미지
apiece
インストラクター

안녕하세요, 당황한 너구리님

현재 CommentService 에서 댓글 뿐만 아니라 게시글에 관한 책임이 함께 있는 상황인데요.

서비스가 커져감에 따라 발생할 수 있는 유지보수성 문제를 잘 지적해주셨네요.

 

실무에서 책임을 분리하는 방법으로는

1) 가장 간단하게는 PostService 에 댓글수를 증가하는 메소드를 만든 뒤, CommentService 에서 이를 호출하는 방법이 있습니다.

이렇게 되면 CommentServicePostService 를 의존하게 되는데, 그 반대로도 의존하여 순환참조 되지 않도록 개발 내부 규칙을 두어 한 방향으로만 의존할 수 있게 강제하면 좋습니다.

 

2) 반대로, PostService 에 댓글 생성 메소드를 만든뒤, CommentService 의 댓글 생성 메소드만 호출하도록 만들어도 됩니다.

PostService
  createComment()
  Post 조회 및 검증
  CommentService.createComment() 호출
  Post의 댓글 수 증가 및 저장

PostService 를 비즈니스 플로우 진입점으로 정해놓고, CommentService 는 간단하게 댓글을 저장하는 식입니다. 즉, 게시글, 댓글이 동시에 사용된다면 진입점은 항상 PostService 로 규칙을 정하는 겁니다. 이를 통해 비즈니스 로직에 통일성을 부여하고, 위에서 언급한 순환참조 문제도 없게 됩니다.

 

3) PostService, CommentService 위의 상위 계층을 만들어 이곳에서 두 로직을 조합합니다.

가령, CommentCreationUseCase 를 두어 추상화된 게시글, 댓글 통합 처리를 담당하게 하면 됩니다.

이를 통해 각 서비스는 자신이 맡은 도메인 로직에만 집중할 수 있고, 복잡한 트랜잭션이나 비즈니스 규칙은 CommentCreationUseCase에서 일관성 있게 처리할 수 있습니다.

 

제가 선택지를 여러개 드렸는데, 이 외에도 도메인 이벤트 발행 등 다양한 방법이 있을 수 있습니다.

 

강의에서는 간단한 로직을 다루고 있다보니 CommentService 에서 모든 작업을 처리하고 있습니다.

개인적으로는 현재 서비스 수준에서 과하지 않게 필요한 정도로 책임을 분리해주면 좋다고 생각합니다.

 

감사합니다.

 

sn054367871 のプロフィール画像
sn054367871

投稿した質問数

質問する