잡동사니/GPT가 알려주는

[GPT가 알려주는] IVI(HMI) 기반 멀티앱 UI 소프트웨어 아키텍처 설계

heylo 2025. 7. 3. 15:21

✅ 홈화면 앱 구성 정리

📦 트랙터 관련 앱

  • 트랙터 설정
  • 트랙터 관리
  • 트랙터 정보

📦 미디어 관련 앱

  • 라디오
  • 미디어 (USB 등)

📦 기타 설정 앱

  • 네트워크
  • 모니터 설정

 

 

✅ 목표

  • 이들을 각각 독립적인 앱으로 개발 (APK 단위)
  • 다만, 언어 설정, 밝기, 사운드 설정 등은 공통이므로
    앱 간 설정 동기화가 필요함

 

✅ 전체 S/W 아키텍처 설계 방안

1. 앱 구조 (디렉터리/모듈)

/apps
  ├─ tractor-settings
  ├─ tractor-management
  ├─ tractor-info
  ├─ radio
  ├─ media
  ├─ network
  ├─ monitor-settings
  └─ launcher (메인화면)

각각 독립된 Android 앱으로 구성 (AndroidManifest.xml 포함)

 

 

2. 공통 설정 관리 방식

항목 설계 방안
언어, 단위, 밝기, 시간 RoomDB + ContentProvider 이용하여 공유
실시간 동기화 BroadcastReceiver 또는 ContentObserver 사용
설정 변경 시 ContentProvider 업데이트 → 모든 앱에 브로드캐스트

 

3. 런처 앱(Home UI) 역할

  • 각 앱을 Intent 호출로 실행
  • 예시:
val intent = Intent()
intent.setClassName("com.lsmtron.radio", "com.lsmtron.radio.RadioMainActivity")
startActivity(intent)
  • 앱 상태(예: "미디어 연결됨")를 아이콘 상태로 표현할 수 있음 → ContentProvider 통해 폴링하거나 Broadcast 수신

 

4. 공통 라이브러리 모듈 (선택)

  • common-ui, common-utils, common-settings 등 Android library module로 분리
  • 각 앱에서 공통 컴포넌트 재사용 가능

 

 

5. 소프트웨어 설계서 주요 항목

항목 내용
📌 앱 구성 APK별 기능 설명 및 Launch 방식
📌 공통 설정 DB 스키마 (MonitorSettingsEntity), ContentProvider URI 명세
📌 설정 동기화 BroadcastReceiver 등록 예시, 설정 변경 시 처리 순서
📌 실행 시나리오 예: Launcher → Media → 언어 변경 → 모든 앱 locale 반영
📌 에러 처리 설정 값 미적용 시 fallback, Provider 접근 실패 시 디폴트값 적용 등

 

 

✅ 실제 구성 예시

// 모니터 설정 앱: 언어 변경
val values = ContentValues().apply { put("language", "en") }
contentResolver.update(Uri.parse("content://com.lsmtron.settings.provider/monitor_settings"), values, null, null)

val intent = Intent("com.lsmtron.LANGUAGE_CHANGED")
intent.putExtra("language", "en")
context.sendBroadcast(intent)
// 다른 앱 (예: 라디오 앱)
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val lang = intent.getStringExtra("language")
        setAppLocale(lang, context)
        recreate() // 혹은 리소스 재적용
    }
}

 

✅ 결론

🔧 L사의 트랙터 UI처럼 여러 앱이 통합된 시스템에서는:

  1. 앱은 각각 독립 APK로 나누고
  2. 설정은 공통 DB + ContentProvider로 공유
  3. 실시간 반영은 Broadcast로 처리
  4. 공통 유틸/컴포넌트는 라이브러리 모듈로 분리

 

필요하면 이 구조에 맞춰:

  • 전체 모듈 디렉터리 트리 구조
  • ContentProvider + Room 예시
  • Launcher → App 실행 흐름도
  • 각 앱의 Application 클래스 패턴

등도 도와줄 수 있어.
실제 구현 예제 필요해? 😎