<commit_before># 웹 프레젠테이션

- 스크립트 스타일은 요청을 해석하는 데 적합
- 서버 페이지 스타일은 응답을 포매팅하는 데 적합
- 웹 컨트롤러는 일반적인 모델 뷰 컨트롤로 패턴과 다르기 때문에 입력 컨트롤러라고 부름
- 입력 컨트롤러가 요청을 받아 모델 객체로 전달하고 모델 객체는 데이터 소스와 통신하고 도메인 논리를 수행한 후에
  필요한 뷰를 결정하고 뷰에게 제어권을 넘기면 뷰는 모델 객체로 부터 데이터를 가져와서 화면을 구성
- 애플리케이션 컨트롤러 계층
- *사용자가 화면 흐름을 제어하는 경우에는 애플리케이션 컨트롤러가 필요 없음 (요청에 화면이 이미 결정되어 있다면...)*
- 트랜잭션 스크립트는 모델이다.

## 뷰 페턴

- 뷰의 복잡도 (모델과 뷰의 간극이 큰경우)에 따라 2단계뷰, 변환뷰를 사용할 필요가 있다.

### 템플릿 뷰

페이지 안에 코드를 삽입해서 데이터를 동적으로 표시 (PHP, ASP, JSP)

### 변환 뷰

데이터와 페이지 생성 언어를 분리하고 데이터를 페이지로 변환 하는 개념 (XML과 XSLT)

### 1단계 뷰

- 화면 하나에 뷰 컴포넌트 하나
- 화면이 다른 경우

### 2단계 뷰

- 뷰 컴포넌트 하나에 여러개의 화면
- 화면이 비슷한 경우
- 1단계에서는 논리적 프레젠테이션으로 모델링 (json / xml)
- 2단계에서는 html로 변환
- 1단계 뷰로 템플릿 뷰를 사용하면서 Helper를 사용하는 것과 비슷

## 입력 컨트롤러 패턴

### 페이지 컨트롤러

- 페이지하나에 컨트롤러 하나
- 서버 페이지를 주로 사용하고 서버 페이지를 사용할 때 템플릿 뷰를 결합
- 텝플릿 뷰에 너무 많은 로직이 필요하다면 Helper 객체를 사용 (뷰 DTO의 어샘플러 역할...)

### 프런트 컨트롤러

- 처리기에서 요청을 해석해 필요한 커맨드를 수행한다. (라우터와 같은 기능...)
- 처리기는 하나만 있으면 되고 페이지 컨트롤러의 중복된 기능을 프런트 컨트롤러에서 할 수 있다.
- 처리기를 따로 실행할 수 있기 때문에 테스트하기 쉽다.
<commit_msg>Update ch4.md<commit_after># 웹 프레젠테이션

- 스크립트 스타일은 요청을 해석하는 데 적합
- 서버 페이지 스타일은 응답을 포매팅하는 데 적합
- 웹 컨트롤러는 일반적인 모델 뷰 컨트롤로 패턴과 다르기 때문에 입력 컨트롤러라고 부름
- 입력 컨트롤러가 요청을 받아 모델 객체로 전달하고 모델 객체는 데이터 소스와 통신하고 도메인 논리를 수행한 후에
  필요한 뷰를 결정하고 뷰에게 제어권을 넘기면 뷰는 모델 객체로 부터 데이터를 가져와서 화면을 구성
- 애플리케이션 컨트롤러 계층
- *사용자가 화면 흐름을 제어하는 경우에는 애플리케이션 컨트롤러가 필요 없음 (요청에 화면이 이미 결정되어 있다면...)*
- 트랜잭션 스크립트는 모델이다.

## 뷰 패턴

- 뷰의 복잡도 (모델과 뷰의 간극이 큰경우)에 따라 2단계뷰, 변환뷰를 사용할 필요가 있다.

### 템플릿 뷰

페이지 안에 코드를 삽입해서 데이터를 동적으로 표시 (PHP, ASP, JSP)

### 변환 뷰

데이터와 페이지 생성 언어를 분리하고 데이터를 페이지로 변환 하는 개념 (XML과 XSLT)

### 1단계 뷰

- 화면 하나에 뷰 컴포넌트 하나
- 화면이 다른 경우

### 2단계 뷰

- 뷰 컴포넌트 하나에 여러개의 화면
- 화면이 비슷한 경우
- 1단계에서는 논리적 프레젠테이션으로 모델링 (json / xml)
- 2단계에서는 html로 변환
- 1단계 뷰로 템플릿 뷰를 사용하면서 Helper를 사용하는 것과 비슷

## 입력 컨트롤러 패턴

### 페이지 컨트롤러

- 페이지하나에 컨트롤러 하나
- 서버 페이지를 주로 사용하고 서버 페이지를 사용할 때 템플릿 뷰를 결합
- 텝플릿 뷰에 너무 많은 로직이 필요하다면 Helper 객체를 사용 (뷰 DTO의 어샘플러 역할...)

### 프런트 컨트롤러

- 처리기에서 요청을 해석해 필요한 커맨드를 수행한다. (라우터와 같은 기능...)
- 처리기는 하나만 있으면 되고 페이지 컨트롤러의 중복된 기능을 프런트 컨트롤러에서 할 수 있다.
- 처리기를 따로 실행할 수 있기 때문에 테스트하기 쉽다.

{'fraction_non_alphanumeric': 0.07836538461538461, 'fraction_numerical': 0.00625, 'mean_word_length': 2.4058919803600656, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6012205', 'n_tokens_mistral': 2161, 'n_tokens_neox': 2908, 'n_words': 441}