본문 바로가기
성공지식백과 로고성공지식백과

기능은 되는데 수정할수록 고장나는 AI 코드: 구조·중복·결합도

규칙 하나를 바꾸는데 여러 화면과 저장 경로를 동시에 고친다면 변경의 책임이 흩어져 있을 수 있습니다. 배송비 계산 예시로 규칙·상태·의존 관계를 점검하고 작게 고치는 기준을 설명합니다.

바이브 코딩코드 유지보수리팩터링상태 관리
글 정성준 6분 읽기
공유:

무료 배송 기준을 바꿨는데 장바구니와 결제 화면의 금액이 달라진다면, 수정한 줄 밖에도 같은 규칙이 남아 있을 수 있습니다. 지금의 화면이 동작한다는 사실만으로 다음 변경의 영향을 알 수는 없습니다. 마틴 파울러의 리팩터링 정의는 관측 가능한 동작을 유지하며 내부 구조를 작은 변경으로 개선하는 과정을 설명합니다.

AI가 작성한 코드에도 같은 판단 기준을 적용합니다. 파일 수와 함수 길이를 먼저 목표로 삼으면 코드가 나뉜 뒤에도 규칙의 소유자가 불분명할 수 있습니다. 어느 요구가 바뀔 때 어떤 부분이 함께 바뀌어야 하는지부터 추적하면 구조를 고칠 지점이 드러납니다.

같은 규칙의 복사와 닮은 코드를 구분하기

가상의 쇼핑 앱은 할인 적용 뒤 상품 금액이 5만 원 이상이면 배송비가 없고, 그보다 적으면 3천 원을 받습니다. 예시의 금액과 규칙은 구조 설명을 위해 정한 값이며 실제 상점의 정책이나 실행 결과가 아닙니다. 장바구니, 결제, 주문 생성 코드에 같은 조건이 각각 들어 있으면 기준 금액을 바꿀 때 세 위치를 맞춰 고쳐야 합니다.

세 함수의 이름이 달라도 같은 규칙의 복사일 수 있습니다. cartTotal에서는 합계에 배송비를 더하고, checkoutSummary에서는 무료 배송 문구를 만들고, createOrder에서는 최종 금액을 저장하더라도 같은 기준을 판단합니다. 검색으로 숫자만 찾으면 설정 파일이나 다른 표현으로 작성한 조건을 놓칠 수 있어, 각 값이 만들어지는 흐름도 함께 읽습니다.

반대로 3천 원이라는 숫자가 같다고 배송비와 반품 수수료를 한 상수로 합치면 두 정책을 함께 바꾸게 됩니다. 배송 정책을 바꿀 때 반품 정책이 유지되어야 한다면 서로 다른 변경 책임입니다. 공통 함수로 묶을지는 코드 모양과 변경 이유를 함께 보고 판단합니다.

겉으로는 중복이 없어져도 공통 함수에 여러 정책의 예외 플래그가 쌓일 수 있습니다. isReturn, isAdmin, isPreview 같은 인자가 생길 때는 호출자가 어떤 업무를 맡기는지 확인합니다. 하나의 함수가 서로 다른 이유로 변하는 규칙을 모두 소유하면, 작은 수정의 영향도 다시 넓어집니다.

데이터의 원본, 계산값, 과거 기록을 나누기

React의 상태 구조 원칙은 기존 상태에서 계산할 수 있는 값을 별도 상태로 중복 보관하지 않도록 권합니다. 같은 정보를 여러 상태에 복사하면 갱신 때 서로 맞춰야 하고, 모순된 조합이 생길 수 있기 때문입니다. 이 원칙은 React 화면 상태에 대한 설명이며 모든 캐시와 저장 데이터를 없애라는 규칙으로 확장하지 않습니다.

장바구니의 상품 목록과 합계를 각각 수정 가능한 상태로 두었다면 상품 삭제 뒤 합계 갱신이 빠지는 경로를 찾습니다. 합계가 현재 상품 목록에서 계산되는 값이라면, 원본 목록을 바꿨을 때 화면이 같은 계산 경로를 쓰도록 정리할 수 있습니다. 별도 값을 보관할 이유가 있다면 갱신·무효화의 책임도 함께 설명할 수 있어야 합니다.

확정된 주문의 배송비는 성격이 다릅니다. 그때 적용한 금액을 보존하려는 값이라면 현재 정책으로 매번 다시 계산할 수 없습니다. 이 예시는 주문 생성 시 상품 금액, 배송비, 적용한 정책 버전을 확정해 저장하고 영수증은 그 값을 읽도록 정합니다. 과거 거래를 보존하는 복사와 실시간 계산을 중복 보관하는 상태를 같은 문제로 묶으면 기존 주문 표시가 바뀔 수 있습니다.

자료마다 값을 정하는 주체, 변경 시점, 가리키는 사실의 시점을 적으면 원본을 고를 수 있습니다. 서버 저장값, 화면의 편집 초안, 캐시된 값이 모두 존재할 수 있지만 세 값이 달라도 되는 기간과 합쳐지는 순간은 설명돼야 합니다.

호출 관계를 따라 변경의 바깥 경계를 찾기

함수 이름이나 반환 형식을 바꾸면 호출자도 영향을 받습니다. 파울러의 인터페이스 변경 설명은 모든 호출자를 함께 바꾸는 조건을 강조하며, 외부에 공개한 인터페이스에는 더 주의가 필요하다고 설명합니다. 내부 함수의 새 이름을 적용한 일과 외부 사용자가 쓰는 API의 계약을 바꾸는 일은 변경 범위가 다릅니다.

배송비를 계산하는 함수를 고치기 전에는 그 함수를 부르는 화면, 서버의 주문 생성, 일괄 처리, 시험 코드를 찾습니다. 검색 결과는 시작점입니다. 함수가 다른 이름으로 다시 내보내지거나 문자열로 경로가 결정되면 단순한 이름 검색에 나타나지 않는 호출도 생깁니다. 실제 요청 흐름과 사용 위치를 함께 확인하면 남은 경로를 좁힐 수 있습니다.

외부 SDK나 데이터 저장 코드를 화면이 직접 부르고 있다면 업무 계산과 외부 통신이 한 변경에 묶여 있는지도 봅니다. 화면 색을 바꾸려는 수정에 결제 요청이나 저장 형식을 함께 건드릴 이유가 없다면, 화면 표시와 업무 처리의 경계를 나눌 후보입니다. 현재 변경이 왜 다른 부분으로 번지는지 설명한 뒤 화면과 업무 처리의 경계를 정합니다.

검토 기록에는 변경한 파일 목록과 함께 유지할 계약을 남깁니다. 반환 필드 이름, 금액의 단위, 빈 입력 처리, 오류가 호출자에게 전달되는 방식이 여기에 포함됩니다. 함수 분리 과정에서 실패를 0으로 바꾸면 구조만 고쳤다는 설명과 실제 동작이 달라집니다.

배송비 규칙의 수정 전후 의존 관계 비교

가상 앱의 현재 정책을 한 곳에서 계산하도록 옮기되, 확정 주문의 금액은 그대로 보존하는 설계입니다. 표는 사용하는 곳과 의존 관계를 나타낸 설계 예시입니다. 실행 효과는 측정하지 않았습니다. 변경하려는 요구는 무료 배송 기준의 개정입니다.

사용하는 곳수정 전의 의존 관계구조 정리 뒤의 의존 관계정책을 개정할 때 확인할 범위
장바구니 화면화면 안의 자체 조건으로 배송비 계산현재 정책 계산 함수의 견적을 표시새 견적 표시와 합계·안내 문구의 일치
결제 화면별도 조건으로 배송비와 안내 문구 계산같은 정책 계약으로 임시 견적 표시장바구니와 같은 입력에서 같은 견적인지
주문 생성 서버별도 조건으로 최종 배송비 결정서버가 현재 정책으로 다시 검증하고 최종 금액 확정클라이언트 견적과 다른 경우의 안내·확정 동작
주문 저장최종 금액만 보관해 적용 규칙을 찾기 어려움확정한 금액·배송비·정책 버전을 함께 보관새 주문에 적용할 버전과 저장 항목
과거 주문 영수증현재 정책으로 배송비를 다시 계산주문에 저장한 확정 배송비를 읽음기존 주문의 금액·표시가 유지되는지

표의 설계에서도 화면 견적과 서버 확정은 시점이 다를 수 있습니다. 사용자가 화면을 열어 둔 사이 정책이나 장바구니가 바뀌면 서버에서 확인한 결과를 안내하는 흐름이 필요합니다. 공통 계산식 하나를 만들었다는 이유만으로 시점과 입력의 차이가 사라지지는 않습니다.

표의 계산식 이동은 구조 변경, 주문 저장 항목 추가는 데이터 변경, 기존 영수증의 금액 오류 수정은 동작 변경으로 나누어 진행합니다. 과거 주문에 배송비나 적용한 정책이 남아 있지 않다면, 당시 값을 추정해 채우지 않고 확인할 원자료와 이관 방식을 먼저 정합니다. 검사할 범위가 넓다는 사실과 같은 업무 규칙을 여러 곳에서 직접 고쳐야 한다는 사실도 구분합니다.

구조를 옮기는 변경과 동작을 바꾸는 변경을 나누기

구글의 작은 코드 변경 지침은 한 가지 일을 완결하는 변경과 관련 검사를 함께 두고, 구조 변경을 기능 변경·버그 수정과 분리하는 방식을 권합니다. 관련 코드가 여러 파일에 걸쳐 있더라도 하나의 변경 이유로 검토할 수 있는지가 기준입니다.

배송비 조건을 공통 계산 함수로 옮기는 단계에서는 기존의 5만 원 기준과 3천 원 배송비를 유지합니다. 같은 입력으로 기준 바로 아래, 기준과 같은 금액, 기준을 넘는 금액을 비교합니다. 할인 전후 금액 중 어떤 값을 쓰는지와 과거 주문 표시도 확인합니다. 이 기록은 비교할 시험 설계이며 실제 실행 결과를 뜻하지 않습니다.

기존 동작을 유지하는 정리가 끝난 뒤 무료 배송 기준을 개정하면 변경 이유가 분리됩니다. 예상하지 못한 금액 차이가 생겼을 때 함수 이동 중의 오류인지 새 정책의 결과인지 구분하기 쉬워집니다. 요구사항이 불명확한 동작은 먼저 의도한 결과를 정하고, 현재 결과가 그 기준과 다른 부분을 따로 수정합니다.

코드 검토에서는 “파일이 짧아졌다”와 함께 “규칙을 고칠 위치와 다시 검사할 소비 경로를 설명할 수 있다”를 완료 근거로 남기는 편이 좋습니다. 이런 설계·검토 책임의 범위는 바이브 코딩에서 개발자가 맡는 역할과도 연결됩니다.

자료 확인 기준: 2026년 10월 28일. 배송비 정책·변경 전후 구조·시험 항목은 설명용 설계이며 코드 실행이나 유지보수 효과 측정은 수행하지 않았습니다.

관련 글