DevOps란? 기초 지식과 민첩한 개발과의 차이점, 이점을 설명

소프트웨어 개발 프로젝트에서 DevOps를 도입함으로써 신속한 개발 및 운영이 가능

DevOps란?

DevOps 구조

DevOps(데브옵스)란 ‘개발’을 의미하는 Development와 ‘운용’을 의미하는 Operations를 조합한 합성어이다. 개발 담당자와 운용 담당자가 같이 협력함으로써 원활하게 개발, 운용을 진행시켜 제품의 가치를 지속적으로 향상시킨다는 것이 목적이다.

DevOps의 탄생 배경

DevOps가 태어난 배경에는 개발 현장에서 팀 간의 대립 구조가 생기는 문제가 있다. 많은 소프트웨어 개발 현장에서는 시스템 개발을 담당하는 개발(Dev) 팀과 서비스 운영을 담당하는 운영(Ops) 팀으로 나누어 작업한다. 개발 팀의 목표는 “새로운 기능을 추가하고 더 빨리 출시"하는 반면, 운영 팀의 목표는 “시스템의 안정적인 가동과 서비스의 안정적인 공급"이다. 이와 같이, 양쪽의 목적의 차이에 의해 입장상의 대립 관계가 생겨 버리는 일이 있다. 그리고 이러한 의견의 대립이 쌓여 팀 간의 홈이 깊어지는 “사일로(silos)화"으로 연결될 수 있다. 그러나 양쪽의 목적 앞에는 “가치적인 서비스를 보다 신속하게 고객에게 전달하기"라는 공통의 목적이 존재하고 있다. 이 궁극적인 목적이 동일하다면, 기본적으로 대립할 필요는 없다.

또한 디지털화가 급속히 진행되는 현대에서는 고객이 요구하는 가치도 유동적이다. 그 변화에 대응하기 위해서, 보다 신속한 소프트웨어 개발을 할 수 있는 개발 프로세스나 조직 만들기가 요구된다.
이런 배경에서 DevOps가 중요시되게 된 것이다.

애자일 개발과의 차이

DevOps와 애자일 개발은 지속적으로 사이클을 돌리는 것과 작은 단위마다 나누어 개발 사이클을 돌리는 등의 공통점이 있는 것으로 혼동될 수 있다만, 별개이다. DevOps는 조직의 협력 체제에 관한 조직론이며 광범위한 개념이지만, 민첩한 개발 중 하나는 구체적인 개발 방법론을 의미한다. 다만, 양쪽의 친화력이 높고, DevOps를 실현하기 위한 개발 방법에 애자일 개발이 채용되는 경우도 있다.
원래 애자일 개발이란, “요건 정의 → 설계 → 개발 → 테스트 → 릴리스"라고 하는 개발 공정을 1개의 기능 단위로 작은 사이클로 반복한다고 하는 방식이다. 이는 기존에 주류였던 워터폴 개발이라는 개발의 일련의 흐름을 차례로 실행해 가는 수법보다 유연성이 높고, 릴리스까지의 기간이 짧다고 하는 특징이 있다. DevOps의 조직론 하에서 애자일 개발을 통해 더욱 효율적으로 유연한 개발이 가능하다.

DevOps의 장점

DevOps의 본질은 개발 담당자와 운영 담당자 간의 충돌을 해소하여 부드러운 개발 및 운영을 수행하는 것이다. DevOps를 구현하려면 각 단계마다 다양한 도구를 도입해야 한다. 그 대표적인 것에 관리 파일의 변경 이력을 기록하는 “버전 관리 시스템"이나 작업을 자동화하는 “CI/CD 툴” 등이 있는데, 이러한 툴을 활용하는 것으로 생산성의 향상으로 연결된다. 그리고 생산성이 향상됨으로써 그만큼의 시간을 품질 향상이나 신서비스 개발 등에 사용할 수 있기 때문에 보다 제품과 서비스의 가치가 높아진다. 이러한 툴에 의한 자동화는 그 밖에도 작업의 고속화가 가능하게 된다고 하는 메리트도 있다. 고속화는 DevOps의 라이프사이클을 돌리는 속도가 빨라짐으로써 고객으로부터 받은 요구나 피드백을 순간에 도입하기 쉬워져, 급속하게 변화하는 시장 요구에 신속하게 대응할 수 있게 된다.

DevOps 프로세스

DevOps의 개발은 다음과 같은 6가지 프로세스로 구성된다.
이 프로세스로 지속적으로 돌아가 가는 것으로 DevOps를 수행할 수 있다.

계획(Plan)

프로젝트 전체의 요건 정의를 하고, 구현하는 기능이나 태스크 관리, 진척 관리등을 결정해 간다. 프로젝트 관리 도구로 유명한 것은 JIRA와 Azure DevOps 등이 있다.

개발(code)

계획에 따라 프로그래머가 코딩하는 것과 같은 개발 작업을 수행한다.
소프트웨어의 설계·구현 단계에서는 과거의 편집 이력을 즉시 확인할 수 있도록 버전 관리 시스템이나 빌드 자동화 툴을 이용한다. 프로그램 테스트를 자동화하는 작업 실행 기능이 있는 GitHub 및 GitLab과 같은 도구를 사용한다.

테스트(Test)

개발한 아티팩트에 버그 등의 결함이 있는지 테스트해 간다.
여기에 사용되는 대표적인 도구로 JUnit, Selenium, BlazeMeter 등이 있다.

배포(Deploy)

개발 공정이 한번 끝나고 테스트에 문제가 없었을 경우는 실제 환경에서 정상적으로 작동하도록 정비해 나갈 것이다. 여기에서 사용되는 도구로는 Ansible, Puppet, Docker, Kubernetes 등을 들 수 있다.

운영(Operate)

릴리스 후, 지속적으로 제품, 서비스를 제공하기 위한 유지 보수 관리이다.
서버나 어플리케이션 소프트웨어의 감시, 트러블이 발생시에 대응 등을 실행한다.

감시(Monitor)

운용으로 얻은 데이터나 고객의 요구, 피드백 등을 지속적으로 받아 개발에 반영시키는 것이다. 이를 위해 모니터링 및 사고 관리 도구를 사용한다. 유명한 것은 New Relic, Datadog, Grafana, Wireshark 등이 있다.




최종 수정 : 2024-01-18