7월 6일
1.MVC Model2 방식을 쓰는 이유
왜? MVC Model2가 유지보수가 좋다고 하는지?
변경에는 돈이 든다. 클라이언트쪽과 서버쪽에 각각 변경을 한다고 했을때 압도적으로 클라이언트쪽 변경이 돈이 많이 든다. 그래서 클라이언트쪽은 변경을 최소화 해야한다.
왜? controller를 따로 분리 했는지?
모델2의 기본사상이 고객의 요구는 controller로 가고 화면은 view로 간다.
controller는 url을 처리한다. url(비즈니스로직 부분)는 고정을 하고싶다. 왜? 클라이언트쪽 변경비용이 커짐
로직은 그대로 두되 화면만 바꾸고 싶음
이러한 요구가 controller 와 view로 나누자 해서 MVC Model2가 나옴
2.xml파일
(1)root-context.xml파일은 스프링 설정에 관한 파일
(2)servlet-context.xml파일은 웹에 관한 설정에 관한 파일
필요시 설정파일을 만들어 추가해줄수도 있음
(3)pom.xml파일은 전체 설정과 쓰고자 하는 라이브러리의 설정할때 필요
(4)web.xml파일은 서블릿과 관련된 설정이다. spring MVC도 서블릿베이스로 이뤄짐
web.xml파일안에는 ContextLoaderListener가 있는데, 해당 프로젝트의 서블릿이 실행이 될때 root-context.xml로 가서 읽어가지고 오는역할이 web.xml파일안에서 제일 중요하다.
크게 흐름을 보자면 해당 프로젝트가 실행이 되면
web.xml파일을 먼저읽고->root-context.xml파일을 읽어서 빈을 생성해주고->두번째로 servlet-context.xml파일을 읽고 빈을 생성해준다음에->아래 그림 같이 빈끼리 관계를 지어준다

3.스프링 MVC의 제일 중요한 기본 뼈대!!!

그림의 파란색 부분은 스프링이 처리해줌, 개발자는 'Controller'와 'jsp및 기타'만 작성해주면 된다.
(1)요청이 들어오면 web.xml로 들어가 DispatcherServlet을 호출
왜?DispatcherServlet 를 꼭 거치는가?
web.xml설정을 보면 아래와 같이 설정되어 있어 모든요구사항은 DispatcherServlet을 거치게 된다.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(2)DispatcherServlet는 servlet-context.xml로 가서->resources mapping으로가서 ->src/main/resourcse 로가서 내가 만들어준 Mapper.xml파일을 뒤져서 mapping에 관련 응답을 준다
(3),(4)DispatcherServlet 는 다시 servlet-context.xml로 가서->
아래 코드를 만나 해당경로로 가서 빈을 등록 해줌
<context:component-scan base-package="com.keduit.controll" />
(4)해당 controller로가서 로직을 처리해 주고 리턴값을 가지고 DispatcherServlet으로 돌아감
(5)DispatcherServlet 는 다시 servlet-context.xml로 가서->InternalResourceViewResolver 로 가서 jsp 파일경로를 만듬
(6)jsp 파일경로로 가서 view를 반환해줌
(7)view를 들고 브라우져에 응답
*Model 은 jsp에 전달하고자 하는 속성과 값을 담는 바구니 같은 역할
Model에 담기 위해서 model.addAttribute("속성명",값)로 넘겨주면
jsp에서 넘겨받아 값을 쓴다.
4.Controller 파라미터
(1)Controller의 기능들
다양한 파라미터를 자동으로 수집가능,
다양한 타입의 메소드 리턴타입,
Get방식과 Post방식을 어노테이션으로 처리,
자유로운 분기가 가능하다.
예를 들어 아래와 같이 분기가 가능하다.
@RequestMapping("/sample/*") //sample로 시작하는 애들 다들어와
public class SampleController{
@RequestMapping("")
public void basic(){
...내용....
}
@GetMapping("/basicGET")//sample로 시작하는데, 'sample/basicGET'경로
public void basicGet(){
...내용....
}
}
(2)Controller 관련 어노테이션
@Controller
이게 있으면 스프링에 빈으로 등록을 해줌
servlet-context.xml파일에 아래와 같이 등록해줘야함
패키지 경로를 등록해주면 스프링이 지정한 패키지경로에서 @Controller를 찾아서 빈으로 등록 해준다.
<context:component-scan base-package="com.keduit.controll" />
@RequestMapping
위에 예시 들어 놓은것처럼 분기할때 쓰인다.
클래스에도 적용이 가능하고 메서드에도 적용이 가능하다.
(3)Controller 파라미터 수집
스프링MVC는 메서드의 파라미터를 자동으로 수집 및 변환하는 기능을 제공한다.
자바빈(VO객체)규칙에 맞게 생성자가 없거나,빈생성자를 가지면서, getter와 setter가 있다.
package com.keduit.sample;
import lombok.Data;
@Data
public class SampleDTO {
private String name;
private int age;
}
아래와 같이 SampleDTO객체를 매개변수로 넣었을때
브라우져에 http://localhost:8080/Sample/ex01?name=jj&age=17
이렇게 값과 함께 주소를 치면 SampleDTO의 setter가 자동으로 파라미터를 수집하여
SampleDTO객체에 저장해준다.
SampleDTO객체는 서블릿의 SampleVO개념으로 보면 됨
package com.keduit.controll;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.keduit.sample.SampleDTO;
import lombok.extern.log4j.Log4j;
@Controller
@RequestMapping("/Sample/*")
@Log4j
public class SampleController {
@GetMapping("/ex01")
public void ex01(SampleDTO dto) {
log.info(dto);
}
}
(4)Model
Model객체는 jsp에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재
서블릿&JSP 방식에서 사용하는 request.setAttribute()와 유사한 역할
근데, 위와 같이 메서드에 매개변수로 사용시 파라미터를 자동으로 수집하는 기능이 있어서 굳이 파라미터를 담아주지 않아도 view까지 넘어간다.
그렇다면 왜? Model이 생겼나??
다른곳에서 발생하는 데이터,즉 나한테 전달된 데이터는 아니지만 필요한 애들
예를들어 서비스계층이나 DB계층에서 데이터를 넘길때
(5)@Model Attribute
넘겨받은 데이터 이름이길때 이름을 재정의해줌
public class SampleController {
@GetMapping("/ex01")
public void ex01(@Model Attribute("sDTO")SampleDTO dto) {
log.info(dto);
}
}
넘겨 받은 데이터이름이 SampleDTO 가 아닌 sDTO로 바껴서 view단에 전달해줌
@Model Attribute를 써주므로써 이거는 화면까지 전달되는 애구나 하고 알수 있음.
(5)Redirect Attribute
화면에 한번만 전달 되는 파라미터를 처리하는 용도
아래와 같이 메서드랑 파라미터 쓰고, return에 보내고자하는 경로 써줌
rttr.addFlashAttribute("name","kimjava");
return "redirect:/경로"
5.Controller 리턴타입
(1)String:분기할때 사용, Redirect 와 같이 많이쓰임(사용자를 어디론가 강제로 이동시킬때 쓰임)
예)로그인 성공시 1번페이지로 이동 실패시 2번 페이지로 이동
@Controller
@RequestMapping("/Sample/*")
@Log4j
public class SampleController {
@GetMapping("/re1")
public String rel() {
log.info("log..........");
return "redirect:/Sample/re2";
}
@GetMapping("/re2")
public void rel2() {
log.info("log2..........");
}
}
(2)void:호출하는 url과 동일한 이름의jsp로 넘어갈때
(3)VO,DTO타입:주로 json타입의 데이터나 순수한 데이터만을 넘길때 사용