📚 Study/Servlet&JSP

Servlet이랑 JSP는 뭐가 다른데?

0_ch4n 2022. 5. 27. 16:06
반응형

✔️ 한줄 요약

  • Servlet 은 HTML in JAVA 이다.
  • JSP 는 JAVA in HTML 이다.
  • JSP는 Servlet의 확장이므로 동일한 역할을 한다.
  • 결국 둘 다 사용하는 MVC 패턴을 사용한다.

 

✔️ Servlet과 JSP의 차이

  • Servlet
    • 웹 기반의 요청에 대한 동적인 처리가 가능한 Server side에서 돌아가는 Java Program입니다.
    • Java 코드 안에 HTML 코드가 들어가 있으며 하나의 클래스입니다.
    • Java로 웹 개발을 하기 위한 CGI의 역할을 하는 표준
    • 비즈니스 로직 처리, data processing, Controller에 적합합니다.
    • 수정된 경우 다시 컴파일한 후 재배포하는 작업이 필요합니다.
  • JSP
    • Java 언어를 기반으로 하는 Server side 스크립트 언어입니다.
    • HTML 코드 안에 Java 코드가 들어가 있습니다.
    • Servlet을 보완하고 기술을 확장시킨 스크립트 방식의 표준으로 Servlet의 모든 기능과 추가 기능을 사용합니다.
    • 화면 로직 처리, presentation, View에 적합합니다.
    • 수정된 경우 재배포할 필요 없이 WAS가 알아서 처리해줍니다.

 

✔️ Servlet과 JSP의 관계

  • 결국 Servlet과 JSP는 만드는 방법만 다를뿐 동일한 역할을 하고 각각 장, 단점을 갖습니다.

 

📌 Model 1

  • JSP가 요청과 응답(Controller + View)을 모두 담당하고 DB 접근은 Java Bean(DTO, DAO)을 사용하는 형태입니다.

  • 동작 과정
    • JSP로 작성된 프로그램은 내부적으로 WAS에서 Servlet 파일로 변환
    • JSP 태그를 분해하고 추출하여 다시 순수한 HTML 웹 페이지로 변환
    • 클라이언트로 응답

 

  • 특징
    • 배우기 쉽고 개발 속도가 빠르다
    • 프레젠테이션 로직(View)과 비즈니스 로직(Controller)가 혼재하므로 복잡해져 유지 보수가 어렵다

 

📌 Model 2

  • JSP와 Servlet을 모두 사용하여 프레젠테이션 로직(View)과 비즈니스 로직(Controller)를 분리한 형태입니다.

  • 특징
    • 프레젠테이션 로직(View)는 HTML이 중심이 되는 JSP를 사용
    • 비즈니스 로직(Controller)는 데이터를 다른 자바 클래스에게 넘겨주는 부분으로 Java 코드가 중심이 되는 Servlet을 사용
    • Model은 Java Bean(DTO, DAO)을 통해 데이터베이스에 접근
    • 유지보수가 용이

 

✔️ MVC 패턴으로 보는 Model2

 

  • Model (Server class or Java Bean)
    • 비즈니스 로직을 처리하는 모든 것이 모델에 속합니다.
    • 컨트롤러로부터 특정 로직에 대한 처리 요청(게시판 글쓰기 등)이 들어오면 이를 수행하고 수행 결과를 컨트롤러에 반환합니다.
    • request나 session 객체에 저장하기도 합니다.
  • View (JSP)
    • 클라이언트에 출력되는 화면을 말합니다.
    • Model 1과는 달리 로직 처리를 위한 코드가 내포되어있지 않습니다.
    • 요청 결과의 출력 뿐만 아니라 컨트롤러에 요청을 보내는 용도로도 사용됩니다.
    • request나 session 객체에 저장된 정보를 토대로 화면을 출력합니다.
  • Controller (Servlet)
    • MVC 패턴의 모든 흐름제어를 맡습니다.
    • 브라우저로 요청이 들어오면 어떤 요청이 들어오는지 분석하여 이 요청을 처리하기 위한 모델을 사용하여 처리합니다.
    • 사용한 모델로부터 처리결과를 받으면 추가로 처리하거나 가공해야 할 정보가 있다면 처리 후 request나 session 객체에 저장하고, View를 선택하여 Forward나 redirect하여 클라이언트에 출력합니다.

 

📌 장점

  • 출력을 위한 뷰 코드와 로직처리를 위하 자바 코드를 분리하기 때문에 Model 1에 비해 코드가 복잡하지 않습니다.
  • View, Controller에 대한 분업이 용이합니다.
  • 기능에 따라 분리되어 있기 때문에 유지보수가 용이합니다.

 

📌 단점

  • 구조가 복잡하여 습득이 어렵고 작업량이 많습니다.
  • Java에 대한 같은 이해도가 필요합니다.

 

✔️ 코드로 보는 MVC 패턴

  • Controller(Servlet)에서 비즈니스 로직을 수행한 후 데이터를 dispatcher.forward()를 통해 View로 보냅니다.
  • View(JSP)에서 데이터를 받아 출력만 합니다.
// Controller
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final String username = request.getParameter("username");
        final int age = Integer.parseInt(request.getParameter("age"));
        final Member member = new Member(username, age);
        memberRepository.save(member);

        request.setAttribute("member", member);
        final String viewPath = "/WEB-INF/views/save-result.jsp";
        final RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

// View
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=${member.id}
    </li>
    <li>username=${member.username}
    </li>
    <li>age=${member.age}
    </li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

 

📄 참고

https://steady-coding.tistory.com/463

https://galid1.tistory.com/488

https://gmlwjd9405.github.io/2018/11/04/servlet-vs-jsp.html

반응형