· 업무

오라클 SYNONYM이란?

다른 스키마의 객체를 자기 것처럼 부르게 해주는 SYNONYM의 PUBLIC/PRIVATE 차이와, 객체 위치가 바뀌어도 애플리케이션 쿼리를 고치지 않아도 되는 이유를 정리했다.

작성날짜: 25.07.19

  • SYNONYM은 데이터베이스 객체(테이블, 뷰, 시퀀스, 프로시저 등)에 대한 별칭입니다. 실제 객체명 대신 사용할 수 있는 대체 이름을 제공

주요 특징

  • 간편성: 긴 스키마명.객체명을 짧은 이름으로 대체
  • 보안성: 실제 객체 위치를 숨길 수 있음
  • 유연성: 객체 위치가 변경되어도 SYNONYM만 수정하면 됨
  • 호환성: 다른 스키마의 객체를 마치 자신의 객체처럼 사용 가능

문법

SYNONYM 생성

-- PUBLIC SYNONYM (모든 사용자가 사용 가능)
CREATE PUBLIC SYNONYM synonym_name FOR schema_name.object_name;

-- PRIVATE SYNONYM (생성한 사용자만 사용 가능)
CREATE SYNONYM synonym_name FOR schema_name.object_name;

SYNONYM 삭제

DROP PUBLIC SYNONYM synonym_name;
DROP SYNONYM synonym_name;

예시

-- HR 스키마의 EMPLOYEES 테이블에 대한 SYNONYM 생성
CREATE SYNONYM EMP FOR HR.EMPLOYEES;

-- 이제 EMP로 접근 가능
SELECT * FROM EMP;
graph TB
    subgraph "🏢 HR 스키마"
        HR_EMP["👥 EMPLOYEES<br/>(실제 테이블)"]
        HR_DEPT["🏛️ DEPARTMENTS<br/>(실제 테이블)"]
    end
    
    subgraph "🏢 SALES 스키마"
        SALES_CUST["🛒 CUSTOMERS<br/>(실제 테이블)"]
        SALES_ORDER["📋 ORDERS<br/>(실제 테이블)"]
    end
    
    subgraph "🎭 SYNONYM (별칭)"
        SYN_EMP["👤 EMP<br/>(SYNONYM)"]
        SYN_DEPT["🏛️ DEPT<br/>(SYNONYM)"]
        SYN_CUST["🛍️ CUSTOMER<br/>(SYNONYM)"]
        SYN_ORD["📄 ORDER_INFO<br/>(SYNONYM)"]
    end
    
    subgraph "👨‍💻 애플리케이션 사용자"
        APP_USER["🖥️ 개발자<br/>SQL 작성"]
    end
    
    %% SYNONYM 연결
    SYN_EMP -.-> HR_EMP
    SYN_DEPT -.-> HR_DEPT
    SYN_CUST -.-> SALES_CUST
    SYN_ORD -.-> SALES_ORDER
    
    %% 사용자가 SYNONYM 사용
    APP_USER --> SYN_EMP
    APP_USER --> SYN_DEPT
    APP_USER --> SYN_CUST
    APP_USER --> SYN_ORD
    
    %% 스타일링
    classDef tableStyle fill:#e1f5fe,stroke:#01579b,stroke-width:2px
    classDef synonymStyle fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    classDef userStyle fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
    
    class HR_EMP,HR_DEPT,SALES_CUST,SALES_ORDER tableStyle
    class SYN_EMP,SYN_DEPT,SYN_CUST,SYN_ORD synonymStyle
    class APP_USER userStyle

사용 시나리오

1. 스키마 간 편리한 접근

-- 기존 방식 (긴 스키마명 필요)
SELECT * FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 10;

-- SYNONYM 사용 (간단한 이름으로 접근)
CREATE SYNONYM EMP FOR HR.EMPLOYEES;
SELECT * FROM EMP WHERE DEPARTMENT_ID = 10;

2. 데이터베이스 이전 시 유연성

-- 개발 환경
CREATE SYNONYM CUSTOMER FOR DEV_SCHEMA.CUSTOMERS;

-- 운영 환경으로 이전 시 SYNONYM만 변경
DROP SYNONYM CUSTOMER;
CREATE SYNONYM CUSTOMER FOR PROD_SCHEMA.CUSTOMERS;
-- 애플리케이션 코드는 수정 불필요!

3. PUBLIC vs PRIVATE SYNONYM

-- PUBLIC SYNONYM: 모든 사용자가 사용 가능
CREATE PUBLIC SYNONYM EMP FOR HR.EMPLOYEES;

-- PRIVATE SYNONYM: 생성한 사용자만 사용 가능
CREATE SYNONYM MY_EMP FOR HR.EMPLOYEES;

협력사 제공 시 SYNONYM 활용 이유

1. 보안 강화 🔒

-- 실제 테이블 구조 숨기기
-- 협력사는 실제 스키마/테이블명을 알 수 없음
CREATE PUBLIC SYNONYM PARTNER_CUSTOMER FOR INTERNAL.CUSTOMER_MASTER_V2024;
CREATE PUBLIC SYNONYM PARTNER_ORDER FOR INTERNAL.ORDER_TRANSACTION_DETAIL;

2. 권한 관리 용이성 👥

-- 협력사 전용 계정 생성
CREATE USER PARTNER_A IDENTIFIED BY password123;

-- SYNONYM에 대한 권한만 부여
GRANT SELECT ON PARTNER_CUSTOMER TO PARTNER_A;
GRANT SELECT ON PARTNER_ORDER TO PARTNER_A;

-- 실제 테이블에는 직접 접근 불가

3. 데이터 변경 투명성 🔄

-- 내부 테이블 구조 변경 시
-- 협력사 코드는 수정 불필요

-- 기존
CREATE SYNONYM PARTNER_CUSTOMER FOR OLD_SCHEMA.CUSTOMER_INFO;

-- 시스템 업그레이드 후
DROP SYNONYM PARTNER_CUSTOMER;
CREATE SYNONYM PARTNER_CUSTOMER FOR NEW_SCHEMA.CUSTOMER_MASTER;

연동 예시

graph TB
    subgraph "🏢 우리 회사 내부 시스템"
        subgraph "🔒 INTERNAL 스키마"
            REAL_CUST["👥 CUSTOMER_MASTER_V2024<br/>(실제 고객 테이블)<br/>🔐 민감정보 포함"]
            REAL_ORDER["📋 ORDER_TRANSACTION_DETAIL<br/>(실제 주문 테이블)<br/>🔐 내부 코드 포함"]
            REAL_PRODUCT["📦 PRODUCT_CATALOG_MASTER<br/>(실제 상품 테이블)<br/>🔐 원가정보 포함"]
        end
        
        subgraph "🎭 협력사 전용 SYNONYM"
            SYN_CUST["👤 PARTNER_CUSTOMER<br/>(필요한 컬럼만 노출)"]
            SYN_ORDER["📄 PARTNER_ORDER<br/>(협력사 관련 주문만)"]
            SYN_PROD["🏷️ PARTNER_PRODUCT<br/>(공개 가능한 상품만)"]
        end
    end
    
    subgraph "🤝 협력사 A (배송업체)"
        PA_APP["🚚 배송 시스템<br/>개발자"]
        PA_QUERY["SELECT * FROM PARTNER_ORDER<br/>WHERE STATUS = 'READY'"]
    end
    
    subgraph "🤝 협력사 B (마케팅업체)"
        PB_APP["📊 마케팅 분석<br/>개발자"]
        PB_QUERY["SELECT * FROM PARTNER_CUSTOMER<br/>WHERE REGION = 'SEOUL'"]
    end
    
    subgraph "🤝 협력사 C (상품업체)"
        PC_APP["🛍️ 상품 관리<br/>개발자"]
        PC_QUERY["SELECT * FROM PARTNER_PRODUCT<br/>WHERE CATEGORY = 'FASHION'"]
    end
    
    %% SYNONYM 연결 (보안 필터링)
    SYN_CUST -.->|"뷰 또는 필터링된 데이터"| REAL_CUST
    SYN_ORDER -.->|"협력사별 필터링"| REAL_ORDER
    SYN_PROD -.->|"공개 가능한 데이터만"| REAL_PRODUCT
    
    %% 협력사 접근
    PA_APP --> SYN_ORDER
    PA_APP --> SYN_CUST
    PB_APP --> SYN_CUST
    PC_APP --> SYN_PROD
    
    %% 쿼리 예시
    PA_APP -.-> PA_QUERY
    PB_APP -.-> PB_QUERY
    PC_APP -.-> PC_QUERY
    
    %% 스타일링
    classDef internalStyle fill:#ffebee,stroke:#c62828,stroke-width:3px
    classDef synonymStyle fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
    classDef partnerStyle fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef queryStyle fill:#fff3e0,stroke:#ef6c00,stroke-width:1px
    
    class REAL_CUST,REAL_ORDER,REAL_PRODUCT internalStyle
    class SYN_CUST,SYN_ORDER,SYN_PROD synonymStyle
    class PA_APP,PB_APP,PC_APP partnerStyle
    class PA_QUERY,PB_QUERY,PC_QUERY queryStyle

협력사 제공 시 단계별 예시

1. 단계별 구현

-- 1단계: 협력사 전용 뷰 생성 (필요한 컬럼만 노출)
CREATE OR REPLACE VIEW PARTNER_CUSTOMER_VIEW AS
SELECT 
    CUSTOMER_ID,
    CUSTOMER_NAME,
    PHONE,
    EMAIL,
    ADDRESS,
    REGION_CODE
    -- 주민번호, 내부코드 등 민감정보 제외
FROM INTERNAL.CUSTOMER_MASTER_V2024
WHERE STATUS = 'ACTIVE';

-- 2단계: SYNONYM 생성
CREATE PUBLIC SYNONYM PARTNER_CUSTOMER FOR PARTNER_CUSTOMER_VIEW;

-- 3단계: 협력사 계정에 권한 부여
GRANT SELECT ON PARTNER_CUSTOMER TO PARTNER_DELIVERY_COMPANY;

2. 협력사별 차별화된 접근

-- 배송업체용 (주문 정보 중심)
CREATE SYNONYM DELIVERY_ORDERS FOR FILTERED_ORDER_VIEW;

-- 마케팅업체용 (고객 정보 중심, 개인정보 마스킹)
CREATE SYNONYM MARKETING_CUSTOMERS FOR MASKED_CUSTOMER_VIEW;

-- 상품업체용 (상품 정보만)
CREATE SYNONYM PRODUCT_CATALOG FOR PUBLIC_PRODUCT_VIEW;

3. 운영 상황 대응

-- 긴급 상황: 특정 협력사 접근 차단
DROP SYNONYM PARTNER_CUSTOMER;
-- 협력사는 즉시 접근 불가, 내부 시스템은 영향 없음

-- 시스템 점검: 읽기 전용 모드
CREATE SYNONYM PARTNER_CUSTOMER FOR READONLY_CUSTOMER_VIEW;