Oracle를 실무 흐름으로 이해하기
금융, 제조 등 대규모 엔터프라이즈 환경에서 널리 쓰이는 Oracle Database의 구조와 핵심 실무 활용법을 학습합니다. Tablespace 관리, PL/SQL 작성, 힌트(Hint) 기반 실행 계획 튜닝 및 Oracle만의 독창적인 아키텍처를 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
금융, 제조 등 대규모 엔터프라이즈 환경에서 널리 쓰이는 Oracle Database의 구조와 핵심 실무 활용법을 학습합니다. Tablespace 관리, PL/SQL 작성, 힌트(Hint) 기반 실행 계획 튜닝 및 Oracle만의 독창적인 아키텍처를 정리합니다.
금융, 제조 등 대규모 엔터프라이즈 환경에서 널리 쓰이는 Oracle Database의 구조와 핵심 실무 활용법을 학습합니다. Tablespace 관리, PL/SQL 작성, 힌트(Hint) 기반 실행 계획 튜닝 및 Oracle만의 독창적인 아키텍처를 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
쿼리 문법과 함께 스키마 설계, 인덱스, 트랜잭션, 권한, 백업까지 운영 관점으로 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Oracle를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
Oracle를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 메모리 영역 | 구성 요소 | 주요 역할 |
|---|---|---|
| SGA (공유 메모리) | Database Buffer Cache, Shared Pool, Redo Log Buffer | 데이터 블록 캐싱, SQL 파싱 결과 캐싱, 트랜잭션 로그 버퍼링 |
| PGA (개별 메모리) | Sort Area, Hash Area, Session Information | 정렬(Sort) 작업 수행, 해시 조인 공간, 세션 변수 및 커서 정보 유지 |
여기서는 테이블스페이스 & 사용자 관리을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 테이블스페이스 생성
CREATE TABLESPACE ts_app_data
DATAFILE '/u01/app/oracle/oradata/XE/ts_app_data.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1G;
-- 사용자 생성 및 권한 부여
CREATE USER app_user IDENTIFIED BY password123
DEFAULT TABLESPACE ts_app_data;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO app_user;
ALTER USER app_user QUOTA UNLIMITED ON ts_app_data;여기서는 Oracle 권한 아키텍처 & 보안을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 1. 딕셔너리 뷰를 통한 내 권한 및 롤 확인
SELECT * FROM USER_SYS_PRIVS; -- 나에게 부여된 시스템 권한
SELECT * FROM USER_TAB_PRIVS; -- 나에게 부여된 오브젝트 권한
SELECT * FROM USER_ROLE_PRIVS; -- 나에게 부여된 롤 정보
-- 2. 사전 정의된 주요 롤(Predefined Roles) 부여
-- CONNECT: 데이터베이스 접속 권한 (CREATE SESSION)
-- RESOURCE: 기본적인 객체 생성 권한 (CREATE TABLE, SEQUENCE 등)
-- DBA: 데이터베이스 모든 관리 권한
GRANT CONNECT, RESOURCE TO app_user;
-- 3. 'ANY' 권한의 리스크와 작동 방식
-- ANY 키워드가 붙은 권한은 소유자에 상관없이 모든 객체에 명령을 실행할 수 있어 극도로 위험합니다.
-- 예: SELECT ANY TABLE은 SYS, SYSTEM 등 관리자 스키마를 제외한 모든 사용자의 테이블을 조회할 수 있습니다.
GRANT SELECT ANY TABLE TO app_user;
-- 4. ANY 권한 및 롤 회수
REVOKE SELECT ANY TABLE FROM app_user;여기서는 Oracle NLS 캐릭터셋 및 스토리지을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 1. 데이터베이스 캐릭터셋 및 파라미터 확인
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET', 'NLS_LENGTH_SEMANTICS');
-- AL32UTF8(유니코드 한글 3바이트) 또는 KO16MS949(완성형 한글 2바이트)가 주로 사용됩니다.
-- 2. 세션 및 클라이언트 캐릭터셋 상태 확인
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
-- 3. BYTE 세맨틱스 vs CHAR 세맨틱스 차이와 적용
-- BYTE 세맨틱스(기본값): VARCHAR2(10 BYTE) -> AL32UTF8 환경에서 한글은 최대 3글자까지만 저장 가능
CREATE TABLE emp_byte (
emp_name VARCHAR2(10 BYTE)
);
-- CHAR 세맨틱스: VARCHAR2(10 CHAR) -> 바이트 수에 상관없이 10글자 저장 가능 (한글 10자 저장)
CREATE TABLE emp_char (
emp_name VARCHAR2(10 CHAR)
);
-- 4. 문자열의 바이트 길이와 글자 수 확인 비교
SELECT
LENGTH('한글에이전트') AS char_len, -- 글자 수 (6글자)
LENGTHB('한글에이전트') AS byte_len -- 실제 디스크 바이트 수 (AL32UTF8 기준 6*3=18 Bytes, KO16MS949 기준 6*2=12 Bytes)
FROM DUAL;여기서는 PL/SQL (Procedure, Function, Trigger)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 프로시저 생성 예시 (사원 급여 인상)
CREATE OR REPLACE PROCEDURE raise_salary (
p_emp_id IN NUMBER,
p_rate IN NUMBER
) AS
BEGIN
UPDATE employees
SET salary = salary * (1 + p_rate)
WHERE emp_id = p_emp_id;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('사원을 찾을 수 없습니다.');
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/여기서는 Row Limitation & 페이징을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 12c 이상 표준 페이징 (권장)
SELECT emp_name, salary
FROM employees
ORDER BY salary DESC
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
-- 11g 이하 ROWNUM 페이징 (레거시 유지보수용)
SELECT emp_name, salary
FROM (
SELECT a.*, ROWNUM rnum
FROM (
SELECT emp_name, salary
FROM employees
ORDER BY salary DESC
) a
WHERE ROWNUM <= 20
)
WHERE rnum > 10;여기서는 옵티마이저 힌트 & 실행 계획을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- /*+ INDEX(테이블명/알리아스 인덱스명) */ 힌트 적용
SELECT /*+ INDEX(e idx_emp_salary) */ emp_name, salary
FROM employees e
WHERE salary > 50000;
-- 해시 조인 강제 힌트
SELECT /*+ USE_HASH(e d) */ e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;Oracle 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 결정 지점 | 확인 질문 | 실무 기준 |
|---|---|---|
| 경계 | Oracle 코드에서 바뀌기 쉬운 부분은 어디인가? | 입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다. |
| 상태 | 상태가 어디서 생성되고 어디서 사라지는가? | 상태 소유자와 수명 주기를 코드로 드러냅니다. |
| 장애 | 실패했을 때 호출자는 무엇을 받는가? | timeout, fallback, error contract를 먼저 정합니다. |
이 섹션은 Oracle 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.
Oracle 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 품질 축 | 검증 방법 | 완료 기준 |
|---|---|---|
| 정확성 | 정상/실패 케이스를 자동화합니다. | 핵심 시나리오가 재현 가능하게 통과합니다. |
| 회귀 방지 | 버그 수정 시 동일 케이스를 테스트로 남깁니다. | 같은 장애가 다시 배포되지 않습니다. |
| 운영성 | 로그, 메트릭, 알림을 확인합니다. | 문제가 생겼을 때 원인 추적 경로가 있습니다. |