본문으로 바로가기

Spring ORM (Hibernate) 설정

category Back-End/JPA 2018. 12. 5. 00:13

보통 스프링 프레임워크로 웹 프로젝트 설정 시 Web MVC 관련 설정과 Service레이어 이하 애플리케이션 관련 설정을 분리하여 설정합니다.
이 포스트는 Spring 프레임워크 환경에서 JPA를 사용하기 위한 애플리케이션 관련 필수 설정을 다룹니다.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 1. 어노테이션(@Transactional) 기반 트랜잭션 매니저 활성화 --> <tx:annotation-driven/> <!-- 2. 애플리케이션에서 사용되는 컴포넌트 스캔 패키지 설정 --> <context:component-scan base-package="my.webservice.biz"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 3. 데이터소스(커넥션풀) 설정 - Hikari커넥션 풀 이용 --> <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP" /> <property name="connectionTestQuery" value="SELECT 1" /> <property name="dataSourceClassName" value="${hibernate.dataSourceClassName}" /> <property name="maximumPoolSize" value="${hibernate.hikari.maximumPoolSize}" /> <property name="idleTimeout" value="${hibernate.hikari.idleTimeout}" /> <property name="dataSourceProperties"> <props> <prop key="url">${dataSource.url}</prop> <prop key="user">${dataSource.username}</prop> <prop key="password">${dataSource.password}</prop> </props> </property> </bean> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean> <!-- 4. 트랜잭션매니저 설정 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 5. JPA 예외 추상화 AOP 설정 --> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <!-- 6. 엔티티매니저팩토리 설정 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="package.for.entity"/> <!-- @Entity 탐색 시작 위치 --> <property name="jpaVendorAdapter"> <!-- 하이버네이트 구현체 사용 --> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <!-- 하이버네이트 상세 설정 --> <props> <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> <!-- 방언 --> <prop key="hibernate.show_sql">true</prop> <!-- SQL 보기 --> <prop key="hibernate.format_sql">true</prop> <!-- SQL 정렬해서 보기 --> <prop key="hibernate.use_sql_comments">true</prop> <!-- SQL 코멘트 보기 --> <prop key="hibernate.id.new_generator_mappings">true</prop> <!-- 새 버전의 ID 생성 옵션 --> <prop key="hibernate.hbm2ddl.auto">create</prop> <!-- DDL 자동 생성 --> </props> </property> </bean> </beans>
1. 어노테이션(@Transactional) 기반 트랜잭션 매니저 활성화

스프링 프레임워크에서 제공하는 어노테이션 기반 트랜잭션 매니저를 활성화합니다. @Transactional이 붙은 클래스, 메소드에 트랜잭션을 적용해줍니다.

2. 애플리케이션에서 사용되는 컴포넌트 스캔 패키지 설정

보통 @Controller는 Web MVC영역 설정으로 잡히도록 하기 때문에 @Controller를 제외하고 스캔하도록 설정

3. 데이터소스(커넥션풀) 설정 - Hikari커넥션 풀 이용

커넥션 풀 설정입니다. 이 포스트에서는 HikariCP를 이용했으며 다른 커넥션풀을 이용해도 무방합니다.

4. 트랜잭션 매니저 설정

그동안 MyBatis 등 프레임워크을 사용할 땐 DataSourceTransactionManager를 많이 사용해왔는데, JPA를 이용할 때엔 JpaTransactionManager를 설정해줘야한다고 합니다. JpaTransactionManager는 DataSourceTransactionManager가 하는 일을 수행하기 때문에 JPA가 아닌 타 프레임워크(MyBatis, JdbcTemplate 등) 과도 사용이 가능합니다.

5. JPA 예외 추상화 AOP 설정

JPA에서 발생한 예외 (JPA예외)를 스프링에서 추상화한 예외로 변환하는 역할을 하는 AOP를 적용합니다.

6. 엔티티매니저팩토리 설정

엔티티매니저팩토리 설정은 직관적으로 이해할 수 있습니다.
다만 Java SE 환경에서는 META-INF/persistence.xml 파일을 자동인식하여 엔티티매니저팩토리를 설정했지만  스프링 프레임워크에서는 이와같이 스프링다운 방식대로 엔티티매니저팩토리를 하나의 빈으로 설정하여 persistence.xml없이 사용할 수 있습니다.

자바 ORM 표준 JPA 프로그래밍을 공부하며 정리한 내용입니다.



댓글을 달아 주세요