MVC모델
MVC모델이란
프로그램의 처리 역할을 나누어서 작성하는 방법으로 웹시스템 개발에 자주 사용된다.
역할은 모델, 뷰, 컨트롤러의 세 종류로 분류한다. 아마 다른 어디선가 이부분 서술했던듯..
모델(Model : M)
모델은 시스템에서 비지니스 로직을 담당한다. 비지니스 로직: 시스템의 코어부분 혹은 시스템의 목적을 처리하는 부분을 의미한다.
예를들어 아이디 중복확인이다 하면 → 사용자가 입력한 아이디 값을 메모리에 저장하고, 회원 데이터베이스에서 같은 아이디가 있는지 확인하고 중복여부를 화면에 표시할 수 있게 전달하는것 까지가 비지니스 로직이다.
뷰(View : V)
사용자 입력과 결과출력등 시스템에서 표현부분을 의미하며, 웹 어플리케이션에서는 주로 화면을 담당한다.
컨트롤러(Controller : C)
컨트롤러는 서비스 처리를 담당하는 모델과 화면표시를 담당하는 뷰를 제어(Control)하는 역할을 한다. 사용자가 입력한 내용을 뷰에서 받고 받은 데이터를 기준으로 모델에 내용을 전달한다. 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시한다.
MVC 장점
1) 역할분담을 통해 효율적인 개발이 가능하다.
2) 개발 엔지니어의 분업화가 용이하다
3) 설계변경에 유연하다
스프링MVC
웹 어플리케이션을 간단하게 만들수 있는 기능을 제공하는 프레임워크
프론트 컨트롤러 패턴(Front ControllerPattern) 이란 디자인 패턴중 하나로, 모든 요청을 프론트 컨트롤러가 받아 그후 담당하는 컨트롤러에 할당하는 설계방식중 하나이다.
스프링MVC 주요기능은 화면전환이나 사용자가 사용하는 브라우저와 서버간 입출력 데이터 전달을 단순화 하는능의 기능이 있다.
구성요소
1) DispatcherServlet : 모든 요청을 수신하는 프론트 컨트롤러(Front Controller)
2) Model : 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체이다. (HttpServletRequest 나 HttpSession 과 같은 기능을 제공한다.)
3) 컨트롤러 : 요청에 대응해서 처리할 내용이 있는곳이다.'
4) 서비스 처리 : 데이터베이스에 접속해서 데이터를 취득하거나 데이터를 가공하는 등 여러가지 작업을 실행한다. 개발자가 설계하고 구현함으로 스프링MVC와 관계는 없다.
5) 뷰 : 화면표시처리를 한다.(jsp등의 처리를 의미한다)
request/response 흐름
1. 브라우저에서 모든 요청을 DispatcherServlet (모든 요청을 수신하는 프론트 컨트롤러) 이 클라이언트로부터 요청을 수신한다.
2. dispatcherServlet이 컨트롤러의 요청핸들러 메소드를 호출한다.
3. 컨트롤러는 비지니스 로직처리를 호출하고 처리 결과를 받는다.
4. 받은 처리결과를 모델로 설정하고 뷰 이름을 반환한다.
5. 반환한 뷰 이름을 받아 DispatcherServlet이 뷰 이름에 대응하는 뷰에 대해 화면표시처리를 요청한다.
6. 클라이언트가 응답을 받고 브라우저에 화면이 표시된다.

※ 요청 핸들러 메소드는 밑에서 다시 설명해보겠다.
흐름을 보면 느끼겠지만 나머지 복잡한건 스프링MVC가 처리해주기때문에 작성할 부분은 뷰, 비지니스로직처리부분, 컨트롤러만 작성하면된다.
혹시 책 예제 따라하고싶은 분들은 아래 참고로 써둔 도서 참고하시면 그대로 따라가면서공부하기 좋아요
스프링MVC 사용
요청에 보내온 URL에 대응하는 메서드를 요청핸들러 메서드라고 부른다.
컨트롤러에 요청핸들러 메소드를 만들고 뷰를 생성할것이다. (브라우저에 HelloView를 표시하도록 짠다)
컨트롤러생성
컨트롤러는 POJO 클래스로 작성한다. POJO란 "Plain Old Java Object" 의 줄임말로 보통의 자바 객체, 즉 어떤 클래스를 상속하는 등의 특별한 처리를 하지않는 클래스로 생각하면된다.
→ 다른 클래스 상속하거나 하지않고 그냥 딱 자바 객체 그냥딱 이거 하나로 쓰는그런의미인듯
@Controller 어노테이션 : 인스턴스 생ㅇ성 어노테이션이다. 클라이언트와 데이터 입출력을 제어하는 어플리케이션 레이어의 컨트롤러를 부여한다. 요청핸들러 메소드의 반환값을 뷰의 이름으로 하여 템플릿엔진의 뷰가 응답 HTML을 생성한다.
@Requestmapping 어노테이션 : 클래스나 메소드에 부여하는 것으로 컨트롤러의 요청핸들러 메소드와 URL을 매핑하게 된다. RequestMapping어노테이션에 여러 속성을 지정할수있지만 보통 value와 method속성을 지정한다.
1) value :
매핑할 URL경로(path)를 지정한다.
value는 처음의 / 를 생략할수 있고, url경로만 지정하는 경우에는 속성에서 value를 생략할수 있다.
url 경로는 여러개 지정할수 있다.
▷ 사용예 @RequestMapping(value = "hello") : value 속성에 처리대상의 URL경로를 매핑
▷ 사용예 @RequestMapping( "hello") : value 속성만 지정하는 경우 생략가능
▷ 사용예 @RequestMapping(value = { "hello" , "hellospring" } ) : URL경로를 여러개 지정 매핑
2) method :
GET 과 POST등 HTTP메소드를 지정한다.
GET을 지정하는경우 RequestMethod.GET을 사용한다.
POST를 지정하는 경우 RequestMehtod.POST를 사용한다.
HTTP메소드를 여러개 지정할수 있고, 클래스에 Requestmapping을 부여하는 경우에는 지정할수없다.
▷ 사용예 @RequestMapping(value = "hello" , method = RequestMethod.GET) : method에서 HTTP메소드 GET을 지정
▷ 사용예 @RequestMapping(value = "hello" , method ={ RequestMethod.GET, RequestMethod.POST }) : method에서 HTTP메소드 여러개 지정
@GetMapping어노테이션 :
RequestMapping 어노테이션의 GET요청용 어노테이션이다. 사용법은 @Requestmapping의 value속성은 같지만 method속성은 없다.
@PostMapping 어노테이션 :
Requestmapping 어노테이션의 POST요청용 어노테이션이 @PostMapping이다. 속성으로 Requestmapping의 value속성은 같지만 method 속성은 없다.
URL매핑
컨트롤러로 만든 클래스에 @RequestMapping("hello")어노테이션을 부여하고 요청핸들러 매소드에 @GetMapping("view)어노테이션을 부여했다. 이것으로 URL로 GET메소드를 보내면 컨트롤러 클래스의 helloview메소드가 호출된다.
컨트롤러에서 요청핸들러 메소드의 반환값(return값)이 뷰 (html 혹은 jsp 혹은등등)의 이름이다.
뷰 생성
스프링부트의 프로젝트 에서는 템플릿엔진을 사용하는 경우 "뷰"를 두는곳이 지정되어 규칙을 지켜야한다.
1) resources/templates 폴더 밑에 뷰를 생성한다.
2) 뷰가 많이 필요한 경우 기능별로 폴더를 만들어서 보관한다.
3) 폴더를 나눈경우 templates폴더 이하의 폴더명을 요청핸들러 메소드의 반환값에 지정해야한다.
4) css나 자바스크립트 등은 resources/static폴더에 배치한다.
참고 : 스프링프레임워크 첫걸음 -위키북스-