Contact me through: [email protected], +82-10-5682-0426

See this page on your browser: Resume - Cheolho Jeon

Coupang: 2025-current

VTOV: 2021-2025

Business Code Decoupling and Testing

Decoupling with MVVM Structure and Hilt

Application code is written based on Hilt and MVVM to maintain idempotency, maximizing testability by separating concerns through dependency injection.

For example, if you write the ViewModel (VM) as a concrete class, you have to mock the entire VM when testing the fragment. This is often tiring and burdensome. Therefore, I defined the VM’s interface and the implementation of that interface in a ViewModelProvider.Factory for Hilt. In this way, the fragment depends on the factory rather than the VM directly. This makes it easy to swap out VMs at the application layer and mock the implementation of the interface during testing. This greatly increases testability since VM provisioning is controlled by the application code (Hilt) rather than the Android library code.

Sustainable and Monitored Testing with Mockk and Github Actions

Highly decoupled code enabled us to use Mockk much more actively. I facilitated unit testing on a narrow scale by wrapping repositories and APIs with Mockk. This allowed tests to be performed without dependencies on actual servers, ensuring test stability and speed.

I set up these tests to run in parallel on Github Actions, distributed via matrix. I also optimized compile and build caches. By using Jacoco and Codecov, I monitored the entire code coverage and configured warnings on PRs if the coverage decreased. Despite the challenge of increasing code coverage in a fast-paced startup environment, we achieved a peak of 60% and currently maintain around 40%.

UI Configuration and Manipulation with Navigation, Compose + Fragment

I composed the UI using a single MainActivity combined with Compose and fragments. Screen transitions are controlled through NavController. This approach reduces the use of heavy activities, making transitions smoother. It also simplifies state management since the activity remains in the resumed state as long as it’s in the foreground.

By using Compose instead of XML, we leveraged the powerful advantage of drawing UI with code. This avoids disparate methods like DataBinding or runtime view manipulation. Previously, I had to check XML, data binding, and dynamic view manipulation separately. With Compose, all UI changes are controlled in one place, reducing complexity.

Screen transition issues related to parameter types were mitigated using SafeArgs with NavController. This allows compile-time detection of screen transition problems, preventing runtime issues that could occur with an empty or null Bundle. Ensuring type safety helps prevent related bugs.