[컬럼] 에이전트 코딩 시대에 소프트웨어 엔지니어링의 기본기는 어떻게 달라졌는가?
코딩 에이전트를 사용해 모든 코드를 작성한다고 하더라도, 소프트웨어의 기본 원리를 이해하는 것은 여전히 중요하다. 그래야 자신이 원하는 방향으로 에이전트를 이끌며 적절한 트레이드오프를 선택할 수 있고, 애초에 어떤 트레이드오프가 존재하는지도 알 수 있기 때문이다. 또한 AI 애플리케이션을 개발할 때 AI 핵심 기능은 대개 더 큰 소프트웨어 애플리케이션 안에서 구현되기 때문에전체 애플리케이션의 구조와 구현에도 직접 관여할 수 있어야 한다.
소프트웨어의 기본기를 이해하지 못한 초보 개발자가 이른바 바이브 코딩만으로 개발할 경우 간단한 애플리케이션 정도는 만들 수 있다. 하지만 이런 방식은 코딩 에이전트가 지연 시간(latency), 가용성(availability), 일관성(consistency), 신뢰성(reliability), 유지보수성(maintainability), 단순성(simplicity), 비용(cost)과 같은 요소 사이에서 잘못된 선택을 하게 만들 수 있다. 이 경우 개발자는 이러한 트레이드오프 자체가 존재한다는 사실을 모르기 때문에 자신의 애플리케이션 상황에 맞는 올바른 결정을 내리도록 에이전트를 제대로 이끌지 못한다.

이번 글에서는 AI 엔지니어링 스킬()Engineering Skills)에 대한 연구를 통해 소프트웨어 엔지니어링에서 가장 중요하다고 판단한 역량을 설명한다. 핵심적으로 다음과 같은 능력이 필요하다.
- 풀스택 애플리케이션 구축
- 데이터 관리
- 시스템 아키텍처 설계
- 보안성과 신뢰성을 갖춘 시스템 구축
- 프로덕션 환경에서의 확장과 운영
1. 풀스택 애플리케이션 구축
에이전트 코딩(agentic coding)의 등장으로 과거에는 프런트엔드 개발자나 모바일 개발자처럼 특정 영역에 전문화되어 있던 개발자도 보다 폭넓은 풀스택 역할을 수행할 수 있게 되었다. 익숙하지 않은 개발 영역도 코딩 에이전트의 도움을 받아 구현할 수 있기 때문이다.
하지만 전체 소프트웨어 스택이 실제로 어떻게 동작하는지 이해하는 것은 여전히 중요하다. 숙련된 개발자는 프런트엔드와 백엔드 시스템을 구성하는 주요 요소와 개념을 이해한다. 여기에는 UI 컴포넌트, 캐싱, 페이지 렌더링, API 선택과 설계, 인증, 상태 및 세션 관리, 비동기 처리, 데이터 영속성, 테스트, 보안, 접근성 등이 포함된다.
2. 데이터 관리
데이터는 소프트웨어가 구축되는 기반이면서 한 번 잘못 설계하면 나중에 변경하기가 상대적으로 어렵기 때문에 특별히 중요하다. 에이전트가 데이터 마이그레이션을 도울 수 있다고 해도 근본적인 데이터 구조의 변경에는 여전히 많은 비용과 위험이 따른다.
데이터를 제대로 관리할 수 있다면 애플리케이션의 데이터 접근 패턴을 분석하고 어떤 데이터를 저장할지, 얼마나 오랫동안 보관할지를 결정할 수 있다. 또한 적절한 데이터 모델을 선택하고 관계형 테이블, 문서형 저장소, 키-값 저장소, 그래프 데이터베이스 등 적합한 저장 방식을 선택할 수 있다.
이러한 선택은 시스템의 속도, 확장성, 가용성, 신뢰성, 비용에 직접적인 영향을 준다. 또한 트랜잭션과 동시성(concurrency)을 이해하고 데이터의 정합성, 일관성, 최신성을 유지하는 방법도 알아야 한다. 필요하다면 개인정보 보호, 데이터 거버넌스, 규정 준수까지 고려해야 하며 전체 데이터 생명주기를 관리할 수 있어야 한다.
애플리케이션이 발전하면 데이터 아키텍처 역시 함께 진화해야 한다. 데이터 관리 방식을 결정하는 데는 사람이 제공하는 상당한 수준의 맥락이 필요하다.
AI 시스템은 데이터 소스로부터 입력 컨텍스트를 얻는다. 따라서 데이터 아키텍처를 잘못 설계하면 AI는 자신이 무엇을 모르는지조차 알 수 없게 된다. 이것이 해당 도메인의 상황을 이해하고 AI 엔지니어링 역량을 갖춘 사람이 개입해야 하는 이유다. 바로 개발자가 이 역할을 수행해야 한다.
또한 기존의 소프트웨어나 사람만을 위한 데이터 인프라가 아니라 에이전트를 위한 데이터 인프라를 어떻게 구축해야 하는지도 빠르게 발전하고 있는 분야다. 따라서 관련 기술과 모범 사례가 변화함에 따라 지속적으로 설계를 조정해야 한다.
3. 시스템 아키텍처 설계
소프트웨어와 데이터의 주요 구성 요소를 이해하면 이러한 요소를 어떻게 조합할지 결정할 수 있다. 좋은 시스템 설계를 위해서는 먼저 소프트웨어가 무엇을 해야 하는지 명확히 이해해야 한다. 예를 들어 사용자가 몇 명인지, 지연 시간이 얼마나 중요한지, 비용이 얼마나 중요한지 등을 알아야 한다.
이를 바탕으로 애플리케이션 플랫폼, 프런트엔드와 백엔드의 경계, 시스템 분해 방식, 애플리케이션 상태를 어디에 둘 것인지, 모놀리식(monolith) 구조와 마이크로서비스(microservices) 중 어떤 구조를 선택할 것인지 등을 결정할 수 있다.
또한 프로그래밍 언어, 런타임, 프런트엔드 및 백엔드 프레임워크, 데이터 기술과 같은 전체 기술 스택도 선택해야 한다. 경우에 따라서는 여러 옵션을 실험적으로 비교한 뒤 최종 기술을 결정하기도 한다.
적절한 아키텍처는 고정되어 있는 것이 아니라 프로젝트의 단계에 따라 계속 달라진다. 빠른 프로토타입을 만들기 위해 선택한 단순한 아키텍처가 첫 번째 프로덕션 시스템에는 적합하지 않을 수 있다. 또한 초기 프로덕션 아키텍처 역시 사용자가 증가하고 서비스 규모가 커지면 다시 변경해야 할 수 있다.
이러한 결정에는 소프트웨어 구성 요소에 대한 깊은 기술적 이해와 애플리케이션이 사용되는 실제 상황에 대한 이해가 모두 필요하다. 그래야 시스템이 성장함에 따라 아키텍처를 적절하게 발전시키고 더 나은 트레이드오프를 선택할 수 있다.
4. 보안성과 신뢰성을 갖춘 시스템 구축
신뢰할 수 있는 시스템을 만들기 위해서는 시스템의 정확성을 검증할 수 있는 테스트 전략을 설계할 수 있어야 한다. 예를 들어 단위 테스트(unit test)와 통합 테스트(integration test)를 어떤 비율로 구성할지, 어떤 테스트 프레임워크를 사용할지, 어느 수준까지 테스트 커버리지를 확보할지를 결정할 수 있어야 한다.
또한 발생할 수 있는 장애를 사전에 고려해 설계해야 한다. API가 호출 제한(rate limit)에 걸리는 상황과 같은 장애를 어떻게 처리할지, 시스템이 일부 기능을 잃더라도 전체 서비스는 계속 동작하도록 점진적 기능 저하(graceful degradation)를 어떻게 구현할지, 장애의 영향 범위인 블래스트 래디어스(blast radius)를 어떻게 줄일지도 알아야 한다.
보안 역시 소프트웨어 개발이 끝난 뒤 나중에 추가하는 것이 아니라 개발 초기 단계부터 고려하는 방향으로 변화하고 있다. 전통적인 프로젝트 일정에서 보안 작업을 앞쪽으로 이동시킨다는 의미에서 이를 시프트 레프트(shift left)라고 부른다.
개발자들이 점차 풀스택 개발자의 역할을 맡게 되는 것처럼, 많은 개발자가 이제 일정 부분 보안 엔지니어의 역할도 담당하게 된다. AI 도구를 사용하면 코드의 보안 취약점을 검사하고, 의존성에 공급망 공격(supply chain injection) 위험이 있는지 확인하고, 클라우드 구성에서 공격 표면(attack surface)을 찾아낼 수도 있다. 하지만 이러한 도구를 제대로 활용하려면 기본적인 보안 지식이 필요하다.
5. 프로덕션 환경에서의 확장과 운영
실제 사용자에게 서비스를 제공하려면 소프트웨어를 프로덕션 환경에 배포하는 방법을 알아야 한다. 이를 위해 소프트웨어 개발 생명주기(SDLC)를 이해할 필요가 있다. SDLC에는 애플리케이션을 개발하고 테스트하는 것뿐만 아니라 배포 환경 구성, 릴리스 전략 결정, CI/CD를 통한 배포 자동화, 서비스형 인프라(IaaS)에 대한 이해도 포함된다.
프로덕션 환경에서 서비스를 운영하려면 관측성(observability) 도구를 구축하고 알림을 설정하며 장애를 관리할 수 있어야 한다. 애플리케이션을 확장하려면 실제 부하를 파악하고 서버를 확장하는 방법과 로드 밸런싱을 이해해야 한다. 또한 샤딩(sharding), 인덱싱(indexing), 복제(replication) 등을 통해 데이터 인프라를 확장하거나 시스템 규모에 맞춰 아키텍처 자체를 변경할 수도 있어야 한다.
마지막으로 버전 관리, 코드 리뷰, 의존성 유지보수, 기술 부채 관리와 같은 기본적인 코딩 모범 사례를 이해해야 시스템을 장기간 안정적으로 발전시킬 수 있다.
6. 코딩 에이전트 시대에도 기본기는 여전히 중요하다
코딩 에이전트는 AI 기능이 포함되지 않은 일반 소프트웨어까지 포함해 우리가 소프트웨어를 만드는 방식을 크게 바꾸고 있다. 과거에 중요하게 여겨졌던 일부 코딩 지식은 점차 중요성이 줄어들고 있다. 예를 들어 프로그래밍 언어의 문법을 모두 외우는 능력은 이전만큼 중요하지 않다.
하지만 소프트웨어가 실제로 어떻게 동작하는지를 깊이 이해하는 개발자는 소프트웨어 기본기를 이해하지 못한 채 바이브 코딩만 하는 개발자보다 훨씬 더 뛰어난 결과를 만들어낸다.
AI에 대한 이해뿐 아니라 소프트웨어의 기본 원리를 이해하면 소프트웨어가 무엇을 할 수 있고 무엇을 할 수 없는지도 판단할 수 있다. 이러한 지식은 코딩 에이전트를 어떻게 활용할지, 그리고 에이전트가 만들어내는 소프트웨어를 어떤 방향으로 설계하고 발전시킬지를 결정하는 데 매우 중요한 컨텍스트가 된다.
댓글남기기