1. 관심사의 분리

  • 입력, 처리, 출력 등 작업을 나눌 수 있는 단위를 관심사 라고 한다
    • OOP 5대 설계 원리 중 SRP - 단일 책임의 원칙
      하나의 메서드는 하나의 책임만 진다
    • 코드를 분리하는법
    1. 관심사
    2. 변하는 것과 (자주)변하지 않는 것
    3. 공통 코드

2. 공통 코드의 분리

입력의 분리

  • 각각의 컨트롤러에 공통적으로 있는 입력부(request.getParameter())를 분리

처리와 출력의 분리

  • 처리와 출력을 분리한다면 같은 메서드 안이기 때문에 사용할 수 있었던 지역변수 등을 사용할 수 없다
  • 그래서 중간의 Model 객체가 필요하다
  • 모델 객체에 처리 내용을 저장하여 전달한다
  • 처리하는 부분은 Controller, 출력하는 부분은 View

Model - View - Controller = MVC패턴

  1. DispatcherServlet이 입력을 처리, 변환하고 모델을 만든다
  2. Controller가 입력에서 Model을 받아서 처리하여 결과를 다시 Model에 주면

    매개변수로 Model model을 받아서 처리한 결과를 저장한다
    매개변수로 모델을 적으면 DispatcherServlet이 new Model();로 객체를 만들어 넘겨준다
    • 위 코드에서 만약 유효성 검사에 실패하게 되면 "yoilError" 를 반환
      즉 결과로 보여줄 View가 yoilError로 지정되어 에러 내용이 출력된다
  3. DispatcherServlet이 Model을 View에 전달하고 응답을 만들어 클라이언트에 전송
    작업의 결과를 보여줄 View를 지정했으니 그 jsp파일에서 출력방식만 보여주면 된다
    모델에 포함된 값(변수)을 사용할 수 있다

View를 출력과 분리하니, 상황에 따라(에러 발생) 다른 View를 사용할 수 있게 되었다
ex) 버튼에 따라 다른 형식으로 자료를 보여주는 방식 pdf, csv, excel

YoilTeller 관심사 분리 실습

1. 유효성 검사

 if (!isValid(year, month, day))
    return "yoilError"; //에러시 출력할 jsp파일 지정
    
------

private boolean isValid(int year, int month, int day) {
    return false;
}

2. 요일 계산

char yoil = getYoil(year, month, day);

-----

private char getYoil(int year, int month, int day) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month -1, day);

    int datOfWeek = cal.get(Calendar.DAY_OF_WEEK);//요일이 숫자로 나온다 1:일요일, 2:월요일
    return " 일월화수목금토".charAt(datOfWeek);
    }

3. 출력1 - 계산한 결과 모델에 저장

model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
return "yoil"; //출력할 jsp파일 지정, 반환타입 String으로

4. 출력2 - 메인의 반환 타입이 void인 경우

  • 맵핑된 URL과 같은 이름의 View가 호출된다
@RequestMapping("/getYoilMVC")

5. 출력3 - ModelAndView로 출력하기

  • 모델과 뷰를 같이 넘겨주기
    public ModelAndView main(int year, int month, int day) throws IOException {

        ModelAndView mv = new ModelAndView(); //모델 생성

        char yoil = getYoil(year, month, day);

        mv.addObject("year", year); //결과 저장
        mv.addObject("month", month);
        mv.addObject("day", day);
        mv.addObject("yoil", yoil);
        
        mv.setViewName("Yoil"); //뷰 지정

컨트롤러 메서드의 반환 타입 정리

1. [String] 뷰 이름을 반환

2. [void] 맵핑된 url의 끝 단어 "/.."가 뷰 이름

3. [ModelAndView] Model과 뷰 이름을 반환, setViewName("")

원리 *??

profile
안녕하세요. Chat JooPT입니다.

0개의 댓글