본문 바로가기

JSP

[JSP] Java Beans와 JSP 빈즈태그

Model1 방식에서 사용하기 때문에 현재에 들어서는 사용하지 않는 태그이기도하다.

하지만 Java Beans가 무엇이고, 사용하는 방법은 다른 View Template Engine과 크게 다르지 않다.

때문에 간단한 개념만 다룰것이다.

JSP 페이지의 문제점

  • HTML을 제외한 여러 로직이 존재해 View와 Controll이 완전한 분리가 되지 않음.
  • JSP페이지 내 작성된 프로그램 코드는 다시 사용하기 어렵기 때문에 코드의 중복이 발생한다.
  • 이러한 문제점을 해결하기 위해 Java Beans을 사용해 HTML과 Java Code를 분리할 수 있다.

자바빈즈란?

https://tatsu.tistory.com/entry/JAVA-JAVA-Beans

 

[JAVA] JAVA Beans

자바 빈즈(Java Beans) 자바로 작성한 클래스 중 자바 빈즈 컨벤션(Java Beans Convention)에 맞게 작성된 클래스 자바로 작성된 소프트웨어 컴포넌트를 지칭하는 단어이다. 컴포넌트(Component) 애플리케이

tatsu.tistory.com

빈을 이용한 JSP파일 작성

  • JSP에서 특별한 행동을 하기 위해 내부적으로 자바빈을 사용하기 위한 액션태그를 지원한다.
  • useBean, setProperty, getPropety와 같은 세가지 종류가 존재하며, 액션태그와 동일하게 XML방식을 사용한다.
  • useBean태그는 필요에 따라 유효 범위(Scope)를 지정할 수 있으며, 종류로는 page, request, session, application 등이 존재한다.
  • JSP 컨테이너는 빈 태그를 통해 자바 빈즈 규약에 맞게 작성된 메서드를통해 값을 저장하거나 가져올 수 있게 해준다.

예제

  • Model1 방식에서 사용하기 때문에 현재에 들어서는 사용하지 않는 액션태그이기도 하다.
  • 하지만 Java Beans가 무엇이고, 

자바빈즈 등록

RegisterBean.java

public class MemberBean {

	private String id;
	private String pw;
	private String name;
	private String birthday;
	private String email;
	
	//public MemberBean() {}
	
	public String getId() { return id; }
	public void setId(String id) { this.id = id; }
	
	public String getPw() { return pw; }
	public void setPw(String pw) { this.pw = pw; }
	
	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; }
	
	public String getEmail() { return email; }
	public void setEmail(String email) { this.email = email; }
	
}

JSP페이지 작성

member.jsp

  • 사용자가 회원가입 양식을 입력 후 memberProc.jsp에 넘기면, Java Bean을 이용하여 확인하는 예제이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
</head>
<body>
	<h1>회원가입</h1>
	<form action="memberProc.jsp" method="POST" name="regForm">
		<div>아이디 : <input type="text" name="id"></div>
		<div>패스워드 : <input type="password" name="pw"></div>
		<div>이름 : <input type="text" name="name"></div>
		<div>생년월일 : <input type="text" name="birthday"></div>
		<div>이메일 : <input type="email" name="email"></div>
		<input type="submit" value="회원가입">
		<input type="reset" value="다시쓰기">
	</form>
</body>
</html>

memberProc.jsp

  • 작성한 bean을 가져와 property를 초기화해준다.
  • 이때 서버로 넘어온 form data를 일일히 초기화해줘도 되나 만능문자(*)를 통해 모든 form data를 초기화가능하다.
  • 여기서 주목할점은 property의 호출방식인데 setId()와 같이 메드를 호출하지 않고 field의 name만 작섬했음에도 불구하고 bean에 property가 등록된다. 이는 JSP가 java beans의 convention을 지켜 bean을 등록했을것이라고 예상했기 때문에 제공할 수 있는 편의성이다.
  • 이러한 편의성은 JSP의 빈즈태그뿐만 아니라 EL, JSTL 그리고 다른 view Template에서도 제공하기 때문에 유심히 봐둬야 할 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="regBean" class="myapp.beans.MemberBean" scope="page">
	<jsp:setProperty property="id" name="regBean"/>
	<jsp:setProperty property="pw" name="regBean"/>
	<jsp:setProperty property="name" name="regBean"/>
	<jsp:setProperty property="birthday" name="regBean"/>
	<jsp:setProperty property="email" name="regBean"/>
<%-- 	<jsp:setProperty property="*" name="regBean"/> --%>
</jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 확인</title>
</head>
<body>
	<h1>회원가입 확인</h1>
	<div>아이디 : <jsp:getProperty property="id" name="regBean"/></div>
	<div>패스워드 : <jsp:getProperty property="pw" name="regBean"/></div>
	<div>이름 : <jsp:getProperty property="name" name="regBean"/></div>
	<div>생년월일 : <jsp:getProperty property="birthday" name="regBean"/></div>
	<div>이메일 : <jsp:getProperty property="email" name="regBean"/></div>
	<input type="button" value="확인완료">
	<input type="button" value="다시쓰기" onclick="history.back()">
</body>
</html>

실행결과

  • 사실 해당예제는 Bean의 장점을 볼 수 있는 예제는 아니다. 
  • 그저 Java Bean이 무엇이고, 어떻게 사용될 수 있고 Convention을 지켜 개발함으로써 얻을 수 있는 편의성을 확인하기 위한 예제이다.

 

Bean을 이용해 DB에 접속하는 Model1 방식의 개발방법

DB연결을 위한 클래스 작성

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

public class DBUtil {
	private static Connection conn;

	public static Connection open() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String id = "jsstudy";
		String pw = "java1234";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static void close() {
		try {
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

공통된 로직을 처리할  DAO작성

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import myapp.dbutil.DBUtil;

public class BeanDAO {
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	public BeanDAO() {
		this.conn = DBUtil.open();
	}
	
	public Vector<RegisterBean> getRegisterList() {
		
		Vector<RegisterBean> vlist = new Vector<>();
		
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery("select * from tblregister");
			while(rs.next()) {
				RegisterBean rb = new RegisterBean();
				rb.setId(rs.getString("id"));
				rb.setPw(rs.getString("pw"));
				rb.setName(rs.getString("name"));
				rb.setNum1(rs.getString("num1"));
				rb.setNum2(rs.getString("num2"));
				rb.setEmail(rs.getString("email"));
				rb.setPhone(rs.getString("phone"));
				rb.setZipcode(rs.getString("zipcode"));
				rb.setAddress(rs.getString("address"));
				rb.setJob(rs.getString("job"));
				
				vlist.add(rb);

			}
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try { rs.close(); } catch (SQLException e) { e.printStackTrace();}
			try { stmt.close(); } catch (SQLException e) { e.printStackTrace();}
			try { conn.close(); } catch (SQLException e) { e.printStackTrace();}
		}
		
		return vlist;
	}
	
}

DB조회 결과를 전달할 DTO(java bean)등록

  • java bean의 상용구 코드를 제거하기 위해 lombok을 사용하였다.
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class RegisterBean {
	private String id;
	private String pw;
	private String name;
	private String num1;
	private String num2;
	private String email;
	private String phone;
	private String zipcode;
	private String address;
	private String job;

}

출력결과를 표시할 View(.jsp)작성

<%@page import="java.util.*"%>
<%@page import="myapp.beans.RegisterBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="regMgr" class="myapp.beans.BeanDAO" scope="page"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP에서 DB 연동</title>
</head>
<body>
	<h1>회원 정보</h1>
	<%
		Vector<RegisterBean> vlist = regMgr.getRegisterList();
		int counter = vlist.size();
		for(int i=0; i<counter; i++) {
			RegisterBean regBean = vlist.get(i);
			System.out.println(regBean);
	%>
	<div><%= regBean.getId() %></div>
	<div><%= regBean.getPw()%></div>
	<div><%= regBean.getName()%></div>
	<div><%= regBean.getNum1()%></div>
	<div><%= regBean.getNum2() %></div>
	<div><%= regBean.getEmail() %></div>
	<div><%= regBean.getPhone() %></div>
	<div><%= regBean.getZipcode() %><%= regBean.getAddress() %></div>
	<div><%= regBean.getJob() %></div>
	<%  } %>
	<div>total user : <%= counter %></div>
</body>
</html>

동작방식 (Model 1)

  • Java Bean이 Model의 역할을 한다.
  • 만약 DB를 조회하는 모든 JSP페이지에서 DB Connection을하고 Query를 날리는것을 반복해서 넣어야된다고  상상해보자 이 과정은 매우 지루하고 코드가 지저분해질 것이다.
  • 따라서 DB의 Connection과 질의를 담당하는 비지니스 로직을 JSP페이지에서 분리함으로써 반복되는 코드를 줄이는 것이 JSP의 빈즈태그의 핵심이다.

결과

 

'JSP' 카테고리의 다른 글

[JSP]EL  (0) 2023.03.16
[WEB] HTTP 프로토콜에서 상태를 지속시키기 위한 방법들  (1) 2023.03.15
[JSP] 내부객체  (0) 2023.03.15
[JSP]JSP의 지시자와 액션태그  (0) 2023.03.15
[JSP]JSP의 스크립트 요소  (0) 2023.03.14