# JPA

## `application.yaml` 설정

```yaml
spring:
  # 공통 JPA 설정
  jpa:
    hibernate:
      ddl-auto: update  # 테이블 자동 생성/업데이트 설정
    show-sql: true      # SQL 쿼리 로그 출력
    properties:
      hibernate:
        format_sql: true  # SQL 포맷팅 출력

# 개발 환경 (H2 데이터베이스)
---
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true  # H2 콘솔 활성화
      path: /h2-console

# 프로덕션 환경 (MariaDB 데이터베이스)
---
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mariadb://localhost:3306/mydb
    driver-class-name: org.mariadb.jdbc.Driver
    username: root
    password: mypassword
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MariaDBDialect  # MariaDB 전용 dialect
```

### 실행 방법
- `dev` 프로파일: `spring.profiles.active=dev`로 실행 (H2 사용)
- `prod` 프로파일: `spring.profiles.active=prod`로 실행 (MariaDB 사용)


### 설정 옵션

#### 1. 공통 JPA 설정 옵션
| **옵션** | **설명** | **예시 값** |
|-----------------------------|-------------------------------------------------------------------------------------------|-----------------------|
| `spring.jpa.hibernate.ddl-auto` | Hibernate가 데이터베이스 스키마를 생성/업데이트하는 방식 (`create`, `update`, `validate`, `none`) | `update` |
| `spring.jpa.show-sql` | 실행되는 SQL 쿼리를 콘솔에 출력할지 여부 | `true` |
| `spring.jpa.properties.hibernate.format_sql` | 출력되는 SQL을 읽기 쉽게 포맷팅할지 여부 | `true` |

#### 2. H2 데이터베이스 설정 옵션
| **옵션** | **설명** | **예시 값** |
|-----------------------------|-------------------------------------------------------------------------------------------|-----------------------|
| `spring.datasource.url` | H2 데이터베이스 연결 URL (메모리 모드: `jdbc:h2:mem:testdb`) | `jdbc:h2:mem:testdb` |
| `spring.datasource.driver-class-name` | H2 JDBC 드라이버 클래스 | `org.h2.Driver` |
| `spring.datasource.username`| H2 데이터베이스 사용자 이름 (기본값: `sa`) | `sa` |
| `spring.datasource.password`| H2 데이터베이스 비밀번호 (기본값: 빈 문자열) | `` |
| `spring.h2.console.enabled` | H2 웹 콘솔 활성화 여부 (브라우저에서 데이터 확인 가능) | `true` |
| `spring.h2.console.path` | H2 콘솔의 접근 경로 | `/h2-console` |

- **참고**: `DB_CLOSE_DELAY=-1`은 메모리 DB가 애플리케이션 종료 시 닫히지 않도록 유지하며, `DB_CLOSE_ON_EXIT=FALSE`는 연결 종료 시 DB를 닫지 않도록 설정합니다.

#### 3. MariaDB 데이터베이스 설정 옵션
| **옵션** | **설명** | **예시 값** |
|-----------------------------|-------------------------------------------------------------------------------------------|-----------------------|
| `spring.datasource.url` | MariaDB 데이터베이스 연결 URL (예: `jdbc:mariadb://호스트:포트/데이터베이스명`) | `jdbc:mariadb://localhost:3306/mydb` |
| `spring.datasource.driver-class-name` | MariaDB JDBC 드라이버 클래스 | `org.mariadb.jdbc.Driver` |
| `spring.datasource.username`| MariaDB 데이터베이스 사용자 이름 | `root` |
| `spring.datasource.password`| MariaDB 데이터베이스 비밀번호 | `mypassword` |
| `spring.jpa.properties.hibernate.dialect` | Hibernate가 사용할 MariaDB 전용 dialect (SQL 최적화) | `org.hibernate.dialect.MariaDBDialect` |


### 추가 설명
1. **H2 설정**:
   - H2는 인메모리 데이터베이스로, 테스트나 로컬 개발에 적합합니다.
   - H2 콘솔(`/h2-console`)을 통해 브라우저에서 데이터베이스를 확인할 수 있습니다.

2. **MariaDB 설정**:
   - MariaDB는 MySQL과 호환되는 오픈소스 RDBMS로, 프로덕션 환경에서 안정적으로 사용됩니다.
   - `dialect` 설정은 Hibernate가 MariaDB에 최적화된 SQL을 생성하도록 돕습니다.

3. **의존성 추가**:
   - `pom.xml`에 아래 의존성을 추가해야 합니다:
     ```kotlin
     runtimeOnly("com.h2database:h2")
     runtimeOnly("org.mariadb.jdbc:mariadb-java-client")
     implementation("org.springframework.boot:spring-boot-starter-data-jpa")
     ```

4. **프로파일 사용**:
   - `application.yaml`에서 `---`로 프로파일을 구분하며, 실행 시 `-Dspring.profiles.active=dev` 또는 `prod`를 지정합니다.

