Tiny Star
본문 바로가기
Dev Log/Kotlin

[Kotlin] 15줄 제한? 아니 10줄 제한! 메서드를 쪼개는 실전 리팩토링 가이드

by 별터 2026. 1. 6.

1. 서론: 돌아가는 쓰레기(Working Trash) 만들기

우테코 미션의 가장 큰 진입 장벽 중 하나는 "함수 길이 10라인 제한"입니다. 복잡한 비즈니스 로직(특히 2+1 계산)을 구현하면서 동시에 10줄을 맞추려고 하면, 뇌 정지가 오기 십상입니다.

제가 터득한 전략은 이것입니다.

"일단 100줄짜리라도 좋으니 돌아가는 코드를 짜라. 줄이는 건 IDE가 해준다."


2. 본론 1: 거대한 Service 메서드

처음 구현한 `orderItem` 메서드는 30줄이 넘었습니다. 상품 조회, 재고 검증, 날짜 확인, 프로모션 계산, 재고 차감... 모든 로직이 한 곳에 뭉쳐 있었죠.

// 리팩토링 전 (Bad)
fun orderItem(name: String, quantity: Int) {
    val product = productRepo.findByName(name)
    // ... null 체크 ...
    // ... 재고 체크 ...
    if (product.promotion != null) {
        // ... 날짜 체크 ...
        // ... 복잡한 계산식 ...
        // ... 재고 차감 ...
    }
    // ... 나머지 차감 ...
}

이 상태로는 테스트는 통과하지만, 가독성이 떨어지고 요구사항 위반입니다.


3. 본론 2: IntelliJ의 마법 Extract Method

여기서 IntelliJ의 `Extract Method` (단축키: `Ctrl + Alt + M`) 기능을 적극 활용했습니다.

 

[리팩토링 순서]

  1. 의미 단위로 블록 지정: 예를 들어 "프로모션 기간인지 확인하는 if문" 전체를 드래그합니다.
  2. 단축키 실행: 메서드 이름을 묻는 창이 뜹니다.` isPromotionActive`라고 짓습니다.
  3. 확인: 코드가 메서드 호출 한 줄로 바뀝니다.

이 과정을 반복하여 거대했던 메서드를 다음과 같이 쪼갰습니다.

  • `validateAndLoadProduct()`: 상품 찾고 재고 검증
  • `processPromotionIfApplicable()`: 프로모션 기간 체크 및 분기
  • `applyPromotionPolicy()`: 실제 2+1 계산 로직
  • `calculateApplicableSets()`: 세트 수 계산 (수학 로직 분리)
  • `deductSetStock()`: 재고 차감

4. 본론 3: Depth(들여쓰기) 줄이기

메서드 분리뿐만 아니라, if-else 구조를 개선하여 들여쓰기를 줄였습니다.

 

[Before]

if (quantity > 0) {
    if (product != null) {
        // 로직
    }
}

 

[After: Early Return 패턴 적용]

if (quantity <= 0) return
val product = product ?: throw Exception(...)
// 로직

 

부정 조건을 먼저 검사해서 메서드를 종료(`return`)시키거나 예외를 던지면, 핵심 로직의 들여쓰기가 깊어지는 것을 막을 수 있습니다.


5. 결론

처음부터 완벽하게 10줄 이내로 짜는 개발자는 없습니다. 구현 우선 → 테스트 통과 → 리팩토링의 사이클을 지키는 것이 중요합니다. 메서드를 잘게 쪼개니 코드의 이름이 곧 주석이 되었고, 디버깅할 때도 어느 부분에서 틀렸는지 찾기가 훨씬 수월해졌습니다. 10줄 제한은 괴롭히기 위한 룰이 아니라, "읽기 좋은 코드"를 만들기 위한 가이드라인이었습니다.