[디자인 패턴]
1. 디자인 패턴의 정의
- 설계 문제에 대한 해답을 문서화 하기 위해 고안된 방법
- 소프트웨어 개발과정에서 자주 나타나는 과제를 해결하기 위한 방법
- 패턴은 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해준다.
- 쉽게 말해 디자인패턴은 틀을 잡아주는 것이다.
2. 패턴 사용시 주의 사항
- 디자인 패턴은 일반적으로 대규모 프로그램 개발에 적합하다.
- 각 디자인 패턴이 유용한 상황에 대해 잘 알아야 한다.
- 패턴은 절대적이지 않고 상황에 맞게 유연하게 변형이 가능하다.
- 패턴의 틀에 갇힌 사고방식은 효율성이 낮은 프로그램을 생산하게 된다.
[MVC 패턴(Model2)]
- javabeans를 사용하는 것이 Model1이다.
- MVC : Model View Controller
- view(보여짐) - 유저가 요청하거나 요청한 결과를 보여주는 화면 역할 (클라이언트 역할(JSP))
- controller(분배) - 요청한 내용을 확인하여 해당 업무를 모델에게 전달하는 역할(서버역할(java))
- model(일) - controller에서 받은 요청을 처리후 controller에게 반환하는 역할(서버역할(java))
[JSP와 MVC의 비교]


[Basic MVC Pattern]
[Controller]
@WebServlet("/")
public class MainController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("DO GET!!");
process(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("DO POST!!");
process(req,resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("post로 오던지 get으로 오던지 모두 여기서 처리 가능");
String param= req.getParameter("param");
System.out.println("param:" +param);
Object msg= null;
if(param == null) {
msg="Invalid Type";
}else if(param.equals("greeting")) {
msg="안녕하세요.";
}else if(param.equals("date")) {
msg = new java.util.Date();
}
req.setAttribute("result", msg);
RequestDispatcher dis = req.getRequestDispatcher("result.jsp");
dis.forward(req, resp);
}
}
- welcomelist에 등록된 이름의 파일이 있을경우 controller를 무시하고 해당 파일로 먼저 이동한다.
- welcomelist에 등록된 파일이 없는 경우에 controller로 오게 된다.
- 위 코드는 result.jsp밖에 없는 경우이기 떄문에 controller로 오게된다.
[result.jsp]
<body>
<h3>result : ${result}</h3>
</body>
- controller에서 result.jsp로 데이터를 "result"라는 이름으로 보냈기 때문에
EL태그를 사용하여 result라는 이름으로 받을 수 있다.
[Multi URL]
[Controller]
@WebServlet(urlPatterns= {"/index","/main"})
public class MainController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req,resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String uri = req.getRequestURI();
System.out.println(uri);
String context = req.getContextPath();
System.out.println(context);
String subAddr = uri.substring(context.length());
System.out.println(subAddr);
String result = "";
switch(subAddr) {
case"/index":
result="index.jsp는 아니지만 인덱스 페이지에 오신것을 환영합니다.";
break;
case"/main":
result="메인페이지에 오신것을 환영합니다.";
break;
}
req.setAttribute("result", result);
RequestDispatcher dis = req.getRequestDispatcher("result.jsp");
dis.forward(req, resp);
}
- 하나의 Controller 에서는 단일 url 또는 다수의 url 을 처리 할 수 있다.
- @WebServlet(urlPatterns= {"/","/index","/main"})
- "/"(root)는 최상위이기 때문에 앞에 "/"붙는 애들의 모든 요청을 다 받아드린다.
- 그래서 특정한 url만 받아들이기 위해서는 "/"를 제외해야한다.
- 하지만 "/"제외시 서버가 기동되는 첫화면에서 404오류가 발생하게된다.
- 이를 방지하기 위해서 우리는 일반적으로 첫 화면은 index.jsp로 만들어 준다.
[Calculator Service]
[index.jsp]
<body>
<h2>계산기</h2>
<hr />
<form action="calc" method="get">
<input type="text" name="val1" />
<select name="oper">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="val2" />
<input type="submit" name="전송" />
</form>
</body>
[Controller]
@WebServlet(urlPatterns= {"/calc"})
public class MainController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
process(req,resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int result = 0;
int val1 = Integer.parseInt(req.getParameter("val1"));
int val2 = Integer.parseInt(req.getParameter("val2"));
String oper = req.getParameter("oper");
switch(oper) {
case"+":
result= val1+val2;
break;
case"-":
result= val1-val2;
break;
case"*":
result= val1*val2;
break;
case"/":
result= val1/val2;
break;
}
req.setAttribute("result", result);
RequestDispatcher dis = req.getRequestDispatcher("result.jsp");
dis.forward(req, resp);
}
}
- index.jsp에서 form의 action을 calc로 지정했기 때문에 이 컨트롤러로 값을 받아오도록
@WebServlet를 calc로 해준다.
- @WebServlet으로 인해 이 컨트롤러에서 index.jsp의 파라메터를 받아올 수 있다.
- 각각 값을 넣어 switch-case구문으로 연산을 통해 result의 해당 연산값이 담긴다.
- result.jsp에서 정상적으로 값을 받아오는 것을 확인할 수 있다.