JPA/JPA 기본

12. 필드와 컬럼 매핑

sdafdq 2023. 10. 21. 18:42

테이블 < - > @Entity 매핑은 그냥 뭐 이름정도 맞춰준다거나 별거 없는데,

 

필드랑 컬럼은 좀 타입이라던지 몇개 있음.

 

 

요구사항

1. 일반회원과 관리자로 구분

2. 회원가입일과 수정일이 있어야 함.

3. 회원을 설명할 수 있는 필드가 있어야 하며, 이 필드는 길이제한이 없다.

 

?? 3번은 좀 위험한거 아닌가..

 

 

여튼 그러면

id, username, 생성일, 수정일, 설명, 역할

요 6개쯤?

 

 

@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 createDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;

    public Member(){}

}

@Entity로 하고

id는 @Id로 JPA가 인식하게 하고

필드명은 username으로 하고 싶은데 테이블명이 name인 케이스 인가 봄

age는 넘어가고,

 

@Enumerated(EnumType.STRING)

이거는 일단, 저 타입이 Enum이라는 거임.

그리고 속성으로 EnumType.STRING을 넣어줬는데,

이게 default가 EnumType.ORDINAL임.

말 그대로 문자열로 할거냐, 순서로 할거냐.

당연 문자열이 더 정확함.  그냥 무조건 문자열로 쓴다고 생각하면 됨.

public enum RoleType {
    USER, ADMIN
}

만약 여기다 맨 앞에 GUEST 추가하면 원래 USER가 0번이었는데 GEUST가 0번 되는거임.

 

@Temporal 시간 관련이란 뜻. DB에도 시간타입이 있기에, 이렇게 시간관련 필드라고 해 줘야 함.

그 다음 TemporalType, 즉 시간 타입이다 이거임.

보통 자바에는 날짜랑 시간 묶어서였나 그런데,

DB에서는 DATE(날짜), TIME(시간), TIMESTEMP(날짜와 시간) 이렇게 3가지가 있음.

그래서 지정을 해 줘야 함.

 

여튼 지정해 줬고,

 

 

 

@Lob는 varchar를 넘어선 굉장히 큰 데이터를 쓰고 싶을 때 넣으면 된다.

필드에서 String일 경우에는 CLOB 타입이 되고, 다른 것 이면 BLOB 타입이 된다.

CLOB은 char lob 뭐 그런 것 같고,

BLOB은 byte lob 인 듯 하다.

 

그리고, 여기엔 안나왔는데 

@Transient 라는 것이 있다.

이거는 매핑을 안하고 싶은, 즉 테이블 정보에 넣고 싶지 않은 필드이다. 즉 그냥 객체의 필드이다. 테이블과 연관없는.

 

 

 

다음, @Column의 속성에 대해 자세히

 

name은 테이블의 열명을 적어주면 된다. 기본값은 객체의 필드 이름이다.

insertable, updatable은 저거 false로 해두면 insert 쿼리 날리거나 update 쿼리 날릴 때 반영이 되지 않는 것 이다.

뭐 등록하기 싫다거나, 아니면 변경(update)하기 싫다거나 할 때 씀.

 

nulldable은 말 그대로 null 할 수 있는지 여부

unique 저건 잘 안씀. 유니크 한답시고 UUID처럼 열이름이 이상한 문자처럼 보이게 됨. 어떻게 식별함.

보통 저런 거 하고 싶으면 설명처럼 @Table에다가 uniqueConstraints 함.

저렇게 하면 이름까지 원하는 데로 줄 수 있다고 함.

 

열에 대한 정의를 직접 하고 싶다면,

columnDefinition = "옵션들"

DB에 create table할 때 타입과 옵션들 줄 때 처럼 하면 된다. 

 

length는 길이.

 

precision이나 scale은 아주 큰 숫자 혹은 소수점 DB에 넣고 싶다고 할 때 사용한 다고 함.

자바에서는 BigDecimal이나 BigInteger도 사용 가능함

 

 

 

 

@Temporal 이것도 사실 이제 옛날거다.

java 8 나오면서 LocalDate, LocalDateTime이 나왔는데,

이게 JPA에서 DB의 Date로 인지가 된다.

그래서 하이버네이트 요즘꺼 쓰면 그냥 쓰면 됨. 따로 애노테이션 안 붙여도

 

당연히 Date는 날짜,

DateTime은 시간까지.

 

LocalDate는 DB의 테이블에서 Date 타입으로,

LocalDateTime은 DB의 테이블에서 timestamp 타입으로

'JPA > JPA 기본' 카테고리의 다른 글

14. 예제  (0) 2023.10.22
13. 기본 키 매핑  (0) 2023.10.21
11. DB 스키마 자동 생성  (0) 2023.10.21
10. 객체와 테이블의 매핑  (0) 2023.10.21
9. 준영속 상태  (0) 2023.10.20