🗺 RoadMap/Jpa

[JPA] #4 엔티티 매핑(1) - 객체와 테이블, 필드와 컬럼 매핑

an2z 2022. 9. 30. 14:10
본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다.

 

엔티티 매핑하기


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

 

 

객체, 테이블 매핑


@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하는 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.
  • 주의
    • 기본 생성자가 필수(파라미터가 없는 public 또는 protected 생성자)
    • final 클래스, enum, interface, inner 클래스는 안된다.
    • DB에 저장할 필드에는 final 사용하면 안된다.
  • 속성 : name
    • JPA에서 사용할 엔티티의 이름을 지정한다.
    • 기본값은 클래스 이름을 그대로 사용한다. 
    • 같은 클래스 이름이 없으면 가급적 기본값을 사용한다.

 

@Table

  • @Table은 엔티티와 매핑할 테이블을 지정한다.
속성 기능 기본 값
name 매핑할 테이블의 이름 엔티티 이름을 사용
catalog 데이터베이스 catalog 매핑  
schema 데이터베이스 schema 매핑  
uniqueConstraints (DDL) DDL 생성 시에 유니크 제약 조건 생성  
@Entity
@Table(name = "MBR")
public class Member {
	...
}

 

 

필드, 컬럼 매핑


애노테이션 설명
@Column 컬럼 매핑
@Temporal 날짜 타입 매핑
@Enumerated enum 타입 매핑
@Lob BLOB, CLOB 매핑, 매우 큰 컨텐츠를 저장할 경우 사용
@Transient 특정 필드를 컬럼에

 

@Column

속성 설명 기본값
name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름
insertable, updatable 등록, 변경 가능 여부 true
nullable (DDL) null 값의 허용 여부를 설정
false : DDL 생성 시 not null 제약조건이 붙음
true 
unique (DDL) @Table의 uniqueConstraints와 같지만
한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
columnDefinition (DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있음
ex) varchar(100) default 'EMPTY'
필드의 자바 타입과
방언 정보를 사용
length (DDL) 문자 길이 제약조건
String 타입에만 사용
255
precision,
scale (DDL)
BigDecimal 타입에서 사용 (BigInteger도 사용)
precision : 소수점을 포함한 전체 자릿수
scale : 소수의 자릿수
precision = 19
scale = 2
@Column(name = "name")
private String username;
DDL 생성 기능
nullable, length, unique와 같은 것들을 DDL 생성 기능이라 한다.
DDL 생성기능은 DDL을 자동 생성할 때만 사용되고, JPA의 실행 로직에는 영향을 주지 않는다.
• @Column(nullable = false) : 필수 값
• @Column(length = 10) : 10자 이하
• @Column(unique = true) : 유니크 값

 

@Enumerated

  • 자바 enum 타입을 매핑할 때 사용
  • 속성 : value
    • EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
    • ⭐️ EnumType.STRING : enum 이름을 데이터베이스에 저장
@Enumerated(EnumType.STRING)
private RoleType roleType;
ORDINAL은 사용하지 않는다.
만약 enum 데이터가 추가되면 그 순서가 바뀌기 때문에 ORDINAL을 쓰면 굉장히 위험하다.

 

@Temporal

  • 날짜 타입을 매핑할 때 사용
  • 참고로 자바 8이 도입되면서 LocalDate, LocalDateTime을 사용할 경우에는 생략이 가능하다. (최신 하이버네이트 지원)
@Temporal(TemporalType.TIMESTAMP)
private Date date;

// @Temporal 생략 가능
private LocalDate date;
private LocalDateTime date;

 

@Lob

  • 데이터베이스 BLOB, CLOB 타입과 매핑할 때 사용
    • CLOB : 매핑하는 필드타입이 문자일 경우 (String, char[])
    • BLOB : 나머지 (byte[])
  • 속성 : 없음
@Lob
private String description;

 

@Transient

  • 필드 매핑을 원하지 않는 경우 사용
  • 데이터베이스에 저장, 조회되지 않는다.
  • 주로 메모리상에서만 임시로 어떠한 값을 보관하고 싶을 때 사용한다.
@Transient
private Integer temp;