Hilt 가 도대체 뭘까? (3)

shin_stealer·2024년 8월 17일
0

서버에서 데이터를 받아와서 의존성을 주입해야 하는 상황에서는, Hilt를 여전히 유용하게 사용할 수 있습니다. Hilt는 데이터의 출처가 서버이든 로컬이든 상관없이 의존성 관리와 주입을 간편하게 해줍니다. Hilt를 사용하지 않는 방법도 가능하지만, Hilt를 사용하면 코드의 모듈화, 유지보수성, 테스트 용이성이 크게 향상됩니다.

Hilt를 사용하여 서버에서 받은 데이터를 주입하는 방법
시나리오:
서버에서 horsepower, engineType, transmissionType 데이터를 받아와서 Car 객체에 주입해야 한다고 가정합니다. 이 경우 서버에서 데이터를 가져온 후, Hilt를 통해 의존성을 주입할 수 있습니다.

1. 서버에서 데이터 받아오기 (Repository 사용)

먼저, 서버와 통신하는 Repository를 설정합니다. 이 Repository는 ViewModel에서 사용할 수 있고, 서버에서 데이터를 받아옵니다.

class CarRepository @Inject constructor() {

    // 예시 함수: 서버에서 데이터를 가져옵니다.
    suspend fun fetchCarConfig(): CarConfig {
        // 실제로는 Retrofit 등으로 네트워크 요청을 처리합니다.
        // 여기서는 간단히 예시 데이터를 반환합니다.
        return CarConfig(
            horsepower = 300,
            engineType = "V12",
            transmissionType = "Automatic"
        )
    }
}

data class CarConfig(
    val horsepower: Int,
    val engineType: String,
    val transmissionType: String
)

2. ViewModel 설정

ViewModel에서 Repository를 통해 서버에서 데이터를 받아옵니다. ViewModel은 LiveData 또는 StateFlow를 사용해 UI와 데이터를 연결합니다.

@HiltViewModel
class CarViewModel @Inject constructor(
    private val repository: CarRepository
) : ViewModel() {

    private val _carConfig = MutableLiveData<CarConfig>()
    val carConfig: LiveData<CarConfig> = _carConfig

    fun loadCarConfig() {
        viewModelScope.launch {
            val config = repository.fetchCarConfig()
            _carConfig.value = config
        }
    }
}

3. MainActivity에서 데이터 주입

이제 MainActivity에서 ViewModel을 사용하여 서버에서 받은 데이터를 기반으로 의존성을 주입합니다.

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var car: Car
    private val viewModel: CarViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.carConfig.observe(this) { config ->
            // 서버에서 받아온 데이터를 기반으로 의존성을 주입합니다.
            val engine = Engine(config.horsepower, config.engineType)
            val transmission = Transmission(config.transmissionType)
            val driver = Driver("John Doe")  // Driver는 그대로 사용

            // Car 객체 생성
            val car = Car(engine, transmission, driver)
            println(car.drive())
        }

        // 서버에서 데이터를 로드합니다.
        viewModel.loadCarConfig()
    }
}

4. 결론: Hilt를 사용하는 이유

서버에서 데이터를 받아온다고 해서 Hilt를 사용할 필요가 없다는 것은 아닙니다. Hilt는 여전히 의존성 관리의 핵심적인 역할을 할 수 있습니다:

의존성 관리의 일관성: Hilt를 사용하면 의존성을 관리하는 방식이 일관되게 유지됩니다. 예를 들어, 서버에서 데이터를 받아오는 과정에서 Hilt를 사용하면, 서버에서 받은 데이터와 로컬에서 사용되는 다른 의존성을 모두 일관되게 관리할 수 있습니다.

테스트 용이성: Hilt를 사용하면 의존성을 쉽게 모킹(mocking)할 수 있습니다. 서버 통신이 포함된 의존성을 테스트할 때 Hilt를 통해 테스트 주입을 할 수 있어 유닛 테스트나 통합 테스트를 간편하게 할 수 있습니다.

모듈화: Hilt를 사용하면 서버에서 받아온 데이터를 주입하는 로직을 깔끔하게 모듈화할 수 있습니다. 예를 들어, 서버 데이터를 처리하는 로직을 별도의 모듈로 만들고, Hilt를 통해 그 모듈에서 제공하는 데이터를 주입받을 수 있습니다.

Hilt를 사용하지 않는 경우:
만약 Hilt를 사용하지 않는다면, 직접적으로 의존성을 생성하고 관리해야 하며, 이로 인해 코드의 복잡도가 증가할 수 있습니다. 특히 의존성이 많아지거나 계층이 깊어질수록 Hilt를 사용하지 않는 관리 방법은 유지보수가 어려워질 수 있습니다.

결론적으로 서버에서 데이터를 받아와서 의존성을 주입하는 경우에도 Hilt를 사용하면 코드의 일관성을 유지하고, 유지보수성과 테스트 용이성을 높일 수 있습니다. Hilt는 복잡한 의존성 구조를 가진 앱에서 특히 유용하며, 코드의 모듈화와 관리의 효율성을 높이는 데 큰 도움을 줍니다.

profile
I am a Blacksmith.

0개의 댓글