피드로 돌아가기
코드 품질 개선 기법 18편: 함수만 보고 관계는 보지 못한다
LINE Engineering
Backend

코드 품질 개선 기법 18편: 함수만 보고 관계는 보지 못한다

LY Corporation이 함수 추출 시 의미 단위 경계를 고려해 중첩 루프 리팩토링의 가독성 문제 해결

2025년 8월 27일8intermediate

Context

페이지와 청크로 분할된 데이터를 처리하는 코드에서 while과 for 루프가 중첩되어 가독성이 떨어졌다. 내부 루프를 단순히 함수로 추출했으나 '모든 Item 조회하기'라는 의미 단위가 두 개 함수로 분산되면서 오히려 코드 이해도가 낮아지는 문제가 발생했다.

Technical Solution

  • 함수 추출 시 코드 구조 유지가 아닌 의미 단위 경계에 초점: '모든 Item 조회'를 별도의 개념 단위로 인식
  • Item 시퀀스를 반환하는 전용 함수 생성: requestItemSequence(): Sequence<Item> 함수로 페이지 반복 로직 캡슐화
  • Kotlin Sequence 클래스 활용: sequence 빌더 블록 내에서 yieldAll(page.chunk)로 모든 페이지의 Item을 순차 반환
  • 페이지 순회 로직 통합: requestItemSequence() 내부에서 page.hasNext 조건을 확인해 다음 페이지 요청 처리
  • 호출 코드 단순화: saveAllItemMetadata()가 단일 루프로 변환되어 '각 Item의 메타데이터 생성 및 저장'이라는 의도를 직관적으로 표현

Key Takeaway

함수 추출 시 추출의 용이성보다는 의미 단위의 경계 정렬을 우선으로 고려해야 한다. 이 원칙은 루프 중첩뿐 아니라 조건 분기 중첩이나 데이터 구조 중첩에도 적용할 수 있다.


중첩된 루프 구조를 리팩토링하는 상황에서 내부 루프만 함수로 추출하기보다는, 데이터 조회와 처리 로직의 의미 단위를 분리하고 Iterator나 Sequence 패턴을 사용해 반복 로직을 캡슐화하면 호출부의 코드 의도를 명확히 표현할 수 있다.

원문 읽기
코드 품질 개선 기법 18편: 함수만 보고 관계는 보지 못한다 | Devpick