Spring Boot - JPA 1

UnKnown12·2022년 12월 2일
0

Spring Boot

목록 보기
3/13

📌 JPQL

Java Persistence Query Language

  • [자바객체대상쿼리] - JPA 에서 사용하는 SQL문법,
    테이블이 아닌, [ 엔티티 객체 ] 를 대상으로 검색하는 객체지향 쿼리이다.
  • JPA 가 어떤 DB 환경이여도 JPA 의 DB 방언을 통해
    테이블 의 DDL 작업이 가능하다

📌 영속성 컨텍스트

  • JPA 를 이해하는데 가장 중요한 용어

  • 객체의 엔티티들을 영구히 저장하는 환경

    📌 @Entity

    객체와 테이블의 매핑 관계

  • @ Entity 가 붙은 클래스는 JPA가 관리 한다는 의미
    JPA 영역안에 있는 Class 와 jpa 테이블과 매핑할 때
    @Entity 어노테이션을 필수로 생성해야한다.

  • 기본 생성자 는 정의는 필수 ( Java Class 가 알아서 하긴함 )
    ex) enum, interface 같은 클래스는 @Entity 어노테이션이 사용불가능하다.

  • 전역 필드에 final 키워드를 사용할 수 없다.
    ( 전역에서 활용해야 하기 때문 )

  • 속성 name
    JPA 에서 사용할 Entity 이름
    ( 기본값으로 하는 것을 권장 )

📌 Entity - 수정변경 감지

+ 영속 상태 : jpa 에 속한 상태

-flush()가 호출되는 시점에 Entitiy 와 스냅샵을 전부 비교 후 
변경이 된 것을 감지 (Dirty Checking ) 한 후에 
update 쿼리를 작성 후 , update 쿼리를 넘긴다. 
	tx.begin()

    // 영속 엔티티 조회 
    member memberA = new em.find( Member.class , "MemberA");

    memberA.setUsername(" 테이블에 설정할 이름 ) ;
   	memberA.setAge(10);

    //em.update(member);


    tx.comit();

📌 Entity - 삭제

	Member memberA = em.find(Member class , "memberA");

    // Member 데이터 테이블에서 memberA 를 조회후 삭제 
    em.remove(memberA);

📌 Flush - 플러시

  • 영속성 컨텍스트의 변경내용을 DB 에 반영시키는 것 ( DB 적용 )

플러시 발생 경우

  • 변경 감지된 경우
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록할 경우
  • 쓰기 지연 SQL저장소의 쿼리를 DB에 전송할 경우

플러시 사용방법

영속성 컨텍스트를 플러시하는 방법

  • em.flush() : 직접호출
  • 트랜잭션 커밋 : 플러시 자동 호출
  • JPQL 쿼리실행 : 플러시 자동 호출

📌 준 영속 상태

  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리

  • 비 영속 -> 영속 -> 준 영속
    순서로 이동한다

  • 영속 상태와 달리
    영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.

  • em.detach(entity)
    특정 엔티티만 준 영속상태로 전환시키는 메소드
  • em.clear()
    영속성 컨텍스르르 완전히 초기화
  • em.close()
    영속성 컨텍스트를 종료**

📌 엔티티 매핑 소개

객체와 테이블 매핑 : @Entity, @table

=테이블 명을 바꾸고 싶을 때 사용

필드와 컬럼 매핑 : @ Column

기본키 매핑 : @Id

연관관계 매핑 : @ManyToOne, @JoinColumn

📌 @Table

  • 해당 엔티티 와 매핑 할 DB 테이블을 지정하는 어노테이션

@Table 속성값

  • name

매핑할 테이블의 이름

  • catalog

데이터베이스의 catalog 매핑

  • schema

데이터베이스의 스키마 매핑

  • DDL ( uniqueConstraints / 특정 제약조건 )

DDL 생성시 , 특정 제약조건을 명시할 때 사용

📌 DB 자동생성

  • DDL 을 애플리케이션 실행 시점에
    테이블 자동생성 한다는 것은 테이블 중심 개발에서
    객체 중심 개발 로 하겠다는 의미
    ( 테이블 중심 개발 -> 객체 중심 개발 )

  • DB 방언을 활용해서 DB에 맞는 적절한 DDL 을 생성한다

📌 hibernate.hbm2ddl.auto 옵션

xml 에서 value 값으로 옵션 설정을 할 수 있다

사용가능한 옵션들로는 아래와 같다.

  • DB 스키마 자동 생성 옵션
    .xml 파일에서 선언 가능하다
  • create ( 주로 사용 )
    기존 테이블을 삭제 후 다시 생성 한다
    = 테이블 DROP 과 CREATE 를 동시에
  • create-drop
    테이블을 생성하나, 종료시점에 모든 테이블을 drop 시키는
    일회성 테이블
  • update ( 주로 사용 )
    테이블 변경부분만 반영한다.
  • validate
    엔티티와 테이블이 정상적으로 매핑되었는지 확인
  • none
    테이블을 사용하지 않겠다는 선언

📌 제약 조건 추가

@Column() - 필드와 컬럼을 매핑

비지니스 로직

= 회원 이름 기입 필수, 길이는 10자 라는 제약조건을 설정할 때
@Column 을 사용한다

  • ex)
    @Column( nullable = false , length = 10 )
    = 정보 입력 필수 , 길이는 최대 10자

@Temporal : 날짜 타입 매핑

@Enumerated : enum 타입 매핑

@Lob : BLOB, CLOB 매핑

@Transient : 특정 필드를 컬럼에 매핑하지 않을 때 사용

📌 @Column

  • 컬럼과 필드를 매핑하는 어노테이션
  • name

필드와 매핑할 테이블의 컬럼 이름

  • nullable = T or F

null 값의 허용 여부 설정
( true 라면 null 허용
false 라면 null 불가능 )

  • unique

한 컬럼에 대해 unique 제약조건을 선언할 때 사용
( 다중 unique 조건 설정은 @Table 어노테이션에서 선언 )

  • length

문자 길이 제약조건 , String 변수에만 사용가능

📌 기본 키 매핑

@ID

기본 키를 직접 할당

@GeneratedValue

전략 : 자동생성 하는 기능을 사용하는 용어

= 기본키 를 자동생성 하는 어노테이션
개발자가 기본키를 직접 선언하지 않고
JPA 가 알아서 기본키를 설정하게 만든다

전략 설정(자동생성)을 어떻게 하느냐에 따라
JPA 가 선택하는 기본키가 달라진다.

  • auto(기본값) = 방언에 맞춰 자동지정
  • identity = 데이터베이스에 의임
  • sequenmce = 데이터베이스의 시퀀스 오브젝트 사용 시
    ( , @SequenceGenerator 필요 )
  • table = 키 생성용 테이블 사용, 모든 DB에서 사용

@SequenceGenerator

  • name = 이름
  • sequenceName = 데이터베이스 등록되어 있는 시퀀스 이름
    ex) hibernate_sequence
  • initialValue = 시퀀스 DDL 을 생성할 때, 처음 시작하는 수 지정
  • allocationSize = 데이터베이스 시퀀스 값이 하나씩 증가 하도록 설정
    이 값을 1로 설정하는 것을 권장한다.
  • catalog,scheme = 카탈로그 스키마 설정값 ,
    ( DB 방언에 맞춰 요구한다면 설정해야하는 속성 값. )

사용 예시


	@Id
	@GeneratedValue( strategy = GenerationType.SEQUENCE)
	// id 값을 시퀀스로 자동생성해라 
	private String id;
   
profile
Hyobin12

0개의 댓글