DoTheBestMayB / UpbitAPI

업비트 API를 활용한 어플
1 stars 0 forks source link

코인 시세 조회 UI 구현하기 #28

Closed BeokBeok closed 2 years ago

BeokBeok commented 2 years ago

요구사항

프로그래밍 요구사항

학습해보면 좋을만한 것들

BeokBeok commented 2 years ago

URL 및 Repository 업데이트 하였습니다.

BeokBeok commented 2 years ago

ViewPager는 다음 과제에서 진행할게요. ViewPager 관련 내용은 제거하였습니다.

BeokBeok commented 2 years ago

참고 Repository를 변경했어요!

DoTheBestMayB commented 2 years ago

https://github.com/DoTheBestMayB/UpbitAPI/pull/31#discussion_r868078114

코인 이름을 다음과 같이 관리하는 것의 개선점이 있을까요?

장점: UpbitViewModel getTicker() 함수에서 upbitMarketData와 upbitTickerData 비교해서 코인 한국어 이름을 얻는 로직을 없앨 수 있다. 단점: 새로운 코인이 거래소에 등록되면, 앱 업데이트를 통해 해당 코인을 enum에 추가하기 전까지 "등록되지 않은 코인"으로 표시된다. 생각: 1시간 간격과 같은 일정 주기로, getMarket() 함수 호출로 얻은 거래소에 등록되어 있는 코인 리스트와 Coin.values()를 비교해서 enum Coin에 없는 새로운 코인을 enum에 등록한다. 하지만 enum은 dynamic하게 값을 추가하거나 삭제할 수 없다.

enum class Coin(val koreanName: String) {
    KRW_BTC("비트코인"),
    KRW_ETH("이더리움");

    fun valueOrNoExist(market: String): String {
        return values().firstOrNull {
            it.name == market.replace("-", "_")
        }?.koreanName ?: "등록되지 않은 코인"
    }
}
DoTheBestMayB commented 2 years ago

RandomUser 프로젝트 질문

  1. Line.17 아래 두 코드에 차이가 있나요?
    private val viewModel: MainViewModel by viewModels()
    private val viewModel by viewModels<MainViewModel>

아래 두 코드처럼 차이가 없나요?

val num: List<Int> = listOf()
val num = listOf<Int>()
  1. Line.40 binding = DataBindingUtil.setContentView(this, R.layout.activity_main) 는 아래 코드와 같은가요? 해당 프로젝트에 setContentView(binding.root) 코드가 없네요.

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
  2. Line.34 BR은 무엇인가요?

  3. Line.35 Adapter에 viewModel을 넘기는 이유가 궁금합니다. viewModel을 Map<Int, viewModel> 형태로 넘기는 이유도 궁금합니다.

  4. Line.25 replaceItems() 함수에서 마지막에 notifyDataSetChanged()를 호출하지 않는 이유가 궁금합니다.

  5. Line.22 bind() 함수에서 item 파라미터를 nullable로 선언한 이유가 궁금합니다.

  6. Line.24 함수 라이브러리 코드 주석을 보니, 어떤 xml과 연결되었는지 결정되지 않은 ViewHolder 클래스가 reflection 없이 xml에 값을 설정할 수 있도록 해준다고 되어 있는데, 무엇인지 이해가 안 됩니다.

  7. Line.26 ~ 29 해당 코드의 역할이 궁금합니다.

  8. UpbitAPI 프로젝트 UpbitViewHolder xml의 text 값을 직접 대입해주고 있는데, viewModel의 값이 변하면 연결된 xml의 값이 바뀌는 것처럼, 이것도 자동으로 대입되도록 할 수 있나요?

  9. UserItem toItem 함수를 companion object에 둔 이유는 MainViewModel Line.22 에서 함수참조를 하기 위함인가요?

  10. toItem 함수가 toItem(resultItem: ResultItem, numberOfUser: Int) 와 같이 되어 있을 때 함수 참조를 통해 numberOfUser를 전달하려면 어떻게 작성해야 하나요?

DoTheBestMayB commented 2 years ago

KakaoGallerySearch 프로젝트 질문

  1. viewLifecycleOwner binding.lifecycleOwner = this를 설정한 후 this를 사용하지 않고, viewLifeCycleOwner를 직접 사용하는 이유가 궁금합니다. fragment와 관련이 있나요?

  2. return@launch @launch를 지우면 "This function must return a value of type Job"이라고 나오는데 무슨 의미인가요?

  3. 가비지 컬렉션 검색하는 단어가 바뀔 때, 검색 결과가 있는 데이터 변수를 emptyList로 덮으면 가비지 컬렉션이 바로 동작하지 않을 수 있으므로 stackOverFlow의 위험이 있지 않나요? ex) "A" 키워드로 검색하고 스크롤을 많이 해서 데이터를 많이 받아온다. -> "B" 키워드로 새로 검색한다. -> 바로 스크롤 엄청 많이 하기 -> "A" 키워드 검색으로 받아온 데이터 리스트가 삭제되지 않았기 때문에 기기 사양이 낮으면 stackOverFlow 발생

  4. viewPager에 있는 Fragment마다 upbitViewModel을 가진다면, viewPager에 현재 보이는 Fragment 1개만 upbitViewModel의 ticker API 요청을 해야 할까요? 혹은 보이지 않는 Fragment에서도 ticker API 요청을 해야 할까요? 업비트 어플에서는 화면을 전환할 때, 데이터가 바로 보이지 않는 것으로 보아, 현재 보이는 Fragment 만 API 요청 하는 것 같습니다.

프로젝트로 배운 점 정리

  1. viewPager2 offScreenPageLimit viewPager에서 삭제하지 않고 유지하는 보이지 않는 page 개수를 결정함 http://coolsharp.blogspot.com/2018/11/viewpager-offscreenpagelimit.html

  2. return@label return으로 빠져나가는 범위를 결정한다. 예를 들어 아래와 같이 사용하면, 함수, forEach를 벗어나는 것이 아니라 forEach loop 1단계를 넘어간다. 아래 코드에서 forEach는 inputNum에 있는 int 값을 변경하는 것이기 때문에 단순히 return은 안된다.

fun addOnlyOddWithLogic(inputNum: IntArray): Int {
    var result = 0
    inputNum.forEach {
        if (it % 2 == 0) return@forEach

        result += it * it
    }
    return result
}

https://stackoverflow.com/questions/40160489/kotlin-whats-does-return-mean https://kotlinlang.org/docs/returns.html