JSP 페이지 안에서 <% ... %> 스크립틀릿으로 자바 코드를 직접 작성하는 것은, 코드가 길어질수록 가독성과 유지보수성을 급격히 떨어뜨린다.
특히 HTML나 JSP 폼(form)에서 넘어온 많은 파라미터를 처리하는 코드는 순식간에 지저분해지고 관리가 어렵다.
<%
// 스크립틀릿을 사용한 지저분한 코드의 예
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
// 넘어온 파라미터마다 객체를 생성하고 setter를 호출해야 한다.
Person p = new Person();
p.setId(id);
p.setPassword(password);
p.setName(name);
p.setEmail(email);
%>
JSP의 본래 목적인 '화면 표현(View)'에 집중하기 위해, 이러한 자바 로직 코드를 분리할 필요가 있다.
이때 JSP 액션 태그(Action Tag) 중 하나인 <jsp:useBean>이 강력한 해결책이 되어준다.
<jsp:useBean>을 사용하려면, 데이터를 담을 자바 객체가 특정 규칙을 따라야 한다.
이러한 객체를 자바빈(JavaBean)이라고 부른다.
자바빈의 규칙
1. 클래스는 public으로 선언되어야 한다.
2. 멤버 변수(프로퍼티)는 private으로 선언하여 외부 접근을 막는다.
3. 각 멤버 변수에 접근할 수 있는 public 접근자인 getter/setter 메서드가 있어야 한다.
4. 인자(매개변수)가 없는 기본 생성자가 반드시 있어야 한다.
package com.example.bean; // 패키지 경로
// 1. public 클래스
public class Person {
// 2. private 멤버 변수
private String id;
private String name;
// 4. 기본 생성자
public Person() {
}
// 3. public Getter/Setter 메서드
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<jsp:useBean>이란?<jsp:useBean>은 JSP 페이지에서 사용할 자바빈(JavaBean) 객체를 선언, 생성, 관리해주는 액션 태그이다.
스크립틀릿의 복잡한 코드를 아래와 같이 간결한 태그 몇 줄로 완벽하게 대체할 수 있다.
<jsp:useBean>
자바빈 객체를 생성하거나, 지정된 scope에 이미 객체가 존재하면 그 객체를 가져온다.
<jsp:setProperty>
useBean으로 준비된 객체의 필드(프로퍼티)에 값을 자동으로 설정한다.
<jsp:getProperty>
객체 필드의 값을 가져와 화면에 출력한다.
personAction.jsp
<%@ page import="com.example.bean.Person" %>
<%
request.setCharacterEncoding("UTF-8");
Person p = new Person(); // 직접 객체 생성
p.setId(request.getParameter("id")); // 파라미터 하나하나 직접 설정
p.setName(request.getParameter("name"));
%>
아이디: <%= p.getId() %> <br>
이름: <%= p.getName() %>
<jsp:useBean> 액션 태그 사용<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<%-- 1. Person 객체를 request 영역에서 찾거나, 없으면 새로 생성하여 'p'라는 이름으로 사용 --%>
<jsp:useBean id="p" class="com.example.bean.Person" scope="request" />
<%-- 2. p 객체의 프로퍼티(id, name)에 요청 파라미터 값을 자동으로 설정 --%>
<jsp:setProperty name="p" property="*" />
아이디: <jsp:getProperty name="p" property="id" /> <br>
이름: <jsp:getProperty name="p" property="name" />
<jsp:useBean id="p" class="com.example.bean.Person" scope="request" />
id: JSP 페이지 내에서 사용할 객체의 변수 이름(p)을 지정한다.
class: 사용할 자바빈의 전체 클래스 경로(패키지 포함)를 지정한다.
scope: 객체가 저장되고 유지될 메모리 영역을 지정한다.
(page, request, session, application 중 선택)
<jsp:setProperty name="p" property="*" />
name: 값을 설정할 자바빈 객체의 id를 지정한다.
(useBean의 id와 일치)
property="*"
요청 파라미터의 이름과 자바빈의 프로퍼티(멤버 변수) 이름이 일치하는 모든 항목에 대해, 해당 setter 메서드(setId(), setName() 등)를 자동으로 호출하여 값을 설정**해준다.
<jsp:useBean>을 사용해야 할까?<jsp:useBean> 액션 태그를 사용하면 JSP 페이지에서 데이터 처리 로직(Java 코드)을 거의 완벽하게 제거할 수 있다.
이를 통해 몇가지 이점을 얻는다.
property="*" 속성 하나로 수많은 request.getParameter()와 setter 호출 코드를 대체하여 개발 시간을 단축시킵니다.이때 <jsp:getProperty>보다 훨씬 직관적이고 간결하게 객체의 값을 출력하는 방법이 있다.
바로 표현 언어(Expression Language, EL)를 사용하는 것이다.
{p.id}와 같은 형태로 값을 가져오는 방법이 바로 EL의 기본 문법이다.
EL은 JSP 2.0부터 기본으로 포함된 기능으로, JSP 페이지에서 데이터에 더 쉽게 접근하기 위해 만들어진 언어이다.
$ 기호와 중괄호 {}를 사용하여 표현한다. (예: ${표현식})
EL을 사용하면 <jsp:getProperty>나 스크립틀릿 표현식(<%= ... %>) 없이도 자바빈의 프로퍼티, 컬렉션, 배열 등의 값에 간단하게 접근할 수 있다.
<jsp:getProperty> 사용아이디: <jsp:getProperty name="p" property="id" /> <br>
이름: <jsp:getProperty name="p" property="name" />
아이디: ${p.id} <br>
이름: ${p.name}
코드가 훨씬 간결하고 직관적으로 변한 것을 바로 확인할 수 있다.
또 자바스크립트에서 객체 속성에 접근하는 것과 유사하여 JS를 접해봤다면 이해하기도 쉽다.
객체 저장
<jsp:useBean id="p" ... scope="request" /> 태그는 Person 객체를 생성하여 request라는 메모리 영역(scope)에 p라는 이름으로 저장한다.
객체 검색
EL 표현식 ${p.id}가 실행되면, JSP 컨테이너는 다음 순서로 p라는 이름의 객체(Attribute)를 자동으로 찾는다.
page 영역 -> request 영역 -> session 영역 ->application 영역
Getter 호출
request 영역에서 p 객체를 찾으면, EL은 p.id 부분을 해석하여 p.getId() 메서드를 자동으로 호출하고 그 반환값을 해당 위치에 출력한다.
이 세 가지를 조합하면 가장 이상적이고 현대적인 JSP 코드가 완성된다.
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<%-- 1. useBean으로 Person 객체를 request 영역에 준비 --%>
<jsp:useBean id="p" class="com.example.bean.Person" scope="request" />
<%-- 2. setProperty로 폼 파라미터 값을 객체에 자동으로 채우기 --%>
<jsp:setProperty name="p" property="*" />
<h3>회원 정보 (EL 사용으로 깔끔해진 코드)</h3>
<ul>
<li>아이디: ${p.id}</li>
<li>이름: ${p.name}</li>
</ul>