[프로그래밍] JPA

[JPA] JPA와 Column

JHVan 2024. 5. 5. 14:51

@Column

영속 객체의 필드와 데이터베이스 테이블의 열(column)을 매핑할 때 사용.

옵션 기능을 제공하며 이를 통해 영속 객체 필드의 속성을 정의할 수 있음.

대부분 선택적으로 사용하며 기본값이 지정되어 있음.

JPA 와 Column

@Lob

RDBMS에서 대규모 데이터를 저장하기 위해 BLOB 또는 CLOB 데이터 유형을 지원함.

BLOB(Binary Large Object)은 기가 바이트까지의 이미지, 파일, 기타 유형의 데이터를 저장함.

CLOB(Character Large Object)은 기가 바이트까지의 긴 문자열을 저장함.

@Lob 어노테이션은 객체의 필드나 속성의 유형에 따라 BLOB이나 CLOB으로 구분됨.

주로 @Basic 어노테이션과 함께 LAZY 로딩으로 선언하여 대규모 데이터를 필요할 때만 로드하도록 하여 성능을 최적화할 수 있음.

LOB

@Enumerated

열거형(enum) 데이터를 데이터베이스에 매핑할 때 사용.

Java의 Enum 타입으로 선언된 값은 기본적으로 배열과 유사하게, 각 항목이 'ordinal'이라는 인덱스 값에 연결되어 있는 Enum의 순서를 기반으로 하는 정수 값.

데이터베이스에 Enum 유형의 필드나 속성을 매핑할 때, @Enumerated 어노테이션을 사용하지 않으면  EnumType.ORDINAL을 적용.

이는 Enum 항목의 순서(ordinal)를 데이터베이스에 저장, 이 방식은 적은 DB의 저장용량을 사용하지만 Enum의 정의 순서가 바뀌면 데이터베이스에 저장된 값과의 일치성이 깨질 수 있음.

@Enumerated(EnumType.STRING)을 명시하여 Enum의 이름을 문자열로 데이터베이스 필드에 저장하면 Enum의 순서가 변경되어도 데이터베이스에 저장된 값에 영향을 미치지 않고 데이터베이스에서 직접 값을 읽었을 때도 정확한 저장된 Enum값을 알 수 있음.

@Transient

적용된 필드는 데이터베이스에 저장되지 않음.

주로 실행 시점에 참조되거나 계산되어야 하는 필드에 사용됨.

속성 기반 접근 시에는 getter 메소드에 @Transient 어노테이션을 적용함.

자바의 transient 키워드와 거의 같음.

엔티티 필드에 transient를 붙여서 저장하지 않는 것을 선택하는 이유
엔티티 내에 일시적인 상태나 계산을 위한 데이터를 관리할 필요가 있기 때문.

엔티티에 저장하지 않을 필드를 포함시키는 몇 가지 이유:

객체 지향 프로그래밍의 일관성: 
객체 지향 프로그래밍에서는 데이터와 행동을 하나의 객체 내에 캡슐화하는 것이 일반적.
엔티티에 모든 관련 데이터와 메소드를 포함시키면, 
객체의 일관성을 유지하고, 사용과 관리가 용이해짐.

애플리케이션 로직의 중앙화:
엔티티가 계산이나 임시 데이터 처리를 포함함으로써, 
관련 로직을 하나의 위치에서 관리할 수 있음.
이는 코드의 재사용성과 유지보수성을 향상시킴.

유연성과 확장성:
애플리케이션의 요구사항이 변경되어 일시적으로 사용되던 데이터가 
영구적으로 저장되어야 할 필요성이 생길 경우,
@Transient 어노테이션을 제거하는 것만으로도 쉽게 변경할 수 있으며,
이는 애플리케이션의 유연성과 확장성을 보장.

프레임워크와의 호환성: 
특정 프레임워크나 라이브러리를 사용할 때,
엔티티의 모든 필드가 영속화 과정에 참여하지 않더라도,
프레임워크가 요구하는 특정 구조나 형태를 유지할 필요가 있는 경우,
transient나 @Transient를 사용하여 필요한 구조를 유지하면서
일부 데이터를 영속화에서 제외할 수 있음.

'[프로그래밍] JPA' 카테고리의 다른 글

[JPA] JPA와 cascade, orphanRemoval  (0) 2024.05.05
[JPA] JPA 와 연관관계  (0) 2024.05.05
[JPA] JPA의 기본 키 생성 전략  (0) 2024.05.04
[JPA] Entity Mapping  (0) 2024.05.04
[JPA] JPA의 영속성 컨텍스트  (0) 2024.05.03