이 페이지에서 다루는 것
AI 의존성 업그레이드 운영
한 번에 끝까지 읽으며 맥락을 쌓을 수 있도록 구성했습니다.
AI가 패키지를 올릴 때 의존성 인벤토리, 락파일, 변경 로그, 호환성 매트릭스, 스모크 테스트, 카나리 배포, 롤백 기준으로 안전하게 검증하는 실전 루프
학습 유형
주제 심층 학습
핵심 주제
AI 의존성 업그레이드 운영
키워드
VIBE 코딩 · 의존성 업그레이드 · 패키지 관리 · 릴리스 안전 · 스모크 테스트 · 롤백
이 페이지에서 다루는 것
AI 의존성 업그레이드 운영
한 번에 끝까지 읽으며 맥락을 쌓을 수 있도록 구성했습니다.
예상 학습 시간
13분
본문과 보조 자료(이미지·영상)를 포함한 대략적인 소요입니다.
학습 팁
섹션 순서대로 읽고, 필요한 부분만 다시 찾아보기
표·이미지·영상은 본문 흐름을 돕는 보조 설명입니다.
AI에게 의존성 업그레이드를 맡기면 속도는 빨라지지만 위험도 함께 빨라집니다. 패키지 하나를 올리는 일은 단순히 버전 숫자를 바꾸는 작업이 아닙니다. 런타임, 빌드 도구, 테스트 러너, 타입 정의, 브라우저 번들, 서버 배포 환경, 보안 패치, 락파일까지 연결된 작은 릴리스입니다. AI가 '최신 버전으로 올려줘'라는 요청을 받으면 대개 가장 빠른 경로를 찾습니다. 그런데 운영자는 '안전하게 올렸는가'를 확인해야 합니다. 이 글은 VIBE 코딩에서 AI 의존성 업그레이드를 안전한 릴리스 루프로 바꾸는 방법을 다룹니다.
초보자는 의존성을 앱이 빌려 쓰는 부품이라고 생각하면 됩니다. 부품을 새것으로 바꾸면 성능과 보안은 좋아질 수 있지만, 크기와 규격이 달라지면 기존 제품에 맞지 않을 수 있습니다. 실무자에게는 더 구체적입니다. 업그레이드 범위를 작게 자르고, 변경 로그와 브레이킹 체인지를 읽고, 락파일 변화를 검토하고, 호환성 매트릭스와 회귀 테스트를 통과시킨 뒤, 카나리 배포와 롤백 기준까지 준비해야 합니다. AI는 이 과정을 빠르게 도울 수 있지만, 순서를 생략하게 두면 장애를 더 빨리 만들 뿐입니다.
AI 의존성 업그레이드 가드레일의 핵심은 '최신화'가 아니라 '증거가 남는 작은 릴리스'입니다. AI에게 한 번에 모든 패키지를 최신으로 올리라고 지시하지 않습니다. 먼저 의존성 인벤토리를 만들고, 업그레이드 이유를 보안 패치, 런타임 호환, 기능 필요, 유지보수 종료 중 하나로 분류합니다. 그다음 패키지 매니저의 락파일 변화, 변경 로그, 브레이킹 체인지, 타입 오류, 빌드 결과, 스모크 테스트, 회귀 테스트, 성능 예산, 카나리 배포, 롤백 기준을 한 묶음으로 검증합니다.
실무 루프는 이렇게 정리할 수 있습니다. 첫째, AI 작업 지시서에는 목표 패키지와 허용 범위를 적습니다. 둘째, 현재 의존성 인벤토리를 뽑아 어떤 패키지가 직접 의존성이고 어떤 것이 하위 의존성인지 구분합니다. 셋째, 변경 로그를 읽어 브레이킹 체인지와 마이그레이션 항목을 요약하게 합니다. 넷째, 호환성 매트릭스를 만들어 런타임, 프레임워크, 테스트 도구, 배포 환경이 함께 맞는지 확인합니다. 다섯째, 락파일과 설정 파일 변경을 분리해서 리뷰합니다. 여섯째, 타입 검사, lint, 단위 테스트, 통합 테스트, 대표 화면 스모크 테스트를 실행합니다. 일곱째, 배포 전 성능 예산과 번들 크기 변화를 확인합니다. 여덟째, 카나리 배포와 롤백 기준을 문서화합니다.
이 루프는 느리게 일하자는 뜻이 아닙니다. 오히려 AI가 가장 잘하는 반복 조사와 변경 후보 생성을 활용하되, 사람이 운영 책임을 질 수 있는 증거를 남기는 방식입니다. 의존성 업그레이드는 자주 해야 안전합니다. 하지만 자주 하려면 매번 불안하지 않아야 합니다. 불안하지 않은 업그레이드는 작은 범위, 명확한 검증, 빠른 되돌림에서 나옵니다.
패키지 업그레이드는 보안 패치 때문에 시작되는 경우가 많습니다. 취약한 하위 패키지를 없애거나, 지원이 끝나는 런타임을 벗어나거나, 프레임워크의 최신 보안 수정이 필요할 수 있습니다. 문제는 보안 패치가 제품 동작을 바꾸는 순간입니다. 날짜 파서가 달라져 결제 기한 계산이 바뀌거나, 이미지 최적화 동작이 달라져 페이지 로딩이 느려지거나, 요청 처리 방식이 달라져 인증 흐름이 깨질 수 있습니다.
AI는 보안 패치 목록을 빠르게 찾아주고 수정 코드를 제안할 수 있습니다. 그러나 AI가 실제 사용자 흐름을 모두 이해한다고 가정하면 위험합니다. 패키지의 공개 예제는 통과하지만 우리 서비스의 조합에서는 깨질 수 있습니다. 그래서 업그레이드를 코드 수정이 아니라 작은 제품 릴리스로 다뤄야 합니다. 어떤 사용자 흐름이 영향을 받는지, 어떤 페이지가 대표 스모크 테스트에 들어가는지, 실패하면 어디까지 되돌릴지 정해야 합니다.
초보자는 락파일을 자동으로 바뀌는 긴 파일로 보고 넘기기 쉽습니다. 하지만 락파일은 실제 설치될 패키지 버전의 계약서입니다. 직접 바꾼 패키지는 하나라도 하위 의존성이 수십 개 바뀔 수 있습니다. 이 변화가 빌드 시간, 번들 크기, 서버 런타임, 테스트 환경에 영향을 줄 수 있습니다.
AI 작업 지시서에는 '락파일 변경을 설명하라'는 요구가 있어야 합니다. 단순히 파일이 바뀌었다고 말하는 것이 아니라, 직접 의존성 변화와 하위 의존성 변화를 나누고, 보안 패치로 바뀐 항목과 버전 정렬 때문에 바뀐 항목을 구분하게 해야 합니다. 패키지 매니저가 바뀌었거나 설치 전략이 달라졌다면 그 자체가 별도 리스크입니다. 이 설명이 없으면 리뷰어는 긴 diff를 눈으로 훑다가 중요한 변화를 놓칩니다.
AI에게 '오래된 패키지를 정리해줘'라고 말하면 종종 여러 패키지와 설정을 한 번에 건드립니다. 빌드가 통과하면 좋아 보이지만, 실패했을 때 원인을 찾기 어렵습니다. Next 버전, 테스트 러너, 타입스크립트 설정, UI 라이브러리, 린터 규칙이 동시에 바뀌면 어느 변화가 장애를 만들었는지 추적하기 어렵습니다.
업그레이드 범위는 목적 단위로 잘라야 합니다. 보안 패치 하나, 런타임 호환 하나, 프레임워크 minor 업데이트 하나처럼 되돌릴 수 있는 단위가 좋습니다. 여러 패키지를 함께 올려야 하는 경우에는 호환성 매트릭스에 이유를 남깁니다. 예를 들어 프레임워크 업데이트 때문에 플러그인과 타입 패키지를 함께 올려야 한다면 그것은 묶음입니다. 단순히 최신 버전이 있다는 이유로 함께 올리는 것은 묶음이 아닙니다.
작업을 시작하기 전에 현재 상태를 기록합니다. 직접 의존성, 개발 의존성, 런타임 의존성, 빌드 도구, 테스트 도구, 배포에 관여하는 패키지를 나눕니다. AI에게는 다음과 같은 역할을 맡길 수 있습니다. '현재 패키지 목록을 목적별로 분류하고, 사용자 요청과 관련된 후보만 표시해라. 직접 의존성과 하위 의존성을 섞지 말고, 패키지 매니저와 락파일 종류를 함께 적어라.'
이 단계의 산출물은 긴 표가 아니라 판단 가능한 요약이어야 합니다. 예를 들면 '런타임 핵심: 프레임워크, React 계열, 서버 렌더링 관련 패키지', '품질 도구: 테스트 러너, 타입 검사, 린터', '배포 영향: 이미지 처리, 빌드 어댑터, 서버리스 관련 패키지'처럼 묶습니다. 초보자에게는 이 분류가 의존성 지도를 만들어 줍니다. 실무자에게는 리뷰 범위와 테스트 범위를 정하는 근거가 됩니다.
좋은 업그레이드 PR은 '무엇을 최신화했다'보다 '왜 지금 이 범위만 바꿨는가'가 분명합니다. 이유는 보안 패치, 유지보수 종료 대응, 런타임 호환, 특정 기능 필요, 성능 개선, 개발자 경험 개선 중 하나 이상이어야 합니다. 이유가 '그냥 오래됐다'라면 한 번에 올리기보다 조사 이슈로 분리하는 편이 안전합니다.
AI 작업 지시서에는 업그레이드 범위 제한을 넣습니다. 예를 들어 '이번 작업은 테스트 러너만 대상으로 하고, 프레임워크와 빌드 도구는 바꾸지 않는다', '이번 작업은 보안 패치가 필요한 직접 의존성 하나와 그 하위 의존성만 허용한다', '설정 파일 변경은 테스트 실행에 필요한 경우만 허용한다'처럼 씁니다. 이렇게 해야 AI가 선의로 주변 파일까지 고치는 일을 줄일 수 있습니다.
패키지 업그레이드에서 변경 로그는 선택 자료가 아닙니다. AI에게 변경 로그를 읽게 하되, 그대로 복사하게 하면 안 됩니다. 필요한 것은 우리 서비스에 영향을 줄 수 있는 항목 요약입니다. 런타임 요구 버전, 제거된 옵션, 기본값 변경, 타입 정의 변경, 빌드 출력 변화, 보안 관련 수정, 마이그레이션 단계가 핵심입니다.
좋은 요약은 '우리 코드에서 확인할 위치'를 포함합니다. 예를 들어 라우팅 동작이 바뀌었다면 라우트 파일과 링크 생성 로직을 확인하고, 이미지 처리 기본값이 바뀌었다면 대표 이미지가 있는 페이지를 확인하고, 테스트 러너의 모듈 해석이 바뀌었다면 설정 파일과 import 경로를 확인합니다. 브레이킹 체인지가 없다고 표시된 minor 업데이트라도 하위 의존성의 환경 요구가 바뀔 수 있으므로 락파일 변화와 함께 봅니다.
호환성 매트릭스는 어렵게 들리지만 간단합니다. 행에는 바뀌는 패키지와 주변 패키지를 두고, 열에는 현재 버전, 목표 버전, 필요한 런타임, 관련 설정, 검증 명령, 대표 사용자 흐름을 둡니다. 이 표는 업그레이드가 단일 패키지 문제가 아니라 조합 문제라는 사실을 보여줍니다.
예를 들어 프레임워크를 올린다면 React 버전, 타입스크립트 버전, 테스트 환경, 빌드 플러그인, 배포 런타임이 함께 맞아야 합니다. 테스트 도구를 올린다면 모듈 해석, 타임아웃, 스냅샷 포맷, 브라우저 에뮬레이션 방식이 영향을 받을 수 있습니다. UI 라이브러리를 올린다면 CSS 출력, 접근성 속성, 서버 렌더링 hydration, 번들 크기를 봐야 합니다. AI에게 이 표를 먼저 만들게 하면 빠진 검증이 눈에 들어옵니다.
구현 단계에서는 AI에게 '통과할 때까지 고쳐라'가 아니라 '작은 변경을 만들고 증거를 남겨라'라고 지시합니다. 패키지 버전 변경, 코드 마이그레이션, 설정 변경, 테스트 보강을 가능하면 별도 커밋 단위로 생각합니다. 실제 커밋을 나눌지는 팀 정책에 따르지만, 리뷰 설명은 나뉘어야 합니다.
락파일 리뷰에서는 세 가지를 봅니다. 첫째, 목표 패키지가 의도한 버전으로 바뀌었는가. 둘째, 예상하지 못한 큰 하위 의존성 교체가 있는가. 셋째, 패키지 매니저가 설치 방식을 바꿔 재현성이 흔들리지 않는가. AI가 생성한 설명은 사람이 다시 확인해야 하지만, 설명 자체가 없으면 확인 비용이 커집니다.
의존성 업그레이드 검증은 한 가지 명령으로 끝나지 않습니다. 타입 검사와 lint는 코드 형태를 확인합니다. 단위 테스트와 회귀 테스트는 기존 행동을 확인합니다. 빌드는 번들링과 서버 렌더링 오류를 잡습니다. 스모크 테스트는 사용자가 실제로 들어오는 대표 화면을 확인합니다. 성능 예산은 번들 크기, 초기 로딩, 서버 응답 시간, 메모리 사용량 같은 운영 신호를 봅니다.
AI가 고친 코드가 테스트를 통과해도 스모크 테스트를 생략하면 공개 페이지에서만 깨지는 문제가 남을 수 있습니다. 특히 의존성 업그레이드는 개발 환경에서는 통과하고 배포 환경에서 실패하는 일이 있습니다. 런타임 버전, 파일 시스템 차이, 브라우저 기능 지원, 서버리스 제한이 다르기 때문입니다. 그래서 배포 전 로컬 빌드와 대표 URL 스모크를 함께 확인하고, 배포 후에도 같은 경로를 다시 확인합니다.
모든 업그레이드를 큰 릴리스처럼 다룰 필요는 없지만, 위험도가 높은 업그레이드는 카나리 배포가 필요합니다. 일부 트래픽, 일부 기능 플래그, 일부 관리자 계정, 일부 지역처럼 제한된 범위에서 먼저 확인합니다. 카나리 배포의 목적은 '문제가 없기를 바라는 것'이 아니라 '문제가 있으면 작게 발견하는 것'입니다.
롤백 기준은 숫자로 써야 합니다. 예를 들어 대표 페이지 오류율이 기준보다 높아지거나, 빌드 후 번들 크기가 성능 예산을 넘거나, 특정 사용자 흐름의 스모크 테스트가 실패하거나, 서버 응답 시간이 일정 비율 이상 증가하면 되돌립니다. '이상하면 되돌린다'는 기준은 실제 장애 순간에 약합니다. 숫자가 있어야 AI도 운영자도 같은 판단을 합니다.
보안 패치가 필요한 패키지가 발견되면 속도가 중요합니다. 하지만 빠르다는 말은 검증을 생략한다는 뜻이 아닙니다. 먼저 패치 대상이 직접 의존성인지 하위 의존성인지 확인합니다. 직접 의존성이라면 목표 버전과 변경 로그를 확인하고, 하위 의존성이라면 패키지 매니저의 재해결로 충분한지 또는 상위 패키지 업데이트가 필요한지 봅니다.
AI에게는 '보안 패치 대상만 올리고, 관련 없는 최신화는 하지 말라'고 지시합니다. 구현 후에는 취약 항목이 사라졌는지, 락파일이 예상 범위 안에서 바뀌었는지, 인증·결제·파일 업로드처럼 보안과 사용자 영향이 큰 흐름의 스모크 테스트가 통과하는지 확인합니다. 패치가 위험한 major 업데이트를 요구한다면 임시 완화, 기능 제한, 빠른 별도 브랜치 검증처럼 선택지를 나눠야 합니다.
프레임워크 major 업데이트는 작은 패키지 교체가 아니라 플랫폼 이동에 가깝습니다. 라우팅, 서버 렌더링, 빌드 캐시, 이미지 처리, 메타데이터 생성, 미들웨어 또는 프록시 계층이 바뀔 수 있습니다. 이때는 한 번에 모든 경고를 없애려 하지 말고, 호환성 매트릭스와 마이그레이션 목록을 먼저 만듭니다.
좋은 AI 작업 지시서는 '마이그레이션 문서를 기준으로 변경이 필요한 파일만 제안하고, 자동 포맷팅이나 무관한 리팩터링은 하지 말라'고 말합니다. 테스트는 단위 테스트보다 빌드와 대표 페이지 스모크가 중요해집니다. 홈, 목록, 상세, 로그인 또는 제출 흐름처럼 서로 다른 렌더링 패턴을 가진 페이지를 뽑아 확인합니다. 카나리 배포와 롤백 기준도 반드시 필요합니다.
테스트 도구 업그레이드는 제품 기능을 직접 바꾸지 않는 것처럼 보이지만 개발 속도와 신뢰도를 바꿉니다. 모듈 로딩 방식이 바뀌거나, 비동기 테스트 타이밍이 달라지거나, 경고가 실패로 처리될 수 있습니다. 린터 업그레이드는 규칙 변경 때문에 많은 파일이 바뀔 수 있습니다.
이 경우에는 제품 코드를 고치기 전에 테스트 환경 자체의 기준을 정합니다. 새 규칙 때문에 대량 수정이 필요하면 규칙 수용 PR과 기능 변경 PR을 분리합니다. AI에게는 '새 도구가 요구하는 최소 설정 변경만 하라'고 지시합니다. 제품 코드가 많이 바뀌면 업그레이드 검증인지 리팩터링인지 구분이 흐려집니다.
UI 라이브러리 업그레이드는 눈에 보이는 회귀를 만들 수 있습니다. 버튼 높이, 색상 토큰, 포커스 링, 모달 포털, 접근성 속성, 애니메이션, 반응형 레이아웃이 달라질 수 있습니다. 테스트가 모두 통과해도 사용자는 '뭔가 깨졌다'고 느낄 수 있습니다.
AI에게는 대표 컴포넌트와 대표 페이지를 함께 보게 합니다. 변경 전후 스크린샷이나 브라우저 스냅샷을 비교하고, 키보드 이동, 모바일 폭, 다크 모드, 긴 텍스트 상태를 확인합니다. UI 업그레이드는 기능 스모크 테스트뿐 아니라 시각적 스모크 테스트가 필요합니다. 성능 예산도 봅니다. UI 패키지 하나가 번들 크기를 크게 늘릴 수 있기 때문입니다.
가장 흔한 실수는 업그레이드와 리팩터링을 섞는 것입니다. AI가 경고를 고치면서 함수 이름을 바꾸고, import 구조를 정리하고, 테스트를 새 스타일로 바꾸면 diff는 좋아 보일 수 있습니다. 하지만 장애가 나면 무엇이 원인인지 모릅니다. 업그레이드 작업에서는 '필요해서 바꾼 것'과 '좋아 보여서 바꾼 것'을 엄격히 분리해야 합니다.
두 번째 실수는 변경 로그를 일반 요약으로만 읽는 것입니다. 우리 서비스에 영향을 줄 항목을 찾지 않으면 변경 로그는 뉴스레터처럼 소비되고 끝납니다. 브레이킹 체인지, 기본값 변경, 제거된 옵션, 런타임 요구, 성능 특성, 보안 동작을 우리 코드 위치와 연결해야 합니다.
세 번째 실수는 락파일을 리뷰하지 않는 것입니다. 락파일은 길고 지루하지만 실제 설치 결과입니다. 특히 하위 의존성에 빌드 도구, 네이티브 모듈, 보안 관련 라이브러리가 포함되어 있다면 더 중요합니다. AI가 락파일을 바꾼 뒤 설명하지 못한다면 작업 범위가 너무 넓거나 이해가 부족하다는 신호입니다.
네 번째 실수는 테스트 통과를 운영 안전과 같은 것으로 보는 것입니다. 테스트는 강력하지만 완전하지 않습니다. 의존성 업그레이드는 배포 환경, 브라우저, 네트워크, 캐시, 서버 런타임과 만납니다. 그래서 스모크 테스트와 카나리 배포가 필요합니다. 테스트가 통과했는데도 대표 페이지가 500을 내거나, 링크 미리보기가 깨지거나, 특정 브라우저에서 UI가 무너질 수 있습니다.
다섯 번째 실수는 롤백 기준을 늦게 정하는 것입니다. 장애가 난 뒤 되돌릴지 말지 토론하면 이미 늦습니다. 업그레이드 PR 설명에는 되돌릴 조건과 되돌릴 방법이 있어야 합니다. 패키지 버전과 락파일을 이전 상태로 되돌리는 것만으로 충분한지, 설정이나 데이터 마이그레이션이 포함되어 있는지, 캐시 무효화가 필요한지까지 봐야 합니다.
업그레이드 PR을 승인하기 전에 다음 질문에 답할 수 있어야 합니다.
이 체크리스트는 길어 보이지만 반복하면 빠르게 줄어듭니다. 작은 보안 패치는 몇 가지 항목만 확인하면 됩니다. major 업데이트는 대부분의 항목을 확인해야 합니다. 중요한 것은 모든 업그레이드를 같은 무게로 다루는 것이 아니라, 위험도에 맞게 검증 깊이를 조절하는 것입니다.
바로 적용하려면 다음 업그레이드부터 세 가지를 시작하세요. 첫째, AI에게 작업을 맡기기 전에 의존성 인벤토리와 업그레이드 범위를 먼저 쓰게 합니다. 둘째, 변경 로그와 브레이킹 체인지를 우리 코드 위치에 연결한 요약을 요구합니다. 셋째, PR 설명에 검증 명령, 스모크 테스트 결과, 성능 예산 변화, 롤백 기준을 남깁니다.
팀에서 운영한다면 의존성 업그레이드 템플릿을 만들어 두는 것이 좋습니다. 템플릿에는 목표 패키지, 현재 버전, 목표 버전, 업그레이드 이유, 관련 변경 로그, 호환성 매트릭스, 락파일 설명, 검증 결과, 카나리 여부, 롤백 기준이 들어갑니다. AI는 이 템플릿을 채우는 조수로 쓰고, 사람은 범위와 위험도를 판단합니다.
더 성숙한 단계에서는 자동화도 붙일 수 있습니다. 정기적으로 오래된 패키지와 보안 패치를 감지하고, AI가 후보 업그레이드 작업 지시서를 초안으로 만들게 합니다. 단, 자동으로 병합하지는 않습니다. 자동화의 목표는 의사결정을 대신하는 것이 아니라, 사람이 더 빨리 안전한 결정을 하도록 자료를 정리하는 것입니다. VIBE 코딩의 장점은 AI가 손을 빠르게 움직인다는 데 있습니다. 운영의 장점은 손이 빠르게 움직여도 발을 헛딛지 않게 길을 만드는 데 있습니다.
마지막으로, 의존성 업그레이드를 미루지 마세요. 오래 미룰수록 한 번에 바꿔야 할 범위가 커지고, AI도 사람도 원인을 추적하기 어려워집니다. 작게, 자주, 증거를 남기며 올리는 팀이 결국 더 빠르게 움직입니다. 최신 버전 자체가 목표가 아니라, 안전하게 바꿀 수 있는 능력이 목표입니다.
다음 학습
AI 에이전트는 CRUD 코드뿐 아니라 테이블, 컬럼, 인덱스, 백필 스크립트까지 한 번에 제안합니다. 속도는 빨라지지만 데이터베이스 변경은 실패 비용이 다릅니다. UI 버그는 다시 배포하면 되지만, 잘못된 DROP, 타입 축소, 누락된 백필, 깨진 외래키는 실제 고객 데이터 손실로 이어질 수 있습니다.
이 글의 문제는 하나입니다. 'AI가 만든 DB 마이그레이션을 사람 운영자가 어떻게 검증하고 배포해야 데이터 손실을 막을 수 있는가'입니다. 답은 AI를 믿거나 금지하는 것이 아니라, AI가 낸 변경을 작은 단계와 자동 검증으로 통과시키는 가드레일을 만드는 것입니다.
AI 기능은 화면보다 비용이 먼저 터질 때가 많습니다. 사용자는 버튼을 한 번 눌렀다고 생각하지만 뒤에서는 긴 프롬프트, 여러 번의 재시도, 검색 보강, 이미지 생성, 평가 호출, 요약 호출이 이어질 수 있습니다. VIBE 코딩에서 AI에게 기능을 맡기면 구현 속도는 빨라지지만, 비용 예산과 요청 한도를 코드 구조에 넣지 않으면 작은 실험이 하루 만에 운영 부담으로 바뀔 수 있습니다.
이 글의 문제는 하나입니다. 'AI가 만든 기능을 어떻게 비용 예산, 토큰 사용량, 사용자별 한도, 알림 임계값, 차단 임계값, 모델 라우팅, 캐시, 요약 큐로 안전하게 운영할 것인가'입니다. 초보자는 AI 비용을 전기요금처럼 이해하면 쉽습니다. 스위치를 켜는 순간부터 사용량이 쌓이고, 누가 얼마나 쓰는지 모르면 고지서를 받을 때까지 위험을 모릅니다. 실무자에게…