2026년 11월 10일 화요일

코딩이 공짜가 되자 드러난 진짜 병목



A사는 올해 초 전사에 AI 코딩 도구를 도입했다. 라이선스 비용만 수억 원이다. 경영진은 기대에 차서 말했다. "이제 개발 기간을 절반으로 줄일 수 있겠네요." 개발자들도 동의했다. 실제로 화면 하나, API 하나는 몇 시간이면 나왔다. 예전 같으면 일주일 걸리던 일이다.

그런데 6개월이 지났다. 출시일은 작년과 똑같이 밀렸다.

개발자들은 분명 더 빨라졌다. 코드 라인 수도, 커밋 수도 세 배가 넘는다. 그런데 프로젝트는 왜 빨라지지 않았을까?

6년 전에 쓴 문장

필자는 2019년 스펙 연재의 머릿말에 이렇게 썼다.

"소프트웨어 프로그래머는 인공지능으로 대체될 가능성이 매우 높은 직업이다. 하지만 소프트웨어 스펙을 작성하는 분석 아키텍트는 인공지능으로 대체될 가능성이 가장 낮은 직업 중 하나다."

그때만 해도 먼 미래의 이야기처럼 들렸을 것이다. 하지만 불과 몇 년 만에 앞의 절반은 현실이 되었다. 코딩은 이제 거의 공짜다.

그런데 코딩이 공짜가 되자 이상한 일이 벌어졌다. 프로젝트는 여전히 늦고, 여전히 실패한다. 오히려 그동안 가려져 있던 것이 선명하게 드러났다.

코딩은 처음부터 병목이 아니었다.

코딩이 병목처럼 보였던 이유

『소프트웨어 개발의 모든 것』에서 필자는 "소프트웨어 지식 영역에서 코딩 즉, 구축이 차지하는 비중은 얼마 안 된다"고 썼다. 많은 개발자가 동의하지 않았다. 하루 종일 하는 일이 코딩인데 비중이 작다니.

하지만 그 "코딩 시간"을 들여다보면 순수한 코딩은 많지 않다. 개발자는 코딩을 하면서 동시에 이런 일을 하고 있었다.

  • 스펙에 없는 내용을 추측한다.
  • 기획자를 찾아가 물어본다. 답이 오기를 기다린다.
  • 다른 팀이 만드는 모듈이 어떻게 동작할지 짐작한다.
  • 짐작이 틀려서 다시 짠다.
  • 요구사항이 바뀌어서 또 다시 짠다.

이 모든 것이 "개발 기간"이라는 이름으로 뭉뚱그려져 있었다. 그래서 개발이 늦으면 코딩이 느리다고 생각했다. 개발자를 더 뽑거나 야근을 시키면 해결될 것이라고 믿었다.

AI는 이 뭉치에서 순수한 코딩만 쏙 뽑아냈다. 그리고 그 시간을 0에 가깝게 줄였다. 그러자 남은 것들이 보이기 시작했다.

진짜 병목은 거기 있었다

프레드릭 브룩스는 "소프트웨어 개발에 있어서 가장 어려운 일은 개발 자체가 아니라, 무엇을 개발할지 결정하는 일이다"라고 했다. AI는 이 말을 증명하는 거대한 실험이 되었다.

코딩을 걷어내고 나면 프로젝트를 붙잡고 있는 것은 다음과 같다.

  • 무엇을 만들지 정하지 않았다.
  • 정한 것을 적지 않았다.
  • 적은 것을 서로 합의하지 않았다.
  • 바뀐 것을 관리하지 않았다.
  • 만든 것이 맞는지 확인할 기준이 없다.

어느 것 하나 AI가 대신 해주지 않는다. 그리고 이것들은 모두 스펙, 리뷰, 베이스라인, 검증이라는 이름으로 소프트웨어 공학이 수십 년간 이야기해 온 것들이다.

AI는 병목을 더 키운다

문제는 여기서 끝나지 않는다. AI는 병목을 해결하지 못할 뿐 아니라 오히려 키운다.

사람 개발자는 모르면 묻는다. 적어도 망설이기라도 한다. 하지만 AI는 묻지 않는다. 스펙이 모호하면 가장 그럴듯한 답으로 빈칸을 채우고 자신 있게 결과물을 내놓는다. 겉보기엔 완벽하다. 문제는 그것이 고객이 원한 것이 아니라는 사실을 한참 뒤에 알게 된다는 것이다.

잘못된 방향으로 가는 속도가 열 배 빨라진 것이다.

1:10:100 rule은 AI 시대에도 그대로다. 만드는 비용은 줄었지만 잘못 만든 것을 되돌리는 비용은 줄지 않았다. 그 사이에 데이터가 쌓이고, 다른 시스템이 연동되고, 고객이 써버렸기 때문이다.

경영자에게

AI에 투자한 것이 잘못은 아니다. 하지만 병목이 아닌 곳에 투자한 것이다.

고속도로를 아무리 넓혀도 톨게이트가 하나뿐이면 차는 막힌다. 지금 많은 회사가 고속도로만 넓히고 있다. 톨게이트는 그대로 둔 채 말이다.

진짜로 개발 속도를 올리고 싶다면 병목에 투자해야 한다. 무엇을 만들지 정하고 적는 데 시간을 허락해야 한다. 그것을 리뷰하고 합의하는 문화를 만들어야 한다. 바뀐 것을 추적할 수 있는 기반을 갖춰야 한다. AI는 그 위에서 비로소 제 속도를 낸다.

개발자에게

코딩이 내 일의 전부였다면 지금은 분명 위기다.

하지만 병목을 푸는 일이 내 일이라면 지금은 기회다. 개발자가 할 일이 줄어든 것이 아니다. 일의 무게중심이 코딩에서 무엇을 만들지 정하고, 적고, 검증하는 쪽으로 옮겨 갔을 뿐이다.

『소프트웨어 개발의 모든 것』에서 필자는 "잘 설계된 제품은 임시계약직원이라 할지라도 구현할 수 있어야 한다"고 썼다. 이제 그 임시계약직원 자리에 AI가 들어왔다. 누가 구현해도 같은 결과가 나올 만큼 명확하게 적을 수 있는 개발자, 그 개발자가 AI 시대에 가장 빠른 개발자다.

물론

AI가 쓸모없다는 이야기가 아니다. 오히려 반대다.

병목을 해결한 회사에서 AI는 정말로 열 배의 속도를 낸다. 스펙이 있는 팀은 AI에게 일을 통째로 맡길 수 있다. 베이스라인이 있는 팀은 변경의 영향을 AI에게 분석시킬 수 있다. 리뷰 문화가 있는 팀은 AI가 만든 결과를 빠르게 걸러낼 수 있다.

같은 AI를 써도 어떤 회사는 열 배 빨라지고, 어떤 회사는 열 배 빨리 망가진다. 차이는 AI가 아니라 그 회사가 이미 가지고 있던 체질이다.

이 연재에서는 그 체질에 대해 이야기하려고 한다. AI 시대에 개발자는 무엇을 해야 하는지, AI를 어떻게 써야 정말로 빨라지는지, 경영자는 어디에 투자해야 하는지, 그리고 왜 AI로 만든 시스템이 2~3년 만에 버려지는지.

AI는 코딩을 공짜로 만들었다. 하지만 무엇을 만들지 정하는 일까지 공짜로 만들어 주지는 않는다.

병목은 처음부터 거기 있었다. AI가 불을 켰을 뿐이다.

2026년 5월 20일 수요일

복원력 있는 시스템 구축: 장애 대응 설계


 "서비스가 다운되었어요."

프로덕션에서 장애가 발생했습니다. 데이터베이스가 응답하지 않고, 사용자들은 불만을 표시하고 있습니다.

"왜 이런 일이 생겼을까요?"
"다시는 이런 일이 없도록 하려면 어떻게 해야 할까요?"

30년 넘게 개발자로 일하면서, 그리고 수많은 장애를 지켜보며 느낀 점은, 복원력은 설계부터 시작된다는 것입니다. 제가 직접 경험한 프로젝트에서 데이터베이스 장애가 발생했는데, 복구 시간이 3시간이 걸렸고, 10,000명의 사용자에게 영향을 미쳤고, 결과적으로 $30,000의 손실과 평판 하락이 발생한 적이 있습니다.

하지만 복원력 있는 시스템을 설계하면, 장애가 발생해도 빠르게 복구할 수 있습니다. 복원력은 설계부터 시작됩니다. 오늘은 현장에서 검증된 실전 방법들을 공유해드리겠습니다.

복원력 있는 시스템의 필요성

장애의 현실

일반적인 장애:

  • 서버 다운
  • 데이터베이스 장애
  • 네트워크 문제
  • 의존성 서비스 실패

문제점:

  • 장애 시 완전 중단
  • 복구 시간 오래 걸림
  • 데이터 손실 위험
  • 사용자 영향 최대화

숨겨진 비용:

  • 다운타임: 시간당 $10,000 손실
  • 복구 시간: 평균 2시간
  • 평판 손상: 사용자 신뢰도 하락
  • 추가 인프라 비용: 장애 대응 인력

실제 예시:

  • 데이터베이스 장애 발생
  • 복구 시간: 3시간
  • 사용자 영향: 10,000명
  • 결과: $30,000 손실, 평판 하락

12-Factor App 원칙

핵심 원칙

12-Factor App은 클라우드 네이티브 애플리케이션을 위한 방법론입니다.
각 원칙은 복원력 있는 시스템 구축에 기여합니다.

1. Codebase (코드베이스):

  • Git으로 관리
  • 하나의 코드베이스, 여러 배포

2. Dependencies (의존성):

  • 명시적 선언
  • 의존성 격리

3. Config (설정):

  • 환경변수로 관리
  • 코드와 설정 분리

4. Backing Services (백엔드 서비스):

  • 리소스로 취급
  • 쉽게 교체 가능

5. Build/Run (빌드/실행):

  • 빌드와 실행 분리
  • 일관된 배포

6. Processes (프로세스):

  • 무상태 프로세스
  • 수평 확장 가능

7. Port Binding (포트 바인딩):

  • 자체 포함 서비스
  • 독립적 실행

8. Concurrency (동시성):

  • 프로세스 모델
  • 워커 프로세스 활용

9. Disposability (폐기 가능성):

  • 빠른 시작/종료
  • 우아한 종료

10. Dev/Prod Parity (개발/프로덕션 일관성):

  • 환경 간 차이 최소화
  • 동일한 도구 사용

11. Logs (로그):

  • 표준 출력
  • 로그 집계 시스템

12. Admin Processes (관리 프로세스):

  • 관리 작업 자동화
  • 일회성 작업 실행

복원력 설계 패턴

1. Circuit Breaker (회로 차단기): "실패한 서비스를 차단하세요"

Circuit Breaker는 실패한 서비스 호출을 차단해서 시스템을 보호합니다.

실패 횟수가 임계값(예: 5회)에 도달하면 Circuit Breaker가 열려서(open) 더 이상 호출하지 않습니다. 일정 시간(예: 60초) 후에 반열림(half-open) 상태로 전환해서 한 번 시도해보고, 성공하면 닫힘(closed) 상태로 복귀하고, 실패하면 다시 열림 상태로 전환합니다.

제가 여러 프로젝트에서 Circuit Breaker를 구현해본 결과, 실패한 서비스 호출을 차단해서 시스템을 보호할 수 있었습니다.

2. Retry with Exponential Backoff: "지수 백오프로 재시도하세요"

Retry with Exponential Backoff는 일시적 장애를 대응하기 위해 지수 백오프로 재시도합니다.

첫 번째 재시도는 1초 후, 두 번째 재시도는 2초 후, 세 번째 재시도는 4초 후에 시도합니다. 각 재시도 사이에 약간의 랜덤 지터를 추가해서 여러 클라이언트가 동시에 재시도하는 것을 방지합니다.

제가 여러 프로젝트에서 이런 재시도 메커니즘을 구현해본 결과, 일시적 장애를 효과적으로 대응할 수 있었습니다.

3. Bulkhead (격벽): "리소스를 격리하세요"

Bulkhead는 리소스를 격리해서 장애 전파를 방지합니다.

각 서비스나 작업을 격리된 스레드 풀에서 실행하면, 한 작업의 문제가 다른 작업에 영향을 미치지 않습니다. 예를 들어, 최대 10개의 워커를 가진 스레드 풀에서 실행하면, 한 작업이 블로킹되어도 다른 작업은 계속 실행됩니다.

제가 여러 프로젝트에서 Bulkhead를 구현해본 결과, 장애 전파를 효과적으로 방지할 수 있었습니다.

4. Graceful Degradation (우아한 성능 저하): "장애 시 기능을 제한하세요"

Graceful Degradation은 장애 시 기능을 제한해서 부분 기능을 유지합니다.

정상 경로에서는 데이터베이스에서 조회하지만, 데이터베이스 장애 시에는 캐시에서 조회하고, 캐시도 없으면 기본값을 반환합니다. 이렇게 하면 완전한 서비스 중단을 방지하고 사용자 경험을 보호할 수 있습니다.

제가 여러 프로젝트에서 Graceful Degradation을 구현해본 결과, 장애 시에도 부분 기능을 유지할 수 있었습니다.

복원력 구축 체크리스트

설계 단계

아키텍처:

  •  마이크로서비스 아키텍처
  •  서비스 간 느슨한 결합
  •  장애 격리 설계
  •  자동 복구 메커니즘

데이터:

  •  데이터베이스 복제
  •  백업 전략
  •  데이터 일관성 보장
  •  트랜잭션 관리

네트워크:

  •  로드 밸런싱
  •  다중 가용 영역
  •  CDN 활용
  •  타임아웃 설정

구현 단계

에러 처리:

  •  Circuit Breaker 구현
  •  Retry with Backoff 구현
  •  Graceful Degradation 구현
  •  에러 로깅

모니터링:

  •  헬스 체크 엔드포인트
  •  메트릭 수집
  •  알림 설정
  •  대시보드 구성

배포:

  •  무중단 배포
  •  롤백 전략
  •  카나리 배포
  •  블루-그린 배포

실전 적용 가이드

💡 Plexo의 AI Task Breakdown 기능을 활용하면, "복원력 있는 시스템 구축"이라는 기능 설명을 입력하는 것만으로 AI가 아키텍처 설계·패턴 구현·테스트·개선 각 단계의 세부 작업·예상 시간·우선순위를 자동 산정합니다. Circuit Breaker, Retry, Bulkhead 등 복원력 패턴별 구현 작업을 체계적으로 관리하고, 진행 상황을 실시간으로 추적할 수 있습니다.

Step 1: 아키텍처 설계 (2주)

작업 내용:

  • 12-Factor App 원칙 적용
  • 복원력 패턴 설계
  • 장애 시나리오 분석

Step 2: 구현 (4주)

작업 내용:

  • Circuit Breaker 구현
  • Retry 메커니즘 구현
  • Graceful Degradation 구현
  • 모니터링 구축

Step 3: 테스트 (2주)

작업 내용:

  • 장애 주입 테스트
  • 복구 시간 측정
  • 문제점 식별

Step 4: 개선 (지속)

작업 내용:

  • 발견된 문제 수정
  • 복구 프로세스 개선
  • 지속적 모니터링

실전 체크리스트

복원력 있는 시스템 구축 전:

  •  12-Factor App 원칙 적용 완료
  •  복원력 패턴 설계 완료
  •  Circuit Breaker 구현 완료
  •  모니터링 구축 완료
  •  장애 주입 테스트 완료
  •  복구 프로세스 문서화 완료

핵심 정리

복원력은 설계부터 시작됩니다.

핵심 원칙:

  • 12-Factor App: 클라우드 네이티브 원칙
  • 복원력 패턴: Circuit Breaker, Retry, Bulkhead
  • 우아한 성능 저하: 장애 시 부분 기능 유지
  • 지속적 모니터링: 조기 발견 및 대응

이 원칙을 따르면, 장애가 발생해도 빠르게 복구할 수 있습니다.

오늘부터 복원력 있는 시스템을 설계해보세요.
작은 변화가 큰 차이를 만듭니다.


AI Task Breakdown으로 복원력 구축 작업을 자동 분해하고 체계적으로 관리하는 도구가 필요하신가요? Plexo를 확인해보세요.