ki-sd 님의 블로그
[2026-04-20] 오라클 핵심 총정리 및 서브쿼리, 뷰(View), 시퀀스의 심화 본문
오라클 데이터베이스의 기본기를 총망라하여 복습하고, 응용 프로그램(자바 웹 애플리케이션 등)과의 연동을 위한 필수 심화 객체들인 서브쿼리, 뷰, 시퀀스의 메커니즘을 완벽히 마스터했다.
1. RDBMS 핵심 구조와 제약조건(Constraints)을 활용한 실전 설계
- 데이터형과 자바 객체(VO) 매핑: 오라클의 VARCHAR2, CLOB은 자바의 String으로, NUMBER는 int나 double로, DATE는 java.util.Date로 매핑되는 구조적 흐름을 다시 한번 상기했다.
- 5대 무결성 제약조건 완벽 제어: PK(기본키), FK(외래키), UK(고유키), NN(NOT NULL), CK(체크) 제약조건을 활용해 '판매전표'와 '제품', '전표상세' 테이블을 직접 설계했다. 테이블 간의 참조 무결성을 지키기 위해, 자식 테이블(전표상세)을 먼저 삭제해야 부모 테이블(판매전표)을 삭제할 수 있다는 구조적 종속성을 확인했다.
- 테이블 복사(CTAS): CREATE TABLE AS SELECT 구문을 통해 기존 테이블의 데이터와 구조를 한 번에 복사하는 기법을 실습했다. 특히 WHERE 1=2처럼 무조건 거짓(FALSE)이 되는 조건을 부여하여, 데이터는 제외하고 테이블의 '빈 뼈대(컬럼 구조)'만 복사해 오는 실무적인 팁을 습득했다.
2. 가상 컬럼 ROWNUM과 서버 사이드 페이징의 진화
- ROWNUM의 한계: 오라클은 테이블에 데이터가 저장될 때 물리적 순서대로 ROWNUM이라는 가상 번호를 부여한다. 이를 통해 상위 5명(WHERE ROWNUM <= 5)을 뽑는 것은 쉽지만, 중간 번호(예: 6번부터 10번)를 직접 지정해서 잘라올 수는 없다는 치명적인 한계를 확인했다.
- 인라인 뷰를 통한 페이징: ROWNUM이 부여된 결과를 다시 하나의 가상 테이블로 감싸는 '인라인 뷰(Inline View)'를 3중으로 중첩하여, 중간 데이터를 추출하는 과거의 페이징 쿼리를 직접 짜보며 실행 구조를 파악했다.
- 최신 페이징 문법: 복잡한 인라인 뷰를 대체하는 오라클 12c 이상의 OFFSET [N] ROWS FETCH NEXT [M] ROWS ONLY 구문을 사용해 쿼리의 가독성을 비약적으로 높였다.
3. SQL 속의 SQL, 서브쿼리(SubQuery) 완벽 해부 복잡한 JOIN 연산을 대체하거나 보조하기 위해, 쿼리 내부의 위치에 따라 세 가지로 나뉘는 서브쿼리의 역할을 정립했다.
- 중첩 서브쿼리 (WHERE 절): 조건식의 비교 값으로 사용된다. 단일 행 결과값은 =, > 등으로 비교하고, 다중 행 결과값은 IN, ANY(SOME), ALL 연산자를 사용하여 최고/최저값을 필터링하는 로직을 실습했다.
- 인라인 뷰 (FROM 절): 메모리에 잠시 생성되었다가 사라지는 일회성(재사용 불가) 가상 테이블이다. GROUP BY나 정렬 결과를 미리 만들어두고 본 쿼리에서 페이징이나 추가 가공을 할 때 필수적으로 사용됨을 확인했다.
- 스칼라 서브쿼리 (SELECT 절): 결과값이 단 1개의 행과 컬럼이어야만 한다. 복잡한 JOIN 쿼리를 대체하여 직관적으로 값을 뽑아올 수 있어 자바(MyBatis/JPA) 환경에서 쿼리를 단순화할 때 매우 유용하지만, 대용량 데이터에서는 성능 저하를 유발할 수 있어 주의가 필요함을 배웠다.
4. 가상 테이블 뷰(View)를 통한 쿼리 최적화와 보안
- 개념과 장점: 물리적인 데이터가 저장된 것이 아니라 'SELECT 문장 그 자체'를 DB 서버에 저장해 두고, 마치 일반 테이블처럼 꺼내 쓰는 객체다.
- 활용 목적: 수많은 JOIN과 서브쿼리가 얽힌 복잡한 로직을 뷰로 저장해 두면 응용 프로그램(웹 시스템)에서의 SQL 작성이 매우 간결해지며, 민감한 정보(주민번호 등)를 제외한 컬럼만 뷰로 만들어 사용자에게 공개하는 보안 효과도 얻을 수 있다.
- WITH READ ONLY: 뷰를 상대로 DML(INSERT, UPDATE, DELETE)을 실행하면 원본 테이블의 데이터가 훼손될 위험이 있다. 이를 원천 차단하기 위해 뷰 생성 시 WITH READ ONLY 옵션을 반드시 부여하여 '읽기 전용' 상태로 만들어야 한다는 시스템 안정성 원칙을 깨달았다. (CREATE OR REPLACE VIEW 명령어로 삭제 없이 구조를 덮어쓰는 수정 기법도 포함)
5. 데이터 식별의 자동화, 시퀀스(Sequence)
- 개념: 게시판 글 번호, 회원 번호처럼 겹치지 않는 고유한 순차적 숫자(PRIMARY KEY)를 자동으로 생성해 주는 독립적인 데이터베이스 객체다.
- 옵션 및 활용: START WITH 1(1부터 시작), INCREMENT BY 1(1씩 증가), NOCACHE, NOCYCLE 등의 속성을 부여해 시퀀스를 생성했다.
- 데이터 삽입(INSERT) 시 board_seq.nextval을 호출하여 번호를 자동으로 증가시켜 주입하는 과정을 실습했으며, 한 번 발급된 번호는 트랜잭션이 롤백(ROLLBACK)되어도 다시 복구되지 않는다는 특징을 통해 데이터 식별자로서의 독립성을 확인했다.
'OracleStudy' 카테고리의 다른 글
| [2026-04-22] 오라클 PL/SQL 입문: 절차적 프로그래밍과 커서(Cursor) 제어 (0) | 2026.04.23 |
|---|---|
| [2026-04-21] 오라클 성능 최적화의 핵심, 인덱스(Index)와 DDL/객체 총정리 (1) | 2026.04.21 |
| [2026-04-17] 테이블 설계(DDL)와 제약조건, 그리고 CRUD 실무 구현 (0) | 2026.04.18 |
| [2026-04-16] 관계형 데이터의 완성, JOIN과 SubQuery (0) | 2026.04.18 |
| [2026-04-15] 내장 함수, 집계, 그리고 데이터 통계 분석 (0) | 2026.04.18 |
