일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- EC2
- TypeScript
- mariadb
- 코딩테스트
- Git
- Client
- AWS
- Jenkins
- 프로그래머스
- docker
- ssh
- sample
- 토비의스프링
- TLS
- Spring Legacy Project
- db
- window
- centos7
- vagrant
- github
- Java
- spring
- Linux
- spring boot
- SSL
- jdbc
- WebHook
- 책 정리
- Hibernate
- DISTINCT
- Today
- Total
Woopii Vyeolog
간단한 성적 처리 웹 페이지 생성하기2 (Repository 구현) 본문
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>
실행 결과
'Spring Framework' 카테고리의 다른 글
간단한 성적 처리 웹 페이지 생성하기3 (Service 구현) (0) | 2020.03.16 |
---|---|
스프링 프로젝트 WAR파일로 배포하기 (0) | 2020.03.16 |
간단한 성적 처리 웹 페이지 생성하기1 (테이블 생성,삭제,데이터 조회) (0) | 2020.03.16 |
Spring 다운, 설치, 한글 설정(UTF-8) (0) | 2020.03.16 |
Spring FrameWork 에서 CSS파일 JS파일 가져오기가 안될 때 (2) | 2020.02.12 |