2024년 안드로이드 개발자 최신 로드맵

2024년 안드로이드 개발자 최신 로드맵
it-postingPosted On Aug 17, 20246 min read

커피 한 잔 마시고 ☕, 안드로이드 개발자가 되기 위해 배워야 하는 것을 살펴봐요.

나는 3년 이상의 안드로이드 애플리케이션 개발 경험이 있으니, 지금의 위치에 있기 위해 거쳐야 했던 것들이 이 안내서에 포함되어 있어.

프로그래밍 언어

내 의견으로는 Kotlin이 이미 잘 알려지고 대부분의 애플리케이션에서 사용되기 때문에 Java를 배우지 말아야 한다고 생각해요. 미래에는 Java가 선택 사항이 되지 않을 것이라고 생각해요. 여기서 두 언어를 비교한 내용을 읽을 수 있어요.

Jetpack Compose vs XML

Jetpack Compose은 Google이 만든 선언적 프레임워크로 앱을 만드는 과정을 간단하게 만들기 위해 고안되었어요. 이해하기 쉽고 직관적인 학습 방식을 가지고 있어요. Compose의 큰 장점 중 하나는 XML과의 상호 운용성이에요. 이는 Compose 코드를 XML 앱에 추가하거나 코드를 쉽게 적응시킬 수 있다는 것을 의미해요.

XML은 앱을 구축하는 명령적인 방식이에요. XML 파일을 사용하여 UI를 구축한 다음 Fragment/Activity에 연결하는 방식으로 작동해요.

XML에서 스크롤 가능한 목록을 만드는 방법의 예제입니다. 제공된 코드는 문서에서 가져온 것이며 여기에서 찾을 수 있습니다.

class CustomAdapter(private val dataSet: Array<String>) :
        RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    /**
     * 사용 중인 뷰 유형에 대한 참조를 제공합니다
     * (사용자 지정 ViewHolder)
     */
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // ViewHolder의 View에 대한 클릭 리스너 정의
            textView = view.findViewById(R.id.textView)
        }
    }

    // 새 뷰 생성 (레이아웃 관리자에 의해 호출됨)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        // 목록 항목의 UI를 정의하는 새 뷰 생성
        val view = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.text_row_item, viewGroup, false)

        return ViewHolder(view)
    }

    // 뷰의 콘텐츠 교체 (레이아웃 관리자에 의해 호출됨)
    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

        // 데이터셋에서이 위치의 요소를 가져 와서
        // 뷰의 내용을 해당 요소로 교체합니다
        viewHolder.textView.text = dataSet[position]
    }

    // 데이터셋의 크기 반환 (레이아웃 관리자에 의해 호출됨)
    override fun getItemCount() = dataSet.size

}

이것은 Jetpack Compose를 사용하여 스크롤 가능한 목록을 생성하는 방법에 대한 코드 조각입니다.

@Composable
fun MyList() {
    LazyColumn {
        items(10) {
            Text(text = "Hello World!")
        }
    }
}

그래 그럼 어느 것이죠?

일들이 조금 복잡해 보이네요. Jetpack Compose 코드가 훨씬 깨끗한 것 같아도 몇몇 회사들은 아직 그것에 맞게 코드를 변경하지 않았습니다.

내 조언은 Jetpack Compose를 배우고 XML도 조금 배워서 그 작동 방식을 이해하는 것입니다. 이것은 좋은 방법이죠. 왜냐하면 회사를 가입하게 되면 그들이 코드베이스를 적응시키고자 할 때 이미 어떻게 하는지 알고 있기 때문입니다.

애플리케이션 수명주기

onCreate()

앱이 처음 생성될 때 호출됩니다. 여기서는 예를 들어 뷰 바인딩과 같은 모든 정적 작업을 수행합니다.

onStart()

사용자에게 앱이 표시될 때 트리거됩니다. 예를 들어 앱을 다시 시작하면 onStart()가 트리거되고 onResume()으로 전달됩니다.

onResume()

이 이벤트는 앱이 사용자와 상호 작용을 시작할 때 트리거됩니다.

onPause()

이 이벤트는 앱이 사용자에게 보이지 않을 때 트리거됩니다. 예를 들어, 앱을 백그라운드로 넣을 때 이벤트가 트리거되며 onStop()으로 전달됩니다.

onStop()

사용자에게 더 이상 보이지 않을 때 호출됩니다.

onRestart()

앱이 중지되었고 시작할 준비가 된 경우 호출됩니다. 예를 들어, 백그라운드에 있던 앱으로 다시 들어갈 때 이 이벤트가 발생하며 onStart()에 의해 전달됩니다.

onDestroy()

앱이 종료되기 전에 트리거됩니다. 사용자가 최근 앱에서 앱을 제거할 때

코루틴

코루틴은 스레드와 비슷하지만 훨씬 가벼우며 일반적으로 더 효율적이고 사용하기 쉽습니다. Kotlin 코루틴 가이드가 여기 있습니다.

인터넷에서 데이터 가져오기

대부분의 앱은 데이터를 가져 오기 위해 데이터베이스와 통신하기 때문에 이를하는 방법을 알아야합니다.

이를 위해 Retrofit 또는 Ktor을 강력히 추천합니다. 둘 다 네트워크 요청에 매우 유용합니다.

로컬 데이터베이스

앱이 가지고 있는 또 다른 중요한 기능으로는 로컬 데이터베이스를 사용할 수 있다. 이를 위해 Room, Realm 또는 SQLite 데이터베이스를 사용하는 방법을 배울 수 있습니다. 이들은 데이터를 저장하고 네트워크가 사용 불가능할 때 앱에서 데이터를 불러오는 데 사용될 수 있습니다.

SharedPreferences

저장할 키-값의 상대적으로 작은 컬렉션이 있는 경우 SharedPreferences를 사용할 수 있습니다. 사용자의 최고 점수를 여기에 저장하는 예시가 있습니다.

아키텍처

안녕하세요! 안드로이드 개발 세계에서 매우 많이 사용되는 아키텍처 패턴이 있습니다. 여기에는 일반적으로 사용되는 몇 가지 패턴이 있습니다:

  • MVVM (모델-뷰-뷰모델)
  • MVI (모델-뷰-인터프리터)
  • MVP (모델-뷰-프리젠터)
  • MVC (모델-뷰-컨트롤러)

이미지 로딩

네트워크에서 이미지를 로드하는 것은 Coil, Glide 또는 Picasso와 같은 다른 종속성을 사용하여 수행할 수 있습니다.

코드 분석

이를 위해서는 린터를 사용해야 합니다. 린터는 코드를 분석하여 잠재적인 오류, 보안 취약점 및 스타일 문제를 찾는 도구입니다.

다음은 몇 가지 린터들입니다: Ktlint, Detekt 그리고 Android Lint.

디버깅

여기 앱에서 오류를 쉽게 감지할 수 있도록 도와주는 몇 가지 디버깅 의존성이 있습니다.

  • Timber: 안드로이드 로깅을 간소화합니다.
  • LeakCanary: 안드로이드 앱에서 메모리 누수를 감지합니다.
  • Stetho: 안드로이드 앱을 위한 디버거로 네트워크 트래픽, 데이터베이스 등을 검사합니다.
  • Chuck: 안드로이드를 위한 네트워크 인터셉터로 HTTP/HTTPS 요청과 응답을 검사합니다.

테스트

테스트는 앱이 다양한 시나리오에서 올바르게 작동하는지 확인할 수 있는 중요한 작업입니다. 유닛 테스트(Unit Testing)와 인스트루먼테이션 테스팅(Instrumented Testing) 두 가지 유형의 테스트가 있습니다.

단위 테스트

이 유형의 테스트는 코드 조각이 제대로 작동하는지 확인하기 위해 에뮬레이터를 사용하지 않고 수행됩니다. 단위 테스트에 사용되는 일부 종속성은 다음과 같습니다:

  • JUnit: 테스트를 작성하고 실행하기 위한 테스트 프레임워크입니다.
  • Kluent: 가독성이 좋고 표현력 있는 테스트를 작성하기 위한 코틀린 전용 어서션 라이브러리입니다.
  • MockK: 코틀린용 목 객체 프레임워크로, 목 클래스를 만드는 데 사용됩니다.

Instrumented Testing

이 유형의 테스트는 에뮬레이터에서 앱을 실행하여 수행됩니다. 앱의 특정 화면을 테스트하고 상호 작용하거나 전체 앱 플로우를 테스트하는 E2E(End-To-End)를 작성할 수 있습니다. 이곳에는 몇 가지 인스트루먼테이션 테스트 종속성이 있습니다.

  • Robolectric: 에뮬레이터나 기기가 필요하지 않고 JVM에서 안드로이드 테스트를 실행합니다.
  • Espresso: 안드로이드를 위한 UI 테스트 작성을 위한 프레임워크로 UI 요소와 상호 작용합니다.
  • Kaspresso: Espresso를 기반으로 구축된 고수준 UI 테스트 프레임워크로 테스트 작성을 단순화하고 신뢰성을 향상시키기 위해 만들어졌습니다.

CI/CD

이것은 지속적 통합(Continuous Integration) 및 지속적 전달/배포(Continuous Delivery/Deployment)를 의미합니다. CI는 코드 변경을 공유 소스 코드 저장소에 자동으로 통합하는 프로세스를 자동화합니다. CD는 코드 변경의 통합, 테스트 및 전달을 의미하는 프로세스입니다.

CI/CD 도구

  • Bitrise: 모바일 앱 개발에 주로 초점을 맞춘 클라우드 기반 플랫폼으로, iOS 및 Android 앱을 빌드, 테스트 및 배포할 수 있습니다.
  • Jenkins: 안드로이드 및 iOS를 포함한 다양한 프로젝트에 사용할 수 있는 범용 오픈소스 CI/CD 도구로, 보다 많은 설정 및 유지관리가 필요합니다.
  • CircleCI: 모바일 및 웹 애플리케이션에 적합한 유연성과 사용 편의성을 제공하는 클라우드 기반 CI/CD 플랫폼입니다.