본문 바로가기

개발 이야기/ETC

[기타] 개발 환경(Phase)이란 무엇일까?

개발 환경(Phase)란?

개발 환경(Phase)은 Application이 동작하는 환경을 의미한다. 따라서 대부분의 Framework는 각각의 개발 환경마다 설정 값을 다르게 셋팅할 수 있는 기능이 있다. 대표적으로 Spring Boot의 경우는 Profile 기능이다.

개발 환경(Phase)을 분리하는 이유?

제품을 개발할 때는 Application을 바로 운영 환경에 배포하지 않는다. 아마도 먼저 개발하고 있는 local에서 Application을 실행해보면서 디버깅이나 테스트를 진행하고, 실제 운영 환경과 비슷한 시스템이 갖춰진 Develop 환경이나 Beta, RC 환경에 순차적으로 배포하면서 테스트 과정을 거칠 것이다. 사실 개발 환경(Phase)은 회사나 팀에 따라 레벨이 조금씩 달라질 수 있지만 보통 local-develop-beta-(rc)-stage-production 순으로 구성하는 것이 보통이다.

개발 환경(Phase) 특징

(1) local 환경

보통 개인이 개발하는 PC 작업 환경을 의미한다. 직접 IDE를 통해서 코드를 개발하고 이를 바로 실행시키면서 디버깅할 수 있는 환경이다. 개인의 PC 환경에서는 Application과 관련된 모든 시스템 환경(Database, Message, Cache 등)을 전부 구축하기 어렵기 때문에 Dokerizing을 통해서 구성하고 테스트하는 편이다. 하지만 모든 시스템을 로컬에 완벽하게 구축하는 것은 현실적으로 힘든 상황이 많기 때문에 Build 성공 확인과 Mock을 동원한 Unit test를 주로 점검하며, Integration 테스트가 필요한 경우에만 Docker 환경을 활용한다. 요즘에는 TestContainers라는 Java 라이브러리가 등장했기 때문에 Java나 Kotlin으로 Spring Boot Application을 개발하는 입장에서는 Integration Test가 많이 수월해졌다.

(2) develop 환경

실제 운영환경과 동일하게 구축한 환경을 말한다. 다만 완전히 독립된 환경으로써 운영 환경과 분리된 별도의 환경이다. 즉, Database, Cache, Message 등의 시스템이 독립된 상태에서 develop 환경을 위한 별도의 서버들을 이용해서 구축한다. 최대한 Application에 필요한 서비스들을 전부 구성하기 때문에 최대한 운영환경과 비슷하게 테스트나 동작 확인을 할 수 있다. develop 환경부터 실제 Web/iOS/aOS 클라이언트를 포함하여 외부 Web Application들과 인터넷 통신을 통해 실제 연동 테스트가 가능하다는 점이 중요하다. 대부분 develop 환경은 nightly라는 명칭으로 비정기적으로, 시도때도 없이 상시 배포된다. 따라서 개발 환경은 다소 불안정하다고 볼 수 있고, 실제 각 서비스의 배포 버전의 안전성을 보장하기 힘들다. 따라서 연동 테스트 시에는 장애가 빈번하게 일어나고 서비스 담당자들이 서로 의사소통하면서 테스트를 해야하는 환경이라고 생각하면 된다. 보통 외부망에서 접근이 안되도록 제한된 내부망으로 구성한다.

(3) Beta 환경

develop phase와 마찬가지로 실제 운영환경과 동일하게 구축된 환경이다. 특징은 develop 환경과는 다르게 보통 약속된 배포 주기, 배포 버전 관리 하에 운영된다. 시스템과 관련된 서비스 개발자/운영자는 특정 규칙에 의해서 Beta 환경에 서비스를 배포한다. 보통 서비스 출시 직전 Application의 QA를 Beta 환경에 배포하여 진행한다. Beta 환경은 약속된 규칙에 의해서 관리되는 환경이므로 배포 시에 서비스와 관련된 구성원들에게 공지하고 배포한다. 또, 의도되지 않은 배포나 수정은 지양한다. 마찬가지로 외부망에서 접근이 안되도록 제한된 내부망으로 구성한다.

(4) RC(Release Candidate) 환경

실제 Production 환경에 배포하기 직전에 마지막 점검을 하는 환경이다. Beta 환경과 동일하지만 실제 Release 직전에 정식 Version으로 배포하여 실제 사용 환경을 확인하는 용도이다. 보통 시스템의 성능(서버 스펙 등)이 Production 환경과 동일하므로 부하 테스트를 진행하기도 한다. 보통 제한된 외부망으로 구성한다.

(5) Stage 환경

RC 환경과 Stage 환경은 비슷하면서 조금 다른 의미를 가진다. 사실 회사마다 이 2개 환경을 조금씩 다르게 사용하기도 한다. 하지만 내 경험상 RC 환경과 Stage 환경의 가장 큰 차이는 Stage 환경은 Database와 같은 Persistent 계층이 Production과 동일하게 구성된다는 점이다. 예를들어 Stage 환경에 Web Application을 배포하면 실제 물리적인 서비스 Data를 접근하기 때문에 실제 재고에 대한 주문 테스트나 결제 테스트가 가능해진다. 이런 특성을 이용해서 Stage 환경은 새로운 기능이나 Hotfix 수정건에 대한 테스트를 Production 환경 배포 전에 확인하거나, 소수의 특수 권한을 가진 운영자만 사용이 가능한 기능을 오픈하여 사용하는 용도로 활용된다. 보통 제한된 외부망으로 구성한다.

(5) Production 환경

말 그대로 실제 서비스의 운영 환경이다. 우리가 인터넷을 통해서 사용하고 있는 모든 서비스가 동작하는 환경을 말한다. Production 환경에 서비스를 배포하면 보통 Application의 Release Notes가 생성된다. 운영 환경은 외부망에 열려있으므로 주의해야 한다.