스프링mvc - 구조 이해

meluu_·2024년 1월 5일
0

스프링

목록 보기
12/27
post-thumbnail

🌿 Spring MVC 구조


주요 인터페이스 목록

  • 핸들러 매핑: org.springframework.web.servlet.HandlerMapping
  • 핸들러 어댑터: org.springframework.web.servlet.HandlerAdapter
  • 뷰 리졸버: org.springframework.web.servlet.ViewResolver
  • 뷰: org.springframework.web.servlet.View

확장 가능하나 대부분의 기능은 다 구현되어있다.


✔️ 핸들러 매핑과 핸들러 어댑터


HandlerMapping

0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.

HandlerAdapter

0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처리

핸들러 매핑으로 핸들러 조회
HandlerMapping을 순서대로 실행하여 핸들러 조회 -> 핸들러 반환

핸들러 어댑터 조회
순서대로 supports()를 호출

핸들러 어댑터 실행
1. 디스패처 서블릿이 조회한 어댑터를 실행하면서 핸들러 정보도 함께 넘겨준다.
2. 어댑터는 핸들러를 내부에서 실행 후 결과를 반환한다.


✔️ 뷰 리졸버


스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데,
이때 application.properties 에 등록한 spring.mvc.view.prefix,suffix 설정 정보를 사용해서 등록

스프링부트가 자동 등록하는 뷰 리졸버

1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (: 엑셀 파일 생성 기능
에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
...
  1. 핸들러 어댑터 호출
    • 호출로 논리 뷰 이름 획득
  2. ViewResolver 호출
    • 뷰 이름으로 viewResolver를 순서대로 호출
  3. InternalResourceViewResolver
    • 이 뷰 리졸버는 InternalResourceView를 반환
  4. 뷰 - InternalResourceView
    • JSP처럼 포워드를 호출하여 처리할 수 있는 경우에 사용
  5. view.render()
    • 렌더가 호출되고 InternalResourceView는 forward()를 사용해서 JSP 실행

🌿 실질적인 MVC 시작


@RequestMapping

  • RequestMappingHandlerMapping
  • RequestMappingHandlerAdapter

@Controller

  • 스프링이 자동으로 스프링 빈으로 등록 (내부에 @Component 있어 컴포넌트 스캔 대상)
  • 애노테이션 기반 컨트롤러로 인식

@RequestMapping

  • 요청 정보를 매핑 (애노테이션 기반이기에 메서드 이름 상관 x )

ModelAndView

  • 모델과 뷰 정보를 담아서 반환

✔️ 컨트롤러 클래스를 통합 및 조합

@Controller
@RequestMapping("/spring")

public class SpringMember {
	
    @RequestMapping("/save")
    public ModelAndView save() ...
    
    @RequestMapping("/show")
    public void show()...
    
}

✔️ 실용적인 방식

...
@GetMapping("/members")
public String members(Model model) {
	...
    model.addAttribute("members", members);
    return "members";
}
@PostMapping("/save_member")
public String save_member ( 
							@RequestParam("username") String username,
							@RequestParam("age") int age,
							Model model) {
...
Model.addAttribute("member", member);

return "save_result";
  • Model을 파라미터로 받아 사용
  • ViewName 직접 반환
  • @RequestParam 사용하여 파라미터의 값을 바로 변수에 받는다.
  • @Get,PostMapping -> @RequestMapping(value="", method = RequestMethod.GET) 이런식으로 내부에 추가되어 있기에 가능

🔖 학습내용 출처

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

profile
열심히 살자

0개의 댓글