**소프트웨어 전개**(software deployment)는 소프트웨어 시스템을 사용할 수 있도록 만드는 모든 활동을 말한다.

일반적인 전개 과정은 과정 사이에 있을 수 있는 변이와 함께 서로 관계 있는 여러 활동으로 된다. 이런 활동들은 소프트웨어 개발자 측 혹은 소프트웨어 사용자 측 혹은 양쪽 모두에서 일어날 수 있다. 모든 소프트웨어 시스템이 고유하므로, 각 활동 사이의 정확한 과정과 절차를 정의하기란 매우 어렵다. 그러므로, "전개"는 특정 요구사항이나 특성에 따라 커스터마이징 되어야 하는 *전반적인 과정*으로 해석되어야 한다. 각 활동에 대한  대략적인 설명은 이후에 나온다.

역사
--

컴퓨터가 엄청나게 크고, 비싸며 부피가 컸던 때(메인 프레임과 미니 컴퓨터), 소프트웨어는 대게 하드웨어와 함께 제조사에 의해 묶어서 제공되었다. 비지니스 소프트웨어를 기존의 컴퓨터에 설치해야 하는 경우, 비용과 시간을 들여 시스템 아키텍트 혹은 컨설턴트가 방문해야 하는 경우도 있었다. 오늘날 엔터프라이즈 소프트웨어의 복잡한 직접 설치를 위해, 이런 경우가 가끔 있기도 한다.

하지만, 1980년 대의 마이크로컴퓨터의 새로운 시대에 대량 시장 소프트웨어 개발과 함께 새로운 형태의 소프트웨어 전개가 나왔다. 첫번째로 카트리지가 나왔고, 그 뒤에 카세트 테이프, 그리고 플로피 디스크 그 뒤로(1990년대와 그 이후에) 광학 미디어, 인터넷 그리고 플래시 드라이브가 나왔다. 즉, 소프트웨어 전개는 고객의 몫이 되었다. 하지만, 또한 시간이 지남에 따라 고객이 소프트웨어를 구성할 수 있다는 것이 중요하다는 것과, 이상적으로 소프트웨어 구성에 있어 (예를 들어, 고객이 윈도우의 레지스트리 개체를 수정하지 않도록) 사용자 친화적인 인터페이스가 있어야 한다는 것이 인식되었다.

인터넷 시대 이전의 소프트웨어 전개에서, 전개(그리고 그와 사촌 격인, 새로운 소프트웨어의 릴리즈)는 비용이 많이 들고 드물게 있어나는 성가신 일이었다. 그러므로 인터넷의 보급이 엔드-투-엔드 애자일 소프트웨어 개발을 가능하게 만들었다고 해도 과언이 아니다. 실제로, 클라우드 컴퓨팅과 서비스형 소프트웨어(SaaS, software as a service)의 출현은 소프트웨어가 대규모의 고객에게 수분 내로 인터넷을 통해 전개될 수 있음을 의미한다. 이는 또한 일반적으로, 전개 스케줄이 이제 고객이 아닌 소프트웨어 공급자에 의해 결정된다는 것을 의미하기도 한다. 이러한 유연성 덕분에 특히 위험성이 적은 웹 애플리케이션의 경우 실행 가능한 옵션으로 지속적인 전달이 가능해졌다.

전개 활동
-----

릴리즈
릴리즈 활동은 완료된 개발 과정 뒤에 오며, 때로는 전개가 아닌 개발 과정의 일부로 적절하게 분류되기도 한다. 여기에는 어셈블리를 위한 시스템을 준비하고 프로덕션 환경에서 실행될 컴퓨터 시스템으로 전송하기 위한 모든 작업이 포함된다. 그러므로, 시스템이 허용 가능한 성능으로 동작하는데 필요한 리소스 결정과 전개 과정의 후속 활동을 계획하고(하거나) 문서화하는 일이 들어가기도 한다.
설치 및 활성화
간단한 시스템의 경우, 설치는 소프트웨어 실행을 위한 어떤 형태의 명령어, 단축키, 스크립트 혹은 서비스를 설정하는 일을 포함한다(수동이든 자동이든). 복잡한 시스템의 경우, 최종 사용자에게 의도한 용도에 대해 묻거나 직접적으로 어떻게 구성하려고 하는지를 물어봐서 그리고(혹은) 모든 요구되는 서브 시스템을 사용할 준비를 끝내 시스템 구성을 포함할 수도 있다. 활성화는 처음으로 소프트웨어의 실행 가능한 컴포넌트를 시작하는 활동을 말한다(디지털 권리 관리 시스템인 소프트웨어 라이센스와 관련있는 *activation*이라는 용어의 일반적인 용도와 혼동하지 마세요).서버의 대규모 소프트웨어 전개에서, 사용자에 의해 사용되는 소프트웨어의 주 복사본(산출물)은 운영 환경 내 운영 서버에 설치될 수 있다. 전개된 소프트웨어의 다른 버전은 테스트 환경, 개발 환경 그리고 재난 복구 환경에 설치될 수도 있다.복잡한 지속적인 전개 환경 그리고(혹은) SaaS(software as a service) 시스템에서, 다르게 구성된 버전의 시스템은 내외부 고객을 위해 운영 환경에 존재할 수도 있거나(이것은 *multi-tenant 아키텍처*라고 알려져 있다) 병렬 전개 중 한 개 이상을 취소할 가능성과 함께 다른 고객 그룹과 병렬로 점진적으로 전개될 수도 있다. 예를 들어, 트위터는 새로운 기능의 A/B 테스트 와 사용자 인터페이스의 변경을 위해 후자의 접근 방식을 사용하고 있는 것으로 알려져 있다. 블루-그린 전개를 목적으로, 운영의 로드 밸런서에 아직 연결되지 않은 서버들로 구성된, 운영 환경 내에서 "hidden live" 그룹이 생겨날 수 있다.
비활성화
비활성화는 활성화의 반대로, 이미 실행된 시스템 컴포넌트를 종료하는 것을 말한다. 비활성화는 대게 다른 전개 활동 실행을 필요로 하는데, 예를 들어, 업데이트를 실행할 수 있기 전에 소프트웨어 시스템이 비활성화되어야 할 수도 있다. 드물게 사용되거나 쓸모없는 시스템에서 서비스에서 제거하는 일을 대게 애플리케이션 만료 또는 애플리케이션 폐기라고 한다.
제거
제거는 설치의 반대이다. 더 이상 필요없는 시스템의 제거를 말한다. 또한 제거된 시스템의 의존성을 제거하기 위해 다른 소프트웨어 시스템의 재구성이 필요할 수도 있다.
업데이트
업데이트 과정은 소프트웨어 시스템 전체 혹은 부분의 이전 버전을 새로운 버전으로 대체한다. 보통 비활성화 이후 설치로 된다. 시스템 패키지 매니저를 사용 중인 리눅스와 같은, 일부 시스템에서 소프트웨어 애플리케이션의 이전 버전은 과정 중 자동화된 부분으로 제거된다(소프트웨어 패키지가 이러한 제한을 다루도록 특별하게 설계되지 않은 이상, 리눅스 패키지 매니저는 동시에 소프트웨어 애플리케이션의 여러 버전을 지원할 수 없기 때문이다).
빌트인 업데이트
업데이트 설치를 위한 메커니즘은 일부 소프트웨어 시스템 내에 만들어진다(혹은 리눅스, 안드로이드 그리고 iOS와 같은 일부 운영 체제의 경우, 운영체제 자체 내에 구축되어 있다). 이런 업데이트 과정의 자동화는 완전 자동부터 사용자 초기화 및 제어까지 다양하다. 노턴 인터넷 시큐리티가 안티바이러스 정의와 시스템의 다른 컴포넌트 모두에 대한 업데이트를 찾고 설치하기 위한 반자동화 방식을 지닌 시스템의 한 예이다. 다른 소프트웨어 제품은 업데이트가 이용 가능한지를 결정하기 위한 조회 메커니즘을 제공한다.
버전 추적
버전 추적 시스템은 사용자가 소프트웨어 시스템의 업데이트를 찾아 설치할 수 있도록 돕는다. 예를 들어, 소프트웨어 카탈로그는 로컬 시스템 상에 설치된 각각의 소프트웨어 패키지에 대한 버전과 다른 정보를 저장한다. 한번의 버튼 클릭으로 브라우저 윈도우에서 로그인 요구되는 사이트에 대한 사용자 이름과 비밀번호 자동 채우기를 포함하는 소프트웨어 업그레이드 웹 페이지를 연다. 리눅스, 안드로이드, iOS에서, 이 과정은 상당히 쉽다. 왜냐하면 (공식 지원 방식으로 설치된 소프트웨어 패키지에 대한) 버전 추적을 위한 표준화된 과정이 운영 체제 내에 구축되어 있기 때문이다. 그래서 개별적인 로그인, 다운로드 그리고 실행 단계가 필요하지 않다. 그러므로 이런 과정이 완전히 자동화되도록 구성할 수 있다. 또한, 일부 서드파티 소프트웨어는 특정 윈도우 소프트웨어 패키지에 대한 자동화된 버전 추적과 업그레이드를 지원한다.
각색
각색 활동도 이전에 설치되었던 소프트웨어 시스템을 수정하기 위한 과정이다. 각색이 고객 사이트의 환경을 변경시킴으로써 지역적으로 일어나는데 반해, 업데이트는 새로운 릴리즈가 이용 가능하도록 만들어진 결과로 업데이트된다는 점에 차이가 있다. 각색은 복잡한 경우에 컴퓨터 프로그래밍과 같은 전문 기술을 요구할 수 있다.

전개 역할
-----

마이애미의 "부가 가치 기술 개발"의 사례
소프트웨어 제품의 복잡함과 다양성은 전개 과정을 조정하고 엔지니어링하기 위한 전문적인 역할의 출현이 촉진되었다. 데스크톱 시스템의 경우, 최종 사용자는 그들의 머신에 소프트웨어 패키지를 설치할 때 "소프트웨어 전개자"가 되곤 한다. 엔터프라이즈 소프트웨어의 전개는 많은 역할들을 필요로 하며, 애플리케이션이 테스트(운영 전)에서 운영 환경으로 진행함으로써 그 역할들은 전형적으로 변경된다. 엔터프라이즈 애플리케이션에 대한 소프트웨어 전개에 관련된 전형적인 역할은 다음과 같다:

* 운영 이전 환경:
	+ 애플리케이션 개발자: 소프트웨어 개발 과정을 참고하세요
	+ 빌드 및 릴리즈 엔지니어: 릴리즈 엔지니어링을 참고하세요
	+ 릴리즈 관리자: 릴리즈 관리를 참고하세요
	+ 전개 코디네이터: DevOps를 참고하세요
* 운영 환경:
	+ 시스템 운영자
	+ 데이터베이스 운영자
	+ 릴리즈 코디네이터: DevOps를 참고하세요
	+ 운영 프로젝트 관리자: 정보 기술 기반 라이브러리를 참고하세요

참고
--

* 애플리케이션 생명주기 관리
* 제품 생명주기 관리
* 시스템 관리
* 시스템 전개
* 소프트웨어 릴리즈
* Definitive Media Library
* Readme
* 릴리즈 관리

### 전개 도구

* Ansible
* SaltStack
* OSGi
* JNLP
* RPM
* Apt
* Capistrano
* Octopus Deploy
* Lansweeper
* XebiaLabs
* IBM UrbanCode Deploy
* ICEFLO
* Electric Cloud