MVC2 패턴이란?
Model, View, Controller의 약자로써 기능이 직접 동작하는 부분, 이용자에게 보여지는 부분 그리고 그 둘사이를 중개해주는 부분으로 나눠서 기능을 구현하는 방식을 말한다.
Model은 프로그램의 기능이 직접적으로 동작하고 데이터가 저장되는 등 눈에 보이지 않는 작업이 이루어 지는 부분이다.
View는 Controller가 Model에서 받아온 데이터를 넘겨주면 이를 이용자에게 보여주는 부분이다.
Controller는 Model과 View 사이에서 데이터를 중개해주는 역할을 수행한다. 모든 데이터는 Controller를 통해서 움직이며 view와 model은 직접 통신하지 않는다.
MVC2 패턴으로 게시판 만들기 - 1
동작 순서 : FrontController -> ListAction -> DAO -> ActionForward -> Controller -> View(.jsp) -> request(데이터를 가져옴) -> 화면처리

package net.board.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardFrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardFrontController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
private void doProcess(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String RequestURI=request.getRequestURI();
String contextPath = request.getContextPath();
String command = RequestURI.substring(contextPath.length());
//URI의 앞부분 만큼 잘라내어 제일 뒤에 있는 필요한 부분만 남겨둔다
ActionForward forward = null;
Action action=null;
if(command.equals("/BoardList.bo")) {
action = new BoardListAction();
try {
forward=action.execute(request, response);
}catch(Exception e) {
e.printStackTrace();
}
}
if(forward.isRedirect()) {
response.sendRedirect(forward.getPath()); //redirect 방식으로 전송
}else {//forward 방식으로 전송
RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
}
}
}
package net.board.action;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.BoardDAO;
public class BoardListAction implements Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception{
BoardDAO boarddao=new BoardDAO();
List boardlist=new ArrayList();
int page=1;
int limit=10;
if(request.getParameter("page")!=null){
page=Integer.parseInt(request.getParameter("page"));
}
int listcount=boarddao.getListCount(); //총 리스트 수를 받아옴.
boardlist = boarddao.getBoardList(page,limit); //리스트를 받아옴.
//총 페이지 수.
int maxpage=(int)((double)listcount/limit+0.95); //0.95를 더해서 올림 처리.
//현재 페이지에 보여줄 시작 페이지 수(1, 11, 21 등...)
int startpage = (((int) ((double)page / 10 + 0.9)) - 1) * 10 + 1;
//현재 페이지에 보여줄 마지막 페이지 수.(10, 20, 30 등...)
int endpage = maxpage;
if (endpage>startpage+10-1) endpage=startpage+10-1;
request.setAttribute("page", page); //현재 페이지 수.
request.setAttribute("maxpage", maxpage); //최대 페이지 수.
request.setAttribute("startpage", startpage); //현재 페이지에 표시할 첫 페이지 수.
request.setAttribute("endpage", endpage); //현재 페이지에 표시할 끝 페이지 수.
request.setAttribute("listcount",listcount); //글 수.
request.setAttribute("boardlist", boardlist);
ActionForward forward= new ActionForward();
forward.setRedirect(false);
forward.setPath("./board/qna_board_list.jsp");
return forward;
}
}
package net.board.action;
public class ActionForward {
private boolean isRedirect = false; //전송방식을 결정 redirect or forward
private String path = null; //이동할 경로를 저장.
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
package net.board.action;
import javax.servlet.http.*;
public interface Action {
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
package net.board.db;
import java.sql.*;
import java.util.*;
import javax.naming.*;
import javax.sql.DataSource;
public class BoardDAO {
Connection con;
PreparedStatement pstmt;
ResultSet rs;
public BoardDAO() {
try {
Context init = new InitialContext();
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
con = ds.getConnection(); //풀방식
} catch (Exception e) {
System.out.println("Fail"+e);
return;
}
}
public int getListCount() {
int x= 0;
try{
pstmt=con.prepareStatement("select count(*) from board");
rs = pstmt.executeQuery();
if(rs.next()){
x=rs.getInt(1);
}
}catch(Exception ex){
System.out.println("getListCount 에러: " + ex);
}finally{
if(rs!=null) try{rs.close();}catch(SQLException ex){}
if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
}
return x;
}
//글 목록 보기.
public List getBoardList(int page,int limit){
String board_list_sql="select * from "+
"(select rownum rnum,BOARD_NUM,BOARD_NAME,BOARD_SUBJECT,"+
"BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,"+
"BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE from "+
"(select * from board order by BOARD_RE_REF desc,BOARD_RE_SEQ asc)) "+
"where rnum>=? and rnum<=?";
List list = new ArrayList();
int startrow=(page-1)*10+1; //읽기 시작할 row 번호.
int endrow=startrow+limit-1; //읽을 마지막 row 번호.
try{
pstmt = con.prepareStatement(board_list_sql);
pstmt.setInt(1, startrow);
pstmt.setInt(2, endrow);
rs = pstmt.executeQuery();
while(rs.next()){
BoardBean board = new BoardBean();
board.setBOARD_NUM(rs.getInt("BOARD_NUM"));
board.setBOARD_NAME(rs.getString("BOARD_NAME"));
board.setBOARD_SUBJECT(rs.getString("BOARD_SUBJECT"));
board.setBOARD_CONTENT(rs.getString("BOARD_CONTENT"));
board.setBOARD_FILE(rs.getString("BOARD_FILE"));
board.setBOARD_RE_REF(rs.getInt("BOARD_RE_REF"));
board.setBOARD_RE_LEV(rs.getInt("BOARD_RE_LEV"));
board.setBOARD_RE_SEQ(rs.getInt("BOARD_RE_SEQ"));
board.setBOARD_READCOUNT(rs.getInt("BOARD_READCOUNT"));
board.setBOARD_DATE(rs.getDate("BOARD_DATE"));
list.add(board);
}
return list;
}catch(Exception ex){
System.out.println("getBoardList 에러 : " + ex);
}finally{
if(rs!=null) try{rs.close();}catch(SQLException ex){}
if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
}
return null;
}
}
Oracle db에 데이터를 저장하는 클래스
package net.board.db;
import java.sql.Date;
public class BoardBean {
private int BOARD_NUM;
private String BOARD_NAME;
private String BOARD_PASS;
private String BOARD_SUBJECT;
private String BOARD_CONTENT;
private String BOARD_FILE;
private Date BOARD_DATE;
private int BOARD_RE_REF;
private int BOARD_RE_LEV;
private int BOARD_RE_SEQ;
private int BOARD_READCOUNT;
public int getBOARD_NUM() {
return BOARD_NUM;
}
public void setBOARD_NUM(int bOARD_NUM) {
BOARD_NUM = bOARD_NUM;
}
public String getBOARD_NAME() {
return BOARD_NAME;
}
public void setBOARD_NAME(String bOARD_NAME) {
BOARD_NAME = bOARD_NAME;
}
public String getBOARD_PASS() {
return BOARD_PASS;
}
public void setBOARD_PASS(String bOARD_PASS) {
BOARD_PASS = bOARD_PASS;
}
public String getBOARD_SUBJECT() {
return BOARD_SUBJECT;
}
public void setBOARD_SUBJECT(String bOARD_SUBJECT) {
BOARD_SUBJECT = bOARD_SUBJECT;
}
public String getBOARD_CONTENT() {
return BOARD_CONTENT;
}
public void setBOARD_CONTENT(String bOARD_CONTENT) {
BOARD_CONTENT = bOARD_CONTENT;
}
public String getBOARD_FILE() {
return BOARD_FILE;
}
public void setBOARD_FILE(String bOARD_FILE) {
BOARD_FILE = bOARD_FILE;
}
public Date getBOARD_DATE() {
return BOARD_DATE;
}
public void setBOARD_DATE(Date bOARD_DATE) {
BOARD_DATE = bOARD_DATE;
}
public int getBOARD_RE_REF() {
return BOARD_RE_REF;
}
public void setBOARD_RE_REF(int bOARD_RE_REF) {
BOARD_RE_REF = bOARD_RE_REF;
}
public int getBOARD_RE_LEV() {
return BOARD_RE_LEV;
}
public void setBOARD_RE_LEV(int bOARD_RE_LEV) {
BOARD_RE_LEV = bOARD_RE_LEV;
}
public int getBOARD_RE_SEQ() {
return BOARD_RE_SEQ;
}
public void setBOARD_RE_SEQ(int bOARD_RE_SEQ) {
BOARD_RE_SEQ = bOARD_RE_SEQ;
}
public int getBOARD_READCOUNT() {
return BOARD_READCOUNT;
}
public void setBOARD_READCOUNT(int bOARD_READCOUNT) {
BOARD_READCOUNT = bOARD_READCOUNT;
}
}
데이터 입출력에 사용하는 Beans 클래스
순서
1. 서블릿 생성 및 서블릿 맵핑

2. BoardFrontController에서 doPost, doGet에 연결되면 실행될 것(doProcess)을 작성한다.


forward.isRedirect는 Boolean으로 true와 false로 반환되며 이 값에 따라 redirect를 할지 forward를 할지를 결정한다.
'빅데이터교육과정 > DB' 카테고리의 다른 글
DAY 3. DB를 활용한 로그인, 회원가입, 회원관리 (0) | 2021.03.17 |
---|---|
DAY 2. 이클립스를 활용한 sql사용 (0) | 2021.03.17 |
DAY 1. SQL Development 계정생성 (cmd, sql devel) (0) | 2021.03.11 |
DAY 1. Oracle 설치 및 삭제(Window10 Pro, 20H2)-Universal Installer, deinstall.bat 미사용 (0) | 2021.03.11 |