지금까지는 DB 연결 설정 정보를 입력해야 할 때마다 구글링으로 티스토리를 찾아보면서 설정했다.
이번에 프로젝트를 하면서는 한번 공식문서에 의존해서 연결 정보를 입력해봐야겠다는 생각이 들어 공식문서를 읽고 이해한 내용을 정리해본다.
스프링은 SQL 과 NoSQL 모두 연동할 수 있으나, 이 글은 SQL 기준으로 정리하였다.
DataSource 설정
스프링은 JDBC를 직접 이용해서 DB와 소통하는 것부터, ORM 기술을 이용해서 DB와 소통하는 것까지 폭넓은 방법을 제공한다.
In-Memory DB
먼저 개발환경에서는 보통 인-메모리 데이터베이스를 사용하는 경우가 많다. (in-memory embedded database)
이름 그대로 메모리에 데이터를 저장하는 방식의 DB이므로, 데이터가 영구적으로 저장되지 않는다.
따라서 어플리케이션이 시작할 때 DB에 데이터를 채우고, 종료될 때 데이터가 사라진다.
스프링 부트는 기본적으로 H2, HSQL, Derby 데이터베이스에 대한 인 메모리 자동설정을 지원한다.
따라서 해당 DB를 인메모리 데이터베이스로 사용하고 싶다면, DB에 대한 외부 의존성만 추가해주면 따로 DataSource 설정을 할 필요가 없다.
만약 여러 종류의 인 메모리 데이터베이스를 활용하려는 경우에는, 내가 사용할 데이터베이스에 대해 spring.datasource.embedded-database-connection
프로퍼티를 설정해준다.
만약 이 프로퍼티를 none
으로 설정한다면 인메모리 데이터베이스에 대한 DataSource 를 자동으로 설정하지 않는다.
보통 인 메모리 데이터베이스는 테스트 환경에서 주로 사용한다.
테스트 환경에서 인 메모리 데이터베이스를 활용할 때는, application context 가 여러 개여도 같은 데이터베이스를 재사용한다.
따라서 만약 각 application context 마다 분리된 데이터베이스를 사용하기를 원한다면 spring.datasource.generate-unique-name
옵션을 true
로 주면 된다.
(참고1 : embedded database 를 자동으로 설정하려면 spring-jdbc 의존성이 필요하다. 보통 데이터베이스 연결에는 spring-boot-starter-data-jpa 의존성을 추가하는데, 이 의존성이 spring-jdbc 를 가져오기 때문에 직접 의존성을 추가할 필요는 없다.)
(참고2 : embedded database 의 url 은 자동 설정되는데, 이를 직접 설정해서 접근하려는 경우, 어플리케이션이 종료될 때마다 데이터가 사라지는 점을 유의하여 H2 데이터베이스를 사용하는 경우 DB_CLOSE_ON_EXIT=FALSE 설정을 해주어야 한다.)
Production DB
프로덕션 환경에서 사용하는 DB는 어플리케이션 외부에 존재한다.
프로덕션 DB 설정도 DataSource 를 pooling 하면 자동으로 할 수 있다. (무슨 뜻일까..)
spring:
datasource:
url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
외부 데이터베이스에 대한 DataSource 에 대한 설정은 spring.datasource.* 에 있는 프로퍼티를 통해 기입한다.
위는 그 예시를 보여준다.
외부 데이터베이스에 대한 정보를 기입할 때, url 은 반드시 기입해야 한다.
만약 url 을 기입하지 않으면 스프링 부트가 embedded database 로 자동 설정한다.
또한 스프링 부트는 url 로부터 알맞은 JDBC 드라이버를 추론해서 사용한다.
만약 직접 JDBC 드라이버를 명시하려면 spring.datasource.driver-class-name 프로퍼티 값을 지정한다.
추가적으로 spring.datasource.<connection pool>.* 프로퍼티를 통해 특정 커넥션 풀에 대한 설정을 작성할 수 있다.
스프링 부트는 HikariCP 를 사용할 수 있다면 우선적으로 사용하고,Tomcat, Common DBCP2, Oracle UCP 순으로 체크하여 사용한다.
(참고로 spring-boot-starter-data-jpa 의존성을 추가하면 HikariCP를 기본적으로 가져온다.)
만약 이 순서를 무시하고, 직접 원하는 커넥션 풀을 사용하려면 spring.datasource.type 프로퍼티를 통해 설정할 수 있다.
만약 추가적인 커넥션 풀을 사용하고 싶다면 DataSource 빈을 직접 정의해서 설정할 수 있다.
이 빈을 직접 정의하면 자동 설정이 발생하지 않고, DataSourceBuilder 클래스를 통해 직접 DataSource 를 커스텀해서 생성할 수 있다.
참고
https://docs.spring.io/spring-boot/reference/data/sql.html
'WEB(BE) > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] profile 개념과 profile 분리 (0) | 2025.01.04 |
---|