소프트웨어 공학 Lecture #7: 상세 설계 최은만 저 6차 개정판 1
학습 목표 설계 패턴 클래스 설계 사용자 인터페이스 설계 데이터 설계
상세 설계 상세 설계 목적 패러다임에 따른 작업 설계 모델을 작동하는 소프트웨어로 변환 아키텍쳐-모듈 사이의 추상 수준의 갭을 줄이기 위함 패러다임에 따른 작업 구조적 방법 프로시저 안의 로직 (알고리즘) 설계 객체지향 방법 클래스 안의 메소드 설계
7.1 설계 패턴 디자인 패턴이란? 디자인 패턴 구성 요소 소프트웨어 설계에서 자주 발생하는 문제에 대한 일반적이고 반복적인 해결책을 말한다. 여러가지 상황에 적용될 수 있는 일종의 템플릿 디자인 패턴 구성 요소 패턴의 이름과 구분 문제 및 배경 – 패턴이 사용되는 분야 또는 배경 솔루션 – 패턴을 이루는 요소들, 관계, 협동과정 사례 – 적용 사례 결과 – 패턴의 이점, 영향 샘플 코드 – 예제 코드
설계 패턴 패턴의 분류 Gamma의 23개 패턴
팩토리 메소드 패턴 객체 생성을 위한 인터페이스의 정의 위임(delegation) 형태 사용 이유 RequiredClass의 생성을 팩토리 메소드를 가진 MyClass에게 위임 팩토리 메소드는 createObjectOfrequiredClass() 사용 이유 베이스 클래스에 속하는 객체 중 하나가 필요한데 그 아래에 있는 자식 객체 중 어떤 것이 필요한지 실행 시간까지 알 수 없을 때
추상 팩토리 패턴 클래스의 집합의 종류를 지정하여 관련된 객체의 집합을 생성할 수 있게 하는 패턴 추상 팩토리 패턴이 필요한 경우 하나의 업체에서 가전제품을 생산하기 위한 하드웨어를 제공함에도 불구하고 호환성이 취약하다. 여러 생산자가 만든 장치들을 혼합하여 사용할 때 취합하기 어렵다. 추상 팩토리 적용 사례
어댑터 패턴 이미 개발된 클래스, 즉 레거시 시스템의 인터페이스를 다른 클래스의 요구에 맞게 인터페이스를 변환해주는 것 이미 만들어져 있는 클래스를 사용하고 싶지만 인터페이스가 원하는 방식과 일치하지 않을 때 사용 패턴 적용 방법 위임을 이용 상속을 이용 <상속 이용 예>
싱글톤 패턴 시스템에서 단 하나의 인스턴스만을 갖도록 할 필요가 있는 경우 사용 패턴 사용 요령 프린터 스풀러 파일 시스템 등 클래스의 유일한 인스턴스를 넣을 위치를 정한다. 생성자의 접근 수정함수를 private로 지정 싱글톤을 얻기 위한 클래스 S에 public static 접근 메소드를 포함한다. 싱글톤을 얻는 방법은 생성자에게 위임
컴포지트 패턴 객체 집합 속에 또 다시 객체 집합을 갖는 경우 패턴 사용 집합 속에 포함될 객체와 집합을 가지고 있는 객체, 이들 모두가 자기 자신과 동일한 타입(메소드와 데이터)의 객체 리스트를 가질 수 있도록 도와준다. 기본 클래스와 이를 포함하는 컨테이너 클래스를 구분하지 않고 처리하는 재귀적 합성을 이용할 수 있다.
반복자 패턴 시스템의 유사한 객체를 다룰 때, 동일한 인터페이스를 이용하여 접근할 수 있도록 만드는 패턴 처리하려는 자료구조가 다른 형태로 바뀌더라도 클라이언트가 영향을 받지 않음
옵서버 패턴 1대 다의 객체 의존관계를 정의한 것 한 객체가 상태를 변화시켰을 때 의존 관계에 있는 다른 객체들에게 자동적으로 통지하고 변경 객체 하나를 변경하였을 때, 다른 객체에 통보하여 갱신하기 위한 옵저버 객체를 둔다.
상태 패턴 이벤트 의존 애플리케이션에 적합한 패턴 시스템이 동작하면서 발생되는 이벤트에 따라 변경이 이루어 질 수 있도록 설계 롤플레잉 게임 예제 MyGameState 타입의 state를 가지고 있다. State 는 다형성이 적용됨. 상태 객체를 이용
퍼싸드 패턴 서브시스템의 내부가 복잡하여 클라이언트 코드가 사용하기 힘들 때 사용 간단한 인터페이스만 알아도 서브시스템 주요 기능을 사용 복잡한 것을 단순하게 보여줌 내부 시스템을 몰라도 사용 가능
7.2 클래스 설계 분석 단계에서 아직 확정되지 않은 클래스 내부 부분 중 구현에 필요한 중요한 사항을 결정하는 작업 클래스 추출 및 클래스 간 관계 분석 상태와 오퍼레이션의 관계를 상세히 설계해야 함 클래스가 가지는 속성 값에 따라 오퍼레이션 구현이 달라짐 객체의 상태 변화 모델링 필수
클래스 인터페이스의 정의 왜 클래스의 인터페이스 정의가 중요한가 API(Application Program Interface) 클래스 구현 클래스 사용 클래스 확장 API(Application Program Interface) 서브시스템의 서비스 인터페이스
클래스 인터페이스의 정의 협약에 의한 설계(Design by Contract) 소프트웨어 컴포넌트에 대한 정확한 인터페이스 명세를 위하여 선행조건, 결과조건, 불변조건을 나타내는 설계 방법 선행조건(precondition) 오퍼레이션이 호출되기 전에 참이 되어야 할 조건 결과조건(postcondition) 오퍼레이션이 수행된 후 만족하여야 하는 조건 불변조건(invariant) 클래스 내부가 실행되는 동안 항상 만족하여야 하는 조건 리스트에 있는 노드가 항상 오름차순으로 되어야 함
클래스 상태 모델링 클래스에 정의하는 여러 오퍼레이션의 동작 효과를 이해하는데 큰 도움을 준다 객체가 논리적으로 가질 수 있는 상태만을 나타냄 스택을 나타내는 객체
클래스 재사용 – (1) 프레임워크 실정에 맞도록 커스터마이즈 할 수 있게 고안된 재사용 가능한 부분적인 응용 프로그램 객체지향에서 재사용 빈도가 높은 것 자료 처리나 이동 통신과 같은 특수한 기술을 목표로 함 응용 프레임워크 재정의 할 수 있는 후크 메소드(hook method)가 있어 확장성을 향상 후크 메소드 응용 도메인의 인터페이스와 동작이 특수한 경우 약간의 차이를 체계적으로 분리할 수 있음
클래스 재사용 – (1) 프레임워크 프레임워크의 위치에 따라 구분 프레임워크 확장하는데 사용되는 기술 인프라 구조 프레임워크 미들웨어 프레임워크 엔터프라이즈 응용 프레임워크 프레임워크 확장하는데 사용되는 기술 화이트박스 프레임워크 프레임워크의 내부 구조에 대한 사전 지식이 필요 블랙박스 프레임워크 상속보다는 위임 방법을 사용
클래스 재사용 – (2) 재구성 연관 관계의 구현이 정확하도록 방향과 다중성을 살핌 재사용도를 높이기 위한 상속을 재검토 상속 : 유사한 클래스들 사이에 재사용을 가능하게 함 많은 코드 재사용 중복을 줄이며 오류의 가능성을 줄임 구현 의존도를 낮추기 위한 상속을 재검토
클래스 재사용 – (3) 최적화 접근 경로를 최적화하기 위하여 연관 관계를 추가 객체를 속성으로 축소 복잡한 계산은 연기 효율성과 명확성 사이에 균형을 이루어야함 시스템의 효율성은 높이지만 시스템을 더 복잡하게 하고 이해하기 어렵게 함
7.3 사용자 인터페이스 설계 사용자의 입장을 더욱 중시함 모든 소프트웨어는 사용자의 만족이 큰 목적이 됨 소프트웨어 시스템에 있어서 사용자의 만족 그 기능과 사용자 인터페이스 시스템의 기능이 정확하고 완벽해야 함
사용자 인터페이스 유형 사람과 컴퓨터 사이의 대화를 체계적으로 표현 사람 : 컴퓨터 시스템에 명령을 내리고 자료를 전달 컴퓨터 : 사람에게 처리된 정보나 처리 상태, 도움말 등을 전달
사용자 인터페이스 유형 그래픽 사용자 인터페이스(Graphic User Interface) 웹 인터페이스 명령어 인터페이스 직접 조작형 인터페이스 웹 인터페이스 인터넷과 웹브라우저를 통하여 페이지를 열람하고 조작하는 인터페이스 명령어 인터페이스 정해진 명령 문자열을 입력하여 시스템을 조작하는 인터페이스 텍스트 사용자 인터페이스 자연어에 가까운 문장을 입력하여 시스템을 조작하는 인터페이스
사용자 인터페이스 설계 원리 좋은 사용자 인터페이스 사용자와 시스템간의 대화설계서에서 따라야 할 큰 원칙 직관적으로 사용 사용하는 도중에 오류가 적음 사용자와 시스템간의 대화설계서에서 따라야 할 큰 원칙 일관성 적절한 사용자 지원 적당한 피드백 최소의 사용자 입력 사용자를 배려하는 사용자 중심의 설계
사용자 인터페이스 설계 원리 사용자 인터페이스를 만들 때 기본 가이드라인을 따르는 것이 좋음 배우기 쉽고 쓰기 쉬운 인터페이스를 만들라 효율성을 높이는 기능을 제공하라 사용자가 도움을 받거나 오류를 수정하기 쉽게 하라 입력 자료의 오류를 최소화 사용자에게 피드백을 제공하라 끌리는 레이아웃과 설계를 창조하라 익숙한 용어와 이미지를 사용하라
화면 설계 화면 설계를 위한 원리 UI컨트롤 화면을 설계하는 동안 사용자의 특성을 기억한다 논리적으로 관련 있는 항목들은 빈 줄 등으로 구별하기 쉽게 한다 정보를 조직적으로 표현하기 위하여 다양한 정렬 방식을 사용한다 다중 화면의 경우 화면 사이의 일관성이 중요하다 여러 가지 다른 배치로 시험한다 UI컨트롤 메뉴바 명령 버튼 다이얼로그 박스 텍스트 박스 토글 버튼 리스트 버튼 드롭다운 리스트 박스 라디오 버튼 체크 박스
화면 설계 – UI컨트롤
화면 설계 쉽게 배울 수 있고 사용할 수 있는 자료 입력 화면 가이드라인 입력 양식 항목의 입력이 끝났음을 알리기 위한 키를 반드시 정한다. 콤보 박스를 사용하여 입력하게 하면 입력 오류를 줄일 수 있다. 입력 양식 처리할 자료를 요청하고 모으는데 사용하는 양식
출력물 설계 출력물은 다양한 종류가 있고 다양한 기술이 사용 출력물의 대부분은 인쇄된 리포트 리포트는 매력적이고 전문적이어야 하며 무엇보다 읽기 쉬워야 함 모든 리포트는 머리말과 꼬리말이 있어야 한다 항목은 논리적인 순서로 디스플레이하고 그루핑 되어야 한다
7.4 데이터 설계 엔티티 관계 다이어그램(Entity-Relationship Diagram) ER 다이어그램 관계형 데이터베이스를 위한 주요 모델링 도구 관계를 나타내는 방법 테이블 이름을 함수 이름 속성들을 매개변수 기본 키는 밑줄 ER 다이어그램 테이블보다는 엔티티를 강조 관계형 데이터베이스 모델링에 가장 널리 사용되는 도구 표준화 된 표현 없음
데이터베이스 설계 예시 비디오 대여 시스템 ERD를 작성 데이터 요소들을 엔티티에 배정 시스템의 엔티티를 파악하기 위하여 클래스 다이어그램을 리뷰 1:1, 1:M, M:N 관계를 결정 데이터 요소들을 엔티티에 배정 데이터 사전에 있는 모든 자료 요소가 엔티티와 관련되어있는지 검토
데이터베이스 설계 예시 모든 테이블에 대하여 3차 정규형으로 만든다 자료 사전의 모든 요소를 검토 기본 키, 보조 키, 외부 키를 파악 자료 사전의 모든 요소를 검토 자료 사전에 있는 모든 데이터 엔티티들이 완전하고 바르게 문서화 되었는지 확인 최종 ERD와 정규화 된 테이블을 생성한 후에는 데이터베이스로 변환
객체와 테이블 관계형 데이터베이스를 객체지향 프로그램에서 사용하는 경우 관계형 데이터베이스 자체를 설계 애플리케이션에서 DBMS와 어떻게 통신하는지 설정 매핑 되는 과정에 테이블 개념 및 정규화 규칙은 클래스와 관계에도 적용 객체 안의 속성은 테이블 내부의 열(column)에 해당되는 테이블 속성으로 매핑 속성 : 객체지향과 관계형 데이터베이스에서 공유하는 단어
객체와 테이블 데이터베이스의 테이블은 항상 기본키를 가져야 함 기본키가 될 수 있는 속성 null이 될 수 없는 값 자주 변경되지 않아야 함
객체와 테이블 객체에서 반복되는 속성은 별도의 테이블로 구성 연관을 갖는 두 클래스는 기본키와 외부키로 매핑 연관 : 두 객체 사이에 양방향 링크를 정의한 것 집합 관계는 관계형 데이터베이스에서 매핑할 수가 없다 집합관계는 연관으로 바꿔야 함 집합 개념의 클래스를 위한 테이블이 기본키를 제공 부분 개념의 클래스를 위한 테이블은 외부키로 구현
Questions?