배운 것
관심사
관심사 분리
MVC패턴
내용 정리
관심사 (concern)
- 해야할 작업
하나의 메소드는 하나의 책임만 져야 함
-> 하나의 메소드는 하나의 관심사(작업)로만 구현되어야 함
@Controller
public class YoilTeller {
@RequestMapping("/getYoil")
public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. 입력
String year = request.getParameter("year");
String month = request.getParameter("month");
String day = request.getParameter("day");
// String -> int
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 작업
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm-1, dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1:일요일, 2:월요일 ...
char yoil = " 일월화수목금토".charAt(dayOfWeek);
// 3. 출력
// System.out.println(year + "년 " + month + "월 " + day + "일은 ");
// System.out.println(yoil + "요일입니다.");
// 브라우저에 결과를 보내기
// 출력할 내용의 타입, 인코딩을 설정해야 함
// 브라우저에 출력할 거, 출력할 내용의 타입, 인코딩 설정 필수!
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter(); // response객체에서 브라우저로의 출력 스트림 획득
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println(yyyy + "년 " + mm + "월 " + day + "일은 ");
out.println(yoil + "요일입니다");
out.println("</body>");
out.println("</html>");
}
}
위의 클래스에서는 해야하는 작업이 3개(관심사가 3개)
-> 이를 분리해야 함
객체지향적으로 설계를 잘하려면 '분리'를 잘해야 한다.
@Controller
public class YoilTellerMVC {
@RequestMapping("/getYoilMVC")
// 1. 입력
// 입력을 분리, 매개변수로 넣어줌으로써 입력행위를 간소화 가능
public String main(int year, int month, int day, Model model) throws IOException {
// 유효성 검사
if(!isValid(year, month, day))
return "yoilError";
// 2. 작업 처리
char yoil = getYoil(year, month, day);
// 작업 처리 결과를 Model에 저장하고 이 저장된 결과를 View로 전달(yoil.jsp)
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
// 3. 출력
// 출력도 분리가 가능!
// Model 객체에 데이터를 저장하고 출력부분에서 사용
// 출력을 해당 문자열의 jsp파일을 보여주는 것으로 분리
return "yoil";
}
private boolean isValid(int year, int month, int day) {
return true;
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month-1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
char yoil = " 일월화수목금토".charAt(dayOfWeek);
return yoil;
}
}
'1. 입력'부분은 공통적인 부분이기 때문에 분리해야 한다 (공통부분 분리)
'3. 출력'부분은 jsp파일로 옮겨서 분리가 가능
괌심사를 분리하면 year, month, day, yoil등의 변수를 사용할 가 관심사에서 사용할 수 없게됨
-> 이를 위해 Model객체를 활용
결과를 출력하는데 필요한 값들 Model객체에 저장
Model을 출력부분에 전달 -> 객체에 담긴 내용들을 읽어서 출력
이를 MVC패턴이라고 함
Controller - 처리
View - 출력
Model - 데이터 저장 ( 분리된 코드간 데이터 전달위해 필요)
동작 방식
1. 사용자 요청이 들어오면 DispatcherServlet이 요청을 받음
2. 사용자 요청을 받은 DispatcherServlet이 입력처리/변환을 하고, 결과를 저장할 Model 객체를 만듦
3. 만든 Model 객체를 Controller에게 넘겨 줌
4. Controller가 작업을 처리하고 결과를 Model에 저장 (Map형태로)
5. DispatcherServlet이 Model을 View에게 작업한 결과를 넘겨줌
6. View는 최종 응답을 만들고 클라이언트에게 응답
느낀 점 / 보완할 점
관심사의 의미와 분리의 필요성을 알 수 있었다.
어떤 방식으로 메소드를 구성해야 하는지에 대해 대략적으로 알 수 있었고, MVC패턴에 대해서도 알게 됐다.
이 패턴이 어떤 방식으로 동작하는지도 알아봤으니 이를 통해 간단한 무언가를 여러 개 만들어보면서 감을 익혀야겠다.
'아카이브 > 스프링' 카테고리의 다른 글
스프링의 정석 (@RequestParam, @ModelAttribute) (0) | 2021.12.27 |
---|---|
스파르타 코딩클럽 [ 웹개발의 봄, Spring ] - 1주차 (0) | 2021.12.26 |
스프링의 정석 (서블릿과 JSP) (0) | 2021.12.24 |
스프링의 정석 ( 클라이언트-서버, 웹 어플리케이션 서버, 텍스트 파일, 바이너리 파일 ) (0) | 2021.12.22 |
스프링의 정석 ( 원격 프로그램, HTTP 요청/응답 ) (0) | 2021.12.21 |