피드로 돌아가기
원문 읽기
LINE Engineering
Backend코드 품질 개선 기법 24편: 유산의 가치
LY Corporation이 테마 관련 상속 구조를 값 기반 데이터 클래스로 변경해 불필요한 인터페이스 정의 제거
AI 요약
Context
FooScreen 클래스의 UI 요소 색상과 이미지를 테마에 따라 변경하기 위해 FooScreenThemeStrategy 인터페이스를 정의하고 FooScreenLightTheme, FooScreenDarkTheme 두 개의 구현 클래스를 상속으로 작성했다. 실제로는 로직을 변경할 필요가 없었고 속성 값만 다르기 때문에 상속 구조가 불필요했다.
Technical Solution
- 인터페이스 제거: FooScreenThemeStrategy 인터페이스를 삭제하고 값을 보관하는 단순 데이터 클래스로 대체
- 데이터 클래스 정의: 배경색, 텍스트색, 버튼색, 헤더 아이콘, 에러 아이콘, 체크마크 아이콘을 속성으로 가지는 FooScreenThemeModel 클래스 작성
- 상속 불가능 클래스 사용: Kotlin에서 open 키워드를 붙이지 않아 클래스 상속을 원천적으로 차단
- 인스턴스 기반 구현: 상속 클래스 대신 FOO_SCREEN_LIGHT_THEME_MODEL, FOO_SCREEN_DARK_THEME_MODEL과 같이 값이 다른 인스턴스 생성
- bindTheme 메서드 수정: FooScreenThemeModel 인스턴스를 매개변수로 받도록 변경
Key Takeaway
값만 다르고 로직이 동일한 경우 상속 구조 대신 인스턴스 생성으로 구현하면 불필요한 추상화 레이어를 제거할 수 있다. 동적 디스패치, 합 타입 구현, 의존성 역전 등 명확한 목적이 없으면 상속 사용을 피하는 것이 코드 간결성을 높인다.
실천 포인트
UI 테마, 설정값, 상수 조합 등 값의 조합만 다르고 동작이 동일한 구조를 설계할 때 상속 대신 데이터 클래스와 인스턴스 기반 패턴을 적용하면 코드 복잡도를 줄이고 유지보수성을 향상시킬 수 있다.