[Daily Poll] 작업일지(2) - 서버 인프라 설계 : 데이터베이스

Daily Poll 의 요구사항을 세세하게 다 적지 않아도, 이 프로젝트의 시작이 명확한 Pain Point를 해결하고자 하는 것이기 때문에, Overall Server Infra 정도는 생각해 볼 수 있을 것 같다.

- 유저와 투표를 관리하고 투표를 처리할 수 있는 API Endpoint 제공 및 데이터 저장을 위한 데이터 베이스 구축.

오라클 클라우드에서의 전형적인 기본 구성은 다음 글에서 잘 보여준다.

너무나 당연하게도 데이터베이스 서버는 외부에서 직접 접근할 수 없어야 하고, Bastion과 보안 규칙들로 서버를 보호해야 한다.

제대로 된 프로젝트를 진행하려고 했다면 API 서버와 데이터베이스 서버의 인스턴스를 별도로 분리하고 4개의 무료 코어를 반반씩 나눠서 별도로 구성했어야 하지만...

취미에 가까운 프로젝트이니 저 내용은 머리로 이해만 하고, 실제는 한 서버에 모두 때려 넣었다.
그래도 구성 자체는 Docker 를 통해 분리를 하려고 한다.

먼저 데이터베이스는 PostgreSQL 을 사용하려고 한다. 왜 PostgreSQL 이냐고 묻는다면, 개인 프로젝트라면 뭘 선택해도 상관 없다고 본다. 이미 상용 서비스에서 검증이 끝난 많은 데이터베이스들이 있기에, 그 중에서 익숙한 것을 고르면 된다. 하지만 난 익숙한 데이터베이스가 없으므로, 그냥 마음이 끌리는 데로 선택하였다. 그 옛날 웹 서비스라고 하면 APM(Apache-PHP-MySQL)이 떠오르던 시절부터 MySQL과 함께 데이터베이스 영역을 지켜왔기도 하고, 오라클이 MySQL을 가져간 이후부터 MySQL은 탈락. (근데 난 OCI 쓰는데...)

데이터베이스를 다룰 때 마다 학교 다닐 때 좀 더 열심히 공부할 껄 생각을 하게 된다.
데이터베이스 수업을 정말 대충 들었는데, 중간고사를 완전히 망치고 다음 수업에 들어갔을 때 수강 인원이 반으로 줄어든 것 보고 포기하지 않고 들었더니 B 학점이 나왔던... (난 기억나는 게 하나도 없는데)

다시 Daily Poll 이야기로 돌아와서 데이터베이스 서버를 별도로 분리하지는 않아도, 특정 인스턴스 환경에 종속되거나, 해당 인스턴스 시스템에 영향을 미치지 않도록 Docker 를 사용하기로 하였다. 인터넷 검색해보면 성능이 문제니... 이런 이야기가 있던데 솔직히 공감이 되진 않는다.
Docker 자체가 VM과는 다르게 Host의 자원을 직접적으로 사용하는 기술이니까.

그리고 프로젝트용 데이터베이스는 stage와 production을 분리하고, project admin 계정은 두 데이터베이스에 권한을 전부 주도록 했다. 또 user 계정과 dev 계정을 별도로 만들어 각각 상용, 개발용  데이터베이스의 사용 권한만 주도록 한다.
장고에서 데이터베이스 접근하려니 특정 스키마의 테이블 뿐만 이나라, 프로젝트의 데이터베이스에 대한 접근 권한을 필요로 한다. 장고에서 직접 관리하는 항목들을 데이터베이스의 public에 추가하기 위해서라고 하는데... 정확한 내용까지는 모르겠다. 다만 데이터베이스 계정 자체가 외부에서 접근이 제한되어 있기도 하고 이것이 장고 기본 설정이라면 그냥 앱용 계정을 만들어서 권한을 주려 한다.

마지막으로 Docker PostgreSQL 셋팅하면서 몇 가지 확인했던 점을 기록해 둔다.

1. Docker 에서 그냥 postgres 가져오면 latest 이미지를 가져오니, 과제 진행 시 일관성을 위해 고정된 버전으로 postgres:18.1 을 명시적으로 지정하여 가져왔다.

2. PostgreSQL 18 버전부터는 PGDATA 위치가 변경되었다. 참고해서 Docker 볼륨 설정이 문제가 없도록 하자. 검색해보면 여기에 대한 토론 스레드와 18 버전은 어느 경로를 사용하는 지 알 수 있다.

3. 전형적인 기본 구성이라면 데이터베이스 서버를 분리하고 Private Subnet에 두었으면 Public IP 할당이 되지 않는다. 그래서 Bastion을 통해 데이터베이스에 접근을 하도록 해야 할 것이다. 하지만 이 프로젝트에서는 그렇게 구성한 게 아니라서 좀 더 강화된 보안 규칙을 지정했다.
보안 규칙에서는 5432 포트에 접근할 수 있는 외부 IP를 명시적으로 지정해서 특정 PC에서만 접근이 가능하도록 하였다.
pg_hba.conf 에서는 host all + 비밀번호 인증이 기본적으로 설정되어 있던데, 일단 이건 그냥 두었다. 이걸 IP 단위로 block 시키게 되면 집의 IP 가 변경이 되면 매번 수정하기도 번거로우니까. 실제 서비스 시작하면 데이터베이스를 직접 접근해서 처리해야 하는 일이 많이 없을테니 이때는 postgres 계정은 기본으로 막고, 프로젝트 관련 DB 관리할 계정을 필요할 때만 풀어서 사용할 까 싶다. 이 설정은 PostgreSQL 재시작하지 않아도 다시 설정을 로딩할 수 있다고 하니.

오늘은 또 여기까지... 실제 프로젝트 진행하면서 데이터베이스 인프라를 변경할 수도 있겠지만 지금 생각으로는 이 정도면 되는게 아닐까 싶음.
다음 번에는 또 잠깐 딴 길로 가서 Docker 확인한 것 기록에 남겨보고자 한다.

댓글

이 블로그의 인기 게시물

[게임개발 스토리] 장르/타입/조합 정보와 몇 가지 팁

[윈도우] 실행 중인 프로그램의 타이틀을 변경하는 유틸리티

Synergy 한글키 패치 공식 버전 적용 및 최종 정리