728x90
반응형
왜 DataSouce를 만들어서 관리해야 될까?
- 프로퍼티에 넣으면 자동으로 설정을 읽어오지만, 실무에서는 데이터 소스를 다루는 일이 빈번해진다.
그렇기 때문에 DataSource를 생성해서 사용해본다. - 하지만 이렇게 Config를 만들어서 사용하면 단점들도 있는데 이건 나중에 설명하겠다.
DataSource 생성하기
1. Mybatis와 JPA 설정에 필요한 공통 데이터 소스를 생성한다.
2. Jpa 전용 데이터 소스를 생성한다.
Yaml 파일 작성하기
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
username: user
password: user123
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10 # Optional: Configure HikariCP connection pool size
jpa:
hibernate:
ddl-auto: create # Options: create, create-drop, validate, update
show-sql: true # Optional: Show SQL statements in the console
properties:
hibernate:
format_sql: true # Optional: Format SQL output for readability
show_sql: true # Optional: Show SQL
dialect: org.hibernate.dialect.MySQL8Dialect
공통 데이터 소스
- @ConfigurationProperties("spring.datasource") 를 사용하여 yaml 의 속성을 읽는다.
- 이렇게 사용한 이유가 있는데 나중에 설명을 할 기회가 있으면 해야 겠다.
- 읽어온 프로퍼티 속성으로 DataSource를 생성한다.
package com.example.querydsl.config;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class CommonDataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties regularDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
public DataSource regularDataSource() {
return regularDataSourceProperties().initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
}
JpaDataSource
package com.example.querydsl.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Objects;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.querydsl.repository.jpa", // repository 를 구현할 패키지 위치
entityManagerFactoryRef = "entityManagerFactory", // primaryEntityManagerFactory
transactionManagerRef = "transactionManager" // primaryTransactionManager
)
public class JpaDataSourceConfig {
@Value("${spring.jpa.properties.hibernate.dialect}")
private String dialect;
@Value("${spring.jpa.hibernate.ddl-auto}")
private String ddlAuto;
@Value("${spring.jpa.properties.hibernate.show_sql}")
private String showSql;
@Value("${spring.jpa.properties.hibernate.format_sql}")
private String formatSql;
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
DataSource dataSource) {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", ddlAuto);
properties.put("hibernate.dialect", dialect);
properties.put("hibernate.show_sql", showSql);
properties.put("hibernate.format_sql", formatSql);
return builder.dataSource(dataSource)
.packages("com.example.querydsl.model") // entity 페키지 위치
.properties(properties)
.build();
}
@Bean(name = "transactionManager")
@Primary
public PlatformTransactionManager transactionManager(
final @Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
) {
return new JpaTransactionManager(Objects.requireNonNull(localContainerEntityManagerFactoryBean.getObject()));
}
}
Model, Repository 생성하기
Repository 위치 : com.example.querydsl.repository.jpa
Model 위치: com.example.querydsl.model
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[QueryDSL] QueryDSL 설정2 - Mysql 연동 (0) | 2024.11.25 |
---|---|
[QueryDSL] QueryDSL 설정 1 - QueryDsl 설정 적용 (0) | 2024.11.24 |
[JPA] AttributeConverter (0) | 2022.04.02 |
[JPA] JPA의 설정 옵션들 (0) | 2022.01.26 |
[JPA] JPQL Named 쿼리 (0) | 2021.09.28 |
댓글