Peer Review#
Peer Review는 소프트웨어 개발 과정에서 중요한 품질 보증 활동으로, 동료 개발자들이 서로의 코드나 문서를 검토하여 오류를 찾고 개선점을 제시하는 과정이다.
코드 리뷰가 중요한 이유는 여러 가지가 있다.
- 버그나 보안 취약점을 조기에 발견할 수 있다.
- 코드의 일관성과 유지보수성을 높일 수 있다.
- 팀 전체의 기술력 향상에 도움이 된다. 한 명의 실수나 실수를 하기 쉬운 부분을 여러 사람이 검토함으로써, 더 높은 품질의 코드를 만들 수 있다.
Peer Review의 목적#
- 오류 가능성 발견 및 해결
- 소프트웨어 품질 향상
- 개발자 스킬 향상
- 팀 내 지식 및 경험 공유
Peer Review의 장점#
- 개발 초기 단계에서 실수 발견 및 수정 가능
- 전체적인 코드 품질 향상
- 팀 내 상호 신뢰 및 동기 부여 증진
- 가독성 높은 코드 작성 촉진
- 개선된 설계 발견 기회
Peer Review 프로세스#
Peer Review는 일반적으로 다음과 같은 단계로 진행된다:
- 계획 (Planning)
- 사전 설명회 (Overview)
- 개별 검토 (Preparation)
- Review 미팅 (Meeting)
- 재작업 (Rework)
- 후속 처리 (Follow-up)
Peer Review 참여자 역할#
- 관리자: 전체 프로세스 관리
- 중재자: 리뷰 미팅 진행
- 작성자: 검토 대상 코드/문서 작성자
- 검토자: 실제 리뷰 수행
- 기록자: 리뷰 결과 기록
- 발표자: 리뷰 대상 설명
Peer Review 성공을 위한 요소#
- 회사 차원의 정책적 지원
- 개발 일정에 Peer Review 시간 포함
- 동료 간 수평적 관계 유지
- 자주 짧게 진행하는 리뷰 문화 형성
- 리뷰어의 시간을 존중하는 태도
- 건설적인 피드백 제공 및 수용
Peer Review 시 주의사항#
- 리뷰 대상은 200 LOC 미만으로 유지, 최대 400 LOC를 넘지 않도록 함
- 리뷰 시간은 60분 미만으로 유지
- 개인 비난이나 공격적인 질문 피하기
- 칭찬과 긍정적 피드백 포함하기
- 코드 품질 향상에 집중하기
Peer Review의 한계#
- 시간과 리소스 소요
- 리뷰를 거쳐도 일부 결함을 놓칠 수 있음
- 팀 문화와 개인의 태도에 따라 효과성이 달라질 수 있음
소프트웨어 개발 과정에서 품질 보증을 위해 사용되는 두 가지 주요 검토 방식이다.
이 두 방식은 소프트웨어 제품의 품질을 향상시키고 결함을 조기에 발견하기 위한 목적으로 사용되지만, 그 접근 방식과 특징에 차이가 있다.
Formal Review는 구조화된 프로세스를 따르며, 훈련된 중재자가 이끄는 공식적인 검토 방식이다.
아래와 같은 특징을 가진다:
- 문서화된 엄격한 프로세스 준수
- 정의된 역할과 책임
- 사전 준비 강조
- 공식적인 결함 기록 및 보고서 작성
- 메트릭 수집 및 분석
Informal Review는 덜 구조화되고 유연한 검토 방식이다.
아래와 같은 특징을 가진다:
- 중재자 없이 진행
- 구조화되지 않은 프로세스
- 개인적인 요청에 의해 수행되는 경우가 많음
- 기록이나 메트릭 수집이 없거나 최소화됨
분류 | 검토 유형 | 주요 특징 | 참여자 | 목적 | 형식성 수준 |
---|
Formal Review | Inspection(검사) | 가장 공식적이고 체계적인 검토 방식 상세한 체크리스트 사용 철저한 문서화 | 검사자(Inspector) 작성자 사회자 서기 | 결함 발견 품질 보증 프로세스 개선 | 매우 높음 |
Formal Review | Audit(감사) | 독립적인 전문가에 의한 검토 규정 준수 여부 확인 객관적 평가 | 감사자 피감사자 이해관계자 | 규정 준수 확인 품질 보증 리스크 관리 | 높음 |
Formal Review | Technical Review(기술 검토) | 기술적 내용에 중점 동료 전문가에 의한 검토 기술적 대안 제시 | 기술 전문가 개발자 설계자 | 기술적 완성도 검증 대안 평가 품질 향상 | 중상 |
Formal Review | Management Review(관리 검토) | 진행 상황과 계획 검토 의사결정 중심 프로젝트 관리 관점 | 관리자 팀 리더 이해관계자 | 진행상황 확인 의사결정 리스크 관리 | 중상 |
Informal Review | Code Review(코드 리뷰) | 개발자 간 코드 검토 자유로운 의견 교환 즉각적 피드백 | 개발자 리뷰어 | 코드 품질 향상 지식 공유 버그 발견 | 중 |
Informal Review | Pair Programming(페어 프로그래밍) | 두 명이 함께 코딩 실시간 리뷰 즉각적 피드백 | 드라이버 네비게이터 | 품질 향상 지식 공유 실시간 오류 수정 | 중하 |
Informal Review | Walkthrough(워크스루) | 작성자가 코드 설명 비형식적 미팅 교육적 성격 | 발표자 참가자들 | 이해도 향상 피드백 수집 지식 공유 | 중하 |
Informal Review | Pass Around(패스어라운드) | 순차적 검토 유연한 일정 문서 기반 검토 | 여러 리뷰어 작성자 | 다양한 관점 수집 편의성 시간 효율성 | 낮음 |
Informal Review | Desk Check(데스크 체크) | 개발자 자체 검토 즉각적 수행 기본적 검증 | 개발자 본인 | 기본 오류 검출 품질 향상 시간 절약 | 매우 낮음 |
이러한 다양한 검토 방식들은 각각의 장단점과 적합한 상황이 있으며, 프로젝트의 특성과 상황에 따라 적절히 선택하여 적용하는 것이 중요하다.
특히 형식적 검토와 비형식적 검토를 적절히 조합하여 사용함으로써, 효과적인 품질 관리와 개발 프로세스 개선을 달성할 수 있다.
또한 각 검토 방식의 특성을 이해하고, 프로젝트의 규모, 중요도, 시간 제약, 팀의 문화 등을 고려하여 가장 적합한 검토 방식을 선택하는 것이 중요하다.
이를 통해 효율적인 품질 관리와 지속적인 개선이 가능해진다.
참고 및 출처#
데스크 체크(Desk Check) 데스크 체크는 코드를 작성한 개발자가 자신의 “책상에서” 수행하는 자체 검토 활동이다.
이는 마치 작가가 원고의 초안을 검토하는 것과 유사하다.
개발자는 자신이 작성한 코드를 한 줄씩 꼼꼼히 읽어가며 논리적 오류나 잠재적 문제를 찾아낸다.
데스크 체크의 실제 적용 예시:
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 // 데스크 체크 과정의 예시 public class PaymentProcessor { public boolean processPayment(double amount, String cardNumber) { // 데스크 체크 포인트 1: 입력값 검증 // - amount가 음수인 경우는 없는지? // - cardNumber가 null이거나 빈 문자열은 아닌지? if (amount <= 0 || cardNumber == null || cardNumber.isEmpty()) { return false; } // 데스크 체크 포인트 2: 카드 번호 형식 검증 // - 숫자로만 구성되어 있는지? // - 길이가 올바른지? if (!validateCardNumber(cardNumber)) { return false; } // 데스크 체크 포인트 3: 결제 처리 로직 // - 예외 처리가 적절한지? // - 트랜잭션 처리가 정확한지? try { return executePayment(amount, cardNumber); } catch (PaymentException e) { logError("Payment failed", e); return false; } } } 데스크 체크 수행 방법 체계적 검토 프로세스
개발자는 다음과 같은 순서로 코드를 검토한다: 코드 구조 검토 논리적 흐름 확인 예외 상황 고려 성능 관련 검토 코드 스타일 확인 체크리스트 활용
효과적인 데스크 체크를 위한 체크리스트 예시: 기본적인 검증 사항들 null 참조 가능성 검사 경계 조건 검사 리소스 관리 확인 보안 관련 검토 문서화 적절성 확인 데스크 체크의 장점과 효과 즉각적인 문제 발견
개발자가 코드를 작성한 직후에 검토함으로써 문제를 빠르게 발견할 수 있다:
...
워크스루(Walkthrough) 워크스루는 마치 박물관 가이드가 관람객들을 안내하듯이, 코드 작성자가 리뷰어들을 코드를 통해 “안내"하는 과정이다.
이 과정에서 코드의 의도, 구현 방식, 그리고 잠재적인 문제점들을 함께 발견하고 논의할 수 있다.
워크스루 세션의 실제 예시:
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 // 워크스루 세션 중 코드 설명 예시 public class OrderProcessor { // 발표자: "주문 처리 시스템의 핵심 클래스입니다. // 주문의 유효성 검사부터 결제, 배송 처리까지 담당합니다." private final PaymentService paymentService; private final InventoryService inventoryService; private final ShippingService shippingService; public OrderResult processOrder(Order order) { // 발표자: "먼저 주문의 유효성을 검사합니다. // 여기서 중요한 것은 재고 확인입니다." if (!validateOrder(order)) { throw new InvalidOrderException("Invalid order"); } // 발표자: "재고가 확인되면 결제를 진행합니다. // 결제는 트랜잭션으로 처리됩니다." PaymentResult payment = paymentService.processPayment(order); // 리뷰어 질문: "결제 실패 시 재고는 어떻게 처리되나요?" // 발표자: "좋은 지적입니다. 결제 실패 시 재고를 원복하는 // 로직을 추가해야 할 것 같네요." if (payment.isSuccessful()) { // 발표자: "결제가 성공하면 배송 처리를 시작합니다." return createShippingOrder(order, payment); } return OrderResult.failure("Payment failed"); } } 워크스루의 주요 특징과 장점 상호작용적 학습
참가자들은 실시간으로 질문하고 토론할 수 있다:
...
코드 리뷰 (Code Review) 코드 리뷰는 개발자가 작성한 코드를 다른 개발자들이 검토하고 피드백을 제공하는 과정이다.
이는 마치 작가들이 서로의 글을 읽고 조언을 주고받는 것과 유사하다.
주된 목적은 코드의 품질을 향상시키고 팀 내의 지식 공유를 촉진하는 것이다.
코드 리뷰의 실제 적용 예시:
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 // 리뷰가 필요한 코드 예시 public class UserService { public void createUser(String username, String password) { // 데이터베이스에 직접 저장 database.execute( "INSERT INTO users (username, password) VALUES ('" + username + "', '" + password + "')" ); } } // 리뷰어의 피드백 후 개선된 코드 public class UserService { /** * 새로운 사용자를 생성하고 저장합니다. * @param username 사용자 이름 * @param password 비밀번호 * @throws ValidationException 유효하지 않은 입력값 */ public void createUser(String username, String password) { // 입력값 검증 validateInput(username, password); // 비밀번호 해싱 String hashedPassword = passwordHasher.hash(password); // 준비된 구문을 사용하여 SQL 인젝션 방지 userRepository.save(new User(username, hashedPassword)); } } 주요 특징 품질 보증:
코드 리뷰는 버그를 찾아내고, 코드 품질을 향상시키며, 보안 취약점을 발견하는 데 도움을 준다.
여러 눈이 검토하므로 한 사람이 놓칠 수 있는 문제점들을 더 쉽게 발견할 수 있다. 지식 공유:
팀 멤버들이 서로의 코드를 검토하면서 자연스럽게 지식을 공유하고 학습할 수 있다.
주니어 개발자는 시니어의 피드백을 통해 성장할 수 있고, 시니어 개발자도 새로운 관점을 얻을 수 있다. 일관성 유지:
팀의 코딩 표준과 모범 사례를 준수하는지 확인함으로써, 전체 코드베이스의 일관성을 유지할 수 있다. 코드 리뷰 프로세스의 주요 단계 리뷰 준비
개발자는 리뷰를 위해 코드를 준비할 때 다음 사항들을 고려한다:
...
패스 어라운드(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()); } } 프로세스 코드 작성자가 리뷰 대상 코드를 공유 참여자들이 개별적으로 코드 검토 각자의 의견을 메일이나 시스템에 기록 코드 작성자가 피드백을 수집하고 필요한 수정 진행 패스 어라운드의 장점과 효과 다양한 관점에서의 검토
여러 전문가의 시각으로 코드를 검토할 수 있다:
...
감사(Audit) 독립적인 검토자들이 소프트웨어 산출물과 프로세스를 체계적으로 검사하고 평가하는 공식적인 검토 과정이다.
이는 마치 회계 감사와 유사하게, 객관적인 기준에 따라 철저하게 검증하는 과정이다.
외부 또는 독립적인 감사자에 의해 수행되며, 주로 규정 준수와 품질 표준 충족 여부를 확인하는 데 중점을 둔다.
Audit의 주요 특징 공식성과 체계성
Audit은 가장 공식적인 검토 형태.
모든 과정이 문서화되며, 정해진 절차와 체크리스트에 따라 진행된다.
예를 들어:
1 2 3 4 5 6 7 8 Audit 계획서 1. 검토 범위: 사용자 인증 모듈 전체 2. 검토 일정: 2024.01.15 - 2024.01.19 3. 참여자 역할: - 주검토자: 김철수 (보안팀) - 부검토자: 이영희 (품질관리팀) - 기술지원: 박지민 (개발팀) 4. 검토 기준: ISO/IEC 27001 보안 표준 독립성
Audit을 수행하는 검토자들은 해당 프로젝트나 코드 개발에 직접 참여하지 않은 독립적인 인원들로 구성된다.
이는 객관적인 평가를 보장하기 위함이다.
...
페어 프로그래밍(Pair Programming) 페어 프로그래밍에서는 두 명의 개발자가 서로 다른 역할을 맡는다.
‘드라이버(Driver)‘는 실제로 코드를 작성하는 사람이고, ‘네비게이터(Navigator)‘는 코드를 검토하고 방향을 제시하는 사람이다.
이 두 역할은 주기적으로 교대한다.
실제 페어 프로그래밍 예시:
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 // 페어 프로그래밍 세션 예시 // Driver가 코드를 작성하고, Navigator가 실시간으로 리뷰와 제안을 합니다 // Navigator: "사용자 등록 기능을 구현해볼까요? 먼저 입력값 검증부터 시작하는게 좋겠어요." // Driver: "네, 동의합니다. 사용자 이름과 이메일 유효성을 체크하는 메서드부터 작성할게요." public class UserRegistration { public boolean registerUser(String username, String email) { // Navigator: "null 체크도 필요할 것 같네요." // Driver: "네, 좋은 지적입니다. 추가하겠습니다." if (username == null || email == null) { return false; } // Navigator: "이메일 형식 검증도 필요할 것 같아요." // Driver: "이메일 정규식을 사용해서 검증하면 좋겠네요." if (!validateEmailFormat(email)) { return false; } // Navigator: "사용자 이름 길이 제한도 있어야 할 것 같아요." // Driver: "네, 최소 3자, 최대 20자로 제한하겠습니다." if (username.length() < 3 || username.length() > 20) { return false; } // 실제 등록 로직 구현… return saveUser(username, email); } } 페어 프로그래밍의 주요 이점 실시간 코드 리뷰
두 명이 함께 작업하면서 즉각적인 피드백이 가능하다:
...
인스펙션 (inspection) 인스펙션(Inspection)은 정적 테스팅의 한 형태로, 가장 공식적이고 체계적인 리뷰 방법이다.
인스펙션은 FTR(Formal Technical Review)라고도 불리며, 정형화된 절차와 체크리스트를 사용하여 소프트웨어 산출물의 결함을 찾아내는 방법이다.
이는 정적 테스트 방법 중 가장 많은 인원이 참여하고 가장 공식적인 프로세스를 따른다.
주요 목적 결함 발견: 코드나 문서의 오류를 조기에 식별한다. 품질 향상: 소프트웨어 산출물의 전반적인 품질을 개선한다. 프로세스 개선: 개발 프로세스의 문제점을 파악하고 개선한다. 인스펙션 대상 인스펙션은 다음과 같은 소프트웨어 산출물에 적용된다:
...
관리 검토(Management Review) 관리 검토는 소프트웨어 개발 프로젝트의 진행 상황, 목표 달성도, 리스크 등을 경영진과 프로젝트 관리자가 검토하는 공식적인 프로세스이다.
이는 기술적 세부사항보다는 프로젝트의 전반적인 상태와 비즈니스 목표 달성 여부에 초점을 맞춘다.
관리 검토의 주요 목적 프로젝트 현황 평가
프로젝트의 진행 상황을 검토하고 계획대로 진행되고 있는지 확인한다.
예를 들어:
1 2 3 4 1. 계획된 진행률 2. 실제 진행률 3. 현재 식별된 리스크 4. 예산 현황 비즈니스 목표 정렬성 확인
개발되고 있는 소프트웨어가 조직의 비즈니스 목표와 부합하는지 검토한다:
...
기술 검토(Technical Review) 기술 검토는 소프트웨어의 기술적 측면을 전문가들이 체계적으로 평가하는 공식적인 검토 프로세스이다.
이는 코드의 품질, 아키텍처의 적절성, 기술적 의사결정의 타당성 등을 검증하는 과정이다.
마치 건축가들이 건물의 설계도를 검토하는 것과 유사하게, 소프트웨어 엔지니어들이 시스템의 기술적 측면을 심도 있게 검토한다.
기술 검토의 주요 목적 기술적 완성도 평가
시스템의 기술적 설계와 구현이 요구사항을 충족하는지 확인한다.
기술적 리스크 식별
잠재적인 기술적 문제점과 리스크를 조기에 발견한다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 기술 리스크 체크리스트 1. 성능 관련 □ 응답 시간 요구사항 충족 □ 확장성 고려사항 □ 리소스 사용 효율성 2. 보안 관련 □ 인증/인가 메커니즘 □ 데이터 암호화 □ 취약점 대응 방안 3. 유지보수성 □ 코드 모듈화 □ 문서화 수준 □ 테스트 용이성 기술 검토의 주요 영역 아키텍처 검토
시스템 구조의 적절성을 평가한다.
...