-servlet 기반이긴 하지만 한 단계 더 추상화된 수준의 개발 지향
-servlet API없이도 개발이 가능한 수준
-개발자는 Servlet/JSP의 API신경을 쓰지 않고 웹앱 제작
-Servlet/JSP에 대해 내부적으로 Spring MVC가 처리한다.
스프링 MVC의 기본흐름
(밑에 모든 것은 Bean이다)
(1)DispatcherServlet > (2)HandlerMapping >
(요청이 들어오면 해당 매핑에 관련된 Controller를 찾아야한다고 알려준다.)DispatcherServlet > (3)HandlerAdapter > (4)Controller > HandlerAdapter >
(지시된 Controller와 연결하여 model의 처리결과를 다시 넘겨준다.)DispatcherServlet > (5)Viewresolver > DispatcherServlet >
(6)View > DispatcherServlet
(모델을 어떻게 View를 만들어야하는지 Viewresolver에게 물어보고 알려주면 해당 View를 응답한다.)
Web 3계층
(1) Presentation(표현) - 화면을 만들어 내는 계층
- Spring MVC framework
- User-defined Controller (@Controller), JSP
(2) Business (== Service) - 핵심 비지니스로직 수행 및 Model 생성
- @Service 서비스 객체가 해당
- 핵심 비지니스로직 수행 및 Model 생성
(3) Persistence(== DAO) - Database 조작
- @Repository DAO객체가 해당
- 대신, MyBatis's Mapper Interface 로 단방에 구현("자동실행규칙"필요)
@Controller – 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
<component-scan>
과 같이 활용
@RequestMapping – 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리
알아본 점
(1)@Controller는 bean추가해주는 기능까지 해준다.
(2)@RequestMapping 안에서 요청방식을 정하기도 하지만 @GetMapping/@PostMapping 등 어노테이션 따로 정의
(3)return 타입이 void 일 때 반환되는 view 이름은 Request URI뷰의 이름 반환
// 기본적으로 Spring beans container에 등록될 클래스는 자바빈즈 규약을 지키는 "자바빈즈" 클래스이다.
@NoArgsConstructor
@Log4j2
//전체요청 URI == BaseURI + Detail URI
@RequestMapping("/board/")
@Controller // 현재의 클래스의 역할: Controller 정의
public class SempleController {
//컨트롤러에 선언되는 메소드 => 컨트롤러의 핸들러라고 부른다.
// 그럼 무엇을 핸들링하느냐 => 특정 request를 처리한다(handling)는 의미
// (1) 어떤 전송방식 (2) 어떤 Request URI를 가지고 들어온 Request를 처리하겠다 라는 의미
// 위의 2가지 정보를 설정하는 어노테이션이 바로 @RequestMapping이다.
@RequestMapping(
path={"/doA" ,"/doB"},
method= {RequestMethod.GET , RequestMethod.POST})
public void doA() {
log.trace("doA() invoked");
}// doA
// @RequestMapping("") // Request URI = BaseURI + Detail URI => "/board/" + "" => /board/
@RequestMapping //Request URI = BaseURI + Detail URI => "/board/" => /board/
public void basic() {
log.trace("basic() invoked.");
// return type이 void 일 경우 Request URI 뷰의 반환이름이 된다.
// 반환되는 뷰의 이름 = Request URI when return type is void
}// basic
// @RequestMapping(path="/basicOnlyGet",method=RequestMethod.GET)
// 각각의 매핑어노테이션이 다 존재한다.
@GetMapping("/basicOnlyGet")
public void basicOnlyGet() {
log.trace("basicOnlyGet() invoked.");
}// basicOnlyGet
@PostMapping("/basicOnlyPost")
public void basicOnlyPost() {
log.trace("basicOnlyPost() invoked.");
}// basicOnlyGet
// 컨트롤러의 핸들러는 아래의 역할 및 값을 반환:
// 1. 역할 : 요청을 위임받아 처리
// 2. 뷰의 이름을 반환
// 3. 역할에 따라, 요청을 위임처리한 결과 => Model(비즈니스 데이터)을 생성 및 View로 전달
@GetMapping("/ex01")
public String ex01() {
log.trace("ex01() invoked.");
// View Resolver의 설정에 따라
// Prefix +ViewName + Suffix = /WEB-INF/views/ + /ex01 + .jsp
return "ex01"; // MVC패턴에서 , View의 이름
}// basicOnlyGet
}// end class