-
Notifications
You must be signed in to change notification settings - Fork 0
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
Conversation
@@ -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 */, |
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.
이 코드 패치에서는 특정 파일에 대한 변경 내용이 포함되어 있습니다. 변경 내용은 빌드 파일 및 파일 참조 목록에 새로운 항목을 추가하는 것입니다.
버그의 위험성과 개선 제안은 코드 패치 자체만으로는 파악하기 어렵습니다. 빌드 설정 또는 다른 파일들에 대한 정보가 없어서 전반적인 시스템 상황을 알 수 없기 때문입니다.
코드 패치의 단편적인 내용만으로는 구체적인 버그나 개선 사항을 진단하기가 어렵습니다. 코드 전체와 해당 코드를 사용하는 다른 부분을 고려해야 하며, 실행 환경, 의존성, 요구 사항 등을 고려해야합니다.
} | ||
} else { | ||
return "날짜 변환 실패" | ||
return "알 수 없음" | ||
} | ||
} | ||
} |
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.
이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다.
-
코드 변경:
- "시간을 불러올 수 없습니다." 메시지 대신 "알 수 없음" 메시지가 반환됩니다. 이 변경은 에러 조건을 더 범용적으로 처리하기 위한 것으로 보입니다.
-
개선 제안:
- 주석이나 코드 자체에 언어 정보가 없으므로, 코드 작성자의 의도와 사용되는 컨텍스트를 명확하게 표시하는 것이 좋습니다.
- 코드 스타일 및 가독성을 개선하기 위해 적절한 들여쓰기와 공백 사용을 확인하십시오.
- 함수 또는 해당 코드 조각의 동작을 설명하는 주석을 추가하는 것이 도움이 될 수 있습니다.
위의 내용은 코드 리뷰와 개선 제안입니다. 실제 버그나 오류 위험 요소가 있는지는 코드 조각만으로는 판단하기 어렵습니다. 전체 코드의 맥락과 다른 부분과의 상호작용을 고려하여 코드를 평가하는 것이 더 바람직합니다.
] // title이 선택되지 않았을 때 폰트, 색상 설정 | ||
} | ||
tabBarItem.setTitleTextAttributes(attributes, for: .normal) | ||
} | ||
} |
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.
아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 또는 개선 제안이 있다면 환영합니다.
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 { |
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.
이 코드 패치의 문제점 및 개선 제안은 다음과 같습니다:
- 새로 추가된
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 | ||
} | ||
} |
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.
위의 코드 패치를 간단하게 코드 리뷰해 드리겠습니다. 가능한 버그 위험과 개선 제안 사항을 알려드리겠습니다.
이 코드는 JSON 형식으로 되어 있습니다. 주어진 코드 조각은 이미지 파일의 정보와 작성자 및 버전 정보를 포함하고 있습니다. 주된 목적은 이미지 파일에 대한 정보를 나열하는 것으로 보입니다.
버그 위험 및 개선 제안:
- 주어진 코드 조각은 크게 문제가 없어 보입니다. 하지만 파일 이름 확장자가 이미지 파일 유형을 나타내도록 표준화하는 것이 도움이 될 수 있습니다. 예를 들어, ".png" 대신에 "@1x.png", "@2x.png", "@3x.png" 와 같은 네이밍 규칙을 사용할 수 있습니다. 이렇게 하면 파일 이름만으로도 각 이미지의 배율을 알 수 있어 유지 관리가 더 쉬워집니다.
간략한 코드 리뷰를 마치겠습니다! 추가 질문이 있거나 도움이 필요하시면 언제든지 말씀해주세요.
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.
P3
답글 좋아요까지! 고생하셨습니다!!!!
] // title이 선택되지 않았을 때 폰트, 색상 설정 | ||
} | ||
tabBarItem.setTitleTextAttributes(attributes, for: .normal) | ||
} |
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.
P3
탭바 커스텀 좋네요~!
struct CommentLikeRequestDTO: Encodable { | ||
let notificationTriggerType: String | ||
let notificationText: String | ||
} |
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.
코드 리뷰를 해드리겠습니다.
-
주석: 좋은 시작입니다. 코드에 대한 설명과 파일 정보를 알려줄 수 있습니다.
-
import Foundation: 필요한 라이브러리를 정확하게 임포트하고 있습니다.
-
struct CommentLikeRequestDTO: Encodable: 이 구조체는 Encodable 프로토콜을 준수하고 있습니다. 데이터를 인코딩할 수 있는 형태로 만들기 위해 사용됩니다.
-
let notificationTriggerType: String, let notificationText: String: 두 가지 속성을 가진 구조체입니다. 문자열 형식의 notificationTriggerType과 notificationText를 나타냅니다.
개선 제안:
-
구조체 이름: CommentLikeRequestDTO라는 이름은 순전히 목적을 설명하기보다는 데이터 전송 객체(Data Transfer Object)를 나타내는 DTO에 의존하는 네이밍입니다. 객체의 역할과 책임을 보다 명확하게 전달할 수 있는 이름으로 변경하는 것도 고려해 볼만합니다.
-
변수 이름: 변수 이름이 설명적이며 목적을 쉽게 이해할 수 있습니다. 현재의 변수 이름은 어떤 유형의 알림을 나타내는지 자세히 설명하지 않으므로, 변수 이름에 더 많은 정보를 포함할 수 있도록 개선하는 것이 좋습니다.
-
주석: 코드의 목적에 대한 설명으로 좋은 시작을 했지만, 코드 일부에 대한 설명이 부족한 것 같습니다. 특히, 이 DTO가 어떤 용도로 사용되는지와 관련된 정보를 추가하는 것이 유용할 수 있습니다.
-
현재 코드에서 오류나 버그의 위험이 크게 보이지 않습니다. 다만, 나중에 사용하는 곳에서 해당 구조체에 필수인 속성값이 누락될 수 있는지 확인해보시고, 필요에 따라 옵셔널 속성으로 정의하는 것도 고려해 볼 수 있습니다.
요약하자면, 코드가 간결하고 보완할 사항이 그리 많지 않아 보입니다. 단지 구조체 및 변수 이름, 코드에 대한 주석의 개선을 통해 가독성을 향상시킬 수 있을 것입니다.
@objc | ||
func profileButton() { | ||
ProfileButtonAction() | ||
} | ||
} |
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.
이 코드 패치에는 몇 가지 개선점과 버그 위험이 있습니다:
- 변수 및 메서드 이름은 케밥 표기법 대신 카멜 표기법을 사용하는 것이 좋습니다. 예를 들어,
KebabButtonAction
을kebabButtonAction
으로 변경하세요. ProfileButtonAction
은 옵셔널로 선언되지 않았으며, 기본값이 제공되지 않았으므로 나중에 액션을 할당하기 전에 nil 체크를 해야 합니다. 이 문제를 해결하려면 해당 프로퍼티를 옵셔널로 선언하고 초기화할 때 기본값을 지정하세요.image.isUserInteractionEnabled = true
를 추가한 것은 이미지 뷰에 탭 동작을 추가하기 위한 것입니다. 그러나 해당 이미지 뷰를 탭할 때profileButton
메서드가 호출되도록 설정되었는지 확인해야 합니다.HomeCollectionViewCell
의showButtons
,likeToggleButton
,transparentShowPopupButton
및profileButton
메서드 내에서 해당 액션 클로저를 호출하기 전에 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 |
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.
코드 리뷰를 해드리겠습니다:
-
viewWillDisappear(_:) 메서드에서
self.navigationController?.navigationBar.backgroundColor = .clear
코드를 추가하는 것은 좋은 개선 사항입니다. 이전 뷰 컨트롤러에서 숨겨진 네비게이션 바를 보여줄 때 배경색을 클리어로 설정하여 일관성을 유지하는 데 도움이 됩니다. -
postLikeButtonAPI(isClicked:contentId:) 메서드에서 변수
likeButtonTapped
의 타입을AnyPublisher<(Bool, Int), Never>?
에서let
으로 수정한 것은 좋은 개선입니다. 변수의 값이 한 번 설정되면 변경되지 않으므로let
으로 선언하는 것이 적절합니다. -
output.toggleLikeButton.sink
클로저에서 값을 받는 대신_
를 사용하도록 수정한 것은 앞으로 어떤 값을 출력할 지 신경 쓰지 않을 경우 불필요한 출력을 피하기 위한 개선 사항입니다. -
collectionView(_:cellForItemAt:) 메서드에서
ProfileButtonAction
클로저와 해당 closure 내부에 있는 코드는 읽기 어렵고 축약적이기 때문에 개선할 수 있습니다. 클로저 내부의 로직을 개별 메서드로 추출하고 해당 메서드를 호출하는 방식으로 변경하는 것이 가독성과 유지보수를 향상시킬 수 있습니다. -
cell.profileImageView.load(url:)
코드는 화면에 표시할 프로필 이미지를 로드하는 것입니다. 이 부분은 정상적으로 작동할 수 있는지, 예외 처리가 필요한지 확인해야 합니다. 이 부분과 관련하여 성능 문제나 UI의 지연이 발생할 수 있는지도 주의해야 합니다. -
다른 부분에서 큰 문제점이 보이지 않습니다. 코드 리뷰 후에 소스 코드를 완전히 이해한 후 실제로 실행하는 것이 좋습니다.
@@ -141,7 +141,7 @@ extension HomeViewModel { | |||
body: EmptyBody(), | |||
pathVariables: ["":""] | |||
) | |||
print ("👻👻👻👻👻게시글 좋아요 취소 버튼 클릭👻👻👻👻👻") | |||
print ("👻👻👻👻👻게시물 좋아요 취소 버튼 클릭👻👻👻👻👻") | |||
return data | |||
} | |||
} |
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.
다음은 아래의 코드 패치에 대한 간략한 코드 리뷰입니다. 버그 위험 및 개선 제안을 언급해드리겠습니다.
- 주석 부분을 보면 "게시글"이라는 용어를 "게시물"로 수정한 것으로 보입니다. 이 텍스트 변경은 화면 일관성을 위해 적합한 개선입니다.
- 코드 변경과 관련하여 어떤 버그 위험이나 오작동의 가능성은 보이지 않습니다.
- 모델에서 발생하는 예외 처리에 대한 추가적인 개선을 검토할 수 있습니다. 현재 코드에서는 예외가 발생할 경우
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) | |||
|
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.
아래는 코드 패치입니다. 코드 리뷰를 간단하게 도와드리겠습니다. 버그 위험과/또는 개선 제안이 있을 경우 환영합니다:
- 두 번째 줄에서 "loadUserData()" 함수를 호출하여 사용자 데이터를 로드하고 "memberId" 변수에 저장하고 있습니다. null 값이 반환되거나 "memberId"가 0일 경우를 다루지 않고 있습니다. 필요에 따라 이를 처리하도록 고려해야 합니다.
- 세 번째 줄의 "Just((0, memberId))"에서 (0, memberId) 튜플을 생성하여 입력으로 사용하고 있습니다. 이 때 memberId가 0일 경우에 대한 예외 처리가 필요합니다.
- 그 외에는 전체적으로 코드 리뷰하기에 충분한 정보가 주어지지 않으므로 해당 부분은 확인할 수 없습니다.
추가적인 정보를 제공하시면 보다 자세한 리뷰를 할 수 있습니다.
@objc | ||
private func backButtonPressed() { | ||
self.navigationController?.popViewController(animated: true) | ||
} | ||
} | ||
|
||
// MARK: - Network |
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.
이 코드 패치의 간단한 코드 리뷰를 도와드리겠습니다.
-
memberId
변수는loadUserData()?.memberId ?? 0
로 초기화됩니다. 이 코드에서loadUserData()
함수가 어디에 정의되어 있는지 확인해야 합니다. -
hambergerButton
은 왜 액션 없이 생성되었는지 확인해야 합니다. 사용되지 않을 경우 제거할 수도 있습니다. -
viewWillAppear(_:)
메서드에서self.tabBarController?.tabBar.isHidden
을 설정하는 부분은 두 번 사용되었는데, 한 번으로 축약하여 사용할 수 있습니다. -
viewWillDisappear(_:)
메서드에서statusBarView
와navigationBackButton
의removeFromSuperview()
가 호출됩니다. 이 두 요소가 필요하지 않다면 제거하는 것이 좋습니다. -
setLayout()
메서드에서navigationController?.navigationBar.addSubviews(navigationBackButton)
와 관련된 코드가 있지만,addSubviews(_:)
메서드가 정의되어 있지 않아 추가적인 정보가 필요합니다. -
setAddTarget()
메서드에서navigationBackButton
에 대한 타깃 액션(뒤로 가기)이 설정되어 있지만, 해당 액션 메서드가 구현되지 않았습니다. 필요하다면 구현해야 합니다. -
bindViewModel()
메서드에서MyPageViewModel.Input
의viewUpdate
입력값으로(1, self.memberId)
이 전달되는데,viewUpdate
입력값의 타입 및 기능을 확인해야 합니다. -
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, |
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.
주어진 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안을 환영합니다.
버그 위험:
- 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 | |||
}() |
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.
이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험과/또는 개선 제안 사항을 언급하겠습니다:
위 변경 내용에서 주요 점은 image.image의 값이 변경되었다는 것입니다. 이전에는 ImageLiterals.Onboarding.imgTwo의 이미지를 설정했다면, 이제는 ImageLiterals.Common.imgProfile의 이미지로 설정하고 있습니다. 이 변경은 충분히 유효한 것으로 보입니다.
개선 제안:
-
UIImageView 객체에 대해서 명시적인 프레임을 설정해보세요. 현재는 프레임이 정의되지 않았거나 layoutSubviews() 메서드에서 조정되고 있지 않아서 뷰 크기에 따라 예상치 못한 결과가 발생할 수 있습니다.
-
이미지 로드와 관련된 작업은 비동기로 처리하는 것이 좋습니다. 외부 데이터 소스에서 이미지를 가져오거나 큰 이미지 파일을 로딩하는 경우, 앱의 응답성을 유지하기 위해 비동기 방식을 고려해야 합니다.
-
이미지 리소스에 대한 네임스페이스 및 구조를 검토해보세요. 현재는 "Onboarding" 및 "Common"으로 분류되어 있는 것으로 보입니다. 모든 이미지가 적절하게 그룹화되어 있는지 확인하고, 필요에 따라 리소스 관리를 개선하는 것이 좋습니다.
-
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) | |||
} | |||
} | |||
|
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.
아래는 코드 패치에 대한 간단한 코드 리뷰입니다. 버그 위험과/또는 개선 제안을 환영합니다:
- SnapKit을 추가한 점은 좋은 개선이 될 수 있습니다. SnapKit은 Auto Layout 코드를 작성하는 데 도움이 되는 라이브러리입니다.
import Combine
명령문을 추가하지 않아 문제가 될 수 있습니다.Combine
프레임워크를 사용하고 있다면, 해당 프레임워크를 임포트해야 합니다.myView
를 없애고view
에 직접 할당하는 것이 좋을 수 있습니다.loadView()
메서드를 삭제하고PostDetailView()
를view
로 할당하세요.bindPostData(data:)
에서postView.profileImageView
의 이미지를 설정하는 부분을 보강할 필요가 있습니다.data.memberProfileUrl
에 있는 URL을 사용하여 프로필 이미지를 로드해야 합니다.getAPI()
메서드에서commentLikeButtonTapped
매개변수가nil
로 전달되어 코드가 작동하지 않을 수 있습니다. 이 매개변수를 옵셔널 처리하거나 적절한 값을 전달해야 합니다.getAPI()
와postCommentLikeButtonAPI(isClicked:commentId:commentText:)
에서transform(from:cancelBag)
메서드를 호출하고 있습니다. 이 메서드가 실제로 어떤 동작을 수행하는지 검토해야 합니다.UICollectionViewDataSource
를 채택한 확장에UICollectionViewDelegateFlowLayout
도 추가하는 것이 좋습니다.collectionView(_:layout:referenceSizeForFooterInSection:)
에서 사용되는24.adjusted
는 알려진 조정 메서드인지 확인해야 합니다.24.adjustedH
와 같은 적절한 조정 값으로 대체하는 것이 좋습니다.
이외에도 전반적인 코드 품질과 의도된 동작을 확인하는 것이 좋습니다.
body: EmptyBody(), | ||
pathVariables: ["":""] | ||
) | ||
print ("👻👻👻👻👻답글 좋아요 취소 버튼 클릭👻👻👻👻👻") | ||
return data | ||
} catch { | ||
return nil |
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.
이 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.
버그 위험 및 개선 제안:
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 | |||
}() | |||
|
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.
이 코드 패치에 대해 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안 사항을 환영합니다.
-
이 코드 패치에서는
image
View의 이미지를 설정하고 있습니다.image.image
줄에서ImageLiterals.Common.imgProfile
이미지를 설정하도록 변경되었습니다. -
주의할 점은
ImageLiterals.Common.imgProfile
이미지가 현재 사용 가능한지 확인하는 것입니다. 해당 이미지가 올바르게 로드되는지 또는 파일 경로가 올바른지 확인해야 합니다. 필요한 경우, 이미지 경로를 업데이트해야 할 수도 있습니다. -
리소스 관련 작업 외에도, 이 코드 블록은 그 자체로 완전해보입니다. 다른 메서드 또는 변수 사용 여부 등은 확인할 수 없으므로, 해당 패치가 다른 부분(메서드, 변수 등)과 잘 통합되어 있는지 확인하는 것이 중요합니다.
-
이 코드만으로는 해당 View의 모든 측면을 파악하기 어렵습니다. 이 코드의 상위 부분과 하단에서 해당 View에 대한 조작 또는 레이아웃 설정이 있는지 확인하세요. 전체적인 컨텍스트를 고려하여 코드를 검토하는 것이 중요합니다.
이상입니다! 문제가 있거나 개선해야 할 부분을 찾지 못한 것 같습니다. 추가 질문이 있으면 언제든지 물어보세요!
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.
고생했습니다 ㅠㅠㅜㅠㅠㅜ 짱짱👻👍🥺
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 | ||
} |
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.
P3
나중에 시간 되면 따로 함수로 빼줘도 좋을 거 같아요!
@@ -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 */, |
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.
이 코드 패치는 다음과 같은 변경 사항을 포함하고 있습니다:
- 새 파일
CommentLikeRequestDTO.swift
가 프로젝트에 추가되었습니다.
리뷰 및 개선 제안:
- 보여진 부분에서는 큰 문제나 버그 위험이 보이지 않습니다.
- 단순히 파일을 추가한 것으로 보입니다. 실제 파일의 내용은 보여지지 않으므로 세부적인 검토는 어렵습니다.
- 코드베이스 전체를 고려하여 추가된 파일이 올바른 위치에 있는지 확인해야 합니다.
- 변경 내용의 커밋 메시지에서 목적과 이유를 명확하게 설명하는 것이 좋습니다.
추가적인 정보가 제공되지 않아서 더 자세한 리뷰는 어렵습니다.
@objc | ||
func profileButton() { | ||
ProfileButtonAction() | ||
} | ||
} |
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.
해당 코드 패치를 간단히 검토해보겠습니다.
-
코드 변경 사항:
- 새로운
ProfileButtonAction
변수가 추가되었습니다. image
의 기본 이미지로UIImage.checkmark
대신ImageLiterals.Common.imgProfile
이 사용됩니다.image
에isUserInteractionEnabled
속성이 추가되었습니다.profileImageView
에UITapGestureRecognizer
가 추가되었습니다.
- 새로운
-
버그 리스크와 개선 제안:
- 코드 패치에서는 명확한 버그 리스크는 드러나지 않습니다.
- 개선 제안으로는 다음 사항을 고려할 수 있습니다:
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 |
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.
제시된 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.
-
viewWillDisappear(_ animated: Bool) 메서드에서
self.navigationController?.navigationBar.backgroundColor = .clear
코드를 사용하여 네비게이션 바의 배경색을 투명하게 설정하는 것은 좋은 접근입니다. 그러나 같은 기능을 하는 코드가 해당 뷰 컨트롤러 밖 다른 위치에서 사용되는지 확인해야 합니다. 중복된 코드가 없다면, 이 코드를 제거하는 것도 고려할 수 있습니다. -
postLikeButtonAPI(isClicked: Bool, contentId: Int) 메서드에서
likeButtonTapped
변수를 최초 한 번만 생성하고 있다는 주석을 확인했습니다. 그러나 실제로는let likeButtonTapped: AnyPublisher<(Bool, Int), Never>? = Just(())
으로 항상 새로운 인스턴스를 생성하고 있습니다. 이 상수를 최초에 한 번만 생성하도록 수정하는 것이 더 나을 수 있습니다. -
toggleLikeButton closure에서 출력문을 삭제하고 있습니다. 출력이 필요하지 않다면 단순히
{ _ in }
으로 변경할 수 있습니다. -
ProfileButtonAction 클로저와 TransparentButtonAction 클로저 내의 코드는 말할 것이 없어 보입니다. 현재 로직에 따라 올바르게 작동한다면 문제 없을 것입니다.
-
profileImageView.load(url: viewModel.postData[indexPath.row].memberProfileUrl) 구문에서,
load
메서드는 어떻게 정의되어 있는지 확인해야 합니다. 필요한 경우 해당 메서드에서 예외 처리를 포함하는지 확인해야 합니다.
이외에는 제시된 코드 패치에서 큰 문제점을 발견하지 못했습니다. 위의 내용들을 고려하여 코드를 개선하시면 될 것입니다.
@objc | ||
private func backButtonPressed() { | ||
self.navigationController?.popViewController(animated: true) | ||
} | ||
} | ||
|
||
// MARK: - Network |
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.
아래는 코드 패치입니다. 이에 대한 간단한 코드 리뷰를 도와드리겠습니다. 버그 위험 및 개선 제안 등을 환영합니다:
@@ -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 | |||
}() |
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.
이 코드 패치에 대해 간단한 코드 검토를 도와드리겠습니다. 버그 위험과/또는 개선 제안 사항을 환영합니다.
코드의 변경 내용은 다음과 같습니다:
- 42번 줄에서 사용된 이미지
ImageLiterals.Onboarding.imgTwo
가ImageLiterals.Common.imgProfile
로 변경되었습니다.
개선 제안:
let image = UIImageView()
를 클래스의 상단으로 이동하여 해당 뷰를 한 번만 초기화하고 재사용할 수 있도록 변경할 수 있습니다.image.contentMode
와image.clipsToBounds
의 값 설정 후에 이미지를 할당하도록 코드를 변경하는 것이 좋습니다.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) | |||
} | |||
} | |||
|
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.
아래는 코드 패치입니다. 짧은 코드 리뷰와 버그 위험 및 개선 제안을 도와드리겠습니다.
- 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이 아닌 값을 받을 수 있게 변경하는 것이 좋습니다.- 코드 스타일과 가독성을 향상시킬 수 있는 몇 가지 사소한 개선 사항이 있을 수 있습니다.
👻 PULL REQUEST
💻 작업한 내용
💡 참고사항
📸 스크린샷
토글 API
📟 관련 이슈