@Transient

 

@Transient는 Java Persistence API (JPA)에서 사용되는 애노테이션으로, 엔티티 클래스의 특정 필드가 데이터베이스 테이블에 매핑되지 않도록 지정

 

즉, 해당 필드는 데이터베이스와 상호작용하지 않으며, 영속성 콘텍스트(persistence context)에 포함되지 않음

 


1. 주요 특징

  • @Transient로 선언된 필드는 데이터베이스에 저장되지 않으며, 쿼리 결과로 조회되지 않음
  • 해당 필드는 JPA 관리에서 제외되며, 오직 애플리케이션 내부에서 사용
  • @Transient는 JPA 표준 애노테이션
  • 데이터베이스와 연관이 없는 비즈니스 로직이나 캐싱용 필드 등에 사용

 

2. 사용 예

 

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private double price;

    private double discount;

    @Transient // 데이터베이스에 저장되지 않음
    private double discountedPrice;

    public double getDiscountedPrice() {
        return price - discount; // 애플리케이션 내에서만 계산
    }
}
  • 설명:
    • discountedPrice는 데이터베이스 테이블에 저장되거나 조회되지 않음
    • 대신 애플리케이션 로직에서 계산된 값으로 사용

 

3. 동작 원리

  • JPA는 엔티티를 영속화할 때 @Transient로 선언된 필드를 무시
  • @Transient 필드는 데이터베이스와 매핑되지 않으므로, INSERT, UPDATE, SELECT 쿼리에 포함되지 않음
  • 단순히 애플리케이션 내부의 메모리 변수로만 작동

 

4. Spring과의 차이점

JPA의 @Transient와 Spring의 @Transient(from org.springframework.data.annotation.Transient)는 다른 용도로 사용

  • JPA의 @Transient:
    • JPA 표준 애노테이션으로, 데이터베이스와의 매핑을 방지
    • Hibernate와 같은 JPA 구현체에서 동작

 

  • Spring Data의 @Transient:
    • Spring Data의 기능으로, MongoDB, Elasticsearch 등 다양한 데이터 스토리지와의 매핑에서 제외되도록 설정

 

5. 주요 사용 사례

  1. 계산된 값:
    • 예: 할인율, 합계, 평균 등 실시간으로 계산되는 데이터.
  2. 캐싱 데이터:
    • 애플리케이션에서만 임시로 유지하고, 영속성 저장소와 상관없는 데이터.
  3. 비즈니스 로직 필드:
    • 예: 세션 토큰, 사용자 상태, 일시적인 플래그.
  4. DTO 변환:
    • JPA 엔티티를 DTO로 변환할 때 추가적인 필드로 사용.