MVC패턴
- MVC 패턴은 Model-View-Controller 의 약어로 주로 GUI 기반의 애플리케이션 개발에 사용된 디자인 패턴이다. 지금은 백엔드 기반의 웹 애플리케이션 개발의 기본 모델이 되었으며 모바일 앱 및 프론트엔드 기반 웹 애플리케이션 개발이 늘어나면서 MVP(Model-View-Presenter), MVVM(Model-View-ViewModel)과 같은 패턴들도 널리 사용되고 있다.
- 모델(Model)
- 데이터를 처리하는 영역
- 모델은 앱이 포함해야할 데이터가 무엇인지를 정의
- 데이터의 상태가 변경되면 모델을 일반적으로 뷰에게 알리며(따라서 필요한대로 화면을 변경할 수 있다) 가끔 컨트롤러에게 알리기도 한다.(업데이트된 뷰를 제거하기 위해 다른 로직이 필요한 경우).
- 실제 구현에는 데이터베이스와 연동을 위한 DAO(Data Access Object) 클래스와 데이터 구조를 표현하는 DO(Data Object, Entity 라고도 함)클래스로 구성
- 뷰나 컨트롤러에 독립적인 구조로 데이터베이스 처리를 필요로 하는 여러 애플리케이션에서 공유가 가능하며 웹 애플리케이션이 아닌 경우에도 사용할 수 있는 형태
- 효과적인 DB연동 구현을 위해 JPA(Java Persistance API)를 사용하는 경우 DAO는 생략 되거나 구현 범위가 축소될 수 있다.
- 뷰(View)
- 화면을 담당하는 부분(앱의 데이터를 보여주는 방식)
- JSP가 여기에 해당되며 EL, JSTL을 사용해 컨트롤러로 부터 전달된 데이터의 출력과 HTML, css등을 통해 화면 디자인을 처리 한다.
- 기본적으로 모델, 컨트롤러와의 종속성이 없도록 구현해야 한다.
- MVC패턴으로 역할이 명확하게 분리되면 뷰 구현기술이 꼭 JSP가 될 필요는 없다.
- 컨트롤러(Controller)
- MVC 패턴의 핵심으로 모든 사용자 요청의 중심에 위치
- 사용자 요청은 기본적으로 특정 뷰로 바로 가는 것이 아니라 컨트롤러를 통해야 한다.
- 컨트롤러는 앱의 사용자로부터의 입력에 대한 응답으로 모델 및/또는 뷰를 업데이트하는 로직을 포함
- 컨트롤러는 사용자 요청에 따라 모델을 이용해 데이터베이스 연동을 처리하고 뷰에 전달
- 뷰 전달을 위해서는 데이터가 들어있는 DO 혹은 List<DO> 형태의 객체를 request에 저장후 뷰로 포워딩 하는 구조를 가진다.
- 컨트롤러는 특정 뷰를 지정해야 하기 때문에 뷰와 종속관계가 발생할 수 밖에 없는 구조
- 규모가 커질수록 컨트롤러가 복잡해지고 관리가 어렵다는 문제가 있다.
- 컨트롤러 구현은 JSP, Servlet 모두 가능하며 간단한 기능의 구현에는 JSP가 유리한 부분이 많이 있지만 규모와 향후 스프링프레임워크로의 확장등을 생각한다면 Servlet기반의 구현이 권장된다.
- 컨트롤러를 구현할때 사용자 요청마다 컨트롤러를 만들수도 있고(예를들어 loginForm.html -> LoginController -> main.jsp) 특정 모듈 단위(예를들어 ShopController, MemberController)로 하나의 컨트롤러 안에서 여러 요청 단위(로그인, 회원가입, 정보수정등)를 구분해 처리하는 것도 가능하다.
- 또한 프론트컨트롤러를 따로 두어 요청에 따른 컨트롤러를 호출할 수 있도록 구성할수도 있다.
- 웹에서의 MVC
- 웹의 초창기에, MVC 구조는 클라이언트가 폼이나 링크를 통해 업데이트를 요청하거나 업데이트된 뷰를 받아 다시 브라우저에 표시하기 위해 대부분 서버 사이드에서 구현되었습니다. 반면, 요즘에는, 클라이언트 사이드 데이터 저장소의 출현과 필요에 따라 페이지의 일부만 업데이트를 허용하는 XMLHttpRequest 를 포함해 더 많은 로직이 클라이언트 사이드에 추가되었습니다.
- 스프링에서의 MVC
- 입력,처리하는 부분 - C
- 처리된 결과를 웹 등에 표시하는 부분 -V
- C->V 로 데이터를 넘기기 위해 필요한 부분, 처리결과를 모델에 저장- M
- Model객체를 컨트롤러에 받아서 모델 객체에 add로 값을 저장한다.
- 그리고 컨트롤러 마지막에 (또는 상황에 맞게) return을 jsp(view)를 리턴한다. (상황마다 다른 view를 보여주게 설계할 수도 있다.)
- view(jsp)에서는 html로 작성을 하고 EL(expression language)로 표현하여 보여줄 화면을 만들어 놓는다.
- 아래 예시 코드는 설명하기 위한 것 실제에서는 @Request~ 등의 다른 방법들을 씀
@Controller
public class YoilTellerMVC {
@RequestMapping("/getYoilMVC") // http://localhost/ch2/getYoilMVC
public String main(int year, int month, int day, Model model) {
// 1. 유효성 검사
if(!isValid(year, month, day))
return "yoilError"; // 유효하지 않으면, /WEB-INF/views/yoilError.jsp로 이동
// 2. 처리
char yoil = getYoil(year, month, day);
// 3. Model에 작업 결과 저장
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
model.addAttribute("yoil", yoil);
// 4. 작업 결과를 보여줄 View의 이름을 반환
return "yoil"; // /WEB-INF/views/yoil.jsp
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
private boolean isValid(int year, int month, int day) {
if(year==-1 || month==-1 || day==-1)
return false;
return (1<=month && month<=12) && (1<=day && day<=31); // 간단히 체크
}
}
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>YoilTellerMVC</title>
</head>
<body>
<h1>${year}년 ${month}월 ${day}일은 ${yoil}요일입니다.</h1>
</body>
</html>
jsp관련 https://ryuhojin.tistory.com/18
참고:https://dinfree.com/lecture/backend/javaweb_3.1.html, https://developer.mozilla.org/ko/docs/Glossary/MVC
'I leaned > 스프링,스프링부트' 카테고리의 다른 글
OOP 5대 설계원칙 - SOLID (0) | 2023.05.17 |
---|---|
Eclipse(STS)와 IntelliJ (0) | 2023.05.10 |
톰캣 (0) | 2023.05.10 |
클라이언트와 서버 (0) | 2023.05.10 |
Http 요청과 응답- HttpServletRequest/Response (0) | 2023.05.10 |