처음으로 Oracle을 다루면서 Synonym 이라는 개념을 처음 접했습니다.
-- 너무 복잡한 테이블 명
SELECT * FROM net_owner.customer_master_2024_snapshot;
이처럼 개발을 하면서 누구나 겪을 수 있는 스키마 이름, 테이블 경로, 접두사, 접미사, 복잡한 네이밍 컨벤션 문제를 깔끔하게 해결할 수 있다는게 큰 장점인 것 같습니다.
“객체에 붙이는 짧고 쉬운 별칭(Alias)”
Synonym은 Oracle에서 제공하는 기능으로,
테이블이나 뷰, 시퀀스, 프로시저 같은 객체에 대해 간결한 별명을 만들어주는 방법입니다.
-- 원래 이렇게 썼다면
SELECT * FROM net_owner.CUSTOMERS;
-- 이제는 이렇게
SELECT * FROM customers_syn;
결과는 같지만, 느낌은 다릅니다.
더 깔끔하고, 더 유지보수하기 쉬운 코드를 만들 수 있죠.
| 구분 | Private Synonym | Public Synonym |
|---|---|---|
| 접근 대상 | 생성한 사용자만 | 모든 사용자 공유 |
| 사용 목적 | 개인 쿼리 간소화 | 시스템 전역 네이밍 통일 |
| 생성 권한 | 기본 제공 | CREATE PUBLIC SYNONYM 필요 |
대부분 Private Synonym을 사용한다고 합니다.
그 이유는 다른 사람과 공유할 필요 없는 쿼리 작성 단축이 목적이기 때문이죠.
-- 데이터 보유 스키마
CREATE USER net_owner IDENTIFIED BY owner123;
GRANT CONNECT, RESOURCE TO net_owner;
-- 조회 전용 사용자
CREATE USER app_user IDENTIFIED BY app123;
GRANT CONNECT, RESOURCE TO app_user;
-- 테이블 접근 권한 부여
GRANT SELECT ON net_owner.CUSTOMERS TO app_user;
GRANT SELECT ON net_owner.ORDERS TO app_user;
-- Synonym 생성
CREATE SYNONYM customers_syn FOR net_owner.CUSTOMERS;
CREATE SYNONYM orders_syn FOR net_owner.ORDERS;
-- 개별 조회
SELECT * FROM customers_syn;
SELECT * FROM orders_syn;
-- 조인 쿼리
SELECT
c.NAME AS 고객명,
o.ORDER_DATE AS 주문일,
o.TOTAL_AMOUNT AS 총금액
FROM customers_syn c
JOIN orders_syn o ON c.CUSTOMER_ID = o.CUSTOMER_ID
WHERE o.STATUS = 'PENDING';
| 항목 | Synonym 없이 | Synonym 사용 시 |
|---|---|---|
| 쿼리 복잡도 | SELECT * FROM net_owner.CUSTOMERS | SELECT * FROM customers_syn |
| 보안 | 스키마 정보 노출 | 스키마 은닉 가능 |
| 유지보수 | 테이블명 변경 시, 쿼리 전체 수정 필요 | Synonym만 변경하면 유지 가능 |
| 코드 일관성 | 스키마마다 접근 방식 상이 | 공통된 명명 규칙 사용 가능 |