728x90

수업때 배운 servlet과 jsp 그리고 sevlet을 MVC 패턴과 Front Controller Pattern 으로 나누는 것에 대해 정리하려고 한다.


servlet이란?

  • 자바를 이용해 웹을 만들 수 있는 서버측 프로그램
  • 자바 코드로 웹 페이지를 만들 수 있다.

servlet으로 웹을 만든 예시

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/test")
public class TestServlet extends HttpServlet {         
    private static final long serialVersionUID = 1L;
    private DBUtil util=DBUtil.getInstance(); 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        process(request,response);
    }

    public void process(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        //1. request data 받아오기
        String name=request.getParameter("name");
        int price=Integer.parseInt(request.getParameter("price"));

        //2. logic 처리 (db sql문)
        int result=0;

        Connection conn=null;
        PreparedStatement pstmt=null;
        int cnt=0;
        try {
            conn=util.getConnection();
            String sql="insert into test (name,price) \n";
            sql+="values(?,?)";
            pstmt=conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setInt(2, price);
            cnt=pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            util.close(pstmt,conn);
        }

        //3. response page
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();

        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("    <meta charset=\"UTF-8\">");
        out.println("    <title>Test 결과</title>");
        out.println("    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
        out.println("</head>");
        out.println("<body>");
        if(result==1) {
            out.println("            <center><h1>test 성공</h1>");
        }else {
            out.println("            <center><h1>test 실패</h1>");
        }
        out.println("</body>");
        out.println("</html>");

    }

}

이렇게 자바 코드를 이용해서 웹 페이지를 만들 수 있다.

웹을 만들기 위한 3가지 단계

  1. 사용자에게서 전달받은(request) 받아오기
  2. 서비스 처리 (사용자에게 받은 data를 이용해 로직 처리)
  3. 서비스 결과를 응답(response) 하기

servlet의 코드를 보면 html코드를 PrintWriter를 통해 적어놓은 것을 볼 수 있다. 딱 봐도 그냥 html과 비교했을 때 복잡해보이고, 귀찮아 보인다.
만약에 여기서 html 코드가 더 복잡해진다면? 또한 백엔드와 프론트엔드를 분리해야 할 상황이라면?

java 코드 안에 html 코드를 작성할 경우 불편할 수 있다. 그래서 java 코드와 html 코드를 분리시킬 필요가 있다.

따라서.. java코드와 html 코드를 분리시키기 위해 jsp를 사용한다.


JSP란?

  • html코드 안에 java 코드가 위치한 것
  • 웹 에서 실행할 수 있는 java 코드 (servlet은 서버가 없으면 그냥 실행할 수없다)
  • 실행 시 servlet으로 변환되어 실행된다.
  • 실행될 때 무조건 jsp 안의 java코드가 먼저 실행된다.

jsp를 사용하면 더이상 servlet 코드에 html 코드를 작성할 필요가 없다.

그럼 이대로 servlet을 사용하면 되는걸까? 아니다!

사실, servlet은 앞서 말한 3단계의 단계 중 1단계인 사용자에게 온 request를 받는 역할을 하는 것에 전문적이다.

따라서 DB와 서비스를 처리하는 2번에 대한 전문적인 기능은 가지고 있지 않다.

이때, MVC pattern이라는 것을 사용할 수 있다.


MVC pattern이란?

  • Model, View, Controller
  • Model은 db 부분
  • view는 html 부분
  • Controller는 servlet 부분

우리는 jsp를 통해 view를 나누어주었다. 따라서 model과 controller부분을 나누어 주면 된다.

이때 dto와 dao라는 것이 나온다.

DTO와 DAO?

  • 우리는 db에서 객체라는 것을 받고, 그 객체에 받아온 db 값을 저장해 서비스에 전달해 줄 것이다.
    이때 사용하는 객체가 DTO(Data Transfer Object) 이다.
  • DB에 접근해서 DTO에 데이터를 넣어주고, 서비스 로직을 처리하는 부분을 DAO (Data Access Object)라고 한다.

MVC pattern으로 servlet을 controller, jsp를 view, dto와 dao를 model로 사용할 것이다.

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import test.model.dao.TestDao;
import test.model.dto.Test;


@WebServlet("/test")
public class TestServlet extends HttpServlet {         
    private static final long serialVersionUID = 1L;

    private TestDao dao=TestDao.getDao();

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        process(request,response);
    }

    public void process(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
         //1. request data 받아오기
        String name=request.getParameter("name");
        int price=Integer.parseInt(request.getParameter("price"));

        //2. logic 처리 (db sql문, dao와 dto 사용)
        int result=0;
        String target="";
        try {
            Test test=new Test(name, price);
            result=dao.insertTestList(test);
            target="/test/test_success.jsp";
        }catch(SQLException e) {
            target="/test/test_fail.jsp";
            e.printStackTrace();
        }

        //3. response page
        RequestDispatcher disp=null;

        disp=request.getRequestDispatcher(target);
        disp.forward(request, response);

    }

}

이렇게 기능마다 servlet(controller)을 추가시켜주면 다양한 기능을 가진 웹을 만들 수 있다.

하지만 기능마다 서블릿을 만들어주면 매번 똑같은 코드가 중복되는 부분이 있을 것이다.

그래서 중복된 코드를 없애고, 효율성을 높이기 위해 Servlet들을 하나의 main servlet으로 통합하여 사용하기로 했는데 이것을 "Front Controller Pattern"이라고 한다.


Front Controller Pattern?

  • 모든 요청을 처리할 수 있는 하나의 메인 컨트롤러(Controller)를 두는 패턴이다.
  • controller 앞단에 main servlet이 하나 있고, 이 main servlet이 모든 기능을 처리해준다.
  • 이 구조를 이용해면 기능을 추가할 때마다 매번 서블릿을 생성하지 않아도 된다!

이렇게 하나의 servlet에서 view 부분을 jsp로, model 부분을 dto와 dao로 나누어보았으며,

마지막으로 모든 요청을 처리해 주는 Main Servlet을 만들어 Front Coontroller Pattern까지 나누는 흐름을 알아보았다.

 


 

+) 내용이 잘 정리되어있는 영상을 찾아서 함께 첨부한다! ~7분 40초까지가 servlet에 대한 내용이다.

 

728x90

'Computer Science > Web programming' 카테고리의 다른 글

[CS] MSA 구조 정리  (0) 2022.08.04
[Web] TDD 방법론  (1) 2022.05.24
[Web] REST vs RESTful vs REST API(RESTful API)  (2) 2021.12.31
[Web] DTO와 VO의 차이  (1) 2021.12.17
[Web] Spring의 AOP, Interceptor, Filter  (4) 2021.12.14
복사했습니다!