Coding Planet
[JDBC] MVC 패턴으로 JDBC 구현하기 본문
반응형
1. MVC(Model View Controller) 패턴
- Model: 데이터를 저장하고 있는 역할, 혹은 DB에 접근해서 데이터를 입출력하는 객체로 백그라운드에서 동작하는 로직을 의미한다.
- View: 사용자가 보게되는 화면, 데이터의 입력과 출력을 담당한다.
- Controller: 사용자의 입력처리와 흐름 제어를 담당한다. 사용자의 요청을 받아 처리한 후 응답 화면을 지정한다.
2. JDBC에 MVC 패턴 적용하기
3. 학생 조회 서비스 구현하기
** 학생 조회 서비스를 구현하기 위해 MVC을 적용한 JDBC와 Servlet은 다음과 같다
1. 메인화면 (index.html)의 주요 기능
- 학생 전체 조회와 학과별 학생 조회가 가능하다.
- 사용자가 학과를 입력할 시 해당 학과에 해당하는 학생들의 정보가 출력되는 기능을 구현하고자 한다.
2. Servlet (Controller)
(Servlet에 관한 자세한 정보는 이전 포스트 참고 -> https://sharonprogress.tistory.com/135 )
(do, get 방식에 대한 포스트는 이전 포스트 참고 -> https://sharonprogress.tistory.com/138 )
- 웹 프로그래밍에서 클라이언트의 요청(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
결과 출력~~~
반응형
'Server' 카테고리의 다른 글
[JDBC] executeQuery와 executeUpdate()의 차이는?, 실제 사용 예제 포함 (0) | 2023.04.02 |
---|---|
[Servlet] 암호화 필터 예제 (0) | 2023.03.27 |
[Servlet/JSP] 내장 객체와 범위(scope), 내장 객체의 우선순위 (0) | 2023.03.21 |
[JSP] JSP(Java Server Page)란? Servlet와 JSP의 차이점, 지시어, 스크립팅 원소 (0) | 2023.03.20 |
톰캣(Tomcat) 설치, 이클립스 연결 (0) | 2023.03.17 |
Comments