Template Engine

MVC 패턴 개요
>## MVC 패턴 개요
@WebServlet("/hello-world")
public class HelloWorldServlet extends HttpServlet {
// User 저장소
private UserRepository repository = new UserRepository();
public HelloWorldServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
try {
// 비지니스 로직을 처리하는 코드
// 파라미터 조회
String userIdParam = request.getParameter("userId");
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>조회한 회원의 정보: " + userInfo + "</div>");
// 화면을 그리는 코드 END
} catch (NumberFormatException e) {
// parsing 에러가 발생한 경우
out.println("<div>Invalid user ID format</div>");
} finally {
out.close();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Servlet 동작순서


1.사용자가 Client(브라우저)를 통해 Request 즉, API요청을 한다.
2.요청을 받은 Servlet 컨테이너는 HttpServletRequest,HttpServletResponse 객체를 생성한다.
3.설정된 정보(URL,HTTP Method)를 통해 어떤 Servlet에 대한 요청인지 찾는다.
4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet() 혹은doPost() 등의 메서드를 호출한다.
5. 서버에서 응답을 생성한 뒤 HttpServletResponse객체에 응답을 담아 Client(브라우저)에 반환한다.
6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse객체를 소멸한다.
<%@ 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 구조

MVC 패턴 구조
Controller
Model
View
-화면에 수정이 발생하면 화면(View)만 수정하고 로직에수정이 발생하면 로직만 수정하면 된다.
MVC 패턴의 문제점
MVC 패턴을 적용 후 View의 역할은 필요한 데이터를 Model 에서 참조하여 화면을 그리는 역할만 수행하면 된다. 하지만 Controller에 해당하는 부분은 여전히 문제를 가지고 있다.

dispatcher.forward(request, response) View로 이동하는 forward가 항상 중복 호출된다.
String path= “/WEB-INF/views/new-form.jsp” View의 path를 입력(중복 작업)한다.
HttpServletResponse 객체를 사용하는 경우가 적다. (JSP에서 모두 해결하기 때문)
공통 기능이 추가될수록 Controller에서 처리해야 하는 부분들이 많아진다.
공통 기능 처리
모든 컨트롤러에서 공통으로 적용되는 기능을 뜻한다.
ex) Log 출력, 인증, 인가 등

프론트 컨트롤러 패턴
Servlet(Controller)이 호출되기 전에 공통 기능을 하나의 Servlet에서 처리해주는 패턴이다. 프론트 컨트롤러(Servlet) 하나에 모든 클라이언트측 요청이 들어온다.
->프론트 컨트롤러에서 공통기능을 처리한다.
프론트 컨트롤러 패턴 구조

프론트 컨트롤러의 역할
HttpServlet을 상속받거나, @WebServlet을 사용하지 않아도 된다.프론트 컨트롤러 의문점

어댑터 패턴
다양한 컨트롤러(Handler)를 유연하게 만들기위해 어댑터 패턴을 도입하게 되었다. 컨트롤러들은 동일한 인터페이스를 구현하도록 하고 해당 인터페이스와 공통 로직 사이에 어댑터를 두어 유연하게 만든다. 서로 다른 인터페이스를 갖는 두 클래스를 연결해주는 패턴이다.

어댑터 패턴 장점
요약