JPA_Chap01_JPA 시작

윤일권·2023년 4월 11일
0

JPA

목록 보기
2/11

저번 포스팅에 이어서 이번에 JPA를 시작하고, 환경 설정하는 chapter를 포스팅하려합니다.
해당 포스팅은 JPA설정하는 부분에 대해서는 하나하나 올리진 않고, 관련 내용만 포스팅할 예정입니다.
참고바랍니다!!

JPA 시작

라이브러리와 프로젝트 구조

JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리

  • hibernate-core : 하이버네티트 라이브러리
  • hibernate-entitymanager : 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준 라이브러리
  • hibernate-jpa-2.1-api : JPA 2.1 표준 API를 모아둔 라이브러리

객체 매핑 시작

JPA 어노테이션의 패키지 : javax.persistence

  • @Entity
    • "클래스를 테이블과 매핑한다."라고 JPA에게 알려줌.
    • 이런 클래스를 엔티티 클래스라고 한다.
  • @ Table
    • 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
    • 해당 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
  • @Id
    • 엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다.
  • @Column
    • 필드를 컬럼에 매핑
  • 매핑 정보가 없는 필드
    • 매핑 어노테이션을 생력하면 필드명을 사용해서 컬럼명을 매핑한다.
    • 만약 대소문자를 구분하는 데이터베이스 사용시, 명시적으로 매핑해야한다.

persistence.xml 설정

JPA는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다.
이 설정 파일이 META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.

  • 이름이 javax.persistence로 시작하는 속성은 JPA 표준 속성으로 특정 구현체에 종속되지 않는다.
  • hibernate로 시작하는 속성은 하이버네이트 전용 속성이므로 하이버네이트에서만 사용할 수 있다.

데이터베이스 방언

JPA가 데이터베이스에 종속적이지 않아 여러 데이터베이스를 손쉽게 교체할 수 있지만!!!
문제점은 존재한다.
데이터 타입, 다른 함수명, 페이징 처리 등이 있다.
이렇게 SQL 표준을 지키지 않거나, 특정 데이터베이스만의 고유한 기능을
JPA에서는 방언(Dialect)라고 한다.

그렇다면 이러한 문제 해결은 어떻게 할까?
-> 이를 위해 다양한 데이터 베이스 방언 클래스를 제공한다.
애플리케이션 코드를 변경할 필요없이 하이버네이트가 제공하는 데이터 베이스 방언만 교체하면 된다.

  • H2 : or.hibernate.dialect.H2Dialect
  • 오라클 10g : or.hibernate.dialect.Oracle10gDialect
  • MySQL : or.hibernate.dialect.MySQL5InnoDBDialect

애플리케이션 개발

애플이케이션을 시작하는 코드는 크게 3가지로 나뉜다
우리는 3가지를 차례롤 알아보자
엔티티 매니저 설정, 트랜젝션 로직, 비즈니스 로직

엔티티 매니저 설정

-> 엔티티 매니저 생성 과정

  • 엔티티 매니저 팩토리 생성
    • JPA를 시작하려면 우선 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리 생성
    • 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
  • 앤티티 매니저 생성
    • 엔티티 매니저 팩토리에서 앤티티 매니저 생성
    • 대부분의 JPA기능을 제공
    • 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 crud할 수 있다.

트랜잭션 관리

  • JPA를 사용하려면 항상 트랜잭션 안에서 데이터를 변경해야한다. -> 그러지 않으면 예외 발생
  • 트랜잭션 API를 사용해서 비즈니스 로직 정상 작동 -> commit
  • 예외 발생 -> rollback

비즈니스 로직

  • 엔티티 매니저를 통해 CRUD작업
  • 등록
    • 엔티티 저장 -> 엔티티 매니저의 persist() 메소드에 저장할 엔티티를 넘겨준다.
  • 수정
    • 단순히 엔티티의 값만 변경
  • 삭제
    • 엔티티 삭제 -> 엔티티 매니저의 remove() 메소드에 삭제하려는 엔티티를 넘겨준다.
  • 한 건 조회
    • find()메소드 -> 조회할 엔티티 타입과 @Id로 데이터베이스 테이블의 기본키와 매핑한 식별자 값으로 엔티티 하나를 조회.

JPQL

-> 하나 이상을 조회

  • 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 검색 조건이 포함된 SQL을 사용해야 하지만 JPQL이라는 쿼리 언어로 이를 해결
  • SQL과 다른점
    • JPQL은 엔티티 객체를 대상으로 쿼리
    • SQL은 데이트베이스 테이블을 대상으로 쿼리
  • 데이터베이스 테이블을 전혀 알지 못한다.
profile
생각하는 개발자가 되겠습니다!!

0개의 댓글