개발환경에 대하여 (dev,stage,prod)

유상우·2022년 7월 23일
2

운영

목록 보기
1/2

일반적인 서버 개발환경은 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
    • 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미
profile
Potentialist

0개의 댓글