Spring/Model1 _2(MVC)

0930 JSP - (MVC) BoardDTO , BoardDAO 생성

jeoniee 2022. 9. 30. 12:31
728x90
반응형

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)에 있다.

    객체 간 강한 결합을 이루게 되면 멤버 변수에 대한 오브젝트 변경시 코드의 변경이 많이 일어나 유지보수에 좋지 않다.
    인터페이스를 통해 약한 결합을 이루게 하여 유지보수를 향상시킨다.


     

    728x90
    반응형