본문 바로가기

반응형

JPA

(15)
[하이버네이트 유저 가이드 파헤치기] @Where - 5.9 최근 이 연재글에서 @Formula와 @ColumnTransformer에 대해서 다루었다. @Formula 어노테이션을 사용하면 가상 칼럼을 선언해서 애플리케이션단에서 수행할 계산식을 데이터베이스에 위임하거나 카운트 성능을 최적화할 수 있다. @ColumnTransformer는 엔티티를 영속화하거나 불러올 때 특정 칼럼에 대해서 계산식을 적용할 수 있다. 둘 다 JPA를 이용해 개발자가 애플리케이션단에서 수행할 작업을 데이터베이스에 위임할 수 있다는 공통점이 있다. 이번 글에서는 엔티티를 조회할 때 특정 조건을 적용할 수 있는 @Where 어노테이션을 다루겠다. 5.9.1. @Where 당신은 엔티티나 연관 관게에 있는 엔티티 컬렉션을 사용자 정의 SQL 기준을 이용해 걸러내고 싶을 때가 간혹 있을 수 ..
[하이버네이트 유저 가이드 파헤치기] @Formula - 2.3.20 2.3.20. @Formula 때때로, 당신은 JVM보다 데이터베이스가 어떤 계산을 수행하는 것을 원할 때 당신은 가상 칼럼의 일종을 만들 수 있다. 당신은 데이터베이스 칼럼으로 매핑되는 엔티티 속성 대신 SQL 조각(formula라고 불림)을 엔티티 속성으로 사용할 수 있다. 이 속성은 읽기 전용이다. (이 속성의 값은 당신이 선언한 formula fragment에 의해 계산된다.) 당신은 @Formula 어노테이션이 데이터베이스 이식성에 영향을 미치는 native SQL 문을 사용하는 것을 인지해야한다. (필자 해설: JPQL이 아니라 native SQL이기 때문에 RDBMS의 종류를 교체하는 경우 이식성에 안 좋을 수 있다는 의미) 원문 Sometimes, you want the Database t..
[하이버네이트 유저 가이드 파헤치기] Column transformers: read and write expressions - 2.3.19 2.3.19. Column transformers: read and write expressions 하이버네이트는 @Basic 타입에 매핑되는 칼럼의 값을 읽고 쓰는데 사용하는 SQL를 사용자가 정의할 수 있도록 허용한다. 예를 들면, 만일 당신의 데이터베이스가 데이터 암호화 함수 세트를 제공한다면, 당신은 아래 예제와 같이 개별 칼럼에 대해서 암호화 함수 세트를 호출할 수 있다. 원문 Hibernate allows you to customize the SQL it uses to read and write the values of columns mapped to @Basic types. For example, if your database provides a set of data encryption fu..
[하이버네이트 유저 가이드 파헤치기] Generated properties - 2.3.18. 2.3.18. Generated properties 생성된 속성(Generated properties)은 데이터베이스에 의해 생성된 값을 가지는 속성이다. 일반적으로 하이버네이트 애플리케이션은 데이터베이스가 생성하는 속성들을 포함하는 오브젝트를 갱신해야한다. 그러나 해당 속성을 데이터베이스가 생성하는 속성으로 표시하면 하이버네이트가 대신 오브젝트를 갱신한다. 하이버네이트가 생성된 속성(Generated properties)이 정의된 엔티티를 위해 Insert 문이나 Update 문을 발행할 때, 하이버네이트는 즉시 데이터베이스로부터 생성된 값을 탐색하기 위해 select 문을 발행한다. 생성된 속성은 추가적으로 insert와 update를 불가능하도록 설정해야한다. 오직 @Version과 @Basic 타..
[하이버네이트 유저 가이드 파헤치기] JPA 2.1 AttributeConverters 실습 모든 실습 코드는 필자의 github의 리포지토리에서 볼 수 있다. 실습 환경은 spring boot(2.2.6) + kotlin이다. 자세한 사항은 build.gradle.kts 참고바란다. 공식 문서에 나와있는대로 해보기 우선 공식 문서의 예제를 그대로 재현해서 attributeConverter가 제대로 동작하는지 테스트해보겠다. example1. 엔티티 Event 정의 @Entity class Event( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(insertable = false, updatable = false) val id: Long? = null, @Convert(converter = PeriodStringConverte..
[하이버네이트 유저 가이드 파헤치기] JPA 2.1 AttributeConverters - 2.3.16 원래 순서상 2.3.6. Custom BasicTypes을 다뤄야겠지만 동일한 기능을 더 간단하게 구현할 수 있는 JPA 2.1 AttributeConverters 가 있어서 해당 기능을 다루고자 한다. 별도로 필자가 spring boot + kotlin 환경에서 AttributeConverters를 테스트해본 내용도 같이 작성할 예정이다. 2.3.16. JPA 2.1 AttributeConverters 비록 하이버네이트가 custom types를 제공해왔지만, JPA 2.1 구현체로서, AttributeConverter 역시 제공한다. 사용자 정의 AttributeConverter를 이용해 애플리케이션 개발자는 주어진 JDBC type을 엔티티 기본 타입으로 매핑할 수 있다. 아래 예제에서는 java...
[하이버네이트 유저 가이드 파헤치기] BasicTypeRegistry & Explicit BasicTypes - 2.3.4, 2.3.5 2.3.4. BasicTypeRegistry 우리는 이전에 하이버네이트 타입은 자바(JAVA) 타입도 SQL 타입도 아니지만, 하이버네이트 타입은 둘(자바 타입, SQL 타입) 모두를 이해하며 둘 사이의 변환을 수행한다고 언급했었다. 그러나 이전 챕터의 Example 3. 에서 어떻게 하이버네이트는 org.hibernate.type.StringType과 java.lang.String 속성이 연결되며, org.hibernate.type.IntegerType은 어떻게 java.lang.Integer 속성으로 연결되는지 알았을까? 정답은 org.hibernate.type.BasicTypeRegistry라고 불리는 하이버네이트 내부의 서비스에 있다. org.hibernate.type.BasicTypeRegist..
[하이버네이트 유저 가이드 파헤치기] @Basic 어노테이션 & @Column 어노테이션 - 2.3.1 ~ 2.3.3 2.3 Basic types Basic value type은 보통 단일 데이터베이스 칼럼과 집계되지 않는 단일 자바 타입(JAVA type)을 매핑한다. 하이버네이트는 JDBC 명세서에서 추천하는 자연스러운 매핑을 따르는 여러가지 내장된 기본 타입(basic type)을 제공한다. 내부적으로 하이버네이트는 특정한 org.hibernate.type.Type을 자바 타입과 데이터베이스 칼럼로 매핑할 떄 BasicTypeRegistry를 사용한다. 원문 Basic value types usually map a single database column, to a single, non-aggregated Java type. Hibernate provides a number of built-in basic type..

반응형