Learn/KH정보교육원

[KH정보교육원 당산] 36일차 (어제 했던 예제 MVC-model2방식으로 변경)

Dahoon06 2021. 4. 28. 18:16
728x90
반응형

 

 

 

어제 했던 예제(model1)을 model2방식으로 변경 할 것이다.

 

** mode1 : JSP파일내에서 데이터를 처리하고 화면을 보여준다,

 

각 페이지 마다 역할을 분담한다.

 

JSP 에서는 화면(VIEW)

 

DAO 파일을 만들어서 데이터 처리

 

DTO 파일을 만들어서 데이터 전달

 

Servlet을 통하여 명령(데이터를 DTO파일한테 전달하거나 DAO파일을 불러 실행)

 

 

 

** DAO 는 데이터 베이스에 접근하여 일을 처리하는 오브젝트

    DTO 는 파일을 전달하는 역할을 하는 오브젝트 (JavaBeans)

 


goodsIndex.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>코드 번호 조회</title>
</head>

<body>
	<h2>상품 코드 번호를 입력해주세요.</h2>
	<form action="search">
		코드번호 입력 : <input type="text" name="code" size="5" maxlength="5" required="required" />
		<br /> <input type="submit" value="확인" />
	</form>
</body>
</html>

action="search" => servlet mapping:search

서블릿으로 넘기기 때문에 mapping명으로 값을 넘겨준다.

 

searchServlet.java

package com.jdh.controller;

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;
import javax.servlet.http.HttpSession;

import com.jdh.dao.GoodsDAO;
import com.jdh.dto.GoodsDTO;


@WebServlet("/search")
public class SearchServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 넘겨준 값을 받을 변수 생성
		String code = request.getParameter("code");
		
		//2. 접속 코드를 가지고 있는 GoodsDAO 객체 생성
		GoodsDAO dao = GoodsDAO.getInstance();
		
		//3. GoodsDAO 객체의 gstGoods() 메소드 호출 후 결과값 받기 -> DTO객체가 필요.(결과값을 저장받아야하니깐)
		GoodsDTO dto = dao.getGoods(code);
		//테스트 코드(값을 잘 가져왔는지.) dto쪽에 전에 사용했던 테스트 메소드를 만들어서 결과값을 확인하는 방법도 있다.(반드시 결과값이 들어왔는지 확인!!!)
		//4. 결과 값을 GoodsIndex.jsp로 전달
		HttpSession session = request.getSession();
		session.setAttribute("DTO", dto); // 두 페이지에서 동일한 값을 사용하기 위해서 session에 저장
		//request값 전달(변수를 사용했으니 RequestDispatcher)
		RequestDispatcher rd = request.getRequestDispatcher("goodsInfo.jsp");
		rd.forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

 

넘어온 값으로 한페이지만 사용한다면 request로 받아 저장해서 값을 넘겨도 되지만

** request.setAttribute("DTO", dto); => 다음 수정페이지에서 사용을 못한다..

넘어온 값을 계속 사용해야하기 때문에 session으로 저장했다.

 

HttpSession session = request.getSession();

** JSP와 다르게 Servlet는 내장 객체가 없다.

session을 사용하기 위해서는 HttpSession이 가지고 있는 session을 통하여 객체를 만들어줘야한다.

 

***   DAO 페이지  ***

package com.jdh.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.jdh.dto.GoodsDTO;

/** 데이터베이스에 접속, 쿼리실행에 관련된 모든 메소드를 보유 : SingleTone Pattern **/
public class GoodsDAO {
	//객체를 저장할 멤버변수 선언 (자기 자신을 저장)
	public static GoodsDAO instance =null;
	
	//private 생성자로 변경
	private GoodsDAO() {
	}
	
	//SingleTon
	public static GoodsDAO getInstance() {
		if(instance == null) {
			instance =  new GoodsDAO();
		}
		return instance;
	}
	
	public Connection getConnection() {
		Connection conn = null;
		String url = "jdbc:mysql://localhost:3306/web_db?uesSSL=false";
		String id = "dahoon226";
		String pw = "ekgns00";
		//JSP때는 에러페이지로 예외처리를 했는데 자바코드이기 때문에 그방법을 사용할 수 없다.
		//try~catch를 하거나 throws를 통하여 예외처리 throws로 예외처리시 객체를 사용할때 다시 예외처리 필요ㅏ.
		try {
		
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection(url,id,pw);
		} catch(ClassNotFoundException e) {
			System.err.println("DIRVER ERR : "+e.getMessage());
		} catch(SQLException e) {
			System.err.println("CONN ERR : " + e.getMessage());
		}
		return conn;
	}//getConnection() END

 

데이터베이스 접속관련

 

매번 데이터 접속할때마다 연결메소드를 작성하면 불편하여 나온 방법.

아무나 가져다 쓸 수 있게 메소드를 생성 해놓은것.

: static 이용하여 공유할  있도록 선언

 

*** DAO 설계시 주의사항

  1. 생성자를 외부에서 객체 생성하지 못하도록 반드시 private 생성자명(){ }
  2. 내부에서는 객체를 반환할  있도록 public메소드가 필요!!
  3. Connection 객체는  한개만 생성될  있도록 작업.

 

입력된 코드번호 조회

/** 코드를 이용하여 해당 데이터를 추출하여 반환 **/
//getGoods는 searchServlet에서 호출해서 사용됨.
//결과인 GoodsDTO 객체를 SearchServlet으로 반환.

	public GoodsDTO getGoods(String code) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String query = "SELECT * FROM goodInfo where code = ?";
		
		//사용이 끝나서 rs가 닫히면 rs값을 밖으로 뺼수가 없으므로 값을 빼기 위해 dto변수에 값을 저장 시킨다.
		GoodsDTO dto = null;
		try {
			//위에 만들어둔 메소드
			conn = getConnection();
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, code);
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				//dto 객체 생성
				dto = new GoodsDTO();
				//dto에 값을 저장
				dto.setCode(rs.getString("code"));
				dto.setTitle(rs.getString("title"));
				dto.setWriter(rs.getString("writer"));
				dto.setPrice(rs.getInt("price"));
				
			}
			
		} catch(SQLException e) {
			System.err.println("SEARCH ERR" + e.getMessage());
		} finally {
			try {
				if(rs != null) {
					rs.close();
				}
				if(pstmt != null) {
					pstmt.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch(SQLException e) {
				System.err.println("CLOSE ERR : "+e.getMessage());
			}
		}
		//servlet으로 값을 전달
		return dto;
		
	}//getGoods(String code) END
	

데이터를 한번에 전달할 수 있도록 DTO 변수를 생성하여 이 안에 값을 담아서 전달한다.

담은 값은 다시 서블릿으로 전달하면 서블릿에서 다음 과정을 실행 시킬 것이다.

 


goodsInfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>상품 정보</title>
</head>

<body>
	<h3>상품 정보</h3>
	코드 : ${DTO.getCode() } <br />
	제목 : ${DTO.getTitle() } <br />
	작성자 : ${DTO.getWriter() } <br />
	가격 : ${DTO.getPrice() } <br />
	<input type="button" value="수정하기" onclick="document.location.href='goodsUpdate.jsp'" />	
</body>
</html>

전 페이지에서 변수명 DTO에 값을 담아 전달 했으므로 DTO가 가지고있는 값을 꺼내 출력.

 

goodsUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>수정 페이지</title>
</head>
<body>
	<h2>수정 페이지</h2>
	<form action="update" method="get">
			코드 : <input type="text" value="${DTO.getCode() }" name="code" readonly="readonly" /><br />
			제목 : <input type="text" placeholder="${DTO.getTitle() }" name="title" required="required" /><br />
			작성자 : <input type="text" placeholder="${DTO.getWriter() }" name="writer" required="required" /><br />
			가격 : <input type="text" placeholder="${DTO.getPrice() }" name="price" required="required" /><br />
			<br />
		<input type="submit" value="수정하기" />
	</form>
</body>
</html>

코드는 수정할 수 없도록 readonly속성 부여!!

 

값을 다음 서블릿인 update으로 넘길 것이기에 action부분이 수정이 됐다.

 

UpdateServlet.java

package com.jdh.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jdh.dao.GoodsDAO;
import com.jdh.dto.GoodsDTO;


@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//System.out.println("UpdateServlet의 doGet() 실행"");
		// 1.수정된 값을 추출
		String code = request.getParameter("code");
		String title = request.getParameter("title");
		String writer = request.getParameter("writer");
		String price = request.getParameter("price");
		
		GoodsDTO dto = new GoodsDTO();
		dto.setCode(code);
		dto.setTitle(title);
		dto.setWriter(writer);
		dto.setPrice(Integer.parseInt(price));
		
		//2. GoodsDAO 객체 생성(DB접속을 해야하니깐) 
		GoodsDAO dao = GoodsDAO.getInstance();
		
		//3. GoodsDAO 객체의 updateGoods()에게 추출한 값들을 전달
		dao.updateGoods(dto);
		
		//4. 결과값을 확인 하기 위한 goodsIndex.jsp
		response.sendRedirect("goodsIndex.jsp");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

수정된 값을 변수를 생성하여 저장해준 후

그 값을 다시 DTO객체를 생성하여 저장 시켜준다.

 

Update관련 DAO페이지

/** 코드를 이용하여 해당 레코드의 데이터를 수정 **/
	public void updateGoods(GoodsDTO dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		String query = "UPDATE goodInfo SET title = ?, writer = ?, price = ? WHERE code = ?";
		
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(query);
			pstmt.setString(4,dto.getCode());
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getWriter());
			pstmt.setInt(3, dto.getPrice());
			
			pstmt.executeUpdate();
            
		} catch(SQLException e) {
			System.err.println("UPDATE ERR : "+e.getMessage());
		} finally {
			try {
				if(pstmt != null) {
					pstmt.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch(SQLException e) {
				System.err.println("CLOSE ERR : "+e.getMessage());
			}
		}
		
	}//updateGoods(GoodsDTO dto) END

값을 수정만 하면되기에 리턴값이 없다.

 

 

** DAO는 한페이지에 데이터 관련 메소드들을 정의

 


오늘 배운 내용을 토대로

 

검색기능과 수정, 간단한 회원가입 만들기 

 

 

 

  코드 자체는 위에 파일과 크게 차이나는것은 없다.

 

 

 내일 로그인 및 추가된 회원가입을 실습하니

 

이런 기능들만 모아서 따로 정리해볼 생각이다!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


728x90
반응형