- 등록해야 할 Bean List
DataSource
JpaVendorAdapter
: 어떤 jpa 구현체를 사용할 것인지를 명시해줌LocalContainerEntityManagerFactoryBean
: entity를 관리하는 entityManager를 만들어 줌PlatformTransactionManager
: transaction을 관리하는 bean
SPI interface that allows to plug in vendor-specific behavior into Spring’s EntityManagerFactory creators.
- 그러나 아래의 과정은 application.yaml에 잘 써주면 알아서 Autoconfiguration해줌
@Configuration public class DataSourceConfig { @Bean public DataSource dataSource(){ DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:~/test"); dataSource.setUsername("sa"); dataSource.setPassword(""); return dataSource; } @Bean // 어떤 jpa 구현체를 사용할 것인지를 명시해주는 bean public JpaVendorAdapter jpaVendorAdapter(JpaProperties jpaProperties){ AbstractJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setShowSql(jpaProperties.isShowSql()); jpaVendorAdapter.setDatabasePlatform(jpaProperties.getDatabasePlatform()); jpaVendorAdapter.setGenerateDdl(jpaProperties.isGenerateDdl()); return jpaVendorAdapter; } @Bean // Jpa에서 entity는 rdb의 table과 매핑되는 객체인데 entity를 관리하는 entityManager가 있고 얘를 만들어주는 애(entityManagerFactory) public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter, JpaProperties jpaProperties){ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.example.springjpa.domain"); em.setJpaVendorAdapter(jpaVendorAdapter); Properties properties = new Properties(); properties.putAll(jpaProperties.getProperties()); em.setJpaProperties(properties); return em; } @Bean // transaction을 관리하는 Bean public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactoryBean.getObject()); return transactionManager; } }
Application.yaml
spring: h2: console: enabled: true jpa: generate-ddl: true # hibernate: # ddl-auto: create-drop. 이런 식으로 작성하면 autoconfiguration일 때 동작함 open-in-view: false show-sql: true database: h2 properties: hibernate: dialect: org.hibernate.dialect.H2Dialect query.in_clause_parameter_padding: true hbm2ddl: auto: create-drop
- 지금은 위에서 jpaProperties.getProperties() 로 셋팅해주고 있기 때문에 ddl-auto를 위와같이 명시해야함