주니어 기초 코딩공부/JSP 기초

[JSP] 자바빈(JavaBean)이란? <jsp:setProperty> <jsp:getProperty>

jju_developer 2023. 1. 23. 19:01
728x90

안녕하세요~

오늘도 JSP 공부하러 온 jju_developer입니다.

이번시간에는 자바빈에 대하여 알아보도록 하겠습니다.

 

자바빈이란?

JSP 페이지가 화면 표현 부분과 로직들이 같이 존재하여 복잡한 구성을 가급적 피하고, 

JSP 페이지의 로직 부분을 분리해서 코드를 재사용함으로써 프로그램의 효율을 높이기 위해서 사용하는 것입니다.

 

즉. 데이터 표현을 목적으로 하는 자바 클래스입니다!

(데이터 표현 : 저장/읽기)

자바빈은 jsp에서 객체를 가져오기 위한 기법으로
데이터 전달 오브젝트 파일 DTO(Data Transfer Object)라고도 합니다.

 

자바빈을 좀 어려운 표현을 하자면,

DTO(Data Transfer Object), VO(Value Object)라는 용도로 사용됩니다.

예를 들어 B객체에서 정보를 파라미터로 서버에게 받아서 넘길 때 자바빈 객체를 생성하여 데이터를 자바빈 객체에 담고 service class와 dba class와 DB에 전달하는 것이 자바빈입니다. 이게 바로 DTO 객체의 데이터를 전달한다는 뜻입니다.

VO는 반대로 DB의 데이터를 가져와서 자바빈 객체로 만들어요(DB에는 member 테이블이 있을 수 있겠죠?) 거기에 있는 데이터를 가져와서 자바빈 객체(즉, member객체)로 만들어 담는 것을 VO 객체라고 합니다. (값이 담겨있는 객체입니다.) 

 

자바빈을 왜 사용할까?

JSP 작업은 보통 프로그래머와 디자이너가 함께 작업을 합니다.

프로그래머는 로직 단의 처리를 하고 디자이너는 UI 요소를 구현합니다.

이렇게 공동으로 작업을 하면, 디자이너는 프로그래머가 작성한 자바 코드를 마주칠 때도 있습니다.

JSP 파일 내에 스크립트(declaration, scriptlet, expression)를 이용하여 자바 코드를 넣을 수 있는데,

디자이너가 볼 때는 혼란을 줄 수 있습니다. 이 부분을 고려하여 자바 코드를 최대한 줄이기 위해 JavaBean을 사용합니다.

 

JSP 페이지의 주용 기능 중 하나는 데이터를 보여주는 기능이다. 흔하게 볼 수 있는 게시판을 예로 들면 글 목록 보기, 글쓰기, 글 읽기 등의 기능이 이에 해당합니다.

그런데 이런 데이터를 보여주는 기능과 단순하게 화면을 출력하는 부분이 하나의 JSP에 뒤섞여 있으면 문제가 생길 수 있기 때문에, 기능을 확장하거나 코드를 재사용하기가 상당히 어려워집니다.

그렇기에 JSP에서는 데이터를 자바빈(JavaBean)이라는 클래스에 담아서 값을 보여줍니다.

<추가 설명>
jsp에서 객체를 가져다 사용하지 못하니 기능이 아주 제한적이다

그래서 jsp의 이 단점을 보충하기 위해서 사용하는 기법이 바로 자바빈이다
 
 
서블릿과 자바빈이 유사하게 보이지만 많이 다른데
jsp페이지는 내부적으로 톰캣이 jsp를 java로 변환하여
그것을 다시 컴파일해서 class파일로 바꾼다음 실행한다
 
하지만 서블릿은 그 자체가 java로 되어 있어 그것을 clas로 컴파일 한 것이다
그래서 jsp는 서블릿보다 앞에 한 단계가 더 있는 것이다
한마디로 자바빈은 jsp에서 객체를 가져오기 위한 기법이다

 

 

자바빈의 설계 규약!!

1. 멤버 변수(필드)마다 별도의 get/set 메서드가 존재해야 합니다.

✔ 각 필드를 private으로 만들기 때문에 각각의 필드는 게터 세터가 필요합니다!!

 

2. get 메서드는 파라미터가 존재하지 않알야 합니다.

 

3. set 메소드는 반드시 하나 이상의 파라미터가 존재해야 합니다.

 

4. 빈즈 컴포넌트의 속성은 반드시 읽기 또는 쓰기가 가능하여야합니다.

 

5. 생성자는 파라미터가 존재하지 않아야 합니다.

 

 

자바빈 프로퍼티

자바빈에서 프로퍼티는 자바빈에 저장되어 있는 값을 나타냅니다.

(필드: 프로퍼티)


 메서드 이름을 사용해서 프로퍼티의 이름을 결정합니다.


 규칙 : 프로퍼티 이름이 propertyName일 경우
• setter: public void setPropertyName(Type value)
• getter: public Type getPropertyName()
• boolean 타입일 경우 getter에 get대신 is 사용 가능
• 배열 지정 가능: 예) public void setNames(String [])

 

 읽기/쓰기
• 읽기 전용 : get 또는 is 메서드만 존재하는 프로퍼티
• 읽기/쓰기 : get/set 또는 is/set 메서드가 존재하는 프로퍼티

 

jsp는 WebContent에 넣었고, 자바 코드는 Java Resources에 있습니다.

 

원래는 자바 코드에서 클래스의 객체를 만드는데

jsp에서는 <jsp:useBean> 태그를 이용한 자바 객체를 만듭니다.

 

자바빈 <jsp:useBean> 태그를 이용한 자바 객체 생성하기

 

 구문         
• <jsp:useBean id="[빈이름]" class="[자바빈클래스이름]" scope="[범위]" />
• id : JSP 페이지에서 자바빈 객체에 접근할 때 사용할 이름
• class : 패키지 이름을 포함한 자바빈 클래스의 완전한 이름
• scope : 자바빈 객체가 저장될 영역을 지정한다. page, request, session, application 중 하나를 값으로 갖는다. 기본값은 page.

 

1. <jsp:useBean id="info" class="chap11.member.MemberInfo" scope="request" />

설명: 아이디의 info는 변수의 역할을 하는 것입니다.

즉 1번의 내용과 // MemberInfo info = new MemberInfo(); 이 내용과 같은 내용입니다.

 

예제를 볼까요?


jsp 코드
결과

이번 예제에서는 MemberInfo.java에 있는 코드를 jsp에서 객체를 사용할 때에 

chap08.member.MemberInfo member = new chap08.member.MemberInfo(); 이렇게 객체를 생성하지 않고

자바빈 <jsp:useBean> 태그를 이용하여 객체를 만든 예시입니다.

<jsp:useBean id="member" scope="request" class="chap08.member.MemberInfo" />

이렇게 하면 좀 더 간단하고 보기 좋은 것을 볼 수 있습니다~!


자바빈 <jsp:setProperty> 액션 태그와 <jsp:getProperty> 액션 태그

 자바빈 객체의 프로퍼티 값 설정


 구문      
• <jsp:setProperty name="id" property="이름" value="값" />
- name - 자바빈 객체의 이름
- property - 값을 설정할 프로퍼티
- value - 프로퍼티의 값
• <jsp:setProperty name="id" property="이름" param="파라미터이름" />
- param - 프로퍼티의 값으로 사용할 파라미터 이름.
• <jsp:setProperty name="id" property="*" />
- 프로퍼티와 동일한 이름의 파라미터를 이용해서 값을 설정

 

 (EL(Expression Language)의 사용으로 <jsp:getProperty>는 거의 사용되지 않음)

 

<jsp:useBean id="member" class="chap08.member.MemberInfo" />
<jsp:setProperty name="member" property="name" value="쥬" />
<jsp:setProperty name="member" property="name" param="memberid" />
<jsp:setProperty name="member" property="*" />

 

아까 위의 코드에는 

이렇게 표현식의 자바코드로 사용을 했었는데, 이렇게 하지 말고

<jsp:setProperty> 액션 태그와 <jsp:getProperty> 액션 태그를 활용한 예제를 볼까요?

 


<membershipForm.jsp 코드>

<%@ page contentType = "text/html; charset=utf-8" %>
<html>
<head><title>회원가입 입력 폼</title></head>
<body>
<form action="/chap08/processJoining.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
	<td>아이디</td>
	<td colspan="3"><input type="text" name="id" size="10"></td>
</tr>
<tr>
	<td>이름</td>
	<td><input type="text" name="name" size="10"></td>
	<td>이메일</td>
	<td><input type="text" name="email" size="10"></td>
</tr>
<tr>
	<td colspan="4" align="center">
	<input type="submit" value="회원가입">
	</td>
</tr>
</table>
</form>
</body>
</html>

<processJoining.jsp 코드>

<%@ page contentType = "text/html; charset=utf-8" %>
<html>
<head><title>회원가입 입력 폼</title></head>
<body>
<form action="/chap08/processJoining.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
	<td>아이디</td>
	<td colspan="3"><input type="text" name="id" size="10"></td>
</tr>
<tr>
	<td>이름</td>
	<td><input type="text" name="name" size="10"></td>
	<td>이메일</td>
	<td><input type="text" name="email" size="10"></td>
</tr>
<tr>
	<td colspan="4" align="center">
	<input type="submit" value="회원가입">
	</td>
</tr>
</table>
</form>
</body>
</html>

 

 

보여지는 화면
입력 후 결과 값

<form action="/chap08/processJoining.jsp" method="post">

이게 포스트 방식일 때에는 프로세스 jsp에서는 꼭 

<%
request.setCharacterEncoding("utf-8");
%>

이렇게 인코딩을 해주어야 합니다!!

 

여기서 주의할 점!!

 

아까 전에는 모든 변수에 다 각각의 객체를 만들어 줘야 한다고 했는데

왜 없는지 궁금하시죠?

 

여기서 * 을 해서 전체 객체를 만들겠다는 뜻입니다.

<jsp:setProperty name="memberInfo" property="*" />

 

여기서 비밀번호의 값은 그냥 아이디 값을 넣는 것으로 했습니다.

<jsp:setProperty name="memberInfo" property="password" value="<%=memberInfo.getId()%>" />

 

여기서 processJoining.jsp는 자바코드가 많이 없는 것을 볼 수 있죠?

이렇게 자바의 표현식으로 사용하지 않고 jsp의 액션태그로 만든 것을 볼 수 있습니다.

 

여기까지 자바빈에 대한 기초 지식을 쌓는 시간이었습니다~!

 

오늘도 수고하셨습니다~!

 

감사합니다.

728x90