programming study/B-JPA

JPA 기초지식

gu9gu 2023. 1. 4. 00:43

출처 - [Spring/JPA] JPA 기초지식 (tistory.com)

 

위 글은 김성렬 교수님의 KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다. http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45

 

스프링과 JPA를 이용한 웹개발

본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다.

www.kocw.net

 

 

Persistence.xml

<persistence-unit name="playground" transaction-type="RESOURCE_LOCAL">
  • a box holding all the needed information for creating an EntityManagerFactory instance
  • JPA 설정을 구별하는 구별자
  • 일반적으로 연결한 데이터베이스당 하나의 영속성 유닛을 등록
  • 실제 개발에서는 여러 개의 DB를 사용할 수 있음 (ex: 테스트 DB, 운영 DB)
    • 여러 개가 될 수 있음 (하나의 데이터베이스를 지칭)

 

<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
<property name="javax.persistence.jdbc.url" 
 value="jdbc:mysql://localhost:3306/jpa_playground?serverTimezone=UTC" /> 
 <property name="javax.persistence.jdbc.user" value="kim" /> 
 <property name="javax.persistence.jdbc.password" value="sungryulKim12" />
  • JPA 표준 속성: 데이터베이스 연동 및 접속에 필요한 정보 입력
    • driver: JDBC 드라이버
    • url: 데이터베이스 접속 ID
    • user: 계정
    • password: 비밀번호

 

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" /> 
<property name="hibernate.show_sql" value="true" /> 
<property name="hibernate.format_sql" value="true" /> 
<property name="hibernate.use_sql_comments" value="true" />
  • Hibernate 전용 속성
    • dialect: 사용할 방언
      • MySQL Dialect는 종류가 많음! 버전과 같게 사용...
    • show_sql: JPA가 실행하는 sql 보기
      • JPA가 실제로는 JDBC 프로그래밍을 통해 SQL을 날리게 되는데 이 때 무슨 SQL을 사용했는지 확인 가능
    • format_sql: sql을 formatting하여 보기 좋게
    • use_sql_comments: 실행되는 sql 설명 보기

 

  • 방언

📌 ANSI SQL을 사용하는 이유: 표준을 사용하면 동일한 SQL 사용 가능 (JPA의 dialect로 문제 해결)

 

 

서버 엔진과 저장 엔진

 

 


어노테이션

Annotation Package Detail/Import statement
@Entity import javaex.persistence.Entity;
@Table import javaex.persistence.Table;
@Column import javaex.persistence.Column;
@Id import javaex.persistence.Id;
@GenetateValue import javaex.persistence.GeneratedValue;
@Version mport javaex.persistence.Version;
@OrderBy import javaex.persistence.OrderBy;
@Transient import javaex.persistence.Transient;
@Lob import javaex.persistence.Lob;
  • 관리하는 대상에게 알려주는 이름표와 같은 역할
  • 예전에는 XML 형식, 현재는 어노테이션 형식을 주로 사용

 

  • @Entity
    • 정의한 클래스가 영속성 컨텍스트(인스턴스 관리를 하는 주체)에서 관리될 엔티티임을 나타냄
    • 엔티티가 있어야 JPA가 제공하는 기능이 유의미해짐
  • @Table
    • 엔티티와 매핑되는 테이블을 지정
    • 특히, 엔티티명과 테이블명이 다를 경우 이름을 지정
  • @OrderBy
    • 정렬 수행
  • @Transient
    • 테이블의 컬럼에는 매핑되지 않지만 비즈니스 로직 수행 등의 이유로 유지해야 하는 상태 (값)가 있을 경우
  • @Temporal
    • Date, LocalDateTime과 같은 시간 관련 데이터형에 적용
    • 안붙여줘도 됨 (LocalDateTime을 사용하면 시간 데이터를 쓰는걸 알기 때문)
  • @Column
    • 컬럼의 세부 속성을 정의
    • @Column의 세부 속성 (DDL의 constraint를 걸어주는 것과 유사)
      • name: 컬럼명
      • length: 문자열에 대하여 길이 지정
      • nullable: null 허용 여부
      • unique: 유일성
  • @Id
    • 해당 필드를 식별자(PK) 컬럼에 매핑

직접 할당: getter/setter

자동 생성: PK를 자동으로 생성되는 값으로 관리 (MySQL: auto increment)

 

  • @GeneratedValue
    • 식별자를 직접 할당하지 않고 자동으로 생성
    • 값을 생성하는 방식
      • Identity
      • Sequence
      • Table
      • Custom
      • Auto: 방언에 따라

 

  • IDENTITY Generation
    • MySQL의 Auto Increment에 해당
@Entity
public class Movie {
@Id 
@GeneratedValue (strategy = GenerationType.IDENTITY) 
private long movieId;
}

 

  • SEQUENCE Generation
    • 오라클의 Sequence 사용에 대응
    • 데이터베이스의 Sequence 객체 사용

 

 

예시

  • AUTO-DDL
    • none: No change to the database structure
    • update: Hibernate changes the database according to the given Entity structures
    • validate: If schema is changed, terminating application
    • create: Creates the database every time, but don’t drop it when close
    • create-drop: Creates the database then drops it when the SessionFactory closes

 

 

엔티티 사용시 주의사항

  •  JPA가 엔티티 객체를 생성할 때, 기본 생성자를 사용 ➡️ 기본 생성자 필수
    • (Caused by: org.hibernate.InstantiationException: No default constructor for entity)
    • 자바에서는 기본 생성자가 없더라도 자동 생성되지만 사용자가 argument 생성자를 만들면 기본
      생성자를 명시해야 함
    • public 또는 protected 생성자 필요
    • final 클래스, enum, interface, inner 클래스에는 사용할 수 없음
    • 저장할 필드에 final을 사용하면 안됨(상속이 가능한 형태로 클래스를 정의해라)