2023. 02.07 11:15 복습 시작
객체와 테이블 매핑
JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것. 이에 대해 학습해보자.
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.
@Entity 적용 시 주의해야 할 점이 몇 가지 있다.
- 기본 생성자는 필수다. 즉, 파라미터가 없는 public or protected 생성자가 필수다.
- final 클래스, enum, interface, inner 클래스에서는 사용 불가하다.
- 저장할 필드에 final을 사용할 수 없다.
@Entity에는 name이라는 속성도 있다.
이는 엔티티 이름을 지정하는데 name을 설정하지 않는다면 클래스 이름을 그대로 사용한다.
@Table
@Table는 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
Table의 속성은 아래와 같다.
- name : 매핑할 테이블 이름. 기본 값은 엔티티 이름을 사용한다.
- catelog : 데이터베이스 catalog 매핑
- schema : 데이터베이스 schema 매핑
- uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성
데이터베이스 스키마 자동 생성
JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
클래스의 매핑 정보를 보면 어떤 테이블에 어떤 칼럼을 사용하는지 알 수 있다.
JPA는 이 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 생성한다.
스키마 자동 생성 기능을 사용하면 애플리케이션 실행 시점에 데이터베이스 테이블이 자동으로 생성되므로 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.
이렇게 생성된 DDL은 개발 장비에서만 사용해야 한다.
생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용해야 한다.
아래에는 hibernate.hbm2 ddl.auto 속성을 정리한 것이다.
옵션 | 설명 |
create | 기존테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 같으나 종료시점에 테이블 DROP |
update | 변경분만 반영(운영DB에는 사용하면 안됨) |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음. 그냥 기본 값 |
아래와 같이 적용하면 좋다.
- 운영 장비에는 절대 create, create-drop, update을 사용하면 안 된다.
- 개발 초기 단계에는 create 또는 udpate
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
만약 회원 이름은 필수로 입력되어야 하고, 10자를 초과하면 안 된다는 제약조건이 추가된다면 코드를 어떻게 짜야할까?
@Entity
@Table(name="MEMBER")
public class Member{
@Id
@Column(name="ID")
private Long id;
@Column(name="NAME" , nullable = false, length = 10)
private String username;
...
}
@Column 매핑 정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약 조건을 추가할 수 있다.
그리고 length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수 있다.
유니크 제약 조건 추가 코드는 아래와 같다. 이것만 추가해 주면 된다.
@Entity
@Table(name="MEMBER", @Table(uniqueConstraints = {@UniqueConstraint(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )}))
public class Member{
@Id
@Column(name="ID")
private Long id;
@Column(name="NAME" , nullable = false, length = 10)
private String username;
...
}
DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA이 실행 로직에는 영향을 주지 않는다.
필드와 칼럼 매핑
이제 JPA가 제공하는 필드와 컬럼 매핑용 어노테이션들을 정리해보자.
- @Column : 컬럼 매핑
- @Temporal : 날짜 타입 매핑
- @Enumerated : enum 타입 매핑
- @Lob : Blob, CLOB 매핑
- @Transient : 특정 필드를 칼럼에 매핑하지 않음(매핑 무시)
@Column 속성 정리
속성 | 설명 | 기본 값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable (거의 사용 X) updatable (거의 사용 X) |
등록, 변경 가능 여부 | true |
table (거의 사용 X) | 하나의 엔티티를 두개 이상의 테이블에 매핑할 때 사용 지정한 필드를 다른 테이블에 매핑할 수 있다. |
현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부를 설장. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. | true |
unique(DDK) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 두 컬럼 이상을 사용해서 유니크 제약 조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용 | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex varchar(100), default 'EMPTY' |
필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성 |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용 | 255 |
precision, scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수 다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다. | precision=19, scale=2 |
@Enumerated 속성 정리
자바 enum 타입을 매핑할 때 사용한다. 무조건 EnumType.STRING를 사용하자.
속성 | 설명 | 기본 값 |
value | EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 EnumType.STRING : enum 이름을 데이터베이스에 저장 |
EnumType.ORDINAL |
@Temporal 속성 정리
날짜 타입 (java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
참고로 LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다.
속성 | 설명 | 기본 값 |
value | TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (예: 2013–10–11) TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (예: 11:11:11) TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이 스 timestamp 타입과 매핑 (예: 2013–10–11 11:11:11) |
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑
- @Lob에는 지정할 수 있는 속성이 없다.
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
- CLOB: String, char [], java.sql.CLOB
- BLOB: byte [], java.sql. BLOB
@Transient
이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장도 하지 않아 조회가 불가능하다.
객체에 임시로 어떤 값을 보관하고 싶을 때만 사용한다.
참고자료
자바 ORM 표준 JPA 프로그래밍 - 김영한
자바 ORM 표준 JPA 프로그래밍 강의 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
2023. 02.07 11:35 복습 및 정리 마무리
댓글