프롬프팅을 기반으로 음악을 추천하는 간단한 웹 애플리케이션을 구현해보려고 한다.
Spring boot, FastAPI, React3.5-Turbo개발 초기에는 메인 DB로 MySQL을 사용하려 했었다. MySQL은 사용하기 쉽고 읽기 성능이 빠르다. 또한, 대규모 커뮤니티이기 때문에 버그나 문제 발생 시 상대적으로 해결 방법을 찾기 수월하다고 생각했다.
그러나 우리 프로젝트의 주요 기능과 확장성을 고려해보니
는 점에서 Postgres로 전환하는게 맞다고 판단했다.
Properties.yaml
아래는 PostgreSQL로 전환 후 사용된 설정이다. 성능 최적화와 개발 편의성을 고려하여 설정을 구성했다.
HikariCP를 사용해 연결 풀을 관리하고, 최대 풀 사이즈를 4로 설정하여 성능 최적화를 고려했다.update로 설정해, 테스트 환경에서는 스키마 변경이 자동으로 반영되도록 했다.spring:
application:
name: MUSIC-IN-MY-DIARY-SPRING
datasource:
hikari:
maximum-pool-size: 4
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://{uri}:{port_number}/{db_name}
username: {username}
password: {password}
jpa:
database: postgresql
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
Connection Pool은 DB 커넥션을 미리 생성해 놓는 저장소이다.
요청이 발생할 때마다 매번 db에 연결되는 것을 방지하여 가능한 최소한으로 DB에 접근할 수 있다.
이로써 읽기/쓰기 작업과 관련된 오버헤드를 줄일 수 있다.
Postgres를 비롯한 RDBMS에서는 다수의 사용자 요청을 효율적으로 처리하기 위해 Connection Pool을 잘 구성하는 것이 중요하다.
개발 초기라 최대 풀 크기를 작게 설정했지만, 향후 개발이 시작되면 조회 패턴과 트래픽을 분석하여 적정히 조정할 예정이다.
이번 DB 전환과정에서 느낀점은, 동시성 처리와 비정형 데이터 처리 같은 기술을 고려했을 때 Postgres가 유리하다는 점과 Connection Pool 설정이 RDBMS에서 다수의 트랜잭션 관리에 효율적이고 오버헤드를 줄이는데 필수적이라는 점이다.
참고
✔️ Mysql과 Postgres 차이
✔️ Connection Pool
✔️ Connection Pool DBCP 이해하기