MVC 패턴은 모델, 뷰, 컨트롤러의 세 영역으로 나누고 이들의 결합도를 최소화하는 것을 모토로 한다.
구성요소 | 설명 |
---|---|
모델 | 주로 DB와 연동하는 비즈니스 로직을 통해 얻어온 데이터를 저장하는 용도로 사용한다. |
뷰 | 사용자와의 인터페이스로 주로 JSP페이지를 사용한다. |
컨트롤러 | 모델과 뷰 사이의 흐름을 제어하는 역할을 한다. 주로 서블릿을 사용한다. |
JSP페이지
- boardList.jsp 게시글 리스트 페이지
- boardWrite.jsp 게시글 등록 페이지
- boardView.jsp 게시글 상세보기 페이지
- boardUpdate.jsp 게시글 수정 페이지
- boardCheckPass.jsp 게시글 수정 혹은 삭제할 수 있는 자격이 있는지 비밀번호 확인을 위한 비밀번호 입력 페이지
- checkSuccess.jsp 게시글 수정과 삭제를 위한 페이지
Class
- BoardServlet.java 컨트롤러 서블릿 - 요청을 받아 요청에 해당하는 model과 view를 호출
- ActionFactory.java 컨트롤러 서블릿 - 커맨드(command) 패턴으로 작업 처리를 위한 명령 처리 클래스가 있어야 함
- Action.java 명령 처리 클래스의 슈퍼 클래스로 사용할 인터페이스 - 모델 역할을 하는 모든 클래스를 컨트롤러가 동일한 방식으로 접근할 수 있도록 하기 위한 모델들의 인터페이스.
- BoardListAction.java 게시글 전체 정보를 DB에서 얻어옴
- BoardWriteFormAction.java 게시글 등록 페이지로 이동
- BoardWriteAction.java 입력한 게시글 정보를 DB에 추가
- BoardViewAction.java 해당 게시글을 DB에서 찾아 상세 정보를 보여줌
- BoardCheckPassFormAction.java 게시글 수정 혹은 삭제를 위한 비밀번호 입력 페이지로 이동
- BoardCheckPassAction.java 게시글 비밀번호 일치하는지 비교
- BoardUpdateFormAction.java 게시글 수정 페이지로 이동
- BoardUpdateAction.java 입력한 정보로 DB의 게시글 정보 수정
- BoardDeleteAction.java DB의 게시글 정보 삭제
JavaScript
- board.js 폼에 입력된 정보가 올바른지 판단하는 자바스크립트
VO
- BoardVO.java 게시글 정보 저장 클래스
DAO
- BoardDAO.java DB의 board테이블 처리 클래스
create table board(
num number(5) primary key,
pass varchar2(30),
name varchar2(30),
email varchar2(30),
title varchar2(50),
content varchar2(1000),
readcount number(4) default 0,
writedate date default sysdate
);
select * from board;
create sequence board_seq start with 0 increment by 1 minvalue 0;
insert into board(num, name, email, pass, title, content)
values(board_seq.nextval, '성윤정', 'pinksung@nate.com', '1234', '첫방문', '반갑습니다.');
insert into board(num, name, email, pass, title, content)
values(board_seq.nextval, '성윤정', 'pinksung@nate.com', '1234', '김밥', '맛있어요.');
insert into board(num, name, email, pass, title, content)
values(board_seq.nextval, '전수빈', 'pinksung@nate.com', '1234', '고등애', '일식입니다.');
insert into board(num, name, email, pass, title, content)
values(board_seq.nextval, '전윤지', 'pinksung@nate.com', '1234', '갯골마을', '돼지삼겹살이 맛있습니다.');
commit;
게시글 정보 저장하는 VO 클래스.
package com.sw.dto;
import java.sql.Timestamp;
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
@Getter
@Setter
@Data
public class BoardVO {
private int num;
private String name;
private String email;
private String pass;
private String title;
private String content;
private int readcount;
private Timestamp writedate;
}
Connection 객체 얻기 및 사용이 끝난 리소스 해제를 위한 클래스
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBManager {
public static Connection getConnection(){
Connection conn = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
//jdbc/OracleDB란 이름의 객체를 찾아서 DataSource가 받는다.
DataSource ds = (DataSource) envContext.lookup("jdbc/OracleDB");
//생성된 ds로 Connection을 구한다.
conn = ds.getConnection();
}catch(Exception e) {
e.printStackTrace();
}
return conn;
}
//select 수행 후 리소스 해제를 위한 메소드
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
rs.close();
stmt.close();
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//DML(insert, update, delete)을 수행한 후 리소스 해제를 위한 메소드
public static void close(Connection conn, Statement stmt) {
try {
stmt.close();
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
게시글 테이블에 액세스하는 DAO클래스.
우선 싱글톤 패턴만 정의.
package com.sw.dao;
import com.sw.dto.BoardVO;
import util.DBManager;
public class BoardDAO {
//싱글톤 패턴으로 만들기
private BoardDAO() {
}
private static BoardDAO instance = new BoardDAO();
public static BoardDAO getInstance() {
return instance;
}
}