현재 페이스북을 따라 만드는 미니프로젝트를 진행 중입니다.
기능이 추가되면서 어느 순간 하나의 Service가 5개의 필드를 가지게 되었고, 리팩토링을 할 시점이 왔구나!를 느꼈습니다. 하지만 아무리 생각해도 좋은 방안이 생각나지 않아서 이렇게 질문을 남기게 되었습니다.

현재 문제점과 제가 생각한 해결 방법에 대해서 정리했습니다.
제 해결 방법에 대한 의견이나 혹은 다른 방법에 대해서 조언해 주시면 감사하겠습니다.

현재 상태

게시글 이미지

스크린샷 2019-08-24 오후 3.52.13.png

위 이미지는 프로젝트의 게시글로, 게시글에서 보여줘야 할 부분은 총 5가지입니다.

  • 내용, 작성일, 수정일, 작성자
  • 이미지 혹은 동영상
  • 댓글 개수
  • 좋아요 개수
  • 공유 횟수 (현재 미구현)

Post 엔티티의 연관관계

image.png

image.png

Post는 현재 User와 UploadFile을 단방향으로 의존하고 있습니다.
그리고 댓글(Comment), 좋아요(PostGood)에서 Post를 단방향으로 의존하고 있습니다.

PostService

PostService의 코드 깃헙 링크
PostService는 현재 PostRepository, PostGoodService, UserService, CommentRepository, UploadFileService 이렇게 5개의 필드를 의존하고 있습니다.

각 필드의 역할을 정리하면서 꼭 있어야 할 것과 빼도 되지 않을까? 싶은 것을 나눠봤습니다.

필수

  • UserService
    • Post Entity를 등록, 수정, 삭제하기 위해서는 User가 필수로 필요함
  • PostRepository
    • Post CRUD

과연 필요할까?

  • UploadFileService
    • saveAttachments() - 사용되는 메소드
    • Post를 save 할 때 파일도 같이 저장하기 위해서 사용
    • 꼭 같이 저장해야 할까? (트랜잭션 처리 때문)
    • 따로 저장하다가 에러가 난다면 다른 한쪽을 지워 주면 안 될까? (보장될까? 복잡하진 않을까?
  • CommentRepository
    • update(), findPostResponses() - 사용되는 메소드
    • 댓글 개수를 구하기 위해서 사용 중
      • Post가 Comment를 참조해서 해결은?
      • 댓글 개수를 구하기 위해서 다 조회해서 size를 구하는 것은 비효율적이지 않을까?
      • 개수를 구하기 위해서만 사용되는데 양방향을 해도 될까?
  • PostGoodService
    • findPostResponses(), update(), countPostGoodByPost(), toggleGood() - 사용되는 메소드
    • CommentRepository랑 같은 상황
    • PostResponse에 좋아요 개수를 넣어주기 위한 목적으로 사용되고 있음

PostResponse

image.png

해결 방법

1. 하위 서비스 만들기

PostApiController -> PostService -> 하위 서비스

이런 구조로 하는 방법을 생각했습니다. 그럼 어떤 기준으로 하위 서비스를 만드나?

  1. 메소드 별로 사용 되는 객체끼리 모아서 하위 서비스를 만든다.

  2. CRUD 별로 만들기

    ex ) PostService -> CreateService, DeleteServcie, ReadService ....

하지만 이렇게 할 경우에 서비스 레이어가 너무 두꺼워지고 중복코드가 생길 여지가 있다 생각했습니다.
설계 자체를 다시 해봐야할까? 생각했습니다.

2. 각 정보별로 AJAX로 요청하기

스크린샷 2019-08-24 오후 3.52.13.png

제가 찾은 문제는 PostResponse가 너무 많은 내용을 한 번에 보여주려고 한다는 것입니다.
현재 방식의 문제는 공유하기도 구현되면 공유 횟수를 구해주기 위해서 또 하나의 필드가 추가됩니다.

그럼 나눠서 보여주는 것은 어떨까? 생각을 해봤습니다.

  • 게시글의 내용+작성자 1번 (PostResponse)
  • 좋아요 개수 1번
  • 댓글 개수 1번
  • 이미지 목록 1번
  • 공유 회수 1번

이렇게 총 5번의 AJAX 호출을 하는 방법은 어떨까요?

장점

  • PostService에서 필드를 줄일 수 있다.
  • 책임별로 클래스를 나눔으로써 재사용성이 높아지고 응집도가 높아진다.

단점

  • 5번의 호출을 해야하므로 네트워크 비용이 많이 발생한다.
  • 프론트에서 작업하기가 힘들다?

이정도까지가 제가 생각한 과정입니다.
제 설명이 많이 부족하지만, 의견주시면 감사하겠습니다!