자바 빈즈를 활용하여 DB에 연결하는 방법을 알아보고자 한다.
상품 자료가 입력되어 있는 sangdata table 전체 또는 일부를 브라우저에 출력하는 프로그래밍이다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
beans를 사용해 DB 자료 출력<br/>
<a href="test12dbshow.jsp">상품자료 전체 읽기</a>
<a href="test12dbshow2.jsp?code=3">상품자료 부분 읽기</a><br/>
</body>
</html>
우선, html의 a태그를 통해 상품자료 전체를 읽는 jsp파일과 부분을 읽는 jsp파일로 이동할 수 있게 하였다. 상품자료를 input태그를 통해 받을 수도 있지만 간단한 동작원리를 보는 것이 목적이기 때문에 주소를 통해 ?code=3
조건을 받았다.
package pack;
public class Test12SangpumDto {
// 레코드 단위 처리를 위함
private String code, sang, su, dan;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSang() {
return sang;
}
public void setSang(String sang) {
this.sang = sang;
}
public String getSu() {
return su;
}
public void setSu(String su) {
this.su = su;
}
public String getDan() {
return dan;
}
public void setDan(String dan) {
this.dan = dan;
}
}
받을 변수들에 대한 getter와 setter를 모두 작성해준다. 이 때, 테이블의 칼럼명과 동일하게 써야하고 private 지정자를 써야한다는 점을 유의하자 !
package pack;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class Test12Conn {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
public Test12Conn (){
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch (Exception e) {
System.out.println("연결 실패 : "+e);
}
}
public ArrayList<Test12SangpumDto> getDataAll(){
ArrayList<Test12SangpumDto> list = new ArrayList<Test12SangpumDto>();
try {
// db는 필요할 때 연결하고 처리가 끝나면 연결을 끊는다.
conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/test","root","비밀번호");
String sql = "select * from sangdata";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
Test12SangpumDto dto = new Test12SangpumDto();
dto.setCode(rs.getString("code"));
dto.setSang(rs.getString("sang"));
dto.setSu(rs.getString("su"));
dto.setDan(rs.getString("dan"));
list.add(dto);
}
} catch (Exception e) {
System.out.println("getDataAll err : "+e);
} finally {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
return list;
}
public Test12SangpumDto getData(int code){
Test12SangpumDto dto = null;
try {
// db는 필요할 때 연결하고 처리가 끝나면 연결을 끊는다.
conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/test","root","비밀번호");
String sql = "select * from sangdata where code=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, code);
rs = pstmt.executeQuery();
if(rs.next()) {
dto = new Test12SangpumDto();
dto.setCode(rs.getString("code"));
dto.setSang(rs.getString("sang"));
dto.setSu(rs.getString("su"));
dto.setDan(rs.getString("dan"));
}
} catch (Exception e) {
System.out.println("getDataAll err : "+e);
} finally {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
return dto;
}
}
여기서 getDataAll(), getData(int code) 메서드를 임의로 만들었다.
getDataAll()은 테이블에서 모든 자료를 가져오는 메소드 이고, spl문으로 나타낸다면 select * from sangdata
이다.
getData(int code)는 특정 code의 테이블을 가져오는 메소드이다. sql문으로 나타낸다면 select * from sangdata where code=?
이다. 여기서 ? 값은 pstmt.setInt(1, code);를 통해 첫번째 물음표에는 code를 집어 넣는 것을 볼 수 있다. 여기서 말하는 코드는 html의 a태그 주소의 code=3이라고 할 수 있다.
<%@page import="pack.Test12SangpumDto"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="test12Conn" class="pack.Test12Conn"></jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>* 상품 자료 *</h2>
<table border="1">
<tr><th>코드</th><th>품명</th><th>수량</th><th>단가</th></tr>
<%
ArrayList<Test12SangpumDto> list = test12Conn.getDataAll();
for(Test12SangpumDto s:list) {
%>
<tr>
<td><%=s.getCode()%></td>
<td><%=s.getSang()%></td>
<td><%=s.getSu()%></td>
<td><%=s.getDan()%></td>
</tr>
<%
}
%>
</table>
건수 : <%= list.size() %>
</body>
</html>
위에 작성한 DB Connection 클래스를 useBean 액션태그를 통해 비지니스 로직을 사용한다. getDataAll() 메서드를 통해 전체 자료를 입력받는 메서드를 사용하여 전체를 출력한다. list.size()를 통해 건수(행의 개수)를 출력한다.
<%@page import="pack.Test12SangpumDto"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="test12Conn" class="pack.Test12Conn"></jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>* 상품 자료 *</h2>
<table border="1">
<tr><th>코드</th><th>품명</th><th>수량</th><th>단가</th></tr>
<%
int code = Integer.parseInt(request.getParameter("code"));
Test12SangpumDto dto = test12Conn.getData(code);
%>
<tr>
<td><%=dto.getCode()%></td>
<td><%=dto.getSang()%></td>
<td><%=dto.getSu()%></td>
<td><%=dto.getDan()%></td>
</tr>
</table>
</body>
</html>
위에 작성한 DB Connection 클래스를 useBean 액션태그를 통해 비지니스 로직을 사용한다.
int code = Integer.parseInt(request.getParameter("code"));
html a태그의 주소 "?code=3"에서 3을 추출하는 코드이다. request.getParameter("code")를 통해 코드 값을 받고, parseInt를 통해 숫자만 뽑아 내고, Integer를 통해 숫자로 casting 한다.
getData(code) 메서드를 통해 code가 3인 상품을 출력한다.
list.size()를 통해 건수(행의 개수)를 출력한다.
이렇게 자바빈즈를 활용해 비지니스 로직과 출력창을 따로 입력한다면 효율적인 코드를 작성할 수 있다.
만약 자바로 db를 연결하는 코드를 짠다면, 전체 자료 출력 코드와 부분 자료 출력 코드에 비지니스 로직을 각각에 다 써야한다. 지금은 두개여서 큰 불편함을 못 느낄 수 있지만 만약 더 많이 출력을 하게 된다면 엄청나게 번거로울 수 있다. 그렇기 때문에 자바 빈즈를 활용하는 것이 좋다.