본문 바로가기
JPA/자바 ORM 표준 JPA 프로그래밍 - 기본편

JPA 기본 설정, JPA CRUD 기초

by hk27 2022. 2. 2.

안녕하세요. 

오늘은 JPA 기본 설정을 알아보고 JPA로 CRUD(등록, 조회, 수정, 삭제)를 해보겠습니다. 

 

JPA 기본 설정

JPA를 사용하기 위해서 두 개의 설정이 필요합니다.

 

1. 라이브러리 추가 - pom.xml 

자바 프로젝트를 Maven으로 생성하면 pom.xml 파일이 생성됩니다.

pom.xml 파일에 아래 코드를 추가합니다. 

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

 <!-- 아래 코드 복사해서 추가 -->

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

dependencies의 윗부분까지는 기본 파일에 설정되어 있고, dependencies 부분을 추가하면 됩니다.

JPA 하이버네이트와 H2 데이터베이스 라이브러리를 추가하였습니다.

 

2. JPA 설정하기 - persistence.xml

JPA를 설정하는 파일은 resources/META-INF/persistence.xml에 두면 설정 없이 JPA가 읽을 수 있습니다.

아래 코드를 복사해서 파일을 만들어주세요. 

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             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_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/ex2"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

 

JPA 구동 방식

JPA로 데이터를 관리하려면 엔티티 매니저가 필요합니다. 

엔티티 매니저 팩토리는 Persistence 클래스를 불러서 설정 정보를 조회해서 만들고,

엔티티 매니저 팩토리가 엔티티 매니저를 만듭니다. 

아래 코드처럼 사용합니다. 

public class JpaMain {
    public static void main(String args[]){

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();

        try{
            tx.begin();
            logic(em);
            tx.commit();

        } catch(Exception e){
            tx.rollback();
        } finally{
            em.close();
        }
        emf.close();
    }
}

코드에서 보이는 것처럼 엔티티매니저 팩토리, 엔티티 매니저 객체를 가져와야 JPA를 사용할 수 있습니다.

또한 EntityTransaction이 보입니다. DB의 데이터를 변경하는 모든 작업은 transaction 내에서 이루어져야 합니다.

따라서 transaction을 시작한 뒤 DB를 변경하는 logic을 수행하고 커밋합니다.

만약 오류가 발생하면 롤백합니다.

작업이 끝나면 엔티티 매니저를 종료하고, 모든 애플리케이션이 종료되면 엔티티 매니저 팩토리도 종료합니다. 

 

엔티티 만들기

다음으로 테이블에서 사용할 엔티티를 만들어보겠습니다.

@Getter @Setter
@Entity
@Table(name = "MEMBER")
public class Member {

    @Id
    @Column(name="ID")
    private String id;

    @Column(name="NAME")
    private String username;
    
    @Column(name="AGE")
    private Integer age;
    
}

멤버 엔티티를 만들어 보았습니다.

클래스 레벨에 @Entity를 붙여서 엔티티로 등록하고, @Table 어노테이션의 name 속성으로 테이블의 이름을 지정할 수 있습니다. 

@Id를 붙인 필드가 pk로 사용되고, @Column어노테이션으로 컬럼의 이름을 지정할 수 있습니다.

@Column 어노테이션을 생략해도 모든 필드가 컬럼으로 테이블에 저장되고, 컬럼의 이름은 필드명과 같습니다.

저는 모두 대문자로 사용하기 위해서 이름을 지정하였습니다.

 

CRUD

다음으로 JPA로 CRUD를 해보겠습니다.

JPA에서는 간단한 CRUD 작업을 지원합니다. 

등록: em.persist(member)

수정: X

조회: em.find(Member.class, id)

삭제: em.remove(member)

수정은 지원하지 않습니다. 객체를 수정하면 자동으로 DB가 변경됩니다. 

 

예시 코드를 봅시다. 

    private static void logic(EntityManager em){
        String id = "id1";
        Member member = new Member();
        member.setId(id);
        member.setUsername("JPA");
        member.setAge(20);

        // 등록
        em.persist(member);

        // 수정
        member.setAge(30);

        // 단건 조회
        Member findMember = em.find(Member.class, id);
        System.out.println("findMember.getUsername() = " + findMember.getUsername());

        // 목록 조회
        List<Member> members = em.createQuery("select m from Member m", Member.class)
                .getResultList();
        System.out.println(members.size());

        // 삭제
        em.remove(member);

    }

출력 결과

findMember.getUsername() = JPA
1

 

목록 조회의 쿼리는 SQL이 아닌 JPQL입니다. SQL처럼 테이블을 대상으로 쿼리를 하는 것이 아니라, 객체를 대상으로 쿼리합니다. 두 개 이상의 데이터를 조회할 때는 JPQL을 사용합니다.

 

인프런  '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의를 듣고 공부하며 정리한 자료입니다. 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

참고 자료

자바 ORM 표준 JPA 프로그래밍 - 기본편, 섹션 2. JPA 시작하기 https://www.inflearn.com/course/ORM-JPA-Basic

김영한, 자바 ORM 표준 JPA 프로그래밍, 에이콘출판(2015), pp.74-88.

 

댓글