
view
view의 개념
view는 한 마디로 물리적인 테이블을 근거로 하는 논리적인 가상테이블이라고 정의할 수 있다.
view를 가상테이블이라고 하는 이유는?
=> 가상 : 실질적으로 데이터를 저장하고 있지 않다는 의미이다.
=> 테이블 : 사용자가 테이블에서 사용하는 것과 동일하게 뷰를 사용할 수 있기 때문이다.
view 필요성
그렇다면 view 라는게 왜 필요할까?
예를 들어 아래와 같은 코드가 있다고 생각해 보자
select empno, ename, deptno
from emp
where deptno=30;
위와 같은 결과를 처리해 주기 위해서는 select문을 매번 입력해야 한다.
=> view는 번거로운 select 문을 매번 입력하는 대신, 보다 쉽게 원하는 결과를 얻고자 하기 위해 나왔다.
create or replace view test_view1
as
select * from emp;
select *
from test_view1;
정리 : 매번 select 문의 번거로운 입력을 해결하기 위해 등장한게 view 이다.
참고) ed d.sql
select * from dept;
이런식으로 text 파일로 저장한다음에 @d.sql로 매번 실행하는 방법도 있다.
이 방법의 장점은 메일로 다른 사람한테 파일을 보내줄 수 있다는것이다.
하지만 이 방법은 항상 내가 파일을 컴퓨터에 가지고 있어야 한다는게 치명적인 단점이다.
이걸 보완하기 위해 나온게 view 방식이다.
view 동작원리
- 사용자가 뷰에대해서 질의를 하면 user_views에서 뷰에 대한 정의를 조회한다.
- 기본 테이블에 대한 뷰의 접근 권한을 살핀다.
- 뷰에 대한 질의를 기본 테이블에 대한 질의로 변환한다. (View에 대한 질의는 Base Table에 대한 질의로 Query Transformation 됨(단, 예외 있음))
- 기본 테이블에 대한 질의를 통해 데이터를 검색한다.
- 검색된 결과를 출력한다. (v1에 대한 쿼리와 바깥에 있는 select deptno 쿼리문을 조합해서 결과를 반환한다.)
JDBC 드라이버
JDBC 연동순서
1단계) connection 객체를 만들어서 연결하기
2단계) statement 객체 만들기(필요에 따라 3가지중 하나를 골라서 사용하면됨)
3단계) 쿼리 실행하기
4단계) ResultSet object 가져오기
5단계) connection 객체 닫기
jdbc driver 란?
DBMS를 만든 회사에서 만든 translator(시뮬레이터이자 트랜스레이터)
jdbc driver의 필요성
(sqlplus 또는 sqlDeveloper) 에는 sql net 이 설치되어 있고
DB서버에도 마찬가지로 sql net 이 깔려 있기 때문에 따로 jdbc driver를 설정하는 그런 과정을 안겪어도 되는거다.
jdk를 깔면 사용자의 컴퓨터에 자바개발환경이 구축되어진다.
근데 여기서는 sql net이 설치되어 있지 않기 때문에 jdbc driver를 통해 sql net 역할을 대신해주는거다.
(=>번역기 역할)
JDBC를 이용한 데이터베이스 연동 순서
- 프로젝트 생성
- 프로젝트에 lib 폴더 생성
- ojdbc11.jar(jdbc driver) 파일 복사해서 lib 폴더에 붙여넣기
C:\app\Saekang\product\21c\dbhomeXE\jdbc\lib
oracle listener란?
오라클 리스너는 네트워크를 이용하여 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자 입니다.
오라클 서버에서 리스너를 시작시켜줘야 클라이언트들이 접속을 할 수 있습니다.
오라클 서버가 동작하고 있는 머신 안에서 아래와 같은 코딩들로 DB 서버명을 설정(바꿔)줄수 있다.
set ORACLE_SID = orcl
set ORACLE_SID = prod
oracle listener의 필요성
오라클 서버는 서버이외의 머신 밖에서 들어오는 응답 요청은 받아주지 못한다.
(참고 : mySQL 은 서버를 내포하고 있어서 가능하다.)
오라클에서 위의 단점을 보완하기 위해 리스너를 만들고 모든 네트워크를 통한 연결은 모두 리스너가 담당하게했다.
리스너가 외부에서 접속을 시도하는 들어오는 요청을 받아준다음 db서버랑 연결시켜주는 역할을 하는것이다.
sqlplus ace/me@ip:1521/orcl
oracle listener를 통한 부하 분산
아래와 같은 코딩으로 Network alias를 추가할 수 있다.
mydb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xepdb1)
)
)
connect-time load balancing : 리스너를 2개를 만들어서 부하를 줄여주는 것이다.
thin driver 를 사용하면 포트번호를 구체적으로 줘야 하기 때문에 connect-time load balancing 하기 어렵다.
대신
oci 드라이버를 사용하면 포트번호를 구체적으로 지정해주지 않기때문에
connect-time load balancing이 따로 설정을 하지 않더라도 자연스럽게 가능하다.
ods.setURL("jdbc:oracle:oci8:ace/me@mydb");
Connection conn4 = ods.getConnection();
oci 드라이버 setURL을 보면 포트번호를 구체적으로 지정해주지 않는 것을 확인 할 수 있다.
그래서 1521 1522 같이 둘중에 자연스럽게 connect-time load balancing이 이루어진다.
더불어 failover도 가능하다.
oci 드라이버를 이용하려면 여러 가지 세팅을 해야하고 기본적인 지식을 더 쌓아야 하기 때문에 어렵다.
하지만 훨씬 안정적이다.
오늘의 팁
PL/SQL은 Block Structured Language임 -> Anonymous(Unnamed) Block
-> Named Block : Procedure, Function, Package, Trigger, Object, ...
- (Stand alone) Subprogram = (Stored) Procedure + (Stored) Function
- (Packaged) Subprogram
DBMS에 독립적이다!(=특정 DBMS에 종속되지 않는다~)
=> 좋지 않은 것이다.
(람보르기니 사고 경차처럼 운전하는것이다.)
(오라클을 샀으면 오라클에 있는 기능을 최대한 살뜰하게 다 쓰는게 좋은것 같다.! )
ORM 물론 좋다...(JPA...등등 다 좋다... )
하지만 PLSQL도 쓰고 ORM도 같이 쓸때가 제일 좋은 것 같다.
main class 를 드라이버 클래스 라고도 불린다.
Executing Queries
꼭 정해진 형식이 있는건 아니다.
다만 select 를 원하는데 executeUpdate를 한다면 업데이트된 행 숫자만 나오므로 원하는 결과를 얻지 못한다.
sql 꼭 맞는것만 하는게 아니다.
'Oracle' 카테고리의 다른 글
[Oracle]시퀀스, MERGE_1115 (0) | 2022.11.16 |
---|---|
[Oracle]저장 프로시저 / 저장함수 _ 1107 (0) | 2022.11.12 |
[Oracle]PL/SQL 개요 _ 1107 (0) | 2022.11.07 |
[Oracle]그룹함수_1104 (0) | 2022.11.04 |
[Oracle]Oracle 주요함수_1103 (0) | 2022.11.03 |