JSP가 직접 처리하고 원하는 내용을 response 1. request(웹에서의 어떤 요청) >> JSP >> Servlet이 처리 >> response (원하는 내용과 화면을 구현)
⭐⭐⭐MVC 패턴 2. request(웹에서의 어떤 요청) >> Servlet이 직접 처리 >> JSP로 화면구현
위와 같은 방법이 있으며 대부분이 MVC패턴과 함께 Spring Framework를 배우며 그 이전에 JSP를 통해 1번 패턴을 배우기도 합니다.
위와 같이 두가지 방법이 있으며 MVC패턴 2번이 응집도가 높고 결합도가 더 낮은 방법입니다. 쉽게 말하면 각각의 기능 [view(보여지는 화면 구현) , model(데이터 연산), Controller(view와 model을 컨트롤)]들이 각각 분리되어 있어 독자적인 책임을 갖고 기능을 수행합니다. 만약 데이터를 수정하거나 내부의 기능을 변경하더라도 다른 기능이 영향을 크게 받지 않는다는 장점이 있습니다.
1번 패턴은 JSP내에서 화면구현과 컨트롤등이 동시에 수행되기 때문에 내용을 수정하게되면 다른 기능에도 영향을 미친다는 단점이 있습니다.
Sevlet은 언제 생성되서 어떤 기능을 하는 걸까?
결론부터 말하면 JSP파일을 실행하는 순간부터 Servlet이 생성됩니다. Servlet은 위에서 말한 Controller역할을 합니다. 요청받은 내용을 확인하고 이에 응답해서 처리해줄 적절한 내용이 있다면 이를 잘 가공하도록 지시하는 역할을 수행합니다. 관리자가 먼저 파일을 확인하고 판단을 거쳐 아래 알바생들에게 일을 나눠주는것과 유사하다고 생각하시면 더 쉽겠죠?
각자 강의나 내용중에서 해당 파일을 수행하면 Java로 Compile된다는 강의를 들은 적 있을 겁니다. 여러분의 work-space에서 .metadata로 이동하여 아래와 같은 경로로 이동해보세요.
한번이라도 Dynamic Project를 만들어 JSP페이지를 Apache tomcat으로 실행해본적이 있다면 파일이 있을겁니다. 제 파일을 예시로 들어볼게요. JSP파일을 수행하면 저렇게 java파일이 생성되고 이 파일이 compile되면 class라는 파일이 생성됩니다.
아래 파란색 파일이 생성되면 Servlet이 호출됩니다. java파일을 한 번 열어서 중요한 부분만 뜯어볼게요!
보기만해도 속이 안좋습니다. 어려운 코드들이 눈 앞에 펼쳐져요. 다른건 다 무시하고 빨간박스 안의 상속클래스를 볼게요 이 클래스가 바로 Servlet클래스입니다. 이게 왜 Servlet클래스인지는 설명할 필요 없이 저 내용을 그대로 복사해서 구글에 검색해보겠습니다.
이와 같은 내용이 적힌 페이지가 있을텐데요 일단 클릭해봅시다.
이처럼 아까 우리가 상속받은 클래스의 조상 클래스가 바로 HttpServlet이라고 하는 servlet클래스였습니다. 의문이 하나 풀리셨나요? 그럼 다시 텍스트 내용으로 돌아와 중요한 내용들만 다시 뽑아 먹어보겠습니다.
Servlet을 상속받아 사용할 수 있는 메서드들입니다. init() 메서드는 해당 객체가 호출되는 순간 초기 셋팅 환경을 만듭니다. destory() 메서드는 해당 객체가 완전히 사용되고 사라질 때 셋팅환경을 만듭니다.
가장 중요한 service 메서드는 request와 response를 받아와서 request의 내용을 잘 가공하여 response에 담아 내보냅니다. 해당 작업이 완료되면 아까 봤던 class파일로 컴파일되어 변환이 완료됩니다. 이후의 과정을 사진을 통해 확인할게요
출처 : 위키백과 https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF Server class까지의 과정을 통해 가공이 완료된 자료는 buffer단위로 response에 담아지며 이러한 결과를 다시 JSP페이지에 담아 클라이언트의 화면에 보여집니다.
왜 Servlet을 사용하는지 Servlet이 어떤 역할을 하는지 조금은 이해가 가실까요?
그렇다면 이번에는 왜 JSP페이지를 사용하는지 알아봅시다. JSP페이지를 사용하지 않고 직접 Servlet을 만들어서 처리하면 어떤 코드를 만들어야 할까요?
아래 코드는 직접 만든 Servlet을 통해 jsp 없이 자바코드를 xml파일과 함께 맵핑하여 response로 client에게 보내는 코드입니다. 초록색 주석의 내용을 doGet이라는 메서드를 통해 모두 직접 적어서 넣어야 합니다 ㅎㅎ 끔찍하죠?
package servletEx;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletEx01 extends HttpServlet{
@Override
public void init() throws ServletException {
System.out.println("로그인 서블릿 초기화");
}
@Override
public void destroy() {
System.out.println("로그인 서블릿 소멸");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(), doPost() 등 HTTP Method에 대응하는 메서드를 오버라이딩하기도 한다.
System.out.println("로그인 서비스!");
}
Get요청시 어떻게 처리할 것인가?를 처리하는 메서드
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter pw = new PrintWriter(resp.getOutputStream());
pw.println(
JSP없이 처리하려면 이렇게 긴 문장을 넣어야 한다.
"<!DOCTYPE html>\r\n" +
"<html>\r\n" +
"<head>\r\n" +
"<meta charset=\"UTF-8\">\r\n" +
"<title>Insert title here</title>\r\n" +
"</head>\r\n" +
"<body>\r\n" +
"<!-- login을 수행할 경우 loginProc.jsp에서 처리한다. post방식 -->\r\n" +
"<!-- 웹 브라우저와 웹 어플리케이션 사이에서 jsp가 매개체 역할을 한다.\r\n" +
" jsp파일은 결국 자바 코드다.\r\n" +
" \r\n" +
" !lifecycle : jsp파일은 자바코드로 변환이되고 컴파일이 되고 컴파일이 끝나면\r\n" +
" 객체를 생성한다. 생성된 객체는 init을 호출하여 필요한 초기값을 지정하고\r\n" +
" 브라우저 요청에 대한 처리는 서비스라는 함수에서 하게 된다.\r\n" +
" \r\n" +
" JSP파일 동작 방식 :\r\n" +
" jsp파일은 자바코드로 변환이 된다.\r\n" +
" 이때 HttpServlet을 상속하여 만들어진다.\r\n" +
" \r\n" +
" 기존방식 = 클라이언트 요청을 jSP파일로 받음\r\n" +
" 서블릿 = 클라이언트의 요청을 servlet으로 직접 받음\r\n" +
" \r\n" +
" MVC패턴을 구현하기 위해서는 서블릿을 구현하는 방법을 알아야 한다.\r\n" +
" \r\n" +
" MVC패턴 \r\n" +
" model \r\n" +
" view - jsp파일(순수 화면 구현)\r\n" +
" Controller - Servlet(어떻게 처리해야 하는지 구분)\r\n" +
" -->\r\n" +
"<form action=\"loginProc.jsp\" method=\"post\">\r\n" +
" <input type=\"text\" name=\"userid\" >\r\n" +
" <input type=\"password\" name=\"userpw\" >\r\n" +
" <input type=\"submit\" value=\"로그인\" >\r\n" +
"</form>\r\n" +
"</body>\r\n" +
"</html>"
);
}
}
이 코드를 JSP파일과 연계해서 사용한다면? 포워딩(fowarding)을 통해 해당페이지로 곧바로 클라이언트에게 response할 수 있습니다. doGet을 통해 보내진 페이지에서 클라이언트가 로그인을 시도하고 post방식으로 내용이 담아져 온다면 이를 doPost가 처리하여 결과를 해당 페이지로 리다이렉트하는 방식이죠!