개발

[Oracle / Tibero ] Synonym 이슈 / Synonym이란?

whiporithm 2024. 9. 21. 00:12


 

배경

회사 업무중, 개발 환경과 운영 환경 사이의 테이블이 일치하지 않는 상황이 있었다.

운영 환경에 있는 테이블을 참조하여, 개발 환경에도 동일한 테이블을 생성해주었는데

서버에서 테이블이 없다는 오류가 지속적으로 발생했음!

 

 

 

원인

 

이는 알고보니 서버에서 DB에 접근하는 계정과, DB에서 테이블을 컨트롤 하는 계정의 정보가 달랐기 때문이었다.

(계정을 구분한 이유는 보안상의 이유가 있었음.)

 

그리고 서버 계정에서는 Synonym 기능을 활용하여 테이블에 접근하고 있었음.

 

 

해결

 

권한부여

 

자신이 만든 테이블이 아닐 경우, 테이블 조작의 권한이 존재하지 않음.

따라서 GRANT 명령어로 특정 계정에 권한을 부여해주어야 함

 

-- ANOTHER_USER 에게  MY_TABLE 에 대한 SELECT 권한을 부여
GRANT SELECT ON MY_TABLE TO ANOTHER_USER

-- 여러 권한들을 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON MY_TABLE TO ANOTHER_USER

-- 모든 권한을 부여
GRANT all ON MY_TABLE TO ANOTHER_USE

 

 

Synonym?

 

"Synonym?" 이번에 처음 알게된 개념이며, 글을 작성한 이유

Synonym 은 일종의 동의어 같은 개념으로, DB 객체에 임시적인 별명이 아닌 영속적인 별명을 부여하는 기능이다.

(*객체 : 테이블, 프로시저, 함수 등)

 

 

보통 다른 유저의 객체에 접근할 때 명칭을 정해주는 용도로 사용한다. 예를 들어보자.

 

(SELECT 권한이 있다는 전제하에) USER_A 가 USER_B의 "B_TABLE" 테이블에 SELECT로 접근하려고 할 경우

-- USER_A 입장에서 접근
SELECT * FROM USER_B.B_TABLE

 

위와 같이 테이블 앞에 계정의 정보를 작성해주고 "." 연산자로 접근할 수 있다.

 

그러나 위 SQL문 은 계정명(USER_B)과, 테이블의 이름(B_TABLE)이 그대로 노출되기에 보안상 우려가 될 수 있다.

이 때, Synonym을 사용하면 USER_B.B_TABLE 을 다른 명칭으로 접근 하도록 설정할 수 있다.

 

 

-- 우선 USER_B 입장에서 , USER_A 에게 SYNONYM 생성 권한을 부여한다.
 GRANT CREATE SYNONYM TO USER_A
 
 -- USER_A 입장에서 SYNONYM 을 생성한다.
 CREATE SYNONYM C_TABLE FOR USER_B.B_TABLE

 

위 과정을 거치게 된다면

 

-- USER_A 입장에서 접근
SELECT * FROM C_TABLE

 

 

위와 같이 설정된 별칭으로 테이블에 접근이 가능하다.

 

Synonym을 사용하였을 때 장점은 아래와 같다.

  • 객체 정보를 숨길 수 있기에 보안성이 높아진다.
  • 객체명 변경이 있을시, SQL문을 수정하는 것이 아닌 Synonym 설정으로 해결 할 수 있음.
  • 복잡한 객체를 짧은 별칭으로 치환하여 사용 가능

 

 

후기

 

별칭 비슷한 개념은 프로그래밍 언어에도 있는 개념이기에 낯설진 않았으나,

입사 전에 프로젝트를 진행할 시 DB 계정을 2개 이상 사용한 경험이 없었기에.. 예상치 못한 문제였다