Hayden's Archive

[PostgreSQL/Hibernate/JPA/Spring] 연동 및 데이터 삽입 (1) 본문

Study/DB

[PostgreSQL/Hibernate/JPA/Spring] 연동 및 데이터 삽입 (1)

_hayden 2020. 10. 22. 13:52

Spring Legacy Project 에서 PostgreSQL과 Hibernate를 연동해보려고 한다.

사실 이 때까지 RDBMS로 MySQL을 썼고, MyBatis와 연동해서 하는 방식이 더 익숙하다.

하지만 익숙한 것만 고집할 수 없고 시간이 걸리고 헤매더라도 새로운 지식도 흡수해야 한다.

그래서 스프링에서 PostgreSQL과 Hibernate를 연동하고 데이터를 삽입해보겠다.

 

개념 참고 gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html

 

[JDBC] JDBC, JPA/Hibernate, Mybatis의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

 

JPA, Hibernate, 그리고 Spring Data JPA의 차이점

개요 Spring 프레임워크는 어플리케이션을 개발할 때 필요한 수많은 강력하고 편리한 기능을 제공해준다. 하지만 많은 기술이 존재하는 만큼 Spring 프레임워크를 처음 사용하는 사람이 Spring 프레

suhwan.dev

m.blog.naver.com/PostView.nhn?blogId=scw0531&logNo=221105180348

 

[Spring Boot - Spring JPA, Oracle 연동]

안녕하세요!! 이번 포스팅은 스프링 부트 환경에서 Spring JPA를 연동해보는 방법을 알아보겠습니다. *...

blog.naver.com

 

개념 정리

Persistence Layer에서 간단하게 동작하는 Persistence Framework로 SQL Mapper와 ORM이 있다. 

SQL Mapper는 쿼리문으로 직접 DB를 컨트롤 하는 반면(SQL 중심), 
ORM은 쿼리문 없이 직관적인 메소드로 데이터를 조작한다.(객체의 관계 중심) 

MyBatis는 SQL Mapper에 해당하고, Hibernate는 ORM에 해당한다.

JPA, Hibernate는 자바에서의 ORM인데, 그 중에서도 JPA는 자바의 표준 ORM API이고, JPA를 구현한 것이 Hibernate 이다.

 

 

먼저 PostgreSQL 비밀번호를 먼저 새롭게 세팅하겠다. ( 참고 : blog.naver.com/qkrzzang13/221367410911 )

 

pom.xml (Maven 기반)에 PostgreSQL과 Hibernate의 의존성을 추가한다.

<!-- PostgreSQL 9.4 -->
<dependency>
	<groupId>org.postgresql</groupId>
	<artifactId>postgresql</artifactId>
	<version>9.4.1209.jre6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>5.4.22.Final</version>
</dependency>

 

나는 xml을 사용하지 않고, Java Configuration 방식으로 @Configuration 어노테이션을 통해 설정했다. 

모듈화를 위해 db.properties 파일에 다음과 같이 JDBC(PostgreSQL)와 Hibernate 정보를 작성한다.

# JDBC(PostgreSQL)
jdbc.driverClassName = org.postgresql.Driver
jdbc.url = jdbc:postgresql://localhost:5432/postgres
jdbc.username = PostgreSQL 아이디
jdbc.password = PostgreSQL 비밀번호

# Hibernate
hibernate.dialect = org.hibernate.dialect.PostgreSQL10Dialect
hibernate.show_sql = false #콘솔에 SQL을 띄울 것인지
hibernate.format_sql = true #콘솔에 SQL을 보기 좋게 띄울 것인지
hibernate.hbm2ddl.auto = none #참고 : https://blog.naver.com/chonkk/221454723379

 

그리고 나서 Configuration 자바 파일에서 properties 파일을 불러와서 각 필드에 바인딩해준다

아래 코드의 메소드에 대한 설명은 다음의 블로그에 자세히 나타나 있다

Spring에서의 Hibernate, JPA의 이용 netframework.tistory.com/entry/Spring%EC%97%90%EC%84%9C%EC%9D%98-Hibernate-JPA%EC%9D%98-%EC%9D%B4%EC%9A%A9

package kr.com.inspect.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@PropertySource(value = "classpath:db.properties")
@EnableTransactionManagement
@EnableJpaRepositories({"kr.com.inspect.repository"})
public class PostgreConfig {
	
	/* JDBC 정보 */
	@Value("${jdbc.driverClassName}") 
	private String driverClassName;
	
	@Value("${jdbc.url}")
	private String url;
	
	@Value("${jdbc.username}")
	private String userName;
	
	@Value("${jdbc.password}")
	private String password;
	
	/* Hibernate 정보 */
	@Value("${hibernate.dialect}")
	private String dialect;
	
	@Value("${hibernate.show_sql}")
	private String showSql;
	
	@Value("${hibernate.format_sql}")
	private String formatSql;
	
	@Value("${hibernate.hbm2ddl.auto}")
	private String hbm2ddlAuto;
	
	@Bean
	public DataSource dataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName(driverClassName);
		dataSource.setUrl(url);
		dataSource.setUsername(userName);
		dataSource.setPassword(password);
		return (DataSource)dataSource;
	}
	  
	private Properties hibernateProperties() {
		Properties properties = new Properties();
		properties.put("hibernate.dialect", dialect);
		properties.put("hibernate.show_sql", showSql);
		properties.put("hibernate.format_sql", formatSql);
		properties.put("hibernate.hbm2ddl.auto", hbm2ddlAuto);
		return properties;
	}
	  
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
		LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
		em.setDataSource(dataSource());
		em.setPackagesToScan(new String[] { "kr.com.inspect.entity" });
		HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
		em.setJpaVendorAdapter((JpaVendorAdapter)hibernateJpaVendorAdapter);
		em.setJpaProperties(hibernateProperties());
		return em;
	}
	  
	@Bean
	public PlatformTransactionManager transactionManager() {
		JpaTransactionManager transactionManager = new JpaTransactionManager();
		transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
		return (PlatformTransactionManager)transactionManager;
	}
}

 

web.xml 역할을 하는 WebConfig.java 파일에도 위에서 생성한 PostgreConfig.java를 등록해준다.

package kr.com.inspect.config;

import javax.servlet.Filter;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@Configuration
@ComponentScan(basePackages= {"kr.com.inspect"})
public class WebConfig  extends AbstractAnnotationConfigDispatcherServletInitializer{

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class[] { RootConfig.class, PostgreConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class[] { ServletConfig.class };
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}
	
	/* 한글 설정(UTF-8) */
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
		characterEncodingFilter.setEncoding("UTF-8");
		characterEncodingFilter.setForceEncoding(true);
		return new Filter[] { characterEncodingFilter };
	}
}

 

삽입할 데이터 객체를 아래와 같이 만들어둔다.

package kr.com.inspect.dto;

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.Data;

@Entity
@Table(name = "sound")
@Data
public class Sound {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "sound_id")
	String id;
	String category;
	String title;
	String company;
	String content;
}

 

다음번에는 비즈니스로직을 작성해보겠다. 

~ 작성 예정 ~

 

참고 : JPA 네이티브 쿼리 작성 krksap.tistory.com/946