JSP(JDBC활용,자바빈즈)

최동민·2022년 6월 3일
0

JSP

목록 보기
2/10
post-custom-banner

자바빈즈(액션태그)

그동안 우리가 작성할 때는 편했다.
자바 쓰고 싶으면 스크립틀릿 태그 사용했고 값 쓰고 싶으면 표현식 사용했다.
그런식으로 파일을 만들다보니 다른 개발자가 보았을 때 가독성이 떨어지는 것.

만약 HTML문서에는 태그만 있다면?
태그를 제공할테니 이 태그로 객체화하고 게터세터도 만든다면?

JSP의 표준 태그를 통해 접근할 수 있는 자바 클래스로서 멤버변수와 setter getter 메소드로 이루어져 있다.

객체화를 할 때에는 반드시 기본 생성자만 호출할 수 있는 메소드

자바빈즈 태그

1. 객체 생성

<%MemberVO member = new MemberVO();%> 스크립틀릿 태그에서->

<jsp:useBean class="com.korea.beans.MemberVO" id="member">

자바 코드가 섞여있지 않고 마치 태그로만 이루어져 있는거 같아 가독성이 좋아보인다.

2. setter()

<%member.setName("홍길동");%>

<jsp:setProperty property="name" name="member" value="홍길동">

3. getter()

<%member.getName();%>

<jsp:getProperty property="name" name="member">

자바빈즈 규칙

  1. 패키지화
    : 패키지에 이름을 붙이는 작업
  1. 필드 접근자를 private으로 설정
    자바빈즈는 getter setter로 접근하기 때문에
  1. getter, setter 메소드는 public으로 설정
  1. 기본생성자 선언

JDBC를 사용하여 데이터베이스 연동하기
우선 DBconnecter 생성

package com.jspex.beans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBconnecter {
	public static Connection getConnection() {
		Connection conn = null;
		
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			String user = "hr";
			String pw = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, user, pw);
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패"); 
		} catch (Exception e) {
			System.out.println("알 수 없는 오류 " + e);
		}
		return conn;
	}
}

MemberVO에서 필드 생성

package com.jspex.beans;

//NUM NUMBER PRIMARY KEY,
//NAME VARCHAR2(1000),
//BIRTHDAY DATE
public class MemberVO {
	private int num;
	private String name;
	private String birthday;
	
	public MemberVO() {
		this.name = "이름이 없습니다.";
		this.birthday = "생일이 등록되지 않았습니다.";
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
}

MemberDAO 에서 select메소드 생성

package com.jspex.beans;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

public class MemberDAO {
	Connection conn;
	PreparedStatement pstm;
	ResultSet rs;
	
	public ArrayList<MemberVO> select(String name) {
		String query = "SELECT * FROM TBL_MEMBER WHERE NAME = ?";
		ArrayList<MemberVO> members = new ArrayList<>();
		MemberVO member = null;
		SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
		try {
			conn = DBconnecter.getConnection();
			pstm = conn.prepareStatement(query);
			pstm.setString(1, name);
			rs = pstm.executeQuery();
			
			while(rs.next()) {
				member = new MemberVO();
				member.setNum(rs.getInt(1));
				member.setName(rs.getString(2));
				member.setBirthday(sdf.format(rs.getDate(3)));
				members.add(member);
			}
			
		} catch (SQLException e) {
			System.out.println("selece(String) 쿼리 오류 " + e);
		} catch (Exception e) {
			System.out.println("select(String) 알 수 없는 오류 " + e); 
		} finally {
			try {
				if(rs != null) {
					rs.close();
				}
				if(pstm != null) {
					pstm.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				throw new RuntimeException(e.getMessage());
			}
		}
		return members;
	}
}

이제 이 메소드를. 즉 데이터베이스를 화면에서 사용할 것인데, 자바빈즈를 사용할 것이다.
javabeans_test.jsp 생성

<jsp:useBean> 객체화를 해주는 태그. 기본생성자만 호출. id는 객체명. class는 해당 객체의 풀 경로. 즉 패키지까지 다 써준다.
MemberVO 와 MemberDAO를 불러옴.

우리가 배운 걸로는 아직까지는 스크립틀릿을 같이 써준다

<%@page import="com.jspex.beans.MemberVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean class="com.jspex.beans.MemberVO" id="vo"/>
<jsp:useBean class="com.jspex.beans.MemberDAO" id="dao"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자바빈즈 예제</title>
</head>
<body>
	<!-- HTML 주석은 컴파일을 막지 않고 보여주는 부분만 주석처리해준다. 
    setProperty를 HTML주석 처리해도 화면에 남음. 컴파일을 막지 않기 때문. 화면에 한동석 12-04가 그대로 뜬다. -->
	<%-- 
		JSP 주석은 컴파일도 주석처리 된다. 주석처리 후 실행해보면
        "이름이 없습니다. 생일이 등록되지 않았습니다." 
		 위 VO생성자에서 초기화 해두었던 값이 나옴.
	--%>
	<%--
	<jsp:setProperty property="name" name="vo" value="한동석"/>
	<jsp:setProperty property="birthday" name="vo" value="12-04"/>
	--%>
	<%
		ArrayList<MemberVO> members = dao.select("한동석");
	%>
	<table border=1>
		<%for(int i=0; i<members.size(); i++) {%>
		<jsp:setProperty property="name" name="vo" value="<%=members.get(i).getName() %>"/>
		<jsp:setProperty property="birthday" name="vo" value="<%=members.get(i).getBirthday() %>"/>
		<tr>
			<%-- <td><%=members.get(i).getName()%></td>
			<td><%=members.get(i).getBirthday()%></td> --%>
			
			<td><jsp:getProperty property="name" name="vo"/></td>
			<td><jsp:getProperty property="birthday" name="vo"/></td>
		</tr>
		<%
		}
		%>
	</table>
	
<%-- 	<jsp:getProperty property="name" name="vo"/>
	<jsp:getProperty property="birthday" name="vo"/> --%>
	
</body>
</html>

브라우저 결과는 한동석12-04. DB에서 INSERT 한동석 04-25를 하고 JSP에서 다시 실행하면 한동석12-04 한동석 04-25가 같이 나온다.

결과적으로 하나의 파일에서는 하나의 언어만 쓸 수 있게끔 다 태그 또는 다 자바. 이런 식으로 자꾸 분리를 하는구나 알아갈 수 있겠다.

profile
코드를 두드리면 문이 열린다
post-custom-banner

0개의 댓글