kwonslog / how-to-use-jpa

0 stars 0 forks source link

spring boot 에서 spring-data-jpa 설정 방법 정리. #4

Closed kwonslog closed 1 month ago

kwonslog commented 5 months ago

환경

시작

import javax.sql.DataSource;

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 com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource;

@Configuration @EnableJpaRepositories( basePackages = "com.domain.jpa.admin.repository", entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager") public class JpaConfig {

@Value("${custom.db.inte.driver_class_name}")
private String driverClassName;
@Value("${custom.db.inte.jdbc.url}")
private String jdbcUrl;
@Value("${custom.db.inte.username}")
private String userName;
@Value("${custom.db.inte.password}")
private String password;
@Value("${custom.db.inte.maximum_pool_size}")
private int maximumPoolSize;
@Value("${custom.db.inte.minimum_idle}")
private int minimumIdle;

@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {

  Map<String, String> properties = new HashMap<>();
  properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
  properties.put("hibernate.implicit_naming_strategy", "org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl");

  LocalContainerEntityManagerFactoryBean factory = builder
          .dataSource(dataSource())
          .packages("com.domain.jpa.admin.entity")
          .properties(properties)
          .build();
  return factory;
}

@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(entityManagerFactory(builder).getObject());
}

@Bean(name = "dataSource")
@Primary
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
    config.setJdbcUrl(jdbcUrl);
    config.setUsername(userName);
    config.setPassword(password);
    config.setMaximumPoolSize(maximumPoolSize);
    config.setMinimumIdle(minimumIdle);

return new HikariDataSource(config); } }

- Entity 클래스 작성

package com.domain.jpa.admin.entity;

import java.time.LocalDateTime;

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;

import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter;

@Getter @Setter @NoArgsConstructor @Entity @Table(name="APP_MENU_INFO") public class AppMenuInfo {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@Column(name = "CONTENTS")
private String contents;
@Column(name = "CREATE_AT")
private LocalDateTime createAt;
@Column(name = "UPDATE_AT")
private LocalDateTime updateAt;

@Builder
public AppMenuInfo(long id, String contents, LocalDateTime createAt, LocalDateTime updateAt) {
    super();
    this.id = id;
    this.contents = contents;
    this.createAt = createAt;
    this.updateAt = updateAt;
}

}


- Repository 클래스 작성

package com.domain.jpa.admin.repository;

import org.springframework.data.repository.CrudRepository; import org.springframework.transaction.annotation.Transactional;

public interface AppMenuInfo extends CrudRepository<AppMenuInfo, Long> { }