2025-11-29
1일 1아티클
LY
Review Comment
문제 상황
data class UserModel(
val userId: Int,
val accountName: String,
val ...
var onlineStatus: OnlineStatus,
var statusMessage: String
)
- 위 코드에 대한 코드 리뷰 내용
data 클래스에는 copy 함수가 있습니다. 속성 값을 변경하고 싶을 경우 해당 속성을 직접 수정하는 대신 해당 함수를 호출해서 별도의 인스턴스를 생성할 수 있습니다.
UserModel.onlineStatus와 statusMessage에 대해 copy를 사용하지 않고 var로 재할당이 가능하도록 한 것은 이 값들이 자주 업데이트되고 동일한 객체를 통해 업데이트된 상태를 공유하기 위한 것이라고 예상할 수 있습니다.
하지만 일반적으로 가변 객체를 공유하면 의도하지 않은 시점에 속성이 변경돼 버그가 발생하기 쉽습니다. 상태를 업데이트할 때마다 새 인스턴스를 생성하면 더 견고한 코드를 만들 수 있습니다.
결론적으로 이 클래스의 모든 속성은 val로 선언하는 것이 좋다고 생각합니다. 인스턴스를 복사하는 비용이 걱정될 수도 있지만 UserModel의 상태가 업데이트되는 빈도는 높지 않을 것입니다. 또한 onlineStatus와 statusMessage만 업데이트되는 경우가 많을 것 같다는 점에서 이들을 다른 안정적인 속성과 분리하는 것이 좋을 수도 있습니다. 예를 들어 다음과 같이 하는 것은 어떨까요?
리뷰 코멘트 작성 방식
- 제안이나 요청 사항을 서두에 쓰고, 그 이유는 뒤에 덧붙일 것
- 리뷰 요청자는 코멘트의 주요 포인트를 먼저 이해하고, 이유의 타당성 검증 가능 → 다시 읽을 필요 감소
- 이유 설명 시에도, 항목이 몇 개인지 먼저 제시한 뒤 각 항목에 제목을 붙여 구조화
개선 결과
UserModel의 값 업데이트 빈도에 따라 클래스를 분리하고 모든 속성을 val로 만드세요.
이 변경은 다음 두 가지 측면에 기반합니다.
객체의 불변성: 가변 객체를 공유하기보다는 상태 업데이트 때마다 불변 객체를 일회용으로 사용하는 것이 의도하지 않은 시점에 속성이 변경되어 발생하는 버그를 방지하기 쉽습니다. 또한 data class에서 var 속성을 정의하면 copy와 쓰임을 구분하는데 혼란을 초래할 수 있으므로 피하는 것이 좋습니다(자세한 내용은 https://… 참조).
값의 라이프사이클: onlineStatus와 statusMessage는 다른 속성보다 더 자주 업데이트됩니다. 업데이트 빈도가 높은 속성과 낮은 속성을 분리하면 잘못된 업데이트를 방지하기 쉽습니다.