본문 바로가기

Development

JSP 2.0 JSTL 태그 - Database 액션

JSP 2.0 에 도입된 커스텀 태그 기능중 주요하고 자주 사용되는 기본 모듈을 골라 정해놓은 것을 JSTL 이라 부르는데 그중 데이터베이스 관련 태그를 알아보도록 하자

  • <sql:query>

<sql:query> 액션 태그는 SQL 의 select 절과 같은 역할을 한다고... 쿼리의 결과를 해당 스코프 변수에 저장한다. 데이터베이스에 전달할 쿼리와 함께 <sql:param> 과 <sql:dataParam> 태그가 사용된다.

1. sql 문장이 복잡하지 않고 변하지 않는 파라미터를 가지고 있을 경우 사용하겠다.
<sql:query sql="SQL문장"
    [dataSource="웹컨테이너에서 제공하는 데이터소스"]
    [maxRows="리턴할 레코드 갯수"]
    [startRow="레코드 시작위치"]
    var="전달 받을 변수 타입은 ResultSet 이되겠다"
    [scope="page |request|session|application"] />

2. 변하는 파라미터가 있고 PrepareStatment 처럼 사용하려는 경우 쓸수 있겠다.
<sql:query sql="SQL문장"
    [dataSource="웹컨테이너에서 제공하는 데이터소스"] 
    [maxRows="리턴할 레코드 갯수"]
    [startRow="레코드 시작위치"]
    var="var "
    [scope="page |request|session|application"]>
<sql:param> 액션태그
</sql:query>

<sql:query var="result"> SELECT * FROM Employee WHERE Name = ?
<sql:param value="${param:empName}" />
</sql:query>

3. 이 방법이 가장 길고 보기 좋지 않을까 한다. ㅋㅋ
<sql:query 
    [dataSource="웹컨테이너에서 제공하는 데이터소스"] 
    [maxRows="리턴할 레코드 갯수"]
    [startRow="레코드 시작위치"]
    var="var "
    [scope="page |request|session|application"]>
SQL 문장
<sql:param> 액션태그
</sql:query>

  • <sql:update>

쿼리와 함께 가장 많이 쓰이는 구문이다. INSERT, UPDATE, DELETE 문을 포함하여 CREATE TABLE 등의 명령도 사용가능하다. <sql:query> 구문처럼 다양한 방법으로 사용이 가능하다. 다른점이 있다면 var 값의 위치이다. 리턴값이 있을 경우 스코프를 지정할 수 있다. 즉 리턴값이 없다면 스코프 지정도 필요없다는 것.

1. 바디 내 모든것을 다 담아 표현한다.
<sql:update sql="sqlStatement "
    [dataSource="dataSource "]
    [var="var "
        [scope="page |request|session|application"]
    ] />

2. 파라메터만 뺀다
<sql:update sql="sqlStatement "
    [dataSource="dataSource "]
    [var="var " [scope="page |request|session|application"]]>
<sql:param> 태그
</sql:update>

<sql:update>
  DELETE * FROM Employee WHERE Id = ?
  <sql:param value="${empId}" />
</sql:update>
3. 문장과 파라미터를 빼어 표현
<sql:update
[dataSource="dataSource "]
[var="var " [scope="page |request|session|application"]]>
sqlStatement
<sql:param> 태그
</sql:update>
  • <sql:param>

? 표에 파라미터를 전달할 수 있는 액션이다. 함께 사용되는 DB 에 따라 다르지만 만약 null 값이 입력되었을 경우 SQL 의 NULL 값으로 전달된다.
수치, 문자가 사용될 수 있고 날짜, 시간을 위해서 <sql:dateParam> 액션이 따로 존재하니 참고.

1. Without a body
<sql:param value="parameterValue" />

<sql:update>
    DELETE * FROM Employee WHERE Id = ?
    <sql:param value="${empId}" />
</sql:update>

2. With a body
<sql:param>
    parameterValue
</sql:param>

  • <sql:dateParam>

위에서 살펴본 <sql:param> 의 날짜,시간형 버전이다.

1. 타임스템프 타입이 추가된다. 출력되는 형태는 JSTL 인터네셔설 태그세팅과 연관이 있을 것으로 추측된다. 당연히 value 값은 'java.util.Data' 타입이다.
<sql:dateParam value="parameterValue "
    [type="timestamp |time|date"] />

<sql:update>
    UPDATE Employee SET EmpDate = ?
    WHERE EmpId = ?
    <sql:dateParam value="${empDate}" />
    <sql:param value="${empId}" />
</sql:update>

  • <sql:setDataSource>

웹컨테이너가 제공하는 데이터 소스를 명시한다. 복잡한 데이터베이스 커넥션을 WAS가 제공하는 데이터소스로 간편히 커넥션을 얻을 수 있다고...

1. 사용 방법은 자주 보던 ... 소스이다.
<sql:setDataSource
    [dataSource="dataSource " | url="url "
        [driver="driverClassName "]
        [user="username "] [password="password "]]
    [var="var "]
    [scope="page |request|session|application"] />

<sql:setDataSource var="snapshot"
    url="jdbc:odbc:snapshot"
    driver="sun.jdbc.odbc.JdbcOdbcDriver" />
<sql:query dataSource="${snapshot}" sql="..." var="result" />

  • <sql:transaction>

트랜젝션을 위한 구문이다. 트랜젝션 처리가 필요한 부분을 감싸는 형태로 사용된다.

1. 주로 <sql:update> 구문에 자주사용된다.
<sql:transaction [dataSource="dataSource"]
    [isolation="read_committed|read_uncommitted|repeatable_read| serializable"]>
    <sql:query> and <sql:update> actions, and optionally other JSP elements
</sql:transaction>

<sql:transaction>
    <sql:update>
    UPDATE Account
        SET Balance = Balance – ? 
        WHERE AccountNo = ?
        <sql:param value="${amount}" />
        <sql:param value="${fromAccount}" />
    </sql:update>
    <sql:update>
    UPDATE Account
        SET Balance = Balance + ?
        WHERE AccountNo = ?
        <sql:param value="${amount}" />
        <sql:param value="${toAccount}" />
    </sql:update>
</sql:transaction>