유지보수를 고려한 sw 개발

88
유유유유유 유유유 SW 유유 KTH, 유유유유 Lab 유유유 2012/03/30

Upload: dohyoung-rim

Post on 18-Jun-2015

3.630 views

Category:

Technology


3 download

DESCRIPTION

개발자를 불행하게 하는 유지보수를 고려한 개발에 대한 얘기들입니다. 개인적인 경험에 근거한 주관적인 내용입니다. 논의의 꺼리로서 정도의 의미입니다.

TRANSCRIPT

Page 1: 유지보수를 고려한 SW 개발

유지보수를 고려한 SW 개발

KTH, 분산기술 Lab임도형

2012/03/30

Page 2: 유지보수를 고려한 SW 개발

2

본 문서에 대하여• 유지보수를 용이하게 하기위하여 소프트웨어

개발 환경과 , 패키징 , 배포에 대한 이러저러한 내용들을 설명합니다 .

• 소프트웨어 개발자 , 프로젝트 관리자가 대상입니다 .

Page 3: 유지보수를 고려한 SW 개발

왜 ,굳이 ,

이런 문서를 ...

Page 4: 유지보수를 고려한 SW 개발

4

유지보수를 위하여

Page 5: 유지보수를 고려한 SW 개발

5

유지보수의 비용을 줄이기

위하여

Page 6: 유지보수를 고려한 SW 개발

6

유지보수로 지친개발자를

구하기 위하여

Page 7: 유지보수를 고려한 SW 개발

배포와 유지보수 , 그리고 책임

Page 8: 유지보수를 고려한 SW 개발

8

배포• 배포 , 그 지옥의 시작 .• 피할 수 없는 책임이 지워집니다 .

Page 9: 유지보수를 고려한 SW 개발

9

배포• 배포란 고객에게 우리가 개발한 것이 전달되는

것을 의미합니다 .

• 완벽한 소프트웨어는 없습니다 . 버그는 있을 수 밖에 없습니다 .

• 고객의 마음은 변합니다 . 바꿔 달라고 요청합니다 . 거절 할 수 없습니다 .

Page 10: 유지보수를 고려한 SW 개발

10

배포와 유지보수• 일단 배포 했으면 유지보수 해야 합니다 .

• 한번 팔고 회사 접을 거라면 몰라도 유지보수 해야 합니다 .

• 배포한 소프트웨어를 버그픽스하고 기능개선하는 유지보수를 반드시 해야만 합니다 .

Page 11: 유지보수를 고려한 SW 개발

11

그냥 유지보수 하면 되지 않나요 ?

• 뭐 별거 있겠어요 ?• 그냥 하면 되지…• 지금껏 잘해 왔는데…

Page 12: 유지보수를 고려한 SW 개발

12

행복한 상황• 개발 조직은 오로지 그 한 분 만을 상대합니다 .

• 만약 우리의 소프트웨어가 업데이트 된다면 , 고객은 흔쾌히 운영환경에 적용하겠다고 합니다 .

• 하지만 아시죠 ? 현실은 그렇지 않다는 것 .

Page 13: 유지보수를 고려한 SW 개발

13

일반적인 상황• 다수의 고객

• 각 고객마다 상이한 버전을 사용

• 고객은 웬만하면 업데이트 하려 하지 않음

Page 14: 유지보수를 고려한 SW 개발

버그 픽스

Page 15: 유지보수를 고려한 SW 개발

15

필수 조건• 고객과 똑같은 환경을 구축할 수 있어야 한다 .

• 해당 버전의 소스를 확보하고 있어야 한다 .

• 해당 버전의 종속적인 라이브러리를 확보하고 있어야 한다 .

• 그 이후에야 버그 재현을 시도해 볼 수 있다 .

Page 16: 유지보수를 고려한 SW 개발

16

개발 환경 구축• 버그를 재현할 개발 환경 구축이 한방으로

되어야 한다 .

• 버그 픽스 보다 어려운 것이 개발 환경 구축이다 . 이리 저리 손으로 구축해야 하는 것은 참으로 어렵다 . 특히 물어물어 하는 것은 절대 피해야 한다 .

Page 17: 유지보수를 고려한 SW 개발

17

GUIDE

• 개발환경을 한방으로 구축되게 하라 .

Page 18: 유지보수를 고려한 SW 개발

18

소스 버전 관리• 일반적으로 소스 버전은 관리 된다 .

• 그리고 설치된 것의 버전을 확인할 수 있어야 한다 .

• 방법은 다양하다 .– 로그에 찍을 수도 있고– 폴더 이름에 명시할 수도 있고– 프로그램 help 에서 볼 수도 있고– 별도의 명령어를 써서 볼 수도 있고

• 하여간에 버전을 확인할 수 있어야 한다 .

Page 19: 유지보수를 고려한 SW 개발

19

GUIDE

• 설치된 버전을 확인할 수 있도록 패키징 하라 .

Page 20: 유지보수를 고려한 SW 개발

20

라이브러리 버전 관리• 필요한 외부 라이브러리도 보통 같이 배포된다 .

• 버그 재현을 하려면 그 라이브러리의 버전도 관리되어야 한다 .

• 누가 관리 ? 어떻게 관리 ?

• 하여간에 버그 재현을 위해 고객에 설치된 것과 동일한 소스와 라이브러리를 확보하고 있어야 한다 .

Page 21: 유지보수를 고려한 SW 개발

21

외부 라이브러리• 외부 라이브러리는 언제 어떻게 될지 모른다 .

• 라이브러리 설치본을 확보하고 있어야 한다 .

• 실제 설치되는 파일의 리스트를 알고 있어야 한다 .– 그래야만 라이브러리 자체를 업데이트 할 수 있다 .

Page 22: 유지보수를 고려한 SW 개발

22

외부 라이브러리 관리 사항• 설치본 확보 .

– 설치 파일 자체를 프로젝트에 포함시킨다 .– 혹은 별도의 repository 에 보관해야 한다 .

• 빌드 시에 프로젝트 내에 설치하도록 한다 .– 시스템에 설치가 아니다 .

• 제거 할 수 있도록 한다 .– 리스트를 관리하든– 각 라이브러리 별로 폴더로 구분하든

• 라이선스 파일과 다운로드 url 도 같이 확보해 두어야 한다 .

Page 23: 유지보수를 고려한 SW 개발

23

관리를 잘 못하면• 홈페이지에서 다운 링크가 없어졌어요 .

• linux 의 모든 유저가 동일한 라이브러리를 사용한다면 버전 별로 업무를 진행할 수 없다 .

• 라이브러리 30,40 개는 우습다 . 시간 흐르면 어느 파일이 어떤 라이브러리에서 설치되었는지 모른다 . 무섭기 때문에 절대 삭제할 수 없다 .

• 배포 시에 사용 라이브러리의 라이선스 포함은 당연하다 . 어짜피 확보하여야만 한다 . 그냥 라이브러리 최초 설치 시에만 확보해 두자 .

Page 24: 유지보수를 고려한 SW 개발

24

GUIDE

• 사용하는 외부 라이브러리를 제대로 관리하라 .–설치본 확보–라이선스 확보–다운로드 링크–설치된 파일 리스트

Page 25: 유지보수를 고려한 SW 개발

외부 라이브러리 관련 좀더

Page 26: 유지보수를 고려한 SW 개발

26

라이브러리의 종류• 사용되는 모든 라이브러리가 전부 같이

배포되는 것은 아니다 .–테스트 용–설치 플랫폼에서 지원되어 배포 불필요

• 패키징 시에 이런 라이브러리를 제외할 수 있도록 구분할 수 있어야 한다 . 보통 폴더로 .

Page 27: 유지보수를 고려한 SW 개발

27

라이브러리 설치 절차• 라이브러리 설치 절차도 정의하여야 한다 .• 정의되지 않으면 당연한 것들이 누락된다 .–다운로드 링크 , 라이선스 , 설치된 파일 리스트 ,

목적

Page 28: 유지보수를 고려한 SW 개발

28

관리할 라이브러리 파일• 매 빌드 때마다 라이브러리들을 전부 다시

빌드할 필요는 없다 .• 바이너리 혹은 패키징된 형태의 파일을

저장소에서 가져올 수 있도록 하자 .

Page 29: 유지보수를 고려한 SW 개발

29

GUIDE

• 프로젝트가 필요한 라이브러리를 보관할 저장소를 마련하라 .

Page 30: 유지보수를 고려한 SW 개발

배포 시 문서

Page 31: 유지보수를 고려한 SW 개발

31

포함시켜야 할 문서들• 버전• 설치 , 사용 , 기타 설명• 변경 내역 ( 버그 픽스 , 기능 추가 )• 하위 호환 관련 설명–된다 , 안된다 .–안되면 업그레이드 방법 기술

• 라이선스

Page 32: 유지보수를 고려한 SW 개발

32

문서들의 위치 ?

• 배포에 포함될 문서들도 관리되어야 한다 .• 한방 빌드가 되려면 자동으로 가져올 수

있어야 한다 .• 프로젝트 내에 포함 되도 좋고 , 별도로 관리

되도 좋고 .

Page 33: 유지보수를 고려한 SW 개발

33

문서의 작성은 누가 ?

• 아무나 할 수 있어야 한다 .• 이슈관리툴을 보고 작성 .–이슈관리툴에는 이를 위한 충분한 정보가

입력되어 있어야 한다 .

Page 34: 유지보수를 고려한 SW 개발

34

GUIDE

• 패키징은 tar 실행이 아니다 . 포함할 문서를 반드시 작성하라 .

Page 35: 유지보수를 고려한 SW 개발

브랜치

Page 36: 유지보수를 고려한 SW 개발

36

브랜치가 없다면• 고객은 v2.0, 현재 최신은 v4.3 이다 .• v2.0 의 버그를 픽스했다 .• 요것도 관리해야 하는데 어디에다 ?– v2.0 에 적용하는 순간 이미 v2.0 이 아니다 .–최신 4.3 에다 적용할까 ?

2.0 2.1 2.2 4.3. . .

bug fix

Page 37: 유지보수를 고려한 SW 개발

37

배포할 때 마다 브랜치를 만들자• 배포할 때 v2.0 의 브랜치를 만들자 .• 버그 픽스가 적용된 v.2.0.1 버전을 새로

만들자 .

2.0 2.0.1

bug fix

main branch

3.0 4.0

merge

Page 38: 유지보수를 고려한 SW 개발

38

모든 브랜치에 버그 픽스 적용• 보통 버그는 특정 브랜치에만 해당하지는

않는다 .• 적용 가능한 모든 브랜치에 버그 픽스를

적용한다 .

2.0 2.0.1

bug fix

main branch

3.0 4.0merge 3.0.

14.0.

1

bug fixmerge

bug fixmerge

Page 39: 유지보수를 고려한 SW 개발

39

언제 새 브랜치 ?

• 배포 시 마다 새 브랜치를 생성하여야 한다는데

• 버그 하나 수정한 것도 새 브랜치로 ?

• 별다른 업그레이드 조치 없이 새것으로 바꾸어 사용하여도 무방하면 : X

• 하위 호환 안되거나 , 굵은 업버전일 경우 : 새 브랜치

Page 40: 유지보수를 고려한 SW 개발

40

패키지 , 브랜치• 배포를 위해 패키징하나 할 때 마다 새로운

버전의 패키지가 새로 생긴다 .some-1.2.0.tar.gzsome-1.2.1.tar.gzsome-1.2.2.tar.gzsome-1.3.0.tar.gz

• 보통은 minor version까지 하나의 브랜치로 관리한다 .

브랜치 1.2

브랜치 1.3

Page 41: 유지보수를 고려한 SW 개발

41

GUIDE

• 하위호환 안되는 배포일 때 branch 를 만들라 .

Page 42: 유지보수를 고려한 SW 개발

패키징 절차

Page 43: 유지보수를 고려한 SW 개발

43

패키징 절차• 컴파일• 모든 테스트 ( 단위 , 통합 , 하위호환 ) 만족• 배포 문서 작성• 필요 시 , 업그레이드 스크립트 작성 , 검증• 패키징 파일 생성• 필요 시 , 새로운 브랜치 생성

Page 44: 유지보수를 고려한 SW 개발

44

절차 정의 필요• 누구나 패키징을 할 수 있어야 한다 .• 당연한 것들이라 인식되지만 , 정의된 절차가

없으면 , 누락되고 , 실수하고 , 생략되고 , 일관성 없이 된다 .–작성할 문서 목록–실행할 테스트 목록–버전이나 파일이름 관련 규칙

Page 45: 유지보수를 고려한 SW 개발

팀 내 프로젝트 간 관계

Page 46: 유지보수를 고려한 SW 개발

46

사 내 , 팀 내 프로젝트• 외부 라이브러리 뿐 아니라 , 사내 , 팀 내 프로젝트를

사용하는 경우도 많다 .

• 다를 것 없다 . 제대로 패키징해서 저장소에 올리고 , 다른 프로젝트는 마치 외부 라이브러리를 사용하는 것처럼 하면 된다 .

• 절대 지양할 예– 컴파일한 클래스 파일 하나를 메신저로 전달– 급하다고 운영서버에서 직접 손으로 수정

Page 47: 유지보수를 고려한 SW 개발

시스템의 독립성

Page 48: 유지보수를 고려한 SW 개발

48

라이브러리 공유 지양• 각 시스템 별로 실행 환경을 독립되게 한다 .

• 공유된 곳에 있는 라이브러리를 2 개의 시스템이 사용할 때 , 만약 다른 버전의 라이브러리를 사용해야 한다면 ?

Page 49: 유지보수를 고려한 SW 개발

업그레이드

Page 50: 유지보수를 고려한 SW 개발

50

대상• 데이터• 설정

Page 51: 유지보수를 고려한 SW 개발

51

데이터 업그레이드• 절대 소실되어서는 안된다 .• DBMS 와 같이 시스템 안에 저장된 경우 ,

SQL 과 같은 방식으로 처리한다 .

Page 52: 유지보수를 고려한 SW 개발

52

설정 업그레이드• 일반 데이터와 동일하게 취급한다 .• 파일로 되어 있을 경우 그 내용을 자동으로

업그레이드 할 수 있도록• 시스템에 있을 경우 시스템의 인터페이스를

사용하여서

Page 53: 유지보수를 고려한 SW 개발

53

스크립트• 당연히 자동화 되어야 하고 , 스크립트로

제공되어야 한다 .• 업그레이드 실패 시 , 복원할 수 있어야 한다 .

• 업그레이드 스크립트 자체만 별도로 패키징하길 권장 .

Page 54: 유지보수를 고려한 SW 개발

54

업그레이드 체인• 각 배포 버전마다 업그레이드 스크립트를

제공하고 , 각 스크립트를 연속적으로 적용한다 .

• 이를 위해서는 매 배포 시마다 업그레이드 스크립트를 제공해야 한다 .

2.22.2.

12.3

2.3.1

2.3.2

업그레이드 업그레이드 업그레이드 업그레이드

Page 55: 유지보수를 고려한 SW 개발

하위 호환

Page 56: 유지보수를 고려한 SW 개발

56

하위 호환 되려면• 인터페이스 삭제 불가• 인터페이스 변경도 불가• 오직 추가 , 확장만이 가능하다 .

• 초기 인터페이스의 겉모습이 적절하지 않다면 , 인터페이스 자체가 일관성 없을 수 밖에 없다 .

• 정말 신중히 신중히 신중히 그리고 한번 더 신중히 인터페이스 형태를 고민하자 .

Page 57: 유지보수를 고려한 SW 개발

57

보장하여야 한다• 테스트로 검증할 수 밖에 없다 .• QA 인력에 의해 수작업으로 검증되기도 하지

만 , 바람직하지 않다 .• 자동으로 실행될 수 있어야 한다 .

• 수작업으로 진행될 경우 패키징의 피드백이 오래 걸린다 . 최소 하루 이상 . 더욱이 QA팀과 같이 역할이 분리된 경우 더 오래 걸린다 . 자동화 된 경우 즉각 결과를 보고 수정이 가능

Page 58: 유지보수를 고려한 SW 개발

58

하위 호환 테스트• 하위호환 테스트는 별도의 프로젝트로 관리하자 .– 특정 버전의 프로젝트에 포함되어 있는 테스트 케이스가

다른 버전을 테스트 ?– QA 담당자가 QA 를 위한 프로젝트로 취급하자 .

• 특히 하위호환이 안되어 업그레이드 해야 할 경우 테스트에는 2 개의 버전이 동시에 사용된다 .

2.2.0

2.2.1

업그레이드

테스트 셑

test test

Page 59: 유지보수를 고려한 SW 개발

59

네임스페이스• 하위 호환을 위해 기존 코드를 그대로 두고 한 벌을

더 작성하기도 한다 .• 이 경우 새로운 코드의 네임스페이스만을 변경해서

사용하는 것이 가장 편이 .

• python 과 같은 코드에도 , 이후의 유연성을 위해 네임스페이스를 적용하자 .

Page 60: 유지보수를 고려한 SW 개발

60

하위호환이 정말 어렵다면• 호환 포기를 선언한다 .

• 새로운 버전은 새로운 프로젝트로 취급한다 .

Page 61: 유지보수를 고려한 SW 개발

개발과 유지보수

Page 62: 유지보수를 고려한 SW 개발

62

유지보수 담당• 배포를 하면 , 어쩔 수 없이 유지보수 업무 담당자가 있을 수 밖에 없다 .

• 하지만 전담으로 유지보수를 하는 인력이 있게 되는 순간부터 개발 외적인 관리의 어려움이 발생한다 .

Page 63: 유지보수를 고려한 SW 개발

63

어두운 유지보수 업무• 동기 부여가 어렵다 .• 창의성있는 업무가 아니기에 의욕을 두기

어렵다 .• 타 개발자에 의해 작성된 것을 받아서 시작한다 .• 신규 개발업무와 차별되었다고 느낀다 . 혹은

진짜 차별 받고 있다 .• 아무리 잘해도 돋보이기 힘들다 .• 역량 인력의 확보가 힘들고 , 이탈이 쉽다 .

Page 64: 유지보수를 고려한 SW 개발

64

유지보수 비용• 유지보수에 소프트웨어 개발 전체의 2/3

혹은 3/4 비용이 소요된다 .• 배포가 많아 질수록 비용이 더 커진다 .

• 정말 1 인당 매출액을 늘리려면 요 부분의 비용을 줄여야 한다 .

Page 65: 유지보수를 고려한 SW 개발

65

유지보수를 조금 밝게 하려면• 개발 자체가 유지보수를 고려해야 한다 .

• 모든 것을 자동화 한다 .• 브랜치를 최소로 한다 .• 디버깅을 쉽게 한다 .• 문서가 중요하다 .

Page 66: 유지보수를 고려한 SW 개발

66

유지보수 고려한 개발• 개발되어 건네어진 것을 대상으로 하기에 , 그

건네어진 것 자체가 엉망이라면 , 어떻게 해볼 여지가 거의 없다 .

Page 67: 유지보수를 고려한 SW 개발

67

자동화• 업그레이드 스크립트가 없다면 ? 매 고객을 찾아가 손으로 업그레이드를 해야 한다 .

• 개발환경 구축을 매번 손으로 해야 한다면 ? 구축 자체가 까다롭고 어렵다 . 역시 비용이다 .

• 자동화 되지 않을 경우 테스트는 제대로 할 수 있을까 ?

• 자동화하지 못했다는 것은 단순 반복 업무를 손으로 해야 한다는 것 . 비용이 커지고 , 업무를 지치게 한다 .

Page 68: 유지보수를 고려한 SW 개발

68

최소 브랜치 유지• 브랜치 개수 만큼 업무의 양이 비례한다 (

비용이다 ).• 쉽게 브랜치를 따지 말자 (즉 하위호완 안되는 새로운 배포를 심각하게 고려하자 )

• 특히 고객별로 커스터마이징 하는 경우 답이 없다 . 다른 회사 알아 보자 .

Page 69: 유지보수를 고려한 SW 개발

69

쉬운 디버깅• 운영환경에서 활용할 수 있는 것은 오직

로그이다 .• 개발 시의 당연하고 쉬운 로직 흐름이라도 ,

유지보수 시에는 일일이 코드를 보며 다시 파악해야 한다 ( 비용이다 ).

• 로그만으로도 문제를 파악할 수 있게 해야 한다 .

Page 70: 유지보수를 고려한 SW 개발

70

문서의 중요성• 모든 개발 업무에 ‘왜 , 어떻게 , 그래서’라는

문서를 작성하자 . 코드만으로 그것들을 파악하기는 극히 어렵다 ( 비용이다 ).

• 업무를 순환해도 개발이 진행될 수 있어야 한다 . 즉 아무나 그 업무를 진행할 수 있어야 한다 . 신규개발 하던 개발자가 유지보수 하고 , 유지보수 하던 개발자가 신규 개발할 수 있어야 .

Page 71: 유지보수를 고려한 SW 개발

71

다시 , 유지보수 고려한 개발• 제시된 모든 방법은 개발 시에 적용되어야 한다 .– 자동화 , 최소 브랜치 , 쉬운 디버깅 , 문서

• 그 적용 하나 하나가 개발의 더디게 한다 . 하지만 무시하면 그것은 고스라니 유지보수 비용으로 전가된다 .

• 개발된 결과에 대하여 책임을 져야 한다 . 치고 빠지면 안 된다 . 배째면 안 된다 . 책임 자신 없으면 배포하면 안된다 .

Page 72: 유지보수를 고려한 SW 개발

72

유지보수가 어렵지 않다면• 개발과 유지보수의 업무 담당을 구별하지 않아도

된다 .

• 그렇다면 그 부작용을 최소화 할 수 있다 .

• 이상적으로는 유지보수 인력을 따로 두지 않아도 된다 .

• 와 ! 이상적인 경우 그 비용이 엄청 감소한다 .

Page 73: 유지보수를 고려한 SW 개발

좀 편중된 관점

Page 74: 유지보수를 고려한 SW 개발

74

솔루션 개발의 관점• 본문서의 내용은 솔루션 개발이란 관점에 편중된 내용입니다 .

• 실제 상황은 많이 다를 수 있습니다 . 하지만 유지보수를 좋게 하겠다는 똑같은 목표라면 과장되지는 않았다 봅니다 .

Page 75: 유지보수를 고려한 SW 개발

다시 정리

Page 76: 유지보수를 고려한 SW 개발

76

배포의 책임감• 제대로 배포하지 못하면 , 모두가 불행해 진

다 . 돈 .

Page 77: 유지보수를 고려한 SW 개발

77

패키징 절차• 반드시 정의되어야 한다 .

Page 78: 유지보수를 고려한 SW 개발

78

하위 호환 보장• 테스트로 하위 호환을 보장해야 한다 .

Page 79: 유지보수를 고려한 SW 개발

79

브랜치• 하위호환이 안될 경우 새로운 브랜치를 생성

하라 . 하지만 새로운 브랜치는 곧 비용이다 .

Page 80: 유지보수를 고려한 SW 개발

80

자동화• 모든 걸 자동화 해야 한다 . or 돈

Page 81: 유지보수를 고려한 SW 개발

81

유지보수를 고려한 개발• 유지보수의 비용은 개발과정에서 기인한다 .

Page 82: 유지보수를 고려한 SW 개발

82

저장소• 라이브러리를 관리할 저장소를 둔다 .• 패키징한 패키지도 저장소에 올린다 .• GitHub, 좋습니다 .

Page 83: 유지보수를 고려한 SW 개발

사족 . 소프트웨어 품질

Page 84: 유지보수를 고려한 SW 개발

84

3 가지• 동적 테스트 : 각종 테스트들• 정적 테스트 : 커버리지 , 잠재 버그 검출• 문서 : 사용 , 유지보수를 위한

Page 85: 유지보수를 고려한 SW 개발

85

품질과 절차• 절차가 정의되어야 합니다 .

• 앞에서 테스트 자동화는 말했지만 , 충분한 그리고 적절한 테스트인지는 어떻게 보장 ?

• 정적 검사는 단지 검사툴의 자동 실행만 적용해도 됩니다 .

• 충분한 그리고 적절한 문서인지는 어떻게 보장 ?

Page 86: 유지보수를 고려한 SW 개발

사족 . 그 한방에 대하여

Page 87: 유지보수를 고려한 SW 개발

87

한방• 이래 저래 수작업 필요 없다는 것이죠 .• 자동화 되었다는 얘기입니다 .

• 그 한방의 대상은 ? – 빌드와 테스트는 너무나도 당연하죠 .– 이 조차도 안되고 있다면 심각한 거 입니다 .

• 이 외 개발환경 구축 , 패키징 , 시스템 테스트 , 성능 테스트까지 지향해야 합니다 .

Page 88: 유지보수를 고려한 SW 개발

88

한방과 CI

• 프로젝트가 CI 에 적용되지 않았다면 , 한방 못하고 있는 겁니다 .

• CI 에 적용하기 어려운 이유가 있다면 , 프로젝트 구조를 개선해야 합니다 .

• 한방을 검증하는 유일한 형식적인 방법은 CI입니다 . CI 없이 한방 되었다고 말할 수 없습니다 . 그리고 자동화 없이는 유지보수 어렵습니다 .