본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

[Spring] 6장 스프링과 JPA 연동 - 엔티티 매핑 설정 및 스프링과 JPA 연동 설정

by 달님🌙 2021. 11. 2.
반응형

 

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

 

6.1절 스프링과 JPA 연동 기초

 

1. 프로젝트 변경 ( _079_BoardWeb_Spring_MVC_JPA )

 

 

 

2. 라이브러리 내려받기

 

<!-- JPA, 하이버네이트 -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>5.1.0.Final</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

 

 

3. 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="_079_BoardWeb_Spring_MVC">
		<class>com.springbook.biz.board.BoardVO</class>
		
		<properties>
			<!-- 필수 속성 -->			
			<!-- hibernate.dialect : DB마다 문법이 조금씩 다르기 때문에 어떤 DB의 문법을 사용하는 지정 -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
		
			<!-- 옵션 -->
			<!-- show sql : 생성된 SQL 콘솔에 출력 여부 결정 -->
			<property name="hibernate.show_sql" value="true"/>
			<!-- format sql : SQL 출력 시 실행한 포맷으로 출력할지 말지 결정 -->
			<property name="hibernate.format_sql" value="true"/>
			<!-- use_sql_comments : 주석 출력 여부 결정 -->
			<property name="hibernate.use_sql_comments" value="false"/>
			<!-- id.new_generator_mappings : 새로운 키 생성 전략 사용 여부 결정 -->
			<property name="hibernate.id.new_generator_mappings" value="true"/>
			<!-- hbm2ddl.auto : 테이블의 생성, 수정, 삭제를 자동 처리 여부 결정 -->
			<!-- create : 기존 테이블을 DROP -> CREATE 하도록 설정 -->
			<!-- create-drop : 기존 테이블을 DROP -> CREATE -> DROP 하도록 설정 -->
			<!-- update : 기존 테이블을 수정(ALTER) 하도록 설정, 
						    엔티티클래스가 기존 테이블에서 변화가 없으면 반영안되고 기존 테이블 사용 -->
			<property name="hibernate.hbm2ddl.auto" value="create"/>		
		</properties>
		
	</persistence-unit>
</persistence>

 

 

6.2절 엔티티 매핑 설정

 

package com.springbook.biz.board;

//sql -> util 로 변환
//이유 : xml로 변화하려면 기본 생성자가 필요한데 java.sql.Date는 기본 생성자가 없다.
import java.util.Date;

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;


@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 int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}

	public String getSearchCondition() {
		return SearchCondition;
	}
	
	public void setSearchCondition(String searchCondition) {
		SearchCondition = searchCondition;
	}
	
	public String getSearchKeyword() {
		return SearchKeyword;
	}
	
	public void setSearchKeyword(String searchKeyword) {
		SearchKeyword = searchKeyword;
	}

	public MultipartFile getUploadFile() {
		return uploadFile;
	}
	public void setUploadFile(MultipartFile uploadFile) {
		this.uploadFile = uploadFile;
	}
	
	@Override
	public String toString() {
		return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regDate="
				+ regDate + ", cnt=" + cnt + "]";
	}	
}

 

 

6.3절 스프링과 JPA 연동 설정

 

 

 

 

6.4절 트랜잭션 설정 수정 

 

 

	<!-- Transaction 설정 -->
	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>
	
	<!-- Trasaction advice 등록 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<!-- tx:attributes : Transaction advice 동작시점을 설정, 포인트컷 지정없이 메소드 지정가능-->
		<tx:attributes>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>

 

 

 

6.5절 DAO 클래스 구현

 

package com.springbook.biz.board.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;

@Repository
public class BoardDAOJPA {
	@PersistenceContext
	private EntityManager em;
	
	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(vo);
	}
	
	public BoardVO getBoard(BoardVO vo) {
		System.out.println("====> JPA로 getBoard() 기능 처리");
		return (BoardVO)em.find(BoardVO.class, vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("====> JPA로 getBoardList() 기능 처리");
		return em.createQuery("from BoardVO b order by b.seq desc").getResultList();
	}
}

 

 

6.6절 BoardServiceImpl 클래스 수정 및 테스트

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글