본문 바로가기
Java/JSP & Servlet

[JSP & Servlet] 9. JSP JavaBean 사용

by Rosmary 2023. 1. 13.
728x90
반응형

 

 

 

 

 

 

 

 

1. Java Bean의 필요성

 

웹을 사용하면, 양식에 맞게 값을 입력하는 페이지를 꽤나 자주 접하게 된다. 당장 필자가 쓰는 블로그 역시 텍스트로 내용을 입력하고, "완료" 버튼을 클릭하면 텍스트 내용이 블로그 DB 서버에 저장이 되도록 만들어진 구조다. HTML과 JSP에서 값을 입력받고 다른 페이지로 전달하는 태그는 <form>과 <input> 태그가 있다. 

 

이 두 태그의 예시를 위해, 필자는 아이디와 비밀번호를 입력하는 페이지를 JSP로 하나 구성하고, 여기서 입력받은 값을 login.jsp 라는 경로에 재출력할 수 있도록 만들어보려한다. 우선 입력 페이지부터 간략하게 만들어보자.

 

 

위의 코드를 Tomcat 서버에 올려서 실행하면, 다음과 같은 화면이 브라우저에 출력된다.

 

 

 

 

<form></form> 태그 사이에 <input> 태그 세 개가 존재하고, <input> 태그들이 아이디와 패스워드를 받아 form에 정의된 post 방식으로 login.jsp 페이지에 입력값을 전달하도록 만들었다. 조금 더 정확히 설명하자면, <input type="text"...>와 <input type="password"...>는 각각 아이디와 비밀번호를 입력받는 HTML 태그고 <input type="submit"...>은 입력값을 전달하는 역할을 한다.

 

이제 login.jsp 파일을 작성해보자. 지금까지 필자는 이렇게 <form> 태그를 통해 넘어오는 입력값을 JSP 내장객체 request의 getParameter() 매서드를 사용하여 추출해왔다.

 

아이디 test, 비밀번호 test를 입력했다.

 

예시를 조금 바꿔보자. 로그인 창이 아니라 회원 가입 양식을 작성한다고 가정해보자. form으로 넘어오는 값들이 아이디와 패스워드 두 개만 존재했던 상황에서 배로 늘어난다.

 

 

 

이제 이 값들을 register.jsp에서 받아보자. 사실 request.getParameter()로 일회성으로 받는 코드를 작성하는 것은 큰 문제가 되지 않는다. 

 

 

 

그런데, 회원 정보는 단순히 가입때만 필요한 것이 아니라, 회원정보 수정 등에도 필요하다. 따라서 회원정보가 필요한 페이지마다 request.getParameter()를 변수의 개수만큼 작성해야한다는 문제가 있다. 어찌해서 노가다로 전부 작성이 완료되었다고 하더라도, 추후 회원정보에 추가 또는 삭제할 사항이 생긴다면, request.getParamter()가 작성된 모든 페이지에서 이를 수정해야한다는 번거로움이 발생한다. 

 

이러한 문제를 Java의 객체 지향 특성을 이용하여 해결할 수 있다. JSP에서 특정 구조의 값을 주기적으로 불러줄 수 있도록 만든 이 Java 파일을 JavaBean이라고 한다. 

 

 

 

2. JavaBean 파일 만들기

 

Java Beans는 특정한 정보를 갖는 public 클래스 파일이다. JSP에서 Java로 작성된 파일은 반드시 WEB-INF의 classes 폴더에 존재해야 인식이 되기 때문에 Java Beans 파일 역시 컴파일된 class 파일이 이 경로에 위치해야 한다. 또한 Servlet과 달리, Java Bean은 반드시 패키지로 구성되어 있어야 하기 때문에 classes 파일 내부에서도 별도의 파일 내에 존재해야한다는 조건이 있다.

 

 

클래스 명은 일반 Java 클래스 명명방식과 크게 다르지 않지만, 관습상 클래스명 접미부분에 Bean을 붙인다.

 

 

이 클래스 파일의 멤버변수는 <input> 태그로 입력한 정보 또는 연동된 DB에서 쿼리로 획득한 정보를 private 제어자를 적용하여 저장한다. 멤버변수명은 보통 <input> 태그의 name 속성에 지정된 값을 사용한다. 위의 회원가입 정보를 Java Bean으로 멤버변수까지 작성하면 다음과 같이 나타낼 수 있다.

 

 

Java 클래스 파일은 단순히 멤버 변수만 있다고 동작하는 녀석이 아니다. JSP는 Java Bean을 이용한다는 코드가 적용되면, Java 클래스 내 매서드를 활용하도록 되어 있는데, 이 매서드가 작성되어 있지 않은 상태라면 Java Bean을 사용할 수 없다. 

 

JSP에서 Java Bean의 매서드는 멤버변수의 값을 수정하거나, 반환하는 기능을 가져야만 한다. 멤버변수값을 반환하는 매서드들을 Getter 매서드라도 하며, 반대로 멤버변수값을 수정하는 매서드는 Setter 매서드라도 한다. Getter 매서드는 이름이 getXXXXX로 시작하며, XXXXX부분은 멤버변수명의 앞 글자만 대문자로 수정해서 붙이면 된다. 예를 들어, acc_id에 대한 Getter 매서드는 아래와 같이 나타낼 수 있다.

 

 

Setter 매서드 역시 명명방법은 Getter와 같다. 

 

 

나머지 멤버변수에 대해서도 동일한 방식을 적용하면, JavaBean을 기본적으로 사용할 수 있는 상태까지는 만들어 놓은 것이다. 

 

우선 만들어진 Java Bean 파일은 컴파일을 해서 WEB-INF/classes/beans 파일에 넣어두자.

 

 

 

3. JSP에서 생성한 Java Bean 사용

 

이제 JSP에서 만들어진 Java Bean을 사용하여 input 값을 저장하고 호출하는 것을 진행해보려한다. JSP에서 Java Bean을 사용하기 위해서는 JSP 액션 태그를 사용해야한다. 크게 세 종류가 있다.

 

(1)  <jsp:useBean id="[beanId]" class="[className]" scope="[beanScope]" />  

 

jsp:useBean 액션 태그는 JSP에서 사용할 Java Bean 파일을 지정하는 부분이다. 속성은 id, class, scope로 나뉘는데, id는 JSP에서 JavaBean의 클래스명 대신 사용할 이름, 즉 Bean 객체명을 지정하는 것이고, class는 실제 Java Bean의 클래스 이름을 입력하면 된다.

 

scope는 Java Bean을 적용할 범위를 지정한다. scope 값은 크게 "page", "request", "session", "application"으로 나뉘는데, "page"는 해당 JSP 페이지에서만, "request"는 Request 요청에 대한 처리가 완료될 때 까지, "session"은 session 유지 시간 동안, "application"은 서버의 종료 시점까지 유지를 한다는 의미다. 이들의 차이 역시 조금 뒤에서 알아볼 예정이다. 우선은 page로 scope 속성값을 지정하고 Java Bean을 사용해보려 한다.

 

필자가 위에서 만든 index.jsp는 입력값을 post 형태로 "register.jsp" 경로로 전달하도록 <form> 태그가 적용되어 있다. 따라서 Java Bean은 전달받은 값을 저장하기 위해 register.jsp에서 사용하도록 설정해야한다. 

 

 

아직까지는 값을 제출하면 오류가 발생할 것이다. 만약 오류 중에 아래와 같이 클래스 파일을 찾을 수 없다는 비슷한 내용이 나타난다면 Java Bean 파일이 제대로 컴파일되었고, 정확한 경로에 위치하고 있는지 확인하자.

 

 

 

이제 register.jsp로 전달된 입력값을 Java Bean에 저장해보자. 현재 필자는 입력값 전체에 대해 Java Bean을 작성해놓은 상태이기 때문에 Java Bean의 모든 멤버변수에 대해 값을 변경해주려 한다.

 

 

(2) <jsp:setProperty name="[beanId]" property="[변경할 멤버변수명]" />

 

jsp:setProperty는 Java Bean의 멤버변수를 추가 또는 변경하는 액션태그다. 만약 입력값 중 아이디에 대한 내용만 Java Bean에 저장하고자 한다면 다음과 같이 코드를 작성해서 추가하면 된다.

 

* <jsp:setProperty name="beanTest" property="acc_id" />

 

우선, 나머지 속성에 대해서도 동일한 코드를 JSP에 작성해보자.

 

 

그런데 이런 의문이 든다.

 

"굳이 property를 하나씩 지정해서 코드를 작성하는거라면, getParameter() 사용하는 것과 별 반 차이가 없는데요?"

 

맞다. 그래서 jsp:setProperty는 property 속성값으로 Asterisk(별표)를 사용할 수 있도록 되어 있다. 보통 *은 전체를 일컫는 말이기 때문에 아래와 같이 코드를 사용하면 전체 Java Bean 멤버변수에 대해 setProperty를 적용하겠다는 의미가 된다.

 

 

 

 

(3) <jsp:getProperty name="[beanId]" property="[추출할 멤버변수명]" />

 

jsp:getProperty 액션태그는 Java Bean에 저장된 멤버변수를 추출하는데 사용한다. 현재 jsp:setProperty로 Java Bean의 모든 멤버변수값을 입력값으로 대체했기 때문에, jsp:getProperty를 사용하면 입력값에 대해 호출이 가능하다. 당연한 이야기지만 setProperty 사용 없이 바로 getProperty를 사용하면 null 값만 반환된다. 

 

코드는 아래와 같이, 기존의 <%=%> 코드를 <jsp:getProperty>로 변경했다.

 

 

이제 동작을 확인해보자. 

 

 

 

 

 

4. Java Bean 기타

 

(1) scope 범위 지정

현재 필자는 register.jsp에서 Java Bean 사용 액션 태그를 호출했고, 이 Bean을 register.jsp에서만 사용할 수 있도록 scope를 page로 지정해 둔 상태이다. 따라서 필자가 test.jsp 라는 페이지에서 Java Bean의 set, getProperty를 아무리 열심히 사용해봐야, 돌아오는 것은 에러밖에 없다. Java Bean이 register.jsp에서만 적용되도록 되어 있기 때문이다.

 

 

 

만약 register.jsp에서 scope 범위를 session으로 변경한다면, session 유지 시간이 끝나는 때까지 어느 곳에서든지 선언한 java Bean을 사용하는 것이 가능해진다. 물론, register.jsp를 먼저 방문해야만 어느곳에서든 세션 완료 시간까지 사용하다는 것은 기억하자.

 

 

 

두 번 째 test.jsp의 경우, jsp:getProperty 액션 태그가 없으나, register.jsp의 setProperty에서 지정한 Java Bean 값이 존재하며 session이 유지되는 동안은 사용이 가능하기 때문에 바로 getProperty를 사용하더라도 큰 문제없이 값을 호출하는 것이 가능해진다.

 

 

브라우저가 종료되더라도 session 이 유지되는 상태라면 문제없이 test.jsp에서 입력한 값을 보는 것이 가능해진다. 물론, session이 종료되면... 얄짤없이 register.jsp를 통해야만 값을 다시 정상적으로 호출할 수 있다.

 

 

 

"application" scope 값 역시 session과 유사하나, session 유지 시간과 상관없이 서버가 종료되지만 않으면 계속 Java Bean을 사용하다는 것이 "session"과의 차이점이다.

 

마지막으로 "request"는 forward나 include 액션태그로 연결된 페이지가 있는 경우, 이 페이지들이 "page" scope를 벗어나기 때문에 Java Bean을 사용할 수 없게 되는 상황에서 사용한다. test.jsp 파일을 아래와 같이 수정하고, 이 파일을 register.jsp에 include 또는 forward 해보자.

 

 

 

scope 가 page인 경우, register.jsp에서만 Java Bean이 동작하기 때문에 test.jsp의 내용이 전부 null로 출력된다.

 

 

이제 scope 범위를 request로 변경해보자. 조금 전과 달리 정상적으로 정보가 출력되는 것이 확인된다.

 

 

 

index.jsp에서 form으로 넘겨받아 응답 결과로 register.jsp 페이지가 나타난 것인데, request는 Java Bean의 정보를 request.getAttribute() 및 setAttribute() 매서드를 사용하여 전달한다.

 

 

 

 

 

(2) <jsp:setProperty> 직접 속성 및 값 입력

 

많이 사용하지는 않지만, <input> 태그를 통해 직접 입력받은 값을 무시하고 다른 값을 지정하고 싶은 경우가 생길 수 있다. 만약, 위의 회원 가입 사이트에서 사용자가 성별에서 어떤 값을 입력하더라도 Java Bean의 acc_gender가 "남"으로 저장되도록 하고 싶다고 가정해보자. 

 

<jsp:setProperty>는 지금까지 소개한 속성 외에도 value와 param이라는 속성이 존재한다. 여기서 value는 setProperty로 특정 멤버변수값을 저장할 때, value의 값을 지정하도록 만드는 역할을 한다. 따라서 아래와 같이 코드를 변경하면, 사용자가 아무리 성별을 "여자"로 선택하더라도 결과값을 "남"으로만 출력된다.

 

 

 

 

 

(3) <jsp:setProperty>  멤버변수와 input name이 다른 값 지정하기

 

jsp:setProperty 액션 태그는 앞서 설명한 것처럼 value 와 param이라는 속성을 가진다. 이 값들이 별도로 지정되지 않은 경우라면, JPS 페이지는 property 속성값과 동일한 name 속성을 가지는 <input> 태그로부터 값을 읽어들이는 것이 기본 동작 구조다. 

 

하지만 프로그램을 제작하다보면, 보안상의 이유던지 아니면 다른 기타 이유로 인해 JavaBean과 <input> 태그 name 속성 값이 달라지는 경우도 발생할 수 있다. 이 때 사용할 수 있는 속성이 param이다. 

 

param은 Java Bean의 멤버변수와 다른 값을 가지는 name 속성 <input> 태그의 값을 저장하는데 사용한다. 만약 필자가 index.jsp에서 아이디를 입력받는 <input name="acc_id">를 <input name="id">로 변경했다고 가정해보자. 이 상태라면 register.jsp에서 아이디 값은 Null로 출력될 것이다.

 

 

 

 

이제 param을 적용하여 아이디가 정상적으로 출력되도록 수정해보자. 필자는 아래와 같이 수정했다.

 

 

 

 

 

Fin.

 

 

반응형

댓글