1. 아래를 try catch 로 묶지 않으면 에러가 나는 이유를 설명하시오.
try { connection = dataSource.getConnection(); String query = "insert into mvc_board (bId, bName, bTitle, bContent, " + "bHit, bGroup, bStep, bIndent) " + "values (mvc_board_seq.nextval, ?, ?, ?, " +"0, mvc_board_seq.currval, 0, 0)"; preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, bName); preparedStatement.setString(2, bTitle); preparedStatement.setString(3, bContent); int rn = preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }
: 위 소스 코드는 Connection과 PreparedStatement 객체를 호출하여 쿼리문을(JDBC) 통해 컬럼값을 가져오면 이를 처리하는 형태를 가지고 있다. 그러나 이러한 구조는 DB에 데이터를 가져오는 과정에서 지속적으로 메모리 자원을 소모하기 때문에 어느순간 고갈되는 시점이 올 것이다. 따라서 필요한 데이터를 다 가져올때 닫아주는 기능(close)을 사용한다.
// 기존 소스코드(자원을 close하지 않았다)
try {
connection = dataSource.getConnection();
String query = "insert into mvc_board (bId, bName, bTitle, bContent, "
+ "bHit, bGroup, bStep, bIndent) "
+ "values (mvc_board_seq.nextval, ?, ?, ?, "
+"0, mvc_board_seq.currval, 0, 0)";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, bName);
preparedStatement.setString(2, bTitle);
preparedStatement.setString(3, bContent);
int rn = preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
// 소스코드 추가
} finally { // finally를 통해 반드시 실행되게끔 한다
try { // 각 객체의 메모리가 해제 되지 않으면(Not Null) close() 메소드를 이용하여 해제한다
if (connection != null) { connection.close(); }
if (preparedStatement != null) { preparedStatment.close(); }
} catch (Exception e2) {
e2.printStackTrace();
}
}
2. 데이터 무결성을 위한 제약조건 4가지는?
- NOT NULL: NULL을 허용하지 않음
- UNIQUE: 중복된 값을 허용하지 않고 항상 유일한 값을 갖도록 함
- PRIMARY KEY: NULL을 허용하지 않고, 중복된 값도 허용하지 않음. NOT NULL 조건과 UNIQUE 조건을 결합한 형태
- CHECH: 저장 가능한 값이 범위나 조건을 지정하여, 설정한 값만을 허용한다.
3. foreign key 에 대하여 설명하시오.
: 참조되는 테이블의 컬럼의 값이 존재하면 허용하는 키로 PK조건에 의해 설정한다. 이때 관계형 DB의 특성을 가진 Oracle DB는 컬럼의 값을 내어주는 쪽을 부모 테이블, 컬럼의 값을 가져가는 쪽을 자식 테이블로 지정한다.
4. 쿼리 문제
4-1. 직업이 ‘CLERK’ 인 사원들보다 더 많은 급여를 받는 사원의 사원번호, 이름, 급여를 출력하되, 결과를 급여가 높은 순으로 정렬하라.
SELECT empno, ename, sal FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE job = 'CLERK') ORDER BY sal DESC;
SELECT empno, ename, sal
FROM emp
WHERE sal > ALL (SELECT sal
FROM emp
WHERE job = 'CLERK')
ORDER BY sal DESC;
4-2. 이름에 ‘A’가 들어가는 사원과 같은 직업을 가진 사원의 이름과 월급, 부서번호를 출력하라.
SELECT ename, sal, deptno, job
FROM emp
WHERE job IN (SELECT job
FROM emp
WHERE ename LIKE '%A%');
4-3. ‘New York’ 에서 근무하는 사원과 급여 및 커미션이 같은 사원의 사원이름과 부서명을 출력하라.
-- NOT FOUND
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno AND
d.loc = 'NEW YORK' AND
e.sal = ALL (SELECT sal FROM emp) AND
e.comm = ALL (SELECT comm FROM emp);
-- 'NEW YORK'에서 근무하는 사원들은 'KING', 'CLARK', 'MILLER' 총 3명인데 모두 급여(SAL)가 다르다.
SELECT e.ename, d.loc, e.sal, e.comm
FROM emp e, dept d
WHERE e.deptno = d.deptno AND
d.loc = 'NEW YORK';
'WebDev > 본과정' 카테고리의 다른 글
JS의 메소드와 Spring의 IOC 컨테이너 (0) | 2021.05.16 |
---|---|
자바 스크립트의 변수와 자료형 (0) | 2021.05.16 |
MVC 패턴을 이용한 게시판 구현-2 (0) | 2021.05.16 |
DB 서브쿼리와 DDL 및 DML, JSP MVC패턴으로 게시판 만들기 (0) | 2021.05.15 |
[JSP] MVC 패턴을 이용한 DB 가져오기 (0) | 2021.05.15 |
최근댓글