엔티티 매핑(Entity Mapping)

신상현·2021년 2월 3일
0

Spring Boot와 JPA

목록 보기
8/16

  • 객체와 테이블 매핑 : @Entity, @Table
  • 기본 키 매핑 : @Id
  • 필드와 컬럼 매핑 : @Column
  • 연관 관계 매핑 : @ManyToOne, @JoinColumn

@Entity

테이블과 매핑할 클래스를 지정한다.

  • JPA는 엔티티 객체를 생성할 때, 기본 생성자를 사용한다.
  • 그래서 기본 생성자는 필수다.
  • 생성자를 생성했다면, 기본 생성자가 자동 생성되지 않기 때문에 주의한다!
  • 저장할 필드에 final을 사용하면 안된다

@Table

엔티티와 매핑할 테이블을 지정한다.

@Table(name = "MEMBER")
public class Member {
	.
	.
	.
}

필드 매핑 시 Annotation

@Column

필드와 테이블의 컬럼을 매핑해준다.

속성 중에nullable = true가 기본 값이므로,
자료형이 자바 기본형인 경우에는 nullable = false를 해주는것이 안전하다.


@Enumerated

자바의 enum을 사용해서 roleType 필드를 구분한다.

value = EnumType.ORDINAL은 0과 1 ... 순서대로 저장한다. 크기가 작다.
value = EnumType.STRING은 문자 그대로 저장한다. 중간에 순서가 바뀌거나, 다른 값들이 추가되어도 안전하다.

public enum RoleType {
	ADMIN, USER
}

...

@Enumerated(EnumType.STRING)
private RoleType roleType;

@Temporal

자바의 날짜 타입을 매핑한다.

@Temporal(TemporalType.TIMESTAMP)
private Date createDate;

@Lob

길이 제한이 없는 필드를 매핑한다. DB에 CLOB, BLOB 타입으로 저장된다.

@Lob
private String description;

@Transient

DB에는 저장하지 않지만, 일시적으로 객체에 저장하고 싶은 값에 사용한다.


@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
설정하지 않으면, @Id의 위치를 기준으로 접근 방식이 달라진다.
즉, @Id가 필드에 있는지, Getter에 있는지가 중요하다.

  • 필드 접근
    • 필드에 직접 접근한다.
    • private 여도 접근할 수 있다.
  • 프로퍼티 접근
    • 접근자(Getter)를 사용해서 접근한다.
@Entity
public class Member {
    
    @Id
    private Long id;
    
    @Transient
    private String firstName;
    
    @Transient
    private String lastName;
    
    @Access(AccessType.PROPERTY)
    public String getFullName(){
    	return this.firstName + this.lastName;
    }
    
}

DB 스키마 자동 생성 설정

application.properties 파일에

spring.jpa.hibernate.ddl-auto=

  • create : DROP + CREATE
  • create-drop : DROP + CREATE + DROP
  • update : DB의 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
  • validate : 엔티티 매핑정보와 DB의 테이블 정보를 비교해서 다르면 경고+실행❌
  • none : 자동 생성 기능 사용 ❌

DDL Constraint 설정

@Table(uniqueConstraints = { @UniqueConstraint(
  					name = "NAME_AGE_UNIQUE",
  					columnNames = {"NAME", "AGE"} )})
public class Member {

	@Column(nullable = false, length = 10)
	private String userName

...

}

Unique Constraint

  • uniqueConstraints : unique 컬럼의 조합이 유일해야 한다.
  • NAME 컬럼과 AGE 컬럼의 조합이 유일해야 한다.
  • 각각의 컬럼의 유일함과는 상관이 없다.
  • NULL은 데이터로 간주하지 않기 때문에 중복이 가능하다.

NOT NULL & 글자 수 제한

  • nullable : DDL에 NOT NULL 조건을 추가할 수 있다.
  • length : 문자의 크기가 10자리로 제한된다.

DDL문을 생성할 때만 사용되는 것이다. JPA의 기능에는 영향을 주지 않는다.
하지만, 엔티티 구성만 보고도 테이블을 파악할 수 있다는 장점이 있다.


profile
개발자 싱상형

0개의 댓글