LUMOS 회고 - 기기 제어 정보 직렬화하기

Bluewave·2025년 6월 22일

안드로이드

목록 보기
11/14
post-thumbnail

루틴 저장 기능을 설계하면서 가장 핵심이 되었던 구조 중 하나는 CommandDevice를 활용한 직렬화(Serialization) 과정이다.


💡 직렬화(Serialization)란?

객체(Object) 형태의 데이터를 → 문자열(String) 형태로 변환하는 작업.
주로 JSON이나 XML 같은 포맷으로 변환하며, 다음과 같은 목적에서 사용됨:

  • 서버에 전송하거나 저장할 수 있도록
  • 화면 간 데이터 전달을 쉽게 하기 위해
  • 디버깅을 용이하게 하기 위해

→ 이와 반대로 JSON을 다시 객체로 복원하는 건 역직렬화(Deserialization)


🛠 CommandDevice 구조 이해하기

LUMOS에서는 루틴 생성 시 선택한 각 기기의 제어 상태를 CommandDevice라는 데이터 클래스로 관리함.

예시:

data class CommandDevice(
    val deviceId: String,
    val commands: List<Command>
)

data class Command(
    val component: String = "main",
    val capability: String,
    val command: String,
    val arguments: List<Any>? = null
)

예를 들어, 조명을 켜고 밝기를 80%로 설정한다면 다음과 같이 생성됨.

CommandDevice(
    deviceId = "abc123",
    commands = listOf(
        Command(capability = "switch", command = "on"),
        Command(capability = "switchLevel", command = "setLevel", arguments = listOf(80))
    )
)

🔁 JSON으로 직렬화

위 데이터를 루틴에 저장하기 위해 JSON 문자열로 직렬화

{
  "deviceId": "abc123",
  "commands": [
    {
      "component": "main",
      "capability": "switch",
      "command": "on"
    },
    {
      "component": "main",
      "capability": "switchLevel",
      "command": "setLevel",
      "arguments": [80]
    }
  ]
}

✅ 이 JSON은 다음의 경우에 쓰임

  • 서버 저장 시: API에 전송하여 DB에 저장
  • 루틴 수정 시: 저장된 값을 다시 불러와 화면에 상태를 복원
  • 기기 제어 시: SmartThings API에서 명령 파라미터로 사용

🔍 왜 CommandDevice로 추상화했을까?

SmartThings에 연동된 IoT 기기들은 기기마다 제어 방식이 다름.
예를 들어:

기기주요 capability명령
조명switch, switchLevelon/off, setLevel
스피커audioVolume, mediaPlaybacksetVolume, play, stop
공기청정기fanMode, switchsetFanMode, on/off

→ 이처럼 기기마다 제어 커맨드 구성이 다르기 때문에 기기별 명령을 하나의 공통 구조로 관리할 필요가 있었다.

그게 바로 CommandDevice


🧱 직렬화 활용 구조

LUMOS에서는 다음과 같은 구조로 루틴 저장이 진행됨:

  1. 사용자가 루틴 이름 설정 / 이모지 선택 / 제스처 선택
  2. 루틴에서 제어할 기기 선택
  3. 기기 설정 화면에서 상태 설정 → CommandDevice 객체 생성
  4. ViewModel에서 이 리스트를 JSON으로 직렬화
  5. API를 통해 서버에 전송

또 루틴을 수정할 때는:

  • 서버에서 받은 JSON을 역직렬화 → CommandDevice로 복원
  • ViewModel 상태로 세팅 → 화면에 반영

✅ 정리

개념설명
직렬화객체 → JSON 변환
역직렬화JSON → 객체 복원
CommandDevice기기 ID + 제어 명령 리스트로 구성된 커맨드 데이터 클래스
목적루틴 저장/복원, API 연동, 기기별 명령 통합 관리

LUMOS에서의 직렬화는 단순히 저장의 목적을 넘어,
기기 제어 커맨드 구조의 유연한 확장성과 재사용성을 확보하는 데 중요한 역할을 함.

profile
Developer's Logbook

0개의 댓글