일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 스프링 부트
- Write Concern
- JPA
- Java
- spring boot
- 스프링
- 코드프레소
- Spring Framework
- NoSQL
- 읽기 고려
- mongoDB
- java spring framework
- aws
- AWS 자격증
- AWS Developer
- 몽고디비
- 위치 기반 쿼리
- Code Presso
- 자바
- EC2
- 쓰기 고려
- 대용량 아키텍처와 성능 튜닝
- Text Index
- 스프링 프레임워크
- Amazon Web Service
- 조대협
- STS
- Jenkins
- Spring
- iam
- Today
- Total
개발과 기록의 조화
[Spring Boot] JPA 연동 - JPA 기본 설정 본문
해당 게시물은 학습 및 기록 목적으로 작성되었습니다. 사실과 다른 내용이 있을 수 있으며, 오류가 있거나 궁금한 점은 댓글이나 dlaudtjr07@gmail.com 으로 메일 주시면 감사하겠습니다.
해당 게시물은 이전의 글과 이어집니다.
3. [Spring Boot] 아주 간단한 웹 애플리케이션 예제 작성
4. [Spring Boot] JPA 연동 - 개념 이해하기
프로젝트 생성
Spring Boot에 JPA를 적용하기에 앞서, JPA의 기본 설정 구성이 어떤 방식으로 이루어져 있는지, 코드상으로 어떤 방식으로 동작하는지 알아보도록 합시다.
우선 Maven Project를 생성하도록 합시다.
그림-1 부터 그림-4 까지 그대로 쭉 따라오면 됩니다. 특별하게 신경 쓸 부분은 없고 id와 패키지 경로만 잘 설정해 주도록 합시다.
생성이 완료되었으면 그림-5부터 그림-7까지 설정을 완료해 주도록 합시다. 라이브러리 버전 변경과 JPA프로젝트로 변환하기 위한 절차이므로 필수적으로 해 주어야 합니다. 그림-7 그림의 Runtime 부분의 자바 라이브러리 버전은 jdk1.8 버전을 설치해 주도록 합시다. (jdk 1.8 다운로드 링크)
다음은 퍼스펙티브를 바꿔 주는 작업입니다.
JPA 퍼스펙티브로 변경 후 , 의존성 라이브러리를 다운로드하도록 합시다.
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ms</groupId>
<artifactId>JPAPractice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>JPAPractice</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- JPA , Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.1.0.Final</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
</project>
JPA 구현체는 기본적으로 Hibernate를 사용할 예정이므로, Hibernate 의존성을 추가하고, 필자는 MySQL DB를 사용할 예정이기 때문에 MySQL 라이브러리도 추가했습니다.(DB는 자기가 원하는 DB를 사용)
프로젝트 설정은 끝났고, 다음은 기본 테이블을 만들어야 하는데 JPA의 기능 중 하나는 자바 클래스 기준으로 테이블을 자동 매핑해 생성하는 것입니다. 여기서 매핑되는 자바 클래스를 ‘엔티티(Entity)’라고 부릅니다. 엔티티가 가장 기본적으로 만들어야 할 요소입니다.
src/main/java에 com.ms.entity 패키지를 생성, 패키지 안에 Board를 생성하도록 합시다. 하지만 기본적인 생성 방법이 아닌, JPA Entity 파일을 통해 생성할 것입니다.
com.ms 패키지에 JPA Entity를 생성해 보도록 합시다.
Java Package 부분에 com.ms.entity 경로를 작성, Class name엔 Board를 작성 후 파일을 생성하면,JPA Content 하단 persistence.xml 파일에 Board 엔티티 클래스가 자동으로 설정되어져 있는 것을 확인할 수 있습니다.
<?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="JPAPractice">
<class>com.ms.entity.Board</class>
</persistence-unit>
</persistence>
다음은 Board 엔티티 클래스를 작성해 보도록 합시다.
package com.ms.entity;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Entity implementation class for Entity: Board
*
*/
@Entity
@Table(name = "BOARD")
public class Board {
@Id
@GeneratedValue
private Long seq;
private String title;
private String writer;
private String content;
private Date createDate;
private Long cnt;
public Long getSeq() {
return seq;
}
public void setSeq(Long 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 getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Long getCnt() {
return cnt;
}
public void setCnt(Long cnt) {
this.cnt = cnt;
}
@Override
public String toString() {
return "Board [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content
+ ", createDate=" + createDate + ", cnt=" + cnt + "]";
}
}
엔티티 클래스에 관련된 어노테이션은 아래와 같습니다.
@Id
기본 키 매핑 어노테이션. 필수 항목입니다.
@GeneratedValue
id가 선언된 필드에 기본 키 값을 자동으로 할당합니다. (Default : AUTO)
GeneratedValue는 strategy와 generator 속성으로 구분됩니다.
strategy
AUTO : DB에 맞게 자동 생성합니다.
TABLE : 별도 Key를 생성하는 테이블을 이용, @TableGenerator가 필요합니다.
SEQUENCE : DB의 시퀀스를 이용(Oracle이 주로 이용함) , @SequenceGenerator가 필요합니다.
IDENTITY : 기본 키 생성 방식 자체를 DB에게 위임합니다.
generator
@TableGenerator,@SequenceGenerator 어노테이션에서 명시된 PK 생성사를 재사용할 때 쓰입니다.(Default : "")
@Column
컬럼명을 따로 정하거나 사이즈, 제약조건을 추가할 때 사용됩니다.
@Table
클래스 선언부에 작성, 테이블명을 정해줍니다. 미지정 시 클래스 명으로 생성됩니다.
@Entity
해당 클래스 인스턴스 변수들이 Entity임을 명시합니다.
다음은 JPA 메인 설정 파일인 persistence 파일의 환경 설정을 해 보도록 합시다.
<?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="Chapter04">
<class>com.ms.entity.Board</class>
<properties>
<property name ="javax.persistence.jdbc.driver" value = "com.mysql.cj.jdbc.Driver"></property>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
<property name="hibernate.dialect" value = "org.hibernate.dialect.MySQL5Dialect"/>
<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>
xml 파일 내 properties 태그 내부 상단에는 jdbc 커넥션 설정들이 정의되어져 있습니다. 하부에는 영속성 유닛을 설정하기 위한 코드들이 정의되어져 있는데, 그 중 hibernate.dialect 속성은 JPA가 사용할 클래스를 설정합니다. 필자는 MySQL 5버전 이상을 사용하기 때문에 MYSQL5Dialect를 사용하는 것입니다. 그 아래 속성들은 다음 게시물에 작성할 JPA 세부 설정에서 배워 보도록 하겠습니다.
package com.ms;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.ms.entity.Board;
public class JPAClient {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAPractice");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
/*
tx.begin();
Board board = em.find(Board.class, 2L);
board.setCnt(3L);
System.out.println("--->" + board.toString());
em.persist(board); tx.commit();
*/
tx.begin();
Board board = new Board(); board.setTitle("Title"); board.setWriter("Admin");
board.setContent("Hello , JPA !"); board.setCreateDate(new Date());
board.setCnt(0L); em.persist(board); tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
src/main/java에 JPAClient라는 JPA 테스트 파일을 생성했습니다.
JPA는 스프링 부트의 application.properties 파일처럼 persistence.xml 파일을 가장 먼저 로드한 후, 내부에 정의되어져 있는 영속성 클래스 정보를 이용해 EntityManagerFactory를 객체를 생성합니다.
JPA로 CRUD 기능을 수행하기 위해선 EntityManagerFactory가 선언하는 EntityManager를 이용해야 합니다. 이 매니저를 이용해 CRUD 기능을 이용하는 것입니다. 그리고 또 중요한 것은 , JPA가 CRUD 작업을 처리하기 위해서는 트랜잭션 내부에서 수행되어야 한다는 것입니다. 실제로 코드에도 tx라는 변수에 EntityTransaction을 추가한 것을 볼 수 있습니다.
해당 코드를 실행하면 DB에 데이터가 저장된 것을 볼 수 있습니다.
그리고, 한번 테이블이 만들어지면, persistence.xml의 hibernate.hbm2ddl.auto 설정을 update로 변경해 주도록 합시다. 계속 create 상태라면 실행 때마다 테이블을 삭제하고 재생성하는 일이 반복됩니다. update로 바꾸고 여러번 실행 후 DB를 확인하면 테이블이 재생성되지 않고 데이터가 누적되는 것을 볼 수 있습니다.
저장된 데이터를 검색해 봅시다.
package com.ms;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.ms.entity.Board;
public class JPAClient {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAPractice");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
Board searchBoard = em.find(Board.class,1L);
System.out.println("Result = " + searchBoard.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
em.close();
emf.close();
}
}
}
1번 게시물에 대해 검색을 할 때 , find()메소드로 검색을 시도해 보면 콘솔창 내에 잘 뜨는 것을 확인할 수 있습니다.
해당 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.
'Web Framework > Java Spring Framework' 카테고리의 다른 글
[Issue Tracking] STS,Eclipse ANSI Console 렉 유발 이슈 (0) | 2020.03.04 |
---|---|
[Spring Boot] application.Properties 파일 분리해서 jar 파일 실행 (0) | 2020.03.03 |
[Spring Boot] JPA 연동 - 개념 이해하기 (0) | 2020.02.02 |
[Spring Boot] 아주 간단한 웹 애플리케이션 예제 작성 (0) | 2020.02.01 |
[Spring Boot] 프로젝트 구조 (0) | 2020.02.01 |