본문 바로가기

카테고리 없음

[JPA] 엔티티 필드와 컬럼 매핑

앞에서 엔티티 테이블 매핑에 대해 알아 보았다면, 지금은 필드와 컬럼 매핑에 대해 보려 한다.
개념적인 내용으로 깊이있는 이해가 필요하다기 보단, 사용법과 이런 것이 있구나를 다루게 될 것 같다.

주 내용이 사용법이다 보니, 간단한 예시를 통해 풀어나가겠다.

이렇게 Member 테이블과 매핑되는 클래스가 있고, 그 안에 필드를 컬럼에 매핑하는 어노테이션들이 있다.

우선 필드를 매핑하는 어노테이션은 사진과 같은 종류들이 있다.

그 중 컬럼에 매핑하는 것을 먼저 보겠다.

name
객체와 컬럼에 사용되는 이름이 서로 다를 때, 이를 맞추기 위해 @Column의 name속성을 사용하게 된다.
이것을 사용해서 이름이 서로 다르더라도 컬럼 이름에 맞게 지정해 줄 수 있다.

insertable, updatable
이것은 컬럼을 수정했을 때, 이 컬럼부분을 디비에 반영을 할 건가 하는 설정이다.
기본은 true이고, 만약 false로 선언해준다면 컬럼의 수정이 일어나도 디비에 반영이 되지 않는다.

nullable
기본은 true인데, false로 해두면 not null 제약 조건이 붙는다.

unique
unique제약 조건을 걸고 싶으면, unique = true제약 조건을 걸면 된다.
근데, 잘 안쓰게 된다. 왜냐면

이름이 랜덤처럼 이상하게 나온다. 이렇게 되면 운영에서는 사용하지 못할 것이다.
운영에서는 Exception unique 제약 조건이 걸리면 딱, 아 이것땜에 에러가 나오는구나 하고 알아야 하는데, 이렇게 나오면 반영하기 어렵다

그래서 이렇게 조건을 넣으면 안되고, @Table(uniqueConstraints = )를 통해 조건을 걸 수 있다.

columnDefinition
근데 만약 컬럼 정의를 자기가 직접 하고 싶다면

이렇게 정의를 할 수 있다.

precision
BigDecimal같이 엄청 큰 숫자에는 precision같이 소수점을 포함한 전체 자릿수로 표현할 수 있다.

여기까지 @Column에 대한 속성들을 살펴 보았다.
이제 다른 매핑들에 대해서도 간단하게만 언급하겠다.

@Temporal

날짜 타입을 매핑할 때 사용한다.
옛날에 쓰던 사람은 필요하지만, 요즘 시대에는 필요하지 않다.
자바 8이 되면서 LocalDate, LocalDateTime을 사용할 때 생략이 가능하기 떄문에 그냥 사용하면 된다.

이런 식으로 LocalDate, LocalDateTime으로 써주면, hibernate가 유추해서 알아서 처리한다.

@Lob

디비에는 varchar를 넘어서는, 굉장히 큰 컨텐츠를 넣고 싶다면 Lob을 사용한다.
clob과 blob이 있는데, String, char[] 자료형이면 자동으로 clob이 생성된다.
그 외에는 blob으로 매핑 된다.

@Transient

이거는 매핑하지 않고 싶을 때, 사용한다.
예를 들어 private int temp;가 있다고 가정하자. 이것은 디비와 매핑하고 싶지 않고, 메모리에서만 계산하고 싶어! 이럴 때 사용한다.

@Enummerated

Enum타입을 매핑할 때 사용된다. Enum클래스는 상수 열거형 클래스로 상수만 가지고 있는 클래스를 표현할 때 사용된다.
이렇게 상수를 저장하고 사용하고 싶지만, 디비에는 정확히 Enum과 알맞는 컬럼 타입이 없기 때문에 @Enumrated로 매핑해줘야 한다.
하지만 이것을 사용할 때, 주의해야 할 점이 있다.
예를 들어, Enum클래스에 USER, ADMIN을 선언했다면 디비 컬럼에는 USER는0 ADMIN은 1로 저장이 된다.

하지만 만약 추후에 Enum클래스가 수정되어 GUEST, USER, ADMIN으로 바뀌었다고 가정해보자.
그럼 GUEST가 0이되고 USER가 1이되니 원래 있던 값들이 꼬여버린다.
그래서 단순히 @Enumrated를 사용하지 않고, 이러한 상황을 방지하기 위해 @Enumrated(EnumType.STRING)을 필수적으로 사용해야 한다.

즉, Enum의 문자 그대로를 넣어줘야 한다.