성장에 목마른 코린이

[JPA] Spring JPA 관련 주요 Annotation 및 설정 본문

Java/Spring

[JPA] Spring JPA 관련 주요 Annotation 및 설정

성장하는 코린이 2022. 10. 31. 09:27
728x90

@Entity

해당 어노테이션을 붙이게 되면 해당 클래스가 데이터베이스의 테이블과 1대1 매칭이 됨

속성 - Name : JPA에서 사용할 엔티티 이름을 지정 (보통 기본값인 클래스 이름을 사용)

주의사항 

- 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용)

- final 클래스, enum, interface, inner class에는 사용할 수 없음

- 저장할 필드에 final 사용 불가

 

@Table(name="??")

??에 해당하는 테이블과 매핑됨

생략시 매핑한 엔티티 이름을 테이블 이름으로 사용

속성 

- Name : 매핑할 테이블 이름 (default. 엔티티 이름 사용)

- Catalog : catalog 기능이 있는 DB에서 catalog를 매핑 (default. DB 명)

- Schema : schema 기능이 있는 DB에서 schema를 매핑

- uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듬 (스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용)

 

@Id

해당 어노테이션이 붙은 맴버변수는 해당 테이블의 Primary key가 됩니다.

객체를 식별할 유일한 값입니다.

 

@GeneratedValue(strategy=?)

?에 들어가는 전략은 총 4가지가 있습니다.

옵션에 따라 JPA 구현체가 자동으로 생성 전략을 결정합니다.

<기본 키 생성 전략>

- 직접 할당: 기본 키를 애플리케이션에 직접 할당

   em.persist()를 호출하기 전 애플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 에러 발생

- 자동 생성: 대리 키 사용 방식

   * IDENTITY : 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)

      - Statement.getGeneratedKeys()를 사용해서 데이터를 저장함과 동시에 생성된 기본 키 값을 얻어 올 수 있음.

   * SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당,

                            데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장

                            유일한 값을 순서대로 생성 (오라클, PostgreSQL, DB2, H2)

   * TABLE : 키 생성 테이블을 사용

                    키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.

                    테이블을 사용하므로 모든 데이터베이스에 적용 가능

   * AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default)

                   Ex) 오라클 DB 선택 시 SEQueNCE, MySQL DB 선택 시 IDENTITY 사용

** 키 생성 전략 사용 시 persistence.xml에 아래 속성 추가

<property name="hibernate.id.new_generator_mappings" value="true" />

 

@Column(??)

해당 맴버변수와 테이블의 Column과 매핑됨

속성 중 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않음

속성

- name : 필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름)

- nullable (DDL) : null 값의 허용 여부 설정, false 설정시 not null (default. true) false로 설정하는 것이 안전

- unique (DDL) : @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용

- columnDefinition (DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정 (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성)

- length (DDL) : 문자 길이 제약조건, String 타입에만 사용 (default. 255)

- precision, scale (DDL) : BigDecimal, BigInteger 타입에만 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때만 사용 (default. precision = 19, scale = 2)

 

@JoinColumn

해당 Join할 Column을 지정하게 됩니다.

속성

- name: 매핑할 외래 키의 이름을 지정할 때 사용합니다. (기본 값: 참조하는 테이블의 컬럼명)

- referenceColumnName: 외래 키가 참조하는 자신의 테이블의 컬럼명을 의미합니다. (기본 값: 해당 맴버 변수의 이름)

 

@JoinTable

N:N Join에 해당하는 테이블을 선언할 때 사용됩니다.

해당 스키마에 해당하는 Join테이블을 @JoinTable 어노테이션을 이용해서 코드를 짜보면 다음과 같습니다.

@OneToMany

해당 테이블을 기준으로 1:N관계의 Join을 할 경우 사용됩니다.

따라서 값을 List로 가지게 됩니다.

속성

- optional: 해당 객체에 null이 들어갈 수 있을지를 결정하게 됩니다. (default: true)

- fetch: 엔티티의 로딩방식을 결정하게 됩니다.

EAGER이면 연관된 엔티티를 바로 로딩합니다.

LAZY이면 연관된 엔티티를 바로 로딩하지 않고 실제로 해당 객체를 조회할 때 해당 엔티티를 로딩합니다.

(Default: @ManyToOne= FetchType.EAGER, @OneToMany= FetchType.LAZY)

- cascade: 영속성 전이 설정을 할 수 있습니다.

PERSIST 부모 엔티티를 저장할 때 자식 엔티티도 같이 저장됩니다.

REMOVE 부모 엔티티를 삭제하면 자식 엔티티도 같이 삭제됩니다.

DETACH 부모 엔티티가 detach 상태로 되면 자식 엔티티도 같이 detach 되어 변경사항이 반영되지 않습니다.

REFRESH 부모 엔티티가 DB로부터 데이터를 다시 로드하면 자식 엔티티도 DB로부터 데이터를 다시 로딩합니다.

MERGE 부모 엔티티가 detach 상태에서 자식 엔티티를 추가/변경한 이후에 부모 엔티티가 merge를 수행하면 자식 엔티티도 변경사항이 적용됩니다.

ALL 모두 cascade 옵션이 적용됩니다.

 

@ManyToOne

해당 테이블을 기준으로 N:1관계의 Join을 할 경우 사용됩니다.

해당하는 하나의 객체를 가지게 됩니다.

속성의 경우 @OneToMany와 같습니다.

 

@Mappedby

해당 어노테이션을 붙이게 되면 Cascade되지 않고 read전용의 JoinMapping이 형성됩니다.

 

@Embeded, @Embedable

속성들에 관하여 추상화시키고 싶고 그러한사항에 대하여 새로운 테이블로 정의하고 싶지 않을때 사용됩니다.

 

@AttributeOverrides

이 어노테이션을 이용하면 해당 Column명을 재정의 할 수 있습니다.

 

@Enumerated

자바의 enum 타입을 매핑할 때 사용

속성

- value : EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

              EnumType.STRING : enum 이름을 데이터베이스에 저장

              (default.EnumType.ORDINAL)

 

@Temporal

날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용

속성

- value : TemporalType.DATE : 날짜, 데이터베이스 data 타입과 매핑 (2022-10-31)

               TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (09:00:00)

               TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2020-12-18 09:00:00)

               (default. TemporalType은 필수로 지정)

@Temporal을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의

 

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑

속성: 

지정 속성이 없음

대신 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑

 

@Transient

이 필드는 매핑하지 않음

데이터베이스에 저장하지 않고 조회하지도 않음

객체에 임시로 어떤 값을 보관하고 싶을 때 사용

 

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정

- 필드 접근 : AccessType.FIELD 로 지정 필드에 직접 접근 (private도 접근 가능)

- 프로퍼티 접근: AccessType.PROPERTY로 지정 접근자 Getter를 사용

 

'Java > Spring' 카테고리의 다른 글

[Spring] JPA, ORM, Hibernate  (0) 2022.10.21
Comments