MVC
- MVC: Model-View-Controller
- Model: application business layer
- business logic 처리 + DB 연동 작업
- Controller: application의 흐름을 관리하는 layer
- View와 Model간의 interface 역할을 함
- View 계층에서 요청을 받고 필요한 유효성 검사를 포함해서 처리함
- 요청은 data 처리를 위해서 Model 계층으로 추가되어서 전달되고, 처리가 되면 data는 Controller로 다시 전송된 후 View에 표시됨
- View: application presentation layer
- UI 형식의 응용 프로그램 출력을 나타냄
- Presentation layer(View)는 controller가 가져온 Model data를 표시하는데 사용됨
기본 설정하기
/WEB-INF/views/index.jsp에서
/WEB-INF/views/ 이 부분을 prefix로 설정하고
.jsp 이 부분을 suffix로 설정해서
return "index"라고만 coding해도 전체 경로를 인식하게 함(servlet-context.xml 파일에서 설정함)
정적 파일 경로 지정하기
HTML에서 사용하는 이미지, 사운드, js, CSS 등 /WebContent/resources에 정적 파일들을 저장함(servlet-context.xml 파일에서 설정함)
pom.xml 설정하기
- xml 파일로 setting하기
- 라이브러리, servlet-api, jsp-api, jstl, spring Web MVC
- WebContent > resources > servlet-context.xml
Java 클래스에서 설정하기
- web.xml: AbstractAnnotationConfigDispatcherServletInitializer를 상속하거나 WebApplicationInitializer 인터페이스를 구현함
- root-context.xml: 상속이 없음
- servlet-context.xml: WebMvcConfigurer 인터페이스를 구현함
- RootAppContext: root-context.xml 역할을 하는 클래스
URL Mapping
- URL: 사용자가 서버에 접속해서 서비스를 받기 위해 입력하는 주소
- 형식:
protocol://domainaddress:portnumber/경로1/경로2/경로3/..
- 프로토콜: server와 client 사이의 통신을 위한 규약(약속)
- domain address(도메인주소): IP 주소를 사람이 알아보기 쉬운 이름을 사용해서 표현함
- port number(포트번호): 1~65535번 까지로 구성된 숫자로, 컴퓨터 내에서 프로그램을 구분하고, 생략하면 80으로 설정됨
경로1/경로2/경로3/..: 하나의 Server에 각 웹 어플리케이션을 구분하기 위해 지정되는 이름으로, 경로1은 project 이름(Context Path라고도 함)이고, 경로2/경로3/.. 은 하위 경로를 뜻함
요청 방식 지정하기
Spring MVC는 요청 주소(URL Pattern)별로 메소드를 정의할 수 있고(@RequestMapping의 value),
같은 요청 주소(URL Pattern)에서 요청방식에 따라서 메서드를 정의할 수 있음(@RequestMapping의 method)
parameter 추출하기
-
HttpServletRequest 사용
- Spring MVC는 필요한 객체나 data는 주입 받아서 사용함
- 객체를 주입(injection) 받는다는 의미: 필요한 클래스의 객체를 Spring Framework가 자동으로 생성해서 필요한 곳에 할당까지 자동으로 해 줌
-
WebRequest 사용
@PathVariable: data가 요청 주소에 있는 경우, 값을 주입 받을 수 있는 Annotation
- Restful API 서버 프로그래밍에서 주로 사용함
요청 주소_(URL)_/값1/값2/값3/..
- cf)
test3(요청주소)?number1=100&number2=200&numbers=300&numbers=400 이렇게 말고
-
@RequestParam
- 파라미터(로 전달된 값)를 직접 주입 받음
- 지정된 변수의 이름과 파라미터의 이름이 같은 경우 값을 주입 받음
- 형변환도 가능함
- value: 파라미터의 이름과 변수의 이름이 다를 경우 파라미터의 이름을 지정함
- required: false로 설정하면 지정된 이름의 파라미터가 없는 경우 null이 주입됨
defaultValue="0"으로 설정하면 지정된 이름의 파라미터가 없는 경우 "0"이 주입됨
-
파라미터 Map으로 객체 주입받기
- Client가 전달하는 모든 parameter data를 한꺼번에 Map으로 전달받음
-
파라미터 List로 객체 주입받기
- 같은 이름으로 2개 이상의 parameter를 전달하면 하나만 받게 될 때
@RequestParam List<String> numbers와 같이 parameter type을 List로 해야 하고, 이때는 parameter 이름에 주의해야 함
- 이때, parameter로 전달된 data를 여러 Bean에서 받아서 처리할 수 있음
@ModelAttribute를 여러 개 나열하면 됨
-
@ModelAttribute
- 객체를 parameter로 주입 받을 수 있음
- 전달하는 객체의 이름(참조변수)과 parameter의 이름을 맞추어 줌
@ModelAttribute 어노테이션은 생략이 가능함
- 이러한 객체를 Command Object라고 함
ViewResolver
- Controller에서 전달받은 View의 이름(Controller 클래스의 메서드의 return 값)을 기반으로 jsp 파일을 찾아서 선택하고 jsp 데이터를 분석해서 응답결과를 만들어서 전달함
- ViewResolver가 사용하는 View의 이름을 지정하는 방법
- jsp를 통해서 응답결과를 만들 때 필요한 data를 전달하는 방법
- HttpServletRequest
- Spring MVC가 jsp를 처리할 때 HttpServletRequest 객체를(자동으로 생성해서) jsp로 전달함
- ViewResolver는 이것을 이용해서 jsp 작업시 data를 사용함
1) 웹브라우저 주소표시줄에 /test1이 표시되면 <- 요청정보 request
2) DispatcherServlet이 요청정보를 받아서 분석해서 Controller를 선택함
3) @GetMapping("/test1")이 있는 메서드를 호출함
4) 이 메서드의 return값으로 지정된 이름의 jsp 파일(View)을 선택함
5) 이 정보를 ViewResolver가 받아서 해당 jsp 파일을 분석함
6) 해당 jsp 파일에 있는 java code나, EL, JSTL 등을 모두 실행시킴
7) 이 결과를 다시 DispatcherServlet으로 전달함
8) 여기서 생성된 정보(html)를 Client로 보내면 <- response
9) Client의 web browser가 이를 rendering해서 화면으로 보여줌
- HttpServletRequest 객체를 주입받는 방법
public String test2(HttpServletRequest request)
request.setAttribute("변수", 값)
- Model 객체를 주입받는 방법
public String test3(Model model)
- Model 객체를 주입 받으면 HttpServletRequest 객체에 담아져서 jsp에 전달할 수 있음
model.addAttribute("변수", 값)
- ModelAndView 객체를 주입받는 방법
public String test4(ModelAndView mv)
- ModelAndView는 Model에 값을 설정하고, View의 이름을 지정까지 할 수 있음
- test4 메서드는 View의 이름을 return 하지 않고 ModelAndView 객체를 return
mv.addObject("변수", 값)
mv.setViewName("View 이름")
- ViewResolver에 의해서 jsp가 실행되고 응답결과가 만들어짐
- Controller에서 View를 지정할 때 ViewResolver가 사용할 data를 Request 영역에 저장함
- Request 영역에 저장한 data를 jsp에서 꺼내서 사용할 때
${requestScope.number1 } 이라는 EL을 사용함
Command Object
- 커맨드 객체 <-- HttpServletRequest 객체에 자동으로 담김
- lient가 전달해 주는 parameter data를 주입받을 때 사용하는 객체
@PostMapping("/test1")
public String test1(@ModelAttribute BeanData bean){
return "";
}