자바빈(JavaBeans)이란 데이터를 표현하는 것을 목적으로 하는 자바 클래스를 말한다.
자바빈 규약을 따르는 클래스를 자바빈이라 부르며, MVC 구조에서 모델(Model)에 해당된다.
자바빈 규약
클래스는 반드시 파라미터가 없는 기본 생성자를 가진다.
클래스는 직열화(Serializable)되어야 한다.
프로퍼티는 get, set 메서드를 통해 읽고 쓸 수 있어야 한다.
프로터티 마다 Getter, Setter가 있어야 한다.
Getter는 파라미터가 없어야 한다.
Setter는 하나 이상의 파라미터를 가진다.
프로퍼티가 Boolean 일 경우 get 대신 is를 사용한다.
프로퍼티의 접근 제어자는 Private, Getter/Setter은 public, 클래스는 public로 정의해야 한다.
자바빈 규약을 만족하는 클래스를 작성해보자.
PersonBean.java
package com.study;
/**
* 클래스는 직렬화가 되어야 한다.
*/
public class PersonBean implements java.io.Serializable {
/**
* Property name 은 읽고 쓸 수 있어야 한다.
* 접근 제어자는 private이다.
*/
private String name = null;
/**
* boolean 멤버의 경우 get 대신 is 를 사용한다.
*/
private boolean deceased = false;
/**
* 기본 생성자. 파라미터가 없어야 한다.
*/
public PersonBean() {
}
/**
* Getter는 파라미터가 없어야 한다
*/
public String getName() {
return this.name;
}
/**
* Setter는 하나 이상의 파라미터를 가진다.
*/
public void setName(final String _value) {
this.name = _value;
}
/**
* boolean 멤버의 경우 get 대신 is 를 사용한다.
*/
public boolean isDeceased() {
return this.deceased;
}
/**
* Setter는 하나 이상의 파라미터를 가진다.
*/
public void setDeceased(final boolean _value) {
this.deceased = _value;
}
}
TestPersonBean.java
package com.study;
public class TestPersonBean {
public static void main(String[] args) {
PersonBean person = new PersonBean();
person.setName("Tester");
person.setDeceased(false);
System.out.println("Name: " + person.getName());
System.out.println("State: " + (person.isDeceased() ? "Dead" : "Alive"));
}
}
LoginProcessServlet 에서 세션에 ID를 저장하도록 할 것이므로 필터 처리에 예외가 되도록 한다. LoginProcessServlet 를 거치지 않고서는 ID가 세션에 없으므로 무조건 로그인 화면으로 가버리게 되기 때문이다.
package com.study;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter {
public void init(FilterConfig _fc) throws ServletException {
}
public void doFilter(ServletRequest _request, ServletResponse _response,
FilterChain _chain) throws IOException, ServletException {
System.out.println("LoginFilter....");
_request.setCharacterEncoding("EUC-KR");
HttpServletRequest hs_request = (HttpServletRequest)_request;
HttpSession hs_session = hs_request.getSession();
String uri = hs_request.getRequestURI();
System.out.println(" => Request URI: " + uri);
if (uri.indexOf("LoginProcess.do") < 0) { // LoginProcess 서블릿은 필터링 예외로 둔다.
String id = (String)hs_session.getAttribute("id");
System.out.println(" => ID: " + id);
if (id == null || id.trim().length() == 0) { // ID가 세션에 없다면
HttpServletResponse hs_response = (HttpServletResponse)_response;
hs_response.sendRedirect("/Round_18/login.htm");
return;
}
}
_chain.doFilter(_request, _response); // '가던 길로 가세요~' 라는 의미 :)
}
public void destroy() {
}
}
LoginProcessServlet.java
로그인 처리 서블릿에서는 세션에 ID를 저장하고 Main.do를 호출한다.
package com.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginProcessServlet extends HttpServlet {
public void doPost(HttpServletRequest _request, HttpServletResponse _response)
throws IOException, ServletException {
System.out.println("LoginProcessServlet....");
// 계정 검증 처리 작업
// ....
// 검증 작업 후 ID를 세션에 저장 후 페이지 이동
HttpSession session = _request.getSession();
session.setAttribute("id", _request.getParameter("id"));
_response.sendRedirect("Main.do"); // SendRedirect() : GET 요청 발생
}
}
웹 프로그램에서는 데이터베이스의 환경 설정과 연결 관리등을 XML 파일이나 속성 파일을 사용하여 관리하고 특정 이름을 사용하여 이 정보를 얻어온다.
웹에서 불특정 다수의 사용자가 DB연결을 요청한다고 무작정 허용한다면 DBMS는 부하를 감당할 수 없을 것이다.
따라서 연결 개수를 설정하여 현재 연결된 사용자가 더 이상 Connection 객체를 사용하지 않을 경우 해당 Connection 객체를 반환받아서 다른 사용자에게 할당해야 한다. 이런 작업을 Connection Pooling이라 하고 DBCP(Database Connection Pooling)이라 부른다.
여기서는 톰캣의 DBCP(Database Connection Pool)를 사용하여 DBMS Connection 객체를 생성, 사용하는 방법에 대해 알아본다.