Spring MVC패턴
처음 공부할 때 이런 그림을 보고 이게 무엇인가.. 어떻게 동작되는 건지..
참 머리 아파서 보지도 않고 휙 지나가고 했습니다.
MVC의 구조 를 보면
1. WAS에서 HTTP 요청을 하면 Dispatcher Servlet 이 요청을 받습니다.
2. Dispatcher Servlet 은 요청된 URL을 HandlerMapping에 객체에 넘기고 호출해야 할 컨트롤러 메서드 정보를 얻습니다.
-(핸들러 매핑에서 컨트롤러를 찾을 수 있어야 합니다. - 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요)
@Component("/asdas/asdasd") <- Component사용 시 () 가로 안의 있는 문자가 url주소 사실상 이제 쓰지 않음
HandlerMapping : 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용합니다.
BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾습니다 [localhost:8080/url] <- /url 을 말합니다.
3. Dispatcher Servlet이 HandlerAdapter 객체를 가져옵니다.
4. HandlerAdapter 객체의 메서드를 실행합니다.
-(핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요! - 스프링이 이미 구현 해두었음.)
컨트롤러가 실행 시 안에 있는 내부 로직이 실행되는데 데이터 베이스 에접근시 Service -> Repository -> DB의 구조를 거치면서 데이터를 가져와 Model에 담아서 뷰에 보내줌 (ModelAndView)
5. 핸들러 어댑터에서 ModelAndView를 Dispatcher Servlet으로 반환해 줍니다.
6. Dispatcher Servlet에서 ViewResolver를 호출해 줍니다. viewResolver에서 View를 Dispatcher Servlet에 반환 줍니다.
7. Dispatcher Servlet에서 render(Model)를 담아 View에 던져주고 View에서 HTML로 응답해 줍니다.
간단하게 보면 클라이언트에서 어떤 url 요청을 했을 시 @Controller가 붙여진 클래스를 찾아봅니다.
그 클래스에서 GetMapping or PostMapping를 보고 Get요청 시에 @GetMapping가 붙은 url 주로가 실행되고
post요청 시 @PostMapping 안에 있는 url 주소가 실행됩니다. GetMapping와 PostMapping의 url 주소가 같아도 괜찮습니다.
@GetMapping("/add") @PostMapping("/add")를 해도 요청에( ex) 조회=Get, 등록, 수정=Post) 따라
알아서 실행시켜 줍니다.
그리고 그 어노테이션 밑에 있는 로직이 실행되는데 그 안에 데이터베이스에 접근하는 로직이 있으면 그 로직으로 데이터베이스에 접근해서 데이터를 가져오고 그 데이터를 Model에 담아 View에 보여줄 수 있습니다.
// 회원 마이페이지
@GetMapping("/myPage")
public String myPage(HttpServletRequest request,
Model model) {
log.info("==== user myPage ====>");
UserVO user = (UserVO) request.getSession().getAttribute(SessionConst.LOGIN_USER);
model.addAttribute("user", user);
return "user/myPage";
}
간단 하게 보면 위에 코드는 예전에 작성한것입니다.
localhost80800:/myPage/가입된유저인덱스 로 요청을 하면
회원가입을 위해사용한 User라는 객체에 있는 정보를 Model에 담아서
user폴더안에있는 myPage라는 html or jsp 파일에 표출시켜줍니다.
위에 코드는 전에 작성한 코드인데 생각해보면 이미 세션에 로그인한 아이디를 넣어 주었기 때문에
그대로 model에 담아서 뷰와 같이 반환시켜주면 마이페이지에서 user의 관한 정보를 볼수있습니다.
1. url 주소를 입력한다.
2. Controller 어노테이션을 사용한 Class 안에 url 요청 주소에 맞는 로직이 실행된다.
3. 그저 보여주기만 할 수도 있고 데이터베이스 안에 있는 데이터를 가져다 Model에 담아서 보낼수도 있다.
4. 데이터가 없다면 만들어진 Html 화면을 응답해 주고 데이터가 있다면 그 화면 안에 데이터를 넣어서 보여준다.