1. 엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
2. @Entity
- @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라고합니다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수적으로 붙여줍니다.
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
@Entity 속성 정리
- name : jpa에서 사용할 엔티티 이름을 지정합니다.
- 기본값: 클래스 이름을 그대로 사용합니다. (ex) Member
- 같은 클래스 이름이 없으면 가급적 기본값을 사용합니다.
@Table
엔티티와 매핑할 테이블을 지정합니다.
2. 데이터 베이스 스키마 자동 생성
- DDL을 애플리케잇녀 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
- 이렇게 생성된 DDL은 개발 장비에서만 사용
- 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
데이터베이스 스키마 자동생성 속성
update는 변경분만 반영해줍니다. 지우는건 안되고 추가하는거만 됩니다. 지우는건 잘못하면 테이블 컬럼이 삭제되면 엄청난 문제가 생길 수 있기 때문입니다. validate 는 엔티티와 테이블 정상 매핑만 확인합니다.
데이터베이스 스키마 자동생성 주의
- 운영 장비에서는 절대 create, create-drop, update 사용하면 안됩니다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
제약 조건 추가 : 회원 이름은 필수, 10자 초과 x
@Column(nullable = false, length = 10)
유니크 제약 조건 추가
@Table(uniqueConstraints={@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"})})
DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않습니다.
3. 필드와 컬럼 매핑
package hellojpa;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
@Entity public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
//Getter, Setter…
}
@Column(name="name") 이런식으로하면 db에는 name이고 필드는 다른이름으로 할 수 있습니다. Integer 같은 타입 쓰면 가장 가까운 타입으로 생성해줍니다. 객체에서 Enum 타입을 쓰고 싶음. DB에는 기본적으로 Enum 타입이 없기때문에 @Enumerated를 쓰면 됩니다. 날짜타입을 쓰게되면 @Temporal을 사용하면됨. 타입이 3가지가있습니다. DATE, TIME, TIMESTAMP. 자바의 DATE 타입은 날짜와 시간이 다있습니다. 그런데 데이터베이스에는 3가지를 구분해서 사용합니다. DATE, TIME, TIMESTAMP. 그래서 매핑정보를 줘야합니다. VARCHAR를 넘어서는 큰걸 넣고 싶으면 @Lob을 쓰면됩니다. @Transient 쓰면 DB랑 상관없이 쓸 수 있습니다. 메모리에서만 쓰겠다!
- insertable, updatable : 이 컬럼을 수정했을때 데이터베이스에 insert,update를 할껀지 말껀지를 선택합니다. 예를 들어 등록과 변경을 절대하면 안되면 updateable을 false로 합니다.
- nullable : 중요함. 기본이 true인데 false로 하면 not null 제약조건이 걸립니다.
- unique : unique 제약 조건을 걸고 싶으면 true. 그런데 애는 잘 사용하지 않습니다. unique 제약조건을 만들어주긴하는데 이름이 랜덤처럼 나옴니다. 그리고 복합은 안되고 한 컬럼만 됩니다. @Table에서 걸면 unique 제약조건을 이름이랑 같이 줄 수 있습니다.
- columnDefinition : 컬럼 정보를 직접 줄 수 있습니다.
- BicDecimal 같은 경우에는 소수점에 대해서 옵션을 줄 수 있습니다. precision scale. 아주 큰 숫자나 소수점 쓸때 사용하면 됩니다.
@Enumerated
@Temporal
@Lob
- 데이터베이스 BLOB, CLOB 타입과 매핑
- @Lob에는 지정할 수 있는 속성이 없습니다.
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
- CLOB : String, char[], java.sql.CLOB
- BLOB : Byte[], java.sql.BLOB
@Transient
- 필드 매핑 x
- 데이터베이스에 저장 x, 조회 x
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
@Transient
private Integer temp;
REFERENCE
https://www.inflearn.com/course/ORM-JPA-Basic
'JPA' 카테고리의 다른 글
[JPA] 연관 관계 매핑의 종류 (0) | 2020.04.19 |
---|---|
[JPA] 연관관계 매핑 기초 (0) | 2020.04.14 |
[JPA] 기본 키 매핑 (0) | 2020.04.10 |
[JPA] 영속성 콘텍스트 (0) | 2020.04.10 |
[JPA] 관계형 데이터베이스의 문제 (1) | 2020.04.08 |