본문 바로가기
dev/Spring

[Spring] MVC 패턴 - 관심사의 분리

by dev_Step 2022. 5. 22.

- 현재 getYoil 을보면 3부분으로 나뉘어 져있다

1. 입력 / 2. 작업 / 3. 출력

이각 부분을 관심사라고 한다. => 즉 해야할 작업

 

main() -> 3개의 관심사를 가지고 있다.

 

""OOP 5대 설계의 원칙 SOILD 

 1. SRP(단일 책임의 원칙) ==> 하나의 메서드는 하나의 책임만 가진다.  책임 == 관심사 ""

 

즉 main()은 관심사를 분리해야 한다.

 분리

   1. 관심사의 분리

   2. 변하는것과 (자주)변하지 않는 것의 분리(Common code/  Uncommon code)

   3. 공통 코드의 분리(중복 코드)

 

 

 1) 입력 - Request.getParameter 2) 처리 3) 출력                                        2) 처리 3) 출력

 1) 입력 - Request.getParameter 2) 처리 3) 출력  ===>     1. 입력  == >       2) 처리 3) 출력

 1) 입력 - Request.getParameter 2) 처리 3) 출력                                        2) 처리 3) 출력

 

 

request.getParameter() 의 입력의 관심사를 

int year, int month, int day를 통해서 입력의 관심사를 분리하였다.

 

처리 부분과 / 출력 부분을 구분하게 된다면 

처리부분은 Controller 에서  // 출력 부분은 View에서 처리를 하게 된다 

그러면 현재 출력 부분에서 사용했던 year, month, day, yoil 변수는 사용하지 못한다

그렇기 때문에 Controller 에서 View 로 해당 변수값을 넘겨주기 위해서 Model 이라는 객체를 사용한다.

 

그래서 Model /  View / Controller /    (Controller 와 View 간의 데이터를 전달하기 위해서 Model이 필요한거다)

 

입력 부분을 별도의 메서드로 구분했고, 처리 부분은 Controller로 , 출력 부분은  View로 분리 하였다

 

MVC 패턴을 보자하면

사용자의 요청이 들어오면 DispatcherServlet이 요청을 입력하여 해당 요청에 맞는 Controller로 넘겨주고

Controller가 처리결과를 리턴하면 출력한다.   

이과정에서 처리한결과를 model에 저장한다음에  이 Model을 View에게 전달하여 해당 결과를 사용하여 

응답을 사용자에게 리턴해준다.

 

Model 객체는 DispatcherServlet이 생성하여 Controller에게 주므로 Controller 에서 매개변수로 Model 객체를 사용할수 있다. 

 

 

실제로 실습을 진행해 보자

 

1. 입력 부분은 매개변수로 int year, int month, int day 를 통해서 바로 받았다.

2. 처리 부분은 getYoil() 이라는 메서드로 분리하였다. 분리하는 방법은 아래 참고

3. 출력 부분은  View로 따로 뺴주는데 이것은 /src/main/webapp/WEB-INF/views/ 에 .jsp 파일로 생성해줬다.

 

코드를 분석해 보자면

우선 여태까지 사용하던 HttpServletResponse 는 더이상 사용을 하지 않는다 그 이유는 View를 jsp를 통해서 

출력하기 때문에 PrintWrite out = response.getWrite(); 메서드를 통해서 출력하지 않아도 된다.

return type을 ModelAndView로 할때와, String으로 할때 , void 할때 마다 구분되는데

 

우선 ModelAndView로 할경우는  ModelAndView 객체를 Contorller에서 생성해줘야 한다

 

ModelAndView는 Model과 View 기능을 동시에 하는것으로

.setViewName(""); 매서드를 통해서 이동할 .jsp 페이지를 설정해줄수 있고, .jsp는 쓰지 않는다.

.addObject(K,V); 를 통해서 View로 처리된 데이터를 넘겨 줄수 있다. 

 

String의 경우는 DispatcherServlet에서 생성해준 Model을 통해서 

.setAttribute(K,V) 처리된 결과를 Model에 넣어서 View 페이지를 넘겨준다

이때 return 값에 이동하고자 하는 페이지의 이름을 적어주면 된다 return "yoil";

 

void 의 경우는 해당 메서드가 맵핑된 주소와 동일한 jsp 파일로 이동하게 된다.

EX) @RequsetMapping("/getYoilMVC") public void main(){}  --> getYoilMVC.jsp 의 view 파일로 이동한다.

 

 

-- 처리부분  코드를 하나의 메서드로 자동으로 변경해주는  기능