반응형
실습 코드 참조
moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (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 클래스 수정 및 테스트
반응형
댓글