Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#46] Refactor : 댓글 API 리팩토링 #48

Merged
merged 20 commits into from
Aug 25, 2023
Merged

Conversation

gombasan
Copy link
Member

작업 사항

  • 댓글 api 오류 수정 #46

  • 기존 댓글 조회는 게시글 상세 조회시 같이 조회 하도록 구성 하였지만, 댓글이 많아짐에 따라 게시글 상세조회 부분이 너무 많은 데이터를 가져오는것 같아 댓글 조회 부분을 분리하여 처리하였습니다!

  • 추가로 댓글 삭제 부분이 누락되어 추가하였습니다!

작업 내용

feat : 댓글 조회 API 생성

feat : 댓글 삭제 API 추가

feat : 댓글 리스트 조회 메서드 추가

feat : Response 필드 추가

feat : 댓글 조회 API 문서화 추가

feat : 댓글 삭제 API 문서화

feat(Test) : 댓글 조회 테스트 추가

feat(Test) : 댓글 테스트 코드 추가

feat(Test) : 대댓글 팩터리 메서드 추가

chore : 게시글 상세 조회 수정

chore(Test) : 게시글 조회 시 댓글 검증 삭제
내용이 많아 커밋 상세 메세지는 제외 하도록 하겠습니다~!

작업 외 개선 사항

  • 게시글 리스트 조회 시 기존 fetch Join 으로 연관된 모든 데이터를 가져와 처리하는 방식에서 dto 로 만 가져오도록 수정하였습니다!

  • 실제 성능에 차이가 있는지 확인하기 위해 jmeter 를 활용하여 성능 테스트를 진행해봤습니다.
    KakaoTalk_Photo_2023-08-24-21-41-32

  • 테스트는 게시글을 15개, 각 게시글당 댓글 10개로 데이터를 준비한 후 100명의 User가 100번 씩 반복하여 테스트를 진행했습니다.

  • 실제로 평균 응답속도와 최소,최대 응답속도가 모두 70% 가 줄어들었다는것을 확인 할 수 있었습니다. 특히 최대 응답속도는 75% 로 눈에 띄게 성능이 개선되었다고 생각합니다!

  • 또한 표준 편차도 응답 속도가 안정적으로 바뀐 점도 확인 할 수 있었습니다!

refactor : 게시글 조회 쿼리 수정

  • 현재 게시글 리스트 조회시에는 순수한 Post 자체의 조회 보다는 형태를 많이 수정하여 요약된 정보를 조회 하고있다고 생각하여 쿼리문을 수정하였습니다.
  • 댓글의 갯수, 이모지의 갯수 등 데이터를 조회 한 후에 처리하는 것이 아닌 DB 자체의 기능을 활용하여 조회 시점에서 PostResponse 로 조회 하는것이 더 성능적으로 올바르다고 생각하여 수정하였습니다.

chore(Test) : PostRepository 테스트 수정

  • 테스트 내용이 충분히 검증하도록 테스트 케이스를 추가하였습니다.
  • 이모지와 댓글이 게시글 조회 시점에 정상적으로 count 여부를 확인하기 위한 테스트를 추가하였습니다.

chore : PostResponse queryDsl 설정 추가

  • @QueryProjection 을 추가하여 PostResponseQPostResponse 를 생성 할 수 있도록 추가하였습니다.

특이 사항

  • 한번에 많은 내용을 작성해서 보기 불편할거같네요...! ㅠㅠㅠ 다음에는 PR을 꼭 나눠서 처리하도록 하겠습니다.!
  • 게시글 리스트는 현재 댓글과 이모지의 내용도 함께 포함하여야 하고 다른 형태라고 생각하여 DTO 로 직접 받도록 처리했는데, 성능상에 이점은 확실한거같은데, 성능만을 생각해서 이렇게 해도 되는건지 의문이 들긴합니다!
  • 설정파일에 default batch size 를 100 으로 설정하여 코드 내 어노테이션을 제거하였습니다~!

- 댓글 조회 API 를 새로 생성하여 postId 에 대한 댓글을 조회 하도록 설정하였습니다.
- URL 매핑을 클래스 단위로 변경하였습니다.
- 게시글의 대한 댓글을 조회 하는 메서드를 추가하였습니다.
- 댓글중 부모의 아이디가 없을 경우 제외 하도록 했습니다.
- 댓글의 작성자가 필요하다는 요청을 받아 Response 에 추가하였습니다.
- Mapper 도 함께 변경하였습니다.
- 댓글로 Post 객체 그래프 탐색은 필요하지 않다고 생각하여, 지연 로딩을 적용하였습니다.
- Emoji 는 BatchSize 100 을 설정하였습니다.
- comment , emoji 배치 사이즈를 `50` -> `100` 으로 수정하였습니다.
- 게시글 상세 조회 시 더 이상 댓글을 함께 반환 할 필요가 없어 `comment` 조인을 제거 하였습니다.
- `comment` 를 `Emojis` 로 변경하여 게시글 상세 조회 시 실행되는 쿼리의 횟수를 줄이고자 수정하였습니다.
- join 되는 테이블이 변경됨에 따라 메서드 명을 `joinMemberAndComment` ->  `joinMemberAndEmojis` 로 변경하였습니다.
- 메서드 변경에 따른 해당 메서드를 사용하는 클래스들도 함께 수정하였습니다.
- 게시글 상세 조회 시 더 이상 댓글을 조회 하지 않으므로 필드에서 제거하였습니다.
- jpa 의 기본 배치 사이즈 설정을 추가하였습니다.
- 해당 설정이 추가됨에 따라 기존 `@BatchSize` 를 제거하였습니다.
- 댓글 조회 API 를 분리하여 테스트를 추가하였습니다.
- 기존 문서화 내용 부분중 잘못 입력되어 있는 부분을 수정하였습니다.
- 댓글 조회 API 를 분리함에 따라 게시글 조회 시 댓글을 검증 및 문서화 하는 코드를 삭제하였습니다.
- 현재 게시글 리스트 조회시에는 순수한 `Post` 자체의 조회 보다는 형태를 많이 수정하여 요약된 정보를 조회 하고있다고 생각하여 쿼리문을 수정하였습니다.
- 댓글의 갯수, 이모지의 갯수 등 데이터를 조회 한 후에 처리하는 것이 아닌 DB 자체의 기능을 활용하여 조회 시점에서 `PostResponse` 로 조회 하는것이 더 성능적으로 올바르다고 생각하여 수정하였습니다.
- `@QueryProjection` 을 추가하여 `PostResponse` 도 `QPostResponse` 를 생성 할 수 있도록 추가하였습니다.
- PostResponse 를 쿼리로 직접 사용하기 때문에 더 이상 데이터 매핑이 필요하지 않아 제거하였습니다.
- 테스트 내용이 충분히 검증하도록 테스트 케이스를 추가하였습니다.
- 이모지와 댓글이 게시글 조회 시점에 정상적으로 `count` 여부를 확인하기 위한 테스트를 추가하였습니다.
- 댓글 조회 API 문서 내용을 추가하였습니다.
- 댓글을 삭제하는 API 를 추가하였습니다.
- 댓글의 삭제 요청하는 memberId 와 댓글의 작성자 아이디를 비교하여 둘이 동일하다면 삭제 처리합니다.
- 댓글 삭제 테스트 코드를 추가하였습니다.
- 댓글 수정 및 삭제 시 권한 예외가 발생하는 테스트를 추가하였습니다.
- 대댓글도 생성하여 사용할 수 있게 추가하였습니다.
- 댓글 삭제 API를 문서화 하였습니다.
@gombasan gombasan added ✨ Feature 기능 개발 📬 API 서버 API 통신 🔨 Refactor 코드 리팩토링 labels Aug 24, 2023
@gombasan gombasan self-assigned this Aug 24, 2023
@gombasan gombasan linked an issue Aug 24, 2023 that may be closed by this pull request
2 tasks
- 생성 날짜 검증 시 초 단위가 서로 달라 검증이 실패하는 에러가 발생하여 해당 검증은 제외하도록 하였습니다.
@github-actions
Copy link

테스트 커버리지 리포트입니다

File Coverage [94.3%] 🍏
PostDetailResponse.java 100% 🍏
PostResponse.java 100% 🍏
CommentController.java 100% 🍏
CommentCustomRepositoryImpl.java 100% 🍏
CommentResponse.java 100% 🍏
CommentServiceImpl.java 97.28% 🍏
Post.java 94.37% 🍏
PostCustomRepositoryImpl.java 93.77% 🍏
Comment.java 90.65% 🍏
PostServiceImpl.java 82.39% 🍏
Total Project Coverage 78.53%

@gombasan
Copy link
Member Author

gombasan commented Aug 24, 2023

CI 실패 원인

image

  • 생성 날짜 검증시 초의 자릿수가 달라져 테스트가 Test 가 실패하였습니다
  • 해당 내용은 fix : 생성 날짜 검증 오류 수정
    로 일단 날짜 검증부분을 제거하여 해결하였습니다.
  • 제 피씨에서는 정상적으로 Pass 가 뜨는데.. 왜 다르게 출력되는지 모르겠네요...

@gombasan
Copy link
Member Author

@JoosungKwon
일단 커밋하겠습니다~~!!!!

@gombasan gombasan merged commit 8b38125 into develop Aug 25, 2023
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📬 API 서버 API 통신 ✨ Feature 기능 개발 🔨 Refactor 코드 리팩토링
Projects
None yet
Development

Successfully merging this pull request may close these issues.

댓글 api 오류 수정
1 participant