Coding Planet

[JDBC] MVC 패턴으로 JDBC 구현하기 본문

Server

[JDBC] MVC 패턴으로 JDBC 구현하기

jhj.sharon 2023. 3. 23. 16:33
반응형

 

1. MVC(Model View Controller) 패턴

  • Model: 데이터를 저장하고 있는 역할, 혹은 DB에 접근해서 데이터를 입출력하는 객체로 백그라운드에서 동작하는       로직을 의미한다.
  • View: 사용자가 보게되는 화면, 데이터의 입력과 출력을 담당한다.
  • Controller: 사용자의 입력처리와 흐름 제어를 담당한다. 사용자의 요청을 받아 처리한 후 응답 화면을 지정한다.

 

 

 

2. JDBC에 MVC 패턴 적용하기



- Run : Servlet(JSP와 연동)

- Member View : index.html

- JDBC Templet : DB 연결(Connection 생성) 자동커밋 off,  트랜젝션 제어, jDBC 객체 자원반환(close)
   -> 이러한 JDBC에서 반복 사용되는 코드를 모아둔 클래스

- Controller : Servlet

- Model: DAO, Service, VO

- VO(Value Object) : 데이터베이스의 각 개체 저장용 클랙스가 있는 패키지로 DB 도메인 정보를 사용자에게 전달할 때 그 도메인 단위 정보를 VO에 구현한다.

출처: https://velog.io/@wooni/JDBC-MVC%ED%8C%A8%ED%84%B4

 

 

 

 

 

3. 학생 조회 서비스 구현하기

 

** 학생 조회 서비스를 구현하기 위해 MVC을 적용한 JDBC와 Servlet은 다음과 같다

 

 

 

1. 메인화면 (index.html)의 주요 기능

  • 학생 전체 조회와 학과별 학생 조회가 가능하다.
  • 사용자가 학과를 입력할 시 해당 학과에 해당하는 학생들의 정보가 출력되는 기능을 구현하고자 한다.

 

2. Servlet (Controller)

(Servlet에 관한 자세한 정보는 이전 포스트 참고 ->  https://sharonprogress.tistory.com/135

(do, get 방식에 대한 포스트는 이전 포스트 참고 -> https://sharonprogress.tistory.com/138 )

 

[Servlet]Servlet, CGI, Servlet Container의미

1. Servlet이란? 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 웹 서비스를 위한 자바 클래스 웹 프로그래밍에서 클라이언트의 요청(Request)을 처리하고 그 결과

sharonprogress.tistory.com

  • 웹 프로그래밍에서 클라이언트의 요청(Request)을 처리하고 그 결과를 다시 클라이언트에게 응답(Response)하는 Servlet 클래스에서 사용자로부터 입력받은 입력값을 doPost의 방식으로 가져온다.
  • Service객체를 생성한다.
  • 얻어온 입력값을 변수로 저장하여 Service에게 전달하는 역할을 하고 사용자의 요청을 dispatcher를 통해 JSP에게 보내준다.

 

package edu.kh.jsp.student.controller;

import java.io.IOException;
import java.util.List;

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 edu.kh.jsp.student.model.service.StudentService;
import edu.kh.jsp.student.model.vo.Student;

@WebServlet("/student/selectDep")
public class SelectDepServlet extends HttpServlet {

	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		//Service 객체 생성	
		StudentService service = new StudentService();
		
		
		try {
			
			 
			String inputDept = req.getParameter("department");
			
			//학과 별 학생  조회 서비스 호출 후 결과 반환 받기
			List<Student> stdList2 = service.selectDep(inputDept);
			
			//조회결과는 request에 세팅
			req.setAttribute("stdList2", stdList2);
			req.setAttribute("inputDep", inputDept);
			
			//요청 위임
			
			RequestDispatcher dispatcher
			= req.getRequestDispatcher("/WEB-INF/views/student/selectDep.jsp");
			
			dispatcher.forward(req, resp);
			
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}// end of doGet
}//end of class

 

 

 

3. StudentService

  • 커넥션을 생성하고 DAO메서드를 호출한다.
  • 비즈니스 로직을 담당한다. -> 메소드 호출 및 결과를 리턴한다
  • 결과에 따라 commit과 rollback 작업
  • 커넥션 객체를 반환한다.

 

package edu.kh.jsp.student.model.service;

import java.sql.Connection;
import java.util.List;

import static edu.kh.jsp.common.JDBCTemplate.*;

import edu.kh.jsp.student.model.dao.StudentDAO;
import edu.kh.jsp.student.model.vo.Student;

public class StudentService {
	
	private StudentDAO dao = new StudentDAO();

	
	public List<Student> selectDep(String inputDept) throws Exception{
		
		Connection conn = getConnection();
		
		//DAO 메서드 호출
		List<Student> stdList2 = dao.selectDep(conn, inputDept);
		
		close(conn);
		
		return stdList2;
	}

	
	
	
}//end of class

 

 

4. DAO

  • DB에 직접 접근하여 Properties를 통해 xml파일의 sql을 실행한다.
  • ResultSet를 통해 반환한다.
package edu.kh.jsp.student.model.dao;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import edu.kh.jsp.student.model.vo.Student;
import static edu.kh.jsp.common.JDBCTemplate.*;

public class StudentDAO {
	
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Properties prop;
	
	//기본생성자
	
	public StudentDAO() {
		try {
			String filePath
			=StudentDAO.class.getResource("/edu/kh/jsp/sql/student-sql.xml").getPath();
			
			prop = new Properties();
			
			prop.loadFromXML(new FileInputStream(filePath));
			
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		
	}
    
    /**학부별 학생 조회 DAO
	 * @param conn
	 * @param inputDep
	 * @return
	 * @throws Exception
	 */
	public List<Student> selectDep(Connection conn, String inputDept) throws Exception{
		
		List<Student> stdList2 = new ArrayList<>();
		try {
			String sql = prop.getProperty("selectDep");
							
			pstmt =conn.prepareStatement(sql);
						
			pstmt.setString(1, inputDept);
			
		
			
			System.out.println(inputDept);
		
			
			
			rs= pstmt.executeQuery();
			
			while(rs.next()) {
				String studentNo = rs.getString("STUDENT_NO");
				String studentName = rs.getString("STUDENT_NAME");
				String studentAddress = rs.getString("STUDENT_ADDRESS");
				String departmentName= rs.getString("DEPARTMENT_NAME");
				
				stdList2.add(
						new Student(studentNo, studentName, departmentName, studentAddress)
						);
			}
		}finally{
			close(rs);
			close(stmt);
		}
		
		return stdList2;
	}
	
}// end of class

 

 

 

 

 

결과 출력~~~

 

 

 

반응형
Comments