대부분의 현대적 서버 기반 백엔드 웹 프로그래밍은 기본적으로 MVC 설계 패턴 기반으로 개발되어지고 서비스되어집니다.

관련 실습 깃허브 링크 정보 : 
https://github.com/eddykang1074/node-express-app.git

MVC패턴에 대한 이해는 아래 블로깅 링크를 참고해주시구요.
https://mixedcode.com/blog/detail?pid=23

MVC 패턴기반 Controller는 아래와 같이 URL주소체계를 통해 사용자들의 각종 요청과 응답을 담당하는 역할을 제공하고 있으며
Node Express 프로젝트에서는 routes폴더내 여러 라우팅 모듈 파일이 그 역할을 담당합니다.


ㅁController(라우터) 의 주요 역할 
- 사용자나 모바일 디바이스,웹브라우저,이기종 시스템 과 같은 클라이언트의 요청을 URL 형식을 통해 받고 응답을 처리해주는 주체입니다.
- 클라이언트의 주된 요청내용은 웹페이지 요청이나 순수데이터(JSON=RESTfulAPI) 또는 데이터를 포함 웹페이지에 대한 요청입니다.
- 실제 클라이언트가 서버측에 요청을 하는 방식은 URL을 기반으로하는 주소체계를 기반으로 상기 요청내용들을 요청합니다.

- 클라이언트들이 URL을 통해 특정 작업을 요청해오면 처리결과에 대한 응답처리도 담당합니다.
- 서버측에서의 응답결과는 웹페이지소스 또는 JSON데이터,이미지,파일등 다양한 형태의 응답결과를 클라이언트로 보낼수 있습니다.
- Controller에 의해 웹페이지를 응답결과로 보내고 싶으면 View영역에 특정 View파일을 지정해 결과물을 반환하고
  데이터가 필요하면  Model영역을 통해 데이터를 처리 또는 조회결과를 가져와 최종 응답 결과물로 전달합니다.
- 따라서 Controller는 MVC패턴에서 클라이언트의 최접점에서 사용자 요청과 응답을 처리하는 핵심 주체이며 Routes라는 용어를 사용하기도 합니다.   

JAVA나 C#같은 경우 Controller란 용어를 주로 사용하지만 Node Express 에서는 Routes 또는 Routing이란 용어로  주로 사용됩니다.
Node Express에서는 Controller와 Routes는 동일한 개념이라고 이해하시면 됩니다.




Controller(Routes)영역은 크게 2가지 기능(요청과응답)을 제공합니다.

첫번쨰, 사용자 요청(HttpRequest) : URL주소 체계를 이용한 사용자 요청에 대한 서버측 라우팅 주소체계 설계 및 구현
두번째, 서버측 응답처리(HttpResponse) : 라우팅 주소를 통한 사용자 요청에 대한 응답 처리(콜백함수) 

향후 확장가능한 아키텍처로 Node Express 프로젝트를 설계하는 경우 Routing주소쳬계 구현과 사용자 요청과 응답을 담당하는 Controller영역을
분리하여 개발 운영하는 경우도 있지만 기본적으로는 Routes내 Routing 모듈파일에서 두가지 기능을 모두 구현가능합니다.


1)사용자 요청에 대한 라우팅 주소체계 설계 및 구현하기 
라우팅이란 네트워크상에서 목적지 경로를 선택하는 프로세스 또는 길을 찾아가는 과정을 의미합니다.
웹에서의 라우팅이란 사용자가 요청하는 리소스가 존재하는 서버 컴퓨터를 찾고 서버 컴퓨터에서 서비스하는
특정 웹사이트(백엔드 어플리케이션)내 웹 리소스(웹페이지,데이터,이미지,각종파일...)를 찾고 요청하는 과정을 말합니다. 

즉 사용자(클라이언트)는 이러한 라우팅 과정을 통해 특정 서버측에 무언가를 요청하게 되는데 이러한 요청을 위해서는 2가지 정보를 기본적으로 포함하고 있어야합니다. 


A)요청 주소(URL/URI)
-서버측에 무언가를 요청하려면 해당 서버를 찾아야하고 해당 서버내에서 서비스하고 있는 여러 어플리케이션중 하나를 찾고
해당 어플리케이션내 관련 요청을 담당하는 요청기능(라우팅메소드=액션메소드) 을 호출해야 응답값을 반환 받을수 있습니다.
- 서버측에 무언가를 요청하려면 사용자는 URL이란 주소체계를 통해 특정 기능을 서버에 요청합니다.

http://www.naver.com/member/login

- 상기 URL주소를 사용자가 브라우저를 통해 호출했다면 주소내 호스트명+도메인주소(www+naver.com)를 통해 특정 서버를 찾은 후 도메인 주소앞에 호스트명을 통해
서버내 특정 웹사이트(어플리케이션)를 찾으며 (www.naver.com) 도메인주소 다음에 오는 첫번째 주소경로(/member)를 통해
특정업무(회원관리)를 담당하는 컨트롤러(라우팅모듈) 소스를 찾고 컨트롤러 주소 다음에 오는 라우팅메소드(액션메소드) 주소를(/login) 을 통해 최종 구체적인 요청에 대해 응답을 처리합니다.   
도메인 주소 다음에 제공되는 주소체계(/member/login) 는 백엔드 개발자가 관련 주소체계를 설계/구현하고 해당 주소가 호출되었을때 처리해야하는 기능 구현도 백엔드 개발자가 담당합니다. 


B)요청 방식(Method)
웹 기반 클라이언트가 웹 백엔드 시스템에 서비스를 요청할때는 아래와 같이 대표적으로 5가지(총9개) 방식으로 요청하게됩니다.
클라이언트는 URL을 통해 서버에 무언가를 요청할때는 아래 HTTP 메소드(요청방식) 지정 방식을 통해 호출해야하며
클라이언트에서 아래 요청 특정방식으로 서버측에 요청을 해오면 서버측에서도 동일한 호출주소와 동일한 호출 방식으로 응대해줘야합니다.   
즉 클라이언트에서 특정주소로 GET방식 으로 호출하면 서버측에서도 동일주소와 동일방식으로 요청을 받아줘야합니다. 

ㅁGET 방식 : 웹페이지/데이터 조회(요청)시 주로 사용
-주로 웹브라우저에 직접 URL주소를 입력 호출하거나 링크방식을 통해 호출하는 경우는 대부분 Get방식의 호출입니다.
-form태그의 method 특성값을 get으로 지정한 경우도 get방식입니다.
-get방식으로 서버측에 무언가를 호출하면 HTTP 통신시 Http헤더영역에 관련정보가 포함되어 서버측에 전달되기때문에 보안적으로 중요한 데이터를 전달하기에는 부적합한 호출 방식입니다. 


ㅁPOST 방식 : 웹 페이지내 사용자 입력값 또는 데이터 신규 등록(수정/삭제가능)시 사용
- 사용자 웹페이지내 입력폼 내 입력요소 값에 대한 신규 데이터 등록 처리
- 클라이언트에서 전달된 순수 데이터 신규 데이터 등록 처리
- 신규 리소스 또는 데이터 생성 처리
- HTTP 통신시 HTTP본문(BODY)에 데이터가 포함 전송되어 GET보다 안전하게 데이터를 서버로 전송함


ㅁPUT 방식 : 기존 리소스/ 데이터 전체 변경 요청시 사용
- 기존에 존재하는 데이터에 대해 전체 데이터 항목을 일괄변경 처리 시 사용
- 기존 데이터의 일부 항목만 변경하는것은 불가하며 일부만 변경시 PATCH방식으로 사용해야함
 EX) PUT방식은 회원 테이블이 아이디/메일/암호/수정일자 항목들이 있다면 암호항목 일부만 업데이트 불가능하며 수정시에 아이디/메일/암호/수정일자 항목 모두가 수정(교체)처리 됩니다.
- HTTP 통신시 HTTP본문(BODY)에 데이터가 포함 전송되어 GET보다 안전하게 데이터를 서버로 전송함


ㅁPATCH 방식 : 기존데이터 일부 항목만 변경적용
- 기존에 존재하는 데이터에 대해 일부 데이터 항목만 변경 처리 시 사용
- HTTP 통신시 HTTP본문(BODY)에 데이터가 포함 전송되어 GET보다 안전하게 데이터를 서버로 전송함

ㅁDELETE 방식 : 리소스/ 데이터 삭제 처리 

ㅁ기타방식: HEAD,TRACE,OPTION
 
-routes/index.js 라우터 모듈 예시)
-아래 router.get() 라우팅 메소드가 요청URL 주소체계 정의 및 요청방식을 정의한 코드영역입니다.

/*
- 메인 페이지 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/
-요청방식 : GET 방식
-응답결과 : index.ejs 뷰파일 웹페이지 내용
*/
router.get('/', function(req, res, next) {
  res.render('index', { title: "메인 페이지" });
});


C)사용자 요청정보 추출하기-HttpRequest 객체 

클라이언트(사용자)가 서버로 무언가를 요청시에는 클라이언트측에서 제공하는 각종정보를 서버측에서 추출할수 있어야하는데요.
일반으로 이러한 기능을 담당하는 객체를 HttpRequest 객체라고 하며 대부분 백엔드 웹 프레임워크에서는
클라이언트나 웹브라우저에서 요청과 함께 전달되는  HttpRequest 정보를 추출할수 있는 별도 HttpRequest 객체를 제공합니다. 

HttpRequest 객체안에는
사용자가 입력한 정보,URL호출주소정보,URL을 통해 함꼐전달되는 추가정보(파라메터/쿼리스트링), 순수데이터 등이 포함되어 전달됩니다.
HttpRequest 는 웹브라우저나 클라이언트에서 서버로 전달되는 다양한 정보를 서버측에서 추출할때 사용됩니다. 

-routes/index.js 라우터 모듈 예시)
-아래 라우팅 메소드의 콜백함수내 req 파라메터가 HttpRequest 객체 변수입니다. 

/*
- 메인 페이지 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/
-요청방식 : GET 방식
-응답결과 : index.ejs 뷰파일 웹페이지 내용
*/
router.get('/', function(req, res, next) {
  res.render('index', { title: "메인 페이지" });
});



2)사용자(클라이언트) 요청에 대한 서버측 응답처리하기 -HttpResponse 
-클라이언트에서 요청하는 내용을 서버에서는 응답의 결과를 제공해야하며 서버측에서 클라이언트로 응답결과를 제공할 때 사용하는 객체가 HtttpResponse 객체입니다.
-대부분의 백엔드 웹 프레임워크들은 서버측에서 클라이언트 요청에 대한 응답처리를 위한 HtttpResponse 객체를 제공합니다.
-일반적으로 사용자가 요청하는 내용은 서버상에 보관중엔 웹페이지,순수데이터(JSON데이터),데이터가 포함된 동적 웹페이지 3가지경우로 나뉩니다.

-웹페이지는 정적웹페이지(HTML페이지) 또는 뷰영역을 통해 뷰파일에서 제공하는 HTML웹페이지를 말합니다.
-순수데이터는 모델영역을 통해 제공된 데이터를 JSON데이터 포맷으로 변환하여 순수 데이터를 제공하며 주로 RESTFul API 서비스 구현을 통해 데이터를 제공합니다.
-데이터가 포함된 동적 웹페이지란 라우팅영역에서 모델영역을 통해 데이터를 가져온후 해당 데이터를 뷰영역에 특정뷰에 전달하고 
 뷰영역에서는 전달된 데이터를 기반으로 서버측에서 동적으로 뷰파일내 HTML코드를 조작하여 최종 데이터가 포함된 HTML을 클라이언트에 제공하는 경우입니다. 

-routes/index.js 라우터 모듈 예시)
-아래 라우팅 메소드의 분홍색 콜백함수가 서버측 응답처리 코드영역이고 res 매개변수가 HttpResponse 객체입니다.

/*
- 메인 페이지 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/
-요청방식 : GET 방식
-응답결과 : index.ejs 뷰파일 웹페이지 내용
*/
router.get('/', function(req, res, next) {
  res.render('index', { title: "메인 페이지" });
});



위에서 학습한 Controller의 역할과 주요개념을 아래 MVC 설계패턴 구조도를 보며 다시한번 요청과 응답 프로세스를 이해해보도록 노력해보세요.