JSP + Servlet | MVC 패턴(모델 2) 게시판 구현 2/n

파과·2022년 7월 26일
0

우리가 만들 컨트롤러는 요청 파라미터로 원하는 작업을 위한 명령을 전달하는 방식이다.
원하는 작업이 게시글 목록을 보는 작업이라면 board_list를 요청 파라미터에게 전달해 보낸다. 여기서 요청 파라미터 이름은 명령을 전달하므로 command라고 하겠다.

BoardServlet?commane=board_list

요청 파라미터는 웹 페이지에서 데이터를 전송하는 방식의 하나로 요청 URL 끝에 ?를 붙인 후 파라미터에 값을 실어 보낸다. 이를 쿼리 스트링이라고 한다. 이렇게 쿼리 스트링을 사용해 각 명령어에 따른 로직을 별도의 클래스로 작성하는 것을 커맨드 패턴Command Pattern이라고 한다.

모든 요청을 받아서 처리하는 BoardServlet - MVC패턴의 컨트롤러를 먼저 만든다. 모델은 일반적인 클래스 파일로 외부에서 직접 연결할 수 없어 컨트롤러가 요청을 받아 그에 해당하는 모델을 수행한다.

6. com.sw.controller/BoardServlet.java

모든 요청을 doGet()에서 처리하도록 구현한다.
아직 모델을 만들지 않았지만 요청을 서블릿이 받았음을 콘솔에서 확인할 수 있도록 확인 메시지를 출력한다.
post방식에서는 인코딩 후 doGet()을 호출한다.

package com.sw.controller;

import java.io.IOException;
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("/BoardServlet")
public class BoardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public BoardServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String command = request.getParameter("command");
		System.out.println("BoardServlet에서 요청을 받음을 확인: " + command);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

7. 인터페이스 com.sw.controller.action/Action.java

컨트롤러에서 요청이 들어오면 작업에 알맞은 모델의 비즈니스 로직이 수행되도록 해야 하는데, 컨트롤러에서 동일한 방식으로 모델을 접근할 수 있게 하기 위해서는 모델들이 상속받아야 하는 인터페이스를 설계해두고 상속받도록 한다.

요청 파라미터를 동일한 메소드로 처리하도록 하기 위한 추상 메소드를 정의한다. 컨트롤러에서는 직접 모델(액션 객체)을 생성하지 않는 대신 액션 객체를 생성해내는 팩토리(공장) 역할을 하는 클래스를 통해서 생성한다.

객체를 생성해내는 클래스를 따로 설계해서 작업하는 것을 팩토리 패턴이라고 한다.

package com.sw.controller.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

8. 클래스 com.sw.controller/ActionFactory.java

ActionFactory 클래스는 싱글톤 패턴으로 정의한다. 유일하게 한 개의 객체만 생성하고 이를 getInstance()로 호출해 사용한다.

여기서 기술하는 메소드가 BoardServlet의 doGet메소드에서 호출된다. getAction()메소드에서는 command를 받아서 거기에 맞는 액션을 리턴한다.

package com.sw.controller;

import com.sw.controller.action.Action;

public class ActionFactory {
	
	//싱글톤 패턴으로 정의
	private static ActionFactory instance = new ActionFactory();
	
	public static ActionFactory getInstance() {
		return instance;
	}
	
	public Action getAction(String command) {
		Action action = null;
		System.out.println("ActionFactory :" + command);
		return action;
	}
}

9. BoardServlet에 ActionFactory 객체를 생성하고 요청을 실행하기 위한 코드 추가

package com.sw.controller;

import java.io.IOException;
import com.sw.controller.action.Action;
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("/BoardServlet")
public class BoardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public BoardServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String command = request.getParameter("command");
		System.out.println("BoardServlet에서 요청을 받음을 확인: " + command);
		
		ActionFactory af = ActionFactory.getInstance();
		Action action = af.getAction(command);
		
        //아직 모델을 만들지 않아서 액션 팩토리가 null값을 갖는 액션을 반환하기 때문에 예외가 발생할 수 있다. 따라서 null이 아닐 때만 execute()를 호출하도록 조건문을 만들어 주었다.
		if(action != null) {
			action.execute(request, response);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

중간 테스트

http://localhost:9999/web-11-board/BoardServlet?command=board_list

10. com.sw.controller.action/BoardListAction.java

BoardServlet?command=board_list라는 요청을 받으면 게시글 리스트 화면을 표시하기 위한 액션 클래스(모델).

Action 인터페이스를 구현했으므로 execute()를 오버라이딩한다.

package com.sw.controller.action;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sw.dao.BoardDAO;
import com.sw.dto.BoardVO;

public class BoardListAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = "/board/boardList.jsp";
		
		BoardDAO bDao = BoardDAO.getInstance();
		
		List<BoardVO> boardList = bDao.selectAllBoards();
		
		request.setAttribute("boardList", boardList);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}

	
}

0개의 댓글