본문 바로가기

데이터 접근 기술/JPA27

@Converter, Enum Enum은 열거형이라고 불리는 데이터 유형입니다. 고정된 상수 집합을 하나의 클래스처럼 다룰 수 있기에 빈번하게 사용됩니다. JPA는 enum을 지원하며 데이터베이스에 열거형 상수를 저장하고 조회할 수 있도록 지원합니다. 일반적으로 JPA에서 enum을 매핑하기 위해 @Enumerated 애노테이션을 사용하여 매핑합니다. 혹은 @Converter를 활용합니다. Java @Entity public class Book { // ... @Enumerated(EnumType.STRING) private BookType type; // ... } Kotlin @Entity class Book constructor( ... @Convert(converter = BookTypeConvertor::class) val .. 2023. 7. 7.
Hibernate 5 Bootstrapping API 오늘은 Hibernate 5.0에서 재설계된 Bootstrapping API를 알아보자. BootStrapping이란 용어는 소프트웨어 컴포넌트의 초기화 과정과 시작을 의미한다. Hibernate에서는 JPA를 위한 완벽한 구성을 위해 SessionFactory의 instance 혹은 EntityManagerFactory instace를 빌딩 하는 과정을 이야기한다. 또한 부트스트랩 프로세스 중에 Hibernate 동작을 커스텀할 수도 있다. 즉 SessionFactory를 빌딩 한다는 것은 시작 및 런타임 동안 Hibernate가 필요로 하는 서비스를 가지고 있는 ServiceRegistry 구현을 가지도록 하는 것입니다. 그렇기 때문에 ServiceRegistry에서 애플리케이션의 도메인 모델과 데이.. 2023. 2. 1.
DTO와 Entity DataTransferObject : 데이터 전송 객체 Entity : 도메인 여러분은 DTO를 어떻게 활용하고 계신가요? 저는 스프링 부트를 사용하여 개발의 생산성을 충분히 느끼면서 개발을 하고 있습니다. 이 중 API 통신에 있어서 가장 편리한 ArgumentResolver가 Jackson 라이브러리로 JSON 데이터를 Object에 매핑해주는 기능을 정말 잘 사용하고 있습니다. 우리가 사용하는 엔티티는 도메인의 한 부분으로 JPA를 사용하신다면 데이터베이스와 직접적으로 연결되어있습니다. 이 말은 데이터베이스가 변경되지 않는 이상 엔티티는 변경에 꽉 닫혀있어야 함을 말하고 있습니다. 그래서 우리는 외부에서 들어오는 여러 데이터를 엔티티로 직접 검증하고 받지 않습니다. 그 이유는 프레젠테이션 계층은 변.. 2022. 12. 11.
상속관계 매핑 관계형 데이터베이스에는 슈퍼 타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 따라서 상속관계 매핑이란 객체의 상속 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑하는 것이다. 이러한 슈퍼 타입 서브타입의 논리 모델을 실제 물리 모델로 구현할 때 데이터베이스에서는 다음과 같은 방법을 제공한다. 1. 각각의 테이블로 변환한다. 이를 조인 전략이라고 한다. 2. 통합 테이블로 변환한다. 이를 단일 테이블 전략이라고 한다. 3. 서브타입 테이블로 변환한다. 구현 클래스마다 테이블 전략이라고 한다. JPA에서는 이러한 슈퍼 타입 서브타입 논리 모델을 여러 가지 방법으로 구현을 해도 전부 지원할 수 있다. 조인 전략 조인 전략은 정규화된 방식이다. 다음과 같이 매핑할 수 있다. @Entity @Inhe.. 2022. 12. 4.
값 타입 값 타입은 말 그대로 단순한 수치 정보이다. JPA에서 타입을 크게 분류하면 엔티티 타입과 값 타입이 존재한다. @Entity로 정의하는 객체는 엔티티 타입, 자바의 기본 타입이나 단순히 수치로 사용하는 타입을 값 타입이라 할 수 있다. 실제 우리가 값 타입을 활용할 수 있는 부분이 어디일까? 데이터베이스에서 여러 칼럼들을 모아 하나의 추상적인 객체로 표현할 수 있는 경우, 이를 애플리케이션 단에서 객체지향적으로 사용하고 싶다면 우리는 임베디드 타입을 고려해볼 수 있다. 복합 값타입이라고도하며 관련된 속성을 하나로 묶어 객체로 표현하는 것이다. 이는 또 다른 장점을 가지고 있는데, 클래스가 가지고있는 상태에 대해 책임을 질 수 있는 클래스가 존재하기 때문에 객체지향적으로 사용할 수 있다는 것이다. @Em.. 2022. 11. 20.
OSIV open-session-in-view? OSIV는 기본값을 true로 설정되어있다. 이후 WARN 로그가 남는다. OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 유지한다. 언제 JPA가 데이터베이스 커넥션을 가져올까? 트랜잭션 시작 시점에 영속성 콘텍스트가 데이터베이스 커넥션을 획득한다. 그럼 반환하는 곳은 어디일까? osiv가 켜져 있다면 트랜잭션이 끝나고 VIEW 계층까지 커넥션을 유지한다. 그렇기 때문에 우리가 view Template이나 API 컨트롤러에서 지연 로딩을 사용할 수 있던 것이다. 지연 로딩은 영속성 콘텍스트가 살아있어야 가능하고, 이는 기본적으로 데이터베이스와 커넥션을 유지한다. 다만 이 전.. 2022. 10. 31.
JPQL Pagination 우선 페이징에 관한 여러 관련 지식들을 복습하자. 페이징을 하기 위해선 다음과 같은 정보가 필요하다. 1. 한 페이지에 출력될 데이터 수 2. 한 화면에 출력될 페이지 수 3. 현재 페이지 번호 우선 전체적인 페이지 수를 알아야 한다. 이를 위해 데이터를 몇 개씩 가져올지에 대한 변수를 정의한다. public int createTotalPage(int limit){ int totalData = getTotalData(); int totalPage = totalData / limit; float remainder = totalData % limit; if ( remainder > 0 ) { totalPage += 1; } return totalPage; } public int getTotalData(..... 2022. 10. 30.
벌크연산 보호되어 있는 글 입니다. 2022. 10. 29.
N+1 문제 해결 JPA를 사용하기 위해 여러 공부를 하는 도중에 문제가 되는 상황을 발견했다. 도메인을 확인하고 테이블과 엔티티를 설계하는데 다대다 관계를 조인 테이블로 풀어 조인 테이블을 엔티티로 승격시켜 사용하는 것까지는 좋았다. 하나는 양방향 매핑이 필요해서 따로 작업을 해주고 나머지는 단방향 매핑으로 진행하고 나중에 필요하면 양방향으로 변경하자고 맘을 먹고 각종 테스트까지 마친 상태에서 테이블에 데이터를 넣고 객체 그래프 탐색을 통해 모든 데이터를 끌어올려 API로 전달하는 과정에서 문제가 발생했다. 간단히 문제가 발생한 부분을 설계하면서 느낀 점을 풀자 하나의 부분 모양이다. 현재 A, B에 관한 관계는 OneToOne이 현재 비즈니스 로직적으로 맞았지만 과거 기획에는 일대다 관계가 맞다고 생각했다. 그래서 우.. 2022. 10. 29.
나는 지금 JPQL이 필요하다! (2) 역시 줄임말을 펴줘야 한다 JPQL ( Java Persistence Query Language) JPA랑 앞글자가 거의 같다. 뭐 JPA가 자카르타로 변경됐다고 듣긴 했다 JPQL을 적용하기로 결정했는데 JPQL 문법을 조금 알아보자 엔티티와 속성은 대소문자를 구분한다. 다만 JPQL 키워드는 대소문자 구문 하지 않는다. 이 부분에서 매우 많은 오류가 예상된다. 별칭은 필수이다. as는 생략 가능하다. + 10/28 결국 동적 쿼리를 작성하다가 오류를 만났다. 띄어쓰기를 하지 않아 쿼리가 붙어버렸기 때문인데, 이에 대해서 인식하고 있어서 인지 오류를 스윽 보자마자 무슨 문제인지 확인했다. 만약 동적 쿼리가 많다면 jpql은 사용하지 않는 것이 좋다. 정말 코드도 길어지고 유지보수도 힘들다. 추가적으로 .. 2022. 10. 26.