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`) 기능을 적극 활용했습니다.
[리팩토링 순서]
- 의미 단위로 블록 지정: 예를 들어 "프로모션 기간인지 확인하는 if문" 전체를 드래그합니다.
- 단축키 실행: 메서드 이름을 묻는 창이 뜹니다.` isPromotionActive`라고 짓습니다.
- 확인: 코드가 메서드 호출 한 줄로 바뀝니다.
이 과정을 반복하여 거대했던 메서드를 다음과 같이 쪼갰습니다.
- `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줄 제한은 괴롭히기 위한 룰이 아니라, "읽기 좋은 코드"를 만들기 위한 가이드라인이었습니다.
'Dev Log > Kotlin' 카테고리의 다른 글
| [우테코/코테] "검색 시간 0초" 시험장용 만능 유틸 코드 모음집 (복붙용) (1) | 2026.01.06 |
|---|---|
| [우테코] 🏪 편의점 과제: 재고가 먼저인가 검증이 먼저인가? Controller와 Service의 역할 분담과 예외 처리 순서 (0) | 2026.01.06 |
| [우테코] 🏪편의점 미션: 흩어진 데이터를 하나의 객체로 모으는 기술 (feat. 프로모션/일반 재고 관리) (0) | 2026.01.06 |
| [Kotlin] static은 잊어라, Companion Object(동반 객체)의 모든 것 (1) | 2026.01.04 |
| [Kotlin] 컬렉션(Collection) 마스터하기: List, Set, Map 그리고 Sequence의 성능 차이 (3) | 2026.01.04 |