ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] Entity 매핑
    프로그래밍/JPA 2021. 10. 17. 23:23
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. 기본 매핑에는 4개의 매핑이 존재 합니다.

    • 객체와 테이블 매핑
    • 기본 키 매핑
    • 필드와 컬럼 매핑
    • 연관관계 매핑

     

    2. 객체와 테이블 매핑

    테이블과 매핑 하는 클래스는 Entity 어노테이션을 필수로 붙여야 합니다.

     

    Entity 어노테이션이 붙은 클래스는 JPA가 관리하는 엔티티라고 부릅니다.

     

    ※주의사항

    • 기본 생성자는 필수로 존재해야 합니다.
    • final 클래스, enum, interface, inner 클래스에는 사용이 불가능 합니다.
    • DB와 매핑하여 저장 할 필드에는 final 사용이 불가능 합니다.

     

    엔티티와 매핑할 테이블을 지정하려면 Table 어노테이션을 붙여야 합니다.

     

    생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용하여 매핑합니다.

     

    3. 기본 키 매핑

    기본 키(Primary Key)와 매핑하고자 하는 필드에 Id 어노테이션을 붙여야 합니다.

     

    JPA가 제공하는 기본 키 생성 전략

    • 직접 할당: 이름 그대로 기본 키를 어플리케이션에서 직접 할당 하는 것을 말합니다.
    • 자동 생성: DB의 자동 생성 전략에 따라 IDENTITY, SEQUENCE로 나뉘며 모든 DB에서 사용가능한 TABLE 방식이 있습니다.

    IDENTITY, SEQUENCE 전략 사용

    • IDENTITY: MySQL, PostgreSQL, SQL Server 등 에서 사용하는 기본 키 생성 전략 이며 Row 데이터를 저장 시 DB가 순서대로 값을 증가 시키며 저장 하도록 되어 있습니다.
      IDENTITY는 DB에서 값을 저장하고 나서 기본 키 값을 구할 수 있을 때 사용하며 @GeneratedValue 어노테이션의 strategy 속성 값으로 GenerationType.IDENTITY를 사용합니다.
    • SEQUENCE: Oracle, PostgreSQL, DB2, H2 등 에서 사용하는 기본 키 생성 전략 이며 Row 데이터를 저장 시 시퀀스에서 다음 값을 가지고 와 저장합니다.
      SEQUENCE 전략을 사용하려면 엔티티 클래스에 SequenceGenerator 어노테이션을 사용해야 합니다.
      SEQUENCE는 @GeneratedValue 어노테이션의 strategy 속성 값으로 GenerationType.SEQUENCE를 사용합니다.
    • SequenceGenerator 어노테이션 속성
      속성명 기능
      name SequenceGenerator를 식별할 명칭
      sequenceName 데이터베이스에 등록되어 있는 시퀀스 명
      initalValue DDL 생성 시에만 사용. 시퀀스 DDL을 생성할 때 처음 시작하는 수
      allocationSize 시퀀스 한 번 호출 시 증가하는 수
      catalog, schema 데이터베이스 catalog, schema명

     

    IDENTITY, SEQUENCE 전략 JPA 저장 방식 차이

    • IDENTITY는 먼저 엔티티를 저장 후에 식별자 값을 조회하여 엔티티의 식별자 값을 식별자 필드에 할당.
    • SEQUENCE 먼저 DB의 시퀀스를 사용하여 식별자 값을 조회 후 엔티티의 식별자 값을 식별자 필드에 할당, 트랜잭션을 커밋 또는 플러시가 일어나면 DB에 저장.

     

    TABLE 전략 사용

    • TABLE 전략은 키 생성 전용 테이블을 만들고 여기에 시퀀스 명과 시퀀스 값을 저장 하고 관리하는 방법입니다.
      TABLE 전략을 사용하려면 엔티티 클래스에 TableGenerator 어노테이션을 사용해야 합니다.
      또한 기본 키와 매핑 되는 필드에 GeneratedValue 어노테이션의 trategy 속성 값으로 GenerationType.TABLE을 사용하고 generator 속성으로 TableGenerator 어노테이션의 name 속성을 사용합니다.
    • TableGenerator 어노테이션 속성
      속성명 기능
      name TableGenerator를 식별할 명칭
      table 키를 관리하는 테이블명
      pkColumnName 시퀀스 컬럼명
      valueColumnName 시퀀스 값 컬럼명
      pkColumnValue 키로 사용할 값 이름
      initialValue 초기 값, 마지막으로 생성된 값이 기준이된다.
      allocationSize 시퀀스 한 번 호출 시 증가하는 수

     

    4. 필드와 컬럼 매핑

    관련 어노테이션

    • Column
    • Enumerated
    • Temporal
    • Lob
    • Transient
    • Access

     

    Column 어노테이션

    • 객체 필드를 테이블의 컬럼과 매핑하며 가장 많이 사용되고 기능도 많다.
    • Column어노테이션 속성
      속성명 기능
      name 필드와 매핑할 테이블의 컬럼명
      insertable 엔티티 저장 시 이 필드도 같이 저장 여부를 설정한다. false의 경우 읽기 전용일 때 사용
      updatable 엔티티 수정 시 이 필드도 같이 수정 여부를 설정한다. false의 경우 읽기 전용일 때 사용
      table 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다.
      nullable null 값의 허용 여부를 설정한다.
      unique Table 어노테이션의 uniqueConstraints와 같지만 한 컬럼에 유니크 조건을 걸 때 사용한다.
      columnDefinition 데이터베이스 컬럼 정보를 직접 관리하는 경우 사용한다.
      length 문자 길이 제약조건이므로 String에서만 사용한다.
      precision, scale BigDecimal, BigInteger 타입에서 사용한다.
      precision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수다.
      ※ Java의 기본 타입의 속성의 경우 nullable이 기본적으로 not null 이지만 객체 타입이면 nullable이 null 허용이다.

    Enumerated 어노테이션

    • 자바의 enum 타입을 매핑할 때 사용한다.
    • Enumerated 어노테이션 속성
      속성명 기능
      value EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
      EnumType.STRING : enum 명칭을 데이터베이스에 저장

    Temporal 어노테이션

    • 날짜 타입을 매핑할 때 사용한다.
    • Temporal 어노테이션 속성
      속성명 기능
      value TemporalType.DATE: 데이터베이스 date 타입과 매핑
      TemporalType.TIME: 데이터베이스 time 타입과 매핑
      TemporalType.TIMESTAMP: 데이터베이스 timestamp 타입과 매핑

    Lob 어노테이션

    • 데이터베이스 BLOB, CLOB 타입과 매핑할 때 사용한다.

     

    Transient 어노테이션

    • Transient 어노테이션이 붙은 필드의 경우 데이터베이스에 저장, 조회 하지 않는다.
    • 객체에 임시로 어떤 값을 보관하고자 하는 경우 사용한다.

    Access 어노테이션

    • JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
    • 필드 접근
      AccessType.FIELD로 지정한다.
      JPA가 필드에 직접 접근하며 필드 접근 권한이 private이어도 접근이 가능하다.
    • 프로퍼티 접근
      AccessType.PROPERTY로 지정한다.
      해당 필드의 접근자 Getter 메소드를 사용한다.
    • 만약 Access 어노테이션을 설정하지 않으면 Id 어노테이션이 있는 위치를 기준으로 접근 방식이 설정 된다.
    반응형

    댓글

Designed by Tistory.