Postgresql에서는 여러 DB instance 사이에 join이 기본적으로 불가능 합니다.
이를 위해서 몇가지 extension이 존재하는데 dblink와 postgres_fdw 입니다.
dblink는 쿼리에서 DB instance의 Host 주소와 계정 정보를 입력하여 잠깐동안의 임시 연결을 생성하는 방식이고
postgres_fdw의 경우에는 연결 설정을 저장 해 두고 schema를 통기화 하여 사용하는 방식으로 dblink에 비해서 성능이 좀 더 좋습니다.
당연한 이야기지만 외부 db를 join 하는 것은 기본적으로 하나의 DB내 테이블을 Join 하는 것과 비교해서 크게 느리기 때문에 자주 Join을 해야하는 데이터라면 같은 DB Instance에 저장하도록 설계해야 합니다.
CREATE EXTENSION IF NOT EXISTS postgres_fdw
SCHEMA public;
우선 위 쿼리를 통해서 postgres_fdw를 설치 해 줍니다.
AWS에서도 지원하기 때문에 그냥 설치하면 됩니다.
CREATE SERVER server_name
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS(
host 'target server ip or url',
port '5432',
dbname 'target database name'
);
그 다음 연결할 instance를 server로 추가해 줍니다.
CREATE USER MAPPING
FOR public
SERVER server_name
OPTIONS(
user 'target db instance user',
password 'target db instance user password'
);
이 원격 DB Instance에 접근할 때 사용될 사용자 계정을 Mapping 해 줍니다.
IMPORT FOREIGN SCHEMA public
FROM SERVER foreign_server INTO schema_name;
그 다음 원격 DB Instance에서 연결할 Table들을 정의해 줘야 하는데, 하나하나 따로 정의할 필요가 없다면 위 쿼리를 통해서 전체 스키마를 퍼옵니다.
schema_name에 해당하는 스키마는 미리 생성해야 하며 public에 추가해도 무방하지만 EF Core를 사용하는 경우 Migration 테이블이 중첩되어 실패할 수 있기 때문에 해당 DB Instance의 이름에 맞는 Schema를 추가해서 Import를 하면 이후 편하게 사용이 가능합니다.