일반적인 서버 개발환경은 local / dev / integration / qa / staging / production 환경으로 나뉜다.
각자의 개발 과정에 따라, 각자의 역할과 목적이 다르고, 그에 따라서 시스템의 크기도 다르다.
꼭 모든 환경을 갖출 필요는 없으며 프로젝트 환경에 따라서 각 환경을 합치거나 생략해도 된다.
1. local (로컬 개발 환경)
- 먼저 개발을 하려면, 각자 개발자 PC에 개발 및 테스트 환경이 셋업되어야 한다.
- 각 개발자마다 설치된 서버 환경을 local 환경이라고 한다.
- ex) MySQL 등의 DB, Tomcat, Eclipse와 같은 개발 툴, 컴파일러 등
- 이 local 환경을 구축할 시에 가장 주의해야 할 점은 모든 개발자가 같은 개발 환경을 사용해야 한다.
- 실제로 많이 발생하는 문제로, 다른 version의 JVM을 사용하거나, Tomcat을 사용하거나 Lang(문자 local 설정)을 서로 다르게 사용해서, 정작 코드를 합칠 때, local에서 잘 작동했던 코드가 작동되지 않는 경우가 많다.
- 개발 환경을 표준화 하는 방법은 여러가지가 있지만, 전체 개발 환경 (JDK,Eclipse,library)을 zip파일 형태로 묶어서 사용하는 방법이 가장 일반적이다.
- maven을 사용 할 경우, 개발에 사용되는 JDK,라이브러리 버전 등을 지정할 수 있기 때문에 개발환경 차이에서 오는 문제점 상당 부분을 해소 할 수 있다.
2. dev (서버 개발 환경)
- 개발 환경은 각 개별 개발자들이 만든 코드를 합쳐서 서버 환경에서 테스트 해볼 수 있는 환경이다.
- 소스코드를 형상관리 시스템에 commit 하면, 코드는 이 dev 환경에 자동 배포되고, 이 환경에서 테스트가 된다.
- 기능 개발 위주로 하기 때문에, 서버의 환경은 production 보다 훨씬 작다.
- production이 클러스터링 환경으로 수개의 서버로 구성된다면, 개발 환경은 한 두개의 서버로 기능 구현이 가능한 정도로 구축하는 것이 일반적이다.
3. Integration (통합 개발 환경)
- 통합 개발 환경은 여러개의 component를 동시 개발하는 프로젝트가 있고, 각 component가 다른 component에 대해서 dependency를 가지고 있을 때, 컴포넌트를 통합 및 테스트하는 환경으로 사용한다. 예를 들어 단말과 서버를 같이 개발하는 환경의 경우 이 integration 환경에서 통합을 한다. dev 환경과 마찬가지로 최소한의 set으로 구성하되, dev환경에서 release가 되면 주기적으로 deploy 한다.
4. QA (테스팅 환경)
- 테스트 환경은 QA 엔지니어 의해서 사용되는 환경으로, short release 주기에 따라서, 개발환경에서 QAㅎ 환경으로 배포 되고, 여기서 기능 및 비 기능(Load Test) 등을 QA 엔지니어가 수행한다.
비 기능 테스트를 수행할 시에는, production과 거의 유사한 환경을 만들어 놓고, 테스트를 수행한다.(경우에 따라서는 비기능 테스트는 release 전에, production 환경에서 직접 수행하는 경우도 있다. 이런 경우는 release cycle이 매우 긴 경우 주로 사용하는데, 기업의 내부 IT 시스템을 만들어서 몇 년씩 사용 하는 경우와 같은 때 이런 방식을 이용한다.
5. staging (스테이징 환경)
- 운영 환경과 거의 동일한 환경을 만들어 놓고, 운영 환경으로 이전하기 전에, 여러 가지 비 기능적인 부분(Security, 성능, 장애 등)을 검증하는 환경이다.
6. production (운영 환경)
대부분 개발 환경은 별도로 운영하는 것이 일반적이고, 상황에 따라 integration, qa, staging 환경은 요구 사항에 맞게 합치거나 별도로 운영한다.
환경이 많아지면 조금 더 다양한 형태의 검증과 각 stakeholder (tester,developer,user) 별로 테스트가 쉽지만, 반대로 환경을 유지하는데 필요한 서버들과, 운영 인력이 많이 소요되는 단점이 있다. 그래서 요즘과 같이 가상화 환경을 사용하는 경우에는 이미지를 만들어 놓았다가, 실제 테스트나 사용을 할 경우에만 가상 서버에 환경을 deploy해서 사용하고, 사용이 끝나면 다시 이미지를 storage에 저장해 놓는 전략을 많이 사용한다.
* 배포 (release,deploy,distribution)
프로그래밍에서 배포는 3가지의 단어로 나뉘어져 있고, 각각의 역할이 다르다.
- release
- 같은 제품을 새롭게 만드는 것
ex) 새로운 버전을 배포, 새로운 아이피 번호 부여
- deploy
- 프로그램 등을 서버와 같은 기기에 설치하여 서비스 등을 제공하는 의미
ex) AWS Lambda를 trigger하여 사용할 때
- distribution
- 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미