Lecture #8 : 아키텍쳐 설계
1. Intro
- 설계는 통합, 자료변환(버전 변환), 유지보수, 성능 등을 포함한다.
- 분석 vs 설계
- 분석 : 기능, 구조, object, ...
- 설계 : 비기능, DB, 자료형, ...
2. 분석에서 설계로
- 분석 단계에서 모은 요구를 반영하여 설계 도면 작성
3. 아키텍쳐 설계
- 패키지 : 클래스의 묶음
- 서브 시스템의 구성과 인터페이스 정하기
4. 객체 지향 관점의 설계 작업
- 분석 단계에서 찾아낸 도메인 클래스에 아키텍쳐 생성
- 도메인 클래스 생성 (요구 분석) -> 아키텍쳐 생성 (프레임워크) -> 설계 클래스 생성 (DB, UI)
5. 설계의 개념과 원리
- 분석 단계에서 파악한 요구를 구현 가능한 설계안으로 바꾸는 작업
- 작업 : 컴포넌트의 발견, 설계안의 선택, 설계 도면의 작성
- 개념적에서 구체적으로
- 프로그램과 가까운 실제적인 것
- 바람직한 설계
- 복잡성 최소화 : 단순화, 복잡성을 최소화
- 편리한 유지 관리 : 모듈화, 표준화, 컴포넌트화
- 느슨한 결합
- 모듈 간의 연결을 최소화
- 정보 은닉 -> 테스트, 유지보수 할 때 작업을 줄일 수 있다.
- 유연한 구조
- 내부구조를 해치지 않고 확장하기
- 변경될 것 같은 부분을 찾아 고립 시킴
6. 설계 수준
- 설계 수준
레벨 1. 소프트웨어 시스템
레벨 2. 서브시스템이나 패키지 수준
레벨 3. 패키지 내부의 클래스
레벨 4. 클래스 내부의 데이터와 메소드 수준
레벨 5. 메소드 내부 설계
- 서브시스템, 패키지 수준의 설계
- 서브시스템이나 패키지로 어떻게 분할할 것인지
- 분할된 모듈 사이에 어떤 식으로 인터페이스 할 것인지
- 커뮤니케이션 제약 유무
- 클래스 수준의 설계
- 패턴이 중요, 자주 출현 (좋은 클래스 특징)
- 옵서버
- 과부화 방지를 위해 자주 쓰는 것은 따로 빼내서 사용하기
- 상태 변경 등에 따른 관련 인터페이스가 많을 때 사용
7. 설계 표현 방법
- 시스템의 아키텍쳐는 패키지 수준으로 나타낸다.
- 패키지 다이어그램 그리기 순서
- 범위를 정함
- 공통이 관계를 기반으로 클래스를 묶음
- 묶은 클래스를 패키지로 모델링
- 패키지 사이에 의존 관계를 찾고 표시
8. 아키텍처 설계 요소와 방법
- 아키텍쳐 설계 요소
- 컴포넌트 : 서브시스템(패키지)
- 인터페이스 : 서비스(인터페이스)
- 비기능적 요구 : 반응시간, 처리량
- 기능적 요구 : 사용 사례
- 고비용의 재작업 : 서브시스템 인터페이스의 변경
- 아키텍쳐 설계 과정
- 기능적 요구(사용 사례) -> 설계 목표(비기능적 요구) -> 구현할 시스템의 설계(서브시스템, 인터페이스)
9. 설계 목표
- 성능 목표
- 신용도
- 강인성, 신뢰성, 가용성, 고장 내구력, 보안, 안정성
- 사용자 목표
- 비용 목표
- 개발 비용, 설치 비용, 업그레이드 비용, 유지보수 비용, 관리비용
- 유지보수 목표
- 확장성, 수정용이성, 적응성, 이식성, 가독성, 요구 추적성
10. 서브시스템
- 응용 도메인의 복잡도를 줄이기 위하여 작은 부품인 클래스를 패키지로 그루핑하여 구조화
- 설계 단계에서 솔루션을 포함하여 시스템을 분할
11. 인터페이스와 컴포넌트 다이어그램
- 서비스
- 공동의 목적을 나누는 관련된 오퍼레이션의 집합
- 서브시스템이 제공하는 서비스를 정의하는데 초점
- 인터페이스

- 컴포넌트 다이어그램
12. 아키텍쳐 패턴
- Intro
- 중앙 저장소 패턴

- 서브 시스템들이 단일 중앙 저장소의 자료를 접근하고 변경
- 서브 시스템들은 독립적, 중앙 저장소를 통해 상호 대화
- ex) 급여 시스템, 은행
- MVC(Model/View/Contrller)
- 웹기반 인터렉션 활용
- 모델 : 도메인의 지식을 저장, 보관
- 뷰 : 사용자에게 보여줌
- 제어 : 사용자와의 상호 작용 관리
- 분리하는 이유 : 뷰와 제어가 모델보다 더 자주 변경될 수 있기 때문에
- 클라이언트 서버 패턴

- 서버는 클라이언트에게 서비스 제공
- 서비스의 요구 : 원격 호출 메커니즘
- 클라이언트 : 사용자로부터 입력 받아 범위를 체크, DB 트랜잭션 구동
- 서버 : 트랜잭션 수행, 데이터의 일관성 보장
- 파이프-필터 패턴

- 스트림 : 연속적인 데이터 흐름
- 파이프 : 데이터 통로
- 필터 : 데이터 처리(은닉)
- 데이터 스트림 순서 기반 : 각 단계 필터 콤포넌트를 씌워 구축
- 데이터의 변환, 버퍼링, 동기화에 사용
- 피어 투 피어 패턴
- 계층적 패턴
- 인터페이스 층 : 사용자와 관련된 경계 객체 포함
- 응용 로직 층 : 애플리케이션에서 요구되는 처리등을 구현하는 제어 및 엔티티 객체 처리
- 저장 층 : 데이터베이스에 지속하여 저장하는 객체의 스토리지, 검색, 질의 구현
- 브로커 패턴
- 블랙보드 패턴
- AI 분야에서 활용
- 해결 전략이 알려지지 않은 문제에 유용
- 결정되지 않은 가능한 모든 콤포넌트 고려 -> 컨트롤러가 적절한 콤포넌트 선택
13. 설계 패턴 유형
- Intro
- 객체 설계 : 애플리케이션 클래스와 구현을 이어주는 클래스 필요
- 위임과 상속 : 어떤 클래스가 다른 클래스에 메세지를 보냄으로써 오퍼레이션 구현
- 설계 패턴의 기본 원리
- 이름 : 다른 패턴과 구별
- 문제 : 패턴이 사용되는 상황
- 해결책 : 협력 클래스와 인터페이스의 집합
- 결과 : 설정한 설계 목표에 따라 고려된 저울질과 대안을 기술
- 어댑터 패턴?
- ex) JAVA에서 C에서 만든 라이브러리 쓰기?
- 브리지 패턴
- 적용
- 점증적으로 통합되는 서브시스템
- 완성되기 전에 스텁을 사용
- 서브 시스템을 여러 버전으로 만들어야 하는 경우
- 해결책

- 추상 팩토리 패턴
- 적용
- 여러 생산자가 만든 장치를 혼합
- 모든 제조사를 위해 공통의 생성자를 사용

- 전략 패턴
- 적용
- 모바일 애플리케이션 : 여러 종류의 너트워크 다루기
- 동적으로 변환하기
- 우선순위에 따라 적절한 것 골라서 보내주면 골라진 결과를 사용

Lecture #9 : 데이터 설계
1. 데이터 설계
- 시스템이 사용하는 데이터의 영구 저장과 불러 읽음
- 파일 : 레코드 구조의 설계
- 데이터 베이스 : 정규화된 테이블의 설계
2. 애플리케이션과 데이터베이스의 관계
- 객체 지향 프로그램과 데이터베이스의 연결
- 클래스 : 테이블로 매핑
- 객체 : 튜플로 매핑
3. 데이터베이스의 추상 계층
4. 저장 형식
- 0과 1의 조합으로 저장
- EBCDIC, ASCII, UNICODE, Binary
5. 파일 시스템
- 파일 : OS가 데이터를 저장하는 기본 단위 (여러 레코드로 구성)
- 레코드 : 구조체에 매핑, 여러 필드로 구성
6. 파일 접근 방법 (중요)
- 순차 접근
- 인덱스 순차 접근
- 접근 속도를 높이기 위해서 파일에 있는 레코드를 인덱스에 따라 정렬 후 접근 시 인덱스 사용
7. 파일 종류 (중요)
- 마스터 파일 : 근본적이고 영구 저장할 필요가 있는 데이터
- 트랜젝션 파일 : 비즈니스 트랜젝션이나 사건을 기록하여 마스터 파일에 레코드를 수정할 때 사용함
- 인덱스 파일 : 인덱스 구조를 저장
- 임시 파일 : 처리 파일에서 파생되는 임시 결과
- 백업 파일 : 마스터 파일이나 트랜잭션 파일의 복사본
- 파라미터 파일 : 시스템 세팅 정보
8. 파일 시스템 사용의 문제점
- 애플리케이션 수가 늘어나면서 파일의 증가 등의 문제로 중복성 발생
- 데이터 갱신 시 동기화 문제
- 데이터를 저장하기 위한 메커니즘 필요
- 새로운 방법으로 자료를 접근할 때 상당한 노력 필요
9. 데이터베이스 관리 시스템
- 데이터베이스와 사용자 사이의 인터페이스 제공!
- 사용자 : 질의나 스위치 보드 명령으로 자료 접근
- 데이터베이스 관리자 : 데이터베이스 관리와 지워
- 데이터 조작 언어 : 저장, 탐색, 갱신, 삭제 등 제어
- 스키마 : 필드와 테이블, 관례를 기술한 정의
- 물리적 저장소 : 모든 데이터 요소를 저장
10. 관계형 데이터베이스의 설계
- 엔티티 : 데이터로 모아 보관하는 단위
- 테이블 : 관련된 레코드의 묶음
- 필드 : 엔티티에 대한 특징
- 레코드 : 관련된 필드의 집합
- 기본키 : 엔티티의 특정한 멤버를 구별하기 위한 필드
- 후보키 : 기본키의 후보들
- 외부키 : 테이블 사이의 관계를 나타내는 필드
- 보조키 : 접근, 탐색에 있어서 사용될 수 있는 필드의 조합
11. ER 다이어그램
- 시스템 엔티티 사이의 논리적인 관계와 인터렉션을 보이는 모델
12. 정규화
13. 데이터 베이스 설계 단계(중요)
- ERD를 작성
- 데이터 요소를 엔티티에 배정
- 모든 테이블을 3차 정규형으로 만듦
- M:N 관계를 1:N으로 바꿈
14. 클래스와 테이블의 매핑
- 단순 데이터 구조를 가진 클래스는 테이블로 매핑
- 객체 식별자는 기본 키
- 다른 클래스 인스턴스를 속성으로 가지고 있는 클래스는 그 클래스를 위하여 별도의 테이블 작성
- M:N 관계는 별도의 테이블
- 1:1 관계는 외부 키 속성으로 구현
15. 코드 설계
- 코드 : 데이터를 간략하게 나타내기 위하여 사용하는 글자나 숫자의 집합
- 코드 타입
- 순차 코드
- 특정한 순서대로 숫자나 문자 지정
- ex) 사원번호
- 블록 순차 코드
- 분류를 위하여 블록화된 숫자 코드
- ex) 학수번호
- 문자 코드
- 카테고리를 기반으로 개별 아이템을 구별하기 위해 문자 사용
- ex) ICN(인천공항), HW(hardware)
- 유효 숫자 코드
- 유도 코드
- 코드화 하려는 아이템의 속성이나 특징으로부터 데이터 조합
- 암호 코드
- 액션 코드
16. 코드 개발 팁 (중요)
- 코드는 간결하게
- 확장을 허용
- 코드 안정하게 유지
- 코드 유일성
- 정렬이 가능한 코드
- 혼돈이 될 코드 피하기
- 의미 있는 코드
- 단일 목적으로 코드
- 코드의 일관성 유지
Lecture #10 : UI 설계
1. UI 패러다임의 변화
2. 사용자 인터페이스의 정의
- 인터페이스의 종류
- GUI
- 웹 인터페이스
- 명령어 인터페이스
- 텍스트 사용자 인터페이스
3. UI 설계 원리 (중요)
- 좋은 사용자 인터페이스를 설계하기 위한 가이드라인
- Shneiderman & Plaisant의 UI 설계 원칙
- 일관성
- 적절한 사용자 지원
- 적당한 피드백
- 최소의 사용자 입력
- 간편한 오류
- 사용자 중심의 설계
- 배경 지식의 이해
- 그래픽 효과의 극대화
- 사용자에 대한 이해
- 프로토타입의 사용
- 이해하기 쉬운 인터페이스
- 지속적인 피드백
4. UI 설계 가이드라인 (중요)
- 사용하기 쉽고 매력적이며 효율적인 인터페이스
- 배우기 쉽고 쓰기 쉬운 인터페이스
- 효율을 높이기
- 사용자가 도움을 받거나 오류 수정이 쉽게
- 입력 오류를 최소화
- 사용자에게 피드백 제공
- 끌리는 레이아웃과 설계
- 익숙한 용어와 이미지
5. UI 설계 요소 (중요할 듯)
- 버튼
- 현재 화면의 작업과 관련된 단일 및 독립적인 작업
- 툴바
- 메뉴
- 체크 박스
- 다른 항목과 관련 없이 한 항목을 선택/거부하는 스위치에 사용
- 라디오 버튼
- 텍스트 필드
- 리스트
- 주어진 것을 모두 보여주고 그 중 선택하게 하고 싶을 때
- 한번에 모든 선택지를 다 보여줌 -> 콤보 박스와의 차이점
- 콤보 박스
- 여러 옵션 중 선택 -> 화면의 제약으로 모든 옵션을 보여주지 못함
- 스크롤 사용
6. UI 디자인
7. 좋은 UI가 되려면
- 가시성
- 사용자가 SW와 상호작용하는 과정을 잘 이해하고 발견 할 수 있게
- 피드백
- 작업 지시를 내리기 전, 후 도중 상태를 알 수 있게
- 예) B에 커서를 가져다 대면 bold 라고 설명이 뜨게함
- 행동유발성
- 어떻게 사용되는지에 영향을 미치는 외적인 특성
- 클릭하고 싶은 버튼??
8. 입력 설계 (입력 설계의 목적)
- 입력 방법
- 적절한 입력과 자료 기입 방법의 선택
- 일괄 입력 : 특정 시간에 주기적으로..
- 온라인 입력 : 즉시 검증 가능
- 비즈니스 요구에 따라 맞는 결정 : 호텔 예약?
- 입력량 줄이기
- 데이터 아이템 줄이기
- 필요한 자료만 입력
- 조회 가능하거나 다른 자료로부터 계산되는 자료 입력x
- 상수 자료 입력하지 않음
- 자료 입력 화면을 매혹적으로 설계
- 접근 제한 (Role based)
- 해설 제공
- 보기 예시
- ...
- 입력 오류를 줄이기 위한 체크 (테스트 단계에서 체크해야 한다)
- 순서 체크
- 존재 체크
- 데이터 타입 체크
- 범위 체크
- 유효성 체크
- 조합 체크
- 일괄 입력 제어
- 필요한 문서의 설계 (출력 설계?)
- 설계 전 질문
- 출력의 목적
- 누가 정보를 원하는가
- 어떤 특정 정보 포함?
- 출력 정보를 인쇄? 스크린?
- 보안이나 비밀 관련 쟁점이 있는가
- 출력의 종류
- 웹 기반 출력
- 이메일
- 메신저
- 무선 전화 메세지
- 효과적인 입력 제어
기말고사 예상 문제
lecture 8)
1. 상황에 따른 아키텍처 및 설계 패턴 선정
- 아키텍쳐 패턴 -> 어떤 구조로 끌고 가는지(비기능적)
- 중앙 저장소 패턴
- MVC 패턴
- 클라이언트 서버 패턴
- 파이프-필터 패턴
- peer to peer 패턴
- 계층적 패턴
- 브로커 패턴
- 블랙보드 패턴
- 설계 패턴 유형 -> 자신이 만든 클래스가 효율적인지 아닌지 확인
2. 객체지향의 설계 작업
- 분석 단계에서 찾아낸 도메인 클래스에 아키텍처를 생성하고 나머지 설계 클래스를 찾아내는 작업
- 도메인 클래스 생성(요구 분석 / 보통) -> 아키텍쳐 생성(프레임워크 사용 / 추상적) -> 나머지 설계 클래스 생성(DB, UI 설계 / 구체적)
3. 설계의 목표
- 성능 목표, 신용도, 사용자 목표, 비용 목표, 유지보수 목표
lecture 9)
1. 관계형 db의 용어
- 엔티티, 테이블, 필드, 레코드, 기본키, 후보키, 외부키, 보조키
2. 파일 종류
- 마스터 파일
- 트랜잭션 파일
- 인덱스 파일
- 임시 파일
- 백업 파일
- 파라메터 파일
3. 파일 시스템의 문제점
- 중복성
- 동기화
- 저장 메커니즘 필요
- 새로운 방식으로 접근할 때 노력 필요
4. 코드 설계 기법
- 코드란 : 데이터를 간략하게 나타내기 위해 사용되는 글자나 숫자의 집합
- 코드 타입 : 순차 코드, 블록 순차 코드, 문자 코드, 유효 숫자 코드, 유도 코드, 암호 코드, 액션 코드
- 코드 개발 팁 : 간결, 확장성, 안정성, 유일성, 정렬, 혼돈x, 의미있는, 단일 목적, 일관성
정규형 문제 안나옴?
lecture 10)
1. UI 설계 가이드라인
- 사용하기 쉽고 매력적이며 효율적이기
- 배우기 쉽고 쓰기 쉬움
- 사용자가 도움을 받거나 오류 수정 쉽게
- 입력 오류 최소화
- 사용자에게 피드백 제공
- 끌리는 레이아웃, 익숙한 용어 이미지
2. 좋은 UI 특징들
3. HCI 용어 약어
- HCI : Human Computer Interaction
4. 사용자 인터페이스 정의
- 사용자와 상호작용하는 컴퓨터 시스템의 설계, 구현, 평가를 연구하는 분야
- 인터페이스의 종류 : GUI, 웹, CLI, 텍스트
5. UI 설계 요소들
- 버튼, 툴바, 메뉴, 체크 박스, 라디오 버튼, 텍스트 필드, 리스트, 콤보 박스
6. 입력 설계의 목적
- 적절한 입력과 자료 기입 방법의 선택
- 입력량 줄이기
- 자료 입력 화면을 매혹적으로 설계
- 입력 오류를 줄이기 위한 체크
- 필요한 문서의 설계
- 효과적인 입력 제어 개발