1. 필드와 컬럼 매핑 예제
1) Member 클래스
package hellojpa;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Entity
@Table(name="member")
@Getter
@Setter
public class Member {
@Id
private Long id;
@Column(name = "name") //객체명은 username인데, DB 컬럼명은 name일때
private String username;
private Integer age;
@Enumerated(EnumType.STRING) //사용자를 회원과 관리자로 구분한다. ENUM클래스를 만들어서 import해와야한다.
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) //생성일자, 수정일자 같은 컬럼의 날짜 타입
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob //varchar타입 이상의 큰 데이터인 CLOB, BLOB같은 데이터 타입
private String description;
@Transient
private int temp;
public Member() {
}
}
✔️@Column
name 옵션으로 DB 컬럼 이름을 지정한다.
(더 다양한 옵션도 있다.)
✔️@Enumerated
- JPA에서 자바의 enum 타입을 데이터베이스에 매핑할 때 사용한다.
- DB에는 Java의 enum 타입과 직접 매핑되는 타입이 없기때문에 enum값을 DB에 저장할 때, String으로 변환할 지 정수형으로 변환할지 선택할 수 있게 해주는 어노테이션이다.
💡기본타입인 ORDINAL은 사용하지 말자. (enum의 순서를 정수형으로 저장)
요구사항이 변경되어, ENUM 값이 변경된다면 데이터 일관성을 보장할 수가 없기 때문이다.
✔️@Temporal
- 날짜/시간 타입을 DB에 매핑할 때 사용한다.
💡요즘엔 이 어노테이션을 쓰지 않고 LocalDate, LocalDateTime 타입을 쓴다.
하이버네이트에서 타입만 보고도 알 수 있기때문이다.
✔️@Lob
- CLOB(Character Large Object)나 BLOB(Binary Large Object) 과 같은 대용량 데이터를 DB에 저장할 때 사용한다.
✔️@Transient
메모리에서만 사용하고 DB에 넣고 싶지는 않을 때 사용하는 어노테이션이다.
2) Enum 클래스
package hellojpa;
public enum RoleType {
USER,ADMIN
}
3) 애플리케이션 실행부
package hellojpa;
import jakarta.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
}
}
✅로그
Hibernate:
create table member (
id bigint not null,
age integer,
createdDate timestamp(6),
description clob,
lastModifiedDate timestamp(6),
roleType varchar(255) check (roleType in ('USER','ADMIN')),
name varchar(255),
primary key (id)
)
✅실행 결과(DB)
Member클래스에 컬럼 매핑을 한 그대로 스키마 생성이 완료되었다.
2. @Column 의 옵션들
옵션 | 설명 | 기본값 |
name | DB 컬럼명 지정 | 객체 필드명 |
nullable | 컬럼의 NULL 허용 여부 지정 | true |
unique | 컬럼 값이 유니크(중복되지 않음)해야 하는지 지정. *유니크 키의 이름이 랜덤으로 지정되기 때문에 이름 반영이 어렵다. |
false |
length | 문자열 타입의 컬럼 길이 지정 | 255 |
insertable | 엔티티 저장 시, 컬럼 포함 여부 지정 | true |
updatable | 엔티티 업데이트 시, 컬럼 포함 여부 지정 | true |
columnDefinition | DB의 컬럼 정의를 직접 기술 | |
precision | 소수점 포함한 전체 자릿수 지정, BigDecimal, BigInteger 타입에서 사용된다. 정밀한 소수를 다룰 때만 사용! | |
scale | 소수점 이하 자리수 지정.(BigDecimal, BigInteger타입에서 사용가능) |
💡unique 옵션을 쓰면 이름이 랜덤으로 지정되기 때문에 원하는 이름을 반영하기가 어렵다.
그래서 unique 옵션은 @Table(uniqueConstraints="UK name") 으로 지정하는 방식을 권장한다.
'인프런 김영한 강의 정리 > 자바 ORM 표준 JPA 프로그래밍 기본편' 카테고리의 다른 글
H2 새로운 데이터베이스로 접속 오류 해결하기 (0) | 2024.06.10 |
---|---|
JPA 기본 | 기본키 매핑 | @id, @GeneratedValue (0) | 2024.06.10 |
JPA 기본 | 데이터베이스 스키마 자동 생성 옵션 (0) | 2024.06.10 |
JPA 기본 | @Entity (0) | 2024.06.10 |
JPA 기본 | 영속성 컨텍스트 (0) | 2024.06.08 |