1201 | 스프링의 정석 :: 2-10
1130 | 스프링의 정석 :: 2-9
관심사의 분리, 스프링 MVC패턴 ✔ 관심사란? (concern) 해야할 과정이 나누어져있을때 하나의 파트가 관심사. 1. 입력. 2.요일계산. 3.출력 일때 3개의 관심사로 나누어져 있음. OOP 5대 설계원칙 - SOLID
ala-nueva.tistory.com
▲ 앞의 MVC 실습버전
1. 메인에서 값을 직접 입력받음 & response는 model로 설정
2. 입력 절차 분리됨
3. 작업 절차 분리됨
4. 처리 절차에 유효성검사 추가 (에러페이지와 연결)+ 계산 메서드 정리 + 계산 결과를 모델에 저장
5. 출력 절차 분리. jsp로 만들어서 리턴값에 연결
// import문 생략
// 날짜 연월일을 입력하면 무슨요일인지 알려주는 프로그램
@Controller // 1. 원격호출 가능한 프로그램으로 등록
public class YoilTellerMVC { //http://localhost/ch2/getYoilMVC?year=2022&month=12&day=24
@RequestMapping("/getYoilMVC") //url과 메서드를 연결하는 맵핑
public String main(int year, int month, int day, Model model)throws IOException {
// response대신에 값을 받아오는 model을 넣는다. 아래의 계산값도 모델에 저장하는 과정을 거쳐야 함.
// 리턴값이 jsp명이 되면서 void > String으로 변경됨
//1. 입력 > 값들을 직접 메인메서드에서 받으면서 사라짐
//2. 값을 받아서 작업 > 메인메서드에 직접 int값이 들어가므로 String > int 변환과정 사라짐
// 1) 유효성검사 필요
if(!isValid(year,month,day)) // 아래에 isValid메서드 생성
return "yoilError"; //yoilError.jsp로 연결됨
// 2) 요일 계산 메서드
char yoil = getYoil(year, month, day); //해당 범위 우클릭 - refactor - extract Method로 메서드를 뽑아냄
// 3) 계산 결과를 모델에 저장
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
return "yoil"; // WEB-INF/views/yoil.jsp라는 뜻 앞의경로는 동일하므로 뷰 이름만 적어서 리턴값으로 넣음.
//3 출력 > 별도의 jsp파일로 빼내면서 사라짐. 아래 내용을 jsp파일로 만들고 리턴으로 연결시켜줌
// System.out.println(year+"년"+month+"월"+day+"일은 "); // system.out이므로 콘솔값에 출력이 됨.위에서 request옆에 response를 적어줘야함.
// System.out.println(yoil+ "요일입니다.");
// response.setContentType("text/html"); // 출력 타입 설정. 텍스트를 보내고, 텍스트의 인코딩이 뭔지 알려줌
// response.setCharacterEncoding("utf-8");
// PrintWriter out = response.getWriter(); // response 객체에서 브라우저 출력 스트림을 얻는다
// out.println(year+"년"+month+"월"+day+"일은 ");
// out.println(yoil+"요일입니다.");
}
private boolean isValid(int year, int month, int day) {// 클래스 안에서만 사용되어서 프라이빗
return true; // 여기가 false로 바뀌면 에러페이지로 연결됨
}
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); // 요일. 1: 일요일 2:월요일...
return " 일월화수목금토".charAt(dayOfWeek); // 숫자로 나오는 요일을 문자로 변경
}
}
✔ 컨트롤러 메서드의 반환 타입
[public String main()]
: 뷰 이름 반환 return "yoil";
[public void main()]
: 맵핑된 url의 끝 단어가 뷰 이름 위와같이 return "yoil"이 없고 @RequestMapping("/yoil") 의 뷰 이름이 사용됨. (yoil.jsp)
[public ModelAndView Model main()]
: Model과 뷰 이름을 반환
✔view 설정 (.jsp파일 생성)
👉 이때 jsp상단에 글자가 깨지지않도록 설정해준다 <%@ page contentType = "text/html;charset=utf-8" %>
👉 값이 들어가는 ${각 자리} 는 EL (Express Language)
모델 객체를 받으면 View가 해당 값을 꺼내서 완성시킴. 그리고 그 내용이 응답으로 클라이언트에게 전송된다.
✔ return으로 뷰 이름만 줘도 띄울 수 있는 이유
✔ ModelAndView를 통해 모델과 뷰를 한번에 설정해줄수도 있다.(*잘 안쓰긴 함)
@Controller // 1. 원격호출 가능한 프로그램으로 등록
public class YoilTellerMVC { //http://localhost/ch2/getYoilMVC?year=2022&month=11&day=24
@RequestMapping("/getYoilMVC") //url과 메서드를 연결하는 맵핑
public ModelAndView main(int year, int month, int day)throws IOException {
//response에 모델을 받지않음
//1) ModelAndView를 생성하고, 기본 뷰를 지정
ModelAndView mv = new ModelAndView();
mv.setViewName("yoilError"); // 뷰의 이름을 지정
// 2) 유효성검사
if(!isValid(year,month,day))
return mv;
// 3) 요일 계산 메서드
char yoil = getYoil(year, month, day);
// 4) 계산 결과를 ModelAndView에 저장
mv.addObject("year", year);
mv.addObject("month", month);
mv.addObject("day", day);
mv.addObject("yoil", yoil);
// 5) 작업 결과가 들어갈 뷰의 이름
mv.setViewName("yoil");
// 6) ModelAndVIew 반환
return mv; // mv로 통채로 반환. 뷰에는 뷰만 추출되어 전달됨.