본문 바로가기
Spring

스프링 MVC에 대한 간단 정리

by khds 2022. 2. 9.

스프링 프레임워크로 웹 개발을 하면서 많이 본 용어는 스프링 MVC라는 용어이다. 스프링 프로젝트를 생성할 때 spring web라는 라이브러리를 추가했었는데 spring mvc를 사용할 수 있도록 하는 것이라고 한다. 그저 프로젝트를 생성할 때 자동으로 쓰는 것이었지만 도대체 이 spring mvc라는 것은 무엇인지 확실히 알아보고자 한다.
이 글에서는 '코드로 배우는 웹 프로젝트 - 구멍가게 코딩단'을 읽고 스프링 MVC에 대해 간단하게 정리하여 쓴 글이다.
 
 
우선 가장 기억해야 할 점은 스프링 MVC가 스프링의 서브 프로젝트라는 점이다. 스프링은 하나의 기능을 위해서만 만들어진 프레임워크가 아니라 '코어'라고 할 수 있는 프레임워크에 여러 서브 프로젝트를 결합해서 다양한 상황에 대처할 수 있도록 개발되었다. 즉, 스프링은 웹 애플리케이션을 위해서만 개발된 것이 아니기 때문에 달라지는 영역에 따라 완전히 분리하고 연동하는 방식으로 구현되어 있다. 여기서 스프링 MVC는 웹 관련 기능을 수월하기 위한 스프링의 서브 프로젝트이다.
 
 
여기서 웹 프로젝트의 구성에 대해 간단히 설명하지면 일반적으로 웹 프로젝트는 3-tier 방식으로 구성한다.
 
Presentation tier, Business tier, Persistence tier 이렇게 세 가지이다.
 

Presentation tier(화면 계층)는 화면에 보여주는 기술을 사용하는 영역이다.  Servlet/JSP나 스프링 MVC가 담당하는 영역이다. 
 
Business tier(비즈니스 계층)는 순수한 비즈니스 로직을 담고 있는 영역이다. 이 영역이 중요한 이유는 고객이 원하는 요구 사항을 반영하는 계층이기 때문이다. 주로 'xxxService'와 같은 이름으로 구성하고, 메서드의 이름 역시 고객들이 사용하는 용어를 그대로 사용하는 것이 좋다. Spring Core 부분이며 POJO의 영역이다. 스프링의 의존성 주입을 통해서 객체 간의 연관구조를 완성해서 사용한다.
 
Peisistence tier(영속 계층, 데이터 계층)는 데이터를 어떤 방식으로 보관하고, 사용하는가에 대한 설계가 들어가는 계층이다. 일반적으로 데이터베이스를 많이 이용하지만, 경우에 따라 네트워크 호출이나 원격 호출 등의 기술이 접목될 수 있다. 자주 사용하는 것은 Mybatis이다.
 
 
Java를 이용하는 웹 애플리케이션 중 Servlet/JSP 기술을 들어봤을 것이다. jsp를 먼저 배우고 스프링을 배울 수 있지만 스프링을 먼저 배워도 괜찮다고들 한다. 하지만 스프링 MVC를 사용한다는 것은 selvlet 기술을 사용하고 있다는 것을 알아두어야 한다.
Servlet/JSP에서는 HttpServletRequest/HttpSevletResponse라는 타입의 객체를 이용해 브라우저에서 전송한 정보를 처리하는 방식이다. 스프링 MVC의 경우 이 위에 하나의 계층을 더한 형태이다.
 
 
스프링 MVC의 Controller는 아래와 같은 특징을 같는다.

  • HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
  • 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
  • GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
  • 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능

 
 

출처: https://techhan.github.io/study/spring-08/

 
스프링 MVC를 이용하게 되면 개발자들은 직접적으로 HttpServletRequest/HttpServletResponse 등과 같이 Servlet/JSP의 API를 사용할 필요가 없어진다. 스프링은 중간 연결 역할을 하기 때문에 이러한 코드를 작성하지 않아도 되는 것이다. 
 
위와 같이 스프링 MVC 역시 내부적으로 Servlet API를 활용한다. 스프링 MVC는 '모델 2'라는 구조인데 쉽게 말해서 '로직과 화면을 분리'하는 스타일의 개발 방식이다.
 

모델 2 방식

 
모델 2 방식에서 사용자의 Request는 특별한 상황이 아닌 이상 먼저 Controller를 호출하게 된다. 이렇게 설계하는 가장 큰 이유는 나중에 View를 수정하여도 사용자가 호출하는 URL 자체에는 아무 변화가 없게 하기 위해서이다. 컨트롤러는 데이터를 처리하는 존재로 데이터(Model)를 처리하고 View로 Response를 위한 데이터를 넘겨주게 된다. Servlet를 이용하는 경우 개발자들은 Servlet API의 RequestDispatcher 등을 이용해서 이를 직접 처리해 왔지만 스프링 MVC는 내부에서 이러한 처리를 하고, 개발자들은 스프링 MVC의 API를 이용해서 코드를 작성하면 된다.
 
아래는 스프링 MVC의 기본 구조이다.
 

출처: https://techhan.github.io/study/spring-08/

 
 
 
1. 스프링 MVC에서 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해서 처리한다. Front-Controller는 주로 서블릿 컨테이너의 가장 앞단에서 클라이언트가 서버로 전달하는 모든 요청을 받아서 처리해주는 컨트롤러인데 이로 인하여 각각의 요청이 오면 URL에 따라 구분하는 것이 아니라 하나의 서블릿으로 받고 해당되는 컨트롤러에 요청을 위임해주는 것이다. 
 
2,3. HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해 존재한다. @RequestMapping가 적용된 것을 기준으로 판단하고 HandlerAdapter를 이용하여 찾은 컨트롤러를 동작시킨다.
 
4. Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성한다. 이때 View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아서 전달한다. Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용하게 된다. 
 
5. ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋은지 해석하는 역할이다. 흔히 jsp를 사용할 때 prefix를 'WEB-INF/views'로 하고 suffix를 'jsp'로 로 설정하는 것이다.
 
6,7. View는 실제 응답 보내야 하는 데이터를 Jsp 등을 이용해서 생성하는 역할을 한다. 만들어진 응답은 DispatcherServlet을 통해서 전송된다. 
 
 
 
참고
https://m.blog.naver.com/zzang9ha/221846757385

[Spring] - 스프링 MVC (2) 기본 사상

스프링 MVC의 기본 사상 - Model , View , Controller Java를 이용하는 웹 애플리케이션을 제작해봤...

blog.naver.com

 
https://techhan.github.io/study/spring-08/

[spring] 스프링 MVC의 기본 구조

코드로 배우는 스프링 웹 프로젝트

techhan.github.io

 
코드로 배우는 스프링 웹 프로젝트 - 구멍가게 코딩단