파게로그

[실습] JPA in Maven project 본문

콤퓨타 왕기초/JPA

[실습] JPA in Maven project

파게 2021. 5. 27. 13:27

Spring 프레임워크 없이, 기본적인 Maven project에서 JPA를 사용해보자.

 

pom.xml

<dependencies> ​​​​<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> ​​​​<dependency> ​​​​​​​​<groupId>org.hibernate</groupId> ​​​​​​​​<artifactId>hibernate-entitymanager</artifactId> ​​​​​​​​<version>5.4.32.Final</version> ​​​​</dependency> ​​​​<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> ​​​​<dependency> ​​​​​​​​<groupId>mysql</groupId> ​​​​​​​​<artifactId>mysql-connector-java</artifactId> ​​​​​​​​<version>8.0.25</version> ​​​​</dependency> </dependencies>

 

 

Maven dependencies에 Hibernate를 추가하면, JPA 또한 자동으로 추가된다.

한편 resources 아래에 META-INF라는 디렉터리를 생성하고, persistence.xml에 다음과 같은 내용을 추가한다. 다만 Spring Boot를 사용하면 프레임워크 내부에서 동작하므로 작성할 필요는 없다.

 

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2"> ​​​​<persistence-unit name="hello"> ​​​​​​​​<properties> ​​​​​​​​​​​​<!-- 필수 속성 --> ​​​​​​​​​​​​<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> ​​​​​​​​​​​​<property name="javax.persistence.jdbc.user" value="berry"/> ​​​​​​​​​​​​<property name="javax.persistence.jdbc.password" value="straw"/> ​​​​​​​​​​​​<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa-practice-schema"/> ​​​​​​​​​​​​<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> ​​​​​​​​​​​​<!-- 옵션 --> ​​​​​​​​​​​​<property name="hibernate.show_sql" value="true"/> ​​​​​​​​​​​​<property name="hibernate.format_sql" value="true"/> ​​​​​​​​​​​​<property name="hibernate.use_sql_comments" value="true"/> ​​​​​​​​</properties> ​​​​</persistence-unit> </persistence>

 

entity가 될 클래스를 만들고 다음과 같이 클래스를 작성한다.

 

package helloJpa.entity; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Member { ​​​​@Id ​​​​private long id; ​​​​private String name; ​​​​public long getId() { ​​​​​​​​return id; ​​​​} ​​​​public void setId(long id) { ​​​​​​​​this.id = id; ​​​​} ​​​​public String getName() { ​​​​​​​​return name; ​​​​} ​​​​public void setName(String name) { ​​​​​​​​this.name = name; ​​​​} }

 

 

@Id는 PK에 달아주어야 한다. 그리고 JPA는 기본적으로 getter, setter와 constructor를 통해 동작하므로 모두 필요하다(라고 말씀하셨는데 constructor는 생성하지 않았다...)

 

다음과 같은 코드를 통해 JPA를 느껴본다. 놀랍다...

 

package helloJpa; import helloJpa.entity.Member; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class Main { ​​​​public static void main(String[] args) { ​​​​​​​​EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); ​​​​​​​​// 파라미터는 persistence.xml의 persistence-unit 값으로서 해당 설정을 이용하겠다는 것이다. ​​​​​​​​// EMF는 서버가 가동될 때 딱 한 번 생성하여 애플리케이션 전체에서 공유해야 한다. ​​​​​​​​EntityManager em = emf.createEntityManager(); ​​​​​​​​// 실제로는 비즈니스 로직의 요청이 있을 때마다 EntityManager를 생성한다. ​​​​​​​​// EM은 쓰레드 간에 공유하면 안 된다. 사용한 후 바로 버려야 한다. ​​​​​​​​EntityTransaction tx = em.getTransaction(); ​​​​​​​​// JPA에서 모든 데이터 변경은 트랜잭션 내에서 실행한다. ​​​​​​​​ ​​​​​​​​tx.begin(); ​​​​​​​​try { ​​​​​​​​​​​​Member member = new Member(); ​​​​​​​​​​​​member.setId(100L); ​​​​​​​​​​​​member.setName("스폰지밥"); ​​​​​​​​​​​​em.persist(member); ​​​​​​​​​​​​tx.commit(); ​​​​​​​​} catch (Exception e) { ​​​​​​​​​​​​tx.rollback(); ​​​​​​​​} finally { ​​​​​​​​​​​​em.close(); ​​​​​​​​} ​​​​​​​​emf.close(); ​​​​​​​​// 사실상 어플리케이션의 종료를 의미한다. ​​​​} }

 

'콤퓨타 왕기초 > JPA' 카테고리의 다른 글

JPA 내부 구조  (0) 2021.06.02
연관관계 매핑  (0) 2021.05.28
실습 3 (Mapping annotations)  (0) 2021.05.27
[실습] Mapping to DDL  (0) 2021.05.27
Why JPA?  (0) 2021.05.26
Comments