Spring JPA 관련 주요 Annotation 및 설정

Developer:Bird·2020년 12월 2일
1

Spring

목록 보기
8/17

1.개요

  • javax.persistence 패키지 않의 수많은 어노테이션 인터페이스들이 존재한다.
    이중에서 가장 많이쓰는 몇가지 어노테이션에 대해서 정리하였다.

2.정리

Properties:

2.0) spring.jpa.hibernate.ddl-auto=?

create : 기존테이블 삭제 후 다시 생성
create-drop: create와 같으나 종료시점에 테이블 DROP
update: 변경분만 반영
validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
none: 사용하지 않음

엔티티 관련

2.1.1) @Entity: 해당 어노테이션을 붙이게 되면 해당 클레스가 데이터베이스의 테이블과 1대1 매칭이 됨.

2.1.2) @Table(name="??") ??에 해당하는 테이블과 매핑됨.

2.1.3) @Column(??) 해당 맴버변수와 테이블의 Column와 맵핑됨

> 옵션

1. name : 맵핑할 테이블의 컬럼 이름을 지정합니다;만약 없다면 맴버변수의 이름그대로 Colum에 적용됩니다.
2. insertable : 엔티티 저장시 선언된 필드도 같이 저장합니다. default=true
3. updateable : 엔티티 수정시 이 필드를 함께 수정합니다. default=true
4. table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
5. nullable : NULL을 허용할지, 허용하지 않을지 결정합니다. default=false
6. unique : 제약조건을 걸 때 사용합니다. default=false
7. columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
8. length : varchar의 길이를 조정합니다. 기본값으로 255가 입력됩니다.
9. precsion, scale : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미합니다.

2.1.4) @Id 해당 어노테이션이 붙은 맴버변수는 해당 테이블의 Primary key가 된다. 객체를 식별할 유일값임.

2.1.5) @GeneratedValue(stargety=?) ?에 들어가는 전략은 총 4가지가 있다. 옵션에 따라 JPA 구현체가 자동으로 생성 전략을 결정한다.

> 옵션

AUTO(default):JPA 구현체가 자동으로 생성 전략을 결정한다.
IDENTITY : 기본키 생성을 데이터베이스에 위임한다. 예를 들어 MySQL의 경우 AUTOINCREMENT를 사용하여 기본키를 생성한다.
SEQUENCE: 데이터베이스의 특별한 오브젝트 시퀀스를 사용하여 기본키를 생성한다.
TABLE_: 데이터베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용하여 기본키를 생성한다.

join관련

2.2.1) @JoinColumn: 해당 Join할 Column을 지정하게 된다.

> 옵션

name: 매핑할 외래 키의 이름을 지정할 때 사용한다
기본 값 : 참조하는 테이블의 컬럼명
referenceColumnName: 외래 키가 참조하는 자신의 테이블의 컬럼명을 의미한다
기본 값: 해당 맴버 변수의 이름.
etc) Column이 가지고 있는 옵션들

@Entity
public class A_Table{
.
.
.
@JoinColumn(name="column1")
private B_table b; 
.
.

다음과 같은 경우 B_table의 Column1을 참조하여 해당하는 record를 가져오게 된다.

2.2.2) @JoinTable: N:N Join에 해당하는 테이블을 선언할때 사용됨. 예시

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

@JoinTable(
        name = "MY_JT",
        joinColumns = @JoinColumn( 
                name = "PROJ_ID", //외래키
                referencedColumnName = "PID"
        ),
        inverseJoinColumns = @JoinColumn(
                name = "TASK_ID", //반대 외래키
                referencedColumnName = "TID"
        )
)
@OneToMany
private List<Task> tasks;

2.2.3) @ManyToOne :해당 테이블을 기준으로 N:1관계의 Join을 할경우 사용된다. 해당하는 하나의 객체를 가지게 된다.

옵션>

1) optional

해당 객체에 null이 들어갈 수 있을지를 결정하게 된다.
참고로 @Column 어노테이션에서도 nullable=true로 세팅해도 null이 들어갈 수 있다
defalut** : true

2) fetch

엔티티의 로딩방식을 결정하게 된다.
EAGER이면 연관된 엔티티를 바로 로딩한다.
LAZY이면 연관된 엔티티를 바로 로딩하지 않고 실제로 해당 객체를 조회할 때 해당 엔티티를 로딩한다
Defalut
@ManyToOne=FetchType.EAGER
@OneToMany=FetchType.LAZY

3) cascade:

영속성 전이 설정을 할 수 있다. 설정 값은 아래 cascadeType을 참고해주세요.
PERSIST 부모 엔티티를 저장할 때 자식 엔터티도 같이 저장된다.
REMOVE 부모 엔티티를 삭제하면 자식 엔터티도 같이 삭제된다.
DETACH 부모 엔티티가 detach 상태로 되면 자식 엔터티도 같이 detach 되어 변경사항이 반영되지 않는다.
REFRESH 부모 엔터티가 DB로부터 데이터를 다시 로드하면 자식 엔터티도 DB로부터 데이터를 다시 로딩한다
MERGE 부모 엔티티가 detach 상태에서 자식 엔터티를 추가/변경한 이후에 부모 엔티티가 merge를 수행하면 자식 엔터티도 변경사항이 적용된다.
ALL 모두 cascade 옵셕이 전용된다.

2.2.4) @OneToMany :해당 테이블을 기준으로 1:N관계의 Join을 할경우 사용된다. 따라서 값을 List로 가지게 된다.

옵션의 경우 @ManyToOne과 같다.

2.2.5) @Mappedby : 해당 어노테이션을 붙이게 되면 CasCade되지 않고 read전용의 JoinMapping이 형성된다.

재정의 관련

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

일반적인 클래스

public class Company {

    private Integer id;

    private String name;

    private String address;

    private String phone;

    private String contactFirstName;

    private String contactLastName;

    private String contactPhone;

    // standard getters, setters
}

@Embeded, @Embedable활용 클래스

@Entity
@Embeddable
public class ContactPerson {

    private String firstName;

    private String lastName;

    private String phone;

    // standard getters, setters
}
public class Company {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private String address;

    private String phone;

    @Embedded
    private ContactPerson contactPerson;

    // standard getters, setters
}

다음과 같이 @Embedable 어노테이션을 붙은 엔티티를 새롭게 재생성 하고 @Embeded밑에 끼워 넣음으로써 추상화를 시킬 수 있었습니다.

참고사항

@AttributeOverrides를 이용하면 해당 Column명을 재정의 할 수있다.

@Embedded
@AttributeOverrides({
  @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
  @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
  @AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})
profile
끈임없이 발전하자.

0개의 댓글