SW공부 55일차

Guryena·2023년 3월 31일
0

JSP

목록 보기
2/2

1. 오라클 primary key 와 foreign key 차이는?

  • primary key
    기본키(Primary Key; PK)는 주 키 또는 프라이머리 키라고 하며, 후보키 중에서 특별히 선정된 키로 중복된 값을 가질 수 없으며, 후보키의 성질을 갖는다. 즉, 유일성과 최소성을 가지며 튜플을 식별하기 위해 반드시 필요한 키이다. 영어 약자로 PK(피케이)라고 한다.
    기본키는 Null 값을 가질 수 없기 때문에 튜플에서 기본 키로 설정된 속성에 Null 값이 있어서는 안 된다. 릴레이션 스키마를 표현할 때 기본키는 속성 아래 밑줄을 그어 표시한다.

  • foreign key
    외래키(Foreign Key) 또는 포린키란 하나(또는 여러개)의 다른 릴레이션의 기본키(PK) 필드를 참조하는 데이터의 참조 무결성(Referential integrity)을 확인하기 위해 사용되는 키(Key)를 의미한다. 간략히 FK(에프케이)라고도 한다.
    외래키(FK, Foreign key)는 한 릴레이션을 다른 릴레이션과 연결해주는 역할을 한다. 외래키가 설정된 릴레이션에 레코드를 입력하면, 기준이 되는 릴레이션의 내용을 참조해서 레코드가 입력된다. 즉, 외래키는 하나의 릴레이션을 다른 릴레이션에 의존하게 만든다.
    외래키를 설정하는 방법은 2가지가 있는데 릴레이션을 생성할때 설정하는 방법과 이미 생성된 릴레이션에 ALTER 명령어를 이용하여 설정하는 방법이다. 외래키를 설정할 때, 참조되는(기본키가 있는 릴레이션) 릴레이션의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 한다. 또한 외래키의 특징 중 '참조되는 값이 변경되면 참조하는 값도 변경된다.'가 있는데 이를 적용하기 위해선 특정 제약 조건들을 이용하여 설정이 필요하다.

2. 오라클 Sequence 란?

Sequence

  • 유일(UNIQUE)한 값을 생성해주는 오라클 객체이다.
  • 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성 할 수 있다.
  • 보통 PRIMARY KEY 값을 생성하기 위해 사용 한다.
  • 메모리에 Cache되었을 때 시퀀스값의 액세스 효율이 증가 한다.
  • 시퀀스는 테이블과는 독립적으로 저장되고 생성된다.
-- 시퀀스 생성 Syntax
CREATE SEQUENCE sequence_name
    [START WITH n]
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]
  • START WITH : 시퀀스의 시작 값을 지정한다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 한다.
  • INCREMENT BY : 시퀀스의 증가 값을 지정한다. n을 2로 하면 2씩 증가한다. START WITH를 1로, INCREMENT BY를 2로 설정하면 1, 3, 5, 7,.. 이렇게 시퀀스 번호가 증가한다.
  • MAXVALUE : 시퀀스 최대값
  • MINVALUE : 시퀀스 최소값
  • CYCLE|NOCYCLE : 최대값 도달시 순환 여부
  • CACHE | NOCACHE : CACHE 여부, 원하는 숫자만큼 미리 만들어 Shared Pool의 Library Cache에 상주시킨다.

3. CP 에 대하여 설명하시오.

Connection Pool (CP)

연결 풀 또는 커넥션 풀(connection pool)은 소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
연결 풀을 사용하면 데이터베이스의 명령 실행의 성능을 강화할 수 있다. 각 사용자마다 데이터베이스 연결을 열고 유지보수하는 것은 비용이 많이 들고 자원을 낭비한다. 연결 풀의 경우 연결이 수립된 이후에 풀에 위치해 있으므로 다시 사용하면 새로운 연결을 수립할 필요가 없어진다. 모든 연결이 사용 중이면 새로운 연결을 만들고 풀에 추가된다. 연결 풀은 사용자가 데이터베이스에 연결을 수립하는데까지 대기해야하는 시간을 줄이기도 한다.

연결 풀을 지원하는 데이터베이스로는 IBM DB2, 마이크로소프트 SQL 서버, 오라클, MySQL, PostgreSQL 등이 있다.

4.dept_dao.jsp 에 dept 테이블에 있는 모든 데이타를 뽑아 오시오.(단, connection pool를 이용하시오)

package edu.global.ex;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


import edu.global.vo.DeptDTO;

public class DeptDAO {
//  connection pool 사용으로 인해 주석	
//	private String url = "jdbc:oracle:thin:@localhost:1521/xe";
//	private String uid = "scott";
//	private String upw = "tiger";
	
	private DataSource dataSource; //Connection Pool Object
	
	public DeptDAO() {
//		try {
//			Class.forName("oracle.jdbc.driver.OracleDriver");
//		}
//		catch (Exception e) {
//			e.printStackTrace();
//		}
		try {
			Context context = new InitialContext();
			dataSource = (DataSource)context.lookup("java:comp/env/jdbc/oracle");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public List<DeptDTO> deptSelct(){
		List<DeptDTO> deptDTO = new ArrayList<DeptDTO>();
		
		Connection con = null;
		Statement st = null;
		
		ResultSet rs = null;
		
		try {
			String sql = "SELECT * FROM DEPT";
			
//			con = DriverManager.getConnection(url, uid, upw);
			con = dataSource.getConnection();
			st = con.createStatement();
			rs = st.executeQuery(sql);
			
			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);
				deptDTO.add(dto);
			}
			

		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (st != null) {
					st.close();
				}
				if (con != null) {
					con.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return deptDTO;
	}
	
}
package edu.global.vo;

//이름     널?       유형           
//------ -------- ------------ 
//DEPTNO NOT NULL NUMBER(2)    
//DNAME           VARCHAR2(14) 
//LOC             VARCHAR2(13) 
public class DeptDTO {
	public DeptDTO() {
	}

	private int deptno;
	private String dname;
	private String loc;

	public DeptDTO(int dept, String dname, String loc) {
		this.deptno = dept;
		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;
	}

}
<%@page import="edu.global.vo.DeptDTO"%>
<%@page import="java.util.List"%>
<%@page import="edu.global.ex.DeptDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	DeptDAO dao = new DeptDAO();
	List<DeptDTO> dto = dao.deptSelct();
	
	for(DeptDTO deptDTO : dto){
		out.print("부서번호 : " + deptDTO.getDeptno() + "</br>" );
		out.print("장소 : " + deptDTO.getLoc() + "</br>" );
		out.print("부서이름 : " + deptDTO.getDname() + "</br>" );
		out.print("<hr>");
	}
	
%>
</body>
</html>

0개의 댓글