새소식

인기 검색어

개인공부/JSP

[JSP] JavaBean

  • -

JavaBean 자바 빈이란 무엇인가?

자바 빈은 자바 빈 규약 또는 자바 빈 관례에 따라 만들어진 클래스입니다. 원래 자바빈은자바 빈은 비주얼 툴에서 조작하는 컴포넌트를 의미했습니다. 그러나 비주얼 툴이 쇠퇴하고 자바의 플랫폼이 웹 기반 엔터프라이즈가 많이 사용되기 시작하며 Java EE의 JSP 빈, Enterprise JavaBean과 같이 오픈 소스 기술을 통해 발전되어왔습니다. 이제, 자바 빈은 원래 네 가지 규약 중 두 가지를 따라 만들어진 클래스를 의미합니다. 아래 네 규약 모두 원래의 자바 빈이 따랐던 것이고, 그중 아래 두 가지가 요즘 자바 빈이라고 불리는 것의 규약입니다.

 

  • 자바 빈 클래스는 'default' 패키지가 아닌 '특정' 패키지에 속해야 한다
  • 기본 constructor가 선언이 되어야 한다
  • 멤버 변수는 Property라고 부르며, 접근자는 private으로 선언되어야 한다
  • getter와 setter가 있어야 하며 이는 public으로 선언되어야 한다

 

자바 빈은 왜 사용될까?

  JSP 작업은 보통 프로그래머와 디자이너가 함께 작업을 합니다. 프로그래머는 로직 단의 처리를 하고 디자이너는 UI 요소를 구현합니다. 이렇게 공동으로 작업을 하면, 디자이너는 프로그래머가 작성한 자바 코드를 마주칠 때도 있습니다. JSP 파일 내에 스크립트(declaration, scriptlet, expression)를 이용하여 자바 코드를 넣을 수 있는데, 디자이너가 볼 때는 혼란을 줄 수 있습니다. 이 부분을 고려하여 자바 코드를 최대한 줄이기 위해 JavaBean을 사용합니다.

 

JavaBean은 다음과 같이 사용이 가능합니다.

  1. <jsp:useBean id="fruit1" class="test.fruit" scope="page" />
    • jsp에서 JavaBean을 통해 새로운 객체 즉, JavaBean을 생성할 때는 생성자 역할인 jsp:useBean 태그를 사용해야 합니다.
    • id는 객체의 이름이라고 생각하면 됩니다.
    • class에는 package명. class명으로 적어줍니다.
    • scope는 page, request, session, application 네 가지가 있습니다. 보통 한 페이지 내에서만 사용하기 위해, page를 사용합니다. 이는 나중에 더 자세히 다룰 것입니다.
  2. <jsp:setProperty name="fruit1" property="name" value="Apple" />
    • 생성된 객체의 변수에 값을 넣기 위해 사용됩니다. setter 역할이죠.
    • name은 useBean에서 지정한 id를 적습니다.
    • property는 객체의 변수를 의미합니다. java의 멤버 변수 이름을 적습니다.
    • value는 넣을 값을 적습니다.
  3. <jsp:getProperty name="fruit1" property="name" />
    • 객체의 값을 각져옵니다. getter 역할입니다. getProperty를 사용하면 페이지에 바로 값을 출력합니다.
    • name은 useBean에서 지정한 id를 적습니다.
    • property는 가져올 값의 property(자바의 멤버변수)를 적습니다.

  코드의 마지막 부분에 다시 fruit1의 JavaBean을 setProperty 이용하여 값을 'Canada'로 지정하였습니다. 여기서 볼 수 있듯이, JavaBean의 장점은 재사용이 가능하다는 것입니다. 자원의 낭비를 막을 수 있는 것이죠. 이것이 자바빈을 사용하는 두 번째 이유입니다. 이외에도 forward, include, plug-in 등이 있습니다.


📑<jsp:setProperty>와 <jsp:getProperty> 액션태그

 

다음은 자바빈 규약에 맞게 작성된 User 클래스입니다. 자바빈 규약에 맞게 작성된 클래스를 자바빈 클래스라 하는데, 자바빈 클래스는 <jsp:useBean> 액션태그와 <jsp:setProperty>, <jsp:getProperty>액션태그를 가지고 사용할 수 있습니다. 
package com.dololak;                                                                             
//default 패키지가 아닌 com.dololak.servlet 패키지에 속함
 
 
public class User { 
     
     //멤버 변수의 접근 제어자는 private 
     private String name; 
     private Long age; 
     private String address; 
     
     //기본 생성자가 존재함 
     public User() {} 
     
     /* 
      * 멤버 변수에 대한 getter setter가 존재하며,
      * get 또는 set 이후에 첫글자는 멤버변수명의 대문자로
      * 그 이후는 소문자로 함
      */
     public String getName() { return name; } 
     public void setName(String name) { this.name = name; } 
     
     public Long getAge() { return age; } 
     public void setAge(Long age) { this.age = age; } 
     
     public String getAddress() { return address; } 
     public void setAddress(String address) { this.address = address; } 
     
}​

📌<jsp:setProperty> 액션태그

setProperty 액션태그는 useBean 액션태그로 생성한 자바빈 객체의 속성값을 설정하는 태그입니다. 내부적으로 자바빈의 setter 메서드를 사용합니다. 사용방법은 다음과 같습니다.
<jsp:setProperty name="myUser" property="name" value="kim dololak" /> --> myUser.setName("kim dololak") 메서드를 호출​
 
  • name 속성 - <jsp:useBean>에서 자바빈 객체를 생성할때 사용했던 id 값을 사용합니다.
  • property 속성 - 속성하려는 멤버변수명을 입력합니다. 내부적으로 set + 첫글자를 대문자로 바꾼 setter 메서드를 실행합니다. 즉 위 예시와 같이 name을 지정한 경우 setName() 메서드가 호출됩니다. property 속성에 *(asterisk) 를 사용하게 되면 요청 파라미터를 검사하여 속성명이 동일한 멤버변수를 찾아 값을 할당합니다.
  • value 속성 - 멤버변수에 설정할 값을 지정합니다. 값을 설정할때에는 표현식(<%= %>) 나 EL(${}) 를 사용할 수도 있습니다. 만약 value 값을 "" 와 같이 공백으로 두는경우 해당 멤버변수 타입의 기본값이 할당됩니다.(예 Long은 0L)
  • param 속성 - 위 예시에는 나와있지 않지만 HTTP 요청 파라미터(쿼리 스트링)를 자바빈 객체에 설정할 때 사용합니다. 브라우저에서 호출한 요청파라미터 속성을 지정해주면 해당 속성의 값이 빈 객체의 값으로 할당됩니다.
 
 
 
 
📌<jsp:getProperty> 액션태그
 
getProperty 액션태그는 useBean 액션태그로 생성한 자바빈 객체의 속성값을 추출하는 태그입니다. 내부적으로 자바빈의 getter 메서드를 사용합니다. 사용방법은 다음과 같습니다.
<jsp:getProperty name="myUser" property="name" /> --> myUser.getName() 메서드를 호출​
 
  • name 속성 - <jsp:useBean>에서 자바빈 객체를 생성할때 사용했던 id 값을 사용합니다.
  • property 속성 - 속성하려는 멤버변수명을 입력합니다. 내부적으로 get + 첫글자를 대문자로 바꾼 getter 메서드를 실행합니다. 즉 위 예시와 같이 name을 지정한 경우 getName() 메서드가 호출됩니다.
 
 
 
 
자바빈 객체의 값 저장하고 출력하기
getProperty와 setProperty를 사용하여 값을 자바빈 객체에 저장하고 출력하는 예제입니다.
 
beanTest.jsp
<%@ page contentType = "text/html; charset=utf-8" %>                                             
<html> 
<head> 
</head> 
<body> 
     <jsp:useBean id="myUser" class="com.dololak.servlet.User" scope="request"/> 
     <jsp:setProperty name="myUser" property="name" value="kim dololak"/> 
     <jsp:setProperty name="myUser" property="age" value="28"/> 
     <jsp:setProperty name="myUser" property="address" value="seoul"/> 
     
     
      이름 : <jsp:getProperty name="myUser" property="name"/><br> 
      나이 : <jsp:getProperty name="myUser" property="age"/><br> 
      주소 : <jsp:getProperty name="myUser" property="address"/><br> 
</body> 
</html>​

 

 

실행 결과입니다.
 
요청 파라미터값을 자바빈 객체에 저장하기
브라우저에서 요청한 HTTP 파라미터를 자바빈 객체에 액션태그를 통해 할당할 수 있습니다. 이전의 예제에서 setProperty 액션태그의 value 속성만 제거해 주었습니다.
<body>                                                                                        
     <jsp:useBean id="myUser" class="com.dololak.servlet.User" scope="request"/> 
     <jsp:setProperty name="myUser" property="name"/> 
     <jsp:setProperty name="myUser" property="age"/> 
     <jsp:setProperty name="myUser" property="address"/> 
     
     
      이름 : <jsp:getProperty name="myUser" property="name"/><br> 
      나이 : <jsp:getProperty name="myUser" property="age"/><br> 
      주소 : <jsp:getProperty name="myUser" property="address"/><br> 
</body>​

 

 

 

value 속성을 생략하면 요청파라미터의 속성명과 동일한 멤버변수를 찾아 할당합니다. 속성명이 동일해야 하기 때문에 대소문자를 구분해주어야 합니다.
 
 
 
테스트 결과입니다. 주소창에 요청파라미터를 빈 객체의 멤버변수명에 맞게 넘겨주었고 액션태그의 property 속성을 참고하여 값을 할당해 주었습니다.
요청 URL : http://localhost:8080/beanTest.jsp?name=hello&age=13&address=korea
 
 
액션태그는 내부적으로는 다음과 같이 동작하는 것입니다. age 멤버변수는 Long타입이므로 문자열만 얻을 수 있는 request.getParameter() 메서드로부터 얻은 값을 Long타입으로 바꿔주어야 합니다.
<%                                                                                            
     User user = new User(); 
     user.setName(request.getParameter("name")); 
     user.setAge(Long.valueOf(request.getParameter("age"))); 
     user.setAddress(request.getParameter("address")); 
%>​
 
 
param 속성을 통해 할당할 요청 파라미터 지정하기
바로 위 예제에서 setProperty 액션태그에 param 속성을 지정하게 되면 param 속성으로 지정한 요청 파라미터값을 property 속성으로 지정한 멤버변수에 할당합니다.
<jsp:useBean id="myUser" class="com.dololak.servlet.User" scope="request"/>                 
<jsp:setProperty name="myUser" property="name" param="paramNm"/> 
<jsp:setProperty name="myUser" property="age" param="paramAge"/> 
<jsp:setProperty name="myUser" property="address" param="paramAddr"/>​
 
 
이번에는 다음과 같이 서버에 요청해야 합니다.
요청 URL : http://localhost:8080/beanTest.jsp?paramNm=hello&paramAge=13&paramAddr=korea
 
 
위와 같이 setProperty 액션태그를 사용하면 내부적으로는 다음과 같이 동작합니다.
<%                                                                                            
     User user = new User(); 
     user.setName(request.getParameter("paramNm")); 
     user.setAge(Long.valueOf(request.getParameter("paramAddr"))); 
     user.setAddress(request.getParameter("paramAddr")); 
%>​
 
 
모든 요청 파라미터를 자동으로 할당하기
setProperty 액션태그에는 다음과 같이 *(Asterisk)를 할당할 수 있습니다. 이렇게 되면 요청 파라미터의 모든 값을 빈 객체에 할당하게 됩니다. 단 요청 파라미터명과 자바빈 객체의 멤버변수명이 맞아야 합니다. 또한 멤버변수에 따른 setter 메서드가 자바빈 규약에 맞게 작성되어 있어야 합니다.
<jsp:setProperty name="myUser" property="*" />​
 
 
 
 
 
최종코드입니다. 빈 객체를 생성하고 값을 할당하는 부분이 단 스크립트코드 두 줄로 해결되었습니다.
 
beanTest.jsp
<%@ page contentType = "text/html; charset=utf-8" %>                                             
<html> 
<head> 
</head> 
<body> 
     <jsp:useBean id="myUser" class="com.dololak.servlet.User" scope="request"/> 
     <jsp:setProperty name="myUser" property="*"/> 
     
      이름 : <jsp:getProperty name="myUser" property="name"/><br> 
      나이 : <jsp:getProperty name="myUser" property="age"/><br> 
      주소 : <jsp:getProperty name="myUser" property="address"/><br> 
</body> 
</html>​
 
 
요청 파라미터명만 잘 맞추어 넘겨주면 값이 자동으로 빈객체에 할당되는것을 볼 수 있습니다.
요청 URL : http://localhost:8080/beanTest.jsp?name=hello&age=13&address=korea
 

💯멤버변수,DB 테이블의 컬럼이름 JSP의 parameter이름이 다 같아야 자동매칭이 가능한다.

출처: https://dololak.tistory.com/531 [코끼리를 냉장고에 넣는 방법:티스토리]

 

'개인공부 > JSP' 카테고리의 다른 글

[JSP] PreparedStatement 와 Statement 차이점  (0) 2022.10.07
[JSP] 커넥션 풀  (0) 2022.10.07
java, jstl, html, javascript 빌드 순서  (1) 2022.09.21
에러페이지 예외처리  (0) 2022.09.18
jsp scope객체  (0) 2022.09.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.