온 코딩

[JPA](간단한 게시판) 스프링-JPA 연동 : 레퍼런스 url , 본문

복습 ARCHIVE/모델별 프로젝트

[JPA](간단한 게시판) 스프링-JPA 연동 : 레퍼런스 url ,

SummerON 2021. 7. 5. 17:33

Spring-JPA 레퍼런스 URL

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories 

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

JPA 자체 레퍼런스 URL

https://www.objectdb.com/api/java/jpa 

 

JPA API Reference (JavaDoc) - Persistence, EntityManager, EntityTransaction, Query, etc.

This reference contains the API documentation (similar to JavaDoc) of the Java Persistence API (JPA) 2.0. The content is derived from the original JPA documentation (in the EclipseLink JPA 2 RI) with some additions and notes. The four most basic JPA types

www.objectdb.com

 

1. 프로젝트 변경 

properties -> project facets -> jpa 선택 

 

2. dependency 추가

하이버네이트, Spring ORM 라이브러리 추가

<!-- Spring ORM -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
        
        <!-- Hibernate -->
  		<dependency>
	  		<groupId>org.hibernate</groupId>
     		<artifactId>hibernate-entitymanager</artifactId>
     		<version>5.1.0.Final</version>
  		</dependency>

 

3. persistence.xml(JPA설정파일 작성)

<?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="BoardWeb_SpringMVC">
		<class>com.hhw.biz.board.BoardVO</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
			
			<!-- 옵션 -->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.use_sql_comments" value="false" />
			<property name="hibernate.id.new_generator_mappings" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="create" />
		</properties>
		
	</persistence-unit>
</persistence>

 

4. Entity 클래스 작성

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.springframework.web.multipart.MultipartFile;


/** VO : Value Object **/

@Entity
@Table(name="BOARD")
public class BoardVO {
	
	@Id
	@GeneratedValue
	private int seq;
	private String title;
	private String writer;
	private String content;
	
	@Temporal(TemporalType.DATE)
	private Date regDate;
	private int cnt;
	
	@Transient  // 테이블에 없는 필드 - 영속성에서 제외
	private String searchCondition;
	
	@Transient
	private String searchKeyword;
	
	@Transient
	private MultipartFile uploadFile;

	public BoardVO() {
	}

	@Override
	public String toString() {
		String values = "";
		values += "BoardVO [seq=" + this.seq; 
		values +=  ", title=" + this.title;
		values +=  ", writer=" + this.writer;
		values +=  ", content=" + this.content;
		values +=  ", regDate=" + this.regDate;
		values +=  ", cnt=" + this.cnt;
		values += ']';
		return values;
	}

+setter/ getter  필요

 

5. 스프링과 JPA 연동설정(applicationContext.xml) , 트랜젝션 설정 수정

	<!-- 스프링과 JPA 연동 설정  : JPA 벤더-->
	<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	</bean>
	
	<!-- JPA 엔티티 팩토리 -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>
	</bean>
	
	<!-- Transaction 설정 -->
	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>

기존 코드에 추가

VendorAdapter 클래스 - DB 연동에 사용할 JPA 벤더를 지정할 때 사용 (하이버네이트를 구현체로 사용 중)

LocalContrainerEntityManagerFactoryBean 클래스 

- EntityManager 객체 생성 공장 클래스 / DataSource와 JpaVendorAdater를 의존성 주입 

 

아래와 같은 코드의 경우 persistence.xml 제거 가능 

	<!-- 스프링과 JPA 연동 설정  -->
	<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	</bean>
	
	<!-- 엔티티메니저에 persistence요소 포함 -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>
		<property name="jpaProperties">
			<props>
				<prop key="hiberate.dialect">org.hibernate.dialect.Oracle12cDialect</prop>
				<prop key="hiberate.show_sql">true</prop>
			</props>
		</property>
	</bean>

 

6.DAO클래스 구현

package com.hhw.biz.board.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import com.hhw.biz.board.BoardVO;

@Repository
public class BoardDAOJPA {

	@PersistenceContext
	private EntityManager em;
	
	public BoardDAOJPA() {

	}
	
	public void insertBoard(BoardVO vo){
		System.out.println("===>JPA로 insertBoard() 기능처리");
		em.persist(vo);
	}

	public void updateBoard(BoardVO vo){
		System.out.println("===>JPA로 updateBoard() 기능처리");
		em.merge(vo);
	}
	public void deleteBoard(BoardVO vo){
		System.out.println("===>JPA로 deleteBoard() 기능처리");
		em.remove(em.find(BoardVO.class, vo.getSeq()));
	}
	public BoardVO getBoard(BoardVO vo){
		System.out.println("===>JPA로 getBoard() 기능처리");
		return (BoardVO)em.find(BoardVO.class, vo.getSeq());
	}
	public List<BoardVO> getBoardList(BoardVO vo){
		System.out.println("===>JPA로 insertBoard() 기능처리");
		return em.createQuery("from BoardVO b order by b.seq desc").getResultList();
	}
}

 

6. BoardServiceImpl클래스 DAO 수정

@Service("boardService")
public class BoardServiceImpl implements BoardService {
	
	@Autowired
	private BoardDAOJPA boardDAO;
Comments