새롭게 공부한 어노테이션 - 1

Chooooo·2023년 12월 12일
0

인턴생활

목록 보기
14/19

😎 기록

이번에 프로젝트를 하면서 쓸만한 어노테이션에 대해서 학습했다. 그래서 나중에도 혹시 필요할 때 쓰려고 기록하려고 한다.

@Transient 어노테이션

@Transient는 엔티티 객체의 데이터와 테이블의 컬럼과 매핑하고 있는 관계를 제외하기 위해 사용한다.

위 어노테이션을 이해하기 위해서는 영속 대상에서 제외시키기 위해 사용한다고 이해해야 한다.

영속 대상에서 제외

무엇보다 영속(persistence)라는 개념은 JPA의 가장 근간이 되는 개념이다. 다시 말해 JPA에선 영속성 컨텍스트(Persistence context)라는 논리적인 패러다임의 구현체라 할 수 있는 엔티티 매니저(Entity Manager)가 존재하고, 이 엔티티 매니저에서 @Entity 객체를 관리하게 된다.

위에서 보면 엔티티 객체의 상태가 영속 상태(managed, persistend state) 일 때, 비로소 엔티티 매니저에 의해 관리된다. 영속 상태의 엔티티 객체는 엔티티 매니저에 의해 1. 변화에 대한 자동 감지(Dirty Checking), 2.CRUD SQL 자동 생성 작업 및 그외 일련의 모든 JPA의 내부적인 동작 프로세스에서 활용된다.

하지만 영속 대상에서 제외된다면 더는 해당 필드나 메서드는 엔티티 매니저의 관리 대상에서 제외됨을 의미한다. 즉 해당 필드에 대해 @Transient 어노테이션을 선언하게 되면 영속 대상에서 제외되어 앞서 설명한 1,2 작업들을 수행하지 않는다.

  • 이런 결과로 테이블의 컬럼과 매핑을 하지 않는다. 고 이해해도 무방하다.

예시와 사용법

  • @Transiend 사용법과 이에 대한 활용법
@Entity
public class Product {
    @Id
    private Long id;
    private String name;
    private BigDecimal price;
    private boolean isEvent;
    // ^-- 영속 제외 대상
    
    public void runEventProcess(){
        if(isEvent){
            // ... 이벤트 로직 수행
        }
    }

다음과 같이 상품 엔티티 객체가 존재하면,
여기서 살펴봐야 할 점은 isEvent 라는 필드이다. 이 필드는 Hooking 목적으로 특정 날짜나 시간이 되면 활성화(true)되어, 상품 가격에 대한 할인율 적용과 같은 상품에 대한 이벤트 로직을 적용시키기 위함이다.

이처럼 특정 필드에 대해 클래스에서만 사용되고, 테이블 컬럼으로 관리하고 싶지 않을 경우가 있다. 하지만 JPA는 @Entity 클래스에 포함된 모든 필드에 대해 영속 대상으로 간주하여 테이블의 컬럼과 자동으로 매핑시키는 작업을 수행해주기 때문에 다음과 같은 엔티티에 대한 로그를 살펴볼 수 있다.

Hibernate: 
    create table product (
       id bigint not null,
       is_event boolean not null, <-- 영속 제외 대상
       name varchar(255),
       price decimal(19,2),
       primary key (id)
    )
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글