형상 관리 전략 수립

김동영·2022년 11월 12일
0

업무일지

목록 보기
1/3

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. 해결 과정

  1. 개발 레포지토리의 자원을 운영 레포지토리로 통합시키기로 함.
  2. 이후 개발 코드는 항상 브랜치로만 작업하도록 함.
    • 브랜치 단위로 매번 배포하도록 설정
    • 브랜치 단위 작업 시, 개발계 앱 테스트에서 다른 브랜치 코드가 계속해서 누락된다.
      장기 작업이 되는 경우(예. 타 관계사와 협업하는 경우 등) 그 기간만큼 다른 브랜치들과 배포 경쟁을 하게 된다.
    • 이를 보완하기 위해 주기적으로 개발 브랜치(test) 로 병합하여 코드를 종합시켜 앱에서는 최대한의 기능을 테스트할 수 있도록 한다.
  3. 개발 완료된 코드를 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를 굳이 늘릴 필요가 없음.
  • 결국 이관되고 실행되면 더미 응답이라도 줘야하기 때문에 그로 인한 사이드 이펙트도 고려해야함.
  • 코드 자체를 이미지에서 제외시켜 원천차단이 나을듯하여 폐기함.
profile
프레임워크와 함께하는 백엔드 개발자입니다.

0개의 댓글