본문 바로가기
Programming/Java

JSP Servlet :: DAO, DTO, Controller 이용한 MVC패턴 CRUD 메모장 만들기 (1)

by wonduk 2023. 8. 8.
728x90

프로젝트 만들 때 구상법

DB테이블 생성 -> DTO생성 -> DAO 생성 ->  Controller(Servlet) 생성 -> View(JSP) 파일 생성

 

 


 

1. DB 테이블 생성

 

1-1. 메모장에 들어갈 데이터: 글번호(no), 제목(title), 내용(content), 작성일(wdate)

create table Memo(
 no number(10) primary key,
 title varchar2(50) not null,
 content varchar(1000) not null,
 wdate date default sysdate not null
);

 

 

1-2.  자동 글번호 생성을 위한 시퀀스 생성 및 테스트를 위한 더미데이터 생성해주기

create sequence seq_Memo_no;

insert into Memo values(seq_Memo_no.nextval,'더미제목','내용',default);

 

 


 

2.DTO 생성하기

: DB에서 생성한 객체들을 게터세터로 묶어줌

 

memo.mvcboard 패키지 생성 -> MemoDTO.java 생성

package memo.mvcboard;

import model1.board.BoardDTO;

public class MemoDTO  {
	private int no;
	private String title;
	private String content;
	private java.sql.Date  wdate;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public java.sql.Date getWdate() {
		return wdate;
	}
	public void setWdate(java.sql.Date wdate) {
		this.wdate = wdate;
	}
}

 

 


 

 

3. DAO 생성 (CRUD 역할을 할 메서드 생성)

 

package memo.mvcboard;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import common.DBConnPool;
import model2.mvcboard.MVCBoardDTO;

public class MemoDAO extends DBConnPool{
	//DB Connection
		public MemoDAO() {
			super();
		}
		
		//글의 갯수
		public int selectCount(Map<String,Object> map) {
			int totalCount=0;
			String query="select count(*) from Memo ";
			if(map.get("searchWord")!=null) {
				query += " WHERE " + map.get("searchField") + " "
		                   + " LIKE '%" + map.get("searchWord") + "%'";
			}
			try {
				stmt=con.createStatement();
				rs=stmt.executeQuery(query);
				rs.next();
				totalCount=rs.getInt(1);
			} catch (Exception e) {
	            System.out.println("메모  갯수를 구하는 중 예외 발생");
	            e.printStackTrace();
	        }
			return totalCount;
		}
		
		//글목록 with paging
		public List<MemoDTO> selectListPage(Map<String,Object> map){
			List<MemoDTO> board = new ArrayList<MemoDTO>(); //board가 목록임
			
			String query="select * from ( "
					+ " 		select tb.*, rownum rnum from ( "
					+ "				select * from Memo ";
			//검색한 경우 추가
			if(map.get("searchWord")!=null) {
				query+=" where "+map.get("searchField")+""
						+ " like '%"+map.get("searchWord")+"%'";
			}
			query+="		order by no desc "
					+ "		) tb "
					+ " ) "
					+ "	where rnum between ? and ?";
//			System.out.println(query);
			try { //select한 결과를 dto에 담음
				psmt=con.prepareStatement(query);
				psmt.setString(1, map.get("start").toString());
				psmt.setString(2, map.get("end").toString());
				rs=psmt.executeQuery();
				while(rs.next()) {
					MemoDTO dto=new MemoDTO();
					dto.setNo(rs.getInt("no"));
					dto.setTitle(rs.getString("title"));
					dto.setContent(rs.getString("content"));
					dto.setWdate(rs.getDate("wdate"));
					
					board.add(dto);
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
			return board; //리스트값 리턴
		}

		// 주어진 일련번호에 해당하는 게시물을 DTO에 담아 반환합니다.
		public MemoDTO selectView(String no) {
			MemoDTO dto = new MemoDTO();  // DTO 객체 생성
	        String query = "SELECT * FROM Memo WHERE no=?";  // 쿼리문 템플릿 준비
	        try {
	            psmt = con.prepareStatement(query);  // 쿼리문 준비
	            psmt.setString(1, no);  // 인파라미터 설정
	            rs = psmt.executeQuery();  // 쿼리문 실행

	            if (rs.next()) {  // 결과를 DTO 객체에 저장
	                dto.setNo(rs.getInt("no"));
	                dto.setTitle(rs.getString("title"));
	                dto.setContent(rs.getString("content"));
	                dto.setWdate(rs.getDate("wdate"));
	            }
	        }
	        catch (Exception e) {
	            System.out.println("메모 상세보기 중 예외 발생");
	            e.printStackTrace();
	        }
	        return dto;  // 결과 반환
	    }

		// 게시글 데이터를 받아 DB에 추가합니다(파일 업로드 지원). DTO타입으로 받아 옴
	    public int insertWrite(MemoDTO dto) {
	        int result = 0;
	        try {
//	        	System.out.println("======================"+dto.getTitle()); //디버깅
	            String query = "INSERT INTO Memo ( "
	                         + " no, title, content, wdate ) "
	                         + " VALUES ( "
	                         + " seq_board_num.NEXTVAL,?,?,default )";
	            //DTO에서 하나씩 꺼내와서 값을 넣어줌
	            psmt = con.prepareStatement(query);
	            psmt.setString(1, dto.getTitle());
	            psmt.setString(2, dto.getContent());
	            result = psmt.executeUpdate();
	        }
	        catch (Exception e) {
	            System.out.println("게시물 입력 중 예외 발생");
	            e.printStackTrace();
	        }
	        return result;
	    }

	    // 게시글 데이터를 받아 DB에 저장되어 있던 내용을 갱신합니다(파일 업로드 지원).
	    public int updatePost(MemoDTO dto) {
	    	System.out.println("DAO================" + dto.getTitle());
	    	System.out.println("DAO=nononono===============" + dto.getNo());
	        int result = 0;
	        try {
	            // 쿼리문 템플릿 준비
	            String query = "UPDATE memo"
	                         + " SET title=?, content=?"
	                         + " WHERE no=?";

	            // 쿼리문 준비
	            psmt = con.prepareStatement(query);
	            psmt.setString(1, dto.getTitle());
	            psmt.setString(2, dto.getContent());
	            psmt.setInt(3, dto.getNo());
	            

	            // 쿼리문 실행
	            result = psmt.executeUpdate();
	            System.out.println(psmt);
	        }
	        catch (Exception e) {
	            System.out.println("게시물 수정 중 예외 발생");
	            e.printStackTrace();
	        }
	        return result;
	    }
	    
	    
	    
	    
	    //게시물 삭제
	    public int deletePost(String no) {
	    	System.out.println("DAO===================="+no);
	    	int result = 0;
	    	try {
	    		//delete는 Primary키만 있으면 삭제가 가능하기 때문에 키를 1개만 가져옴
	    		String query = "DELETE FROM Memo WHERE no=? ";
	    		psmt = con.prepareStatement(query);
	    		psmt.setString(1,no);
	    		result = psmt.executeUpdate();
	    	}
	    	catch (Exception e) {
	    		System.out.println("게시물 삭제 중 예외 발생");
	    		e.printStackTrace();
	    	}
	    	return result;
	    }

}

 

 

여기까지 DAO, DTO 작성 후 다음 글에서 Controllor 작성을 올리겠습니다

728x90