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

Network [#100] 답글 좋아요 및 답글 좋아요 삭제 API 연결 및 UI 세부사항 수정 #103

Merged
merged 10 commits into from
Jan 18, 2024

Conversation

Heyjooo
Copy link
Collaborator

@Heyjooo Heyjooo commented Jan 18, 2024

👻 PULL REQUEST

💻 작업한 내용

  • 답글 좋아요 API 연결
  • 답글 좋아요 삭제 API 연결
  • HomeViewController 세부사항 수정
  • PostViewController 세부사항 수정

💡 참고사항

  • 프로필 부분 모두 서버에서 URL 받아올 수 있게 바꾸어주었습니다!

📸 스크린샷

기능 스크린샷
답글 좋아요
토글 API

📟 관련 이슈

@Heyjooo Heyjooo self-assigned this Jan 18, 2024
@Heyjooo Heyjooo changed the title Network [#10] 답글 좋아요 및 답글 좋아요 삭제 API 연결 및 UI 세부사항 수정 Network [#100] 답글 좋아요 및 답글 좋아요 삭제 API 연결 및 UI 세부사항 수정 Jan 18, 2024
@@ -1225,6 +1228,7 @@
3CF184D12B4EFF9900816D5F /* MyPageProfileView.swift in Sources */,
2A51831A2B571CC400B43BA8 /* NotificationList.swift in Sources */,
3C61931B2B3A7AD000220CEB /* NetworkError.swift in Sources */,
2A5D68F82B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift in Sources */,
2F05B1B72B57F1FD00AC368D /* WriteReplyRequestDTO.swift in Sources */,
3CBF99272B549C7D0015FE4B /* WriteViewModel.swift in Sources */,
3C70BE332B53EF92001AA5A6 /* MyPageViewModel.swift in Sources */,

Choose a reason for hiding this comment

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

이 코드 패치에서는 특정 파일에 대한 변경 내용이 포함되어 있습니다. 변경 내용은 빌드 파일 및 파일 참조 목록에 새로운 항목을 추가하는 것입니다.

버그의 위험성과 개선 제안은 코드 패치 자체만으로는 파악하기 어렵습니다. 빌드 설정 또는 다른 파일들에 대한 정보가 없어서 전반적인 시스템 상황을 알 수 없기 때문입니다.

코드 패치의 단편적인 내용만으로는 구체적인 버그나 개선 사항을 진단하기가 어렵습니다. 코드 전체와 해당 코드를 사용하는 다른 부분을 고려해야 하며, 실행 환경, 의존성, 요구 사항 등을 고려해야합니다.

}
} else {
return "날짜 변환 실패"
return "알 수 없음"
}
}
}

Choose a reason for hiding this comment

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

이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다.

  1. 코드 변경:

    • "시간을 불러올 수 없습니다." 메시지 대신 "알 수 없음" 메시지가 반환됩니다. 이 변경은 에러 조건을 더 범용적으로 처리하기 위한 것으로 보입니다.
  2. 개선 제안:

    • 주석이나 코드 자체에 언어 정보가 없으므로, 코드 작성자의 의도와 사용되는 컨텍스트를 명확하게 표시하는 것이 좋습니다.
    • 코드 스타일 및 가독성을 개선하기 위해 적절한 들여쓰기와 공백 사용을 확인하십시오.
    • 함수 또는 해당 코드 조각의 동작을 설명하는 주석을 추가하는 것이 도움이 될 수 있습니다.

위의 내용은 코드 리뷰와 개선 제안입니다. 실제 버그나 오류 위험 요소가 있는지는 코드 조각만으로는 판단하기 어렵습니다. 전체 코드의 맥락과 다른 부분과의 상호작용을 고려하여 코드를 평가하는 것이 더 바람직합니다.

] // title이 선택되지 않았을 때 폰트, 색상 설정
}
tabBarItem.setTitleTextAttributes(attributes, for: .normal)
}
}

Choose a reason for hiding this comment

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

아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 또는 개선 제안이 있다면 환영합니다.

  • statusBarHeight 함수: 코드는 잘 작동하는 것 같습니다. 그러나 상수 20을 직접 사용하는 대신 UIApplication.shared.windows 배열의 첫 번째 요소가 키 윈도우인지 확인하고 이에 해당하는 statusBarManager에서 statusBarFrame.height를 가져오는 방식은 안전하지 않을 수 있습니다. iOS 15부터는 다중 윈도우를 지원하기 때문에 첫 번째 요소가 항상 기준 창이 아닐 수 있습니다. 대신 UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height를 사용하는 것이 좋습니다.
  • applyTabBarAttributes 함수: 선택 여부에 따라 UITabBarItem의 속성을 설정하는 함수로 보입니다. 변수 attributes를 선언하고 선택된 경우와 그렇지 않은 경우에 대해 다른 값을 할당합니다. 이 코드도 작동할 것 같습니다. 개선할 사항은 없어 보입니다.

전반적으로, 코드에는 큰 문제가 보이지 않습니다. 하지만 첫 번째 함수에서 기준 창을 올바르게 가져오기 위해 약간의 수정이 필요합니다.

@@ -12,6 +12,7 @@ enum ImageLiterals {
static var btnBack: UIImage { .load(name: "btn_back") }
static var logoSymbol: UIImage { .load(name: "logo_symbol") }
static var imgProfile: UIImage { .load(name: "img_profile") }
static var btnBackGray: UIImage { .load(name: "btn_back_gray") }
}

enum TabBar {

Choose a reason for hiding this comment

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

이 코드 패치의 문제점 및 개선 제안은 다음과 같습니다:

  1. 새로 추가된 btnBackGray 이미지 리터럴에 대한 코드가 잘못된 위치에 있습니다. ImageLiterals 열거형 내부에서 해당 이미지를 선언하는 것이 좋습니다.

수정 예시:

enum ImageLiterals {
     static var btnBack: UIImage { .load(name: "btn_back") }
     static var logoSymbol: UIImage { .load(name: "logo_symbol") }
     static var imgProfile: UIImage { .load(name: "img_profile") }
}

// 새로 추가된 이미지 리터럴 추가
extension ImageLiterals {
    static var btnBackGray: UIImage { .load(name: "btn_back_gray") }
}

변경 후, btnBackGray 이미지는 ImageLiterals.btnBackGray로 접근할 수 있습니다.

이외에는 패치 코드에 큰 문제는 보이지 않습니다. 이 코드는 이미지 리소스를 로드하는 간단한 기능을 제공하는 것으로 보입니다. 리뷰가 끝나면 전체 코드와 함께 더 자세한 피드백을 제공할 수도 있습니다.

"author" : "xcode",
"version" : 1
}
}

Choose a reason for hiding this comment

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

위의 코드 패치를 간단하게 코드 리뷰해 드리겠습니다. 가능한 버그 위험과 개선 제안 사항을 알려드리겠습니다.

이 코드는 JSON 형식으로 되어 있습니다. 주어진 코드 조각은 이미지 파일의 정보와 작성자 및 버전 정보를 포함하고 있습니다. 주된 목적은 이미지 파일에 대한 정보를 나열하는 것으로 보입니다.

버그 위험 및 개선 제안:

  1. 주어진 코드 조각은 크게 문제가 없어 보입니다. 하지만 파일 이름 확장자가 이미지 파일 유형을 나타내도록 표준화하는 것이 도움이 될 수 있습니다. 예를 들어, ".png" 대신에 "@1x.png", "@2x.png", "@3x.png" 와 같은 네이밍 규칙을 사용할 수 있습니다. 이렇게 하면 파일 이름만으로도 각 이미지의 배율을 알 수 있어 유지 관리가 더 쉬워집니다.

간략한 코드 리뷰를 마치겠습니다! 추가 질문이 있거나 도움이 필요하시면 언제든지 말씀해주세요.

Copy link
Member

@boogios boogios left a comment

Choose a reason for hiding this comment

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

P3
답글 좋아요까지! 고생하셨습니다!!!!

] // title이 선택되지 않았을 때 폰트, 색상 설정
}
tabBarItem.setTitleTextAttributes(attributes, for: .normal)
}
Copy link
Member

Choose a reason for hiding this comment

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

P3
탭바 커스텀 좋네요~!

struct CommentLikeRequestDTO: Encodable {
let notificationTriggerType: String
let notificationText: String
}

Choose a reason for hiding this comment

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

코드 리뷰를 해드리겠습니다.

  1. 주석: 좋은 시작입니다. 코드에 대한 설명과 파일 정보를 알려줄 수 있습니다.

  2. import Foundation: 필요한 라이브러리를 정확하게 임포트하고 있습니다.

  3. struct CommentLikeRequestDTO: Encodable: 이 구조체는 Encodable 프로토콜을 준수하고 있습니다. 데이터를 인코딩할 수 있는 형태로 만들기 위해 사용됩니다.

  4. let notificationTriggerType: String, let notificationText: String: 두 가지 속성을 가진 구조체입니다. 문자열 형식의 notificationTriggerType과 notificationText를 나타냅니다.

개선 제안:

  1. 구조체 이름: CommentLikeRequestDTO라는 이름은 순전히 목적을 설명하기보다는 데이터 전송 객체(Data Transfer Object)를 나타내는 DTO에 의존하는 네이밍입니다. 객체의 역할과 책임을 보다 명확하게 전달할 수 있는 이름으로 변경하는 것도 고려해 볼만합니다.

  2. 변수 이름: 변수 이름이 설명적이며 목적을 쉽게 이해할 수 있습니다. 현재의 변수 이름은 어떤 유형의 알림을 나타내는지 자세히 설명하지 않으므로, 변수 이름에 더 많은 정보를 포함할 수 있도록 개선하는 것이 좋습니다.

  3. 주석: 코드의 목적에 대한 설명으로 좋은 시작을 했지만, 코드 일부에 대한 설명이 부족한 것 같습니다. 특히, 이 DTO가 어떤 용도로 사용되는지와 관련된 정보를 추가하는 것이 유용할 수 있습니다.

  4. 현재 코드에서 오류나 버그의 위험이 크게 보이지 않습니다. 다만, 나중에 사용하는 곳에서 해당 구조체에 필수인 속성값이 누락될 수 있는지 확인해보시고, 필요에 따라 옵셔널 속성으로 정의하는 것도 고려해 볼 수 있습니다.

요약하자면, 코드가 간결하고 보완할 사항이 그리 많지 않아 보입니다. 단지 구조체 및 변수 이름, 코드에 대한 주석의 개선을 통해 가독성을 향상시킬 수 있을 것입니다.

@objc
func profileButton() {
ProfileButtonAction()
}
}

Choose a reason for hiding this comment

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

이 코드 패치에는 몇 가지 개선점과 버그 위험이 있습니다:

  1. 변수 및 메서드 이름은 케밥 표기법 대신 카멜 표기법을 사용하는 것이 좋습니다. 예를 들어, KebabButtonActionkebabButtonAction으로 변경하세요.
  2. ProfileButtonAction은 옵셔널로 선언되지 않았으며, 기본값이 제공되지 않았으므로 나중에 액션을 할당하기 전에 nil 체크를 해야 합니다. 이 문제를 해결하려면 해당 프로퍼티를 옵셔널로 선언하고 초기화할 때 기본값을 지정하세요.
  3. image.isUserInteractionEnabled = true를 추가한 것은 이미지 뷰에 탭 동작을 추가하기 위한 것입니다. 그러나 해당 이미지 뷰를 탭할 때 profileButton 메서드가 호출되도록 설정되었는지 확인해야 합니다.
  4. HomeCollectionViewCellshowButtons, likeToggleButton, transparentShowPopupButtonprofileButton 메서드 내에서 해당 액션 클로저를 호출하기 전에 nil 체크를 수행하는 것이 안전합니다. 이렇게 하면 해당 액션이 할당되지 않았거나 nil일 경우 충돌 없이 처리됩니다.

이 외에는 주요한 버그 리스크가 보이지 않습니다.


cell.TransparentButtonAction = {
self.alarmTriggerType = cell.alarmTriggerType
self.targetMemberId = cell.targetMemberId
self.alarmTriggerdId = cell.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)
}
cell.profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl)
cell.nicknameLabel.text = viewModel.postData[indexPath.row].memberNickname
cell.transparentLabel.text = "투명도 \(viewModel.postData[indexPath.row].memberGhost)%"
cell.contentTextLabel.text = viewModel.postData[indexPath.row].contentText

Choose a reason for hiding this comment

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

코드 리뷰를 해드리겠습니다:

  1. viewWillDisappear(_:) 메서드에서 self.navigationController?.navigationBar.backgroundColor = .clear 코드를 추가하는 것은 좋은 개선 사항입니다. 이전 뷰 컨트롤러에서 숨겨진 네비게이션 바를 보여줄 때 배경색을 클리어로 설정하여 일관성을 유지하는 데 도움이 됩니다.

  2. postLikeButtonAPI(isClicked:contentId:) 메서드에서 변수 likeButtonTapped의 타입을 AnyPublisher<(Bool, Int), Never>?에서 let으로 수정한 것은 좋은 개선입니다. 변수의 값이 한 번 설정되면 변경되지 않으므로 let으로 선언하는 것이 적절합니다.

  3. output.toggleLikeButton.sink 클로저에서 값을 받는 대신 _를 사용하도록 수정한 것은 앞으로 어떤 값을 출력할 지 신경 쓰지 않을 경우 불필요한 출력을 피하기 위한 개선 사항입니다.

  4. collectionView(_:cellForItemAt:) 메서드에서 ProfileButtonAction 클로저와 해당 closure 내부에 있는 코드는 읽기 어렵고 축약적이기 때문에 개선할 수 있습니다. 클로저 내부의 로직을 개별 메서드로 추출하고 해당 메서드를 호출하는 방식으로 변경하는 것이 가독성과 유지보수를 향상시킬 수 있습니다.

  5. cell.profileImageView.load(url:) 코드는 화면에 표시할 프로필 이미지를 로드하는 것입니다. 이 부분은 정상적으로 작동할 수 있는지, 예외 처리가 필요한지 확인해야 합니다. 이 부분과 관련하여 성능 문제나 UI의 지연이 발생할 수 있는지도 주의해야 합니다.

  6. 다른 부분에서 큰 문제점이 보이지 않습니다. 코드 리뷰 후에 소스 코드를 완전히 이해한 후 실제로 실행하는 것이 좋습니다.

@@ -141,7 +141,7 @@ extension HomeViewModel {
body: EmptyBody(),
pathVariables: ["":""]
)
print ("👻👻👻👻👻게시글 좋아요 취소 버튼 클릭👻👻👻👻👻")
print ("👻👻👻👻👻게시물 좋아요 취소 버튼 클릭👻👻👻👻👻")
return data
}
}

Choose a reason for hiding this comment

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

다음은 아래의 코드 패치에 대한 간략한 코드 리뷰입니다. 버그 위험 및 개선 제안을 언급해드리겠습니다.

  • 주석 부분을 보면 "게시글"이라는 용어를 "게시물"로 수정한 것으로 보입니다. 이 텍스트 변경은 화면 일관성을 위해 적합한 개선입니다.
  • 코드 변경과 관련하여 어떤 버그 위험이나 오작동의 가능성은 보이지 않습니다.
  • 모델에서 발생하는 예외 처리에 대한 추가적인 개선을 검토할 수 있습니다. 현재 코드에서는 예외가 발생할 경우 nil을 반환하고 있습니다. 이 예외 처리를 좀 더 구체화하거나, 실패 시 추적 정보 등을 로깅하는 방법을 고려해볼 수도 있습니다.

이상이 코드 리뷰입니다. 혹시 추가로 궁금한 사항이 있으시면 언제든지 물어보십시오!

@@ -181,7 +181,8 @@ extension MyPageAccountInfoViewController {
}

private func bindViewModel() {
let input = MyPageViewModel.Input(viewUpdate: Just((0)).eraseToAnyPublisher())
let memberId = loadUserData()?.memberId ?? 0
let input = MyPageViewModel.Input(viewUpdate: Just((0, memberId )).eraseToAnyPublisher())

let output = viewModel.transform(from: input, cancelBag: cancelBag)

Choose a reason for hiding this comment

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

아래는 코드 패치입니다. 코드 리뷰를 간단하게 도와드리겠습니다. 버그 위험과/또는 개선 제안이 있을 경우 환영합니다:

  • 두 번째 줄에서 "loadUserData()" 함수를 호출하여 사용자 데이터를 로드하고 "memberId" 변수에 저장하고 있습니다. null 값이 반환되거나 "memberId"가 0일 경우를 다루지 않고 있습니다. 필요에 따라 이를 처리하도록 고려해야 합니다.
  • 세 번째 줄의 "Just((0, memberId))"에서 (0, memberId) 튜플을 생성하여 입력으로 사용하고 있습니다. 이 때 memberId가 0일 경우에 대한 예외 처리가 필요합니다.
  • 그 외에는 전체적으로 코드 리뷰하기에 충분한 정보가 주어지지 않으므로 해당 부분은 확인할 수 없습니다.

추가적인 정보를 제공하시면 보다 자세한 리뷰를 할 수 있습니다.

@objc
private func backButtonPressed() {
self.navigationController?.popViewController(animated: true)
}
}

// MARK: - Network

Choose a reason for hiding this comment

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

이 코드 패치의 간단한 코드 리뷰를 도와드리겠습니다.

  1. memberId 변수는 loadUserData()?.memberId ?? 0로 초기화됩니다. 이 코드에서 loadUserData() 함수가 어디에 정의되어 있는지 확인해야 합니다.

  2. hambergerButton은 왜 액션 없이 생성되었는지 확인해야 합니다. 사용되지 않을 경우 제거할 수도 있습니다.

  3. viewWillAppear(_:) 메서드에서 self.tabBarController?.tabBar.isHidden을 설정하는 부분은 두 번 사용되었는데, 한 번으로 축약하여 사용할 수 있습니다.

  4. viewWillDisappear(_:) 메서드에서 statusBarViewnavigationBackButtonremoveFromSuperview()가 호출됩니다. 이 두 요소가 필요하지 않다면 제거하는 것이 좋습니다.

  5. setLayout() 메서드에서 navigationController?.navigationBar.addSubviews(navigationBackButton)와 관련된 코드가 있지만, addSubviews(_:) 메서드가 정의되어 있지 않아 추가적인 정보가 필요합니다.

  6. setAddTarget() 메서드에서 navigationBackButton에 대한 타깃 액션(뒤로 가기)이 설정되어 있지만, 해당 액션 메서드가 구현되지 않았습니다. 필요하다면 구현해야 합니다.

  7. bindViewModel() 메서드에서 MyPageViewModel.InputviewUpdate 입력값으로 (1, self.memberId)이 전달되는데, viewUpdate 입력값의 타입 및 기능을 확인해야 합니다.

  8. backButtonPressed() 메서드에서 뒤로 가기 버튼을 눌렀을 때의 동작이 구현되어 있습니다.

이외에도 코드에서 해당하지 않거나 알 수 없는 부분이 있습니다. 필요한 경우 해당 내용에 대한 추가 정보를 제공하면 더욱 정확한 리뷰를 제공할 수 있습니다.

@@ -156,7 +156,7 @@ extension MyPageViewModel {
}
}

private func getMemberCommentAPI(accessToken: String, memberId: String) async throws -> BaseResponse<[MyPageMemberCommentResponseDTO]>? {
private func getMemberCommentAPI(accessToken: String, memberId: Int) async throws -> BaseResponse<[MyPageMemberCommentResponseDTO]>? {
do {
let result: BaseResponse<[MyPageMemberCommentResponseDTO]>? = try await self.networkProvider.donNetwork(
type: .get,

Choose a reason for hiding this comment

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

주어진 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안을 환영합니다.

버그 위험:

  • memberID 변수의 초기값을 0으로 설정해주는 부분에서, loadUserData() 함수가 nil을 반환할 경우 memberID가 0으로 유지될 수 있습니다. 이에 대한 처리가 필요합니다.
  • viewUpdate 입력값이 (Int, Int) 형태로 변경되었지만, sink에서 value를 체크하는 부분에서 아직 해당 변경이 적용되지 않아 수정이 필요합니다.

개선 제안:

  • 뷰 모델 내의 상태 데이터를 직접 업데이트하는 대신, Output으로 스트림을 노출하고 뷰에서 이를 구독하여 업데이트하도록 변경할 수 있습니다. 이렇게 하면 코드의 가독성과 유지 관리성이 향상될 수 있습니다.
  • API 호출 시에 발생할 수 있는 오류 처리에 대한 추가 구현을 고려해 볼 수 있습니다. 예외 상황에 대한 명시적인 처리를 추가하여 안전성을 향상시킬 수 있습니다.

참고로, 제 답변은 지금은 한국어로 작성되었습니다. 더 깊은 내용에 대해서는 원하는 언어로 다시 질문해주시기 바랍니다.

@@ -34,7 +34,7 @@ final class PostReplyCollectionViewCell: UICollectionViewCell, UICollectionViewR
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.clipsToBounds = true
image.image = ImageLiterals.Onboarding.imgTwo
image.image = ImageLiterals.Common.imgProfile
image.layer.cornerRadius = 22.adjusted
return image
}()

Choose a reason for hiding this comment

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

이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험과/또는 개선 제안 사항을 언급하겠습니다:

위 변경 내용에서 주요 점은 image.image의 값이 변경되었다는 것입니다. 이전에는 ImageLiterals.Onboarding.imgTwo의 이미지를 설정했다면, 이제는 ImageLiterals.Common.imgProfile의 이미지로 설정하고 있습니다. 이 변경은 충분히 유효한 것으로 보입니다.

개선 제안:

  1. UIImageView 객체에 대해서 명시적인 프레임을 설정해보세요. 현재는 프레임이 정의되지 않았거나 layoutSubviews() 메서드에서 조정되고 있지 않아서 뷰 크기에 따라 예상치 못한 결과가 발생할 수 있습니다.

  2. 이미지 로드와 관련된 작업은 비동기로 처리하는 것이 좋습니다. 외부 데이터 소스에서 이미지를 가져오거나 큰 이미지 파일을 로딩하는 경우, 앱의 응답성을 유지하기 위해 비동기 방식을 고려해야 합니다.

  3. 이미지 리소스에 대한 네임스페이스 및 구조를 검토해보세요. 현재는 "Onboarding" 및 "Common"으로 분류되어 있는 것으로 보입니다. 모든 이미지가 적절하게 그룹화되어 있는지 확인하고, 필요에 따라 리소스 관리를 개선하는 것이 좋습니다.

  4. Adjusted 값을 사용하는 image.layer.cornerRadius = 22.adjusted 코드의 경우, 해당 속성이 어떻게 계산되고 있는지 확인해보세요. 조정된 값이 예상대로 적용되는지 확인하여 UI에서 깔끔한 둥근 테두리를 보여줄 수 있도록 해야 합니다.

위 제안 사항을 참조하여 코드를 개선할 수 있습니다.

@@ -427,7 +445,7 @@ extension PostViewController: UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {

return CGSize(width: UIScreen.main.bounds.width, height: 24.adjusted)
return CGSize(width: UIScreen.main.bounds.width, height: 24.adjustedH)
}
}

Choose a reason for hiding this comment

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

아래는 코드 패치에 대한 간단한 코드 리뷰입니다. 버그 위험과/또는 개선 제안을 환영합니다:

  1. SnapKit을 추가한 점은 좋은 개선이 될 수 있습니다. SnapKit은 Auto Layout 코드를 작성하는 데 도움이 되는 라이브러리입니다.
  2. import Combine 명령문을 추가하지 않아 문제가 될 수 있습니다. Combine 프레임워크를 사용하고 있다면, 해당 프레임워크를 임포트해야 합니다.
  3. myView를 없애고 view에 직접 할당하는 것이 좋을 수 있습니다. loadView() 메서드를 삭제하고 PostDetailView()view로 할당하세요.
  4. bindPostData(data:)에서 postView.profileImageView의 이미지를 설정하는 부분을 보강할 필요가 있습니다. data.memberProfileUrl에 있는 URL을 사용하여 프로필 이미지를 로드해야 합니다.
  5. getAPI() 메서드에서 commentLikeButtonTapped 매개변수가 nil로 전달되어 코드가 작동하지 않을 수 있습니다. 이 매개변수를 옵셔널 처리하거나 적절한 값을 전달해야 합니다.
  6. getAPI()postCommentLikeButtonAPI(isClicked:commentId:commentText:)에서 transform(from:cancelBag) 메서드를 호출하고 있습니다. 이 메서드가 실제로 어떤 동작을 수행하는지 검토해야 합니다.
  7. UICollectionViewDataSource를 채택한 확장에 UICollectionViewDelegateFlowLayout도 추가하는 것이 좋습니다.
  8. collectionView(_:layout:referenceSizeForFooterInSection:)에서 사용되는 24.adjusted는 알려진 조정 메서드인지 확인해야 합니다. 24.adjustedH와 같은 적절한 조정 값으로 대체하는 것이 좋습니다.

이외에도 전반적인 코드 품질과 의도된 동작을 확인하는 것이 좋습니다.

body: EmptyBody(),
pathVariables: ["":""]
)
print ("👻👻👻👻👻답글 좋아요 취소 버튼 클릭👻👻👻👻👻")
return data
} catch {
return nil

Choose a reason for hiding this comment

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

이 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.

버그 위험 및 개선 제안:

  • toggleCommentLikeButton과 관련된 코드가 추가되어 있지만, 해당 동작을 처리하는 코드가 누락되어 있습니다. Output 구조체에서 toggleCommentLikeButton을 반환하고, transform(from:cancelBag:) 메서드에서 해당 Publisher를 사용하는 로직을 추가해야 합니다.
  • input.viewUpdate, input.likeButtonTapped, input.collectionViewUpdata는 옵셔널 타입으로 변경되었습니다. 이 변경으로 인해 해당 값이 nil인 경우에 대한 처리를 추가해야 할 수도 있습니다.
  • postUnlikeButtonAPI(contentId:) 메서드가 deleteLikeButtonAPI(contentId:)로 이름이 변경되었습니다. 해당 메서드를 호출하는 부분도 변경해야 합니다.

개선 사항:

  • 코드 스타일과 가독성을 향상시키기 위해 변수 및 메서드의 이름을 좀 더 명확하게 지으면 좋을 것 같습니다.
  • getPostDetailAPI(postId:), getPostReplyAPI(postId:)와 같은 네이밍 컨벤션을 준수하여 메서드명을 변경하는 것이 좋습니다.

이 외에도 코드 리뷰 시 반영할 수 있는 다양한 개선 사항이 있을 수 있습니다. 하지만 주어진 정보만으로는 세부적인 내용을 파악하기 어려워 더 자세한 리뷰는 제공해드리기 어렵습니다.

@@ -29,7 +29,7 @@ final class PostView: UIView {
image.contentMode = .scaleAspectFill
image.clipsToBounds = true
image.layer.cornerRadius = 22.adjusted
image.image = ImageLiterals.Onboarding.imgOne
image.image = ImageLiterals.Common.imgProfile
return image
}()

Choose a reason for hiding this comment

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

이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안 사항을 환영합니다.

  1. 이 코드 패치에서는 image View의 이미지를 설정하고 있습니다. image.image 줄에서 ImageLiterals.Common.imgProfile 이미지를 설정하도록 변경되었습니다.

  2. 주의할 점은 ImageLiterals.Common.imgProfile 이미지가 현재 사용 가능한지 확인하는 것입니다. 해당 이미지가 올바르게 로드되는지 또는 파일 경로가 올바른지 확인해야 합니다. 필요한 경우, 이미지 경로를 업데이트해야 할 수도 있습니다.

  3. 리소스 관련 작업 외에도, 이 코드 블록은 그 자체로 완전해보입니다. 다른 메서드 또는 변수 사용 여부 등은 확인할 수 없으므로, 해당 패치가 다른 부분(메서드, 변수 등)과 잘 통합되어 있는지 확인하는 것이 중요합니다.

  4. 이 코드만으로는 해당 View의 모든 측면을 파악하기 어렵습니다. 이 코드의 상위 부분과 하단에서 해당 View에 대한 조작 또는 레이아웃 설정이 있는지 확인하세요. 전체적인 컨텍스트를 고려하여 코드를 검토하는 것이 중요합니다.

이상입니다! 문제가 있거나 개선해야 할 부분을 찾지 못한 것 같습니다. 추가 질문이 있으면 언제든지 물어보세요!

Copy link
Collaborator

@yeonsu0-0 yeonsu0-0 left a comment

Choose a reason for hiding this comment

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

고생했습니다 ㅠㅠㅜㅠㅠㅜ 짱짱👻👍🥺

Comment on lines +93 to +103
if memberId == loadUserData()?.memberId ?? 0 {
self.navigationItem.title = StringLiterals.MyPage.MyPageNavigationTitle
self.tabBarController?.tabBar.isHidden = false
hambergerButton.isHidden = false
navigationBackButton.isHidden = true
} else {
self.navigationItem.title = ""
self.tabBarController?.tabBar.isHidden = true
hambergerButton.isHidden = true
navigationBackButton.isHidden = false
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

P3
나중에 시간 되면 따로 함수로 빼줘도 좋을 거 같아요!

@Heyjooo Heyjooo merged commit 5f093cc into develop Jan 18, 2024
1 check passed
@@ -1228,6 +1231,7 @@
3CF184D12B4EFF9900816D5F /* MyPageProfileView.swift in Sources */,
2A51831A2B571CC400B43BA8 /* NotificationList.swift in Sources */,
3C61931B2B3A7AD000220CEB /* NetworkError.swift in Sources */,
2A5D68F82B58E9C0000AE1B7 /* CommentLikeRequestDTO.swift in Sources */,
2F05B1B72B57F1FD00AC368D /* WriteReplyRequestDTO.swift in Sources */,
3CBF99272B549C7D0015FE4B /* WriteViewModel.swift in Sources */,
3C70BE332B53EF92001AA5A6 /* MyPageViewModel.swift in Sources */,

Choose a reason for hiding this comment

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

이 코드 패치는 다음과 같은 변경 사항을 포함하고 있습니다:

  1. 새 파일 CommentLikeRequestDTO.swift가 프로젝트에 추가되었습니다.

리뷰 및 개선 제안:

  1. 보여진 부분에서는 큰 문제나 버그 위험이 보이지 않습니다.
  2. 단순히 파일을 추가한 것으로 보입니다. 실제 파일의 내용은 보여지지 않으므로 세부적인 검토는 어렵습니다.
  3. 코드베이스 전체를 고려하여 추가된 파일이 올바른 위치에 있는지 확인해야 합니다.
  4. 변경 내용의 커밋 메시지에서 목적과 이유를 명확하게 설명하는 것이 좋습니다.

추가적인 정보가 제공되지 않아서 더 자세한 리뷰는 어렵습니다.

@Heyjooo Heyjooo deleted the network/#100-getCommentList branch January 18, 2024 10:31
@objc
func profileButton() {
ProfileButtonAction()
}
}

Choose a reason for hiding this comment

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

해당 코드 패치를 간단히 검토해보겠습니다.

  1. 코드 변경 사항:

    • 새로운 ProfileButtonAction 변수가 추가되었습니다.
    • image의 기본 이미지로 UIImage.checkmark 대신 ImageLiterals.Common.imgProfile이 사용됩니다.
    • imageisUserInteractionEnabled 속성이 추가되었습니다.
    • profileImageViewUITapGestureRecognizer가 추가되었습니다.
  2. 버그 리스크와 개선 제안:

    • 코드 패치에서는 명확한 버그 리스크는 드러나지 않습니다.
    • 개선 제안으로는 다음 사항을 고려할 수 있습니다:
      • HomeCollectionViewCell 클래스가 많은 액션과 상태를 가지고 있으므로, 해당 클래스를 조금 더 작고 단순하게 유지하는 것이 좋습니다. 가능하다면 기능을 분리하고 관련성이 있는 작은 클래스나 구조체로 나누는 것이 좋습니다.

코드 패치는 주어진 목적에는 문제가 없어 보이며, 추가 개선 사항이 필요하다고 생각되지 않습니다. 하지만 전반적인 코드 베이스와 프로젝트 요구 사항에 따라 개선 여지가 있을 수 있습니다.


cell.TransparentButtonAction = {
self.alarmTriggerType = cell.alarmTriggerType
self.targetMemberId = cell.targetMemberId
self.alarmTriggerdId = cell.alarmTriggerdId
self.present(self.transparentPopupVC, animated: false, completion: nil)
}
cell.profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl)
cell.nicknameLabel.text = viewModel.postData[indexPath.row].memberNickname
cell.transparentLabel.text = "투명도 \(viewModel.postData[indexPath.row].memberGhost)%"
cell.contentTextLabel.text = viewModel.postData[indexPath.row].contentText

Choose a reason for hiding this comment

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

제시된 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.

  1. viewWillDisappear(_ animated: Bool) 메서드에서 self.navigationController?.navigationBar.backgroundColor = .clear 코드를 사용하여 네비게이션 바의 배경색을 투명하게 설정하는 것은 좋은 접근입니다. 그러나 같은 기능을 하는 코드가 해당 뷰 컨트롤러 밖 다른 위치에서 사용되는지 확인해야 합니다. 중복된 코드가 없다면, 이 코드를 제거하는 것도 고려할 수 있습니다.

  2. postLikeButtonAPI(isClicked: Bool, contentId: Int) 메서드에서 likeButtonTapped 변수를 최초 한 번만 생성하고 있다는 주석을 확인했습니다. 그러나 실제로는 let likeButtonTapped: AnyPublisher<(Bool, Int), Never>? = Just(())으로 항상 새로운 인스턴스를 생성하고 있습니다. 이 상수를 최초에 한 번만 생성하도록 수정하는 것이 더 나을 수 있습니다.

  3. toggleLikeButton closure에서 출력문을 삭제하고 있습니다. 출력이 필요하지 않다면 단순히 { _ in }으로 변경할 수 있습니다.

  4. ProfileButtonAction 클로저와 TransparentButtonAction 클로저 내의 코드는 말할 것이 없어 보입니다. 현재 로직에 따라 올바르게 작동한다면 문제 없을 것입니다.

  5. profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl) 구문에서, load 메서드는 어떻게 정의되어 있는지 확인해야 합니다. 필요한 경우 해당 메서드에서 예외 처리를 포함하는지 확인해야 합니다.

이외에는 제시된 코드 패치에서 큰 문제점을 발견하지 못했습니다. 위의 내용들을 고려하여 코드를 개선하시면 될 것입니다.

@objc
private func backButtonPressed() {
self.navigationController?.popViewController(animated: true)
}
}

// MARK: - Network

Choose a reason for hiding this comment

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

아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안 등을 환영합니다:

@@ -20,6 +20,7 @@ final class MyPageViewController: UIViewController {

private var cancelBag = CancelBag()

변수 viewModel은 어디에서 초기화되는지 확인해야 합니다. 즉, 해당 뷰 컨트롤러의 인스턴스를 생성할 때 어떻게 초기화되는지 확인해야 합니다.

var viewModel: MyPageViewModel
+var memberId: Int = loadUserData()?.memberId ?? 0
코드 전체에서 선언된 함수나 변수가 없기 때문에, loadUserData() 함수에 대한 정의 또는 사용 방법을 알고 있는지 확인해야 합니다.

let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
statusBarView.removeFromSuperview()가 viewWillDisappear(_:) 메서드에서 호출되면서 이를 제거하므로, 추가적인 오브젝트 생성이 필요한지 확인해야 합니다.

생성자에서 사용하는 ImageLiterals.Common.btnBackGray 및 ImageLiterals.MyPage.icnMenu 이미지가 현재 정의되어 있는지 확인해야 합니다.

viewWillAppear(:) 및 viewWillDisappear(:) 메서드에서 self.navigationItem.title과 tabBarController?.tabBar.isHidden 속성, hambergerButton 및 navigationBackButton의 숨김 여부 처리에 대해 확인해야 합니다.

setLayout() 메서드 내에서 self.navigationController?.navigationBar.addSubviews(navigationBackButton)와 navigationBackButton.snp.makeConstraints 등의 레이아웃 작업은 해당 코드에서 제공되지 않았으므로, 추가적인 정보가 필요합니다.

bindViewModel() 메서드에서 MyPageViewModel.Input() 생성자를 통해 viewUpdate 값을 전달하는데, viewUpdate의 타입 및 형식에 대한 정의가 필요합니다.

backButtonPressed() 메서드는 이전 뷰 컨트롤러로 돌아가는 popViewController(animated:) 메서드를 호출하므로, 내비게이션 스택에 이전 뷰 컨트롤러가 있는지 확인해야 합니다.

@@ -42,7 +42,7 @@ final class PostReplyCollectionViewCell: UICollectionViewCell, UICollectionViewR
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.clipsToBounds = true
image.image = ImageLiterals.Onboarding.imgTwo
image.image = ImageLiterals.Common.imgProfile
image.layer.cornerRadius = 22.adjusted
return image
}()

Choose a reason for hiding this comment

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

이 코드 패치에 대해 간단한 코드 검토를 도와드리겠습니다. 버그 위험과/또는 개선 제안 사항을 환영합니다.

코드의 변경 내용은 다음과 같습니다:

  • 42번 줄에서 사용된 이미지 ImageLiterals.Onboarding.imgTwoImageLiterals.Common.imgProfile로 변경되었습니다.

개선 제안:

  1. let image = UIImageView()를 클래스의 상단으로 이동하여 해당 뷰를 한 번만 초기화하고 재사용할 수 있도록 변경할 수 있습니다.
  2. image.contentModeimage.clipsToBounds의 값 설정 후에 이미지를 할당하도록 코드를 변경하는 것이 좋습니다.
  3. image.layer.cornerRadius 값을 상수나 변수로 추출하여 가독성을 높일 수 있습니다.

위의 개선 제안을 참고하여 아래는 개선된 코드 예시입니다:

final class PostReplyCollectionViewCell: UICollectionViewCell, UICollectionViewR {
    private let image: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        imageView.layer.cornerRadius = 22.adjusted
        return imageView
    }()

    // Some other code...

    func configureCell() {
        image.image = ImageLiterals.Common.imgProfile
        // Configure other properties of the cell
    }

    // Some other code...
}

위의 예시는 더욱 효율적인 초기화 방법을 제공하고, 코드를 명확하게 분리하여 가독성을 향상시킵니다.

@@ -466,7 +485,7 @@ extension PostViewController: UICollectionViewDataSource, UICollectionViewDelega

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {

return CGSize(width: UIScreen.main.bounds.width, height: 24.adjusted)
return CGSize(width: UIScreen.main.bounds.width, height: 24.adjustedH)
}
}

Choose a reason for hiding this comment

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

아래는 코드 패치입니다. 짧은 코드 리뷰와 버그 위험 및 개선 제안을 도와드리겠습니다.

  • SnapKit 라이브러리를 추가로 import 하고 있습니다.
  • UIKit과 Combine도 import 되어야 합니다.
  • loadView() 함수가 제거되었습니다.
  • myView 변수가 제거되고, 대신 postView 변수가 추가되었습니다.
  • commentLikeButtonTapped 변수가 nil로 설정되어 있습니다. 입력 값으로 commentLikeButtonTapped를 받아 처리하는 것이 좋을 수 있습니다.
  • bindPostData(data:) 함수에서 postView.profileImageView의 이미지를 로드하는 부분이 추가되었습니다.
  • postCommentLikeButtonAPI(isClicked:commentId:commentText:) 함수가 추가되었습니다. 이 함수를 사용하여 댓글에 좋아요 버튼을 클릭할 때의 API 호출을 처리할 수 있습니다.
  • cell.LikeButtonAction 클로저 안에서 좋아요 버튼 클릭 여부(cell.isLiked)에 따라 좋아요 숫자(cell.likeNumLabel.text)가 변경되고 이미지(cell.likeButton.setImage(_:for:))도 변경됩니다.
  • collectionView(_:cellForItemAt:) 메서드에서 댓글 셀을 구성할 때 좋아요 버튼의 이미지와 클릭 여부가 설정되도록 변경되었습니다.

개선 사항:

  • UIKit, Combine, SnapKit을 모두 필요한 곳에서 임포트 되도록 수정해야 합니다.
  • commentLikeButtonTapped 변수를 nil이 아닌 값을 받을 수 있게 변경하는 것이 좋습니다.
  • 코드 스타일과 가독성을 향상시킬 수 있는 몇 가지 사소한 개선 사항이 있을 수 있습니다.

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

Successfully merging this pull request may close these issues.

[Network] 답글 좋아요 및 답글 좋아요 삭제 API 연결 및 UI 세부사항 수정
3 participants