
DeptDao
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import edu.global.ex.dto.DeptDto;
import edu.global.ex.dto.EmpDto;
public class DeptDao {
private DataSource dataSource = null; // 커넥션풀 객체
// 기존에 driver를 설정하고 Class.forName(driver)를 넣는 방식과는 달리
// context.xml에 리소스를 설정해준다.
// context.xml에 있는 소스를 읽기 위해 context 객체를 생성한다.
public DeptDao() {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/oracle");
// 커넥션풀 객체를 받아옴
} catch (NamingException e) {
e.printStackTrace();
}
}
public List<DeptDto> deptList() {
List<DeptDto> depts = new ArrayList<>();
Connection conn = null;
PreparedStatement pStatement = null;
ResultSet rs = null;
try {
String query = "select * from dept";
conn = dataSource.getConnection();
pStatement = conn.prepareStatement(query);
rs = pStatement.executeQuery();
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
DeptDto dto = new DeptDto(deptno, dname, loc);
depts.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pStatement != null)
pStatement.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return depts;
}
}
DeptDto
public class DeptDto {
private int deptno;
private String dname;
private String loc;
public DeptDto() {}
public DeptDto(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
dept
<%@page import="edu.global.ex.dto.DeptDto"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="edu.global.ex.dao.DeptDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<style type="text/css">
td {
border: 1px solid;
}
</style>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
DeptDao dao = new DeptDao();
List<DeptDto> dlist = dao.deptList();
out.print("<table>");
for (DeptDto item : dlist ) {
out.print("<tr>");
out.print("<td>사번  " +item.getDeptno()+"</td>");
out.print("<td>이름  " +item.getDname()+"</td>");
out.print("<td>직종  " +item.getLoc()+"</td>");
out.println("</tr>");
}
out.print("</table>");
%>
</body>
</html>
-- 사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
🍕 SELECT ENAME, 19 || SUBSTR(HIREDATE, 1, 2) as 년도, SUBSTR(HIREDATE, 4, 2) as 달 FROM EMP;
-- 각 직원들이 근무한 개월 수를 수하는 쿼리문
🍕 SELECT ename, trunc(months_between(SYSDATE, HIREDATE)) FROM emp;
-- 입사한 달의 마지막 날을 구하는 쿼리문
🍕 SELECT HIREDATE, LAST_DAY(HIREDATE) FROM EMP;
-- 현재 날짜를 반환하는 쿼리문
🍕 SELECT SYSDATE FROM DUAL;
커넥션 풀이란?
WAS(웹 컨테이너)가 실행 될 때 DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가 사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.

웹 어플리케이션에서 커넥션 풀을 사용하는 이유중 우선 첫번째로 Java에서는 DB Connection을 맺는 과정이 부하가 많이 걸리는 작업이라 동시에 많은 사람들이 DB 커넥션을 요구한다면 최악의 경우 서버가 죽어버리는 문제가 발생할 수도 있다. 이러한 문제를 해결하기 위해 미리 Connection을 생성하고 재활용하여 서버에 부하를 줄여주는 용으로 사용한다.
두번째로는 서버는 한정정인 자원을 가지고 있는데 요청이 올때마다 무제한의 Connection을 생성하게 된다면 전체 시스템에 성능에 문제가 생길 수 있다. 이러한 문제를 해결하기 위해 커넥션풀에 미리 정해진 숫자의 Connection을 생성해서 관리한다.
EL이란?
EL(Expression Language)은 자바 빈의 프로퍼티, 값을 JSP의 표현식 <%= %>이나 액션 태그 <jsp:useBean>를 사용하는것 보다 쉽고 간결하게 꺼낼수 있게 하는 기술이다.
EL 기본 객체
<jsp:getProperty name="member" property="name"/>
${member.name}