마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

디버깅 파일 에러가 뜹니다.

0 추천

안녕하세요 제가 기존 프로젝트를 멀티 모듈로 바꾸는 과정에 전 모듈에 있는 xml을 복붙해서 넣었습니다.

그리고 빌드했더니 이런식으로 빌드 에러가 뜹니다.

이런 현상 알고 계신분 있나요?

hifl (670 포인트) 님이 2022년 1월 18일 질문
일단 이미지가 작아서 제 시력으로는 정확하게 어디가 문제인지 읽을 수가 없네요. 그리고 에러메세지가 있다면, 올려주시면 좋을 것 같아요.
모듈을 새로 만들고 xml을 복사하신 거면, 그 안에 참조하고 있는 class 나 resource가 없어서 그럴 가능성이 있습니다. 모듈은 생성하면 기본적으로 다른 모듈을 dependency에 추가 하지 않기 때문에 다른 모듈에 있는 class 나 resource를 참조하고 싶다면 app/build.gradle의 dependency 섹션에 추가해 주어야 합니다.

dependencies {
  implementation project(":module_name")

 
}

모듈의 의존성을 추가하실 때, 한가지 주의하실 점은 Circular dependency, 즉 A와 B모듈이 서로 의존관계에 있지 않도록 해주시는게 좋습니다. 그리고 다른 모듈에서 app모듈을 참조하지 않아야 합니다. 왜냐하면 다른 모듈은 app module 독립적이어야 하기 때문입니다. 안그러면 모듈의 의미가 없겠죠.
dataStore로 저장된 값을 읽고 싶을때
App module 에있는
@HiltAndroidApp
class App : Application() {

    private lateinit var dataStore: DataStoreManager

    companion object {
        private lateinit var app: App
        fun getInstance(): App = app
    }

    override fun onCreate() {
        super.onCreate()
        app = this
        dataStore = DataStoreManager(this)
    }

    fun getDataStore(): DataStoreManager = dataStore
}
에 접근해서 못읽겠네요 그러면?? ㅠㅜㅜ
그리고 에러 메세지는
ERROR:C:\Users\2004c\StudioProjects\bamboo-android\admin\build\intermediates\packaged_res\debug\layout\admin_post_reject_recycler_item.xml:69: AAPT: error: attribute getTag (aka com.example.app:getTag) not found.
입니다. 왜 디버그 파일에서 에러가 나는지 모르겠어요
네. 결론적으로 바로 접근하실 수 없어요. 다른 모듈에서 DataStoreManager를 사용하려면 먼저 DataStoreManager를 data 모듈에 넣으신 다음 data모듈을 참조하세요.

그리고 admin_post_reject_recycler_item의 에러는 databinding을 사용하시는 것 같은데, getTag란 함수가 app 모듈에 정의되어 있는데 가져다 사용할 수 없어서 나는 에러처럼 보이네요.


참고로 Hilt를 사용하시면 위처럼 직접 app변수나 DataStoremManager를 사용하지 마시고 Injection을 사용하세요.
app은 Hilt @ApplicationContext어노테이션을 사용하면 알아서 inject해 줍니다.

@Provides
@Singleton
fun provideDataStoreManager(@ApplicatonContext context: Context) {
     return DataStoreManager(context)
}

또는

@Singletone
class DataStoreManager @Inject constructor(@ApplicationContext private val context: Context) {
    ...
}

@HiltAndroidApp
class App : Application() {

    @Inject
    lateinit var dataStore: DataStoreManager

}
감사합니다
module에 dataBinding을 추가했더니 해결했어요
그런데
app module에 있는 di들이 실행이 안되고
error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this class because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code
라는 오류가 뜨네요 이 에러에 대해 아시나요?

1개의 답변

0 추천
 
채택된 답변

흠 멀티 모듈을 왜 사용해야하고 어느 부분을 멀티모듈로 만들어야 할지 고민을 좀 해보셔야 할 것 같은데요. 멀티모듈로 만들기에 껄끄러운 부분들은 멀티 모듈로 옮기고 계시거나 모듈로 옮기지 않아야 하거나 않아도 되는 것들을 옮기고 계신 것 같아요.

에러메세지는 circular dependency즉 A모듈의 객체와 B 모듈의 객체가 서로를 DI 하고 있기 때문에 생기는 문제입니다.

class A (private val b: B)

class B (private val a:  A)

위처럼 서로를 교차로 참조하기 때문에 참조가 계속해서 무한루프에 빠지는 거죠.

spark (226,420 포인트) 님이 2022년 1월 20일 답변
hifl님이 2022년 1월 21일 채택됨
지금 모듈이
app, domain, data ,base ,presentation 이있는데 각각

app : domain, data ,presentation
domain : x
data : domain
base : x
presentation : domain

이렇게 모듈로 나눴습니다.
서로 DI를 하고 있는 경우가 있을까요?
Dagger Hilt의 컴파일 타임 메세지는 위의 실제 프로젝트를 돌려봐야 알 수가 있습니다. 에러창의 좌측 맨 윗부분을 누르시면 실제 어떤 클래스(생성된 클래스)에서 에러가 났는지 알려줍니다. 이걸 보시고 찾으셔야 해요. 모듈 관계상으로 볼 때는 app과 presentation은 서로 중복이 많이 있을 것 같아 보이네요. 어차피 Application에서 Dagger를 초기화 해주어야 하기 때문에보통 app 모듈을 presentation 레이어로 사용하는 편이 구현이 편할 수 있거든요.
app module 를 presentation module로 옮긴 후 실행해봐도 결과가 똑같이 에러가 뜹니다.
Inject를 하는 모든 class가 에러가 뜨네요 흠..
먼저 clean buld 를 해보시고, File > invalidate cache & restart 도 해보세요.
...