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

refactor: 카테고리, 일시 선택 순서 변경 및 리팩터링 (스타카토 생성/수정) #564 #567

Merged
merged 59 commits into from
Jan 11, 2025

Conversation

s6m1n
Copy link
Member

@s6m1n s6m1n commented Dec 8, 2024

⭐️ Issue Number

🚩 Summary

스타카토 생성/수정 화면의 카테고리, 일시 관련 로직에 아래의 작업들을 수행했습니다.

  • 카테고리, 일시 선택 순서 변경
  • 카테고리, 일시 선택 코드 리팩터링
  • 카테고리, 일시 선택 로직 테스트 추가

리팩터링 내용 정리

생성 화면

  1. fetchMemoryCandidates()로 사용자의 모든 추억을 불러와 _memoryCandidates를 업데이트 합니다.
  2. 이 때 _memoryCandidates는 최초 한 번 업데이트된 후엔 변하지 않습니다.
  3. memoryCandidates.observe 람다에서 initMemoryAndVisitedAt()를 수행하여 일시, 추억의 초기값을 세팅합니다.
    1. 메인 화면에서 생성 (memoryId == 0L)
      • 일시 먼저 초기화 → LocalDateTime.now() (선택 가능한 일시 범위는 selectedVisitedAt ±10년)
      • 일시를 기준으로 추억을 초기화 → updateMemoryCandidateAndVisitedAt()
      • 일시가 바뀌면 추억을 다시 세팅
    2. 추억 화면에서 생성 (memoryId를 알고 있는 경우)
      • 추억 먼저 초기화 → memoryId가 일치하는 추억으로 고정
      • 추억을 기준으로 일시를 초기화 → 추억 기간 안에서 'LocalDate.now()'와 가장 인접한 날짜 선택 (MemoryCandidategetClosestDateTime() 참고)
      • 선택 가능한 일시 범위는 추억 기간으로 세팅

수정 화면

  1. 사용자의 모든 추억을 불러옵니다. (fetchMemoryCandidates())
  2. 수정 대상인 스타카토의 정보를 불러옵니다. (fetchStaccatoBy())
  3. 불러온 스타카토 정보로 추억, 일시를 초기화 합니다.
  4. 일시가 바뀌면 추억을 다시 세팅합니다.

🛠️ Technical Concerns

스타카토 생성/수정 ViewModel 테스트

MVVM 구조의 뷰모델 내부 LiveData 값을 테스트하기 위해 아래 Rule을 설정하고 getOrAwaitValue를 추가했습니다.

    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @get:Rule
    val mainDispatcherRule = MainDispatcherRule()

또한 mockK의 coEvery와 coroutines.test의 runTest를 사용했습니다.

🙂 To Reviewer

s6m1n added 24 commits December 1, 2024 21:35
 변수명 변경 및 public 함수 리팩터링
- initMemoryAndVisitedAt() : memoryId에 따라 일시, 추억을 초기화
- setMemoryCandidateByVisitedAt() : 일시에 따라 추억을 설정
- initMemoryAndVisitedAt() : 스타카토에 따라 일시, 추억을 초기화
- setMemoryCandidateByVisitedAt() : 일시에 따라 추억을 설정
@s6m1n s6m1n added android We are android>< refactor 리팩토링 (변수 및 메서드 네이밍 변경) ✅ test 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음) labels Dec 8, 2024
@s6m1n s6m1n self-assigned this Dec 8, 2024
Copy link
Contributor

@hxeyexn hxeyexn left a comment

Choose a reason for hiding this comment

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

정말정말정말정말 고생 많으셨습니다!!!🥹👏 빙티 쵝오 🫶❤️‍🔥😘
도메인 테스트를 정말 꼼꼼히 작성해주셨네요!! 💯

사소한 코멘트 몇개 남겨뒀습니당~ 정말 사소한 내용이니 시간 되실 때 편하게 읽어주세요!
크게 수정해야할 부분은 더 이상 보지 않아서 이만 Approve하도록 하겠습니다!

너무 고생하셨습니다!!!!!!!!!!!!!!!

Group 48096807

Copy link
Contributor

Choose a reason for hiding this comment

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

테스트 작성을 정말 꼼꼼하게 해주셨네요! 👍

// 2024년은 윤년이라 2월이 29일까지 있다
val expected = (1..29).toList()
val actual = DateCalendar.of(2024, 2).availableDates
assertEquals(expected, actual)
Copy link
Contributor

Choose a reason for hiding this comment

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

CallAdapter가 머지된 후에 JUnit5로 마이그레이션해보는 것도 좋을 것 같네용!

Comment on lines +72 to +81
fun `범위보다 작으면 가장 첫번째 월을 반환한다`(targetMonth: Int) {
val firstMonth = 4
val actual = aprilToAugustCalendar.getClosestMonth(targetMonth)

assertEquals(firstMonth, actual)
}

@Test
@Parameters(method = "monthParametersGraterThan8")
fun `범위보다 크면 가장 마지막 월을 반환한다`(targetMonth: Int) {
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
Contributor

@Junyoung-WON Junyoung-WON left a comment

Choose a reason for hiding this comment

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

진짜 혼또니 완전 너무나 엄청나게 어메이징 고생 많았습니다...!! 😭
정말 모든 리뷰를 다 반영해주셨네요.... 리뷰 양도 많았고 우테코 미션보다도 규모가 더 커서 리뷰 반영이 많이 힘드셨을텐데, 정말 고생많았고 또 감사합니다!!! 🙇‍♂️🙇‍♂️🙇‍♂️

더이상 피드백드릴게 없을 것 같아요! 드디어 Approve를.. 머지를 해보자구요!

이제는 리뷰 일정과 분량을 생각해서 효율적으로 리뷰를 해봅시다ㅎㅎ🥲
그저 갓티!!!!

Comment on lines +20 to +26
@Test
fun `기간의 시작과 끝을 정하지 않으면 2025년 2월의 모든 일을 반환한다`() {
// 2025년은 2월 28일까지 있다
val expected = (1..28).toList()
val actual = DateCalendar.of(2025, 2).availableDates
assertEquals(expected, actual)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

윤년인 경우와 아닌 경우도 함께 테스트로 넣어주셨네요! 👍

DateCalendar.of(2024, 2, periodStart, periodEnd)
}

@Test(expected = IllegalArgumentException::class)
Copy link
Contributor

Choose a reason for hiding this comment

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

어노테이션의 파라미터로 예외 발생을 테스트할 수 있군요...? 😮 👍

@s6m1n s6m1n merged commit 5b2c344 into develop Jan 11, 2025
1 check passed
@hxeyexn hxeyexn deleted the feature/#564-refactor-category-datetime-selection branch January 11, 2025 15:08
Copy link
Contributor

@linirini linirini left a comment

Choose a reason for hiding this comment

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

제 눈에는 좋아 보여요~
고생 많았슴당 빙티!!

@linirini linirini added this to the sprint-9 milestone Jan 12, 2025
Copy link
Contributor

@Ho-Tea Ho-Tea left a comment

Choose a reason for hiding this comment

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

확실히 코드가 더 개선된 것 같네요 👍
고생하셨습니다 빙티 🙇‍♂️

Copy link
Contributor

@BurningFalls BurningFalls left a comment

Choose a reason for hiding this comment

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

고생 많으셨습니다 빙티!! 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
android We are android>< refactor 리팩토링 (변수 및 메서드 네이밍 변경) ✅ test 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

refactor: 카테고리, 일시 선택 순서 변경 및 리팩터링 (스타카토 생성/수정)
6 participants