[Servlet/JSP] MVC패턴

아는벌·2023년 3월 2일
0

web (2)

목록 보기
13/20

MVC 패턴

  • Model - 연산 처리, DB 연결 등 백그라운드 동작하는 로직을 처리
  • View - 사용자에게 보여질 결과 화면
  • Controller - 사용자의 입력 처리의 흐름 제어를 담당

현재 디렉토리 구조이다.
web/WEB-INF/views가 view에 해당한다.

DTO(Data Trasfer Object)

각 계층간 데이터 교환을 위한 객체

public class SaramDTO {
    Long seq;
    String id;
    String name;
    int age;
    // 생성자, getter/setter, toString() ...
}

saram 테이블의 seq, id, name, age를 클래스의 멤버변수로 선언한다.
DTO 멤버변수를 private로 구성하고 생성자, getter/setter을 구현한다.

DAO(Data Access Object)

DB의 데이터를 접근하는데 쓰이는 객체

public class SaramDAO {
    // Database에 CRUD를 전담하는 클래스
    Connection conn = null; // 디비 연결 용도
    PreparedStatement stmt = null; // 디비에 SQL 전달
    ResultSet rs = null; // 결과를 받아 올때 사용.

    final String FIND_ALL = "SELECT * FROM SARAM";
    final String FIND_ONE = "SELECT * FROM SARAM WHERE SEQ = ?";
    final String SAVE = "insert into saram(id, name, age) values(?,?,?)";
    final String UPDATE="UPDATE SARAM SET ID =?, NAME=? , AGE =? WHERE SEQ=?";
    final  String DELETE="DELETE FROM SARAM WHERE=?";
    // 검색
    public List<SaramDTO> findAll() {
        List<SaramDTO> list = new ArrayList<SaramDTO>();
        try {
            conn = JdbcUtil.getConnection();
            stmt = conn.prepareStatement(FIND_ALL);
            rs = stmt.executeQuery();
            while(rs.next()) {
                Long seq = rs.getLong("seq");
                String id = rs.getString("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                list.add(new SaramDTO(Math.toIntExact(seq), id, name, age));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, stmt, rs);
        }
        return list;
    }
    public SaramDTO findOne(SaramDTO dto) {
        return null;
    }
    // 입력
    public void save(SaramDTO dto) {

    }
    // 수정
    public void update(SaramDTO dto) {

    }
    // 삭제
    public void remove(SaramDTO dto) {

    }
}

conn = JdbcUtil.getConnection(); - conn 객체를 통해 데이터베이스에 엑세스한다.
stmt = conn.prepareStatement(FIND_ALL); rs = stmt.executeQuery(); - 조회, 입력, 수정, 삭제 기능에 적절한 쿼리문을 전달하여 작업을 수행하고 결과를 rs 객체에 담는다.
JdbcUtil.close(conn, stmt, rs); - 사용한 리소스를 반납한다

Controller

public class SaramController implements Controller {
    @Override
    public String process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        // String으로 다운 캐스팅
        String path = (String)req.getAttribute("path");

        SaramDAO dao = new SaramDAO();
        String viewName = "/WEB-INF/views/home.jsp";
        if(path.indexOf("/input.do") != -1) {
            viewName = "/WEB-INF/views/saram/input.jsp";
        } else if(path.indexOf("/detail.do") != -1) {
            viewName = "/WEB-INF/views/saram/detail.jsp";
        } else if(path.indexOf("/modify.do") != -1) {
            SaramDTO dto = new SaramDTO();
            dto.setSeq(Integer.parseInt(req.getParameter("seq")));
            SaramDTO saram = dao.findOne(dto);
            req.setAttribute("saram",saram);
            viewName = "/WEB-INF/views/saram/modify.jsp";
        } else {
            List<SaramDTO> list = dao.findAll();
            req.setAttribute("list", list);
            viewName = "/WEB-INF/views/saram/list.jsp";
        }
        return viewName;

    }
}

사용자의 url에 따른 dao의 처리 메소드(CRUD)을 불러오고 수행 후 적절한 view를 리턴한다.

public class DispatcherServlet extends HttpServlet {
    SaramDAO saramDAO = new SaramDAO();
    SaramController saramController = new SaramController();
    BoardController boardController = new BoardController();

    private String encodingWork(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");

        // path 만들기
        String ctxPath = req.getContextPath();
        String reqUri = req.getRequestURI();
        int beginIndex = ctxPath.length();
        String path = reqUri.substring(beginIndex);
        System.out.println("path >>>> " + path);
        // 하위 컨트롤러에서 path를 사용하도록 req에 저장
        req.setAttribute("path", path);
        return path;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet() - DispatcherServlet 요청");
        String path = encodingWork(req,resp);

        //String viewName = new BoardController().process(req, resp);
        //String viewName = new SaramController().process(req, resp);
        Controller controller = new BoardController(); // 업캐스팅
        if(path.indexOf("/saram") != -1) {
            controller = saramController;
        } else if(path.indexOf("/board") != -1) {
            controller = boardController;
        }
        String viewName = controller.process(req, resp);

        RequestDispatcher view = req.getRequestDispatcher(viewName);
        view.forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String path = encodingWork(req, resp);
        int seq = Integer.parseInt(req.getParameter("seq")==null?"0":req.getParameter("seq"));
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        int age = Integer.parseInt(req.getParameter("age")==null?"0":req.getParameter("age"));
        SaramDTO dto = new SaramDTO(seq,id, name, age);
        if("/saram/input.do".indexOf(path) != -1){
            saramDAO.save(dto);
        }
        else if("/saram/modify.do".indexOf(path)!=-1){
            saramDAO.update(dto);
        }


        resp.sendRedirect(req.getContextPath() + "/saram/list.do");
    }
}

사용자의 url get/post의 흐름에 따라 적절한 뷰를 리턴하거나 로직을 수행한 후 뷰를 리턴한다.

참고

https://taylog.tistory.com/59
https://12716.tistory.com/entry/JDBC-MVC-%ED%8C%A8%ED%84%B4Model-View-Controller

0개의 댓글