티스토리 뷰

프레임워크/JPA

[JPA]필드와 칼럼 매핑

꼬마우뇽이(원종운) 2022. 1. 13. 17:56

이전 이야기

이전에는 우리가 작성한 객체를 엔티티로 식별되도록 JPA에게 알려주는 방법인 @Entity 애너테이션, 그리고 해당 엔티티가 매핑되는 테이블의 기본 키와 필드를 매핑하여주는 @Id 애너테이션, 엔티티가 매핑되는 테이블의 정보를 명시하는 @Table 애너테이션에 대해서 알아보았습니다.

 

필드와 칼럼 매핑

기본 키가 아닌 다른 필드들이 테이블의 칼럼과 매핑을 위해서 어떻게 JPA에게 정보를 제공할 수 있는지, JPA는 어떠한 방법을 제공하는지에 대해서 알아보도록 하겠습니다. 

 

애너테이션 설명
@Column 필드와 칼럼을 매핑합니다.
@Enumerated Enum 타입의 필드와 칼럼을 매핑합니다.
@Temporal 날짜 타입의 필드를 칼럼과 매핑합니다. - java.util.Date 또는 java.util.Calendar
@Lob BLOB, CLOB 와 같은 데이터베이스가 지원하는
거대한 객체 타입의 필드를 칼럼과 매핑합니다.
@Transient 필드를 칼럼과 매핑하지 않습니다. 

 

@Column 애너테이션

객체의 필드와 매핑될 테이블(엔티티와 매핑된 테이블)의 칼럼을 명시합니다. 

 

@Column - javax.persistence.Column

 

속성 기능 기본값 및 설명
name 칼럼의 이름을 명시합니다 기본 값은 필드의 이름
nullable
(DDL)
null 값의 허용 여부를 명시합니다. 기본 값은 true
unique
(DDL)
해당 필드가 유니크 키와 매핑되는지를 명시합니다 기본 값은 false
insertable INSERT SQL 생성시 해당 필드를 포함할지를 명시합니다. 기본 값은 true,
엔티티 저장 시 해당 필드를 포함하는지를 명시합니다.
updatable UPDATE SQL 생성시 해당 필드를 포함할지를 명시합니다. 기본 값은 true,
엔티티가 수정 될 경우 해당 필드를 포함하는지를 명시합니다.
columnDefinition
(DDL)
DDL 생성 시 해당 필드에 대한 SQL fragment를 명시합니다. 기본 값은 빈 문자열입니다.
필드 타입에 맞게 자동으로 생성합니다.
table 해당 칼럼을 포함하는 테이블의 이름을 명시합니다. 기본 값은 주 테이블의 이름입니다.
length
(DDL)
필드가 문자열인 경우 칼럼의 길이를 명시합니다.필드가 문자열이 아닌 경우 적용되지 않습니다. 기본 값은 255,
필드가 문자열이 아닌 경우 적용되지 않습니다.
precision
(DDL)
BigDecimal, BigInteger 타입에서 소수점을 포함한 전체 자릿수를 명시합니다. 기본 값은 0
scale
(DDL)
BigDecimal, BigInteger 타입에서 소수의 자리수를 명시합니다. 기본 값은 0

 

DDL이 붙은 속성의 경우는 DDL을 자동으로 생성하여 주는 기능을 사용할 경우에만 적용된다는 의미이며, 칼럼 매핑과는 관련이 없습니다.

 

@Column 애너테이션을 사용하여 이전 글에서 작성하였던 Student 엔티티를 수정해 보도록 하겠습니다.

 

@Column 애너테이션을 추가한 못브

엔티티 클래스의 기본 키 필드가 "STUDENT_ID"라는 이름으로 칼럼과 매핑된 것을 확인할 수 있습니다.

 

@Column 애너테이션을 생략할 경우, @Column의 기본 값을 기준으로 @Column가 기본으로 적용됩니다.

단, 필드가 Primitive Type 일 때와 Reference Type 일 때 차이가 있으니 주의하여야 합니다.

 

왜 다른지는 @Column의 nullable 속성의 기본 값을 살펴보면 좋습니다. 이유는 여러분의 생각을 위해 남기지 않겠습니다.

 

@Enumerated 애너테이션

객체의 필드가 Enum 타입일 경우 칼럼과 매핑하는 전략을 명시합니다. 

 

@Enumerated - javax.persistence.Enumerated

 

속성 기능 기본값 및 설명
value Enum 타입이 매핑되는 전략을 명시합니다. 기본 값은 ORDINAL ( Enum 순서 )
다른 값은 STRING ( Enum 이름 )

 

전략 중 STRING 을 Student 엔티티에 Enum 필드를 만들어서 적용해 보겠습니다.

 

@Enumerated 애너테이션을 추가한 모습 - STRING 전략

 

Enum의 이름 "JUNIOR"가 칼럼의 값으로 매핑된 것을 확인할 수 있습니다.

 

만약 전략 중 STRING이 아닌 ORDINAL을 적용하면 어떻게 매핑될까요? 확인해 보겠습니다.

 

@Enumerated 애너테이션을 추가한 모습 - ORIDNAL 전략

 

Enum의 이름인 "JUNIOR"이 아닌 Enum 순서, JUNIOR의 경우는 0, 0으로 매핑된 것을 확인할 수 있습니다. "SENIOR" 였다면 0이 아니라 1이었겠죠 !? 또한 칼럼의 타입이 "CHARACTER"에서 "INTEGER"로 변경된 것 또한 확인할 수 있습니다.

각 전략의 장단점을 정리하면 다음과 같습니다. 대부분의 경우 STRING 전략을 추천합니다. 우리가 작성하는 애플리케이션은 많은 요청 사항이 생기고 서비스가 종료될 때까지 수많은 변경사항에 대응하기 때문에 어떻게 변경될지 모르기 때문입니다.

 

전략 장점 단점
STRING 새로운 Enum이 추가되거나 순서가 바뀌어도 안전하다. ORDINAL 전략에 비하여 데이터베이스에서 차지하는 크기가 크다.
ORDINAL STRING 전략에 비하여 데이터베이스에서 자치하는 크기가 작다. 새로운 Enum이 추가되거나 순서가 바뀌면
문제가 발생한다.

 

@Temporal 애너테이션

객체의 필드가 날짜 타입(java.util.Date, java.util.Calendar)일 경우 매핑될 칼럼의 자료형을 명시합니다.
데이터베이스에서 지원하는 날짜 자료형인 date, time, timestamp를 제공하며 TemporalType Enum에 명시되어 있습니다.

 

@Temporal - javax.persistence.Temporal

 

TemporalType - javax.persistence.TemporalType

 

java.util.Date 타입의 필드를 칼럼에 매핑 시켜보도록 하겠습니다.

 

@Temporal 애너테이션을 추가한 모습

 

데이터베이스의 날짜 자료형 중 하나인  DATE로 성공적으로 매핑된 것을 확인할 수 있었습니다.

 

@Lob 애너테이션

객체의 필드를 데이터베이스에 지원하는 BLOB, CLOB 타입과 매핑하여줍니다. 객체의 필드의 타입에 따라 BLOB 또는 CLOB로 매핑됩니다. Lob는 Large Object의 약어이며, 사이즈가 큰 객체를 데이터베이스의 칼럼에 매핑하고 자 할 때 주로 사용합니다.

 

별도의 속성은 없으며, 해당 애너테이션이 적용된 객체의 필드의 자료형에 따라 자동으로 CLOB 또는 BLOB으로 인식하여 적용됩니다.

 

매핑 방법 매핑 적용 필드
CLOB String, char[], java.sql.CLOB
BLOB byte[], java.sql.BLOB

 

@Transient 애너테이션

엔티티가 데이터베이스에 저장 또는 조회 등의 작업을 할 때 제외될 필드를 명시합니다. 해당 애너테이션이 붙은 필드는 영속화되지 않습니다. 주로 임시 값을 보관하고 싶을 때 사용됩니다.

 

한번 사용해 보도록 하겠습니다.

 

 

 

객체의 age 필드에 10이라는 값이 있지만, 데이터베이스에 엔티티가 저장될 때는 영속화되지 않은 것을 확인할 수 있습니다. 그렇기 때문에 별도의 칼럼과 매핑이 되지도 않았습니다.

'프레임워크 > JPA' 카테고리의 다른 글

[JPA]연관관계  (0) 2022.01.14
[JPA]객체와 엔티티 매핑  (0) 2022.01.13
[JPA]JPA에 대하여  (0) 2022.01.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함