✅ MVC 패턴이란?
- 하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역 으로 나눈것이다.
✅ MVC 패턴이 나온 이유
- Servlet이나 JSP만으로 비지니스 로직과 View Rendering 까지 모두 처리 하면 너무 많은 역할을 하게 되고 유지보수가 굉장히 어려워져서 고안된 패턴이다.
- Web Application은 일반적으로 MVC(Model View Controller) 패턴을 사용한다.
♐ 방법 1. Servlet 예시
- 예를 들어, Servlet 에 모든 코드를 넣게 되면 아래의 코드와 같이 가독성과 재사용성이 굉장히 떨어지게 된다.
더보기
@WebServlet("/hello-world")
public class HelloWorldServlet extends HttpServlet {
// User 저장소
private UserRepository repository = new UserReposito
public HelloWorldServlet() {
super();
}
protected void doGet(HttpServletRequest request, Htt
throws ServletException, IOException {
Spring 입문 - 3주차 4
response.setContentType("text/html;charset=utf-8
PrintWriter out = response.getWriter();
try {
// 비지니스 로직을 처리하는 코드
// 파라미터 조회
String userIdParam = request.getParameter("u
Long userId = null;
if (userIdParam != null) {
userId = Long.parseLong(userIdParam);
}
// 회원 조회
String userInfo = repository.findById(userId
// 화면을 그리는 코드 START
out.println("<h1>Hello World!</h1>");
out.println("<div>조회한 회원의 정보: " + userI
// 화면을 그리는 코드 END
} catch (NumberFormatException e) {
// parsing 에러가 발생한 경우
out.println("<div>Invalid user ID format</di
} finally {
out.close();
}
}
protected void doPost(HttpServletRequest request, Ht
throws ServletException, IOException {
doGet(request, response);
}
}
♐ 방법 2. JSP 로 VIEW 를 분리
- JSP 로 View 부분만 분리하였지만 로직을 처리하는 코드가 아래와 같이 JSP 에 남아있다.
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!-- HTML 코드... -->
<!-- <%...%> 영역에는 Java 코드를 사용할 수 있다. -->
<%
// 게시글 저장소 싱글톤으로 인스턴스 생성
BoardRepository boardRepository = BoardRepository.getInstance();
// 게시글 제목, 내용
String title = request.getParameter("title");
String content = request.getParameter("content");
// 게시글 객체 생성
Board board = new Baord(title, content);
// 게시글 객체 저장
repository.save(board);
%>
<div>
ID : <input type ="text" name = "id" value="<%=id %>">
</div>
<!-- JSP 코드... -->
<!-- HTML 코드... -->
<jsp:forward page="<%=url %>" />
</body>
</html>
♐ Servlet 과 JSP 의 문제점
- Servlet 만 사용하면 View , 비즈니스 로직 모두 한곳에 존재하여 유지보수에 어려움이 생긴다.
- JSP에 View 책임을 분리 햇지만 JSP 안에 여전히 비즈니스 로직이 존재하여 이 또한 유지보수가 어렵다.
✅ MVC 패턴의 구조
♐ Controller 의 역할
- HTTP Request를 전달받아 피라미터를 검증한다.
- Service Layer로 비즈니스 로직을 전달한다.
- DataBase와 상호작용하는 Repository Layer 를 추가한다.
- View 에 전달할 결과를 조회하여 Model 객채에 임시로 저장한다.
♐ Model
- View 에 출력할 Data를 저장하는 객체이다.
- Database 와 접근을 제한하여 View Rending 에만 집중하면 된다. -> 책임 분리
♐ View
- Model 객체에 담겨져 있는 Data를 사용하여 화면을 보여준다.
✅ MVC 패턴의 문제점
- MVC 패턴을 적용 후 View의 역할은 필요한 데이터를 Model 에서 참조하여 화면을 그리는 역할만 수행하면 된다. 하지만 Controller에 해당하는 부분은 여전히 문제를 가지고 있다.
- 프로젝트의 규모가 커지면 공통 기능이 추가될수록 Controller 에서 처리해야하는 부분이 많아진다.
✅ Spring MVC 란?
- MVC 의 단점을 보완하여 프론트 컨트롤러 패턴, 어댑터 패턴이 적용된 구조를 가지고 있다.
✅ Spring MVC 의 구조
DispatcherServlet
1. 클라이언트 HTTP Request를 알맞게 파싱하고 클라이언트에게 알맞은 응 답을 반환
2. 핸들러 목록 정보를 알고있다.
3. 핸들러 어댑터 목록 정보를 알고있다. Spring 입문 - 3주차 33
HandlerAdapter
1. 자신이 처리할 수 있는 Handler인지 확인할 수 있는 기능(Method)이 필 요하다.
2. 프론트 컨트롤러에서 요청을 위임받았을 때 핸들러에게 요청을 지시하는 기 능이 필요하다.
3. return 시 Handler로부터 전달받은 결과를 알맞은 응답으로 변환한다.
Handler
1. 요청에 대한 로직을 수행하는 기능이 필요하다.
♐ 실행 순서
- Client로 부터 HTTP 요청(Request)을 받는다.
- Handler 조회
- Handler Mapping을 통해 요청 URL에 Mapping된 Handler(Controller)를 조회
- Handler를 처리할 Adapter 조회
- Handler를 처리할 수 있는 Handler Adapter를 조회
- Handler Adapter 실행(handle)
- 알맞은 ****어댑터가 존재한다면 ****Handler Adapter에게 요청을 위임한다.
- Handler 실행(호출)
- Handler Adapter가 실제 Handler(Controller)를 호출하여 실행 및 결과 반환
- Model And View 반환(return)
- Handler Adapter는 Handler가 반환 하는 정보를 ModelAndView 객체로 변환하여 반환
- viewResolver 호출(알맞은 View 요청)
- View Resolver를 찾고 실행
- View 반환
- View Resolver는 View의 논리 이름을 물리 이름으로 전환하는 역할을 수행하고 Rendering 역할을 담당하는 View 객체를 반환
- View Rendering
- View를 통해서 View를 Rendering
♐ Spring MVC 구조의 장점
- Spring MVC는 HTTP Request를 처리하는 부분인 Controller, 데이터를 처리해 정제된 데이터를 넣는 Model, 정제된 데이터를 활용해 사용자에게 보여지는 View에 대한 역할 분리를 잘 해놓았다.
- Spring MVC를 사용하면 Model, View, Controller 모두를 인터페이스를 사용해 규격화해놓아 유연하고 확장성 있게 웹 어플리케이션을 설계할 수 있다.
Spring MVC는 웹 어플리케이션을 유연하고 확장 가능하게 만들어준다.
'Spring' 카테고리의 다른 글
[Spring] Annotation (2) | 2025.04.10 |
---|---|
[Spring] Controller 와 RestContoller 의 차이 (0) | 2025.04.10 |
[Spring]HTTP 란? (2) (0) | 2025.03.31 |
[Spring]HTTP 란? (1) (0) | 2025.03.20 |
[Spring]DNS,URI,URL이란? (0) | 2025.03.19 |