일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 클라이언트 상태 관리 라이브러리
- 타입 단언
- 프로세스
- msw
- Recoil
- TypeScript
- Custom Hook
- helm-chart
- react
- 좋은 PR
- prettier-plugin-tailwindcss
- CS
- Sparkplug
- 명시적 타입 변환
- Compound Component
- Headless 컴포넌트
- mocking
- Microtask Queue
- useLayoutEffect
- zustand
- 암묵적 타입 변환
- type assertion
- 회고
- AJIT
- linux 배포판
- Redux Toolkit
- JavaScript
- jotai
- docker
- Render Queue
- Today
- Total
구리
TIL_210705_Spring & JPA 연동 본문
목차
1. 스프링과 JPA 연동 기초
(1) 프로젝트 변경 및 라이브러리 내려받기
(2) JPA 설정 파일 작성 (persistence.xml 파일 수정)
2. 엔티티 매핑 설정
3. 스프링, JPA 연동 설정 (applicationContext.xml)
4. 트랜잭션 설정 수정 (applicationContext.xml)
5. DAO 클래스 구현
6. BoardServiceImpl 클래스 수정 및 테스트
1. 스프링과 JPA 연동 기초
(1) 프로젝트 변경 및 라이브러리 내려받기
BoardWeb 프로젝트 > Properties > Project Facets > JPA 선택 후 apply => persistemce.xml 파일 자동 생성
pom.xml 수정 (Oracle 사용하기에 lib 폴더에 ojdbc8.jar 따로 추가)
<!-- Hibernate -->
<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>
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
(2) JPA 설정 파일 작성 (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="BoardWeb">
<class>com.springbook.biz.board.BoardVO</class>
<properties>
<!-- 필수 속성 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/> <!--생성된 SQL을 콘솔에 출력 -->
<property name="hibernate.format_sql" value="true"/> <!--SQL 출력시, 일정한 포맷으로 보기 좋게 출력 -->
<property name="hibernate.use_sql_comments" value="false"/> <!--SQL에 포함된 주석도 출력 -->
<property name="hibernate.id.new_generator_mappings" value="true"/> <!--새로운 키 생성 전략을 사용 -->
<property name="hibernate.hbm2ddl.auto" value="create"/> <!--테이블 생성, 수정 등 DDL 구문을 자동으로 처리할지 지정 -->
</properties>
</persistence-unit>
</persistence>
2. 엔티티 매핑 설정
package com.springbook.biz.board;
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;
// VO
@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= new Date();
private int cnt;
@Transient
private String searchCondition;
@Transient
private String searchKeyword;
@Transient
private MultipartFile uploadFile;
public BoardVO() {}
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) {
this.searchCondition = searchCondition;
}
public String getSearchKeyword() {
return searchKeyword;
}
public void setSearchKeyword(String searchKeyword) {
this.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 +"]";
}
}
3. 스프링, JPA 연동 설정 (applicationContext.xml)
(코드 추가)
<!-- 스프링과 JPA 연동 설정 -->
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>
</bean>
① 실제 DB 연동에 사용할 JPA 벤더 지정시 사용 > JpaVendorAdapter 클래스 (사용할 Database의 설정 정보를 지정)
(jpa 구현체로 하이버네이트를 사용하므로 HibernateJpaVendorAdapter 클래스 등록)
② JPA 이용하여 DAO 클래스 구현하기 위해선 EntityManager 객체 필요 > LocalContainerEntityManagerFactoryBean 라는 공장 기능 클래스 사용
만약 아래와 같이 설정한다면 persistence.xml 파일은 제거해도 됩니다.
<!-- 스프링과 JPA 연동 설정 -->
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>
<property name="packagesToScan" value="com.springbook.biz.board"></property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hibernate.show_sql">true</prop> <!--생성된 SQL을 콘솔에 출력 -->
<prop key="hibernate.format_sql">true</prop> <!--SQL 출력시, 일정한 포맷으로 보기 좋게 출력 -->
<prop key="hibernate.use_sql_comments">true</prop> <!--SQL에 포함된 주석도 출력 -->
<prop key="hibernate.id.new_generator_mappings">true</prop> <!--새로운 키 생성 전략을 사용 -->
<prop key="hibernate.hbm2ddl.auto">create</prop> <!--테이블 생성, 수정 등 DDL 구문을 자동으로 처리할지 지정 -->
</props>
</property>
</bean>
4. 트랜잭션 설정 수정 (applicationContext.xml)
DataSourceTransactionManager 클래스는 Spring JDBC나 Mybatis 이용하여 DB 연동 처리하는 트랜잭션 관리자로 JPA를 이용할 땐 JpaTransactionManager 클래스를 사용합니다.
<!-- Transaction Registration -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- Transaction Configuration -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- Transaction Advisor Configuration -->
<aop:config>
<aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allPointcut"/>
</aop:config>
5. DAO 클래스 구현
스프링과 연동시 EntityFactory에서 EntityManager를 직접 생성하는 것이 아니라 스프링 컨테이너가 제공하는 EntityManager를 사용
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;
// DAO
@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로 getBoardList() 기능 처리");
return em.createQuery("from BoardVO b order by b.seq desc").getResultList();
}
}
@PersistenceContext : 스프링 컨테이너가 관리하는 EntityManager 객체를 의존성 주입할 때 사용하는 어노테이션
6. BoardServiceImpl 클래스 수정 및 테스트
package com.springbook.biz.board.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springbook.biz.board.BoardService;
import com.springbook.biz.board.BoardVO;
@Service("boardSerivce")
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardDAOJPA boardDAO;
public BoardServiceImpl() {
}
public void insertBoard(BoardVO vo) {
// if(vo.getSeq()==0){
// throw new IllegalArgumentException("0번 글은 등록할 수 없습니다");
// }
boardDAO.insertBoard(vo);
}
public void updateBoard(BoardVO vo) {
boardDAO.updateBoard(vo);
}
public void deleteBoard(BoardVO vo) {
boardDAO.deleteBoard(vo);
}
public List<BoardVO> getBoardList(BoardVO vo) {
return boardDAO.getBoardList(vo);
}
public BoardVO getBoard(BoardVO vo) {
return boardDAO.getBoard(vo);
}
}
서버 구동시 위처럼 시퀀스, 테이블 삭제 후 재생성 과정이 이뤄집니다.
또한 새 글 등록시 시퀀스를 통해 입력할 게시글 번호 추출 및 사용자 입력 정보가 BOARD 테이블에 등록됩니다.
참고 서적 : 스프링 퀵 스타트
'SPRING FRAMEWORK' 카테고리의 다른 글
[Spring] Spring MVC Project 한글 설정 (한글 깨질 때 UTF-8로 설정하기) (0) | 2021.07.02 |
---|---|
[Mybatis] Mybatis 구조 (0) | 2021.07.02 |
TIL_210705_JPA 환경 설정 (0) | 2021.06.29 |
TIL_210705_JPA 개념 (0) | 2021.06.29 |
TIL_210629_Spring Mapper XML 파일 설정 (0) | 2021.06.29 |