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 Refactoring] Day 열거형 타입을 Codable 처리 #276

Merged
merged 6 commits into from
Apr 11, 2023

Conversation

WhiteHyun
Copy link
Member

📌 PR 요약

🌱 작업한 내용

Day라는 타입을 Codable하도록 만들었고, 요일을 받거나 요청하는 모델에 String타입 대신 Day타입을 받도록 처리했습니다.
이렇게 함으로써 String에서 Day로 파싱하는 단계를 없앨 수 있었고, 파싱하는 모델인 Ex+String도 삭제했습니다.
Day에서 한글과 영어로 바꾸기 위한 Compute Property에서 eng를 담당하는 값을 rawValue가 갖도록 처리했습니다.

정리

리팩토링 하면서 얻은 이점

  1. String에서 Day로 파싱하는 단계를 제거할 수 있었음
  2. 파일 구성을 줄일 수 있게 되었음
  3. String으로 받던 것을 Day로 처리하게 되면서 타입이 명확해졌음

단점

  1. 주도적인 리팩토링이었기에 기존에 구상했던 코드가 있었다면, 당황스러울 수 있음

필요한 리팩토링이라 생각하여 구현하였으나, 전달드리지 않은 상태에서 여러분의 로직을 일부 수정하게 되어 죄송한 말씀을 드립니다.
해당 코드를 확인하시고, 잘못된 점이 있거나 하면 언제든 리뷰 넣어주세요. 제가 테스트했을 때는 전부 정상적으로 동작했으나, 제가 놓친 부분도 있을 수 있기에 여러분의 관심이 필요합니다 :)

📮 관련 이슈

Day라는 열거형이 존재하지만, Codable을 준수하는 모델에서는 `Day`를 받지않고 `String`타입을 받고 있었습니다.
그렇게 String타입을 받고 다시 Day로 파싱하는 과정이 불필요한 과정이라 생각하여
API를 파싱하여 받을 때 Day로 받도록 처리했습니다.
이 과정에서 String extension을 제거할 수 있었고, day가 갖고있는 compute property도 깔끔하게 정리할 수 있었습니다.
@WhiteHyun WhiteHyun added ✋ Help wanted Extra attention is needed D+2 일반적인 범주의 PR이에요. 이틀 이내에 리뷰 해주시면 됩니다 ♻️Refactoring labels Apr 10, 2023
@WhiteHyun WhiteHyun requested review from dlrjswns and soobin-k April 10, 2023 11:16
@WhiteHyun WhiteHyun self-assigned this Apr 10, 2023
Copy link
Contributor

@soobin-k soobin-k left a comment

Choose a reason for hiding this comment

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

예전에 건준님이랑 데이터 포맷이 달라서 저 Day enum을 만들었던 것 같아요!
승현님이 리팩토링해주신 부분은 서버에서 영어로 내려줄 때만 적용 가능할 것 같습니다!

@@ -31,7 +31,7 @@ struct DetailRecruitmentResponse: Codable {
let mainImage: String?

/// 플러빙 모임 요일
let days: [String]
let days: [Day]
Copy link
Contributor

Choose a reason for hiding this comment

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

승현님 이거 서버에서 한글로 내려줬던 것 같아서 이렇게 파싱하면 안될 것 같습니다!!
모임 생성할때는 영어로 보내고 (["MON", "TUE"])
모집글 상세 조회 시엔 한글로 내려왔던 것 같아요!
"days": [
"목",
"금",
"토",
"일"
],

Copy link
Member Author

@WhiteHyun WhiteHyun Apr 11, 2023

Choose a reason for hiding this comment

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

헉 확인했습니다..! 모집 상세 조회에서만 그러는 거군요..

이 녀석 하나로 인해 String으로 바꾸기에는 리스크(?)가 커서, Decoder로 Day로 받도록 처리할 수는 있을 것 같아요.

이 쪽은 제가 한 번 알아보고 건드려보겠습니다..!
고마워요 수빈님 ☺️

Copy link
Member Author

@WhiteHyun WhiteHyun Apr 11, 2023

Choose a reason for hiding this comment

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

Decoder를 이용해서 String으로 파싱 한 뒤 Day로 초기화하는 작업을 거쳐 정상적으로 값이 들어오도록 처리했습니다.

  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    
    // codes ...
    days = try container.decode([String].self, forKey: .days).compactMap { Day(rawValue: $0) }
    // codes ...
  }

모집 상세 조회 시 요일이 잘 들어오는 것을 확인할 수 있었습니다!

요일이 한글로 들어오면서 Day가 파싱되지 않는 버그가 발생했습니다.
해결하기 위해 decoder를 이용하여 String으로 파싱한 뒤 Day로 초기화하는 작업을 거쳤습니다.
@WhiteHyun WhiteHyun requested a review from soobin-k April 11, 2023 02:14
Copy link
Contributor

@soobin-k soobin-k left a comment

Choose a reason for hiding this comment

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

헛 빠르게 수정해주셔서 너무 감사드립니다!!
앞으로도 서버 응답값이 다른데 하나의 enum을 사용하는 경우 발생하면, 승현님이 사용한 방식 적용해보겠습니다!!

name = try container.decode(String.self, forKey: .name)
goal = try container.decode(String.self, forKey: .goal)
mainImage = try container.decodeIfPresent(String.self, forKey: .mainImage)
days = try container.decode([String].self, forKey: .days).compactMap { Day(rawValue: $0) }
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

Comment on lines +20 to +32
init?(rawValue: String) {
switch rawValue {
case "월", "MON": self = .monday
case "화", "TUE": self = .tuesday
case "수", "WED": self = .wednesday
case "목", "THR": self = .thursday
case "금", "FRI": self = .friday
case "토", "SAT": self = .saturday
case "일", "SUN": self = .sunday
case "전체", "요일 무관", "ALL": self = .all
default: return nil
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

아이디어 너무 좋은 것 같습니다!!

Copy link
Member Author

Choose a reason for hiding this comment

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

감사합니다 ☺️

@WhiteHyun WhiteHyun merged commit afaf8a3 into develop Apr 11, 2023
@WhiteHyun WhiteHyun deleted the feat/255-Network/DayRefactoring branch April 11, 2023 15:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
D+2 일반적인 범주의 PR이에요. 이틀 이내에 리뷰 해주시면 됩니다 ✋ Help wanted Extra attention is needed ♻️Refactoring
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants