Woopii Vyeolog

간단한 성적 처리 웹 페이지 생성하기2 (Repository 구현) 본문

Spring Framework

간단한 성적 처리 웹 페이지 생성하기2 (Repository 구현)

WooPii 2020. 3. 16. 17:18

github : https://github.com/leewoopyo/exam/tree/exam_v2

 

MVC 모델(해당 글에서는 Repository만 구현할 것임)

 

 

Repository는 MVC모델에서 DB를 다루는 영역이다.

 

DB에 직접 연결하여 CRUD하는 영역이라고 볼 수 있다.

 

 

 

CRUD? : Create, Read, Update, Delete

 

성적 처리 페이지에서 Repository 영역 구현

앞에서 만든 성적관리 웹 페이지에서 MVC모델의 Repository 영역을 구현해 놓은 버전이다. 

(앞에서 만든 성적관리 웹 페이지 : https://woopi1087.tistory.com/22)

 

 

● Repository영역

 

1. ReporitoryIO(domain)(ExamRIO.java)

 

실제 DB에서 다루는 데이터를 구현해 놓은 클래스이다. 

 

<ExamRIO.java>

package kopo.domain;

public class ExamRIO {
	
	//다룰 데이터 선언
	private String name;	//이름
	private int studentid;	//학번
	private int kor;		//국어점수
	private int eng;		//영어점수 
	private int mat;		//수학점수
	
	//constructor 선언 빈 생성자와 데이터가 같이 들어있는 생성자를 같이 만들어 준다.
	public ExamRIO() {
		super();
	}
	public ExamRIO(String name, int studentid, int kor, int eng, int mat) {
		super();
		this.name = name;
		this.studentid = studentid;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	
	//getter, setter 메소드 생성 : 데이터를 불러오고 적용할 때 사용한다. 
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getStudentid() {
		return studentid;
	}
	public void setStudentid(int studentid) {
		this.studentid = studentid;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMat() {
		return mat;
	}
	public void setMat(int mat) {
		this.mat = mat;
	}
	
}

 

 

2. Reporitory(DAO)(ExamRepo.java)

 

DB와 직접 연결해서 CRUD 하는 클래스

 

<ExamRepo.java>

package kopo.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import kopo.domain.ExamRIO;

public class ExamRepo {

	/**
	 * DB연결하는 메소드(따로 연결하는 메소드를 만들어서 연결시마다 해당 메소드를 불러오게 한다. return : 커넥션 객체
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			conn = DriverManager.getConnection("jdbc:mysql://192.168.56.1/kopo", "kopo15", "Qwer1234!!");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * DB데이블을 생성하는 메소드
	 * @return int형인 status를 반환한다.
	 */
	public static int createDB() {
		String sql = null;
		int status = 0;
		try {
			// sql구문을 담고
			sql = "create table examtable(" + "name varchar(20)," + "studentid int not null primary key," + "kor int,"
					+ "eng int," + "mat int)" + "DEFAULT CHARSET=utf8;";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// statement객체를 만들고
			Statement stmt = conn.createStatement();
			// 위 sql문을 statement에 담는다.
			stmt.executeUpdate(sql);

			// 작업이 완료되면 열었던 객체를 닫는다.
			stmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return status;
	}

	/**
	 * DB데이블을 삭제하는 메소드
	 * @return int형인 status를 반환한다.
	 */
	public static int dropDB() {
		String sql = null;
		int status = 0;
		try {
			// sql구문을 담고
			sql = "drop table examtable";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// statement객체를 만들고
			Statement stmt = conn.createStatement();
			// statement에 sql문은 담는다.
			stmt.executeUpdate(sql);

			// 작업이 완료되면 열었던 객체를 닫는다.
			stmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return status;
	}

	/**
	 * 데이터를 insert하는 메소드
	 * @param u : ExanRIO형의 데이터(DB에 삽입된 데이터)
	 * @return int형인 status를 반환한다.
	 */
	public static int insert(ExamRIO u) {
		String sql = null;
		int status = 0;
		try {
			// sql구문을 담고
			sql = "insert into examtable(name,studentid,kor,eng,mat) values (?,?,?,?,?);";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// 해당 sql문을 statement에 담고
			PreparedStatement pstmt = conn.prepareStatement(sql);

			// sql문에 적용할 값들을 받은 매개변수로 변경한다.
			// ExamRIO 형의 데이터를 가져오기 때문에 개별 데이터를 가져오기 위해서는 get...로 개별 데이터를 가져온다.
			pstmt.setString(1, u.getName());
			pstmt.setInt(2, u.getStudentid());
			pstmt.setInt(3, u.getKor());
			pstmt.setInt(4, u.getEng());
			pstmt.setInt(5, u.getMat());

			// statement를 실행한다. 그 값을 status에 넣는다.
			status = pstmt.executeUpdate();
			// 작업이 완료되면 열었던 객체를 닫는다.
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return status;
	}

	/**
	 * 데이터를 update 하는 메소드
	 * @param u : ExanRIO형의 데이터(DB에 삽입된 데이터)
	 * @return int형인 status를 반환한다.
	 */
	public static int update(ExamRIO u) {
		String sql = null;
		int status = 0;
		try {
			// sql구문을 담고
			sql = "update examtable set name = ?,studentid = ?, kor = ?, eng = ?, mat = ? where studentid = ?;";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// 해당 sql문을 statement에 담고
			PreparedStatement pstmt = conn.prepareStatement(sql);

			// sql문에 적용할 값들을 받은 매개변수로 변경한다.
			// ExamRIO 형의 데이터를 가져오기 때문에 개별 데이터를 가져오기 위해서는 get...로 개별 데이터를 가져온다.
			pstmt.setString(1, u.getName());
			pstmt.setInt(2, u.getStudentid());
			pstmt.setInt(3, u.getKor());
			pstmt.setInt(4, u.getEng());
			pstmt.setInt(5, u.getMat());
			pstmt.setInt(6, u.getStudentid());

			// statement를 실행한다. 그 값을 status에 넣는다.
			status = pstmt.executeUpdate();
			// 작업이 완료되면 열었던 객체를 닫는다.
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return status;
	}

	/**
	 * 데이터를 delete 하는 메소드
	 * @param u : ExanRIO형의 데이터(DB에 삽입된 데이터)
	 * @return int형인 status를 반환한다.
	 */
	public static int delete(ExamRIO u) {
		String sql = null;
		int status = 0;
		try {
			// sql구문을 담고
			sql = "dalete from examtable where studentid = ?;";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// 해당 sql문을 statement에 담고
			PreparedStatement pstmt = conn.prepareStatement(sql);

			// sql문에 적용할 값들을 받은 매개변수로 변경한다.
			// ExamRIO 형의 데이터를 가져오기 때문에 개별 데이터를 가져오기 위해서는 get...로 개별 데이터를 가져온다.
			pstmt.setInt(1, u.getStudentid());
			// statement를 실행한다.
			status = pstmt.executeUpdate();
			// 작업이 완료되면 열었던 객체를 닫는다.
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return status;
	}

	/**
	 * 전체 데이터를 출력하는 메소드
	 * 
	 * @return 전체 데이터가 담김 메소드를 리턴한다.
	 */
	public static List<ExamRIO> getAllrecords() {
		List<ExamRIO> list = new ArrayList<ExamRIO>();
		String sql = null;
		try {
			// sql구문을 담고
			sql = "select * from examtable;";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// 해당 sql문을 statement에 담고
			PreparedStatement pstmt = conn.prepareStatement(sql);
			// resultset(여러개의 레코드를 담을 수 있음) 객체 선언해서 statement 결과를 담는다
			ResultSet rset = pstmt.executeQuery();

			// 반목문으로 하나씩 출력
			while (rset.next()) {
				ExamRIO u = new ExamRIO(); // ExamRIO 객체 생성
				u.setName(rset.getString("name")); // 해당 name값을 ExamRIO에 넣는다.
				u.setStudentid(rset.getInt("studentid")); // 해당 studentid값을 ExamRIO에 넣는다.
				u.setKor(rset.getInt("kor"));// 해당 kor값을 ExamRIO에 넣는다.
				u.setEng(rset.getInt("eng"));// 해당 eng값을 ExamRIO에 넣는다.
				u.setMat(rset.getInt("mat"));// 해당 mat값을 ExamRIO에 넣는다.
				list.add(u); // list에 추가 한다.
			}

			// 작업이 완료되면 열었던 객체를 닫는다.
			rset.close();
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return list;
	}

	/**
	 * 해당 학번을 가진 학생만 출력한다.
	 * 
	 * @param id : 학번(studentid)
	 * @return ExamRIO 형의 데이터
	 */
	public static ExamRIO getRecordById(int studentid) {
		ExamRIO u = new ExamRIO();
		String sql = null;
		try {
			// sql구문을 담고
			sql = "select * from examtable where studentid = ?;";
			// 커넥션 객체 생성
			Connection conn = getConnection();
			// 해당 sql문을 statement에 담고
			PreparedStatement pstmt = conn.prepareStatement(sql);
			// 해당 sql문에 적용할 데이터를 세팅한다.
			pstmt.setInt(1, studentid);
			// resultset(여러개의 레코드를 담을 수 있음) 객체 선언해서 statement 결과를 담는다
			ResultSet rset = pstmt.executeQuery();
			// 반목문으로 하나씩 출력
			while (rset.next()) {
				u.setName(rset.getString("name"));
				u.setStudentid(rset.getInt("studentid"));
				u.setKor(rset.getInt("kor"));
				u.setEng(rset.getInt("eng"));
				u.setMat(rset.getInt("mat"));
			}
			// 작업이 완료되면 열었던 객체를 닫는다.
			rset.close();
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			System.out.println(e);
		}
		return u;
	}

}

 

 

● view영역

 

1. 메인 화면 (index.html)

 

프레임으로 2 화면으로 나누어 표시

메뉴화면과 실제 내용이 나오는 화면으로 구성 

 

<index.html>

<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
<!-- 프레임으로 화면을 2개로 나눔 -->
<frameset cols="130,*" border="0" frameborder="1">
	<!-- 메뉴가 나오는 부분 -->
	<frame src="menu.html">
	<!-- 실제 내용이 나오는 부분 name을 main으로 해줘서 메뉴와 연동되게 할 것이다. -->
	<frame src="#" name="main">
</frameset>
</head>
<body>
</body>
</html>

 

2. 메뉴화면 (menu.html)

 

테이블 생성, 삭제, 데이터 조회로 이동하는 메뉴페이지

 

<menu.html>

 

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <!-- a태그로 각 기능을 가진 페이지에 링크를 만들고  -->
    <!-- target으로 화면에 출력할 곳을 설정한다. 타겟이 main이라서 main이란 이름의 프레임에 출력될것이다. -->
    <a href="createDB.jsp" target="main">테이블 생성</a><br>
    <a href="dropDB.jsp" target="main">테이블 삭제</a><br>
    <a href="allsetDB.jsp" target="main">데이터 생성</a><br>
    <a href="allviewDB.jsp" target="main">전체 데이터</a><br>
</body>
</html>

 

3. 테이블 생성 페이지(createDB.jsp)

 

DB 테이블을 생성하는 기능을 가진 페이지다.

 

<createDB.jsp>

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*"%>
<%@ page import="kopo.dao.*,kopo.domain.*" %>

<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h3>테이블 생성</h3>

<%
    try{
        //ExamRepo클래스의 createDB메소드를 실행한다 .(실행하면 테이블 생성)
        ExamRepo.createDB();
    }catch(Exception e){
        out.print("테이블 생성 중 에러 발생" + e);
    }
%>

</body>
</html>

 

4. 테이블 삭제 페이지(dropDB.jsp)

 

DB 테이블을 삭제하는 기능을 가진 페이지다.

 

<dropDB.jsp>

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*"%>
<%@ page import="kopo.dao.*,kopo.domain.*" %>

<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h3>테이블 삭제</h3>

<%
try{
	//ExamRepo클래스의 dropDB메소드를 실행한다 .(실행하면 테이블 삭제)
	ExamRepo.dropDB();
}catch(Exception e){
	out.print("테이블 드랍 중 에러 발생" + e);
}
%>

</body>
</html>

 

5. 데이터 삽입 페이지(allsetDB.jsp)

 

학생1~학생9까지의 성적데이터를 DB에 넣는 기능을 가진 페이지이다.

 

<allsetDB.jsp>

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*"%>
<%@ page import="kopo.dao.*,kopo.domain.*" %>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h3>테이블 값 넣기</h3>
<%
//ExamRIO클래스와 ExamRepo클래스를 사용하려면 해당 클래스를 임포트 해야한다.
//ExamRepo클래스에 있는 insert메소드를 불러온다 매개변수로 ExamRIO형의 데이터를 넣고 
//ExamRIO클래스 에서 선언한 생성자에 맞게 객체를 선언한다.
try{
	ExamRepo.insert(new ExamRIO("학생1",209901,95,100,95));
	ExamRepo.insert(new ExamRIO("학생2",209902,90,90,100));
	ExamRepo.insert(new ExamRIO("학생3",209903,85,80,95));
	ExamRepo.insert(new ExamRIO("학생4",209904,75,100,85));
	ExamRepo.insert(new ExamRIO("학생5",209905,85,70,75));
	ExamRepo.insert(new ExamRIO("학생6",209906,95,80,95));
	ExamRepo.insert(new ExamRIO("학생7",209907,85,100,85));
	ExamRepo.insert(new ExamRIO("학생8",209908,75,90,65));
	ExamRepo.insert(new ExamRIO("학생9",209909,85,80,95));
}catch(Exception e){
	out.print("테이블 생성 중 에러 발생" + e);
}

%>

</body>
</html>

6. 데이터 전체 조회 페이지(allviewDB.jsp)

 

전체 성적 데이터 조회

 

<allviewDB.jsp>

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*, java.util.*, java.net.*"%>
<%@ page import="kopo.dao.*,kopo.domain.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>	<!-- jstl 사용을 위한 임포트  -->
<html>
<head>
<title>Insert title here</title>
</head>
<body>

<h3>전체 데이터</h3>
<hr>
<%
try{
	//ExamRIO형이 담기는 list선언하고, 전체 데이터 를 가져오는 메소드를 실행한다. 
	List<ExamRIO> exams = ExamRepo.getAllrecords();
%>
<!-- 테이블 작성 -->
<table cellspacing=1 width=600 border=1>
	<tr>
		<td width=50><p align=center>이름</p></td>
		<td width=50><p align=center>학번</p></td>
		<td width=50><p align=center>국어</p></td>
		<td width=50><p align=center>영어</p></td>
		<td width=50><p align=center>수학</p></td>		
	</tr>

<%
//실제 list에 담기 내용이 나오는 부분이다. 반복문은 통해 ExamRIO형으로 한줄씩 출력한다.
//size로 전체 데이터 갯수만큼 반복하고, getter메소드를 이용해서 ExamRIO형에 담긴 데이터를 불러온다.
//tr과 td를 반복문 안에 넣어서 해당 테이블 요소도 반복될 수 있게 한다. 
	for(int i=0; i<exams.size();i++){%>
		<tr>
			<td width=50><p align=center>
			<a href="oneviewDB.jsp?studentid=<%=Integer.toString(exams.get(i).getStudentid()) %>">
			<%=exams.get(i).getName() %></a></p></td>
			<td width=50><p align=center>
			<a href="oneviewDB.jsp?studentid=<%=Integer.toString(exams.get(i).getStudentid()) %>">
			<%=Integer.toString(exams.get(i).getStudentid())%></a></p></td>
			<td width=50><p align=center><%=Integer.toString(exams.get(i).getKor())%></p></td>
			<td width=50><p align=center><%=Integer.toString(exams.get(i).getEng())%></p></td>
			<td width=50><p align=center><%=Integer.toString(exams.get(i).getMat())%></p></td>
		</tr>
	<%}
}catch(Exception e){ 
	out.print("테이블 생성 에러 발생" + e);
} 
%>
</table>
</body>
</html>

 

7.  특정 데이터 조회 페이지(oneviewDB.jsp)

 

전체 성적 데이터 조회

 

<oneviewDB.jsp>

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*, java.util.*, java.net.*"%>
<%@ page import="kopo.dao.*,kopo.domain.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>	<!-- jstl 사용을 위한 임포트  -->

<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h3>조회</h3>
<hr>
<%
//AllviewDB에서 넘겨준 파라메터 값을 받고 studentid 변수에 담는다 .
int studentid = Integer.parseInt(request.getParameter("studentid"));
try{
//해당 studentid를 매개변수로 하는 getRecordById메소드를 실행한다.(해당 학번과 일치하는 데이터만 출력)
	ExamRIO exam = ExamRepo.getRecordById(studentid);
%>
<!-- 테이블 생성  -->
	<table cellspacing=1 width=600 border=1>
	<tr>
		<td width=50><p align=center>이름</p></td>
		<td width=50><p align=center>학번</p></td>
		<td width=50><p align=center>국어</p></td>
		<td width=50><p align=center>영어</p></td>
		<td width=50><p align=center>수학</p></td>
	</tr>	
<!-- getter메소드를 통해서 exam변수에 저장된 값을 가져온다. -->
	<tr>
		<td width=50><p align=center><%=exam.getName() %></p></td>
		<td width=50><p align=center><%=exam.getStudentid() %></p></td>
		<td width=50><p align=center><%=exam.getKor() %></p></td>
		<td width=50><p align=center><%=exam.getEng() %></p></td>
		<td width=50><p align=center><%=exam.getMat() %></p></td>
	</tr>	
	</table>
	
<%	
}catch(Exception e){
	out.print("oneview중 에러발생" + e);
}
%>
</body>
</html>

 

실행 결과

 

Comments