🔥 Vamos/Spring

1201 | 스프링의 정석 :: 2-10

unikue 2022. 12. 3. 01:05

 

 

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파일 생성)

view 안에 보여지는 jsp파일 생성

 

👉 이때 jsp상단에 글자가 깨지지않도록 설정해준다 <%@ page contentType = "text/html;charset=utf-8" %>

 

👉 값이 들어가는 ${각 자리} 는 EL (Express Language)

모델 객체를 받으면 View가 해당 값을 꺼내서 완성시킴. 그리고 그 내용이 응답으로 클라이언트에게 전송된다.

 


 

✔ return으로 뷰 이름만 줘도 띄울 수 있는 이유

여기에 jsp설정값이 있는데
접두사에는 경로, 접미사로는 .jsp가 붙도록 자동으로 설정되어 있기 때문.

 


 

✔ 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로 통채로 반환. 뷰에는 뷰만 추출되어 전달됨.