[우아한형제들 김영환님의 인프런 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 수강하고 정리한 내용입니다]
엔티티 매핑
자바에서 사용하는 엔티티와 데이터베이스에서 관리하는 데이터 간의 관계를 매핑하는 것
엔티티와 데이터베이스 간 매핑
- 객체와 테이블 매핑
- 필드와 컬럼 매핑
- 기본 키 매핑
- 연관관계 매핑
객체와 테이블 매핑
@Entity
- @Entity 어노테이션이 붙으면 JPA가 관리한다는 뜻
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용 X
- DB에 저장할 필드에는 final 키워드 사용 X
@Entity
public class Member {
@Column
@Id
private Long id;
}
@Table
- @Table은 엔티티와 매핑할 테이블 지정
- name 속성 : 매핑할 테이블 이름
- schema 속성 : 매핑할 스키마 이름
- uniqueContraints : DDL 생성 시 유니크 제약조건
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
public class Member {
@Column
@Id
private Long id;
}
필드와 컬럼 매핑
@Column
- 컬럼 매핑
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
public class Member {
@Column(name = "MEMBER_ID", updatable = false) //MEMBER_ID 컬럼 / 업데이트 불가능
@Id
private Long id;
@Column(length = 200 ,nullable = false) //DDL 생성 시 not null 제약조건이 붙음 / 데이터 길이는 200
private String name;
@Column(columnDefinition = "varchar(100) default '설명'") //컬럼 정보 직접 작성
private String description;
}
@Temporal
- 날짜 타입 매핑
- LocalDate : 날짜
- LocalDateTime : 날짜 + 시간
- 이전 Date/Calendar를 사용했던 필드에 작성
- Java 8 버전의 LocaDate/LocalDateTime에는 필요하지 않음
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
public class Member {
@Column(name = "MEMBER_ID", updatable = false) //MEMBER_ID 컬럼 / 업데이트 불가능
@Id
private Long id;
@Column
private LocalDate createDate;
@Column
private LocalDateTime createDateTime;
@Temporal(TemporalType.DATE)
private Date date;
@Temporal(TemporalType.TIMESTAMP)
private Date dateTime;
}
@Enumerated
- enum 타입 매핑
- ORDINAL/STRING 옵션이 존재
- 유지보수를 위해 인덱스 저장 방식의 ORDINAL 대신 문자열 저장 방식의 STRING 사용
public enum RoleType {
USER, ADMIN
}
@Entity
@Table(name = "MEMBER")
public class Member {
@Column(name = "MEMBER_ID")
@Id
private Long id;
@Enumerated(EnumType.ORDINAL)
RoleType roleTypeOrdinal;
@Enumerated(EnumType.STRING)
RoleType roleTypeString;
}
@Transient
- 특정 필드를 컬럼에 매핑하지 않음
- 데이터베이스에 저장X/조회X
- 메모리상에서만 임시로 사용
@Entity
@Table(name = "MEMBER")
public class Member {
@Column(name = "MEMBER_ID")
@Id
private Long id;
@Transient
private String temp;
}
기본키 매핑
@Id
@Entity
public class Member {
@Id
private Long id;
}
@GeneratedValue
IDENTITY
- 기본 키 생성을 데이터베이스에 위임
- MYSQL의 AUTO_INCREMENT
- persist()시 즉시 INSERT SQL 실행 후 Id값을 DB에서 조회
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
SEQUENCE
- 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트
- 대표적으로 오라클 시퀀스가 이에 해당
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
}
@Entity
@Table(name = "MEMBER") //매핑할 테이블 명
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 개발 -> 객체 중심 개발
- 데이터베이스 방언(dialect)을 활용해서 적절한 DDL 생성
- 개발 환경에서만 사용
반응형
'Backend > JPA' 카테고리의 다른 글
[JPA/Java Persistence API] 고급매핑 (0) | 2021.06.03 |
---|---|
[JPA/Java Persistence API] 다양한 연관관계 매핑 (1) | 2021.05.30 |
[JPA/Java Persistence API] 엔티티 연관관계 (0) | 2021.05.23 |
[JPA/Java Persistence API] 영속성 컨텍스트 (0) | 2021.05.10 |
[JPA/Java Persistence API] Entity 조회, 수정, 삽입, 삭제 - 기본편 (0) | 2021.05.09 |