# 개발 방법론 및 데이터 모델링

## 1. 모델과 모델링
   
### 모델이란?
- 현실세계에 실존하는 현상들을 프로그래밍 방식으로 모형화하고 그 형태를 나타낸 것을 의미한다.
- 모델을 도출하고 구체화하는 과정을 모델링 과정이라고 한다.
   
## 2. 정보 관리 시스템 개발 방법론
특정 행위나 비즈니스에 존재하는 현상을 구성하는 데이터 중 의미있는 데이터(정보)를 선별하여 체계적으로 관리하는 방법을 의미한다.
다음은 시스템 개발 절차이다.
- 1) 요구사항 정의 단계
	* 사용자의 요구사항을 기능적 요구사항과 비기능적 요구사항으로 구분하고 정의한다.
	* 관련 주체와 비즈니스의 내용과 프로세스를 파악하고 기록한다.
- 2) 분석 단계
	* 요구사항 정의 단계에서 파악된 비즈니스(도메인), 기능적 요구사항, 관련 주체, 프로세스를 분석하여 비즈니스의 실체(Entity)를 파악한다.
	* 분석을 바탕으로 실체와 실체의 특성 간의 관계인 개념 모델을 분석 클래스로 도출한다.
	* 도출된 실체의 특성 중 의미있는 정보가 영구적으로 보관될 필요가 있는 경우 데이터 모델링 과정을 통해 논리 모델로 추출한다.
	* 소프트웨어 아키텍처 개념을 바탕으로 시스템의 구조를 정의하고 수립한다.
	* 비즈니스 관점, 모델링 관점, 아키텍처 관점에서 비즈니스의 분석 작업이나 시스템의 기초 구조 정의
- 3) 설계 단계
	* 분석 단계에서 도출한 개념 모델을 개발 언어와 플랫폼에 알맞은 기술 아키텍처를 이용하여 클래스와 컴포넌트 등으로 표현한다.
	* 사용 기술 환경에 맞게 애플리케이션 아키텍처를 설계한다.
	* 데이터 논리 모델을 실제 사용할 RDBMS에 맞추어 물리 모델을 설계한다.
- 4) 개발 단계
	* 모델링 과정에서 도출된 결과물인 설계 산출물을 이용하여 시스템을 개발한다.
- 5) 테스트 단계
	* 단위, 통합 테스트 과정을 거쳐 시스템의 문제점을 파악하고 해결한다.
- 6) 배포 단계
	* 개발 산출물을 배포한다.

위의 단계 중 요구사항 정의, 분석, 설계 단계를 모델링 과정이라고 하며, 모델링 과정 산출물을 통해 개발이 이루어지고 이후 단계를 거쳐 하나의 정보 관리 시스템이 개발된다.   
모델링 단계 또한 UML이라는 국제 표준 모델링 언어와 모델링 툴을 통해 과정이 진행된다.   

### Agile 기법
- 소프트웨어 개발 방법론 중 하나. 순차진행형 방식이 아닌 리스크가 있거나 중요도가 큰 요구사항 위주의 개발 기법.
- 개발과 테스트 과정을 하나의 스크럼으로 구성하고 각각의 스크럼을 90% 이상 문제 없을 때 까지 스프린트 작업(요구사항 변경-개발-테스트)를 반복하여 리스크를 최소화한다.
- 분석/설계 과정을 최소화하고 요구사항의 변화에 대한 즉각적인 대응 및 개발, 테스트 중심으로 프로젝트를 진행하여 시스템의 문제를 조기에 해결하는 기법이자 개발 방법론.

## 3. 데이터 모델링
분석, 설계 단계의 데이터 관점에서 진행되는 모델링 기법
- ### 1) 개념 모델 정의
	* 개념 모델링은 분석 단계를 통해 도출된 비즈니스의 실체들을 말한다.
	* 실체의 특성을 비즈니스 관점에서 도출하고 실체와 실체 간의 관계를 정의한다.
- ### 2) 논리 모델 정의
	* 논리 모델링 작업은 비즈니스 관점이 아닌 비즈니스 및 관리에 필요한 모든 데이터의 관점에서 진행된다(사용자 IP주소나 조회수같은 사용자와 관련 없는 시스템 관점에서 필요한 속성들까지도 모델링에 반영).
	* 논리 모델링 작업은 데이터 정규화 과정을 통해 진행된다.
	* 데이터 정규화
		+ RDBMS에서 데이터의 보존성을 높이고 중복을 줄여 저장공간의 최소화와 성능의 향상을 목표로 테이블을 구성하는 과정이다.
		+ 정규화는 1~5단계의 과정이 있으며 보통 특수하고 복잡한 자료구조가 아니라면 3단계까지 진행하면 정규화 모델링이 완료된다.
		+ 제 1 정규화 
			- 속성 원자 값 원칙 및 중복성 제거 원칙 및 PK 설정 원칙 준수
			- 모든 엔티티는 유일하면서 데이터 간 구분자 값인 Primary key(PK)가 존재해야 한다.
			- 모든 속성값은 원자성(단일값 형태)으로 데이터 형태가 표현되어야 한다.(하나의 게시글 컬럼에서 카테고리가 두 개의 값을 가지면 원자값 규칙에 위배 -> 두 개의 게시글 컬럼으로 변경)
			- 모든 속성값은 중복되어서는 안 된다. 값이 중복되는 2개 이상의 속성들은 별도의 엔티티로 분리한다.(두 개의 게시글 컬럼에서 카테고리를 제외하고 나머지 값이 같으면 중복성 원칙 위배 -> 글 번호를 외래키로 하여 카테고리 테이블 생성)
		+ 제 2 정규화
			- 부분적 함수의 종속성 속성 제거 원칙을 준수
			- 일부 속성에 대해서 종속성이 있는 속성일 경우 속성을 제거하고, 속성간의 관계를 따로 정의한다.(카테고리와 카테고리 설명은 종속(Post - "게시글"))
		+ 제 3 정규화
			- 이행적 함수의 종속성 제거 원칙을 준수한다.
			- 엔티티 내의 모든 속성은 기본키에 의존성을 가져야 한다.
			- 기본키에 의존하지 않고 일반 속성에 의존하는 속성은 제거 혹은 분리한다.
			- 메일주소는 글번호에 의존하지 않고 고객 아이디에 의존하므로 분리한다.
		+ 반정규화
			- 진행된 정규화 과정을 무시하고 특수 목적에 의해 의도적으로 정규화 과정을 되돌리는 정규화
- ### 3) 물리 모델 정의
	* 물리 모델링은 데이터를 실제 영구적으로 저장하는 데이터베이스 환경에 맞게 명칭 및 데이터 타입을 지정한다.


## 4. 모델의 유형과 용도
모델링 과정을 통해 도출된 논리 모델과 물리 모델을 기반으로 도출된 모델들은 테이블의 구조를 정의, 테이블의 구조를 클래스로 정의하여 프로그래밍하는 용도로 사용된다.
   
- ### 1) 비즈니스 도메인 모델 : Entity Model
	+ 개념 모델링을 통해 도출된 비즈니스 관점에서 바라본 모델.
	+ 사용자가 글을 작성한다는 행위의 관점에서 게시글 엔티티 모델의 주요 특성으로는 제목, 작성자, 메일 주소, 전화번호, 글 내용이 있을 수 있다. IP 주소는 고려 대상이 아니다.

- ### 2) 데이터 모델 : Model, Data Model
	+ 데이터베이스에 저장되는 데이터 구조를 프로그램 구조로 정의한 것.
	+ 테이블의 구조와 컬럼이 1:1 매핑되는 모델 클래스로 데이터 처리 프로그래밍 시 주로 사용되는 모델 유형
	+ 비즈니스 관점이 아닌 비즈니스 실체의 실질적으로 관리되어야 하는 데이터 관리 관점에서 바라본 모델. 일반적으로 DB Object(테이블, 뷰)등의 구조와 매핑된다.
	+ MVC, MVVM 개발 패턴에서의 모델은 일반적으로 데이터 모델을 칭하며 객체지향 환경에서 프로그래밍을 통해 데이터의 구조를 정의하고 DB와 데이터의 교환 시 데이터를 담는 컨테이너 클래스로 사용된다.

- ### 3) 데이터 전송 모델 : Data Transfer Model : DTO
	+ 데이터 또는 데이터 모델을 전송하기 위한 구조를 정의하고 데이터를 담기 위한 모델
	+ 일반적으로 시스템을 UI 영역과 서비스 처리 영역과 데이터베이스 영역을 분리하는 분산 아키텍처의 형태로 개발, 운영한다.
	+ View <-> Controller <-> Model과 같이 중간 계층을 1개 이상 거쳐 데이터가 전달되기 때문에 한 번에 데이터를 전송할 때 최대한 많은 양의 데이터를 담아 전달하여 효율 및 성능을 향상시키기 위해 사용
	+ DTO 모델은 실제 저장되는 데이터의 구조를 정의하는 것이 아닌 데이터 교환을 위한 별도의 모델 구조를 정의하는 것이다.

- ### 4) 뷰 모델 : View Model
	+ View에서 사용하는 UI 전용 모델
	+ UI 단에서는 DB를 통해 관리, 저장할 필요가 없는 요소가 있다. ex)구매 가격, 배송비, 총결제 금액에서 총결제 금액은 DB에서 없어도 된다.
	+ 총결제 금액이 데이터 모델에 없어도 화면에 출력하기 위해서는 총결제 금액 특성이 존재해야 한다. 이런 속성이 많다면 화면 전용 데이터 모델인 뷰 모델을 정의하여 사용한다.
