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] 사진 오브젝트 설계, 유즈케이스 구현 #89

Merged
merged 4 commits into from
Nov 19, 2024

Conversation

taipaise
Copy link
Collaborator

@taipaise taipaise commented Nov 18, 2024

🌁 Background

  • 사진 오브젝트 추가를 위해 사진 오브젝트 설계와, 유즈케이스가 필요하여 작업했습니다.

👩‍💻 Contents

  • 사진 오브젝트 설계
  • 사진 추가 유즈케이스 구현

📝 Review Note

사진 오브젝트 추가는 간단하게 끝낼 수 있을 줄 알았는데 생각보다 고려해야할 것이 많았습니다. 현재 두가지 방법을 고려중입니다.

  1. PhotoObject 엔티티가 이미지 데이터를 가지고 있는 경우

    • 두 가지 형태로 이미지 데이터를 중복해서 메모리에 들고 있게 됩니다.
      • Domain의 entity에서 Data 형식으로 한 번
      • PresentationUIImageView에서 UIImage의 형태로 한 번
    • 2번 URL 방식과는 다르게 따로 파일 입출력 없이 이미지를 사용할 수 있습니다.
  2. PhotoObject 엔티티가 이미지 데이터의 URL을 가지고 있는 경우 (현재 이 방법을 임시 채택)

    • 아래 과정을 통해 이미지를 관리합니다.
      • Data 형식으로 이미지를 받으면, 이를 Domain에게 넘겨줍니다.
      • FileManager를 통해 Domain은 ImageData를 파일 시스템에 저장합니다. (쓰기 작업 한 번)
      • 저장한 위치(URL)를 이용해 PhotoEntity를 생성합니다.
      • Presentation에서 이미지를 표시할 때, FileManager를 통해 이미지 data를 가져와 ?UIImage를 생성합니다. (읽기 작업 한 번)
    • 1번 방법과는 다르게 메모리에 이미지 데이터를 한 번만 들고 있지만, 파일 입출력을 두 번 거쳐야 화면에 이미지를 표시할 수 있습니다.
    • 파일 쓰기가 실패할 수 있기 때문에, UseCase의 addPhotoObject 함수가 errorthrow할 수 있습니다.
    • 추후 오브젝트 위치/크기 수정 할 때는 frame 자체만 수정하면 되기 때문에 파일 입출력을 할 필요는 없습니다.
  • 위 두가지 방법 이외에 좋은 방법이 있다면 편하게 말씀해주시면 감사하겠습니다!!

📣 Related Issue

@taipaise taipaise self-assigned this Nov 18, 2024
@taipaise taipaise changed the title [Feature] 사진 오브젝트 설계 [Feature] 사진 오브젝트 설계, 유즈케이스 구현 Nov 18, 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.

저도 딩동의 의견에 동의합니다 !!
PhotoObject가 UIImage를 갖고 있는 것보단 url로 갖고 있는 것에 동의 ......

그른데 파일입출력이 고민이라면 .. 이미지 캐싱 ? ㅎㅎ 고려하는 것도 도움이 될까요 ??

일단 어푸루부 !!! 완고 (완전고생했단 뜻) 띵똥 ~~

/// - Parameters:
/// - imageData: 추가할 사진의 데이터
/// - position: 사진을 추가할 위치 (origin)
/// - size: 사진 객체
Copy link
Collaborator

Choose a reason for hiding this comment

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

요기 size 파라미터는 어디서 나온건가요 ??

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

눈썰미 무엇.. AirplainImageData라는 타입은 버리고 주석과 같이 수정하겠습니다.

private let fileManager: FileManager
private let photoDirectory: URL

public init(fileManager: FileManager) throws {
Copy link
Collaborator

Choose a reason for hiding this comment

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

요기서 fileManager를 주입 받는 이유가 궁금합니다.
FileManager.default로 FileManager의 싱글톤을 사용하는 것 외에 생각하고 있는 방식이 있나요 ??

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

앗.. FileManager의 default를 그냥 사용하도록 하겠습니다!!
너무 멀리 멀리 보려하니 문제 정의를 잘못한것 같습니다..!..!
위에서 AirplainImageData 타입을 따로 정의한 부분과 같은 문제네요ㅜㅜ 생각 정리를 깔꼼하게 끝내고 설계를 했어야 했는데 마음이 너무 급했나 봅니다..

Comment on lines +10 to +14
public enum DomainError {
case cannotWriteFile
case cannotCreateDirectory
case cannotFindDirectory
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

DomainError도 좋치만 !
뭔가 파일 쓰기 찾기 관련 에러 같아서 다른 Error 타입 이름으로 해도 좋을 것 같다는 개인적인 의견입니다 ~~

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

동의합니다!! 내일 데일리 스크럼 이후에 에러와 Logger 관련해서 이야기 나눠보면 좋을 것 같습니다!

@taipaise
Copy link
Collaborator Author

taipaise commented Nov 18, 2024

@choijungp

그른데 파일입출력이 고민이라면 .. 이미지 캐싱 ? ㅎㅎ 고려하는 것도 도움이 될까요 ??

이미지 캐싱도 고려중입니다! 다만, 일단 화이트 보드 안에 있다면 해당 이미지를 재사용하여 새로운 이미지 오브젝트를 화면에 표시할 일은 없을 것 같습니다! 이미지의 크기 변화나 위치 변화는 사진이 표시되는 ObjectView의 frame을 바꾸거나, transformation을 이용해 처리할 수 있기 때문입니다!

제가 생각하기에 이미지를 재사용할 수 있는 경우는 아래 한가지만 생각나는데요!! (다른 경우가 있다면 말씀해주시면 감사하겠습니다!)

  • 화이트 보드를 나갔다가 다시 들어왔을때, 화이트 보드의 이미지들이 캐시에 있는 경우

아마 이렇게 되면, 이미지를 구분하기 위한 수단이 추가적으로 필요할 것 같습니다!! 다만, 이 경우 UUID를 통해 이미지를 구분하지는 못할 것 같습니다. 정말 정말 정말 낮은 확률로, 어디선가 UUID를 사용해야 할 때 사용자의 기기에서 수신한 이미지와 같은 UUID를 생성할 수 있기 때문입니다!!
화이트 보드 재입장까지 고려한다면, 캐시 정책은 좋은 것 같습니다!!

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.

고생 많으셨습니다!!

사진을 PhotoDirectory에 저장하고 url(path)를 통해 가져오는 것으로 이해 했습니다.
해당 사진을 가져오는 방법에 대한 좋은 아이디어를 갖고있지는 않은데요, 다만 현재 방법이라면 사진을 계속해서 기기에 저장하게 될 것으로 이해해서 그럴경우 photoDirectory를 관리하는 방법을 고려해봐야하지 않을까라는 생각을 하게 되었습니다!

제가 잘못 이해한 부분이 있다면 코멘트 남겨주시면 감사하겠습니다!!

@@ -6,7 +6,7 @@
//
import Foundation

public class DrawingObject: WhiteboardObject {
public final class DrawingObject: 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.

이런 실수를! 이런 실수를! 이런 실수를!
바로 붙이겠습니다~!~!

@taipaise
Copy link
Collaborator Author

사진을 PhotoDirectory에 저장하고 url(path)를 통해 가져오는 것으로 이해 했습니다. 해당 사진을 가져오는 방법에 대한 좋은 아이디어를 갖고있지는 않은데요, 다만 현재 방법이라면 사진을 계속해서 기기에 저장하게 될 것으로 이해해서 그럴경우 photoDirectory를 관리하는 방법을 고려해봐야하지 않을까라는 생각을 하게 되었습니다!

확실히 필요하다고 생각합니다!! 요것도 정책적인 부분일 것 같아서 회의 때 간단하게 이야기 나눠보면 좋을 것 같습니다!!

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.

고생하셨습니다~~
뭔가 갑자기 생각난건데, 이미지를 다운스케일링 하는 기능이 나중에 추가될 수도 있다는 생각이 드네용

@taipaise
Copy link
Collaborator Author

@ekrud99

고생하셨습니다~~ 뭔가 갑자기 생각난건데, 이미지를 다운스케일링 하는 기능이 나중에 추가될 수도 있다는 생각이 드네용

맞습니다,, 아직 multipeer로 인터넷 연결 없어 어디까지 보낼 수 있는지 미지수라,, 추후 jpg 이미지를 가지고 올 때 compressionQuality를 설정해 가져오면 될 것 같습니다!!
jpegData(compressionQuality:

@taipaise taipaise merged commit 35c267f into develop Nov 19, 2024
2 checks passed
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.

[Feature] 사진 오브젝트 설계
4 participants