본문 바로가기
Spring/JPA

[JPA] JPA 환경설정

by J4J 2021. 3. 21.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 JPA 환경설정에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

 

지금까지 스프링을 사용하며 데이터베이스에 접근하기 위해 MyBatis만 사용해왔었습니다.

 

하지만 최근에 MyBatis보다 더 핫(?)한 JPA라는 기술이 있다는 것을 알게 되었습니다.

 

객체와 관계형 DB를 서로 매핑하여 쿼리를 따로 작성하지 않고 정의하지 않은 메서드만을 가지고 DB동작을 실행할 수 있었고 필요시에는 직접 쿼리를 작성할 수도 있었습니다.

 

JPA를 사용하면 개발할 때 MyBatis보다 편리함을 가져다줄 것이라고 생각하여 관련된 내용을 공부하긴 했지만 실상은 러닝 커브가 높아 아직도 이해가 안 되는 부분이 너무 많습니다.

 

그래서 생각한 것은 한 프로젝트에서 MyBatis와 JPA를 동시에 사용하는 것이었습니다.

 

JPA가 더 효율적이게 구현되는 것은 JPA를 사용하고 JPA로 구현을 못하거나 또는 MyBatis가 더 효율적인 것에는 MyBatis를 사용하고자 합니다.

 

그렇기에 이번에 포스팅하는 JPA환경설정도 MyBatis와 동시 사용을 위해 MyBatis설정과 매우 유사하게 진행할 것이고 추후에는 실제로 MyBatis와 동시에 사용되는 포스팅도 작성해보도록 하겠습니다.

 

 

JPA란?

 

JPA는 자바에서 사용되는 ORM기술 표준으로 인터페이스로 구현되어 있습니다.

 

위에서 언급한 바와 같이 쿼리를 따로 작성하지 않고 인터페이스만 구현하면 적절한 쿼리를 자동으로 생성한 뒤 데이터베이스에 전달하여 실행되도록 해줍니다.

 

JPA를 사용하게 되면 개발자 대신 쿼리를 작성해주기 때문에 단순 노동, 반복 작업을 줄여줌으로 써 개발자는 개발에만 집중할 수 있는 환경을 만들어줍니다.

 

 

ORM이란?

 

ORM이란 Object Relational Mapping의 약자로 말 그대로 객체-관계 매핑을 의미합니다.

 

자바에서 생성되는 객체와 관계형 DB에서 생성되는 관계를 중간에서 매핑하여 쿼리를 작성하지 않고도 쿼리를 작성한 것과 동일한 결과를 만들수 있게 해줍니다.

 

그리고 이런 ORM프레임워크 중 자바에서 가장 많이 사용되는 것이 Hibernate입니다.

 

JPA 인터페이스를 구현한 것이 Hibernate인 것입니다.

 

 

반응형

 

 

프로젝트 구성

 

※ 스프링과 관련된 코드는 모두 STS-3.9.12.RELEASE 버전을 기준으로 작성되었습니다.

 

이제는 JPA사용을 위한 환경설정을 진행해보도록 하겠습니다.

 

[ 1. pom.xml에 dependency 추가 ]

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
    
	...
    
	<properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.2.11.RELEASE</org.springframework-version>
        <org.aspectj-version>1.9.6</org.aspectj-version>
        <org.slf4j-version>1.7.30</org.slf4j-version>
	</properties>
    
	<dependencies>
		<!-- DB Dependency -->
		<dependency> <!-- 스프링에서 DB처리를 위한 dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<dependency> <!-- MySQL 사용을 위한 dependency -->
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.22</version>
		</dependency>
		
		<dependency> <!-- 커넥션풀을 위한 dependency -->
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-dbcp2</artifactId>
		    <version>2.8.0</version>
		</dependency>
		
		<dependency> <!-- JPA 사용을 위한 Dependency -->
		    <groupId>org.springframework.data</groupId>
		    <artifactId>spring-data-jpa</artifactId>
		    <version>2.2.5.RELEASE</version>
		</dependency>
		
		<dependency> <!-- JPA 사용을 위한 Dependency -->
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-entitymanager</artifactId>
		    <version>5.4.10.Final</version>
		</dependency>
		
		<dependency> <!-- 트랜잭션 처리를 위한 dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<!-- Lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.12</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
			<scope>test</scope>
		</dependency>           
	</dependencies>
    
    	...
    
</project>

 

 

[ 2. src/main/resources/META-INF에 persistence.xml 파일 생성 ]

 

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="jpa-mysql"> <!-- 이름 -->
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <!-- DB고유 기능 사용 -->
			<property name="hibernate.show_sql" value="true" /> <!-- 콘솔창에 실행되는 SQL문 출력 -->
			<property name="hibernate.format_sql" value="true" /> <!-- SQL출력시 보기 쉽게 정렬 -->
			<property name="hibernate.use_sql_comments" value="true" /> <!-- SQL출력 시 주석도 같이 출력 -->
			<property name="hibernate.id.new_generator_mappings" value="true" /> <!-- JPA표준에 맞춘 새로운 키 생성 전략 설정 -->
		</properties>
	</persistence-unit>
</persistence>

 

 

[ 3. web.xml 파일 수정 ]

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- 자바설정으로 변경 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>com.spring.jpa.config.RootContext</param-value>
	</context-param>
    
	<context-param>
		<param-name>contextClass</param-name>
		<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
	</context-param>
    
	...
    
</web-app>

 

 

728x90

 

 

[ 4. RootContext 파일 생성 (com.spring.jpa.config.RootContext) ]

 

package com.spring.jpa.config;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
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
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.spring.jpa.repository"})
public class RootContext {
	
	@Bean
	public BasicDataSource dataSource() { // DB 정보
		BasicDataSource datasource = new BasicDataSource();
		datasource.setDriverClassName("com.mysql.cj.jdbc.Driver");
		datasource.setUrl("jdbc:mysql://localhost:3306/jpa?serverTimezone=UTC");
		datasource.setUsername("root");
		datasource.setPassword("root");
		
		return datasource;
	}
	
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory() { // jpa 설정
		LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
		entityManagerFactory.setDataSource(dataSource());
		entityManagerFactory.setPersistenceUnitName("jpa-mysql"); // persistence.xml의 설정 정의된 이름
		entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
		
		return entityManagerFactory;
	}
	
	@Bean
	public PlatformTransactionManager transactionManager() throws Exception { // transaction 설정
		JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
		jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
		
		return jpaTransactionManager;
	}
}

 

 

참조

 

[JPA] JPA란 무엇인가?

 

[JPA] JPA란

 

[Spring JPA] 방명록 애플리케이션 (1) - 환경 설정

 

 

 

이상으로 JPA 환경설정에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글