Spring Boot/Spring Boot JPA-기본편 강의 정리(김영한)

[SpringBoot-JPA 기본편] 자바 ORM 표준 JPA 프로그래밍 - 기본편: 2. JPA 시작

조찬국 2024. 2. 23. 21:24
728x90

 

강의 출처:https://www.inflearn.com/course/ORM-JPA-Basic#curriculum

해당 강의는 Inflearn에 등록된 김영한님의 Spring Boot 강의입니다.

JPA 활용편과 겹치는 내용이 있는데 그 부분은 JPA 활용편 카테고리에서 정리 하겠습니다.(ex: 도메인 설계)
(+a, 기본편은 유일하게 Maven으로 JPA 설정하는 방법입니다. 실제 회사는 Gradle,Maven 둘 다 사용하니 두개 다 설정하는 방법에 대해서 알아두면 좋을 것 같습니다!)

1. Hello JPA - 프로젝트 생성(Maven 생성 방법)

1. intelli J에서 프로젝트 생성

2. 아래 사진과 같이 프로젝트 생성

new project 창(ex1-hello-jpa,jpa-basic)

3. jpa-basic 패키지는 지우자.

4. helloJpa 라는 패키지에 JpaMain 클래스와 main함수 생성

5. resources/에 'META-INF' 라는 `디렉토리`에 persistence.xml 파일 생성 (반드시 해당 경로와 이름으로 xml파일을 생성해야 합니다!!)

코드

<?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="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="sa"/>
            <property name="jakarta.persistence.jdbc.password" value=""/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <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"/>
            <!-- 데이터베이스 스키마를 자동으로 생성, 업데이트, 유지 또는 삭제하는 방법을 지정
            create: 시작할 때마다 데이터베이스 스키마를 새로 생성합니다. 이미 존재하는 경우에는 삭제 후 재생성.
                -->
            <property name="hibernate.hbm2ddl.auto" value="create" />

        </properties>
    </persistence-unit>

</persistence>

6. pom.xml을 통해 라이브러리 추가

코드

<?xml version="1.0" encoding="UTF-8"?>
<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>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.4.2.Final</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>

        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.2.224</version>
        </dependency>
    </dependencies>

</project>

위의 여우 모양 캐릭터 클릭하면 라이브러리 설치를 진행한다.

7. H2데이터 베이스는 그냥 전에 설정한 스프링 입문에서 쓴거 그대로 쓰면 된다.(JPA 활용편에서 완전히 새로운 H2 DB 생성 예정이다.)

2. Hello JPA - 애플리케이션 개발

JPA 구동 방식

위의 구동방식을 한번 JpaMain 클래스의 main함수에서 실행해보자.

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

        // EntityManagerFactory를 생성,
        // "hello"는 persistence.xml 파일에 정의된 persistence unit의 이름
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // EntityManager를 EntityManagerFactory를 통해 생성.
        // EntityManager는 JPA의 핵심 객체로 데이터베이스와의 트랜잭션을 처리.
        EntityManager em = emf.createEntityManager();
        //code
        /*여기서부터는 데이터베이스와의 상호작용 코드를 작성.
         데이터베이스에서 데이터를 조회하거나 저장하는 등의 작업을 수행.
        */
        //JPA는 항상 Transation내에서만 실행
        EntityTransaction tx= em.getTransaction();
        tx.begin(); //transaction 시작

       try
       {

           //회원저장,회원 조회(조건이 있는), 회원 수정, 회원 삭제 등을 실행

        tx.commit();
       } catch(Exception e)
       {
               tx.rollback(); //오류시 롤백
       }
       finally{
           em.close();  //다 끝나면 무조건 닫기
       }
       emf.close();

위 이미지 같은 뼈대는 콘틀롤러에서 수행하는데 이 뼈대를 잘 기억하자.

여기서 EntityManager가 제일 중요한데 JPA의 핵심 객체데이터베이스와트랜잭션을 처리한다.

한마디로 entity 매니저를 통해 객체를 영속성 콘텍스트에 집어 넣고 조회할때 db에서 갖고 오는 중요한 역할을 한다.

여기서 주의 할점은 JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다는 것이다.

지난 시간 CRUD에 대해서 사진으로 잠깐 언급한 적이 있다.

 

위 방법과 틀을 토대로 실습을 진행해보자.

1. 저장 실습

다음 코드를 try문 안에 넣고 실행 해보자. 등록이므로 persist메서드를 사용했다.

/* 회원 등록  */
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);

위 코드를 보면 회원 객체에겐 두가지 속성이 있다. id,namesetting해서 그 값을 영속성 컨텍스트에 저장했다.

콘솔창에서 자동으로 쿼리문을 생성하여 db에 보냈음을 확인.

2. 조회 실습(저장하고)

코드

/*회원 단건 조회 */
Member findMember= em.find(Member.class,1L); //id가 1인 멤버 찾기
System.out.println("findMember.id= "+findMember.getId());
System.out.println("findMember.name= "+findMember.getName());

3. 삭제 실습 (저장하고)

/*id가 1인 회원 삭제*/
Member findMember= em.find(Member.class,1L); //id가 1인 멤버 찾기
em.remove(findMember);//해당멤버 삭제

4. 수정 실습 (저장하고)

/*수정 (id=1인 멤버 이름 수정)  */
Member findMember= em.find(Member.class,1L); //id가 1인 멤버 찾기
findMember.setName("HelloJPA");

위의 실습들을 통해 jpa로 회원을 등록하고, 단건 조회하고, 삭제, 수정하는 방법을 배웠다.

여기서 수정시 객체를 다시 persist안하였다. 일반적인 사고로는 값을 수정하고 수정내용을 다시 영속성 콘텍스트에 집어넣는게 일반적일 것이다. 그러나 그냥 update문이 날라갈 수 있었던 이유는 JPA의 영속성 관리와 관련이 있다.

 

다음 링크는 예전에 입문편에 포스팅 한 내용이다. 성능 측정시 두번째 조회가 더 빠른이유에 대해서 설명을 다음과 같이 했다.

https://changuk0308.tistory.com/8

다음 장에는 영속성 관리에 대해서 위의 실습들이 왜 저렇게 되는지 설명하겠다.

 

728x90