본문 바로가기
Programming/JPA & Spring Data JPA 기초

20. 기타 AttributeConverter, @Formula, @DynamicUpdate(@DynamicInsert), @Immutable, @Subselect

by JKROH 2023. 4. 5.
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* AttributeConverter

  • 매핑을 지원하지 않는 자바 타입과 DB 타입 간 변환 처리를 담당한다.
    • ex) boolean 타입을 char 타입으로 매핑하고 싶을 때

  • open_yn (char)를 opened (boolean)에 매핑하고 싶다. 이걸 AttrivuteConverter가 해준다.

  • AttributeConverter를 구현한 클래스를 먼저 만든다.
  • AttributeConverter에는 convertToDatabaseColumn()convertToEntityAttribute()가 정의되어 있다.
    • convertToDatabaseColumn() : 엔티티 속성을 DB 칼럼 값으로 바꿔준다.
    • convertToEntityAttribute() : DB칼럼 값을 엔티티 속성으로 변환해준다.
  • 위 두 메서드를 구현하면 된다.
    • convertToDatabaseColumn() : 엔티티 속성이 true 면 DB 에 "Y"를 넣는다. false면 "N"을 넣는다.
    • convertToEntityAttribute() : DB 값이 Y 면 엔티티 속성은 true, Y가 아니면 false가 된다.
  • 이후 엔티티 매핑을 할 때, @Convert 애너테이션을 붙이고 해당 애너테이션에 구현 컨버터로 타입을 지정해준다.

 

* @Formula

  • SQL의 실행 결과를 특정 속성에 매핑하고 싶을 때 사용한다.
    • 주로 조회를 위한 매핑 처리를 할 때 사용한다. (INSERT, UPDATE 쿼리의 결과는 매핑 대상에 포함되지 않는다)
    • 하이버네이트에서 제공하는 기능이다.
    • 주로 DB 함수를 호출한 결과, 서브 쿼리의 결과를 매핑할 때 사용한다.

  • categoryName 속성은 category 테이블 중 cat_id가 cat 인 엔티티의 name과 매핑된다.

 

* 수정 쿼리의 칼럼

  • 수정 쿼리는 기본적으로 모든 칼럼을 포함한다.

  • notice 객체를 가져와서 open()을 수행하면 notice 객체 내의 opend 속성이 true로 바뀐다.
  • 그러면 UPDATE 쿼리에는 모든 칼럼이 수정 대상으로 포함된다.
  • 경우에 따라서는 실제로 수정된 칼럼만 UPDATE 쿼리에 넣고 싶을 수 있다. 이는 @DynamicUpdate로 해결한다.

 

* @DynamicUpdate / @DynamicInsert

  • @DynamicUpdate : 변경된 칼럼만 UPDATE 쿼리에 포함시킨.
  • @DynamicInsert : null이 아닌 칼럼만 INSERT 쿼리에 포함시킨다.
    • 주의 : 디폴트값이 있는 칼럼에 null을 넣고 싶어도 null은 INSERT 쿼리에 추가되지 않으니 뜻하지 않게 디폴트값이 입력될 수 있다. 즉, null을 지정해야 하는 경우에는 사용하지 말자.

  • Notice클래스에 @DynamicUpdate 애너테이션을 붙이고 Notice#open()을 사용하면 UPDATE 쿼리에 open_yn 칼럼 값만 해당된다.

 

* @Immutable

  • 해당 엔티티를 변경 추적 대상에서 제외한다.
    • 변경 추적을 위한 메모리 사용이 감소한다.
    • 주로 조회의 목적으로만 사용되는 엔티티를 매피할 때 사용된다.
    • @Immutable이 적용된 엔티티도 저장은 된다.
    • 코드 수준에서 persist()하지 않도록 주의하자.
  • 클래스에 애너테이션을 붙인다. 당연하지 엔티티 다루는 거니까.

 

* @Subselect

  • SELECT 쿼리의 결과를 엔티티로 매핑할 때 사용한다.
    • 수정 대상이 아니므로 @Immutable과 함께 사용한다.
    • 테이블과 1대1 매핑이 아닌, 뷰처럼 SELECT한 결과를 매핑하는 것이기 때문이다.

  • @Subselect에 넘어간 SELECT 쿼리의 결과로 나온 테이블을 ArticleListView와 매핑한다.
  • ArticleListView에서 SELECT 를 하면, ArticleListView에 붙은 SELECT를 FROM으로 감싸서 만든 테이블에서 SELECT를 한다.

 

* 기타

  • 상속 매핑
  • 네이티브 쿼리
  • 하이버네이트 애너테이션
    • @CreationTimestamp
    • @UpdateTimestamp
반응형

댓글