📌자바빈(JavaBean)이란?
회원 가입 요청에서 회원 한 명의 정보가 들어온다. 이 때 이름 따로 주소 따로 번호 따로 데이터를 다루게 되면 각 데이터의 관련성이 없으므로 회원정보라는 클래스를 설계하여 해당 클래스에 이름,주소,번호를 속성으로 정의하여 한 명의 회원 정보로 다루는 것이 보다 객체지향적인 코드이며 효율적인 코드라는 것은 알 것이다.
다른 예시를 들어보겠다. 웹 사이트를 개발할 때 디자이너와 프로그래머가 협업을 하여 개발을 할 것이다. 그런데 프로그래머가 JSP 페이지의 이곳 저곳에 자바 코드를 입력해놓으면 디자이너 입장에서는 해당 페이지를 해석하기에 어려움을 느낄 것이다. 자바빈을 사용하면 이에 도움이 될 수 있다. 자바빈(JavaBean)은 JSP 페이지의 디자인 부분과 비즈니스 로직 부분을 분리하여 디자이너는 디자이너 역할만, 프로그래머는 프로그래머 역할만 하게하고 복잡한 JSP 코드들을 줄이며, 프로그램의 재사용성을 증가시킨다.
JSP에서 관련있는 데이터를 저장하는 클래스가 바로 자바빈(JavaBean)이다.
📌자바빈(JavaBean)의 설계 규약
자바빈(JavaBean)은 다른 클래스와는 달리 정해져있는 규약에 따라 작성해야 하며, 이에 맞지 않을 경우 자바빈의 특성을 갖지 않는 클래스가 되어버릴 수 있으므로 주의해야 한다.
- 멤버 변수마다 별도의 get/set 메서드가 존재해야 한다.
- get 메서드는 파라미터가 존재하지 않아야 한다.
- set 메서드는 반드시 하나 이상의 파라미터가 존재해야 한다.
- 빈즈 컴포넌트의 속성은 반드시 읽기 또는 쓰기가 가능해야 한다. 즉 get메서드와 set메서드를 구현해야 한다.
단 , 읽기 전용인 경우 get 메서드만 정의할 수 있다. - 생성자는 파라미터가 존재하지 않아야 한다. 즉, 인자 없는 생성자가 반드시 있어야 한다.
- 멤버 변수의 접근 제어자는 private이며, 각 set/get 메서드의 접근 제어자는 public으로 정의되어야 하며 클래스의 접근 제어자는 public으로 정의한다.
위 6가지 규칙들만 보면 복잡한거 같지만 전혀 복잡하지 않다. get/set 메소드를 만드는 법은 전혀 어렵지 않다.
아래 이미지와 같이 멤버 변수를 선언한 후 드래그 한 다음 Generate Getters and Setters... 를 클릭해주면 자동으로 get/set 메소드를 생성해준다.
예제
BeanTest.java
beanTest1.jsp
3번째 줄: test 패키지에 있는 BeanTest라는 자바빈 클래스를 beantest라는 이름으로 객체를 생성한다.
12번째 줄: beantest 객체에 있는 name 값을 출력한다.
결과
위처럼 자바빈(JavaBean)을 사용하면 객체를 생성하는 것도 간단하며 속성 값을 얻어오는 코드도 간단하기 때문에 자바빈(JavaBean)을 사용하면 보다 편리한 프로그래밍이 가능하다.
📌JSP에서 자바빈 사용하기
위 예제에서 간단하게 이번에 기술할 것을 살펴보았다. 하나씩 설명해보도록 하겠다.
💡<jsp:useBean/> 태그 - JavaBean 객체를 생성하기 위한 액션 태그
<jsp:useBean id="빈 이름" class="자바빈 클래스 명" scope="사용 범위"/>
- id는 JSP페이지에서 사용될 자바빈 객체의 변수명
- class는 자바빈의 설계 규약에 맞게 작성된 클래스명이다 만약 클래스가 패키지 안에 작성되어 있다면 패키지 경로까지 지정해주어야 한다.
- scope는 사용 범위를 뜻한다. 사용할 수 있는 종류로는 request, page, session, application 네 종류가 있으며 기본 값은 page이다. 이 4개는 앞에 포스팅한 JSP 영역 객체임을 보면 이해하는데 도움이 될 것이다. 이에 관련한 자세한 설명은 아래 [JavaBean의 영역]에서 하도록하겠다.
💡<jsp:setProperty/> 태그
<jsp:setProperty name="빈 이름" property="속성명" value="설정할 속성 값" />
말 그대로 속성 값을 설정하기 위한 태그이다. 예제로 보여주도록 하겠다.
beanTest2.jsp
결과
<jsp:setProperty/> 태그를 사용하여 BeanTest 자바빈에 접근하여 name 변수를 변경한 것이다.
하지만 여기서 의문이 들 수 있다. JavaBean의 name 변수를 선언할 때 private를 선언하였는데 어떻게 접근하여 변경한 것일 까?? 그 이유는 <jsp:setProperty/> 태그를 사용하면 자바빈(JavaBean) 객체의 멤버 변수를 직접 수정하는 것이 아니라 set 메서드를 호출하여 멤버 변수를 수정하기 때문이다.
만약 클라이언트에서 name이라는 이름의 파라미터 값이 전송되어 오고 이 값을 name 속성 값으로 할당하고 싶다면 다음과 같이 설정하면 된다.
beanTest.html
beanTest2.jsp
beanTest2.jsp 페이지로 name 속성 값을 전송한다.
추가로 만약 클라이언트에서 전송되어 오는 파라미터 이름이 Bean객체의 속성명과 모두 같아면 다음과 같이 사용하면 한 번에 할당할 속성명을 할당할 수 있다.
<jsp:setProperty name="빈 이름" property="*" />
이 처럼 property="*"로 설정하면, 클라이언트에서 전송되어 오는 파라미터 값이 모두 같은 이름의 빈 객체의 속성 값으로 자동으로 할당된다.
💡<jsp:getProperty/> 태그
<jsp:getProperty/> 태그는 자바빈 클래스의 속성 값을 가져오기 위한 태그이다.
<jsp:getProperty name="빈 이름" property="속성명"/>
<jsp:getProperty/> 태그도 <jsp:setProperty/> 태그와 마찬가지로 멤버 변수에서 값을 직접 가져오지 않고 get메서드를 호출하여 값을 가져온다.
💡자바빈(JavaBean)의 영역
<jsp:useBean/> 태그에 scope 속성이 있다. 이 속성은 자바빈(JavaBean) 객체가 저장될 영역을 뜻한다. <jsp:useBea/>태그를 사용하게 되면 자바빈(JavaBean) 클래스가 지정한 빈 이름으로 객체가 생성되는데, 이 객체 생성은 scope에 지정된 곳으로 생성이 된다.
자바빈의 영역(scope)는 pageContext, request, session, application 이렇게 4가지 영역으로 나누어지며 scope를 지정하지 않을 경우 기본 값은 page가 된다.
- pageContext
빈 객체 공유 범위가 현재 페이지의 범위에만 한정된다. 페이지가 변경되면 공유가 유지되지 않는 scope이다. - request
request 요청을 받고 처리를 완료할 때까지 생존되는 scope이다. - session
클라이언트당 하나씩 할당되는 영역이다. 클라이언트가 브라우저를 종료하기 전까지 유지되는 scope이다. - application
사이트 전체의 범위를 가지며, 서버가 종료되기 전에는 계속 유지되는 scope이다.
일반적으로 request 영역은 모델2로 요청 처리를 할 때 서블릿에서 데이터를 공유하고 jsp페이지에서 공유된 데이터를 사용할 때 많이 사용되며, 세션 영역은 요청이 바뀌어도 정보가 유지되어야 하는 경우, 즉 로그인이나 장바구니 등에 많이 사용되며 어플리케이션 영역은 어플리케이션 전체 영역에서 데이터를 공유해야 하는 경우 즉, 전체 방문자 수 계산 등에 많이 사용된다. 개발하고 있는 프로그램의 기능을 고려하여 적절한 영역을 사용해야 메모리의 낭비를 줄일 수 있다.
'JSP & Servlet > 개념' 카테고리의 다른 글
[Servlet] 쿠키(Cookie) (0) | 2022.04.05 |
---|---|
[Servlet] 세션(Session) (0) | 2022.04.05 |
[JSP & Servlet] 템플릿 페이지 (0) | 2022.03.29 |
[JSP] JSP 액션 태그 (0) | 2022.03.29 |
[JSP] JSP 영역 객체 (application, session, request, pageContext) (0) | 2022.03.29 |