이번시간에는 postgresql db 구성한 것을 spring boot에 연결해보려고 한다. 저번 시간에 했던 내용을 생각해보면 우리는 db를 pgpool로 트래픽을 분산하고 기본적인 db의 failover를 하도록 구현했다 따라서 spring boot에서는 연결을 할 때 pgpool로 연결하면 된다.
#application-local.yml
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://${local-db.postgres.host}:${local-db.postgres.port}/${local-db.postgres.name}
username: ${local-db.postgres.username}
password: ${local-db.postgres.password}
jpa:
properties:
hibernate:
format_sql: true
highlight_sql: true
hbm2ddl.auto: create
default_batch_fetch_size: 100
dialect: org.hibernate.dialect.PostgreSQLDialect
open-in-view: false
show-sql: true
data:
redis:
host: ${local-redis.host}
port: ${local-redis.port}
api:
uri: http://localhost:6001
logging:
level:
org:
hibernate:
type: info
level: info
#application-db.yml
local-db:
postgres:
host: localhost
port: 5432
name: authentication_management_server
username: donghyeon
password: adzc1973
위와 같이 구성해주면 된다. 원래 단일 db를 연결하는 것과 크게 다르지 않다. 그럼 이제 서버 시작을 해보게 되면

위와 같이 제대로 서버가 시작된 모습을 볼 수 있다. 여기서 주의할 점이 복제 사용자로 생성한 사용자가 pgpool에도 설정이 되어있어야 한다는 점이다. 만약 그렇지 않고 그냥 실행하게 되면

복제 사용자에 대한 내용이 없다고 뜨니 이 부분을 주의하자. 혹시 처음 접하는 분들을 위해서 알려주자면 저번 시간에 작성했었던 docker-compose 파일에 환경 변수를 설정할 때
# postgres
POSTGRESQL_POSTGRES_PASSWORD=adminpassword
POSTGRES_USERNAME=donghyeon
POSTGRES_PASSWORD=adzc1973
POSTGRES_DATABASE=authentication_management_server
REPMGR_PASSWORD=adzc1973
REPMGR_PRIMARY_HOST=postgres-primary-0
# postgres port
REPMGR_PRIMARY_PORT=5432
REPMGR_PORT_NUMBER=5432
# redis port
REDIS_PORT_SERVICE1=6380
REDIS_PORT_SERVICE2=6381
REDIS_PORT_SERVICE3=6382
# pgpool
PGPOOL_SR_CHECK_USER=donghyeon
PGPOOL_SR_CHECK_PASSWORD=adzc1973
PGPOOL_POSTGRES_USERNAME=donghyeon
PGPOOL_POSTGRES_PASSWORD=adzc1973
PGPOOL_ADMIN_USERNAME=admin
PGPOOL_ADMIN_PASSWORD=adminpassword
# pgpool port
PGPOOL_PORT=5432
위와 같게 PGPOOL_SR_CHECK_USER, PGPOOL_SR_CHECK_PASSWORD, PGPOOL_POSTGRES_USERNAME, PGPOOL_POSTGRES_PASSWORD가 복제 사용자로 작성해주자.
다음 경로에 들어가보자. /opt/bitnami/postgresql/conf/pg_hba.conf 파일에 들어가보면

기본적으로 암호화가 md5로 이루어지는 것을 볼 수 있다.
postgresql에서는 기본적으로 SCRAM-SHA-256이 알고리즘을 사용하지만 왜 md5를 사용하는지 의문이 들 수 있다.
postgresql 버전과 호환성을 유지하기 위해 md5를 기본으로 사용하기 때문이다.
그래도 SCRAM-SHA-256를 사용해서 암호화를 하는게 더 안전하지 않나? 라고 생각할 수 있지만 pgpool과 postgresql은 내부 네트워크에서 이루어지기 때문에 md5 인증만 해도 충분히 안전할 수 있다.
하지만 외부 연결을 한다? 그럼 SCRAM-SHA-256를 고려해볼 필요가 있다.