1. 개발환경
- 하이브리드 앱 개발을 위한 소스코드
- 프론트(Nuxt.js) 에서 순수 네이티브 기능이 필요한 경우도 있음.
터치패드 입력, 새로운 웹뷰 호출 등
- 앱에서 다른 관계사들과도 통신하기 때문에 앱에서 세션을 관리함.
- 여러 관계사 화면 및 기능을 보여주는 슈퍼앱이지만 관계사 화면을 직접 호출하는 형태로 되어있음.
=> 그러다보니 SPA 가 아니라 관계사 화면을 새로운 웹뷰로 호출하는 방식으로 구현됨.
=> 이로 인해 새로운 웹뷰에서 우리 백엔드로 요청이 오는 경우도 있기 때문에 세션을 네이티브가 가지고 호출시켜줘야함.
- 위 상황들로 인해 기능 테스트 시 전체 로직 점검을 위해선 개발서버에 배포 후 앱으로만 확인 가능.
=> 웹뷰 로직인 경우, 로컬 환경에서 로그인 우회하여 로직 단위 점검은 가능함.
=> 하지만 전체 시나리오는 점검할 수 없다.
- 위 여건들로 인해 미완성된 테스트용 코드가 개발계 브랜치에 계속 포함되는 상황이 발생
- 실제 운영이관 시 미완성 코드 제외로직을 삽입하여(환경변수로 분기처리) 운영에 영향도를 최소화하는 방식으로 관리하게 됨.
- 배포는 CI/CD 로 구성하여 이관 후 자동배포됨.
- FEP, MCI, EAI 등 전용 통신 환경 개발이 되지 않아 스테이지 서버가 없음.
2. 소스코드 관리상황
- 개발용 레포지토리(이하 dev)와 운영 레포지토리(이하 prod)가 분리된 환경
- prod 에 브랜치 생성하여 개발 코드를 수동 복사
- prod 종합 브랜치(vest) 로 PR 진행 및 병합
- 병합된 코드 운영 브랜치로 이관 및 배포 진행
vest 코드가 그대로 이관되며 이를 사전에 확인할 수 있는 환경이 없음
3. 문제 발생
-
미완성 코드임에도 제외 로직이 없어 운영에 노출되는 케이스 발생
-
같은 파일 내 이관 대기 중인 코드가 함께 이관되는 케이스 발생
전체 리팩토링으로 인해 이관 전체가 중단되는 경우 등
-
또한 일부 의존관계를 가지는 코드들이 반대 순서로 배포되어 일시적인 오류가 발생하기도 함.
예) 브랜치 배포 순서가 잘못된 경우
1. A 브랜치(B에 의존함) 먼저 이관
2. B 브랜치 이관
3. B가 배포되기까지 A 브랜치 기능 호출 시 오류 발생.
예시 자원)
1. 백엔드의 경우, B 브랜치로 이관되는 매퍼파일을 사용하는 케이스
2. 프론트인 경우, B 브랜치로 이관되는 공통 CSS 자원을 사용하는 케이스
-
스테이지 서버가 없어서 실제 기능을 운영에 이관해야만 온전한 테스트를 할 수 있음.
4. 해결 과정
- 개발 레포지토리의 자원을 운영 레포지토리로 통합시키기로 함.
- 이후 개발 코드는 항상 브랜치로만 작업하도록 함.
- 개발 완료된 코드를 test 브랜치로 최종 병합 후 운영 브랜치로 이관 및 배포 진행
test 브랜치가 그대로 운영까지 이관되기에 개발 중인 코드도 같이 이관될 위험성이 많음.
이를 방어하기 위해 개발 코드 관리 전략을 수립함.(아래 방어전략 확인)
5. 방어 전략 - 개발 자원 이관 대비
문제
- 앱 환경 테스트를 위해 주기적으로 test 브랜치로 병합
- 이로 인해 개발중인 코드가 적용된 test 브랜치가 운영에 이관될 위험성이 발생
해결방안
- 개발중인 코드를 별도 패키지로 분리
- 개발 코드가 포함된 패키지는 운영 환경 기준 빌드 및 이미지 생성과정에서 제외
- 개발코드가 제외된 이미지 운영으로 배포하여 개발 코드 배포 원천 차단
- 개발 완료 후 업무 패키지로 이동시켜 최종 테스트 후 이관 진행
99. 폐기된 전략
구현방안
- 패키지 별도 분리 후 AOP로 컨트롤러 진입마다 차단
@Aspect
@Component
class 예외패키지 AOP {
@Before(value = isProd && execution(public * 예외패키지.*))
public ApiResult excludeApi(JoinPoint joinPoint) {
return new ApiResult(true? false?);
}
}
폐기 사유
- 시간소요가 적지만 AOP를 굳이 늘릴 필요가 없음.
- 결국 이관되고 실행되면 더미 응답이라도 줘야하기 때문에 그로 인한 사이드 이펙트도 고려해야함.
- 코드 자체를 이미지에서 제외시켜 원천차단이 나을듯하여 폐기함.