[JPA] 2장. JPA 시작

이동엽·2023년 2월 25일
0

jpa

목록 보기
2/8

2.1 이클립스 설치와 프로젝트 불러오기 → 생략
2.2 H2 데이터베이스 설치 → 생략

🔥 2.3 메이븐과 사용 라이브러리 관리

메이븐(Maven)이란?

  • 라이브러리를 관리해주는 도구로, 빌드 기능도 함께 제공한다.
  • porm.xml에 있는 <dependencies> 에 사용할 라이브러리를 지정하면 자동으로 라이브러리를 내려받는다.

🌱 현재는 그레이들(Gradle)이 등장하여, 메이븐에서 그레이들로 넘어가는 추세이다.



🔥 2.4 객체 매핑 시작

  • 회원 테이블
    CREATE TABLE MEMBER (
        ID VARCHAR(255) NOT NULL, --기본키
        NAME VARCHAR(255),
        AGE INTEGER,
        PRIMARY KEY (ID)
    )
  • 회원 클래스
    @Entity
    @Table(name = "MEMBER")
    public class Member {
    
        @Id
        @Column(name = "ID")
        private String id;
    
        @Column(name = "NAME")
        private String username;
    
        //매핑 정보가 없는 필드
        private Integer age;
    }

@Entity

  • 이 클래스를 테이블과 매핑한다고 JPA에게 알려준다.
  • 이 어노테이션이 있으면 엔티티 클래스이다.

@Table

  • 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
  • name 속성을 이용해 Member Entity를 MEMBER 테이블에 매핑했다.

@Id

  • 엔티티 클래스의 필드를 테이블의 기본키에 매핑한다.
  • 이 어노테이션이 붙은 필드를 식별자 필드라 한다.

@Column

  • 필드를 컬럼에 매핑한다.

매핑 정보가 없는 필드

  • 이렇게 어노테이션을 생략하면 필드명을 사용해 컬럼명으로 매핑한다.


🔥 2.5 persistence.xml 설정

JPA는 persistence.xml을 사용해 필요한 설정 정보를 관리한다.


데이터베이스 방언

JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. → 다른 DB로 손쉽게 교체 가능!

  • 다만, 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르다는 문제점이 있다.
    • ex) MySQL에선 VARCHAR이 오라클에선 VARCHAR2를 사용한다.
    • 이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에선 방언이라 한다.

🔥 2.6 애플리케이션 개발

JPA 애플리케이션을 개발해보자.

  • 시작 코드
    public class JpabookApplication {
    
    	public static void main(String[] args) {
    
    		//엔티티 매니저 팩토리 - 생성
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
    		//엔티티 매니저 - 생성
    		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();       //엔티티 매니저 팩토리 - 종료
    	}
    
    	private static void logic(EntityManager em) {	}
    
    }

위 코드는 크게 3부분으로 나뉘어 있다.

  • 엔티티 매니저 설정
  • 트랜잭셔 관리
  • 비즈니스 로직

엔티티 매니저 설정

엔티티 매니저 팩토리 생성

  • JPA를 시작하려면? → persistence.xml의 설정 정보를 이용해 엔티티 매니저 팩토리를 생성
`EntityManagerFactory emf = Persistence.*createEntityManagerFactory*("jpabook");`
  • JPA를 동작시키기 위한 기반 객체를 만들고, JPA 구현체에 따라서는 DB 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.
    • → 따라서 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해 사용해야 한다.

엔티티 매니저 생성

  • JPA의 기능 대부분은 엔티티 매니저가 제공한다.
`EntityManager em = emf.createEntityManager();`
  • 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
  • 참고로 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안 된다.


종료

  • 마지막으로 사용이 끝난 엔티티 매니저는 아래처럼 반드시 종료해야 한다.
    • em.close();
  • 애플리케이션을 종료할 때 엔티티 매니저 팩토리도 아래처럼 종료해야 한다.
    • emf.close();


트랜잭션 관리

  • JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다.
    • 트랜잭션 없이 데이터를 변경하면? → 예외 발생!
    • 따라서 트랜잭션을 시작하려면? EntityManager로부터 트랜잭션 API 받아오기
      //트랜잭션 - 획득
      EntityTransaction tx = em.getTransaction();
      
      try {
        tx.begin();    //트랜잭션 - 시작
      	logic(em);     //비즈니스 로직 실행
      	tx.commit();   //트랜잭션 - 커밋    -> 정상 동작 시!
      } catch (Exception e) {
      	tx.rollback(); //트랜잭션 - 롤백    -> 예외 발생 시!
      }


비즈니스 로직

  • 엔티티 매니저를 이용한 CRUD

    • 출력 결과
      findMember=지한, age=20
      members.size=1


JPQL

  • 하나 이상의 회원 목록을 조회하는 코드
    //목록 조회
    List<Member> members = em.createQuery("select m from Member m", Member.class)
    				                .getResultList();
    System.out.println("members.size = " + members.size());

  • JPA를 사용하면 엔티티 객체를 중심으로 개발하고 데이터베이스에 대한 처리는 JPA에 맡겨야 한다.
    • 따라서 이전 예제에서 등록, 수정, 삭제, 한 건 조회를 보면 SQL을 사용하지 않았다.
    • 단, 문제는 검색 쿼리! → 검색을 할 때 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다!
      • JPA는 JPQL(Java Persistence Query Language)라는 쿼리 언어로 이 문제를 해결한다.


JPQL은 SQL과 문법이 거의 유사하지만, 가장 큰 차이점은 아래와 같다.

  • JPQL은 엔티티 객체를 대상으로 쿼리한다. → 쉽게 말해 클래스와 필드를 대상으로 쿼리!
  • SQL은 데이터베이스 테이블을 대상으로 쿼리!


🔥 정리

JPA를 사용해 객체 하나를 테이블에 등록/수정/삭제/조회를 해보았다.

  • JPA 덕분에 코드량이 많이 줄어들고, SQL을 작성할 필요도 없었다!
  • 다음은 JPA의 핵심 기능인 영속성 관리에 대해 알아보자.
profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

0개의 댓글