이 글은 김영한님의 '자바 ORM 표준 프로그래밍' 교재를 바탕으로 정리한 글입니다. :)
이번엔 JPA의 핵심 개념인 엔티티와 테이블 매핑에 대해 정리해보겠습니다~🤸
JPA를 사용해서 테이블과 매핑할 클래스에 사용한다.
속성
주의사항
엔티티와 매핑할 테이블을 지정한다.
속성
JPA는 클래스의 매핑 정보를 통해 각 데이터베이스에 맞게 스키마를 자동 생성하는 기능을 지원한다.
아래와 같은 설정을 통해 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성할 수 있다.
spring:
jpa:
hibernate:
ddl-auto: create
위와 같이 설정 후 실행 시 콘솔에 출력되는 스키마 생성 로그. 기존 테이블을 삭제하고 재생성한다.
drop table if exists member;
create table member (
member_id bigint not null,
city varchar(255),
street varchar(255),
zipcode varchar(255),
username varchar(255),
primary key (member_id)
)
운영 환경에서 create, create-drop, update와 같이 DDL을 수정하는 옵션은 실사용되는 테이블이나 컬럼을 삭제할 수 있기 때문에 사용하면 안된다.
위 설정은 환경별로 알맞은 값을 사용해야 한다. 일반적으로 추천하는 상황별 전략은 아래와 같다.
엔티티 관련 제약조건이 추가되는 경우 @Column의 속성을 이용해 이를 설정할 수 있다.
@Entity
public class Member {
@Id
@Column(name="member_id")
private Long id;
@Column(nullable = false, length = 20)
private String username;
...
}
위와 같이 자동 생성되는 DDL의 username 컬럼에 not null 제약조건과 length를 지정할 수 있으며 생성된 DDL은 아래와 같다.
create table member (
member_id bigint not null,
city varchar(255),
street varchar(255),
zipcode varchar(255),
username varchar(20) not null,
primary key (member_id)
)
@Table의 uniqueConstraints 속성을 통해 유니크 제약조건 부여도 가능한다.
@Entity
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "ID_NAME_UNIQUE",
columnNames = {"MEMBER_ID", "USERNAME"}
)
})
public class Member {
@Id
@Column(name="member_id")
private Long id;
@Column(nullable = false, length = 20)
private String username;
...
}
생성된 DDL은 아래와 같다.
alter table member
add constraint ID_NAME_UNIQUE unique (member_id, username)
데이터베이스마다 기본 키를 생성하는 방식이 서로 달라 JPA는 이를 위해 기본 키 매핑 기능을 제공한다.
@Entity
public class Member {
@Id
private Long id;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
자바의 enum 타입을 매핑할 때 사용한다.
회원 별로 주소 정보를 가지고 있다고 가정할 때 주소 정보를 아래와 같이 JPA enum 어노테이션을 통해 표현할 수 있다.
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name="member_id")
private Long id;
private String username;
@Embedded
private Address address;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
읽어주셔서 감사합니다~ :)