[JSP] beans를 사용해 DB 연결

혜쿰·2023년 8월 22일
0
post-thumbnail

자바 빈즈를 활용하여 DB에 연결하는 방법을 알아보고자 한다.
상품 자료가 입력되어 있는 sangdata table 전체 또는 일부를 브라우저에 출력하는 프로그래밍이다.

📌 html

<!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 조건을 받았다.

📌 비지니스 로직

📍 Dto

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 지정자를 써야한다는 점을 유의하자 !

📍 DB Connection

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이라고 할 수 있다.

📌 jsp

📍 전체 자료 출력

<%@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를 연결하는 코드를 짠다면, 전체 자료 출력 코드와 부분 자료 출력 코드에 비지니스 로직을 각각에 다 써야한다. 지금은 두개여서 큰 불편함을 못 느낄 수 있지만 만약 더 많이 출력을 하게 된다면 엄청나게 번거로울 수 있다. 그렇기 때문에 자바 빈즈를 활용하는 것이 좋다.

0개의 댓글