# 31.1 Configure a DataSource

Java의 `javax.sql.DataSource`인터페이스는 데이터베이스 연결 작업의 표준 방법을 제공합니다. 전통적으로 'DataSource'는 `URL`데이터베이스 연결을 설정하기 위해 일부 자격 증명과 함께를 사용 합니다.

| ![\[팁\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                                                                           |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 일반적으로 DataSource의 구성을 완전히 제어하기위한 고급 예제는 [“How-to” section](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-a-datasource)을 참조하십시오. |

#### 31.1.1 내장 데이터베이스 지원

메모리 내장 데이터베이스를 사용하여 응용 프로그램을 개발하는 것이 종종 편리합니다. 분명히 in-memory databases는 영구 저장소를 제공하지 않습니다. 응용 프로그램이 시작되면 데이터베이스를 채우고 응용 프로그램이 끝나면 데이터를 버릴 준비가 필요합니다.

{% hint style="info" %}
인메모리 데이터베이스는 데이터 스토리지의 메인 메모리에 설치되어 운영되는 방식의 데이터베이스 관리 시스템이다.&#x20;
{% endhint %}

| ![\[팁\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                                                                                                                                                               |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "방법"섹션에는 [데이터베이스를 초기화하는 방법에 대한](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-database-initialization) 섹션이 포함되어 [있습니다](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-database-initialization) . |

스프링 부트는 내장 된 [H2](https://www.h2database.com/) , [HSQL](http://hsqldb.org/) 및 [Derby](https://db.apache.org/derby/) 데이터베이스를 자동 구성 할 수 있습니다 . 연결 URL을 제공 할 필요가 없습니다. 사용할 내장 데이터베이스에 빌드 종속성 만 포함하면됩니다.

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                                                                                          |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 테스트에서 이 기능을 사용하는 경우 사용하는 응용 프로그램 컨텍스트의 수에 관계없이 전체 테스트 묶에서 동일한 데이터베이스가 다시 사용된다는 것을 알 수 있습니다. 각 컨텍스트에 별도의 내장 데이터베이스가 있는지 확인하려면 `pring.datasource.generate-unique-name`를 `true 로` 설정해야 합니다. |

예를 들어, 일반적인 POM 종속성은 다음과 같습니다.

```markup
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
	<groupId>org.hsqldb</groupId>
	<artifactId>hsqldb</artifactId>
	<scope>runtime</scope>
</dependency>
```

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                      |
| -------------------------------------------------------------------------------------------------------------------- |
| 내장 데이터베이스를 자동으로 구성하려면 `spring-jdbc`에 대한 종속성이 필요합니다. 이 예에서는 `spring-boot-starter-data-jpa`.를 통해 transitively 끌어 당깁니다. |

| ![\[팁\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png)                                                                                                                                                              |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 어떤 이유로 든 포함 된 데이터베이스의 연결 URL을 구성한 경우 데이터베이스의 자동 종료가 비활성화되었는지 확인하십시오. H2를 사용하는 경우 `DB_CLOSE_ON_EXIT=FALSE`를 사용해야합니다. HSQLDB를 사용한다면, `shutdown=true`가 사용되지 않았는지 확인해야합니다. 데이터베이스의 자동 종료를 비활성화하면 데이터베이스가 닫힐 때 스프링 부팅을 제어 할 수 있으므로 데이터베이스 액세스가 더 이상 필요하지 않게됩니다. |

#### 31.1.2 프로덕션 데이터베이스에 대한 연결

프로덕션 데이터베이스 연결은 `DataSource`풀링을 사용하여 자동 구성 할 수도 있습니다. Spring Boot는 특정 구현을 선택하기 위해 다음 알고리즘을 사용합니다 :

1. 우리는 [HikariCP](https://github.com/brettwooldridge/HikariCP) 의 성능과 동시성을 선호 합니다. HikariCP를 사용할 수 있다면, 우리는 항상 그것을 선택합니다.
2. 그렇지 않으면 Tomcat 풀링 `DataSource`을 사용할 수있는 경우 이를 사용합니다.
3. HikariCP 나 Tomcat 풀링 데이터 소스가 없으며 [Commons DBCP2](https://commons.apache.org/proper/commons-dbcp/) 가 사용 가능 [하다면](https://commons.apache.org/proper/commons-dbcp/) 이를 사용합니다.

{% hint style="info" %}
히카리 커넥션풀은 빠른 속도로인해 점점 더 주목받고 있는 커넥션풀입니다.
{% endhint %}

&#x20;`spring-boot-starter-jdbc`또는 `spring-boot-starter-data-jpa`를 당신이 사용하는 경우 "staters"를 사용하면 자동으로 `HikariCP`에 의존하게 됩니.

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                                                     |
| --------------------------------------------------------------------------------------------------------------------------------------------------- |
| 해당 알고리즘을 완전히 생략하고 `spring.datasource.type`속성 을 설정하여 사용할 연결 풀을 지정할 수 있습니다 . 이것은 `tomcat-jdbc`에의해 기본적으로 제공되는 Tomcat 컨테이너에서 애플리케이션을 실행하는 경우 특히 중요합니다 . |

| ![\[팁\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png) |
| --------------------------------------------------------------------------------------------- |
| 추가 연결 풀은 항상 수동으로 구성 할 수 있습니다. 자신의 `DataSource`bean 을 정의하면 자동 구성이 발생하지 않습니다.                   |

DataSource 구성은 `spring.datasource.*`의 외부 구성 등록 정보에 의해 제어됩니다. 예를 들어 `application.properties`에 다음 섹션을 다음과 같이 선언 할 수 있습니다.

```
spring.datasource.url = jdbc : mysql : // localhost / test
 spring.datasource.username = dbuser
 spring.datasource.password = dbpass
 spring.datasource.driver-class-name = com.mysql.jdbc.Driver
```

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)      |
| ---------------------------------------------------------------------------------------------------- |
| 적어도 `spring.datasource.url` 속성 을 설정하여 URL을 지정해야 합니다. 그렇지 않으면, Spring Boot는 내장 된 데이터베이스를 자동 설정하려고합니다. |

| ![\[팁\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/tip.png) |
| --------------------------------------------------------------------------------------------- |
| Spring Boot는  `url`로부터 대부분의  데이터베이스위해 그것을 추론 할 수 있기 때문에 종종 `driver-class-name`을 지정할 필요가 없습니다. |

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                                                                                  |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 풀링 `DataSource`을 만들려면 유효한 `Driver`클래스가 사용 가능한지 확인할 수 있어야 합니다. 그래서 우리는 무엇인가하기 전에 체크합니다. 즉, 설정 `spring.datasource.driver-class-name=com.mysql.jdbc.Driver`하면 해당 클래스를로드 할 수 있어야합니다. |

지원되는 옵션에 대한 자세한 내용은 [`DataSourceProperties`](https://github.com/spring-projects/spring-boot/tree/v2.1.5.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java)를 참조하십시오. 이것은 실제 구현과 상관없이 작동하는 표준 옵션입니다. 구현 관련 설정을 각 접두사  ( `spring.datasource.hikari.*`, `spring.datasource.tomcat.*`및 `spring.datasource.dbcp2.*`)를 사용하여 세부 조정할 수도 있습니다. 자세한 내용은 사용중인 연결 풀 구현의 설명서를 참조하십시오.

예를 들어, [Tomcat 연결 풀](https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes)을 사용하는 경우 다음 예제와 같이 많은 추가 설정을 사용자 정의 할 수 있습니다.

```
# 사용할 수있는 연결이없는 경우 예외를 throw하기 전에 대기 할 시간 (밀리 초)입니다. 
spring.datasource.tomcat.max-wait = 10000

#이 풀에서 동시에 할당 할 수있는 최대 활성 연결 수입니다. 
spring.datasource.tomcat.max-active = 50

# 풀에서 빌리기 전에 연결을 검증하십시오. 
spring.datasource.tomcat.test-on-borrow = true
```

#### 31.1.3 JNDI 데이터 소스에 연결

Spring Boot 애플리케이션을 Application Server에 배포하는 경우 Application Server의 내장 기능을 사용하여 DataSource를 구성 및 관리하고 JNDI를 사용하여 액세스 할 수 있습니다.

Spring Boot 애플리케이션을 Application Server에 배포하는 경우 Application Server의 내장 기능을 사용하여 DataSource를 구성 및 관리하고 JNDI를 사용하여 액세스 할 수 있습니다.

spring.datasource.jndi-name 속성은 `spring.datasource.url`, `spring.datasource.username`및 `spring.datasource.password` 속성의 대안으로 사용되어 특정 JNDI 위치에서 `DataSource`에 액세스 할 수 있습니다. 예를 들어 `application.properties`의 다음 섹션에서는 JBoss AS에 정의 된 DataSource에 액세스하는 방법을 보여줍니다.

```
spring.datasource.jndi-name = java : jboss / datasources / customers
```
