JPA의 시작

이동건 (불꽃냥펀치)·약 10시간 전
0

JPA의 동작

  • @Entity: JPA가 관리할 객체

  • @Id: 데이터베이스 PK와 매칭

  • 회원 등록, 수정 , 삭제, 수정 ,단건 조회 기능



JPQL

  • JPA를 사용하면 엔터티 객체를 중심으로 개발
  • 검색을 할 때도 테이블이 아닌 엔터티 객체를 대상으로 검색
  • 모든 데이터베이스 데이터를 객체로 변환하여 검색하는 것은 불가능
  • SQL을 추상화한 JPQL이라는 객체 지향 쿼리언어 제공
  • JPQL은 엔터티 객체를 대상으로 만들어진 쿼리문



영속성 컨텍스트

영속성 컨텍스트 의미

  • 엔터티를 영구 저장하는 환경이라는 뜻
    -EntityManger.persist(entity)
  • 영속성 컨텍스트는 논리적인 개념으로 눈에 보이지 x
  • 엔터티 매니저를 통해서 영속성 컨텍스트에 접근

엔터티의 생명주기

  • 비영속: 영속성 컨텍스트와 전혀 관계없는 새로운 상태
    • 객체를 막 생성한 상태는 비영속 상태
  • 영속: 영속성 컨텍스트에 의해 관리되는 상태
    • 객체를 생성후 저장하면 영속상태
  • 준영속: 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제

영속성 컨텍스트 장점

  • 1차 캐시를 이용
    • 객체를 영속상태로 만들면 이후 1차 캐시에서 관리 => em.find(Member.class,"member1")을 실행하면 데이터베이스가 아닌 1차 캐시에서 데이터를 탐색
    • 만약 1차 캐시에 없으면 데이터베이스에서 해당 내용을 찾은 후 그 내용을 1차 캐시에 저장
  • 동일성 보장
    • == 으로 비교해도 true 값이 나와 동일성을 보장
  • 트랜잭션을 지원하는 쓰기 지연
    • em.persist(member) 까지는 INSERT SQL을 데이터베이스에 보내지 않음
    • 커밋하는 순간 데이터베이스에 INSERT SQL 전송
  • 변경감지
  • 영속 컨텍스트 조회 후 Update라는 쿼리문을 사용하지 않고 영속 엔터티를 수정해도 변경을 감지하여 어플리케이션 내부에서 Update 구문이 전송됨
  • 지연로딩

플러시

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
  • 쓰기지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • em.flush(), transaction.commit(), JPQL 쿼리 실행을 하면 플러시가 호출
  • 플러시는 영속성 컨텍스트를 비우는 것이 아닌 영속성 컨텍스트의 변경사항을 데이터베이스에 동기화 하는 것

준영속 상태로 만드는 법

  • em.detach(entity)
  • em.clear()
  • em.close()



엔터티 매핑

@Entity

  • name
    • JPA에서 사용할 엔터티 이름을 지정
    • 기본값: 클래스의 이름을 그대로 사용

@Table

  • name : 매핑할 테이블 이름
  • schema: 데이터베이스 schema 매핑
    • create:기존 테이블 삭제후 다시 생성
    • create-drop: create와 같으니 종료시점에 테이블 DROP
    • update: 변경분만 반영
    • validate: 엔터티와 테이블이 정상 매핑되었는지 확인
    • none: 사용하지 않음
  • unique constraints: DDL 생성시에 유니크 제약조건 생성
    • @Column(nullable=false,length=10)

필드와 컬럼 매핑

@Entity
public class Member {
    @Id
    private Long id;
    
    @Column(name = "name")
    private String username;
    
    private Integer age;
    
    @Enumerated(EnumType.STRING)
    private RoleType roleType;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
    
    @Lob
    private String description;
}
  • @Column : 컬럼매핑
  • @Temporal: 날짜타입 매핑
  • @Enumerated: enum 타입 매핑
  • @Lob: BLOB,CLOB 매핑
  • @Transient: 특정 필드를 컬럼에 매핑 x

@Column

  • name: 필드와 매핑할 테이블의 컬럼이름
  • insertable/updateable: 등록 변경 가능 여부 (기본값:True)
  • nullable: null값의 허용여부
  • unique: 컬럼에 간단히 유니크 제약조건을 걸 때 사용
  • length: String 에서만 사용

@Enumerated

  • EnumType.ORDINAL: enum의 순서를 데이터베이스에 저장
  • EnumType.STRING: enum 이름을 데이터베이스에 저장

@Temporal

  • 날짜 타입을 매핑할 때 사용
  • LocalDate,LocalDateTime을 사용할 때는 생략 가능



기본키 매핑

기본키 매핑 방법

  • 직접 할당: @Id 사용
  • 자동생성(@GeneratedValue)
    • IDENTITY: 데이터베이스에 위임
    • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용
    • AUTO: 방언에 따라 자동 지정

IDENTITY 전략

  • 기본키 생성을 데이터베이스에 위임
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있음
  • IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회
profile
자바를 사랑합니다

0개의 댓글

관련 채용 정보