피드로 돌아가기
원문 읽기
LINE Engineering
Backend코드 품질 개선 기법 30편: (투명한) 운명의 붉은 실
LY Corporation이 함수 간 암묵적 연관성을 명시적 의존성으로 통합해 런타임 에러를 컴파일 타임에 감지 가능하게 변경
AI 요약
Context
UI 레이어에서 메시지 콘텐츠를 표시할 때 isContentValid() 함수로 유효성 검사 후 getMessageText() 함수로 텍스트를 추출하고 있었습니다. 두 함수 간에 암묵적인 연관성이 있어서, isContentValid()가 true를 반환할 때만 getMessageText()를 호출해야 한다는 전제가 지켜지지 않으면 런타임 에러가 발생했습니다.
Technical Solution
- 두 함수의 암묵적 연관성을 제거하기 위해
getMessageText()함수를 String에서 String?로 반환 타입 변경: Empty와 Error 타입일 때 null 반환, Text와 Event 타입일 때 문자열 반환 - 호출부(bindToViews)를
getMessageText()반환값의 null 여부로 조건 분기하도록 수정:messageText != null체크로 레이아웃 표시 여부 결정 isContentValid()함수를 독립 함수에서getMessageText()호출 결과로 재구현:getMessageText(content) != null로 정의하여 두 함수 간 일관성 보장
Key Takeaway
함수 간에 암묵적인 선행 조건(precondition)이 있을 경우, 함수를 하나로 통합하거나 한 함수를 다른 함수의 구현으로 명시적으로 의존시켜야 타입 시스템이 불일치를 감지할 수 있습니다.
실천 포인트
Kotlin 또는 Java에서 값 변환과 유효성 검사 로직이 밀접하게 연관되어 있다면, 검사 함수를 Optional/Nullable 반환 타입의 변환 함수로 통합하고 호출부에서 그 결과를 직접 조건문에 사용하면 함수 간 계약을 컴파일 타임에 강제할 수 있습니다.