11월 30일 - 수업 28일차 JSP / SQL

수아레스·2022년 11월 30일
post-thumbnail

1. emp 테이블을 DAO, DTO 클래스로 만들어 뿌리시오.

  • dept 테이블을 DAO, DTO 클래스로 만들어 뿌리시오.

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>사번 &nbsp" +item.getDeptno()+"</td>");
			out.print("<td>이름 &nbsp" +item.getDname()+"</td>");
			out.print("<td>직종 &nbsp" +item.getLoc()+"</td>");
		out.println("</tr>");
	}
	out.print("</table>");
%>
</body>
</html>
  • emp 테이블의 총 월급합(모든 사원의 월급합)을 뿌리시오.

2. 아래의 sql 구문을 작성하시오.

-- 사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
🍕 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;

3. CP(connection pool)에 대하여 설명하시오.

커넥션 풀이란?

WAS(웹 컨테이너)가 실행 될 때 DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가 사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.

  1. 사용자가 DB를 사용하기 위하여 Connection을 요청한다.
  2. Connection Pool에서 사용되지 않고 있는 Connection 객체를 제공한다.
  3. 사용자가 Connection 객체를 사용 완료하면 pool로 반환한다.

커넥션풀의 장점

  1. 서버의 부하를 줄여준다.

웹 어플리케이션에서 커넥션 풀을 사용하는 이유중 우선 첫번째로 Java에서는 DB Connection을 맺는 과정이 부하가 많이 걸리는 작업이라 동시에 많은 사람들이 DB 커넥션을 요구한다면 최악의 경우 서버가 죽어버리는 문제가 발생할 수도 있다. 이러한 문제를 해결하기 위해 미리 Connection을 생성하고 재활용하여 서버에 부하를 줄여주는 용으로 사용한다.

  1. 서버의 한정적인 자원을 효율적으로 사용할수 있다.

두번째로는 서버는 한정정인 자원을 가지고 있는데 요청이 올때마다 무제한의 Connection을 생성하게 된다면 전체 시스템에 성능에 문제가 생길 수 있다. 이러한 문제를 해결하기 위해 커넥션풀에 미리 정해진 숫자의 Connection을 생성해서 관리한다.

4. EL에 대하여 설명하시오.

EL이란?

EL(Expression Language)은 자바 빈의 프로퍼티, 값을 JSP의 표현식 <%= %>이나 액션 태그 <jsp:useBean>를 사용하는것 보다 쉽고 간결하게 꺼낼수 있게 하는 기술이다.

${ }

  • JSP가 실행될 때 즉시 반영된다.
  • 객체 프로퍼티 값을 꺼낼때 주로 사용

#{ }

  • 시스템에서 필요하다고 판단될 때 그 값을 사용한다.
  • 사용자 입력값을 객체의 프로퍼티에 담는 용도로 주로 사용

EL 기본 객체

5. 아래의 액션 태그를 EL로 표현하시오.

<jsp:getProperty name="member" property="name"/>

${member.name}

6. 4개의 scope에 대하여 설명하시오. (예습)

profile
띵호와

0개의 댓글