패스 어라운드(Pass Around)

패스 어라운드는 마치 책을 여러 사람이 돌려가며 읽는 것처럼, 코드를 여러 개발자들이 순차적으로 검토하는 방식이다.
각 리뷰어는 자신의 전문 분야나 관점에서 코드를 검토하고 피드백을 제공한다.
예를 들어, 한 개발자는 성능 관점에서, 다른 개발자는 보안 관점에서 같은 코드를 검토할 수 있다.

실제 패스 어라운드 프로세스의 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 첫 번째 리뷰어 (성능 전문가)의 검토
public class DataProcessor {
    public List<Result> processData(List<Data> dataList) {
        // 성능 관련 코멘트:
        // "대용량 데이터 처리 시 메모리 문제가 발생할 수 있습니다.
        // 스트림을 사용하여 처리하는 것이 좋겠습니다."
        return dataList.stream()
            .filter(Data::isValid)
            .map(this::transform)
            .collect(Collectors.toList());
    }
}

// 두 번째 리뷰어 (보안 전문가)의 검토 후 수정된 버전
public class DataProcessor {
    public List<Result> processData(List<Data> dataList) {
        // 보안 관련 코멘트:
        // "입력 데이터의 유효성 검증이 필요합니다.
        // 또한 처리 과정에서의 로깅이 필요합니다."
        if (dataList == null) {
            throw new IllegalArgumentException("Data list cannot be null");
        }

        logger.info("Starting data processing for {} items", dataList.size());
        
        return dataList.stream()
            .filter(this::validateData)
            .map(this::transform)
            .collect(Collectors.toList());
    }
}

// 세 번째 리뷰어 (테스트 전문가)의 검토 후 추가된 테스트 코드
@Test
public class DataProcessorTest {
    // 테스트 관련 코멘트:
    // "경계 조건과 예외 상황에 대한 테스트가 필요합니다."
    @Test
    void testProcessDataWithNullInput() {
        assertThrows(IllegalArgumentException.class, 
            () -> processor.processData(null));
    }
    
    @Test
    void testProcessDataWithEmptyList() {
        assertTrue(processor.processData(Collections.emptyList()).isEmpty());
    }
}

프로세스

  1. 코드 작성자가 리뷰 대상 코드를 공유
  2. 참여자들이 개별적으로 코드 검토
  3. 각자의 의견을 메일이나 시스템에 기록
  4. 코드 작성자가 피드백을 수집하고 필요한 수정 진행

패스 어라운드의 장점과 효과

  1. 다양한 관점에서의 검토
    여러 전문가의 시각으로 코드를 검토할 수 있다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    // 여러 전문가의 관점이 반영된 코드 예시
    public class PaymentService {
        // 비즈니스 로직 전문가의 관점
        @Transactional
        public PaymentResult processPayment(Payment payment) {
            // 보안 전문가의 관점
            validatePaymentData(payment);
    
            // 성능 전문가의 관점
            @Cacheable("payments")
            PaymentResult result = paymentProcessor.process(payment);
    
            // 모니터링 전문가의 관점
            metrics.recordPaymentProcessing(result);
    
            return result;
        }
    }
    
  2. 유연한 일정 관리
    각 리뷰어가 자신의 시간에 맞춰 검토할 수 있다.

패스 어라운드의 효과적인 구현 방법

  1. 리뷰 순서 최적화
    전문성과 가용성을 고려하여 리뷰 순서를 결정한다.

  2. 피드백 통합 관리
    여러 리뷰어의 피드백을 효과적으로 관리한다.


참고 및 출처