본문 바로가기
아카이브/스프링

스프링의 정석 (관심사 분리와 MVC패턴)

by nineteen 2021. 12. 24.
반응형

배운 것

관심사

관심사 분리

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패턴에 대해서도 알게 됐다.

 

이 패턴이 어떤 방식으로 동작하는지도 알아봤으니 이를 통해 간단한 무언가를 여러 개 만들어보면서 감을 익혀야겠다.