디자인패턴은 문제를 해결하는 일에 도움이 될만한 코드 구조화 패턴이라고 생각하면 된다. 종종 GoF(Gang of Four) 패턴이라고 부르기도 하는데, 그 이유는 네 명(Four)이 정립한 개념이기 때문이다.
아키텍처 패턴(또는 아키텍처 스타일)(ref2)은 디자인패턴보다 추상화된 개념으로, 시스템을 구성하는 패턴이다. 레이어 패턴, 클라이언트-서버 패턴, 마스터-슬레이브 패턴 등. 디자인 패턴이 만들어내는 서비스, 모듈의 구조, IPC, EAI, ESB 그 무엇과도 연관이 있는 추상적인 개념이라고 볼 수 있다.
참고: 아키텍처 패턴이 다루는 범위가 조금씩 다르다(ref3).
참고: 시스템 통합의 방법과 그 규모에 따라 구분해 보면 IPC, EAI, ESB 같은 키워드를 찾을 수 있다.
IPC | EAI | ESB | |
---|---|---|---|
약어 | Inter-Process Communication | Enterprise Architecture Integration | Enterprise Service Bus |
통합의 범위 | 프로세스 간 통합 | 회사 애플리케이션 간 통합 | 회사 전체 시스템 통합 |
그래픽 분석기법을 이용한 소프트웨어 모델링: 프로그래머들은 소프트웨어 모델의 일부분을 다이어그램과 문서로 나타낸다. 다만 한 줄의 글보다 한 폭의 그림이 이해하기 쉽다. 선대 프로그래머들은 어떻게 하면 더 직관적으로 시스템을 표현하는 그림을 그릴 수 있을까를 고민했다. 물론, 이것을 항상 사용하는 것도 아니고, 익숙하지 않은 사람들에게는 오히려 병목이다. 그럼에도 소프트웨어를 잘 만들기 위해 어떤 것들을 고민했는지 알고 있는 것은 유의미하고, 소통을 위해 어떤 모델을 꺼내 사용할 수 있는지 파악하고 있는 것은 도움이 될 수 있다(ref1).
럼바우는 UML의 창시자다.
럼바우는 객체(시스템에 요구되는 객체의 속성과 연산을 표시하는 것) → 동적(상태도를 이용해 시간에 따른 흐름제어를 나타내는 것) → 기능(functional. 함수니까 IO가 표현되어야 한다. DFD로 IO를 표현하는 것) 모델링 순서대로 하면 시스템을 표현하기 편한 것 같다는 것을 생각해냈다.
DFD
기능 모델링에 사용되는 DFD는 자료 사전이라는 문서가 추가로 필요하다.
일례로, UML에는 해당되지 않지만 Coad와 Yourdon의 ERD는 현실을 그래픽으로 표현하는 일을 고민했다. 그만큼 가장 앞단계에서 시도해보기 쉽고 간편하다. 한편 이것은 데이터베이스를 설계할 때에도 이용되는데, 마찬가지로 데이터베이스 설계의 첫 단계인 개념적 설계 단계에서 이용된다.
데이터베이스 스키마 | 분류 | 설계 |
---|---|---|
단계 | 개념 → 외부 → 내부 | 개념적 → 논리적 → 물리적 |
나누는 기준 | 추상화 수준에 따라 | 설계 순서에 따라 |
정적(구조) 다이어그램 예시
동적(행위) 다이어그램 예시
시퀀스 다이어그램
테스트
정적 테스트와 코드 리뷰
워크쓰루: 간단한 테스트 케이스들을 넣어보면서 수작업으로 소스코드를 한발한발 가보는 것. 한편, 인스펙션 전 단계에서 명세서 까놓고 하는 회의 정도로 여기는 경우도 있다. 워크쓰루가 의미하는 바는 조금씩 다르다. 그게 중요할까.
인스펙션: 소스코드 저자 외 다른 전문가가 검사하는 가장 공식적인 리뷰 기법이다. 문서화된 절차를 기반으로 소프트웨어 명세를 만족하는지 검증한다.
<aside> 💡
To. GPT; {문서}는 소스코드 가이드라인이야. 코드 인스펙션을 실행해줘.
</aside>
동적 테스트에는 두 가지 관점이 있다. 프로그램이 어떻게 작성되었는지 충분히 의식하고 만든 테스팅인가 아닌가. 전자를 화이트박스 테스팅, 후자를 블랙박스 테스팅이라고 한다. 둘 다 엄연히 테스트 케이스를 작성하고 실행하는 테스팅이다.
화이트박스 테스팅
기초 경로 테스팅(Base Path Testing): McCabe가 제안한 순환복잡도(cyclomatic)를 측정한다. 그래프에 의해 닫힌 영역 + 외부영역(1) 을 더해 계산할 수 있다.
<aside> 💡
여담으로, LLM의 발전으로 이것도 계산을 맡길 수 있다.
</aside>
제어구조 테스팅(Control Structure Testing): 테스트 케이스 설계 기법이다. 흔히 유닛테스트 등을 작성하는 것과 블랙박스 테스팅을 동치로 여기기도 한다. 하지만 사실은 변수의 변화, 루프, 조건 등을 골고루 훑어줄 수 있는 테스트케이스를 작성하라는 지침은 화이트박스 테스팅에 있다. 모듈을 작성하면서 이런 제어구조를 고려하여 유닛테스트를 동시에 작성하는 사람들도 있는데, 화이트박스 테스트가 개발 초기 사용된다고 이야기하는 이유가 바로 이것이다. 함수 커버리지는 어떤 함수가 최소 1번 이상 호출되었는지를 기준으로 커버리지를 계산한다. 구문(Statement) 커버리지는 라인(Line) 커버리지라고도 불린다. 프로덕션 코드의 전체 구문 중 몇 줄의 구문이 실행되었는지를 기준으로 판단한다. 결정(Decision) 커버리지는 브랜치(Branch) 커버리지라고도 불린다. 프로덕션 코드에 조건문이 있는 경우, 조건문의 전체 조건식이 True인 케이스, False인 케이스 2가지가 최소한 한번 실행되면 충족된다. 개별 조건식의 개수와는 상관없이 최소 2개의 테스트 케이스로 충족이 가능하다. 조건 커버리지는 결정 커버리지와 다르게, 전체 조건식이 아니라 개별 조건식을 기준으로 판단한다.
블랙박스 테스팅
정성적 소스코드 품질 평가
int[]
를 파라미터로 받는 함수를 호출. 직접 정의한 클래스 인스턴스 타입을 전달하는 경우.int
를 파라미터로 받는 함수를 호출.프로젝트 일정 관리: 대부분의 경우 SI에서나 쓸법한 방법을 사용한다. 그런 것에는 아직 큰 관심이 없다. 얼마나 유용한지도 모르겠고, 이제 라인 수와 생산성을 동치로 여기는 것이 무의미한 시대가 아닐까.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
None
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.