-
Notifications
You must be signed in to change notification settings - Fork 7
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
refactor: 댓글 삭제 로직 변경 #694
base: develop
Are you sure you want to change the base?
refactor: 댓글 삭제 로직 변경 #694
Conversation
✔️ Deploy Preview for nolto canceled. 🔨 Explore the source changes: da07907 🔍 Inspect the deploy log: https://app.netlify.com/sites/nolto/deploys/618b49ceccdb2800074b544d |
완전 괜찮습니다 👍 👍 👍 👍
요 부분은 OSIV를 키워드로 공부해보시면 궁금증이 해소될거에요
comment 삭제 로직 변경 이후에 테스트가 터졌다는 거로 이해하면 될까요? 여기도 em.clear() 상당히 좋아요 👍 일단 테스트가 실패하는 이유를 조금 분석하면 User 엔티티에 Comments @onetomany 연관관계 필드를 보면
이건 트랜잭션이 새로 열리는거 보단 영속성 컨텍스트 내부를 비워버리는 거로 알고있어요! 추가.EntityManager의 clear()는 영속성 컨텍스트 내부를 초기화 하는데 정확히는 entity 전체를 detached 상태로 만든다고 하네요 |
이슈도 등록해서 다른분들 approve가 되면 반영해도 좋다고 생각합니다~ 추가로 User의 comments @onetomany 관계에 걸린 cascade 설정을 CascadeType.REMOVE로 설정해주는것도 좋다고 생각해요~ 궁금하시면 em.clear() 추가하신거 롤백하고 위에 설정 적용해서 돌려보면 테스트가 통과할거에요! PR merge할 때는 em.clear()는 추가하신거로 반영해주세요! |
오 제가 공유드렸던 부분 빠르게 수정해주셨군요 👍👍👍👍 감사합니다! 제가 정확히 기억하고 있는 부분이라 당시 왜 그렇게 작성했었는지 상황을 조금 설명을 드리자면, 그리고 찰리 말씀대로 feed보단 user가 직접 지운다 라는 맥락으로 그때 제가 제안했었는데, 결국 feed에 댓글을 영속할 수도 없고 user를 댓글에 영속할 수 없다는 특성을 간과하지 않았나 싶네요. 😭 em.clear()도 그때 저는 쓰자는 입장이었어서 😂😂 당시에는 어떠한 이유로 작성했던 코드인지 조금 설명드리자면 저번에 아마찌가 언급했던 것처럼 테스트 코드에서
링크 다시 읽어보고 있는데 수고 많으셨습니다 !! 👏👏👏👏 +) 척박한 취준 속 마른 단비같은 PR이네요 덕분에 재밌게 고민해보다 갑니다 ㅎㅎ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 피알 올리기 잘했네요 여러분의 성원 힘이납니다 💪💪💪
기준 너무 좋네요! 포모의 말을 들으니 아 진짜 그렇다! 라고 생각이드네요. 찰신의 깔끔한 Reply가 안지워지고 있는 이유 설명과, em.clear()의 속뜻 풀이, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우왓 어제 기절했다 온 사이에 많은 코멘트들이 오갔었네요 ㅎㅎ ㅠㅠ
피알이랑 코멘트들 재밌게 잘 읽었습니다 진짜루...
덕분에 예전에 연관관계, 테스트 코드로 한창 같이 고민했던 부분들도 생각나고...
이 피알 하나만으로 많은 복습이 되었네요 짱짱짱 ㅎㅎㅎ
위엣서 얘기한대로, 과거의 우리는 user가 직접 자신의 댓글을 지워야 객체다운거라고 생각하며
맹목적으로 user에서 피드나 댓글 등을 삭제하게 구현했었던 것 같아요 ㅎㅎㅎ
음 근데 조금 지나고 돌이켜 생각해보면,
- 그 복잡한 연관관계와 영속화의 뇌절을 겪어가면서 user가 댓글을 삭제한다는 행위를 반영하는 것이 과연 좋은 코드였을까?
- 만약 인자로 user가 넘어오지 않는 상황(user 없이 삭제)에서는 ?
- 찰리 말대로 그냥 단순히 서비스 입장에서는 해당 영속 데이터를 지운다 이니
바뀐 코드 방식으로 통일하는게 더 좋아보이네요 ㅎㅎ
그리고 우리 테스트 코드에서 @Transcational
을 사용할 수 밖에 없는 이유도,
(얘기는 나눴지만 히스토리 차원에서 남깁니다 ㅎㅎㅎ)
현재 모든 서비스 메서드에서 받고 있는 User가 이미 ArgumentResolver에서 영속화 된 상태로 인자로 받고 있는데,
서비스 테스트에서 통합테스트(@SpringBootTest
)를 하고 있으니
실제 환경과 동일히 영속화 된 user를 넘겨주려면 @Transcational
이 들어갈 수 밖에 없었네요 !!!
근본적으로는 @Transcational
의 적폐보다는 ArgumentResolver에서 영속 User를 그대로 내보내고 쓰고 있어서 생기는 문제가 아니였을까... 싶네요 ㅎㅎㅎ
(소나큐브가 계속 리졸버에서 pojo를 넘기라는게 이 때문일지도 ??)
째앴든 ~ 좋은 피알 감사합니다 ㅎㅎ
피알보고 몇가지 코멘트 남겨보았는데 가볍게 확인만 부탁드려용
덕분에 많이 배워갑니다 👏
@@ -57,7 +57,7 @@ public void deleteComment(User user, Long commentId) { | |||
if (findComment.isParentComment()) { | |||
applicationEventPublisher.publishEvent(new NotificationCommentDeleteEvent(findComment)); | |||
} | |||
user.deleteComment(findComment); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
User.deleteComment()
해당 메서드는 이제 사용하는 곳이 없으니 제거되면 좋겠네요 !! ㅎㅎ
(전반적으로 User 안에 쓰이지 않고 있는 메서드는 제거되어도 좋을 것 같아요 ㅎㅎㅎ)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
옷 이거 제거된 거 일거에용!! ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아아 User 클래스 안에는 남아있귈랭!! ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
남아있는 메서드 말씀하시는 거 였군여~~ 제삼다 ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
반영했습니다~
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true) | ||
@OneToMany(mappedBy = "author", cascade = CascadeType.REMOVE) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 이제 자식과의 관계를 끊어서 삭제하는 로직이 없으니 현재로써는 orphanRemoval 설정이 불필요하군요 !!!
서비스의 역할에서 보면 영속화 된 데이터를 지운다라는 측면에서 봐야할거같아요.
영속화된 데이터를 지우는데 orphanRemoval 설정에 의존적인 느낌이라 좋지 않아 보이네요
코멘트를 읽다가 찰리의 이 말도 꽤 인상 깊었습니다 ㅎㅎ
음 이번에 조엘 pr로 삭제 로직을 부모 객체와의 연관관계를 통해서가 아닌 대상을 직접 삭제하기로 하고
여기서 불필요한 orphanRemoval 설정을 제거해주었다면,
Feed에 있는 orphanRemoval 설정도 제거해줘서 통일성을 가져가도 좋을 것 같다는 생각이 드네요 !!
(보니까 실제로 해당 옵션이 아무런 작용도 하지 않고 있었네요 😅)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요것도 반영했습니다~
오호... 소나큐브 피드백이 약간 이제서야 이해되네요 User를 아규먼트리졸버에서 바로 넘겨주는게 한 스텝 줄이는 과정이라고 생각했었는데, 생각할 수 있는 포인트 감사합니당 |
- User 쓰이지 않는 deleteComment 메서드 삭제
코멘트보니까 또 궁금해져서 요것저것 보다가 ㅎㅎ 제 의견 정리해서 올려봅니닷 ArgumentResolver에서 영속화된 엔티티인 User가 서비스 레이어까지 넘어오게 되었고, 그로 인해 문제 발생! 여기까지가 저희 흐름인 거 같아요. 여기서 OSIV로 인해 영속화된 엔티티가 서비스 레이어로 넘어오는 것이다, 따라서 영속화된 User를 반환하지 않고 서비스 레이어에서 다시 find하는 흐름까지 온 거 같아요! 명확한 테스트를 하고 싶어서 프로덕션 코드를 수정하고 빈번한 Connection을 증가시키는 것보단, 테스트코드가 개선될 방향을 찾아봐야하지 않을까?하는 저의 의견인데요! 그래서 테스트코드에 Transcational을 사용하지 않고 어떻게 프로덕션과 유사하게 테스트를 할 수 있을까를 고민해보았지만... 아직 명확하게 이거다!하는 방법은 못찾았어요 😥 두줄요약 : 테스트코드에서 |
작업 내용
작업 동기
이상한 점
List<Comment>
있고 등등그전에 또 하나 이상했던 것
터지는 테스트들
@Transaction
을 붙여서 setUp 대상의 모든 객체들이 영속성 컨텍스트에 올라감List<Reply>
등 모든 잡다한 연관관계가 영속성 컨텍스트에서 관리됨나의 결론
@Transactional
을 붙인게 약간 적폐이지 않았나...