[TIL] 230921 회고

서정한·2023년 9월 21일
0

내일배움캠프 7기

목록 보기
51/66

Intro

  • 이번주 내일배움캠프의 과제는 카카오뱅크 입사시험으로 나왔던 문제였다. 문제는 아래 이미지를 보면 될것 같다!
  • 과제를 진행하면서 겪은 일들을 돌아보며 회고를 해보고자한다.

MVVM

  • 이거 과제하려고 MVVM 공부했던 것 같다. 요새 몸으로 경험중이지만 생각하고 정리하며 많이 손으로 쳐본 코드가 기억에 남고 설명할 수 있는 내 코드임을 말이다.
  • 프로젝트 시작 전 1주일간 공부시간이 주어졌을때 아무것도안하고 MVVM만 만들어봤다. 한 3번정도 만들어보니 대충 어떻게 구조를 잡아야할지 눈에 들어오기 시작했다.

Retrofit2

  • 내가 생각한 작업 진입점은 폴더구조 및 파일생성 후 곧바로 api를 구현하는쪽으로 달라들었다. 왜냐하면 실제 데이터처리가 되어야 그 다음 작업을 눈으로 보면서 테스트해볼 수 있기 때문이다.
  • Retrofit은 내가 쓴 회고에 정리해놨으니 혹시나 사용하실분은 여기
  • 이번 프로젝트를 해보면서 retrofit은 내 개인적인 기술부채를 안고 갔던것같다. 누가 짠 코드보고 설명하라고하면 가능하지만 맨바닥에서 쌓으라고한다면 아직은 거기까지 하지 못한다. 이 말은 구현에대한 이해가 전부 이뤄지지않았다는것이다. 이제 곧 실전프로젝트이니 내일 밑바닥부터 구현해보면서 복습하는 시간을 가져야겠다.

RecyclerView 무한스크롤 구현하기

  • 이부분에서 정말 많이 헤메었다.. 일단 무한스크롤을 구현하기 전 내가 놓친 부분이 있었다.
    • api통신은 비동기로 이뤄짐에도 UI로 가져올 때 통신이 끝났는지 체크하지않고 바로 실어나른 것.(=로딩)
  • 그래서 먼저 로딩부분을 구현해줬는데 이거 구현하는 중간에 코루틴 스코프를 잘못잡아서 오류를 경험했었다. 아래와 같이 짜면 내가 예상한 결과와 전혀 다른 결과가 나온다.. 내가 예상한 이유는 코루틴에서는 비동기작업을 해당 스코프 안에서 순서대로 처리할때 사용하는것으로 알고있는데, 아래 작업을 해보며 내가 생각한것과 다르게 돌아가는구나를 경험했다.
  • 정확하진 않은데 예상하기로는 여기에서 Image를 가져오는것과 Video를 가져오는것 두가지가 따로 api를 서버에 날려서 결과를 받아온다. 즉 둘다 비동기로 동작한다. 그런데 스코프를 하나에 때려넣으니 순서가 보장되지않아서가 아닌가싶다.
/* Error */

       // Image
        viewModelScope.launch {
            with(repository) {
                if (page <= pageableCountImage) {
                    val image = searchImage(query, "recency", page, 40)
                    with(image) {
                        if (isSuccessful) {
                            body()?.let { body ->
                                body.documents?.let { images -> searchedList.addAll(images.toContentDataList()) }
                                body.metaData?.pageableCount?.let { count ->
                                    pageableCountImage = count
                                }
                            }
                        }
                        imgSearchRes = true
                        checkResponse()
                    }
                }
            }

            // Video
            with(repository) {
                val video = searchVideo(query, "recency", page, 40)
                with(video) {
                    if (isSuccessful) {
                        body()?.let { body ->
                            body.documents?.let { video -> searchedList.addAll(video.toContentDataList()) }
                            body.metaDAta?.pageableCount?.let { count ->
                                pageableCountVideo = count
                            }
                        }
                    }
                }
                videoSearchRes = true
                checkResponse()
            }
        }
/* Correct */

 // Image
        viewModelScope.launch {
            with(repository) {
                if (page <= pageableCountImage) {
                    val image = searchImage(query, "recency", page, 40)
                    with(image) {
                        if (isSuccessful) {
                            body()?.let { body ->
                                body.documents?.let { images -> searchedList.addAll(images.toContentDataList()) }
                                body.metaData?.pageableCount?.let { count ->
                                    pageableCountImage = count
                                }
                            }
                        }
                        imgSearchRes = true
                        checkResponse()
                    }
                }
            }
        }

        // Video
        viewModelScope.launch {
            with(repository) {
                val video = searchVideo(query, "recency", page, 40)
                with(video) {
                    if (isSuccessful) {
                        body()?.let { body ->
                            body.documents?.let { video -> searchedList.addAll(video.toContentDataList()) }
                            body.metaDAta?.pageableCount?.let { count ->
                                pageableCountVideo = count
                            }
                        }
                    }
                }
                videoSearchRes = true
                checkResponse()
            }
        

Outro

  • 프로젝트를 진행하면서 구현이 익숙해져야 기술에대한 깊이있는 질문을 던질 수 있음을 몸으로 경험중이다..!
  • 익숙하지않은 기술을 구현하기위해서는 그만큼 생각의 전환시기가 필요하다. 이건 진짜 어쩔수가 없다 ㅠ 이것도 역시 열심히 손가락으로 타이핑하고 많이 만들어보는수밖에 없는듯..!
profile
잘부탁드립니다!

0개의 댓글