Backend/Spring+Boot

[JPA] SpringBoot JPA 설정

findmypiece 2021. 12. 8. 09:41
728x90

우선 SpringBoot 에서 JPA 설정을 위해 서칭을 하다보면 많은 javaConfig 로 여러 셋팅을 하는 포스팅이 나오지만 그 대부분은 Spring 기준으로 작성된 것이고 SpringBoot 에서는 대부분 자동으로 처리를 해주기 때문에 필요없는 것들이 더 많다.

 

Spring 환경에서는 javaConfig 방식으로 Datasource 빈을 만들어서 이걸 기반으로 EntityManagerFactory 빈을 만들고 또 다시 이걸 기반으로 TransactionManager 빈을 만든다. 추가로 @EnableTransactionManagement 도 추가해서 어노테이션으로 트랜잭션을 관리할 수 있도록 해줘야 한다. 아래 포스팅은 이에 대한 가장 정석적인 내용이다.

http://www.devkuma.com/books/pages/562

 

하지만 SpringBoot 환경에서는 application.yml 파일에 spring.datasource 관련 설정만 해주면 된다. 나머지는 SpringBoot 가 모두 알아서 해준다. @EnableTransactionManagement 조차 spring-boot-starter-data-jpa 의존성이 포함되어 있다면 자동으로 활성화 된다.

 

application.yml 에 정의할 내용은 일반적으로 아래와 같다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/TEST
    username: root
    password: 1234
  jpa:
#    database: mysql
#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    open-in-view: false
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        
logging:
  level:
    org.hibernate.type.descriptor.sql: trace

datasource 설정은 딱히 추가 설명이 필요없을 것 같고, jpa 관련 설정에 대해서만 추가 설명하자면 아래와 같다.

    • database, database-platform: jpa에서 활용할 방언을 지정하는데 사용된다. 둘 중 하나만 선택적으로 선언하면 되는데 아예 없어도 자동으로 잡아주기 때문에 불필요한 설정에러를 발생시키고 싶지 않다면 둘 다 설정하지 않는 것이 좋다.
    • open-in-view: default 값은 true 이다. 일반적으로 영속성 컨텍스트는 @Transactional 이 명시된 트랜잭션 상태가 종료되면 함께 종료된다. 그런데 open-in-view 를 true로 둘 경우 하나의 웹 요청이 끝날 때까지 유지된다.
      잘사용 한다면 view 가 포함된 프로젝트에서는 도움이 될 지 모르겠지만 영속성 컨텍스트와 DB커넥션은 1:1로 물고 있는 관계이기 때문에 성능상 문제가 될 수 있다. 이에  api 를 개발한다면 false 로 설정한다.
    • show-sql: default 값은 false 이다. treu 로 하면 콘솔에 JPA를 통해 실행된 쿼리를 표시해준다.
    • physical-strategy: jpa 에서 쿼리 생성시 Entity 에 매핑되는 테이블명과 칼럼명을 지정하는 정책이다. default 값은 org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy 로 이 경우 Entity 클래스명과 변수명을 기준으로 모든 점은 밑줄로 대체되고 카멜표기법 대소문자 사이도 밑줄로 대체된다. 또한 기본적으로 모든 테이블 이름은 소문자로 생성된다. Entity 선언시 @Table, @Column 어노테이션에 name을 설정해도 소용없다.
      이에 테이블명 대소문자를 구분하는 DB에서는 쿼리가 정상실행되지 않을 것이다. @Table, @Column 에 적용한 name 이 그대로 적용되게 하려면 위와 같이 org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 로 설정해줘야 한다.
    • format_sql: true로 설정할 경우 출력되는 쿼리를 포맷팅 해서 보여준다. default 값은 false 인듯?
    • use_sql_comments: true 설정할 경우 출력되는 쿼리 외에 이외에 어떤 Entity가 사용되었는지 등의 추가적인 정보를 출력해 준다. default 값은 false 인듯?
    • org.hibernate.type.descriptor.sql: 쿼리 바인드 변수에 어떤 값이 할당되는지 보여준다.

database, database-platform 에러 기록...

위에서 자동으로 설정된다고 했는데 아래와 같은 에러가 발생할 수 있다.

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

JPA 에서 자동으로 database 에 따른 방언을 설정하려면 일단 해당 database 에 연결되어야 하는 것은 당연하다. 그렇기 때문에 database 에 연결할 수 없다면 위와 같이 방언을 설정할 수 없다는 에러가 뜨게 된다.

 

난처음에 이 에러를 하고 database 또는 database-platform 를 반드시 지정해야 하는 줄 알고 여기저기 자료를 더 찾아 보았는데 예전에 리서치 했던 데로 별도로 지정할 필요는 없었다. 

 

나의 경우 사내 환경이 dev존/prod존으로 망이 분리되어 있어 각각 크로스로 통신할 수 없는 환경이다. 즉, dev존 어플리케이션에서는 dev존 DB만 연결할 수 있고, prod존 어플리케이션에서는 prod존 DB만 연결할 수 있다는 말이다. 그런데 application-prod.yml 파일에 dev존 DB url을 써놔서 계속 연결이 실패하고 있던 상황이었다.

 

http://forward.nhnent.com/hands-on-labs/java.mybatis-to-jpa/03.html
https://velog.io/@kingcjy/Spring-Boot-JPA-DB-Replication-설정하기
http://www.devkuma.com/books/pages/562
https://perfectacle.github.io/2018/01/14/jpa-entity-manager-factory/
https://doridorigang.tistory.com/10
https://drynod.github.io/jpa/2020/11/07/jpa.html
https://stackoverflow.com/questions/40724100/enabletransactionmanagement-in-spring-boot/50446664
https://2dongdong.tistory.com/66
https://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/session-configuration.html#configuration-optional-dialects
https://jistol.github.io/spring/2017/07/12/springboot-hibernate-sql-options/
https://ykh6242.tistory.com/102
https://mycup.tistory.com/237
https://velog.io/@gillog/JPA-Spring-Boot-JPA-Entity-Table-대-소문자-구분-못하는-경우-해결
https://goodgid.github.io/Spring-Boot-SQL-Option/
728x90