inflearn logo
강의

Course

Instructor

Complete One Full Cycle of Backend Service with Spring Boot and AWS

Section 7 Quiz

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

Resolved

76

sn054367871

2 asked

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

aws mysql docker spring-boot jpa

Answer 1

1

apiece

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

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

 

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

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

 

감사합니다.

 

맥북으로 RDP 연결 질문

0

13

1

라우팅 테이블 설정 중 궁금한게 있습니다.

0

26

1

프롬프트, 스킬, sub-agent

0

16

0

라이브 운영중인 환경의 테이블에 인덱스 추가시 고려사항

0

18

2

수강 연장 가능하면 요청 드립니다.

0

15

2

RepositoryTest의 패키지 위치가 domain인 이유

0

13

1

JPA Repository 질문이 있습니다!

1

28

2

페이지네이션 처리를 쿼리에서 하는 방식 질문

1

30

1

EC2 실습 중 docker-compose / docker ps 실행 시 권한 오류 문의

2

66

1

gradlew, java -jar 로 애플리케이션 실행시키기에서

1

42

1

application.yaml에서 enabled: true 인식 안됨

3

108

4

영상 안보임

0

81

4

중간 결과물을 다운 받을 수 있는 곳이 있나요?

1

73

2

여러 컨테이너 사용시 사용할 포트 번호는 무엇으로 하면 되나요?

1

59

1

URL 오타 방지

1

55

1

배포 후 Entity 수정 관련

1

75

1

EC2 HTTPS에 관련하여 질문 드립니다!

1

61

2

EC2 <-> RDS 연동 후 로컬에서의 Docker에 대해 궁금한 점이 있습니다.

1

69

1

Docker에 관하여 궁금한 점이 있습니다!

1

56

1

https 설정 질문

1

93

2

섹션 5-26. AWS EC2 서버 배포 파트 질문입니다.

1

95

2

강의내용 중 질문드립니다.

1

150

2

jakarta persistence 플러그인은 intellij ultimate에서만 사용가능하다고 나오네요.

1

131

2

다운받은 강의자료 압축풀기가 안되요

1

116

2