Blog

[Spring AI/RAG] 2. PostgreSQL + pgvector를 통한 Vector Database 환경 구축

Category
Author
PinOnMain
1 more property
AI 도슨트의 RAG 파이프라인 구축을 위한 첫걸음으로, 기존 MySQL 환경을 벡터 검색에 최적화된 PostgreSQL(pgvector)로 마이그레이션하고 기존 애플리케이션과의 완벽한 연동을 검증하는 과정입니다.
Table of Content

1. 마이그레이션 배경 및 목표 (Background & Objective)

왜 PostgreSQL과 pgvector인가?
현재 가상 전시관 서비스는 관계형 데이터베이스인 MySQL을 기반으로 운영되고 있다.
하지만 향후 도입할 RAG 시스템은 문서를 임베딩한 고차원 배열인 '벡터(Vector)' 데이터를 저장하고, 벡터 간의 '코사인 유사도'를 밀리초 단위로 계산해 낼 수 있는 특수한 기능이 필요하다.
기존 MySQL 환경에서는 이러한 고속 벡터 연산이 매우 비효율적이거나 지원되지 않으므로, Spring AI 생태계에서 가장 널리 쓰이고 호환성이 뛰어난 PostgreSQL과 그 확장 프로그램인 pgvector로 데이터베이스를 전면 마이그레이션하기로 결정했다.
해당 세션의 목표
OS 환경에 구애받지 않는 Docker 기반의 PostgreSQL 및 pgvector 환경 구축
기존 MySQL에 적재된 전시관(Exhibition) 및 작품(Production) 데이터의 손실 없는 이전
Spring Boot 백엔드와 새로운 DB의 JPA 연동 및 기존 API 정상 동작 검증

2. 왜 Docker로 환경을 구축해야 하는가? (Why Docker?)

pgvector는 PostgreSQL 내장 기능이 아닌 C 언어 기반의 확장 플러그인임.
Windows 환경의 C++ 의존성 문제 해결
Mac/Linux: 패키지 매니저(brew, apt)로 이미 컴파일된 완성본을 쉽게 설치 가능함.
Windows: 로컬 환경에 설치하려면 Visual Studio C++ 빌드 툴을 설치하고 소스 코드를 직접 컴파일(빌드)해야 함.
이 과정에서 수많은 환경 변수 에러와 버전 충돌이 발생할 확률이 매우 높음.
강의 및 다수의 개발자가 참여하는 프로젝트 환경에서는 "내 컴퓨터에서는 되는데 네 컴퓨터에서는 안 되는" 파편화 문제가 발생함.
따라서, 운영체제(OS) 상관없이 pgvector 가 이미 완벽하게 세팅된 공식 Docker 컨테이너를 띄우는 것이 가장 안전하고 표준적인 실무 방식임.

3. Docker 기반 환경 구축 및 실행 (Environment Setup)

도커 이미지를 생성 또는 Pull 받고 컨테이너로 실행 시키는 방법은 GUI 환경인 Docker Desktop을 활용하는 방법 또는 CLI 터미널 명령어를 사용하는 방법 두가지 모두 사용 할 수 있다.
아래 내용에서는 편의상 Windows 환경 먼저 설명한 후, MacOS의 Unix 환경의 Homebrew를 통한 환경 구축 이후에 EC2와 같은 ubuntu 환경에서는 Docker Compose를 사용한 방법 CLI 명령어로 사용해야 하는 사례 세 가지 모두 설명하고자 한다.

3.1 [Windows] Docker Desktop GUI를 활용한 인프라 세팅

3.1.1 Docker Desktop 설치

Docker Desktop 설치하기
OS(Windows/Mac)에 맞는 Docker Desktop을 공식 홈페이지에서 다운로드 후 설치 및 실행함.
설치 후 실행 시 다음과 같은 화면이 나타나며 , Docker 회원 가입 및 로그인으로 Docker Hub Cloud도 사용 할 수도 있으니 미리 회원가입과 로그인 해두도록 한다.(public 사용 무료, private 저장소 환경은 유료)

3.1.2 GUI 이미지 검색 및 다운로드 (Pull)

Docker Cloud에 public 오픈소스로 공개되어 있는 Postgres+pgvector이미지 다운로드
Docker Desktop에서 상단 검색 탭 → pgvector/pgvector 검색 → Tag에서 pg16-trixie 선택 → Pull 을 통해 이미지 불러오기
Docker Desktop에서 좌측 메뉴 탭의 Images → Pull 받아진 pgvector 이미지 확인

3.1.3 GUI 컨테이너 설정 및 실행 (Run)

Docker Cloud에 public 오픈소스로 공개되어 있는 Postgres+pgvector이미지 다운로드
다운로드가 완료되면 [Run] 버튼을 클릭. 바로 실행하지 말고,
"Optional settings" (추가 설정)를 펼쳐서 다음 항목들을 필수로 기입.
Container name: vexhibition-db
Ports: 5432
Environment variables (환경 변수): + 버튼을 눌러 3개의 변수를 추가.
POSTGRES_USER: root
POSTGRES_PASSWORD: 1234
POSTGRES_DB: vexhibition
위 설정 후 Run 클릭 시 해당 Image → Container 화 되어 실행되며 아래와 같은 화면이 나타남
이 부분은 VMWare인 Docker 가상 환경이 패키지화 되어있는 Image를 Container라는 공간에서 실행 시키고 있는 상태로 VMWare 내부 Port를 OS가 인식 할 수 있도록 포트포워딩하여 실행됨

3.1.4 데이터베이스 환경 구축 상태 확인

3.1.4.A Docker 컨테이너 내부의 터미널로 진입하여 PostgreSQL 접속하기

Docker Desktop 프로그램 내에서 접근
좌측 Containers 탭에서 실행중인 현재 데이터베이스를 선택하거나, 더보기의 View details로 실행중인 컨테이너 아래 사진으로 넘어갈 수 있다. (또는 Open in terminal로 바로 접근도 가능)
해당 컨테이너의 상세 정보를 확인 할 수 있는 부분이다. 로그, 상태 등을 기본적으로 확인 할 수 있다.
우리는 여기에서 현재 데이터베이스가 실행중 이라는 것을 보다 직접적으로 확인하기 위해서 접근하려고 한다.
Exec 탭을 들어가면 # .. 상태로 빈 상태의 터미널이 실행된다. 이 부분이 Docker가 만든 가상 환경 내부 터미널로 접근한 상태이다.
설치된 PostgreSQL 데이터베이스의 버전을 확인해본다. (MySQL에서의 mysql --version)
psql --version
Shell
복사
데이터베이스 콘솔내부 접근. (MySQL에서의 mysql -u root -p)
psql -U root -d vexhibition
Shell
복사
psql 콘솔에 들어간 상태에서 기본적인 명령어 사용
이를 통해서 정상 동작 하는지 직접 더블체크 하기 위함이다.
데이터베이스 목록 조회(MySQL에서의 show databases;)
\l
Shell
복사
데이터베이스 내 테이블 조회(MySQL에서의 show tables;)
\dt
Shell
복사
psql 콘솔 종료, 외부 터미널로 탈출(MySQL에서의 quit;)
\q
Shell
복사

3.1.4.B 개발 컴퓨터 OS의 터미널(CMD/PowerShell/Mac zshell 등)에서 Docker 환경 내 → PostgreSQL 접속하기

OS와 직접 연결된 터미널과 Docker내부의 터미널은 격리된 다른 공간임을 인식해야 한다.
Docker는 기본적으로 OS 위에 Docker Engine이라는 가상 OS 레이어에서 각 Container라는 공간에 Image를 독립적으로 실행시키는 가상화 기술이다.
위 말로는 어려워 보일 수 있어, 간단한 비유로는 한 번 쯤 윈도우에서 모바일 게임을 즐기기 위한 가상 앱 플레이어를 사용해 본 경험이 있을 것이다.
예로 블루스택(BlueStack)이나 녹스(Nox) 앱 플레이어 같은 것. 사실상 윈도우 내에 안드로이드 폰 환경을 가상으로 만든 상황.
Docker는 상황과 유사한 다른 용도의 프로그램으로 생각하면 된다.
하지만 안드로이드의 App 단위는 Docker에서의 Container라고 보면 되고 그 안에 프로그램 내용들이 Docker의 Image 단위인데 실행 만을 위해 경량화 되어 있다로 처음엔 이해하는것이 좋다.
외부 터미널에서 docker exec 명령어를 사용해 실행 중인 컨테이너에 직접 명령
아래 예시는 Windows 환경의 기본 명령 프롬프트(cmd) 터미널을 사용한 사례이다.
Windows에서 cmd.exe를 통해 터미널을 열고 다음 명령어로 Docker내부의 psql에 접근 할 수 있다.
docker exec -it vexhibition-db psql -U root -d vexhibition
Shell
복사
psql 콘솔에 접근하면 위 정리한 psql 콘솔에 들어간 상태에서 기본적인 명령어 사용 을 동일하게 사용 할 수 있다.

3.2 [MacOS] 터미널(CLI) 환경에서 인프라 세팅 (Homebrew 활용)

Mac 환경에서 터미널 기반으로 Docker 세팅하기
Mac 사용자도 Windows 사용자와 마찬가지로 Docker 홈페이지를 통해서 Docker Desktop을 설치하여 간편히 Docker 환경을 설치 할 수도 있다.
다만, GUI 대신 Mac 사용자 중 터미널 환경이 더 익숙한 개발자를 위한 가이드이다.
Mac은 Unix기반의 OS로 대부분의 명령어가 Unix와 비슷하다.
이에 따라 Linux기반의 Ubuntu OS의 CLI 명령어와도 유사한 점이 있다.(POSIX 표준 규격)
MacOS와 Ubuntu의 핵심적인 차이는 MacOS에서는 패키지 매니저인 Homebrew를 통해서 다양한 개발 프로그램 설치하는 것이 관례적으로 활용되고 있다.

3.2.1 Homebrew 설치

Mac의 패키지 매니저 Homebrew 설치
https://brew.sh/ 홈페이지에서 아래 명령어를 확인 할 수 있다.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Shell
복사
MacOS의 터미널을 열면 zsh(zshell) 또는 사용자 설정에 따라 iTerm2 등이 설치 되어 있을 수도 있다.
본인의 주로 사용하는 터미널이 무엇인지 종류를 이해하고 있어야 한다.(환경변수 설정과 연관되어 있기 때문)
본 예시는 zsh를 기반으로 작성하고 있으며, 환경변수 설정 파일은 .zshrc 파일이다.
터미널을 열고, 위 명령어를 붙여넣고 실행하면 Homebrew가 설치된다.
중간에 확인용 엔터를 한번 쳐주자.
명렁어로 설치 했기 때문에 설치 상태를 확인하기 위해서 아래 명령어로 버전 정보를 확인.
brew --version
Shell
복사
Homebrew 는 brew라는 키워드로 CLI 명령어를 사용하게 된다.

3.2.2 Homebrew를 통한 Docker 설치

패키지 매니저인 brew 명령어로 Docker 설치
이제 MacOS 터미널에서 brew 명령어로 다양한 프로그램을 설치할 준비가 되어있다.
동일한 설치 환경을 보여주기 위해서 기존 설치되어 있던 Docker를 제거하고 진행했다. 혹시나 (기존 설치를 제거하고자 하는 경우 토글 열어보기)
아래 명령어로 Docker를 설치한다.
brew install --cask docker
Shell
복사
다음과 같이 CLI 환경에서 설치 파일이 다운로드 되며, Mac용 Docker Desktop 도 설치된다.
설치 완료 시 아래와 같이 docker-desktop was successfully installed! 라는 로그가 나타나며,
docker --version 명령어를 통해서 설치 상태를 확인
맥의 탐색기인 finder의 응용프로그램 폴더에 실제 Docker Desktop이 설치된 것도 확인
Docker.app을 실행해보면 Docker Desktop(GUI)도 실행된다.

3.2.3 CLI 이미지 다운로드 (Pull)

원하는 버전의 이미지 Docker Hub에서 Pull(다운로드) 하기
Docker Compose는 명령어들의 집합으로 대체 할 수 있지만, 아직 여기에서는 MacOS에서 CLI 명령어 만으로 GUI에서의 실행을 대체해보고자 한다.
zsh 터미널에서 Docker Hub의 PostgreSQL 이미지 풀 명령어
docker pull pgvector/pgvector:pg16-trixie
Shell
복사
이미지 Pull 확인
docker images
Shell
복사
추가적으로 GUI에서도 동일하게 이미지가 Pull 되었으며 준비된 상태를 확인 할 수 있다.

3.2.4 CLI 컨테이너 설정 및 실행 (Run)

다운로드 받은 이미지를 바탕으로 컨테이너를 실행
아래 명령어는 한 줄로 길게 이어지는 명령어로 도커 컨테이너의 이름과 설정을 GUI로 하나씩 설정하던 부분을 명령어로 모두 작성한 부분이다.
docker run --name vexhibition-db \ -e POSTGRES_USER=root \ -e POSTGRES_PASSWORD=1234 \ -e POSTGRES_DB=vexhibition \ -p 5432:5432 \ -v pgdata:/var/lib/postgresql/data \ -d pgvector/pgvector:pg16-trixie
Shell
복사
해당 명령어는 각각 다음과 같은 설정이다.
-name vexhibition-db : 컨테이너의 이름을 지정
e (Environment) : DB 구동에 필요한 환경 변수(유저, 비밀번호, DB명)를 주입
p 5432:5432 (Port) : 내 컴퓨터의 5432 포트와 컨테이너 내부의 5432 포트를 연결(포워딩).
v pgdata:/... (Volume) : 컨테이너가 삭제되어도 데이터가 날아가지 않도록 볼륨을 마운트
d (Detached) : 터미널을 종료해도 컨테이너가 백그라운드에서 계속 실행
pgvector/pgvector:pg16-trixie : 실행할 이미지의 이름과 태그
실행 하면 다음과 같은 난수같은 것이 나타나고 터미널로 돌아온다. 해당 난수는 Container ID이다.
해당 컨테이너가 실제로 생성되었으며 실행 되고 있는지 아래 명령어로 확인 할 수 있다.
docker ps
Shell
복사
그 외 아래 명령어들로 컨테이너 실행을 제어 할 수 있다.
컨테이너(이름 작성) 일시 정지 버튼을 대체하는 명령어
docker stop vexhibition-db
Shell
복사
해당 컨테이너 시작 명령어
docker start vexhibition-db
Shell
복사
해당 컨테이너 삭제 명령어 (삭제 전 반드시 stop 필요)
docker rm vexhibition-db
Shell
복사
각 명령어를 사용하면 역시 동일하게 Docker Desktop 앱에서도 동일하게 적용되는 것을 확인 할 수 있을 것이다.

3.2.5 GUI MacOS에서 GUI(Docker.app)을 통한 PostgreSQL 설치

Docker Desktop을 이용한 PostgreSQL 설치는 윈도우와 동일하다.
사실 위 CLI 명령어로 복잡하게 진행 할 필요 없이 GUI가 지원되는 MacOS에서는 Docker Desktop을 사용해도 된다.
윈도우와 마찬가지로 간단히 클라우드 이미지로 PostgreSQL을 찾아 설치 하고 실행 할 수 있다.

3.3 [Ubuntu] 환경에서 Docker Compose를 활용한 인프라 세팅

3.2.1 배포 환경(Ubuntu)에 인프라 이해

AWS EC2(Ubuntu)와 같은 CLI 전용 배포 환경에서의 인프라 구축
실제 서비스 배포를 위해 사용하는 클라우드 서버(예: AWS EC2 리눅스 환경)에는 마우스로 조작할 수 있는 GUI(화면)가 존재하지 않는다. 따라서 오직 키보드 타이핑(CLI)만으로 Docker를 설치하고, 데이터베이스 환경을 구축해야 한다.
이를 위해서 MacOS에서는 CLI 명령어만으로 Image Pull과 Container 구성 등을 진행해보았었다.
이런 CLI 명령어들을 모아서 통합 관리하며 사용하기 위해서 docker-compose.yml이라는 설정 파일을 활용할 수 있다.
앞서 GUI나 CLI 단일 명령어들을 순차적인 코드로 기록해 두고 명령어 한 줄로 똑같이 실행할 수 있다. 이를 코드로서의 인프라(IaC, Infrastructure as Code)라고 부른다.

3.2.2 EC2 Ubuntu 서버 터미널 접근

AWS EC2(Ubuntu)와 CLI 터미널 접근
클라우드 PC 서버에 접근하는 방법은 다양한 방법이 있지만, 가장 간단한 방법은 AWS가 제공하는 웹 브라우저에서 접근 할 수 있는 EC2 Instance Connect를 활용하는 것이 가장 간단하다.
이 방법 외에 로컬 컴퓨터에서 SSH 프로토콜 등을 활용하여 로컬 터미널→원격 컴퓨터 터미널로의 접속을 하고 싶은 경우 별도 검색을 통해 환경 구축 하도록 한다. 참고로 EC2의 인바운딩 IP 설정과 키페어 등록 등의 작업이 추가된다.
아래 예시에서는 초심자를 위해서 간단히 EC2 Instance Connect로 간단히 EC2 컴퓨터에 접근하는 방법을 사용하고자 한다.
AWS Console → EC2 → 실행중인 Instance Check → Connect
첫 번째 탭인 EC2 Instance Connect에서 별다른 설정 없이 기본 선택값에서 아래 Connect를 누르면 웹 브라우저에서 실행되는 클라우드 쉘 터미널을 실행 시킬 수 있다.
이미 AWS 로그인 정보 등을 통해서 접근한 상태이므로 부가적인 인증 등 설정 없이 곧바로 해당 EC2 컴퓨터의 터미널로 접근된 상태이다.

3.2.3 Docker 및 Docker Compose 설치

Ubuntu에서 Docker 설치
현재 브라우저에 나타나있는 클라우드 쉘에서는 CLI 명령어 만으로 환경을 구축해야한다. 이에 따라 MacOS 에서 CLI 명령어 만으로 환경을 구축하던 부분과 유사하게 진행된다.
다만, MacOS, Unix, Ubuntu, Linux 등 일부 명령어 차이가 있기 때문에 실행되지 않는다면 EC2의 시스템 환경에 따라서 검색하여 진행하면 된다.
1.
시스템 패키지 매니저 업데이트
sudo apt update
Shell
복사
2.
Ubuntu Docker 및 Docker Compose 설치
sudo apt install docker.io docker-compose -y
Shell
복사
3.
서버 재부팅 시 Docker 자동 실행 설정 및 즉시 시작 설정 및 설치 상태 확인
sudo systemctl enable docker sudo systemctl start docker
Shell
복사
docker --version docker-compose --version
Shell
복사
4.
docker-compose.yml 작성 및 실행
mkdir vexhibition-db cd vexhibition-db vim docker-compose.yml
Shell
복사
version: '3.8' services: postgres-vector: image: pgvector/pgvector:pg16-trixie container_name: vexhibition-db ports: - "5432:5432" environment: POSTGRES_USER: root POSTGRES_PASSWORD: 1234 POSTGRES_DB: vexhibition volumes: - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata:
Shell
복사
위 작성 후 ESC:wqEnter로 에디터 탈출
docker-compose 실행
sudo docker-compose up -d
Shell
복사
실행중인 컨테이너 확인
sudo docker ps
Shell
복사

3.2.4 컨테이너 실행 및 상태 확인

실행중인 컨테이너 확인
실행중인 컨테이너 확인
sudo docker ps
Shell
복사
실행중인 데이터베이스 내부 콘솔 접근
sudo docker exec -it vexhibition-db psql -U root -d vexhibition
Shell
복사

4. Vector 확장 활성화 (공통 필수)

위 3장 에서 다양한 개발 환경에 따른 Docker 기반의 PostgreSQL 데이터베이스 개발 환경 구축했다.
PostgreSQL은 기본적으로 관계형 데이터베이스(RDBMS) 역할만 하므로 RAG를 위해서는 Vector 데이터베이스 플러그인을 필수적으로 활성화 해야 한다.
확장 기능 활성화 쿼리 실행
데이터베이스 콘솔 접속
docker exec -it vexhibition-db psql -U root -d vexhibition
Shell
복사
SQL 쿼리 창(또는 psql 프롬프트)에서 아래 명령어를 순서대로 실행
pgvector 확장 기능 활성화 명령
CREATE EXTENSION IF NOT EXISTS vector;
Shell
복사
설치가 정상적으로 완료되었는지 확인
SELECT extname FROM pg_extension;
Shell
복사
Search