Skip to content

차트 - 신규 상장 코인 판별 및 도메인/스크롤 보정 (배지 포함)#587

Merged
aldalddl merged 8 commits intodevfrom
feat/chart-newly-listed-handling-ald
Oct 2, 2025
Merged

차트 - 신규 상장 코인 판별 및 도메인/스크롤 보정 (배지 포함)#587
aldalddl merged 8 commits intodevfrom
feat/chart-newly-listed-handling-ald

Conversation

@aldalddl
Copy link
Member

@aldalddl aldalddl commented Oct 2, 2025

#️⃣ 연관된 이슈

📝 작업 내용

  • 로직: 상장 코인 빈 공간 스크롤 문제를 해결하기 위해 신규 상장 코인 판별 로직 추가
    • ChartViewModelisNewlyListed 플래그 추가
    • prices.count >= 1440(=24h) 이면 무조건 false
    • 최초 로드(loadPrices)와 증분 갱신(refreshLatestCandles) 후 매번 재평가
  • UI: 신규 상장 코인인 경우 기존의 24시간 도메인/스크롤 대신 보유하고 있는 데이터 구간만 보여주도록 수정
    • xAxisDomain(for:)
      신규 상장(true): 데이터 있는 구간만
      신규 상장이 아닌 경우(false): 기존 동작 유지 (now-24h)
  • 공통 헤더뷰에 신규 상장 로직 연동
    • HeaderView: isNewlyListed 파라미터 추가
    • ChartView: onNewlyListedChange 콜백, isNewlyListed 변화 부모로 전파
    • CoinDetailView: 콜백을 받아 ChartView로 전달
    • MarketView: 배지 상태 보관 후 HeaderView에 주입, 코인 전환시 초기화

스크린샷 (선택)

💬 리뷰 요구사항(선택)

  • 신규 상장 케이스
    • 24h 미만 데이터
    • X축이 보유하고 있는 데이터 구간만 보임
    • 스크롤도 데이터 범위 밖으로 안 나감
  • 비신규(충분한 데이터) 케이스
    • X축이 최근 기준 24h 구간이 보임
    • 스크롤 동작 기존과 동일

@aldalddl aldalddl self-assigned this Oct 2, 2025
@aldalddl aldalddl added the Feature 기능 관련 작업 label Oct 2, 2025
@aldalddl aldalddl linked an issue Oct 2, 2025 that may be closed by this pull request
@aldalddl aldalddl added this to iCo Oct 2, 2025
@leekangho0 leekangho0 moved this to 시작 전 in iCo Oct 2, 2025
Copy link
Member

@kanghun1121 kanghun1121 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

// 도메인 우측 정렬: 오른쪽 여백은 '도메인 < 24h'일 땐 0, 그 외엔 +5m
let rightPad: TimeInterval = (domainSpan < 24*60*60) ? 0 : initialRightPadding
let initialCenter = lastCandleTime.addingTimeInterval(rightPad - initialLength / 2)
_centerOfVisibleXRange = State(initialValue: initialCenter)
Copy link
Member

Choose a reason for hiding this comment

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

centerOfVisibleXRange = initialCenter

로 사용하는 것과 어떤 차이가 있나요?

Copy link
Member Author

Choose a reason for hiding this comment

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

@State는 init에서 값(centerOfVisibleXRange)을 직접 넣을 수 없고 _centerOfVisibleXRange = State(initialValue:)로 감싸 만들어야해서 사용한 것인데, 그냥 보편적인 방법인 onAppear에서 값을 세팅하는 방법이 가장 좋은 것 같습니다.
onAppear 세팅 방식으로 변경했습니다.

Copy link
Collaborator

@leekangho0 leekangho0 left a comment

Choose a reason for hiding this comment

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

아래는 코드 리뷰 및 질문하신 State 직접 생성 부분에 대한 평가입니다.


변경 사항 요약

  • 신규 상장(24h 미만 데이터) 코인에 대한 Candle Chart UX 개선

    • X축 도메인, 초기 스크롤, 오른쪽 패딩 등에서 신규 상장 코인(데이터 구간이 24시간 미만)과 일반 코인을 구분해 처리.
    • 신규 상장 코인은 오른쪽 여백 없이 데이터 구간만 꽉 차게 보여줌.
    • ViewModel에서 isNewlyListed 플래그 추가, 데이터 갱신 시 자동 판별.
  • 코드 구조 개선 및 Guard 문 활용

    • 데이터가 없는 경우와 있는 경우 분기 처리 명확화.
    • 24시간 미만/이상일 때 분기 처리 명확화.

상세 리뷰

CandleChartView.swift

State 직접 생성 코드

_centerOfVisibleXRange = State(initialValue: initialCenter)

이 부분은 SwiftUI에서

@State private var centerOfVisibleXRange: Date

와 같은 State 프로퍼티를 생성자에서 직접 초기화할 때 사용하는 테크닉입니다.

장점

  • 데이터에 따라 초깃값을 유연하게 지정할 수 있음 (특히 외부에서 파라미터로 전달받는 값 기반).
  • View 초기 상태를 정밀하게 조정 가능.

단점 및 대안

  • State 프로퍼티는 SwiftUI에서 View가 생성될 때만 값을 세팅합니다. 이후 View가 리로드되어도 생성자 초기화 코드는 실행되지 않습니다.
  • 만약 데이터가 변경되어 다시 초기화가 필요할 경우, State 값이 제대로 갱신되지 않을 수 있습니다.
  • 일반적으로 @State는 선언과 동시에 값 할당( = )하는 패턴이 권장되며, 생성자에서 직접 State를 만드는 것은 특수한 상황 외에는 잘 사용하지 않습니다.

대안

  • @StateObject, @ObservedObject, @binding 등 다른 SwiftUI 상태 관리 방법을 사용할 수 있습니다.
  • 만약 데이터가 외부에서 바뀔 때마다 초기화가 필요하다면, 아래와 같은 패턴을 고려할 수 있습니다.
    • onAppear 또는 .onChange(of:)에서 값을 갱신
    • ViewModel의 Published 프로퍼티를 바인딩하여 값 변경 감지

예시:

@State private var centerOfVisibleXRange: Date = initialValue

// 혹은
.onChange(of: data) { newData in
    centerOfVisibleXRange = calculateInitialCenter(newData)
}

결론

  • 현재 방식은 "초기값이 데이터에 따라 달라야 하며, 값이 View 생성 시점에만 필요하다"면 쓸 수 있는 패턴입니다.
  • 그러나 대부분의 경우, State를 생성자에서 직접 만들기보다는 선언과 동시에 초기화하거나, 외부 상태와 바인딩하여 동적으로 관리하는 것이 더 SwiftUI스럽고 안전합니다.
  • 만약 CandleChartView가 재사용되거나, 데이터가 바뀔 때마다 State 재초기화가 필요하다면, 위 대안을 사용하는 것이 좋습니다.

ViewModel/ChartViewModel.swift

  • 신규 상장 판별 로직과 상태 관리가 명확하게 잘 추가됨.
  • 코드의 의도가 잘 드러나며, 가드 처리도 적절합니다.
  • 24시간 미만/이상 분기 처리, 데이터 없는 경우 등 엣지 케이스도 잘 커버되어 있습니다.

제안 사항

  1. State 직접 생성 부분

    • 만약 CandleChartView가 데이터 변경 시 재초기화를 요구한다면,
      • @Binding, ObservableObject, .onAppear, .onChange(of:) 등을 활용해서 State 값이 동적으로 갱신되도록 하는 것이 더 좋습니다.
    • 그렇지 않고, View가 최초 한 번만 생성되고 내부 State가 계속 유지되어야 한다면, 현재 방식도 문제는 없습니다.
  2. 코드 가독성

    • 신규 상장 관련 분기마다 주석이 잘 달려 있어 이해하기 쉽습니다.
    • ViewModel에서 상태 관리가 깔끔하게 분리되어 있습니다.

결론

  • 전체적으로 UX 개선 의도가 명확하게 반영된 좋은 코드입니다.
  • State 직접 생성 방식은 특수한 상황에 적합하지만, 데이터 변경 시 동적 초기화가 필요하다면 SwiftUI의 상태 관리 패턴을 더 적극적으로 활용하는 것이 바람직합니다.
  • 나머지 코드 구조 및 분기 처리, 상태 관리 모두 안정적이며 가독성도 좋습니다.

추가적으로 궁금한 점이나 세부 케이스가 있다면 말씀해 주세요!

@aldalddl aldalddl changed the title 차트 - 신규 상장 코인 판별 및 도메인/스크롤 보정 (배지 미포함) 차트 - 신규 상장 코인 판별 및 도메인/스크롤 보정 (배지 포함) Oct 2, 2025
@aldalddl aldalddl force-pushed the feat/chart-newly-listed-handling-ald branch from c001e03 to a660690 Compare October 2, 2025 07:15
@aldalddl aldalddl merged commit a80b7a4 into dev Oct 2, 2025
@github-project-automation github-project-automation bot moved this from 시작 전 to 완료 in iCo Oct 2, 2025
@jihyeonjjang jihyeonjjang removed this from iCo Oct 13, 2025
@ibcylon ibcylon deleted the feat/chart-newly-listed-handling-ald branch November 4, 2025 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feature 기능 관련 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[F-Report] 상장 코인 빈 공간 스크롤

4 participants