관심사의 분리와 MVC패턴

SOLEE_DEV·2023년 1월 18일
0
post-custom-banner

관심사의 분리, MVC패턴 - 이론

1. 관심사의 분리 Speration of Concerns

  • 관심사? : 입력, 처리 출력 세 부분으로 구성된 코드를 의미
    (우리가 관심을 갖고 해야 할 작업)
  • OOP 5대 설계 원칙 (SOLID)
    1) Speration : 단일 책임 원칙
    • 하나의 메소드는 하나의 책임(= 관심사)만 진다
    • 3개의 관심사를 분리해야 함.
      2) 분리
    • 관심사의 분리
    • 변하는 것, 자주 변하지 않는 것의 분리 (common, uncommon)
    • 공통코드의 분리 (중복코드)

2. 공통 코드의 분리

- 입력의 분리

  • Controller의 구성
    1. 입력 : request.getParameter()
    2. 처리
    3. 출력
    => (입력만 따로 분리)
    1. 입력 -> 2. 처리 / 3. 출력 (개별 매개변수로 직접 받게 설계!)
    -> 2. 처리 / 3. 출력
    -> 2. 처리 / 3. 출력

3. 출력(View)의 분리

- 변하는 것과 변하지 않는 것의 분리

  • MODEL 객체(중간 객체)를 만들어놓고, 결과를 출력하는데 필요한 값들을 다 저장!
  • MVC 패턴
    1) Controller : 처리
    2) View : 결과를 출력하는데 보여주는 부분
    3) Model : 필요한 값을 저장 (C - V 간의 데이터 전달을 위함)
  • MVC 패턴 처리 방식
    1) 입력 (Dispatcher servlet이 처리) & 변환 & 모델 생성 // new Model();
    2) Controller가 처리 결과를 Model에 저장해서 다시 전달
    & model객체에 key - value 형식으로!
    & 작업 결과를 보여줄 View의 이름을 변환!
    return "yoil" // WEB-INF/views/yoil.jsp
    3) Dispatcher servlet가 출력(View)에 전달~ (응답을 만들어내서 클라이언트에 전송!)
    		<h1>${year}년 ${month}</h1>
    
## 4. 실습
- EL (Expression Language)

## 5. ModelAndView
- 매개변수에 model을 선언하지 않으면, ModelAndView 객체를 직접 생성 & 결과지정 & 뷰지정 & mv 반환하는 과정을 거침 => DispatcherServlet이 view에 model을 전달!

## 6. 컨트롤러 메서드의 반환타입
- [String] : 뷰 이름을 반환
	- return "yoil"
- [Void] : 맵핑된 url의 끝단어가 뷰 이름
	- @RequestMapping("/yoil")
- [ModelAndView] : Model과 뷰 이름을 반환
	- ModelAndView mv = new ModelAndView();
    - mv.setViewName("yoil");
    - return mv;
    
<hr>
```java
StringJoiner paramList = new StringJoiner(", ", "(", ")");
			// 구분자, 접두사, 접미사

관심사의 분리, MVC패턴 - 원리(1)

1. 매개변수의 이름 얻어오는 법

1) Reflection API (-parameters 옵션 / jdk1.8 ↑ 이상부터 가능!)
2) Class file을 직접 읽는 방법

  • 1번을 시도하고 2번 방법을 시도~

2.

mc.main {
      hashMap[0x100]
  main() {
      hashMap[0x100]
  }
}

관심사의 분리, MVC패턴 - 원리(2)

  • Parameter 가져오는 방식
Parameter[] paramArr = main.getParameter();
Object[] argArr = new Object[main.getParameterCount()];

for (int i=0; i<paramArr.length; i++) {
	String paramName = paramArr[i].getName();
    Class paramType = paramArr[i].getType();
    Object value = map.get(paramName);
    
    if (paramType == Model.class) {
    	argArr[i] = model = new BindingAwareModelMap();
    } else if(paramType == HttpServeletRequest.class) {
    	argArr[i] = request;
    } else if(paramType == HttpServeletResponse.class) {
    	argArr[i] = response;
    } else if(value != null) {
    	String strValue = ((String[])value)[0];
        // 실제로 value는 String[] 형태로 넘어와서, 해당 배열의 첫번째껄 꺼내서 가져옴!
        argArr[i] = convertTo(strValue, paramType);
    }
}
  • 렌더링하는 방식
privaite void render(Model model, String viewName, HttpServletResponse response) throws IOException {
	response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");
    PrinterWriter out = reponse.getWriter();
    
    ...
    
    out.println(result);
}
profile
Front-End Developer
post-custom-banner

0개의 댓글