본 포스팅은 인프런 - 자바 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;
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑(2) : 양방향 매핑 (0) | 2022.10.06 |
---|---|
[JPA] 연관관계 매핑(1) : 단방향 매핑 (0) | 2022.10.06 |
[JPA] 데이터베이스 스키마 자동 생성 : DDL AUTO (0) | 2022.09.30 |
[JPA] 엔티티 매핑(2) - 기본 키 매핑 전략 (1) | 2022.09.30 |
[JPA] 영속성 관리 (0) | 2022.09.29 |
[JPA] JPQL : 객체 지향 쿼리 언어 (0) | 2022.09.29 |
[JPA] JPA 왜 사용할까? (0) | 2022.09.22 |
[JPA] 엔티티 변경 - 변경감지(Dirty Checking)와 병합(Merge) (0) | 2022.06.10 |