FrameWork/Spring

MVC Pattern

jheaon 2024. 5. 14. 12:26

 

오늘은 Spring MVC 패턴에 대해 알아보고자 한다. 

 


 

 

목차
1.Spring MVC
1.1.DispatcherServlet
1.2.Front Controller
1.3.Controller

Spring MVC

흔히 말하는 MVC 패턴이란 Model-Veiw-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나를 의미한다. 

 

 

 

  • Model : 데이터와 비즈니스 로직을 담당하며, 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행한다. 
  • View : 사용자 인터페이스를 담당한다. 사용자가 보는 화면과 버튼, 폼 디자인을 하고 구현한다. 
  • Controller : Model과 View 사이의 상호작용을 조정하고 제어한다. 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다. 

여기서 Spring Web MVC는 Servlet API기반으로 구축된 웹 프레임워크로 중앙에 있는 DispatcherServlet이 요청을 처리하는 식으로 실행된다. 

 

 

 

 

 

DispatcherServlet

Dispatcher(파견자) + Servlet(자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양)을 합친 말이다. 사용자가 HTTP API을 요청했을 때 서버의 서블릿은 다음과 같이 동작한다. 

 

  1. 사용자가 HTTP API 요청을 한다. (Request)
  2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
    (해당 객체들은 HTTP 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체이다. )
  3. 설정된 정보를 통해 어떤 Servlet에 대한 요청인지 찾는다.
  4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 메소드에 따라 doGet, doPost등의 메서드들을 호출한다. 
  5. 호출한 메서드들의 결과를 반환 혹은 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 담아 반환한다. 
  6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸한다. 

 

 

 

Front Controller

앞서 언급한 API요청을 본다면, 서블릿의 동작 방식에 맞춰 구현해야 하고 이를 통해 수많은 Servlet클래스를 구현하여야 한다. 따라서 Spring은 이런 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API을 처리하는데 해당 방식은 아래와 같다. 

 

 

1. 클라이언트에게 요청이 들어오면 DispatcherServelt 객체가 요청 및 분석을 진행한다. 

2. DispatcherServelt 객체는 분석한 데이터를 토대로 Handlermapping을 통해 Controller을 찾아 요청을 전달한다. 

GET /api/hello → HelloController 의 hello() 함수
GET /user/login → UserController 의 login() 함수
GET /user/signup → UserController 의 signup() 함수
POST /user/signup → UserController 의 registerUser() 함수

 

Handler mapping 에는 API path 와 Controller 메서드가 매칭되어 있다.

@RestController
public class HelloController {
    @GetMapping("/api/hello")
    public String hello() {
        return "Hello World!";
    }
}

 

API path 즉, URL을 Controller에 작성하는 방법은 @Contoller 에너테이션이 달려있는 클래스를 생성한 뒤 @GetMapping 처럼 요청한 HTTP Method와 일치하는 애너테이션을 추가한 메서드를 구현한다. 이렇게 하면 직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP요청을 처리 할 수있게 된다. 

 

3. Controller -> DispatcherServlet : 해당 컨트롤러는 요청에 대한 처리를 완료 후 처리에 대한 결과를 모델과 뷰에 정보를 전달한다.

4. DispathcerServlet -> Client : ViewResolver을 통해 View에 모델을 적용하여 뷰를 클라이언트 응답으로 전달한다. 

 

 

 

 

Controller

MVC Pattern에 대해 알아보면서 DispatcherServlet이 어떻에 요청을 처리하는 지에 대해 알아봤다. 그 중에 DispatcherServelet이 Front Controller 패턴을 적용하여 사용되고 있었는데 만약 해당 패턴이 적용되어 있지 않다면 어떻에 구현 될까?

 

예를 들어. 회원관리 API을 만든다고 가정한다. 

 

Front Conroller 패턴을 적용하지 않는다면, 각 요청을 처리하는 Servlet 클래스를 만들어 관리해야 한다. 

@WebServlet(urlPatterns = "/user/login")
public class UserLoginServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}

@WebServlet(urlPatterns = "/user/logout")
public class UserLogoutServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}

@WebServlet(urlPatterns = "/user/signup")
public class UserSingUpServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

	@Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

}

 

4개의 API을 처리하기 위해 3개의 클래스를 만들어야 한다. 만약에 Front Controller 패턴을 적용하게 되면 어떻에 될까? 이는 아래와 같이 구현이 가능하다. 

@Controller // 컨트롤러로 등록한다. 
@RequestMapping("/user") // API path /user로 요청들어온 것을 처리한다. 
public class UserController {
	@GetMapping("/login") // API path /login으로 HTTP GET메서드로 들어온 요청을 처리한다.
	public String login() {
	    // ...
	}

  	@GetMapping("/logout")
  	public String logout() {
     	 // ...
 	}

	@GetMapping("/signup")
	public String signup() { 
		// ... 
	}
	
	@PostMapping("/signup")
  	public String registerUser(SignupRequestDto requestDto) {
		// ... 
	}
}

 

해당 방법처럼 구현을 하게 되면 다음과 같은 장점을 지닌다.

  • API 마다 파일(클래스)를 만들 필요가 없다. 
  • 유사한 성격의 API를 하나의 Controller로 관리하여 관리가 용이하다. 

'FrameWork > Spring' 카테고리의 다른 글

IoC, DI 컨테이너  (0) 2024.05.27
Thymeleaf  (0) 2024.05.21
JDBC (내용 추가 예정)  (0) 2024.05.20
Controller  (0) 2024.05.16
[Spring] Spring boot 프로젝트 생성하기  (1) 2023.06.23

'FrameWork/Spring'의 다른글

  • 현재글 MVC Pattern

관련글