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

[Feature] 화이트 보드 오브젝트/도구 관리 유즈케이스 추가 #86

Merged
merged 11 commits into from
Nov 16, 2024

Conversation

taipaise
Copy link
Collaborator

@taipaise taipaise commented Nov 16, 2024

🌁 Background

  • ViewModel에서 화이트 보드 오브젝트와 도구를 관리하는 방식으로 구현하던 중, ViewModel의 책임이 커진다고 느껴 유즈케이스로 분리하기로 했습니다.

👩‍💻 Contents

  • 화이트보드 오브젝트 관리 유즈케이스 추가
  • 화이트보드 도구 관리 유즈케이스 추가
  • 화이트보드 오브젝트 관리 테스트 코드 추가
  • 화이트보드 도구 관리 테스트 코드 추가

✅ Testing

  • 테스트 코드 실행

📝 Review Note
@eemdeeks @choijungp @ekrud99

  • ViewModel 수정 코드는 실수로 pr에 포함시켰습니다.. 완전히 갈아 엎어야 해서 무시해주시면 감사하겠습니다. 앞으로 신경 쓰도록하겠습니다. 죄송합니다 ㅜㅜ
  • 추가로 WhiteboardTool을 UseCase에서 사용하기 위해 Presentation -> Domain으로 이동했습니다. @eemdeeks 확인 한번 해주시면 감사하겠습니다!

@taipaise taipaise self-assigned this Nov 16, 2024
Copy link
Collaborator

@choijungp choijungp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어푸루부 ~ 이번 PR도 수고하셨습니다 ~ 👍🏻

Comment on lines 155 to 171
// 존재하지 않는 화이트보드 오브젝트 삭제 실패하는지 테스트
func testRemoveNonExistentObject() {
// 준비
let object = WhiteboardObject(id: UUID(), position: .zero, size: CGSize(width: 100, height: 100))
var receivedObject: WhiteboardObject?

useCase.removedWhiteboardObject
.sink { receivedObject = $0 }
.store(in: &cancellables)

// 실행
let result = useCase.removeObject(whiteboardObject: object)

// 검증
XCTAssertFalse(result)
XCTAssertNil(receivedObject)
XCTAssertEqual(useCase.fetchObjects().count, 0)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 잘 봤습니다 !!
궁금한 것이 있는데요 왜 존재하지 않는 화이트보드 오브젝트 삭제는 테스트했는데
존재하지 않는 화이트보드 오브젝트 업데이트 테스트는 없나용 ??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테케 생각을 못했습니다..! 날카로운 조이~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3651910 에서 반영했습니다!

Copy link
Member

@eemdeeks eemdeeks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생 많으셨습니다!!
테스트 코드까지 깔끔하게 작성해 주신 점이 인상깊네요!!

덕분에 두가지 유즈케이스 저도 사용할 수 있을 것 같아요 :)
Approve지만 코멘트에 대한 생각이 궁금합니다!!

_ ViewModel부분은 리뷰하지 않았습니다.

Comment on lines 20 to 22
/// 현재 존재하는 모든 화이트보드 객체들을 가져옵니다.
/// - Returns: 화이트보드 위에 존재하는 화이트보드 객체들
func fetchObjects() -> [WhiteboardObject]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구현체와 주석을 같이 본 바로는 본인이 갖고 있는 화이트보드 오브젝트들을 가져오는 메소드로 보이는데요,
혹시 언제 어떻게 사용될지 알 수 있을까요?

어떻게 사용될지, 필요한지 예상이 되지 않아서 코멘트 남깁니다 :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 이 부분 사용될 일이 없을것 같습니다!! 삭제하도록 하겠습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

692d764 에서 반영하였습니다.

}

public func updateObject(whiteboardObject: WhiteboardObject) -> Bool {
guard let index = whiteboardObjects.firstIndex(where: { $0 == whiteboardObject }) else { return false }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

업데이트 한 whiteboardObject를 비교해야하기 때문에,
WhiteboardObject 의 equatable메소드에서 id만 비교한 부분이 인상 깊어요!

Comment on lines 42 to 44
_ = useCase.addObject(whiteboardObject: object1)
_ = useCase.addObject(whiteboardObject: object2)
_ = useCase.addObject(whiteboardObject: object3)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반환값 사용을 하지 않을 때,
let _ 가 아닌 _ 만 사용해도 되는군요..?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵넵 맞습니다!! 요 부분도 고민 중인데요, discardableResult를 고려중입니다!!

}

// 화이트보드 위에 존재하는 오브젝트들 가져오기 성공 테스트
func testFetchObjects() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오브젝트 가져오는 fetchObject메소드의 테스트인데, 테스트 내부에서 addObject를 사용해야 하는 것이 조금 걸리네요..!

테스트코드를 많이 작성 해보지는 않아 더 좋은 방법이 떠오르지는 않는게 아쉽네요ㅜㅜ

addObject에 대한 테스트도 진행 해주니 괜찮겠죠??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 저도 같은 고민을 했는데, 더 나은 해결 방법을 생각하지 못해서 일단 위와 같이 작성했습니다!
이 부분은 팀 내에서 한번 더 이야기 나눠보면 좋을 것 같습니다.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋아요!
테스트 코드 작성 해 주시는 거 너무 좋습니다!!

//

import Combine
import Domain
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Domain 내의 있는 테스트인데도, Domain을 import 해야되는 군요..?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 맞습니다!!


public protocol ManageWhiteboardToolUseCaseInterface {
/// 화이트보드 도구 선택/선택 해제 시 이벤트를 방출합니다.
var currentToolPublisher: AnyPublisher<WhiteboardTool?, Never> { get }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ManageWhiteboardObjectUseCaseInterface 와 공통으로 코멘트 남깁니다!

목요일에 나눴던 얘기와 이어서 진행이 될 것 같은데요,

메소드의 반환 값으로 Publisher를 반환하는 방법이 생각나는데, 해당 방법 말고 따로 인터페이스에 추가해주신 이유가 있을까요??

Copy link
Collaborator Author

@taipaise taipaise Nov 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

하나의 퍼블리셔를 단발성으로 사용하지 않고 지속적으로 사용하게 되지 않을까 하여 위와 같이 구현했습니다.
또한 메서드의 반환 값으로 Publisher를 반환하게 되면, 해당 퍼블리셔를 매번 새로 구독해야할 것 같습니다!
이렇게 되면 Cancellable에 실제로는 사용하지 않는 구독이 점점 많이 쌓이게 될 것이라 생각합니다. (Tool을 바꿀 때마다 새로 구독해야 함) 이는 곧 메모리 누수로 이어지지 않을까 합니다!! 혹시라도 제가 잘못 알고 있는게 있다면 알려주시면 감사하겠습니다!!!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

설명 감사합니다!!
많은 고민이 담겨있는 코드였군요!!
역시..구욷
좋은 방법이라고 생각합니다 :)

@taipaise taipaise merged commit dd7976b into develop Nov 16, 2024
2 checks passed
@taipaise taipaise deleted the feature/manageWhiteboard branch November 16, 2024 12:37
Copy link
Collaborator

@ekrud99 ekrud99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주말에도 열심히 해주셔서 감사합니다!
항상 잘 배우고있습니다~

whiteboardObjects[index] = whiteboardObject
updatedWhiteboardSubject.send(whiteboardObject)
return true
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updateObject에는 이후에 추가적인 로직이 작성된다고 이해해도 될까요?
Result type을 활용하는 것 대신 Bool을 반환하고, subject를 통해 send해주는 방식을 선택한 이유도 궁금합니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 맞습니다! 아직 해당 에픽까지 진행하지 않아 뼈대만 구현한 상태입니다.

Result 타입이 아닌 Bool을 반환한 이유는
1. 아직 error 케이스를 정의하지 않았고 (실패 정책이 없어서)
2. 성공 실패만 따지면 되지 않을까?
하여 Result 타입 대신 Bool을 return 하도록 했습니다.

subject를 send하는 방식은 유즈케이스를 사용하는 쪽에게 '업데이트 된 객체' 라는 이벤트를 발행하기 위함입니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants