패캠 챌린지

패스트캠퍼스 챌린지 - 6일차 [스프링의 정석:남궁성과 끝까지 간다]

개발자 김혜린 2023. 2. 25. 20:40

자바 MVC 패턴의 이론을 배웁니다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
@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");

      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);
      char yoil = " 일월화수목금토".charAt(dayOfWeek);   // 일요일:1, 월요일:2, ... 
     
    // 3.출력
      response.setContentType("text/html");
      response.setCharacterEncoding("utf-8");
      PrintWriter out = response.getWriter(); //response 객체에서 브라우저로의 출력 스트림을 얻는다
      out.println(year + "년 " + month + "월 " + day + "일은 ");
      out.println(yoil + "요일입니다.");
	}

}

관심사의 분리

관심사 = 해야할 작업

 

OOP 5대 설계 원칙 

첫 번째 원칙인

SRP : 단일 책임의 원칙 (하나의 메서드는 하나의 책임(관심사)만 진다)

 

관심사를 분리해야만 한다.

분리 해야하는 것의 종류

1. 관심사

2. 변하는 것 / 변하지 않는 것

3. 공통(중복 코드)

 

입력의 분리

입력 부분에 공통되는 부분이 있으니 분리한다.

 

통째로 받아서 getParameter로 가져오는 것이 아닌,

개별 매개변수로 받는 것으로 바꾼다.

또한 int 타입으로 받는다면 처리 부분이 더 간편해진다.

 

출력의 분리

서로 다른 영역으로 분리된다면, 각 변수들을 읽어올 수 없다.

그래서 분리된 두 코드 간의 중간 역할인 Model 객체가 필요하다.

 

 

MVC 패턴 

처리하는 부분인 Controller

출력 부분은 View

둘 간의 주고받는 객체를 Model

이것을 MVC 패턴이라고 한다.

 

디스패처 서블릿이 앞에서 입력 처리를 받고

모델을 만든 뒤 컨트롤러에 넘겨서

컨트롤러가 처리를 한 뒤 작업 결과를 뷰에 넘기고

뷰는 최종 응답을 클라이언트에게 보낸다.

컨트롤러가 디스패처 서블릿으로부터 받은 모델로 처리한 결과를 보여주기 위해,

String으로 작업 결과를 보여줄 view의 이름을 변환한 후 디스패처서블릿에게 준다. (jsp)

 

모델의 값이 유효하지 않으면

yoilError라는 jsp를 디스패처서블릿에게 돌려준다.

 

실습

[String] 뷰 이름을 반환

고친 코드!

package com.fastcampus.ch2;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class YoilTeller {
	
	@RequestMapping("/getYoilMVC")
//	public  void main(HttpServletRequest request,HttpServletResponse response) throws IOException { 
	public  void main(int year, int month, int day, HttpServletResponse response) throws IOException {  
		
		
	// 1.입력 
//	  String year = request.getParameter("year");
//    String month = request.getParameter("month");
//    String day = request.getParameter("day");

//      int yyyy = Integer.parseInt(year); //파라미터를 int로 받음으로써 필요없어짐
//      int mm = Integer.parseInt(month);
//      int dd = Integer.parseInt(day);
      
    // 2.처리
      Calendar cal = Calendar.getInstance();
      cal.set(year, month - 1, day);
      
      int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
      char yoil = " 일월화수목금토".charAt(dayOfWeek);   // 일요일:1, 월요일:2, ... 
     
    // 3.출력
      response.setContentType("text/html");
      response.setCharacterEncoding("utf-8");
      PrintWriter out = response.getWriter(); //response 객체에서 브라우저로의 출력 스트림을 얻는다
      out.println(year + "년 " + month + "월 " + day + "일은 ");
      out.println(yoil + "요일입니다.");
	}

}

잘 나오는 결과

 

yoil.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
	<title>YoilTellerMVC</title>
</head>
<body>
<h1>${year}년 ${month}월 ${day}일은 ${yoil}요일입니다.</h1>
</body>
</html>

${} -> 값이 들어갈 자리를 만들어놓음 EL (Expressive Language)

 

yoilError.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
	<title>YoilTellerMVC</title>
</head>
<body>
<h1>잘못된 요청입니다.</h1>
</body>
</html>

 

다시 

yoilTellerMVC.java

package com.fastcampus.ch2;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class YoilTellerMVC {
	
	@RequestMapping("/getYoilMVC")
	public String main(int year, int month, int day, Model model) throws IOException {  
		
	//1. 유효성 검사
	  if(!isValid(year,month,day)) 
		  return "yoilError";
	  
	  //2. 요일 계산
	  char yoil = getYoil(year, month, day);
	  
	  //3. 계산한 결과를 모델에 저장
	  model.addAttribute("year", year);
	  model.addAttribute("month", month);
	  model.addAttribute("day", day);
	  model.addAttribute("yoil", yoil);
	  
      return "yoil"; //WEP-INF/views/yoil.jsp 부분을 보여주자 
	}

	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);
		  return " 일월화수목금토".charAt(dayOfWeek);   // 일요일:1, 월요일:2, ... 
	}

}

잘 나오는 결과

 

view가 원하는대로 잘 나오는 이유는

sevlet-context.xml에 

접두사와 접미사를 미리 설정해 경로를 정해주었기 때문이다.

 

[void] 맵핑된 url의 끝 단어가 뷰 이름

만약 view 이름을 주지 않는다면,

String을 void로 바꾼 뒤 경로와 맞는 jsp 파일을 만들어주면 된다.

@Controller
public class YoilTellerMVC {
	
	@RequestMapping("/getYoilMVC")
	public void main(int year, int month, int day, Model model) throws IOException {  
		
	//1. 유효성 검사
//	  if(!isValid(year,month,day)) 
//		  return "yoilError";
	  
	  //2. 요일 계산
	  char yoil = getYoil(year, month, day);
	  
	  //3. 계산한 결과를 모델에 저장
	  model.addAttribute("year", year);
	  model.addAttribute("month", month);
	  model.addAttribute("day", day);
	  model.addAttribute("yoil", yoil);
	  
//      return "yoil"; //WEP-INF/views/yoil.jsp 부분을 보여주자 
	}

URL

 

경로
결과

 

[ModelAndView] Model과 뷰 이름을 반환

컨트롤러에서 직접 모델을 만드는 것.(디스패처서블릿에서 만드는 것이 아닌)

@Controller
public class YoilTellerMVC {
	
	@RequestMapping("/getYoilMVC")
	public ModelAndView main(int year, int month, int day) throws IOException {  
		
		ModelAndView mv = new ModelAndView();
		
	//1. 유효성 검사
//	  if(!isValid(year,month,day)) 
//		  return "yoilError";
	  
	  //2. 요일 계산
	  char yoil = getYoil(year, month, day);
	  
	  //3. 계산한 결과를 모델에 저장
	  mv.addObject("year", year);
	  mv.addObject("month", month);
	  mv.addObject("day", day);
	  mv.addObject("yoil", yoil);
	  
	  mv.setViewName("yoil");
	  
	  return mv;
	}

 


TIL

FACTS

자바 기초가 튼튼하지 않으니까 이해가 안되는 부분이 생겨버렸다.....

나는 앞으로도 자바를 쓸 사람이니 자바를 제발 공부하도록 하자.....

내일 갤럭시탭이 오면... 자바는 다 죽었다

 

FEELINGS

이해가 잘 되다가, 원리 부분으로 접어드니 쉬운 예제인데도

HashMap 부분에서 막혔다. "참조 자료형 변수" 강의를 추천해주셨는데 들어야겠다.

 

FINDINGS

관심사의 분리 - SRP(단일 책임 원칙)

Controller (처리 부분) - 둘 간의 데이터를 주고 받는 객체 Model - View (출력 부분) ==> MVC 패턴

뷰를 반환하는 방법 3가지!

 

FUTURE

스프링 강의를 듣느라 코딩테스트 강의에 소홀했다.

스프링 강의 열심히 챙겨듣고, 코딩테스트 또한 열심히 해보자!


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr