Merged
Conversation
kanghun1121
reviewed
Oct 2, 2025
| // 도메인 우측 정렬: 오른쪽 여백은 '도메인 < 24h'일 땐 0, 그 외엔 +5m | ||
| let rightPad: TimeInterval = (domainSpan < 24*60*60) ? 0 : initialRightPadding | ||
| let initialCenter = lastCandleTime.addingTimeInterval(rightPad - initialLength / 2) | ||
| _centerOfVisibleXRange = State(initialValue: initialCenter) |
Member
There was a problem hiding this comment.
centerOfVisibleXRange = initialCenter
로 사용하는 것과 어떤 차이가 있나요?
Member
Author
There was a problem hiding this comment.
@State는 init에서 값(centerOfVisibleXRange)을 직접 넣을 수 없고 _centerOfVisibleXRange = State(initialValue:)로 감싸 만들어야해서 사용한 것인데, 그냥 보편적인 방법인 onAppear에서 값을 세팅하는 방법이 가장 좋은 것 같습니다.
onAppear 세팅 방식으로 변경했습니다.
leekangho0
approved these changes
Oct 2, 2025
Collaborator
leekangho0
left a comment
There was a problem hiding this comment.
아래는 코드 리뷰 및 질문하신 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시간 미만/이상 분기 처리, 데이터 없는 경우 등 엣지 케이스도 잘 커버되어 있습니다.
제안 사항
-
State 직접 생성 부분
- 만약 CandleChartView가 데이터 변경 시 재초기화를 요구한다면,
@Binding,ObservableObject,.onAppear,.onChange(of:)등을 활용해서 State 값이 동적으로 갱신되도록 하는 것이 더 좋습니다.
- 그렇지 않고, View가 최초 한 번만 생성되고 내부 State가 계속 유지되어야 한다면, 현재 방식도 문제는 없습니다.
- 만약 CandleChartView가 데이터 변경 시 재초기화를 요구한다면,
-
코드 가독성
- 신규 상장 관련 분기마다 주석이 잘 달려 있어 이해하기 쉽습니다.
- ViewModel에서 상태 관리가 깔끔하게 분리되어 있습니다.
결론
- 전체적으로 UX 개선 의도가 명확하게 반영된 좋은 코드입니다.
- State 직접 생성 방식은 특수한 상황에 적합하지만, 데이터 변경 시 동적 초기화가 필요하다면 SwiftUI의 상태 관리 패턴을 더 적극적으로 활용하는 것이 바람직합니다.
- 나머지 코드 구조 및 분기 처리, 상태 관리 모두 안정적이며 가독성도 좋습니다.
추가적으로 궁금한 점이나 세부 케이스가 있다면 말씀해 주세요!
- visibleLength = min(48m, domainSpan) (최소 1분 가드) - init 시 초기 center도 domainSpan 기반으로 계산
c001e03 to
a660690
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#️⃣ 연관된 이슈
📝 작업 내용
ChartViewModel에isNewlyListed플래그 추가prices.count >= 1440(=24h)이면 무조건falseloadPrices)와 증분 갱신(refreshLatestCandles) 후 매번 재평가xAxisDomain(for:)신규 상장(
true): 데이터 있는 구간만신규 상장이 아닌 경우(
false): 기존 동작 유지 (now-24h)HeaderView:isNewlyListed파라미터 추가ChartView:onNewlyListedChange콜백,isNewlyListed변화 부모로 전파CoinDetailView: 콜백을 받아ChartView로 전달MarketView: 배지 상태 보관 후HeaderView에 주입, 코인 전환시 초기화스크린샷 (선택)
💬 리뷰 요구사항(선택)