MVC 개요
MVC라는게 나오기 전에 개발은 Servlet과 JSP만으로 개발을 햇는데 Servlet이란 java안에 html코드를 넣는 방식이다.
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">전송</button>\n" +
"</form>\n" +
"</body>\n" +
"</html>\n");
}
위의 코드가 Servlet으로 화면을 만든 모습이다. 위의 코드는 아무것도 없이 단순히 폼만의 기능을 갖고 잇는 페이지 이지만 이 안에 많은 객체들과 import해야하는 기능들 DB연결에 SQL까지 들어온다면 매우 어려워질 것이다. 그래서 다음으로 나온 것이 JSP방식이다. JSP는 반대로 html코드 안에 java를 넣는 방식이다.
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response 사용 가능
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("save.jsp");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
%>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
성공
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
위의 코드는 JSP방식으로 폼에서 넘어온 데이터를 가져와 저장하고 그 결과 값을 화면에 보여주는 jsp파일이다.
물론 위의 servlet방식보다는 간단하지만 이방식 역시 하나의 jsp파일안에 기능들이 추가가 되고 로직이나 DB,SQL등이 들어오게 된다면 하나의 jsp파일이 너무 많은 기능들을 하게 된다. 위에는 로직 아래는 뷰의 기능을 하는 것이다. 이역시 하나의 파일안에 너무 많은양의 코드들이 들어오게 되고 개발뿐만 아니라 유지보수에도 많은 고난이 생길 것이다.
그래서 만들어진 방식이 MVC방식이다.
Model View Controller의 약자인 MVC는 지금까지 학습한 하나의 서블릿이나, JSP로 처리하던 것을 Controller와 View라는 영역으로 서로 역할을 나눈 것을 말한다.
- Controller : HTTP 요청을 받아서 파라미터를 검증하고, 비지니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- Model : 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비지니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
- View : 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다.
※ 컨트롤러에 비지니스 로직을 둘 수도 잇지만, 이렇게 되면 컨트롤러가 너무 많은 역할을 담당한다. 그래서 일반적으로 비지니스 로직은 서비스(Service)라는 계층을 별도로 만들어서 처리한다. 그리고 컨트롤러는 비지니스 로직이 있는 서비르를 호출하는 담당이다. 참고로 비지니스 로직을 변경하면 비지니스 로직을 호출하는 컨트롤러의 코드도 변결될 수 있다.