Hibernate와 JPA, 다중 데이터베이스를 위한 초석.

Kyle_Kim·2023년 2월 18일
0

DataSource란?

  • DB와 관계된 커넥션 정보를 담고있으며 빈으로 등록하여 인자로 넘겨준다. → 이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.
    -- DB 서버와의 연결을 해준다.
    -- DB Connetion pooling기능
    종류 : JDBC Driver vendor(MySQL, Oracle)별로 여러가지가 존재한다.

DB Connection Pooling이란?

  • 자바 프로그램에서 데이터베이스 연결(커넥션 객체를 얻는것)은 오래걸림
  • 일정량의 Connection객체를 미리 만들어 저장해두었다가 요청시 꺼내쓴다!속도와 퍼포먼스가 좋아짐
  • 커넥션풀을 관리하고, 커넥션객체를 풀에서 꺼냈다 반납하는 이러한 과정을 DataSource가 하는것!

🍊 스프링에서의 커넥션 풀

  • 자바에서는 기본적으로 DataSource 인터페이스를 사용하여 커넥션풀을 관리한다.

  • Spring에서는 사용자가 직접 커넥션을 관리할 필요없이 자동화된 기법들을 제공하는데

  • SpringBoot 2.0 이전에는 tomcat-jdbc를 사용하다,
    현재 2.0이후 부터는 HikariCP를 기본옵션으로 채택 하고있다

즉, DB에 접근할수 있도록 Java에서 제공하는 API (Java Database Connectivity)

즉, 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

JDBC를 이용하면 데이터베이스에 비 종속적인 DB연동로직을 구현할 수 있다. 즉 mysql을 쓰다가 postgre로 얼마든지 옮길 수 있다는건데 이는 jdbc api가 여러 DB Driver를 호환할 수 있는 인터페이스를 제공하기 때문이다.

Plain JDBC의 문제점

쿼리를 실행하기 전과 후에 많은 코드를 작성해야한다. (연결생성, 명령문, 등등)
예외처리코드와 트랜잭션 처리등에 시간과 자원이 소모
jdbc에서 발생하는 에러는 Runtime Exception이다. 따라서 모두 예외처리를 해줘야함
이러한 문제점을 보완하여 생겨난것이 Spring JDBC

Hibernate

Hibernate를 사용하기 위해서는 Configuration에 다음 2가지가 등록되어야지 됩니다.

LocalSessionFactoryBean

  • SessionFactory에 대한 Factory Bean입니다. SessionFactory를 생성하는 객체를 등록시켜줍니다. 이는 Spring에서 사용할 DataSource와 Entity가 위치한 Package들에 대한 검색을 모두 포함하게 됩니다.

HibernateTransactionManager

  • PlatformTransactionManager를 구현한 Hibernate용 TransactionManager를 등록해야지 됩니다. 이는 Spring에서 @EnableTransactionManager와 같이 사용되어 @Transactional annotation을 사용할 수 있게 됩니다.

JPA

Hibernate 기반의 JPA를 등록하기 위해서는 Hibernate-JPA support bean이 필요합니다. 이에 대한 maven repository의 gradle 설정은 다음과 같습니다.

Spring에서 Hibernate기반의 JPA를 사용하기 위해서는 다음 Bean들이 필요합니다.

LocalContainerEntityManagerFactoryBean

  • SessionFactoryBean과 동일한 역활을 맡습니다. SessionFactoryBean과 동일하게 DataSource와 Hibernate Property, Entity가 위치한 package를 지정합니다. 또한 Hibernate 기반으로 동작하는 것을 지정해하는 JpaVendor를 설정해줘야지 됩니다.
 @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter());
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPackagesToScan("me.xyzlast.bh.entities");
        // NOTE : Properties를 이용해서 Hibernate property를 설정합니다.
        // entityManagerFactoryBean.setJpaProperties();
        return entityManagerFactoryBean;
    }

HibernateJpaVendorAdapter

  • Hibernate vendor과 JPA간의 Adapter를 설정합니다. 간단히 showSql 정도의 Property만을 설정하면 됩니다. 매우 단순한 code입니다.
    @Bean
    public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        return hibernateJpaVendorAdapter;
    }

JpaTransactionManager

  • DataSource와 EntityManagerFactoryBean에서 생성되는 EntityManagerFactory를 지정하는 Bean입니다.
@Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(entityManagerFactory().getObject());
        jpaTransactionManager.setDataSource(dataSource());
        return jpaTransactionManager;
    }
profile
Make Things Right

0개의 댓글