본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 62일차 - 자바빈, init(), <load-on-statup> 태그, 커넥션 풀, 오브젝트풀 패턴, 싱글턴 패턴, 태그 라이브러리

자바빈(JavaBean)

 

JSP에서 객체를 가져오기 위한 기법으로 데이터 전달 오브젝트 파일 DTO(Data Transfer Object)라고도 한다.
자바로 작성된 컴포넌트들 즉, 클래스(Class)를 일반적으로 말한다.
JSP 프로그래밍에는 DTO(Data Transfer Object)나 DAO(Data Access Object)클래스의 객체를 JSP페이지에서 사용하기 위해 사용한다.
자바빈을 이용하여 프로그래밍을 하면 클래스의 객체 선언과 비즈니스 로직 등을 <% %> 스크립틀릿 영역에서 작성하지 않아서 가독성이 좋다. 
자바빈의 장점은 자바 코드를 최대한 줄일 수 있으며, 재사용이 가능하여 자원 낭비를 막을 수 있다는 것이다. 

 

1. <jsp:useBean/> 태그

자바빈 객체를 생성하기 위한 태그. 

jsp에서 JavaBean을 통해 새로운 객체 즉, JavaBean을 생성할 때는 생성자 역할인 jsp:useBean 태그를 사용해야 한다.

<jsp:useBean id="빈 이름" class="자바빈 클래스 명" scope="사용범위"/>

*id : 생성할 객체(인스턴스)의 이름을 정의 (생략불가)
*class : 객체를 생성할 클래스명을 정의 (패키지명.클래스명으로 설정)
*scope : 자바빈 객체가 공유되는 범위를 지정 (scope 생략시 기본값은 page)

+) scope는 page, request, session, application 네 가지가 있으며, 보통 한 페이지 내에서만 사용하기 위해, page를 사용한다.

 

2. <jsp:setProperty/> 태그
자바빈 클래스의 속성 값을 설정하기 위한 태그. 

<jsp:setProperty name="빈 이름" property="속성명" value="설정할 값"/>
<jsp:setProperty name="빈 이름" property="속성명" param="파라미터명"/>

*name : useBean을 이용해 생성한 객체 이름을 명시
*property : 값을 저장할 프로퍼티의 이름을 명시
*value : 저장할 값을 정의

 

3. <jsp:getProperty/>태그
자바빈 클래스의 속성값을 가져오기 위한 태그. 

<jsp:getProperty name="빈 이름" property="속성명"/>

*name : 값을 가져올 빈의 id
*property(자바의 멤버변수) : 가져올 속성의 이름

 

 

서블릿의 초기화

 

1. 서블릿 로딩
서블릿은 클라이언트로부터 최초 요청시 단 한번 초기화되며 생성된다.
WAS 내부의 서블릿 컨테이너에서 서블릿 객체 생성 후 초기화시에 init()메서드를 호출하는데 이 과정을 서블릿 로딩이라 한다.
이후 해당 서블릿 객체는 서블릿 컨테이너에서 대기하다가 동일한 요청이 있을시 service()메서드를 통해 요청을 처리한다.


2. 초기화 메소드 init()
서블릿은 init() 메소드를 사용해서 필요한 초기화 작업을 수행한다.
서블릿 컨테이너는 서블릿을 초기화하기 위해 ServletConfig 파라미터를 갖는 init() 메소드를 실행한다.
init(ServletConfig) 메소드는 내부에서 다시 파라미터가 없는 init() 메소드를 호출한다.
따라서 초기화가 필요한 서블릿은 파라미터가 없는 init() 메소드를 재정의하면 된다. (ServletConfig 이 필요하면, ServletConfig를 파라미터로 갖는 init() 메소드를 재정의하면 된다.)

보통 초기화 작업은 상대적으로 시간이 오래 걸리기 때문에, 처음 서블릿을 사용하는 시점보다 웹 컨테이너를 처음 구동시키는 시점에 초기화를 진행하는 것이 좋다.
이를 위한 설정이 web.xml의 <load-on-statup> 태그이다.

 

3. <load-on-statup> 태그

<load-on-startup>태그를 설정하면 웹 어플리케이션을 시작할 때 서블릿을 로딩한다.

<load-on-startup>태그의 값은 로딩 순서를 의미하며, 값을 기준으로 오름차순으로 서블릿을 로딩한다.
즉, 톰캣을 구동하는 시점에서 DBCPInit 서블릿 객체를 생성하고, init() 메소드를 실행한다. 웹 어플리케이션을 시작하는 시점에서 커넥션 풀을 초기화하므로, JSP나 서블릿 코드에서 커넥션 풀을 사용할 수 있게 된다.


예) web.xml에서 DBCP 초기화를 위한 설정 (jdbc 패키지의 DBCPInit 서블릿)

<servlet>
    <servlet-name>DBCPInit</servlet-name>
    <servlet-class>jdbc.DBCPInit</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

 

 

커넥션 풀(DBCP)


데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을 풀에서 쓰고 다시 풀에 반환하는 기법을 말한다.
웹 프로그램에서는 데이터베이스의 환경설정과 연결 관리 등을 따로 XML파일이나 속성 파일을 사용해서 관리하고, 이렇게 설정된 정보를 이름을 사용하여 획득하는 방법을 사용한다.

*웹 컨테이너가 실행되면서 커넥션(connection) 객체를 미리 풀(pool)에 생성해 둔다.
*DB와 연결된 커넥션(connection)을 미리 생성해서 풀(pool) 속에 저장해 두고 있다가 필요할 때에 가져다 쓰고 반환한다.
*미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리 할 수 있다.

 

 

오브젝트풀 패턴(ObjectPool Pattern)

 

오브젝트풀 패턴 '재사용' 가능한 객체들을 모아놓은 객체 풀 클래스를 정의하는 것이다.

객체 풀 클래스에 들어가는 객체는 현재 자신이 사용중인지 아닌지 알 수 있는 방법을 제공해야 한다.
*풀은 초기화될 때 사용할 객체들을 미리 생성하여 배열에 넣어두고 사용 안함 상태로 초기화 한다.
*새로운 객체가 필요하면 풀에 요청한다.
*풀은 사용 가능한 객체를 찾아 사용 중으로 초기화 한 뒤 리턴한다.
*객체를 더 이상 사용하지 않는다면 사용 안 함 상태로 되돌린다.

장점 메모리를 신경쓰지 않고 마음껏 객체를 생성, 삭제할 수 있다.
단점 객체 아무것도 사용하지 않아도 메모리를 차지하고 있는 상태가 됨.
용도 객체를 빈번하게 생성/삭제 해야할 때
객체들의 크기가 비슷할 때
객체를 힙에 생성하기엔 느리거나 메모리 단편화가 우려될 때
DB 연결이나 네트워크 연결같이 객체 생성시 비용이 비쌀 경우 미리 생성해두고 재사용할 필요가 있을 때

 

 

싱글턴(Singleton) 패턴


싱글턴(singleton)은 오직 하나의 객체만을 생성할 수 있는 클래스를 말한다. 따라서 싱글턴 패턴을 사용하면 쉽게 객체의 유일성을 보장할 수 있다. 또한 일반적으로 싱글턴 객체에 대한 참조를 public static 필드나 public static 메서드로 노출하므로 어디에서나 싱글턴 객체에 접근할 수 있다.
객체가 오직 하나만을 보장하려면 정적(static) 필드를 사용하면된다. 정적 필드를 사용하면 모든 객체가 공유하는 필드를 만들 수 있으며, 한 번만 생성되고 별도의 메모리 공간에 저장된다는 특징이 있다.
또한 외부에서 자유롭게 접근할 수 있기 때문에 이 필드에 다른 객체가 할당되거나, 이미 할당했는데 싱글턴 내부에서 다시 객체를 할당하는 실수가 없도록 final로 선언해야 한다. 그리고 외부에서 생성자를 통해 객체를 생성할 수 없도록 생성자의 접근 범위를 private로 제한해야 한다.

 

 

태그 라이브러리 선언

 

자바에서 import문을 선언하듯 JSP에서도 JSTL 확장 태그를 사용하려면 taglib 지시자로 라이버리를 선언해야 한다.
JSP 지시자 태그 <%@ taglib %>를 사용해서 다음과 같이 선언한다.

<%@ taglib prefix="접두사" uri="URI" %>

*uri : 태그 라이브러리의 네임 스페이스 URI 식별자
*prefix : JSTL 태그를 사용할때 태그 이름 앞에 붙일 접두사

 

 

*태그 라이브러리 별 표준 선언문

태그 라이브러리 선언문
Core <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
XML <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
I18N <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Database <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
Functions <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 

 

코어 태그

 

기능 분류 태그 설명
변수 지원 <c:set> JSP에서 사용할 변수를 설정한다.
<c:remove> 설정한 변수를 제거한다.
흐름 제어 <c:if> 조건에 따라 내부 코드를 수행한다.
<c:choose> 다중 조건을 처리할 때 사용된다.
<c:forEach> 컬렉션이나 Map의 각 항목을 처리할 때 사용된다.
<c:forTokens> 구분자로 분리된 각각의 토큰을 처리할 때 사용된다.
URL 처리 <c:import> URL을 사용하여 다른 자원의 결과를 삽입한다.
<c:redirect> 지정한 경로로 리다이렉트 한다.
<c:url> URL을 재작성 한다.
기타 태그 <c:catch> 익셉션을 처리할 때 사용한다.
<c:out> JspWriter에 내용을 출력한다.