Spring/MVC

스프링 MVC 1편 (2) - MVC 패턴

ummchicken 2022. 12. 30. 14:10

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

 

내가 보려고 씀

 

 


 

섹션 3. 서블릿, JSP, MVC 패턴

 

MVC 패턴 - 개요

Model View Controller

웹 애플리케이션은 보통 이 MVC 패턴을 사용

 

 

컨트롤러

HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 
그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.

 

 

모델

뷰에 출력할 데이터를 담아둔다.

뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에
뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고,
화면을 렌더링 하는 일에 집중할 수 있다.

 

 

모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다.

여기서는 HTML을 생성하는 부분을 말한다.

 

 

※ 참고

컨트롤러에 비즈니스 로직을 둘 수도 있지만, 이렇게 되면 컨트롤러가 너무 많은 역할을 담당한다.

그래서 일반적으로 비즈니스 로직은 서비스(Service)라는 계층을 별도로 만들어서 처리한다

그리고 컨트롤러비즈니스 로직이 있는 서비스를 호출하는 역할.

 

 

MVC 패턴 2

 

 


 

MVC 패턴 - 적용

 

redirect

리다이렉트는 실제 클라이언트(웹 브라우저)에 응답이 나갔다가, 
클라이언트가 redirect 경로로 다시 요청한다. 
따라서 클라이언트가 인지할 수 있고, URL 경로도 실제로 변경된다.

 

 


 

MVC 패턴 - 한계

 

정리하면 공통 처리가 어렵다는 문제가 있다.

프론트 컨트롤러(Front Controller) 패턴을 도입하면 이런 문제를 깔끔하게 해결할 수 있다.

스프링 MVC의 핵심도 바로 이 프론트 컨트롤러에 있다.

 

 


 

섹션 4. MVC 프레임워크 만들기

 

프론트 컨트롤러 패턴 소개

스프링 웹 MVC와 프론트 컨트롤러

스프링 웹 MVC의 핵심도 바로 FrontController
스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있음

 

 


 

섹션 5. 스프링 MVC - 구조 이해

 

스프링 MVC - 시작하기

@RequestMapping

  • RequestMappingHandlerMapping
  • RequestMappingHandlerAdapter
지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터

 

 

@Controller

● 스프링이 자동으로 스프링 빈으로 등록한다.
(내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨)

● 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다.

 

 

@RequestMapping

요청 정보를 매핑한다.
해당 URL이 호출되면 이 메서드가 호출된다.
애노테이션을 기반으로 동작하기 때문에, 메서드의 이름은 임의로 지으면 된다.

 

 

ModelAndView

모델과 뷰 정보를 담아서 반환하면 된다.

 

 

RequestMappingHandlerMapping 은 스프링 빈 중에서 

@RequestMapping 또는 @Controller 가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식.

 

 

@RequestParam

스프링은 HTTP 요청 파라미터를 @RequestParam 으로 받을 수 있다.
@RequestParam("username") 은 request.getParameter("username") 와 거의 같은 코드라 생각하면 된다.
물론 GET 쿼리 파라미터, POST Form 방식을 모두 지원한다.

 

 

@RequestMapping → @GetMapping, @PostMapping

@RequestMapping 은 URL만 매칭하는 것이 아니라, HTTP Method도 함께 구분할 수 있다.

예를 들어서 URL이 /new-form 이고, HTTP Method가 GET인 경우를 모두 만족하는 매핑을 하려면 다음과 같이 처리하면 된다.
@RequestMapping(value = "/new-form", method = RequestMethod.GET)

이것을 @GetMapping , @PostMapping 으로 더 편리하게 사용할 수 있다.
참고로 Get, Post, Put, Delete, Patch 모두 애노테이션이 준비되어 있다.