상세 컨텐츠

본문 제목

[Spring] Hibernate.cfx.xml이란

Backend

by choiDev 2023. 12. 23. 19:23

본문

Hibernate.cfg.xml은?

  1. XML형식의 설정 파일로, Hibernate에서 사용되는 설정을 정의하는 파일입니다.
  2. Hiberrnate 구성을 자세하게 제어하고자 할 때 사용됩니다.
  3. 데이터베이스 연결 정보, Hibernate의 동작 방식에 대한 설정, 매핑 정보등을 정의 할 수 있습니다.

아래와 같이 예시를 볼수있습니다.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
        <!-- JDBC Database connection settings -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">your_username</property>
        <property name="hibernate.connection.password">your_password</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- JDBC connection pool settings -->
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>

        <!-- Specify dialect -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="hibernate.hbm2ddl.auto">update</property>

    </session-factory>
</hibernate-configuration>
  • <property name="hibernate.connection.driver_class">cohttp://m.mysql.cj.jdbc.Driver</property>
    • Hibernate에서 사용하는 JDBC 드라이버 클래스를 지정하는 속성입니다. 
      * JDBC(Java Database Connectivity)드라이버 클래스는 Java 애플리케이션과 데이터베이스 간의 토잇ㄴ을 돕는데 사용되는 클래스입니다 사용하는 데이터베이스벤더(Mysql, PostgreSQL, Oracle) 마다 해당 데이터베이스에 연결할 수 있는 고유한 JDBC 드라이버 클래스가 있습니다. 이 드라이버 클래스는 JDBC API와 상호작용하여 데이터베이스와 통신을 관리합니다.
  • <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
    • hibernate에서 사용되는 JDBC 연결 URL을 설정하는 속성입니다. 데이터베이스와의 연결정보를 지정하며, URL은 특정 데이터베이스에 연결하기 위한 정보를 포함합니다.
    • 위에 설정은 이러한 구조로 되어있다고 보시면됩니다
      jdbc:<database-vendor>://<host>:<port>/<database-name> 
  • <property name="hibernate.connection.username">your_username</property>
    • 데이터베이스에 접속할 사용자 이름을 설정합니다.
  • <property name="hibernate.connection.password">your_password</property
    • 데이터베이스에 연결할 사용자 암호를 설정합니다.
  • <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    • 데이터베이스의 SQL 방언(dialect)를 지정합니다. 각 데이터베이스는 고유한 SQL 방언을 가지며 Hibernate는 이를 이용하여 데이터베이스에 맞는 적절한 SQL를 생성합니다. 
  • <property name="hibernate.c3p0.min_size">5</property>
    • 데이터베이스 커넥션 풀에 미리 생성할 최소 커넥션 수를 5개로 지정한다는 설정입니다.
  • <property name="hibernate.c3p0.max_size">20</property>
      • 데이터베이스 커넥션 풀에 미리 생성할 최대 커넥션 수를 20개로 지정한다는 설정입니다.
  • <property name="hibernate.c3p0.timeout">300</property>
    • 커넥션 연결이 풀에 반환되지 않고 대기 상태로 있는 시간(초)를 지정합니다. 이시간을 초과하면 해당 연결은 실패처리 됩니다.
  • <property name="hibernate.c3p0.max_statements">50</property>
    • 각 커넥션에서 캐시할 최대 SQL문의 수를 지정합니다. 이것은 특히 Statement캐시를 활성화했을때 사용합니다.
  • <property name="hibernate.c3p0.idle_test_period">3000</property>
    • 커넥션이 풀에서 가져와지기 전에 풀에 유지되는 최대시간을 지정합니다.
      이 시간동안 사용되지 않은 커넥션은 유효성 검사를 하여 문제가 있으면 폐기 처리합니다.
  • <property name="hibernate.show_sql">true</property>
    • 이 옵션을 true 설정하면 hibernate가 실행하는 sql쿼리가 콘솔에 출력됩니다.
    • 주로 개발 및 디버깅 단계에서 사용되며 빌드시 profile을 분리해서 prod가 아닌 환경에서 true설정하도록 하면 좋습니다.
    • prod에서 해당 설정이 true라면  꼭! 단점도 있다는걸 확인하고 사용하면 좋습니다.
      • 로그 쓰기 오버헤드 : SQL쿼리가 콘솔에 출력될때 I/O작업이 발생하며 해당 로그가 로그저장소에 쌓이게되면 로그 저장공간이 빨리 소비하게 되며 불필요한 로그까지 확인하게 되어 버그 픽스에 악영향을 미치게됩니다 또한 로그 저장공간이 자동으로 비우게 설정하지 않는 이상 로그저장용량이 꽉차 서버에러가 터지는 현상도 생길수있으니 로그는 정말 필요한것만 남길수있도록 합니다.
      • 보안문제 : SQL 내용은 민감한 내용이 많아 보안상 이슈가 발생 할 수 있으니 로그에 노출되지 않도록 
  • <property name="hibernate.format_sql">true</property>
    • 이 옵션을 true로 설정하면 출력된 SQL 쿼리가 읽기 쉽게 포맷팅됩니다.
    • 즉, 줄 바꿈과 들여쓰기가 적용되어 가독성을 향상시킵니다.
    • 주로 hibernate.show_sql과 함께 사용하여 디버깅할 때 SQL을 더 쉽게 이해할 수 있도록 도움을 줍니다.
      • 위에 hibernate.show_sql과 마찬가지로 prod환경에서는 false로 설정하는것이 중요하다.
  • <property name="hibernate.hbm2ddl.auto">none</property>
      • 이 속성은 Hibernate에서 데이터베이스 스키마를 자동으로 생성 또는 업데이트하는 동작을 제어하는 데 사용됩니다.
      • 값으로는 여러 옵션이 가능합니다. 일반적으로 사용되는 값으로는 다음이 있습니다:
        • create: 애플리케이션 시작 시마다 스키마를 생성합니다. 기존 스키마는 삭제됩니다.
        • update: 애플리케이션 시작 시마다 스키마를 업데이트합니다. 변경된 부분만을 적용하므로 데이터는 유지됩니다.
        • validate: 애플리케이션 시작 시마다 스키마의 유효성을 검증합니다. 변경 사항은 적용되지 않습니다.
        • none: Hibernate이 자동으로 스키마를 생성 또는 업데이트하지 않도록 합니다.

 

 

hibernate.cfg.xml는 application.yml으로도 표현이 가능한데 둘의 차이는

hibernate가 지원하는 설정cfg.xml을 사용할것인지? 스프링에서 지원하는 application.yml을 사용해서 지정할지 이다 

아래는 application.yml파일로 위와같은 설정들을 쓸땐 어떻게 써야하는지에 대한 예제이다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_database
    username: your_username
    password: your_password
  jpa:
    hibernate:
      dialect: org.hibernate.dialect.MySQLDialect
      show-sql: true
      format-sql: true
      hbm2ddl:
        auto: update
    properties:
      hibernate:
        c3p0:
          min-size: 5
          max-size: 20
          timeout: 300
          max-statements: 50
          idle-test-period: 3000

 

이번 글은 여기까지 작성하며 
다음 글로 hibernate의 ddl auto의 위험성에 대해 다뤄 보겠습니다.

 

감사합니다.

관련글 더보기