반응형

이전글에서 엔티티를 저장할때 필요없는 필드를 저장하지 않고 싶을 때 어노테이션을 직접 선언해서

저장시에 필드들을 저장하는 코드를 작성해보았었다.

 

그런데, 우연히 검색하다가 @Transient 어노테이션이 내가 원하는 그 동작을 하는것임을 알고 다시 글을 써보려고 한다.

😅😅


@Transient 어노테이션이 존재하는 이유

javax.persistance.Transient 어노테이션에는 주석으로 다음과 같이 설명되어 있다

Specifies that the property or field is not persistent.
It is used to annotate a property or field of an entity class, mapped superclass, or embeddable class.

이 설명으로 보아 특정 속성이나 필드가 영속성에 포함시키지 않는 경우에 엔티티 클래스에 사용이 가능하다는 것이었다.

 

javax.persistance 패키지 이하의 클래스들은 관계형 DB를 사용하는 클래스들에 대한 도움을 주는 클래스들이다.

mongodb 같은 nosql같은 경우에는 별도로 구현된 org.springframework.data.annotation.Transient

어노테이션 클래스를 사용하면 된다.

 


@Transient 클래스 사용해보기

 

이 어노테이션을 사용하기 전에 간단하게 데이터를 하나 저장해보았다.

@Data
@Document("testEntity")
public class TestEntity {

  @Id
  private String _id;
  private String value;

  private String name;

}
  @Test
  public void saveTest() {
    TestEntity testEntity = new TestEntity();
    testEntity.set_id("1234");
    testEntity.setValue("test");
    testEntity.setName("sam");
    mongoTemplate.save(testEntity, "testEntity");
  }

 

여기서 name 필드에 @Transient 어노테이션을 붙여 다시 저장해본다.

@Data
@Document("testEntity")
public class TestEntity {

  @Id
  private String _id;
  private String value;

  @Transient
  private String name;

}

name 필드가 빠져서 저장된걸 볼 수 있다.


@Transient 어노테이션을 필드, 메소드에 각각 적용이 가능한가?

https://gmoon92.github.io/jpa/2019/09/29/what-is-the-transient-annotation-used-for-in-jpa.html

 

Moon

Moon

gmoon92.github.io

 

해당 글에 따르면 javax.persistence.@Transient 어노테이션은 필드, 메소드에 각각 적용이 가능하나 

@Id 어노테이션이 필드에 붙어있으면 @Transient 어노테이션도 필드 단위로 적용을 해야 하며,

메소드 단위로 적용시 @Id 어노테이션도 Getter 메소드에 붙어있어야 제대로 동작한다고 설명을 해주시고 있다.

 

org.springframework.data.annotation.@Transient 어노테이션도 과연 그럴까?

우선 해당 어노테이션 클래스를 보면 위 어노테이션과 같이 필드, 메소드에 모두 적용할 수 있는 것으로 나와 있다.

 

Getter 메소드를 정의해서 @Transient 어노테이션을 적용해보자.

@Data
@Document("testEntity")
public class TestEntity {

  @Id
  private String _id;
  private String value;

  private String name;

  @Transient
  public String getName() {
    return this.name;
  }

}

 

테스트 코드를 실행시키면?

동일하게 name 필드가 빠져서 저장이 된 것을 볼 수 있었다.

 

@Id 어노테이션이 필드에 붙어있더라도 @Transient 어노테이션을 제외하고 싶은 속성의 getter 메소드에 선언해주어도 영속성 관리에서 제거할 수 있었다. 아마 spring data jpa의 규격과 spring data mongodb에서 @Transient 어노테이션을 구현한 사항이 조금 차이가 있었던 것 같다. 사용하는 개발자 입장에선 오히려 아무래도 이렇게 제약없이 마음대로 어노테이션을 다는 편이 더 편할 것 같다.


마무리

  • 스프링을 통한 mongodb 엔티티 개체를 관리할 때 영속성이 필요없는 데이터에 대해 필드나 메소드에 @Transient 어노테이션을 사용해 제거하자. 
  • 어떤 기능이 필요할 때는 일단 구현을 해보지 말고 충분히 검색을 해보자
  • 내가 구현한 내용보다 훨씬 쉽고 간단하고 원시 타입 변수에 대해서도 대응이 가능하다.
반응형