0930 JSP - (MVC) BoardDTO , BoardDAO 생성
Contents
com.itwillbs.db;
BoardDTO .java
전의 게시판 만들 때와 일련의 과정은 같다.
package com.itwillbs.db;
import java.sql.Date;
public class BoardDTO {
// DTO (Data Transfer Object) 데이터 DB 전송 객체
private int bno; // 게시판 글번호 (PK)
private String name; // 글쓴이
private String pass; // 글 비밀번호
private String subject; // 글 제목
private String content; // 글 내용
private int readcount; // 조회수
private int re_ref; // 답글 - 글 그룹번호
private int re_lev; // 답글 - 글 들여쓰기
private int re_seq; // 답글 - 글 순서
private Date date; // 글 작성일
private String ip; // 글 작성자 ip 주소
private String file; // 첨부파일
//alt shift s + s
@Override
public String toString() {
return "BoardDTO [bno=" + bno + ", name=" + name + ", pass=" + pass + ", subject=" + subject + ", content="
+ content + ", readcount=" + readcount + ", re_ref=" + re_ref + ", re_lev=" + re_lev + ", re_seq="
+ re_seq + ", date=" + date + ", ip=" + ip + ", file=" + file + "]";
}
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public int getRe_ref() {
return re_ref;
}
public void setRe_ref(int re_ref) {
this.re_ref = re_ref;
}
public int getRe_lev() {
return re_lev;
}
public void setRe_lev(int re_lev) {
this.re_lev = re_lev;
}
public int getRe_seq() {
return re_seq;
}
public void setRe_seq(int re_seq) {
this.re_seq = re_seq;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
}
com.itwillbs.db;
BoardDAO.java
BoardDAO도 메소드 구조는 전과 같기 때문에 그 전 파일에서 복사했다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BoardDAO {
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private String sql = "";
//디비 연결 메서드 ()
private Connection getConnection() throws Exception {
final String DRIVER = "com.mysql.cj.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";
Class.forName(DRIVER);
//2.디비 연결
con = DriverManager.getConnection(DBURL, DBID, DBPW);
System.out.println(" DAO : 디비 연결 성공");
System.out.println(" DAO : " + con);
//연결정보를 위의 con에 저장하겠다
return con;
}
/******************************************************************************************************************************/
//자원해제 메서드-closeDB()
public void closeDB() {
System.out.println("DAO : 디비연결자원해제");
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//자원해제 메서드-closeDB()
/******************************************************************************************************************************/
//글쓰기 메서드 insertBoard(DTO)
public void insertBoard(BoardDTO dto) {
int bno = 0;
try {
//1.2. 디비 연결
con= getConnection();
//3. sql 작성 & pstmt 객체
sql = "select max(bno) from itwill_board";
pstmt = con.prepareStatement(sql);
//4. sql 실행 Query는 rs에 저장
rs = pstmt.executeQuery();
//5. 데이터 처리
if(rs.next()) {
bno = rs.getInt(1)+1;
}
System.out.println(" DAO : bno : " + bno);
//3.
sql = "insert into itwill_board(bno,name,pass,subject,content,"
+ "readcount,re_ref,re_lev,re_seq,date,ip,file)"
+ " values(?,?,?,?,?,?,?,?,?, now(),?,?)";
pstmt = con.prepareStatement(sql);
//???
pstmt.setInt(1, bno);
pstmt.setString(2, dto.getName());
pstmt.setString(3, dto.getPass());
pstmt.setString(4, dto.getSubject());
pstmt.setString(5, dto.getContent());
pstmt.setInt(6, 0); // 조회수를 0으로 초기화
pstmt.setInt(7, bno); //ref == bno
pstmt.setInt(8, 0); // lev 0
pstmt.setInt(9, 0); // seq 0
pstmt.setString(10, dto.getIp());
pstmt.setString(11, dto.getFile());
//4.
pstmt.executeUpdate();
System.out.println(" DAO : 글쓰기 완료! ");
} catch (Exception e) {
e.printStackTrace();
}finally {
closeDB();
}
}
// 글쓰기 메서드 insertBoard(DTO)
/******************************************************************************************************************************/
}
com.itwillbs.action;
BoardWriteAction.java
dto 정보 불러오기
package com.itwillbs.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itwillbs.db.BoardDAO;
import com.itwillbs.db.BoardDTO;
public class BoardWriteAction implements Action {
//글쓰기 동작 수행하는 객체
@Override
public ActionForward execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println(" M : BoardWriteAction.execute() 호출 ");
// 한글 처리
request.setCharacterEncoding("UTF-8");
// 전달 정보 (파라메터 저장)
BoardDTO dto = new BoardDTO();
dto.setSubject(request.getParameter("subject"));
dto.setName(request.getParameter("name"));
dto.setPass(request.getParameter("pass"));
dto.setContent(request.getParameter("content"));
// ip 저장
dto.setIp(request.getRemoteAddr());
System.out.println(" M : " + dto);
// BoardDAO 객체 - 내가 db에 대한 동작을 수행해야하니까 객체를 따로 생성해야함!
BoardDAO dao = new BoardDAO();
// insertBoard()
dao.insertBoard(dto);
// 페이지 이동
return null;
}
}
항상 실행은 INDEX 에서~
[ c o n s o l e ]
BoardFrontController - doGet() 호출
BoardFrontController - doProcess() 호출
GET / POST 방식 상관없이 한번에 처리
C : (1단계 시작) 가상주소 계산 시작----------------------------------
C: requestURI : /MVC/BoardWrite.bo
C : ctxPath언니화이팅 : /MVC
C : command : /BoardWrite.bo
C : (1단계 끝) 가상주소 계산 완료----------------------------------
C : (2단계 시작) 가상주소 매핑 시작----------------------------------
C : /BoardWrite.bo 호출
C : [패턴2] DB 사용 O , 페이지 이동
M : BoardWriteAction.execute() 호출
M : BoardDTO [bno=0, name=먼지, pass=1234, subject=테스트, content=1234, readcount=0, re_ref=0, re_lev=0, re_seq=0, date=null, ip=0:0:0:0:0:0:0:1, file=null]
DAO : 디비 연결 성공
DAO : com.mysql.cj.jdbc.ConnectionImpl@6dab4601
DAO : bno : 32
DAO : 글쓰기 완료!
DAO : 디비연결자원해제
C : (2단계 끝) 가상주소 매핑 완료----------------------------------
C : (3단계 시작) 페이지 이동 시작----------------------------------
C : (3단계 끝) 페이지 이동 완료----------------------------------
페이지 이동 정보 생성 (티켓 생성)
BoardWriteAction.java
주소가 바뀌면서 화면이 바뀌는 방식 setRedirect
ActionForward forward = new ActionForward();
forward.setPath("./BoardList.bo");
forward.setRedirect(true);
return forward;
forward를 리턴
할거 다 했으니 티켓 가지고 가라..
execute는 controller 안에 try catch 가 호출함!
BoardFrontcontroller.java
bwa.execute 앞에 forward를 넣어준다.
try {
forward = bwa.execute(request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index 에서 실행시키면, 똑같은 흰색 페이지지만 주소가 바뀐다.
http://localhost:8088/MVC/BoardList.bo
jsp를 다이렉트로 실행하면 시작하는 위치가 다르기 때문에
매핑이 안되는 이유..
index.jsp 에서 꼭 실행시켜야 함.
강한 결합과 약한 결합
강한 결합
객체의 의존 관계에서 강한 결합이란, 어떠한 객체가 다른 객체에 강한 의존성을 가지고 있음을 뜻한다.
//BoardWriteAction() 객체 생성
//강한 결합 (결합도 높다) -
BoardWriteAction bwa = new BoardWriteAction();
Action action = new BoardWriteAction();
업캐스팅 함.
약한 결합
약한 결합의 코드는 다른 클래스의 변화에 안전하고 유연하게 대처가 가능하다는 장점
//약한 결합 (결합도 낮다)
Action action = new BoardWriteAction();
try {
forward = action.execute(request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
객체가 객체를 직접 생성하면 강한결합이라고 할 수 있고
누군가 생성한 객체를 주입 받는 경우에는 약한 결합이라고 할 수있다.
그렇다면 객체 간의 강한 결합을 약화시켜 약한 결합을 이룰 수 있게 하는 방법은 없을까?
해결책은 인터페이스(Interface)에 있다.
객체 간 강한 결합을 이루게 되면 멤버 변수에 대한 오브젝트 변경시 코드의 변경이 많이 일어나 유지보수에 좋지 않다.
인터페이스를 통해 약한 결합을 이루게 하여 유지보수를 향상시킨다.