[JSP] JavaBean & useBean & EL

김태희·2025년 7월 10일
0

JSP

목록 보기
5/6
post-thumbnail

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>이 강력한 해결책이 되어준다.


자바빈(JavaBean)이란 ?

<jsp:useBean>을 사용하려면, 데이터를 담을 자바 객체가 특정 규칙을 따라야 한다.

이러한 객체를 자바빈(JavaBean)이라고 부른다.

자바빈의 규칙
1. 클래스는 public으로 선언되어야 한다.
2. 멤버 변수(프로퍼티)는 private으로 선언하여 외부 접근을 막는다.
3. 각 멤버 변수에 접근할 수 있는 public 접근자인 getter/setter 메서드가 있어야 한다.
4. 인자(매개변수)가 없는 기본 생성자가 반드시 있어야 한다.

EX: Person.java

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;
    }
}

ECLIPSE에서 Getter Setter 쉽게 설정하는 법


<jsp:useBean>이란?

<jsp:useBean>은 JSP 페이지에서 사용할 자바빈(JavaBean) 객체를 선언, 생성, 관리해주는 액션 태그이다.

스크립틀릿의 복잡한 코드를 아래와 같이 간결한 태그 몇 줄로 완벽하게 대체할 수 있다.

<jsp:useBean>
자바빈 객체를 생성하거나, 지정된 scope에 이미 객체가 존재하면 그 객체를 가져온다.

<jsp:setProperty>
useBean으로 준비된 객체의 필드(프로퍼티)에 값을 자동으로 설정한다.

<jsp:getProperty>
객체 필드의 값을 가져와 화면에 출력한다.

useBean 사용 예 (Before & After)

personAction.jsp

Before: 스크립틀릿 사용

<%@ 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() %>

After: <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를 지정한다.
(useBeanid와 일치)

property="*"
요청 파라미터의 이름과 자바빈의 프로퍼티(멤버 변수) 이름이 일치하는 모든 항목에 대해, 해당 setter 메서드(setId(), setName() 등)를
자동으로 호출하여 값을 설정**해준다.


<jsp:useBean>을 사용해야 할까?

<jsp:useBean> 액션 태그를 사용하면 JSP 페이지에서 데이터 처리 로직(Java 코드)을 거의 완벽하게 제거할 수 있다.

이를 통해 몇가지 이점을 얻는다.

  1. 가독성 및 유지보수성 향상: HTML과 유사한 태그로 로직을 처리하므로 코드가 훨씬 깔끔하고 이해하기 쉬워집니다.
  2. 역할 분리: JSP는 화면을 그리는 역할에, 자바빈은 데이터를 담는 역할에 집중할 수 있어 웹 애플리케이션의 구조가 명확해집니다.
  3. 생산성 증가: property="*" 속성 하나로 수많은 request.getParameter()setter 호출 코드를 대체하여 개발 시간을 단축시킵니다.

이때 <jsp:getProperty>보다 훨씬 직관적이고 간결하게 객체의 값을 출력하는 방법이 있다.

바로 표현 언어(Expression Language, EL)를 사용하는 것이다.

{p.id}와 같은 형태로 값을 가져오는 방법이 바로 EL의 기본 문법이다.


표현 언어(EL)란?

EL은 JSP 2.0부터 기본으로 포함된 기능으로, JSP 페이지에서 데이터에 더 쉽게 접근하기 위해 만들어진 언어이다.

$ 기호와 중괄호 {}를 사용하여 표현한다. (예: ${표현식})

EL을 사용하면 <jsp:getProperty>나 스크립틀릿 표현식(<%= ... %>) 없이도 자바빈의 프로퍼티, 컬렉션, 배열 등의 값에 간단하게 접근할 수 있다.

EL을 사용한 개선 방법

Before: <jsp:getProperty> 사용

아이디: <jsp:getProperty name="p" property="id" /> <br>
이름: <jsp:getProperty name="p" property="name" />

After: 표현 언어(EL) 사용

아이디: ${p.id} <br>
이름: ${p.name}

코드가 훨씬 간결하고 직관적으로 변한 것을 바로 확인할 수 있다.

또 자바스크립트에서 객체 속성에 접근하는 것과 유사하여 JS를 접해봤다면 이해하기도 쉽다.


EL의 동작원리

  1. 객체 저장
    <jsp:useBean id="p" ... scope="request" /> 태그는 Person 객체를 생성하여 request라는 메모리 영역(scope)에 p라는 이름으로 저장한다.

  2. 객체 검색
    EL 표현식 ${p.id}가 실행되면, JSP 컨테이너는 다음 순서로 p라는 이름의 객체(Attribute)를 자동으로 찾는다.
    page 영역 -> request 영역 -> session 영역 ->application 영역

  3. Getter 호출
    request 영역에서 p 객체를 찾으면, EL은 p.id 부분을 해석하여 p.getId() 메서드를 자동으로 호출하고 그 반환값을 해당 위치에 출력한다.


최종 완성 코드 (useBean + setProperty + EL)

이 세 가지를 조합하면 가장 이상적이고 현대적인 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>

0개의 댓글